diff --git a/dist/vot-min.user.js b/dist/vot-min.user.js index 97aa7548..ecffd6ab 100644 --- a/dist/vot-min.user.js +++ b/dist/vot-min.user.js @@ -219,7 +219,7 @@ // ==/UserScript== /*! For license information please see vot-min.user.js.LICENSE.txt */ -(()=>{var t={"./src/styles/main.scss":()=>{GM_addStyle('.vot-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-ontheme));background-color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;border:none;border-radius:4px;outline:none;padding:0 16px;font-size:14px;font-weight:500;line-height:36px;transition:box-shadow .2s;display:inline-block;position:relative;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 1px 5px rgba(0,0,0,.12)}.vot-button[hidden]{display:none!important}.vot-button::-moz-focus-inner{border:none}.vot-button:before,.vot-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-button:before{background-color:rgb(var(--vot-helper-ontheme));transition:opacity .2s}.vot-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-button:hover{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px rgba(0,0,0,.14),0 1px 10px rgba(0,0,0,.12)}.vot-button:hover:before{opacity:.08}.vot-button:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.vot-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size}.vot-button[disabled=true]{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.12);color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);box-shadow:none;cursor:initial}.vot-button[disabled=true]:before{opacity:0}.vot-button[disabled=true]:after{opacity:0}.vot-outlined-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;border:1px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.24);vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border-radius:4px;outline:none;margin:0;padding:0 16px;font-size:14px;font-weight:500;line-height:34px;display:inline-block;position:relative}.vot-outlined-button[hidden]{display:none!important}.vot-outlined-button::-moz-focus-inner{border:none}.vot-outlined-button:before,.vot-outlined-button:after{content:"";opacity:0;border-radius:3px;position:absolute;top:0;bottom:0;left:0;right:0}.vot-outlined-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-outlined-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-outlined-button:hover:before{opacity:.04}.vot-outlined-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-outlined-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-outlined-button[disabled=true]:before{opacity:0}.vot-outlined-button[disabled=true]:after{opacity:0}.vot-text-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border:none;border-radius:4px;outline:none;margin:0;padding:0 8px;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-text-button[hidden]{display:none!important}.vot-text-button::-moz-focus-inner{border:none}.vot-text-button:before,.vot-text-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-text-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-text-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-text-button:hover:before{opacity:.04}.vot-text-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-text-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-text-button[disabled=true]:before{opacity:0}.vot-text-button[disabled=true]:after{opacity:0}.vot-icon-button{--vot-helper-onsurface:rgba(var(--vot-onsurface-rgb,0,0,0),.87);box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;width:36px;height:36px;fill:var(--vot-helper-onsurface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border:none;border-radius:50%;outline:none;margin:0;padding:0;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-icon-button[hidden]{display:none!important}.vot-icon-button::-moz-focus-inner{border:none}.vot-icon-button:before,.vot-icon-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-icon-button:before{background-color:var(--vot-helper-onsurface);transition:opacity .2s}.vot-icon-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity .3s,background-size .4s}.vot-icon-button:hover:before{opacity:.04}.vot-icon-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size,opacity}.vot-icon-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);fill:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-icon-button[disabled=true]:before{opacity:0}.vot-icon-button[disabled=true]:after{opacity:0}.vot-textfield{display:inline-block;--vot-helper-theme:rgb(var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243)))!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari3:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;padding-top:6px!important;font-size:16px!important;line-height:1.5!important;position:relative!important}.vot-textfield[hidden]{display:none!important}.vot-textfield>input,.vot-textfield>textarea{box-sizing:border-box!important;border-style:solid!important;border-width:1px!important;border-color:transparent var(--vot-helper-safari2)var(--vot-helper-safari2)!important;width:100%!important;height:inherit!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;-webkit-text-fill-color:currentColor!important;font-family:inherit!important;font-size:inherit!important;line-height:inherit!important;caret-color:var(--vot-helper-theme)!important;background-color:transparent!important;border-radius:4px!important;margin:0!important;padding:15px 13px!important;transition:border .2s,box-shadow .2s!important;box-shadow:inset 1px 0 transparent,inset -1px 0 transparent,inset 0 -1px transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>textarea:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>input+span,.vot-textfield>textarea+span{width:100%!important;max-height:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;cursor:text!important;pointer-events:none!important;font-size:75%!important;line-height:15px!important;transition:color .2s,font-size .2s,line-height .2s!important;display:flex!important;position:absolute!important;top:0!important;left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{content:""!important;box-sizing:border-box!important;border-top:solid 1px var(--vot-helper-safari2)!important;pointer-events:none!important;min-width:10px!important;height:8px!important;margin-top:6px!important;transition:border .2s,box-shadow .2s!important;display:block!important;box-shadow:inset 0 1px transparent!important}.vot-textfield>input+span:before,.vot-textfield>textarea+span:before{border-left:1px solid transparent!important;border-radius:4px 0!important;margin-right:4px!important}.vot-textfield>input+span:after,.vot-textfield>textarea+span:after{border-right:1px solid transparent!important;border-radius:0 4px!important;flex-grow:1!important;margin-left:4px!important}.vot-textfield>input.vot-show-placeholer+span:before,.vot-textfield>textarea.vot-show-placeholer+span:before{margin-right:0!important}.vot-textfield>input.vot-show-placeholer+span:after,.vot-textfield>textarea.vot-show-placeholer+span:after{margin-left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>input:not(:focus):placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield:hover>input:not(:disabled),.vot-textfield:hover>textarea:not(:disabled){border-color:transparent var(--vot-helper-safari3)var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled)+span:before,.vot-textfield:hover>input:not(:disabled)+span:after,.vot-textfield:hover>textarea:not(:disabled)+span:before,.vot-textfield:hover>textarea:not(:disabled)+span:after{border-top-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>textarea:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield>input:focus,.vot-textfield>textarea:focus{border-color:transparent var(--vot-helper-theme)var(--vot-helper-theme)!important;box-shadow:inset 1px 0 var(--vot-helper-theme),inset -1px 0 var(--vot-helper-theme),inset 0 -1px var(--vot-helper-theme)!important;outline:none!important}.vot-textfield>input:focus+span,.vot-textfield>textarea:focus+span{color:var(--vot-helper-theme)!important}.vot-textfield>input:focus+span:before,.vot-textfield>input:focus+span:after,.vot-textfield>textarea:focus+span:before,.vot-textfield>textarea:focus+span:after{border-top-color:var(--vot-helper-theme)!important;box-shadow:inset 0 1px var(--vot-helper-theme)!important}.vot-textfield>input:disabled,.vot-textfield>input:disabled+span,.vot-textfield>textarea:disabled,.vot-textfield>textarea:disabled+span{border-color:transparent var(--vot-helper-safari1)var(--vot-helper-safari1)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;pointer-events:none!important}.vot-textfield>input:disabled+span:before,.vot-textfield>input:disabled+span:after,.vot-textfield>textarea:disabled+span:before,.vot-textfield>textarea:disabled+span:after{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>textarea:disabled:placeholder-shown{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>textarea:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>input:disabled:placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield>textarea:disabled:placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>textarea:disabled:placeholder-shown+span:after{border-top-color:transparent!important}@media not all and (-webkit-min-device-pixel-ratio:.0000264583),not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)){.vot-textfield>input,.vot-textfield>input+span,.vot-textfield>textarea,.vot-textfield>textarea+span,.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{transition-duration:.1s!important}}}.vot-checkbox{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));z-index:0;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-size:16px;line-height:1.5;display:inline-block;position:relative}.vot-checkbox-sub{padding-left:16px}.vot-checkbox[hidden]{display:none!important}.vot-checkbox>input{-webkit-appearance:none;appearance:none;z-index:10000;box-sizing:border-box;border:2px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);cursor:pointer;background:0 0;border-radius:2px;outline:none;width:18px;height:18px;margin:3px 1px;padding:0;transition:border-color .2s,background-color .2s;display:block;position:absolute}.vot-checkbox>input+span{box-sizing:border-box;width:inherit;cursor:pointer;padding-left:30px;font-weight:400;display:inline-block;position:relative}.vot-checkbox>input+span:before{content:"";background-color:rgb(var(--vot-onsurface-rgb,0,0,0));opacity:0;pointer-events:none;border-radius:50%;width:40px;height:40px;transition:opacity .3s,transform .2s;display:block;position:absolute;top:-8px;left:-10px;transform:scale(1)}.vot-checkbox>input+span:after{content:"";z-index:10000;pointer-events:none;border:0 solid transparent;border-width:0 0 2px 2px;width:10px;height:5px;transition:border-color .2s;display:block;position:absolute;top:3px;left:1px;transform:translate(3px,4px)rotate(-45deg);box-sizing:content-box!important}.vot-checkbox>input:checked{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:indeterminate{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:indeterminate+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-left-width:0;transform:translate(4px,3px)}.vot-checkbox:hover>input+span:before{opacity:.04}.vot-checkbox:active>input,.vot-checkbox:active:hover>input:not(:disabled){border-color:rgb(var(--vot-helper-theme))}.vot-checkbox:active>input:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);border-color:transparent}.vot-checkbox:active>input+span:before{opacity:1;transition:transform,opacity;transform:scale(0)}.vot-checkbox>input:disabled{border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:transparent}.vot-checkbox>input:disabled:indeterminate{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:transparent}.vot-checkbox>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled+span:before{opacity:0;transform:scale(0)}.vot-slider{display:inline-block;--vot-safari-helper1:rgba(var(--vot-primary-rgb,33,150,243),.04)!important;--vot-safari-helper2:rgba(var(--vot-primary-rgb,33,150,243),.12)!important;--vot-safari-helper3:rgba(var(--vot-primary-rgb,33,150,243),.16)!important;--vot-safari-helper4:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;width:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;font-size:16px!important;line-height:1.5!important}.vot-slider[hidden]{display:none!important}.vot-slider>input{-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important;background-color:transparent!important;border:none!important;width:100%!important;height:36px!important;margin:0 0 -36px!important;padding:0!important;display:block!important;position:relative!important;top:24px!important}.vot-slider>input:last-child{margin:0!important;position:static!important}.vot-slider>input:before{content:""!important;width:calc(100%*var(--vot-progress,0))!important;background:rgb(var(--vot-primary-rgb,33,150,243))!important;height:2px!important;display:block!important;position:absolute!important;top:calc(50% - 1px)!important}.vot-slider>input:disabled{cursor:default!important;opacity:.38!important}.vot-slider>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-webkit-slider-runnable-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-lower{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-upper{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-webkit-slider-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-fill-upper{opacity:.38!important}.vot-slider>input:disabled::-moz-range-progress{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-slider>input:disabled:-webkit-slider-thumb{color:rgb(var(--vot-surface-rgb,255,255,255))!important}.vot-slider>input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper4)!important}.vot-slider>input:active::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:active::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:focus{outline:none!important}.vot-slider>input::-webkit-slider-runnable-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-moz-range-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-ms-track{box-sizing:border-box!important;background-color:transparent!important;border:none!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important;padding:0 17px!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-moz-range-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-ms-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;margin:0!important}.vot-slider>input::-moz-range-thumb{-moz-appearance:none!important}.vot-slider>input::-ms-thumb{margin:0 17px!important}.vot-slider>input::-moz-range-progress{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-lower{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-upper{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-moz-focus-outer{border:none!important}.vot-slider>span{margin-bottom:36px!important;display:inline-block!important}.vot-slider:hover>input::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper1)!important}.vot-slider:hover>input::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-slider:hover>input:hover::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-select{font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;font-size:14px;font-weight:400;line-height:1.5;display:flex;--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0)!important;--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87)!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-select[hidden]{display:none!important}.vot-select-label{font-size:16px}.vot-select-outer{cursor:pointer;justify-content:space-between;align-items:center;width:120px;max-width:120px;padding:0 5px;display:flex;border-style:solid!important;border-width:1px!important;border-color:var(--vot-helper-safari1)!important;border-radius:4px!important;transition:border .2s!important}.vot-select-outer:hover{border-color:var(--vot-helper-safari2)!important}.vot-select-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vot-select-arrow-icon{justify-content:center;align-items:center;width:20px;height:32px;display:flex}.vot-select-content-list{flex-direction:column;display:flex}.vot-select-content-list .vot-select-content-item{cursor:pointer;border-radius:8px;padding:5px 10px}.vot-select-content-list .vot-select-content-item:not([inert]):hover{background-color:#2a2c31}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]{color:rgb(var(--vot-primary-rgb,33,150,243));background-color:rgba(var(--vot-primary-rgb,33,150,243),.2)}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]:hover{background-color:rgba(var(--vot-primary-rgb,33,150,243),.1)!important}.vot-select-content-list .vot-select-content-item[data-vot-disabled=true]{cursor:default}.vot-select-content-list .vot-select-content-item[hidden]{display:none!important}.vot-header{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-weight:700;line-height:1.5}.vot-header[hidden]{display:none!important}.vot-header:not(:first-child){padding-top:8px}.vot-header-level-1{font-size:2em}.vot-header-level-2{font-size:1.5em}.vot-header-level-3{font-size:1.17em}.vot-header-level-4{font-size:1em}.vot-header-level-5{font-size:.83em}.vot-header-level-6{font-size:.67em}.vot-info{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.5;display:flex}.vot-info[hidden]{display:none!important}.vot-info>:not(:first-child){color:rgba(var(--vot-helper-onsurface-rgb),.5);flex:1;margin-left:8px}.vot-details{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;cursor:pointer;border-radius:.5em;justify-content:space-between;align-items:center;margin:0 -.5em;padding:.5em;font-size:16px;line-height:1.5;transition:background .5s;display:flex}.vot-details[hidden]{display:none!important}.vot-details-arrow-icon{width:20px;height:32px;fill:rgba(var(--vot-helper-onsurface-rgb),.87);justify-content:center;align-items:center;display:flex;transform:scale(1.25)rotate(-90deg)}.vot-details:hover{background:rgba(var(--vot-onsurface-rgb,0,0,0),.04)}.vot-lang-select{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;display:flex}.vot-lang-select[hidden]{display:none!important}.vot-lang-select-icon{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.vot-segmented-button{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);-webkit-user-select:none;user-select:none;background:rgb(var(--vot-surface-rgb,255,255,255));max-width:100vw;height:32px;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;border-radius:4px;align-items:center;font-size:16px;line-height:1.5;transition:opacity .5s;display:flex;position:absolute;top:5rem;left:50%;overflow:hidden;transform:translate(-50%)}.vot-segmented-button[hidden]{display:none!important}.vot-segmented-button *{box-sizing:border-box!important}.vot-segmented-button .vot-separator{background:rgba(var(--vot-helper-theme-rgb),.1);width:1px;height:50%}.vot-segmented-button .vot-separator[hidden]{display:none!important}.vot-segmented-button .vot-segment,.vot-segmented-button .vot-segment-only-icon{height:100%;color:inherit;background-color:transparent;border:none;justify-content:center;align-items:center;padding:0 8px;transition:background-color .1s ease-in-out;display:flex;position:relative;overflow:hidden}.vot-segmented-button .vot-segment[hidden],.vot-segmented-button [hidden].vot-segment-only-icon{display:none!important}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before,.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before{background-color:rgb(var(--vot-helper-theme-rgb));transition:opacity .2s}.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-segmented-button .vot-segment:hover:before,.vot-segmented-button .vot-segment-only-icon:hover:before{opacity:.04}.vot-segmented-button .vot-segment:active:after,.vot-segmented-button .vot-segment-only-icon:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-segmented-button .vot-segment-only-icon{min-width:32px;padding:0}.vot-segmented-button .vot-segment-label{white-space:nowrap;color:inherit;margin-left:8px;font-weight:400}.vot-segmented-button[data-status=success] .vot-translate-button{color:rgb(var(--vot-primary-rgb,33,150,243));fill:rgb(var(--vot-primary-rgb,33,150,243))}.vot-segmented-button[data-status=error] .vot-translate-button{color:#f28b82;fill:#f28b82}.vot-segmented-button[data-loading=true] #vot-loading-icon{display:block!important}.vot-segmented-button[data-loading=true] #vot-translate-icon{display:none!important}.vot-segmented-button[data-direction=column]{flex-direction:column;height:fit-content}.vot-segmented-button[data-direction=column] .vot-segment-label{display:none}.vot-segmented-button[data-direction=column]>.vot-segment-only-icon,.vot-segmented-button[data-direction=column]>.vot-segment{padding:8px}.vot-segmented-button[data-direction=column] .vot-separator{width:50%;height:1px}.vot-segmented-button[data-position=left]{top:12.5vh;left:50px}.vot-segmented-button[data-position=right]{top:12.5vh;left:auto;right:0}.vot-segmented-button svg{width:24px}.vot-menu{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);-webkit-user-select:none;user-select:none;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;visibility:visible;opacity:1;transform-origin:top;border-radius:8px;min-width:300px;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;position:absolute;top:calc(5rem + 48px);left:50%;overflow:hidden;transform:translate(-50%)scale(1)}.vot-menu *{box-sizing:border-box!important}.vot-menu[hidden]{pointer-events:none;visibility:hidden;opacity:0;transform:translate(-50%)scale(0);display:block!important}.vot-menu-content-wrapper{min-height:100px;max-height:calc(var(--vot-container-height,75vh) - (5rem + 32px + 16px)*2);flex-direction:column;display:flex;overflow:auto}.vot-menu-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-menu-header-container:empty{padding:0 0 16px}.vot-menu-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-menu-title-container{font-size:inherit;font-weight:inherit;text-align:start;outline:0;flex:1;margin:0;display:flex}.vot-menu-title{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex:1;padding-top:16px;font-size:16px;font-weight:400;line-height:1}.vot-menu-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:8px;min-height:1.375rem;padding:0 16px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-menu-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-menu-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-menu-footer-container:empty{padding:16px 0 0}.vot-menu[data-position=left]{top:12.5vh;left:240px}.vot-menu[data-position=right]{top:12.5vh;left:auto;right:-80px}.vot-dialog{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);max-width:initial;max-height:initial;width:min(var(--vot-dialog-width,512px),100%);top:50%;bottom:50%;background-color:var(--vot-helper-surface);height:fit-content;color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);-webkit-user-select:none;user-select:none;visibility:visible;opacity:1;transform-origin:50%;border-radius:8px;margin:auto;padding:0;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;display:block;position:fixed;top:0;bottom:0;left:0;right:0;overflow-x:auto;overflow-y:hidden;transform:scale(1);box-shadow:0 0 16px rgba(0,0,0,.12),0 16px 16px rgba(0,0,0,.24)}[hidden]>.vot-dialog{pointer-events:none;opacity:0;transition:opacity .1s,transform .2s;transform:scale(.5)}.vot-dialog-container{visibility:visible;z-index:2147483647;position:absolute}.vot-dialog-container[hidden]{pointer-events:none;visibility:hidden;display:block!important}.vot-dialog-container *{box-sizing:border-box!important}.vot-dialog-backdrop{opacity:1;background-color:rgba(0,0,0,.6);transition:opacity .3s;position:fixed;top:0;bottom:0;left:0;right:0}[hidden]>.vot-dialog-backdrop{pointer-events:none;opacity:0}.vot-dialog-content-wrapper{flex-direction:column;max-height:75vh;display:flex;overflow:auto}.vot-dialog-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-dialog-header-container:empty{padding:0 0 20px}.vot-dialog-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-dialog-title-container{font-size:inherit;font-weight:inherit;outline:0;flex:1;margin:0;display:flex}.vot-dialog-title{padding-bottom:16px;padding-inline-start:20px;padding-inline-end:20px;flex:1;padding-top:20px;font-size:115.385%;font-weight:700;line-height:1}.vot-dialog-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:16px;min-height:1.375rem;padding:0 20px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-dialog-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-dialog-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-dialog-footer-container:empty{padding:20px 0 0}.vot-subtitles-widget{z-index:2147483647;pointer-events:none;justify-content:center;align-items:center;width:50%;min-height:20%;max-height:100%;display:flex;position:absolute;top:75%;left:25%}.vot-subtitles{--vot-subtitles-background:rgba(var(--vot-surface-rgb,46,47,52),var(--vot-subtitles-opacity,.8));background:var(--vot-subtitles-background,rgba(46,47,52,.8));width:max-content;max-width:100%;max-height:100%;color:var(--vot-subtitles-color,#e3e3e3);pointer-events:all;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:.5em;padding:.5em;font-size:20px;line-height:normal;position:relative}.vot-subtitles span{-webkit-user-select:text;user-select:text;font-size:inherit!important;line-height:normal!important}.vot-subtitles .passed{color:var(--vot-subtitles-passed-color,#2196f3)}:root{--vot-font-family:"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system;--vot-primary-rgb:139,180,245;--vot-onprimary-rgb:32,33,36;--vot-surface-rgb:32,33,36;--vot-onsurface-rgb:227,227,227;--vot-subtitles-color:rgb(var(--vot-onsurface-rgb,227,227,227));--vot-subtitles-passed-color:rgb(var(--vot-primary-rgb,33,150,243))}vot-block{display:block;visibility:visible!important}')},"./node_modules/bowser/es5.js":function(t){t.exports=function(t){var e={};function o(i){if(e[i])return e[i].exports;var a=e[i]={i,l:!1,exports:{}};return t[i].call(a.exports,a,a.exports,o),a.l=!0,a.exports}return o.m=t,o.c=e,o.d=function(t,e,i){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)o.d(i,a,function(e){return t[e]}.bind(null,a));return i},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=90)}({17:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i=o(18),a=function(){function t(){}return t.getFirstMatch=function(t,e){var o=e.match(t);return o&&o.length>0&&o[1]||""},t.getSecondMatch=function(t,e){var o=e.match(t);return o&&o.length>1&&o[2]||""},t.matchAndReturnConst=function(t,e,o){if(t.test(e))return o},t.getWindowsVersionName=function(t){switch(t){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},t.getMacOSVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),10===e[0])switch(e[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},t.getAndroidVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),!(1===e[0]&&e[1]<5))return 1===e[0]&&e[1]<6?"Cupcake":1===e[0]&&e[1]>=6?"Donut":2===e[0]&&e[1]<2?"Eclair":2===e[0]&&2===e[1]?"Froyo":2===e[0]&&e[1]>2?"Gingerbread":3===e[0]?"Honeycomb":4===e[0]&&e[1]<1?"Ice Cream Sandwich":4===e[0]&&e[1]<4?"Jelly Bean":4===e[0]&&e[1]>=4?"KitKat":5===e[0]?"Lollipop":6===e[0]?"Marshmallow":7===e[0]?"Nougat":8===e[0]?"Oreo":9===e[0]?"Pie":void 0},t.getVersionPrecision=function(t){return t.split(".").length},t.compareVersions=function(e,o,i){void 0===i&&(i=!1);var a=t.getVersionPrecision(e),n=t.getVersionPrecision(o),r=Math.max(a,n),s=0,l=t.map([e,o],(function(e){var o=r-t.getVersionPrecision(e),i=e+new Array(o+1).join(".0");return t.map(i.split("."),(function(t){return new Array(20-t.length).join("0")+t})).reverse()}));for(i&&(s=r-Math.min(a,n)),r-=1;r>=s;){if(l[0][r]>l[1][r])return 1;if(l[0][r]===l[1][r]){if(r===s)return 0;r-=1}else if(l[0][r]1?a-1:0),r=1;r0){var r=Object.keys(o),l=s.default.find(r,(function(t){return e.isOS(t)}));if(l){var d=this.satisfies(o[l]);if(void 0!==d)return d}var u=s.default.find(r,(function(t){return e.isPlatform(t)}));if(u){var c=this.satisfies(o[u]);if(void 0!==c)return c}}if(n>0){var h=Object.keys(a),p=s.default.find(h,(function(t){return e.isBrowser(t,!0)}));if(void 0!==p)return this.compareVersion(a[p])}},e.isBrowser=function(t,e){void 0===e&&(e=!1);var o=this.getBrowserName().toLowerCase(),i=t.toLowerCase(),a=s.default.getBrowserTypeByAlias(i);return e&&a&&(i=a.toLowerCase()),i===o},e.compareVersion=function(t){var e=[0],o=t,i=!1,a=this.getBrowserVersion();if("string"==typeof a)return">"===t[0]||"<"===t[0]?(o=t.substr(1),"="===t[1]?(i=!0,o=t.substr(2)):e=[],">"===t[0]?e.push(1):e.push(-1)):"="===t[0]?o=t.substr(1):"~"===t[0]&&(i=!0,o=t.substr(1)),e.indexOf(s.default.compareVersions(a,o,i))>-1},e.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},e.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},e.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},e.is=function(t,e){return void 0===e&&(e=!1),this.isBrowser(t,e)||this.isOS(t)||this.isPlatform(t)},e.some=function(t){var e=this;return void 0===t&&(t=[]),t.some((function(t){return e.is(t)}))},t}();e.default=d,t.exports=e.default},92:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=/version\/(\d+(\.?_?\d+)+)/i,r=[{test:[/googlebot/i],describe:function(t){var e={name:"Googlebot"},o=a.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/opera/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opr\/|opios/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/SamsungBrowser/i],describe:function(t){var e={name:"Samsung Internet for Android"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Whale/i],describe:function(t){var e={name:"NAVER Whale Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MZBrowser/i],describe:function(t){var e={name:"MZ Browser"},o=a.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/focus/i],describe:function(t){var e={name:"Focus"},o=a.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/swing/i],describe:function(t){var e={name:"Swing"},o=a.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/coast/i],describe:function(t){var e={name:"Opera Coast"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(t){var e={name:"Opera Touch"},o=a.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/yabrowser/i],describe:function(t){var e={name:"Yandex Browser"},o=a.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/ucbrowser/i],describe:function(t){var e={name:"UC Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Maxthon|mxios/i],describe:function(t){var e={name:"Maxthon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/epiphany/i],describe:function(t){var e={name:"Epiphany"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/puffin/i],describe:function(t){var e={name:"Puffin"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sleipnir/i],describe:function(t){var e={name:"Sleipnir"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/k-meleon/i],describe:function(t){var e={name:"K-Meleon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/micromessenger/i],describe:function(t){var e={name:"WeChat"},o=a.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qqbrowser/i],describe:function(t){var e={name:/qqbrowserlite/i.test(t)?"QQ Browser Lite":"QQ Browser"},o=a.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/msie|trident/i],describe:function(t){var e={name:"Internet Explorer"},o=a.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/\sedg\//i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/edg([ea]|ios)/i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/vivaldi/i],describe:function(t){var e={name:"Vivaldi"},o=a.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/seamonkey/i],describe:function(t){var e={name:"SeaMonkey"},o=a.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sailfish/i],describe:function(t){var e={name:"Sailfish"},o=a.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,t);return o&&(e.version=o),e}},{test:[/silk/i],describe:function(t){var e={name:"Amazon Silk"},o=a.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/phantom/i],describe:function(t){var e={name:"PhantomJS"},o=a.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/slimerjs/i],describe:function(t){var e={name:"SlimerJS"},o=a.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e={name:"BlackBerry"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e={name:"WebOS Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/bada/i],describe:function(t){var e={name:"Bada"},o=a.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/tizen/i],describe:function(t){var e={name:"Tizen"},o=a.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qupzilla/i],describe:function(t){var e={name:"QupZilla"},o=a.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var e={name:"Firefox"},o=a.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/electron/i],describe:function(t){var e={name:"Electron"},o=a.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MiuiBrowser/i],describe:function(t){var e={name:"Miui"},o=a.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/chromium/i],describe:function(t){var e={name:"Chromium"},o=a.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/chrome|crios|crmo/i],describe:function(t){var e={name:"Chrome"},o=a.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/GSA/i],describe:function(t){var e={name:"Google Search"},o=a.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e={name:"Android Browser"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/playstation 4/i],describe:function(t){var e={name:"PlayStation 4"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/safari|applewebkit/i],describe:function(t){var e={name:"Safari"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/.*/i],describe:function(t){var e=-1!==t.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:a.default.getFirstMatch(e,t),version:a.default.getSecondMatch(e,t)}}}];e.default=r,t.exports=e.default},93:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/Roku\/DVP/],describe:function(t){var e=a.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,t);return{name:n.OS_MAP.Roku,version:e}}},{test:[/windows phone/i],describe:function(t){var e=a.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.WindowsPhone,version:e}}},{test:[/windows /i],describe:function(t){var e=a.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,t),o=a.default.getWindowsVersionName(e);return{name:n.OS_MAP.Windows,version:e,versionName:o}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(t){var e={name:n.OS_MAP.iOS},o=a.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,t);return o&&(e.version=o),e}},{test:[/macintosh/i],describe:function(t){var e=a.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,t).replace(/[_\s]/g,"."),o=a.default.getMacOSVersionName(e),i={name:n.OS_MAP.MacOS,version:e};return o&&(i.versionName=o),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var e=a.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,t).replace(/[_\s]/g,".");return{name:n.OS_MAP.iOS,version:e}}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e=a.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,t),o=a.default.getAndroidVersionName(e),i={name:n.OS_MAP.Android,version:e};return o&&(i.versionName=o),i}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e=a.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,t),o={name:n.OS_MAP.WebOS};return e&&e.length&&(o.version=e),o}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e=a.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,t)||a.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,t)||a.default.getFirstMatch(/\bbb(\d+)/i,t);return{name:n.OS_MAP.BlackBerry,version:e}}},{test:[/bada/i],describe:function(t){var e=a.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Bada,version:e}}},{test:[/tizen/i],describe:function(t){var e=a.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Tizen,version:e}}},{test:[/linux/i],describe:function(){return{name:n.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:n.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var e=a.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.PlayStation4,version:e}}}];e.default=r,t.exports=e.default},94:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(t){var e=a.default.getFirstMatch(/(can-l01)/i,t)&&"Nova",o={type:n.PLATFORMS_MAP.mobile,vendor:"Huawei"};return e&&(o.model=e),o}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){var e=t.test(/ipod|iphone/i),o=t.test(/like (ipod|iphone)/i);return e&&!o},describe:function(t){var e=a.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:n.PLATFORMS_MAP.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"blackberry"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(t){return"bada"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"windows phone"===t.getBrowserName()},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(t){var e=Number(String(t.getOSVersion()).split(".")[0]);return"android"===t.getOSName(!0)&&e>=3},describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){return"android"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"macos"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(t){return"windows"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"linux"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"playstation 4"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}},{test:function(t){return"roku"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}}];e.default=r,t.exports=e.default},95:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:function(t){return"microsoft edge"===t.getBrowserName(!0)},describe:function(t){if(/\sedg\//i.test(t))return{name:n.ENGINE_MAP.Blink};var e=a.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,t);return{name:n.ENGINE_MAP.EdgeHTML,version:e}}},{test:[/trident/i],describe:function(t){var e={name:n.ENGINE_MAP.Trident},o=a.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){return t.test(/presto/i)},describe:function(t){var e={name:n.ENGINE_MAP.Presto},o=a.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=t.test(/gecko/i),o=t.test(/like gecko/i);return e&&!o},describe:function(t){var e={name:n.ENGINE_MAP.Gecko},o=a.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:n.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var e={name:n.ENGINE_MAP.WebKit},o=a.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}}];e.default=r,t.exports=e.default}})},"./node_modules/requestidlecallback-polyfill/index.js":()=>{window.requestIdleCallback=window.requestIdleCallback||function(t){var e=Date.now();return setTimeout((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),1)},window.cancelIdleCallback=window.cancelIdleCallback||function(t){clearTimeout(t)}}},e={};function o(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={exports:{}};return t[i].call(n.exports,n,n.exports,o),n.exports}(()=>{"use strict";var t=o("./node_modules/bowser/es5.js");const e={host:"api.browser.yandex.ru",hostVOT:"vot.toil.cc/v1",hostWorker:"vot-worker.toil.cc",mediaProxy:"media-proxy.toil.cc",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 YaBrowser/24.10.0.0 Safari/537.36",componentVersion:"24.12.2.856",hmac:"bt8xH3VOlb4mqf0nqAibnDOoiPlXsisf",defaultDuration:343,minChunkSize:5295308,loggerLevel:1,version:"2.1.4"};var i;!function(t){t[t.DEBUG=0]="DEBUG",t[t.INFO=1]="INFO",t[t.WARN=2]="WARN",t[t.ERROR=3]="ERROR",t[t.SILENCE=4]="SILENCE"}(i||(i={}));class a{static prefix=`[vot.js v${e.version}]`;static canLog(t){return e.loggerLevel<=t}static log(...t){a.canLog(i.DEBUG)&&console.log(a.prefix,...t)}static info(...t){a.canLog(i.INFO)&&console.info(a.prefix,...t)}static warn(...t){a.canLog(i.WARN)&&console.warn(a.prefix,...t)}static error(...t){a.canLog(i.ERROR)&&console.error(a.prefix,...t)}}const n=protobuf;var r;function s(t){switch(t){case 0:case"NO_CONNECTION":return r.NO_CONNECTION;case 10:case"TRANSLATING":return r.TRANSLATING;case 20:case"STREAMING":return r.STREAMING;default:return r.UNRECOGNIZED}}!function(t){t[t.NO_CONNECTION=0]="NO_CONNECTION",t[t.TRANSLATING=10]="TRANSLATING",t[t.STREAMING=20]="STREAMING",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(r||(r={}));const l={encode:(t,e=n.Writer.create())=>(""!==t.target&&e.uint32(10).string(t.target),""!==t.targetUrl&&e.uint32(18).string(t.targetUrl),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={target:"",targetUrl:""};for(;o.pos>>3){case 1:if(10!==t)break;a.target=o.string();continue;case 2:if(18!==t)break;a.targetUrl=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({target:I(t.target)?globalThis.String(t.target):"",targetUrl:I(t.targetUrl)?globalThis.String(t.targetUrl):""}),toJSON(t){const e={};return""!==t.target&&(e.target=t.target),""!==t.targetUrl&&(e.targetUrl=t.targetUrl),e},create:t=>l.fromPartial(t??{}),fromPartial(t){const e={target:"",targetUrl:""};return e.target=t.target??"",e.targetUrl=t.targetUrl??"",e}};const d={encode(t,e=n.Writer.create()){""!==t.url&&e.uint32(26).string(t.url),void 0!==t.deviceId&&e.uint32(34).string(t.deviceId),!1!==t.firstRequest&&e.uint32(40).bool(t.firstRequest),0!==t.duration&&e.uint32(49).double(t.duration),0!==t.unknown0&&e.uint32(56).int32(t.unknown0),""!==t.language&&e.uint32(66).string(t.language),!1!==t.forceSourceLang&&e.uint32(72).bool(t.forceSourceLang),0!==t.unknown1&&e.uint32(80).int32(t.unknown1);for(const o of t.translationHelp)l.encode(o,e.uint32(90).fork()).ldelim();return""!==t.responseLanguage&&e.uint32(114).string(t.responseLanguage),0!==t.unknown2&&e.uint32(120).int32(t.unknown2),0!==t.unknown3&&e.uint32(128).int32(t.unknown3),!1!==t.bypassCache&&e.uint32(136).bool(t.bypassCache),!1!==t.useNewModel&&e.uint32(144).bool(t.useNewModel),e},decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,useNewModel:!1};for(;o.pos>>3){case 3:if(26!==t)break;a.url=o.string();continue;case 4:if(34!==t)break;a.deviceId=o.string();continue;case 5:if(40!==t)break;a.firstRequest=o.bool();continue;case 6:if(49!==t)break;a.duration=o.double();continue;case 7:if(56!==t)break;a.unknown0=o.int32();continue;case 8:if(66!==t)break;a.language=o.string();continue;case 9:if(72!==t)break;a.forceSourceLang=o.bool();continue;case 10:if(80!==t)break;a.unknown1=o.int32();continue;case 11:if(90!==t)break;a.translationHelp.push(l.decode(o,o.uint32()));continue;case 14:if(114!==t)break;a.responseLanguage=o.string();continue;case 15:if(120!==t)break;a.unknown2=o.int32();continue;case 16:if(128!==t)break;a.unknown3=o.int32();continue;case 17:if(136!==t)break;a.bypassCache=o.bool();continue;case 18:if(144!==t)break;a.useNewModel=o.bool();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):"",deviceId:I(t.deviceId)?globalThis.String(t.deviceId):void 0,firstRequest:!!I(t.firstRequest)&&globalThis.Boolean(t.firstRequest),duration:I(t.duration)?globalThis.Number(t.duration):0,unknown0:I(t.unknown0)?globalThis.Number(t.unknown0):0,language:I(t.language)?globalThis.String(t.language):"",forceSourceLang:!!I(t.forceSourceLang)&&globalThis.Boolean(t.forceSourceLang),unknown1:I(t.unknown1)?globalThis.Number(t.unknown1):0,translationHelp:globalThis.Array.isArray(t?.translationHelp)?t.translationHelp.map((t=>l.fromJSON(t))):[],responseLanguage:I(t.responseLanguage)?globalThis.String(t.responseLanguage):"",unknown2:I(t.unknown2)?globalThis.Number(t.unknown2):0,unknown3:I(t.unknown3)?globalThis.Number(t.unknown3):0,bypassCache:!!I(t.bypassCache)&&globalThis.Boolean(t.bypassCache),useNewModel:!!I(t.useNewModel)&&globalThis.Boolean(t.useNewModel)}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),void 0!==t.deviceId&&(e.deviceId=t.deviceId),!1!==t.firstRequest&&(e.firstRequest=t.firstRequest),0!==t.duration&&(e.duration=t.duration),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.language&&(e.language=t.language),!1!==t.forceSourceLang&&(e.forceSourceLang=t.forceSourceLang),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),t.translationHelp?.length&&(e.translationHelp=t.translationHelp.map((t=>l.toJSON(t)))),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),0!==t.unknown3&&(e.unknown3=Math.round(t.unknown3)),!1!==t.bypassCache&&(e.bypassCache=t.bypassCache),!1!==t.useNewModel&&(e.useNewModel=t.useNewModel),e},create:t=>d.fromPartial(t??{}),fromPartial(t){const e={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,useNewModel:!1};return e.url=t.url??"",e.deviceId=t.deviceId??void 0,e.firstRequest=t.firstRequest??!1,e.duration=t.duration??0,e.unknown0=t.unknown0??0,e.language=t.language??"",e.forceSourceLang=t.forceSourceLang??!1,e.unknown1=t.unknown1??0,e.translationHelp=t.translationHelp?.map((t=>l.fromPartial(t)))||[],e.responseLanguage=t.responseLanguage??"",e.unknown2=t.unknown2??0,e.unknown3=t.unknown3??0,e.bypassCache=t.bypassCache??!1,e.useNewModel=t.useNewModel??!1,e}};const u={encode:(t,e=n.Writer.create())=>(void 0!==t.url&&e.uint32(10).string(t.url),void 0!==t.duration&&e.uint32(17).double(t.duration),0!==t.status&&e.uint32(32).int32(t.status),void 0!==t.remainingTime&&e.uint32(40).int32(t.remainingTime),void 0!==t.unknown0&&e.uint32(48).int32(t.unknown0),""!==t.translationId&&e.uint32(58).string(t.translationId),void 0!==t.language&&e.uint32(66).string(t.language),void 0!==t.message&&e.uint32(74).string(t.message),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(17!==t)break;a.duration=o.double();continue;case 4:if(32!==t)break;a.status=o.int32();continue;case 5:if(40!==t)break;a.remainingTime=o.int32();continue;case 6:if(48!==t)break;a.unknown0=o.int32();continue;case 7:if(58!==t)break;a.translationId=o.string();continue;case 8:if(66!==t)break;a.language=o.string();continue;case 9:if(74!==t)break;a.message=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):void 0,duration:I(t.duration)?globalThis.Number(t.duration):void 0,status:I(t.status)?globalThis.Number(t.status):0,remainingTime:I(t.remainingTime)?globalThis.Number(t.remainingTime):void 0,unknown0:I(t.unknown0)?globalThis.Number(t.unknown0):void 0,translationId:I(t.translationId)?globalThis.String(t.translationId):"",language:I(t.language)?globalThis.String(t.language):void 0,message:I(t.message)?globalThis.String(t.message):void 0}),toJSON(t){const e={};return void 0!==t.url&&(e.url=t.url),void 0!==t.duration&&(e.duration=t.duration),0!==t.status&&(e.status=Math.round(t.status)),void 0!==t.remainingTime&&(e.remainingTime=Math.round(t.remainingTime)),void 0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translationId&&(e.translationId=t.translationId),void 0!==t.language&&(e.language=t.language),void 0!==t.message&&(e.message=t.message),e},create:t=>u.fromPartial(t??{}),fromPartial(t){const e={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};return e.url=t.url??void 0,e.duration=t.duration??void 0,e.status=t.status??0,e.remainingTime=t.remainingTime??void 0,e.unknown0=t.unknown0??void 0,e.translationId=t.translationId??"",e.language=t.language??void 0,e.message=t.message??void 0,e}};function c(){return{audioFile:new Uint8Array(0),fileId:""}}const h={encode:(t,e=n.Writer.create())=>(0!==t.audioFile.length&&e.uint32(18).bytes(t.audioFile),""!==t.fileId&&e.uint32(10).string(t.fileId),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a=c();for(;o.pos>>3){case 2:if(18!==t)break;a.audioFile=o.bytes();continue;case 1:if(10!==t)break;a.fileId=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({audioFile:I(t.audioFile)?C(t.audioFile):new Uint8Array(0),fileId:I(t.fileId)?globalThis.String(t.fileId):""}),toJSON(t){const e={};return 0!==t.audioFile.length&&(e.audioFile=function(t){if(globalThis.Buffer)return globalThis.Buffer.from(t).toString("base64");{const e=[];return t.forEach((t=>{e.push(globalThis.String.fromCharCode(t))})),globalThis.btoa(e.join(""))}}(t.audioFile)),""!==t.fileId&&(e.fileId=t.fileId),e},create:t=>h.fromPartial(t??{}),fromPartial(t){const e=c();return e.audioFile=t.audioFile??new Uint8Array(0),e.fileId=t.fileId??"",e}};const p={encode:(t,e=n.Writer.create())=>(0!==t.audioPartsLength&&e.uint32(16).int32(t.audioPartsLength),void 0!==t.audioBuffer&&h.encode(t.audioBuffer,e.uint32(10).fork()).ldelim(),""!==t.fileId&&e.uint32(26).string(t.fileId),0!==t.unknown0&&e.uint32(32).int32(t.unknown0),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={audioPartsLength:0,audioBuffer:void 0,fileId:"",unknown0:0};for(;o.pos>>3){case 2:if(16!==t)break;a.audioPartsLength=o.int32();continue;case 1:if(10!==t)break;a.audioBuffer=h.decode(o,o.uint32());continue;case 3:if(26!==t)break;a.fileId=o.string();continue;case 4:if(32!==t)break;a.unknown0=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({audioPartsLength:I(t.audioPartsLength)?globalThis.Number(t.audioPartsLength):0,audioBuffer:I(t.audioBuffer)?h.fromJSON(t.audioBuffer):void 0,fileId:I(t.fileId)?globalThis.String(t.fileId):"",unknown0:I(t.unknown0)?globalThis.Number(t.unknown0):0}),toJSON(t){const e={};return 0!==t.audioPartsLength&&(e.audioPartsLength=Math.round(t.audioPartsLength)),void 0!==t.audioBuffer&&(e.audioBuffer=h.toJSON(t.audioBuffer)),""!==t.fileId&&(e.fileId=t.fileId),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),e},create:t=>p.fromPartial(t??{}),fromPartial(t){const e={audioPartsLength:0,audioBuffer:void 0,fileId:"",unknown0:0};return e.audioPartsLength=t.audioPartsLength??0,e.audioBuffer=void 0!==t.audioBuffer&&null!==t.audioBuffer?h.fromPartial(t.audioBuffer):void 0,e.fileId=t.fileId??"",e.unknown0=t.unknown0??0,e}};const g={encode:(t,e=n.Writer.create())=>(""!==t.translationId&&e.uint32(10).string(t.translationId),""!==t.url&&e.uint32(18).string(t.url),void 0!==t.partialAudioInfo&&p.encode(t.partialAudioInfo,e.uint32(34).fork()).ldelim(),void 0!==t.audioInfo&&h.encode(t.audioInfo,e.uint32(50).fork()).ldelim(),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={translationId:"",url:"",partialAudioInfo:void 0,audioInfo:void 0};for(;o.pos>>3){case 1:if(10!==t)break;a.translationId=o.string();continue;case 2:if(18!==t)break;a.url=o.string();continue;case 4:if(34!==t)break;a.partialAudioInfo=p.decode(o,o.uint32());continue;case 6:if(50!==t)break;a.audioInfo=h.decode(o,o.uint32());continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({translationId:I(t.translationId)?globalThis.String(t.translationId):"",url:I(t.url)?globalThis.String(t.url):"",partialAudioInfo:I(t.partialAudioInfo)?p.fromJSON(t.partialAudioInfo):void 0,audioInfo:I(t.audioInfo)?h.fromJSON(t.audioInfo):void 0}),toJSON(t){const e={};return""!==t.translationId&&(e.translationId=t.translationId),""!==t.url&&(e.url=t.url),void 0!==t.partialAudioInfo&&(e.partialAudioInfo=p.toJSON(t.partialAudioInfo)),void 0!==t.audioInfo&&(e.audioInfo=h.toJSON(t.audioInfo)),e},create:t=>g.fromPartial(t??{}),fromPartial(t){const e={translationId:"",url:"",partialAudioInfo:void 0,audioInfo:void 0};return e.translationId=t.translationId??"",e.url=t.url??"",e.partialAudioInfo=void 0!==t.partialAudioInfo&&null!==t.partialAudioInfo?p.fromPartial(t.partialAudioInfo):void 0,e.audioInfo=void 0!==t.audioInfo&&null!==t.audioInfo?h.fromPartial(t.audioInfo):void 0,e}};const m={encode(t,e=n.Writer.create()){0!==t.status&&e.uint32(8).int32(t.status);for(const o of t.remainingChunks)e.uint32(18).string(o);return e},decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={status:0,remainingChunks:[]};for(;o.pos>>3){case 1:if(8!==t)break;a.status=o.int32();continue;case 2:if(18!==t)break;a.remainingChunks.push(o.string());continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({status:I(t.status)?globalThis.Number(t.status):0,remainingChunks:globalThis.Array.isArray(t?.remainingChunks)?t.remainingChunks.map((t=>globalThis.String(t))):[]}),toJSON(t){const e={};return 0!==t.status&&(e.status=Math.round(t.status)),t.remainingChunks?.length&&(e.remainingChunks=t.remainingChunks),e},create:t=>m.fromPartial(t??{}),fromPartial(t){const e={status:0,remainingChunks:[]};return e.status=t.status??0,e.remainingChunks=t.remainingChunks?.map((t=>t))||[],e}};const v={encode:(t,e=n.Writer.create())=>(""!==t.language&&e.uint32(10).string(t.language),""!==t.url&&e.uint32(18).string(t.url),0!==t.unknown0&&e.uint32(24).int32(t.unknown0),""!==t.translatedLanguage&&e.uint32(34).string(t.translatedLanguage),""!==t.translatedUrl&&e.uint32(42).string(t.translatedUrl),0!==t.unknown1&&e.uint32(48).int32(t.unknown1),0!==t.unknown2&&e.uint32(56).int32(t.unknown2),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};for(;o.pos>>3){case 1:if(10!==t)break;a.language=o.string();continue;case 2:if(18!==t)break;a.url=o.string();continue;case 3:if(24!==t)break;a.unknown0=o.int32();continue;case 4:if(34!==t)break;a.translatedLanguage=o.string();continue;case 5:if(42!==t)break;a.translatedUrl=o.string();continue;case 6:if(48!==t)break;a.unknown1=o.int32();continue;case 7:if(56!==t)break;a.unknown2=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({language:I(t.language)?globalThis.String(t.language):"",url:I(t.url)?globalThis.String(t.url):"",unknown0:I(t.unknown0)?globalThis.Number(t.unknown0):0,translatedLanguage:I(t.translatedLanguage)?globalThis.String(t.translatedLanguage):"",translatedUrl:I(t.translatedUrl)?globalThis.String(t.translatedUrl):"",unknown1:I(t.unknown1)?globalThis.Number(t.unknown1):0,unknown2:I(t.unknown2)?globalThis.Number(t.unknown2):0}),toJSON(t){const e={};return""!==t.language&&(e.language=t.language),""!==t.url&&(e.url=t.url),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translatedLanguage&&(e.translatedLanguage=t.translatedLanguage),""!==t.translatedUrl&&(e.translatedUrl=t.translatedUrl),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),e},create:t=>v.fromPartial(t??{}),fromPartial(t){const e={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};return e.language=t.language??"",e.url=t.url??"",e.unknown0=t.unknown0??0,e.translatedLanguage=t.translatedLanguage??"",e.translatedUrl=t.translatedUrl??"",e.unknown1=t.unknown1??0,e.unknown2=t.unknown2??0,e}};const f={encode:(t,e=n.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.language&&e.uint32(18).string(t.language),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",language:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.language=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):"",language:I(t.language)?globalThis.String(t.language):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),e},create:t=>f.fromPartial(t??{}),fromPartial(t){const e={url:"",language:""};return e.url=t.url??"",e.language=t.language??"",e}};const b={encode(t,e=n.Writer.create()){!1!==t.waiting&&e.uint32(8).bool(t.waiting);for(const o of t.subtitles)v.encode(o,e.uint32(18).fork()).ldelim();return e},decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={waiting:!1,subtitles:[]};for(;o.pos>>3){case 1:if(8!==t)break;a.waiting=o.bool();continue;case 2:if(18!==t)break;a.subtitles.push(v.decode(o,o.uint32()));continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({waiting:!!I(t.waiting)&&globalThis.Boolean(t.waiting),subtitles:globalThis.Array.isArray(t?.subtitles)?t.subtitles.map((t=>v.fromJSON(t))):[]}),toJSON(t){const e={};return!1!==t.waiting&&(e.waiting=t.waiting),t.subtitles?.length&&(e.subtitles=t.subtitles.map((t=>v.toJSON(t)))),e},create:t=>b.fromPartial(t??{}),fromPartial(t){const e={waiting:!1,subtitles:[]};return e.waiting=t.waiting??!1,e.subtitles=t.subtitles?.map((t=>v.fromPartial(t)))||[],e}};const y={encode:(t,e=n.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.timestamp&&e.uint32(18).string(t.timestamp),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",timestamp:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.timestamp=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):"",timestamp:I(t.timestamp)?globalThis.String(t.timestamp):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.timestamp&&(e.timestamp=t.timestamp),e},create:t=>y.fromPartial(t??{}),fromPartial(t){const e={url:"",timestamp:""};return e.url=t.url??"",e.timestamp=t.timestamp??"",e}};const w={encode:(t,e=n.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.language&&e.uint32(18).string(t.language),""!==t.responseLanguage&&e.uint32(26).string(t.responseLanguage),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",language:"",responseLanguage:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.language=o.string();continue;case 3:if(26!==t)break;a.responseLanguage=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):"",language:I(t.language)?globalThis.String(t.language):"",responseLanguage:I(t.responseLanguage)?globalThis.String(t.responseLanguage):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),e},create:t=>w.fromPartial(t??{}),fromPartial(t){const e={url:"",language:"",responseLanguage:""};return e.url=t.url??"",e.language=t.language??"",e.responseLanguage=t.responseLanguage??"",e}};const x={encode:(t,e=n.Writer.create())=>(0!==t.interval&&e.uint32(8).int32(t.interval),void 0!==t.translatedInfo&&y.encode(t.translatedInfo,e.uint32(18).fork()).ldelim(),void 0!==t.pingId&&e.uint32(24).int32(t.pingId),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={interval:0,translatedInfo:void 0,pingId:void 0};for(;o.pos>>3){case 1:if(8!==t)break;a.interval=o.int32();continue;case 2:if(18!==t)break;a.translatedInfo=y.decode(o,o.uint32());continue;case 3:if(24!==t)break;a.pingId=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({interval:I(t.interval)?s(t.interval):0,translatedInfo:I(t.translatedInfo)?y.fromJSON(t.translatedInfo):void 0,pingId:I(t.pingId)?globalThis.Number(t.pingId):void 0}),toJSON(t){const e={};return 0!==t.interval&&(e.interval=function(t){switch(t){case r.NO_CONNECTION:return"NO_CONNECTION";case r.TRANSLATING:return"TRANSLATING";case r.STREAMING:return"STREAMING";case r.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.interval)),void 0!==t.translatedInfo&&(e.translatedInfo=y.toJSON(t.translatedInfo)),void 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>x.fromPartial(t??{}),fromPartial(t){const e={interval:0,translatedInfo:void 0,pingId:void 0};return e.interval=t.interval??0,e.translatedInfo=void 0!==t.translatedInfo&&null!==t.translatedInfo?y.fromPartial(t.translatedInfo):void 0,e.pingId=t.pingId??void 0,e}};const S={encode:(t,e=n.Writer.create())=>(0!==t.pingId&&e.uint32(8).int32(t.pingId),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={pingId:0};for(;o.pos>>3){case 1:if(8!==t)break;a.pingId=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({pingId:I(t.pingId)?globalThis.Number(t.pingId):0}),toJSON(t){const e={};return 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>S.fromPartial(t??{}),fromPartial(t){const e={pingId:0};return e.pingId=t.pingId??0,e}};const k={encode:(t,e=n.Writer.create())=>(""!==t.uuid&&e.uint32(10).string(t.uuid),""!==t.module&&e.uint32(18).string(t.module),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={uuid:"",module:""};for(;o.pos>>3){case 1:if(10!==t)break;a.uuid=o.string();continue;case 2:if(18!==t)break;a.module=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({uuid:I(t.uuid)?globalThis.String(t.uuid):"",module:I(t.module)?globalThis.String(t.module):""}),toJSON(t){const e={};return""!==t.uuid&&(e.uuid=t.uuid),""!==t.module&&(e.module=t.module),e},create:t=>k.fromPartial(t??{}),fromPartial(t){const e={uuid:"",module:""};return e.uuid=t.uuid??"",e.module=t.module??"",e}};const T={encode:(t,e=n.Writer.create())=>(""!==t.secretKey&&e.uint32(10).string(t.secretKey),0!==t.expires&&e.uint32(16).int32(t.expires),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={secretKey:"",expires:0};for(;o.pos>>3){case 1:if(10!==t)break;a.secretKey=o.string();continue;case 2:if(16!==t)break;a.expires=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({secretKey:I(t.secretKey)?globalThis.String(t.secretKey):"",expires:I(t.expires)?globalThis.Number(t.expires):0}),toJSON(t){const e={};return""!==t.secretKey&&(e.secretKey=t.secretKey),0!==t.expires&&(e.expires=Math.round(t.expires)),e},create:t=>T.fromPartial(t??{}),fromPartial(t){const e={secretKey:"",expires:0};return e.secretKey=t.secretKey??"",e.expires=t.expires??0,e}};function C(t){if(globalThis.Buffer)return Uint8Array.from(globalThis.Buffer.from(t,"base64"));{const e=globalThis.atob(t),o=new Uint8Array(e.length);for(let t=0;tt+e.toString(16).padStart(2,"0")),"")}async function _(t,o,i,a){const{secretKey:n,uuid:r}=o,s=await A(i),l=`${r}:${a}:${e.componentVersion}`,d=P.encode(l);return{[`${t}-Signature`]:s,[`Sec-${t}-Sk`]:n,[`Sec-${t}-Token`]:`${await A(d)}:${l}`}}const V={afr:"af",aka:"ak",alb:"sq",amh:"am",ara:"ar",arm:"hy",asm:"as",aym:"ay",aze:"az",baq:"eu",bel:"be",ben:"bn",bos:"bs",bul:"bg",bur:"my",cat:"ca",chi:"zh",cos:"co",cze:"cs",dan:"da",div:"dv",dut:"nl",eng:"en",epo:"eo",est:"et",ewe:"ee",fin:"fi",fre:"fr",fry:"fy",geo:"ka",ger:"de",gla:"gd",gle:"ga",glg:"gl",gre:"el",grn:"gn",guj:"gu",hat:"ht",hau:"ha",hin:"hi",hrv:"hr",hun:"hu",ibo:"ig",ice:"is",ind:"id",ita:"it",jav:"jv",jpn:"ja",kan:"kn",kaz:"kk",khm:"km",kin:"rw",kir:"ky",kor:"ko",kur:"ku",lao:"lo",lat:"la",lav:"lv",lin:"ln",lit:"lt",ltz:"lb",lug:"lg",mac:"mk",mal:"ml",mao:"mi",mar:"mr",may:"ms",mlg:"mg",mlt:"mt",mon:"mn",nep:"ne",nor:"no",nya:"ny",ori:"or",orm:"om",pan:"pa",per:"fa",pol:"pl",por:"pt",pus:"ps",que:"qu",rum:"ro",rus:"ru",san:"sa",sin:"si",slo:"sk",slv:"sl",smo:"sm",sna:"sn",snd:"sd",som:"so",sot:"st",spa:"es",srp:"sr",sun:"su",swa:"sw",swe:"sv",tam:"ta",tat:"tt",tel:"te",tgk:"tg",tha:"th",tir:"ti",tso:"ts",tuk:"tk",tur:"tr",uig:"ug",ukr:"uk",urd:"ur",uzb:"uz",vie:"vi",wel:"cy",xho:"xh",yid:"yi",yor:"yo",zul:"zu"};async function O(t,o={headers:{"User-Agent":e.userAgent}}){const{timeout:i=3e3,...a}=o,n=new AbortController,r=setTimeout((()=>n.abort()),i),s=await fetch(t,{signal:n.signal,...a});return clearTimeout(r),s}function M(t){return 3===t.length?V[t]:t.toLowerCase().split(/[_;-]/)[0].trim()}function E(t,o="mp4"){const i=`https://${e.mediaProxy}/v1/proxy/video.${o}?format=base64&force=true`;return t instanceof URL?`${i}&url=${btoa(t.href)}&origin=${t.origin}&referer=${t.origin}`:`${i}&url=${btoa(t)}`}const B={encodeTranslationRequest:(t,e,o,i,a,{forceSourceLang:n=!1,bypassCache:r=!1,useNewModel:s=!0}={})=>d.encode({url:t,firstRequest:!0,duration:e,unknown0:1,language:o,forceSourceLang:n,unknown1:0,translationHelp:a||[],responseLanguage:i,unknown2:1,unknown3:1,bypassCache:r,useNewModel:s}).finish(),decodeTranslationResponse:t=>u.decode(new Uint8Array(t)),encodeTranslationAudioRequest:(t,e,o,i)=>g.encode({url:t,translationId:e,...i?{partialAudioInfo:{...i,audioBuffer:o}}:{audioInfo:o}}).finish(),decodeTranslationAudioResponse:t=>m.decode(new Uint8Array(t)),encodeSubtitlesRequest:(t,e)=>f.encode({url:t,language:e}).finish(),decodeSubtitlesResponse:t=>b.decode(new Uint8Array(t)),encodeStreamPingRequest:t=>S.encode({pingId:t}).finish(),encodeStreamRequest:(t,e,o)=>w.encode({url:t,language:e,responseLanguage:o}).finish(),decodeStreamResponse:t=>x.decode(new Uint8Array(t)),encodeYandexSessionRequest:(t,e)=>k.encode({uuid:t,module:e}).finish(),decodeYandexSessionResponse:t=>T.decode(new Uint8Array(t))};var N,R,$;!function(t){t[t.FAILED=0]="FAILED",t[t.FINISHED=1]="FINISHED",t[t.WAITING=2]="WAITING",t[t.LONG_WAITING=3]="LONG_WAITING",t[t.PART_CONTENT=5]="PART_CONTENT",t[t.AUDIO_REQUESTED=6]="AUDIO_REQUESTED"}(N||(N={})),function(t){t.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME="web_api_get_all_generating_urls_data_from_iframe",t.WEB_API_REPLACED_FETCH_INSIDE_IFRAME="web_api_replaced_fetch_inside_iframe",t.WEB_API_REPLACED_FETCH_FORCE_REQUEST_WITH_SEEK="web_api_replaced_fetch_force_request_with_seek",t.WEB_API_REPLACED_FETCH="web_api_replaced_fetch",t.ANDROID_API="android_api",t.WEB_API_SLOW="web_api_slow"}(R||(R={})),function(t){t.custom="custom",t.directlink="custom",t.youtube="youtube",t.piped="piped",t.invidious="invidious",t.vk="vk",t.nine_gag="nine_gag",t.gag="nine_gag",t.twitch="twitch",t.proxitok="proxitok",t.tiktok="tiktok",t.vimeo="vimeo",t.xvideos="xvideos",t.pornhub="pornhub",t.twitter="twitter",t.x="twitter",t.rumble="rumble",t.facebook="facebook",t.rutube="rutube",t.coub="coub",t.bilibili="bilibili",t.mail_ru="mailru",t.mailru="mailru",t.bitchute="bitchute",t.eporner="eporner",t.peertube="peertube",t.dailymotion="dailymotion",t.trovo="trovo",t.yandexdisk="yandexdisk",t.ok_ru="okru",t.okru="okru",t.googledrive="googledrive",t.bannedvideo="bannedvideo",t.weverse="weverse",t.newgrounds="newgrounds",t.egghead="egghead",t.youku="youku",t.archive="archive",t.kodik="kodik",t.patreon="patreon",t.reddit="reddit",t.kick="kick",t.apple_developer="apple_developer",t.appledeveloper="apple_developer",t.poketube="poketube",t.epicgames="epicgames",t.nineanimetv="nineanimetv",t.odysee="odysee",t.coursehunterLike="coursehunterLike",t.sap="sap",t.watchpornto="watchpornto",t.linkedin="linkedin",t.ricktube="ricktube",t.incestflix="incestflix",t.porntn="porntn",t.dzen="dzen",t.cloudflarestream="cloudflarestream",t.loom="loom"}($||($={}));const D=JSON.parse('{"recommended":"recommended","translateVideo":"Translate video","disableTranslate":"Turn off","translationSettings":"Translation settings","subtitlesSettings":"Subtitles settings","about":"About extension","resetSettings":"Reset settings","videoBeingTranslated":"The video is being translated","videoLanguage":"Video language","translationLanguage":"Translation language","translationTake":"The translation will take","translationTakeMoreThanHour":"The translation will take more than an hour","translationTakeAboutMinute":"The translation will take about a minute","translationTakeFewMinutes":"The translation will take a few minutes","translationTakeApproximatelyMinutes":"The translation will take approximately {0} minutes","translationTakeApproximatelyMinute":"The translation will take approximately {0} minutes","requestTranslationFailed":"Failed to request video translation","audioNotReceived":"Audio link not received","audioFormatNotSupported":"The audio format is not supported","VOTAutoTranslate":"Translate on open","VOTDontTranslateYourLang":"Don\'t translate from my language","VOTVolume":"Video volume","VOTVolumeTranslation":"Translation Volume","VOTAutoSetVolume":"Reduce video volume to ","VOTShowVideoSlider":"Video volume slider","VOTSyncVolume":"Link translation and video volume","VOTDisableFromYourLang":"You have disabled the translation of the video in your language","VOTVideoIsTooLong":"Video is too long","VOTNoVideoIDFound":"No video ID found","VOTSubtitles":"Subtitles","VOTSubtitlesDisabled":"Disabled","VOTSubtitlesMaxLength":"Subtitles max length","VOTHighlightWords":"Highlight words","VOTTranslatedFrom":"translated from","VOTAutogenerated":"autogenerated","VOTSettings":"VOT Settings","VOTMenuLanguage":"Menu language","VOTAuthors":"Authors","VOTVersion":"Version","VOTLoader":"Loader","VOTBrowser":"Browser","VOTShowPiPButton":"Show PiP button","langs":{"auto":"Auto","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","as":"Assamese","ay":"Aymara","az":"Azerbaijani","bn":"Bangla","eu":"Basque","be":"Belarusian","bho":"Bhojpuri","bs":"Bosnian","bg":"Bulgarian","my":"Burmese","ca":"Catalan","ceb":"Cebuano","zh":"Chinese","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fil":"Filipino","fi":"Finnish","fr":"French","gl":"Galician","lg":"Ganda","ka":"Georgian","de":"German","el":"Greek","gn":"Guarani","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jv":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","rw":"Kinyarwanda","ko":"Korean","kri":"Krio","ku":"Kurdish","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi","mn":"Mongolian","ne":"Nepali","nso":"Northern Sotho","no":"Norwegian","ny":"Nyanja","or":"Odia","om":"Oromo","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","qu":"Quechua","ro":"Romanian","ru":"Russian","sm":"Samoan","sa":"Sanskrit","gd":"Scottish Gaelic","sr":"Serbian","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","st":"Southern Sotho","es":"Spanish","su":"Sundanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","tt":"Tatar","te":"Telugu","th":"Thai","ti":"Tigrinya","ts":"Tsonga","tr":"Turkish","tk":"Turkmen","uk":"Ukrainian","ur":"Urdu","ug":"Uyghur","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"},"streamNoConnectionToServer":"There is no connection to the server","searchField":"Search...","VOTTranslateAPIErrors":"Translate errors from the API","VOTDetectService":"Language detection service","VOTProxyWorkerHost":"Enter the proxy worker address","VOTM3u8ProxyHost":"Enter the address of the m3u8 proxy worker","proxySettings":"Proxy Settings","translationTakeApproximatelyMinute2":"The translation will take approximately {0} minutes","VOTAudioBooster":"Extended translation volume increase","VOTSubtitlesDesign":"Subtitles design","VOTSubtitlesFontSize":"Font size of subtitles","VOTSubtitlesOpacity":"Transparency of the subtitle background","VOTPressNewHotkey":"Press the new hotkey...","VOTCreateTranslationHotkey":"Create Hotkey for Translation","VOTChangeHotkeyWithCurrent":"Change Hotkey (Current: {0})","VOTSubtitlesDownloadFormat":"The format for downloading subtitles","VOTDownloadWithName":"Download files with the video name","VOTUpdateLocaleFiles":"Update localization files","VOTLocaleHash":"Locale hash","VOTUpdatedAt":"Updated at","VOTNeedWebAudioAPI":"To enable this, you must have a Web Audio API","VOTMediaCSPEnabledOnSite":"Media CSP is enabled on this site","VOTOnlyBypassMediaCSP":"Use it only for bypassing Media CSP","VOTNewAudioPlayer":"Use the new audio player","VOTUseNewModel":"Use an experimental variation of Yandex voices for some videos","VOTTranslationErrorsService":"Error translation service","TranslationDelayed":"The translation is slightly delayed","VOTTranslationCompletedNotify":"The translation on the {0} has been completed!","VOTSendNotifyOnComplete":"Send a notification that the video has been translated","VOTBugReport":"Report a bug"}'),F={log:(...t)=>{}},q="media-proxy.toil.cc/v1/proxy/m3u8",U="vot-worker.toil.cc",z=.15,H="yandexbrowser",W="yandexbrowser",j=["Violentmonkey","FireMonkey","Greasemonkey","AdGuard","OrangeMonkey","Userscripts","Other (Polyfill)"];async function G(t,e,o,i,a=void 0){(a??t[e])===o&&(t[e]=i,await Y.set(e,i),console.log(`[VOT] Old ${e} converted to new ${i}`))}const Y=new class{gmSupport;constructor(){this.gmSupport="function"==typeof GM_getValue,F.log(`GM Storage Status: ${this.gmSupport}`)}syncGet(t,e=void 0){if(this.gmSupport)return GM_getValue(t,e);const o="number"==typeof e;const i=window.localStorage.getItem(t)??e;return o?Number(i):i}async get(t,e=void 0){return this.gmSupport?await GM_getValue(t,e):Promise.resolve(this.syncGet(t,e))}syncSet(t,e){return this.gmSupport?GM_setValue(t,e):window.localStorage.setItem(t,e)}async set(t,e){return this.gmSupport?await GM_setValue(t,e):Promise.resolve(this.syncSet(t,e))}syncDelete(t){return this.gmSupport?GM_deleteValue(t):window.localStorage.removeItem(t)}async delete(t){return this.gmSupport?await GM_deleteValue(t):Promise.resolve(this.syncDelete(t))}syncList(){return this.gmSupport?GM_listValues():["autoTranslate","dontTranslateLanguage","dontTranslateYourLang","autoSetVolumeYandexStyle","autoVolume","buttonPos","showVideoSlider","syncVolume","subtitlesMaxLength","highlightWords","responseLanguage","defaultVolume","audioProxy","showPiPButton","translateAPIErrors","translationService","detectService","m3u8ProxyHost","translateProxyEnabled","hotkeyButton","proxyWorkerHost","audioBooster","locale-version","locale-lang","locale-phrases"]}async list(){return this.gmSupport?await GM_listValues():Promise.resolve(this.syncList())}},J=navigator.language||navigator.userLanguage,K=J?.substr(0,2)?.toLowerCase()??"en";function Z(){return"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled}function X(){return"undefined"!=typeof Hls&&Hls?.isSupported()?new Hls({debug:!1,lowLatencyMode:!0,backBufferLength:90}):void 0}const Q=new RegExp([/(?:https?|ftp):\/\/\S+/g,/https?:\/\/\S+|www\.\S+/gm,/\b\S+\.\S+/gm,/#[^\s#]+/g,/Auto-generated by YouTube/g,/Provided to YouTube by/g,/Released on/g,/0x[a-fA-F0-9]{40}/g,/[13][a-km-zA-HJ-NP-Z1-9]{25,34}/g,/4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}/g,/Paypal/g].map((t=>t.source)).join("|"));function tt(t,e){const o=URL.createObjectURL(t),i=document.createElement("a");i.href=o,i.download=e,i.click(),URL.revokeObjectURL(o)}function et(t){return 0===t.trim().length?(new Date).toLocaleDateString("en-us").replaceAll("/","-"):t.replace(/[\\/:*?"'<>|]/g,"")}async function ot(t,e={}){const{timeout:o=15e3,...i}=e,a=new AbortController;try{if(t.includes("api.browser.yandex.ru"))throw new Error("Preventing yandex cors");return await fetch(t,{signal:a.signal,...i})}catch(e){return F.log("GM_fetch preventing cors by GM_xmlhttpRequest",e.message),new Promise(((e,a)=>{GM_xmlhttpRequest({method:i.method||"GET",url:t,responseType:"blob",...i,data:i.body,timeout:o,onload:t=>{const o=Object.fromEntries(t.responseHeaders.trim().split(/\r?\n/).map((t=>t.split(/: (.+)/))).filter((([t])=>t&&/^[\w-]+$/.test(t)))),i=new Response(t.response,{status:t.status,headers:o});Object.defineProperty(i,"url",{value:t.finalUrl??""}),e(i)},ontimeout:()=>a(new Error("Timeout")),onerror:t=>a(t),onabort:()=>a(new Error("AbortError"))})}))}}function it(){return Math.floor(Date.now()/1e3)}const at="https://raw.githubusercontent.com/ilyhalight/voice-over-translation/master/src/localization",nt=["auto","en","ru","af","am","ar","az","bg","bn","bs","ca","cs","cy","da","de","el","es","et","eu","fa","fi","fr","gl","hi","hr","hu","hy","id","it","ja","jv","kk","km","kn","ko","lo","mk","ml","mn","ms","mt","my","ne","nl","pa","pl","pt","ro","si","sk","sl","sq","sr","su","sv","sw","tr","uk","ur","uz","vi","zh","zu"],rt=new class{lang="en";locale={};gmValues=["locale-phrases","locale-lang","locale-hash","locale-updated-at","locale-lang-override"];constructor(){const t=Y.syncGet("locale-lang-override","auto");this.lang=t&&"auto"!==t?t:(navigator.language||navigator.userLanguage)?.substr(0,2)?.toLowerCase()??"en",this.setLocaleFromJsonString(Y.syncGet("locale-phrases",""))}reset(){for(let t=0;ti&&o===this.lang)return;const a=await this.checkUpdates(t);if(await Y.set("locale-updated-at",i),a){F.log("Updating locale...");try{const e=await ot(`${at}/locales/${this.lang}.json${t?`?timestamp=${i}`:""}`);if(200!==e.status)throw e.status;const o=await e.text();await Y.set("locale-phrases",o),this.setLocaleFromJsonString(o),await Y.set("locale-hash",a),await Y.set("locale-lang",this.lang)}catch(t){console.error("[VOT] [localizationProvider] Failed to get locale, cause:",t),this.setLocaleFromJsonString(await Y.get("locale-phrases",""))}}}setLocaleFromJsonString(t){try{this.locale=JSON.parse(t)??{}}catch(t){console.error("[VOT] [localizationProvider]",t),this.locale={}}}getFromLocale(t,e){const o=e.split(".").reduce(((t,e)=>{if("object"==typeof t&&t)return t[e]}),t);return void 0===o&&console.warn("[VOT] [localizationProvider] locale",t,"doesn't contain key",e),o}getDefault(t){return this.getFromLocale(D,t)??t}get(t){return this.getFromLocale(this.locale,t)??this.getFromLocale(D,t)??t}};class st extends Error{constructor(t){super(rt.getDefault(t)),this.name="VOTLocalizedError",this.unlocalizedMessage=t,this.localizedMessage=rt.get(t)}}class lt extends Error{data;constructor(t,e=void 0){super(t),this.data=e,this.name="VOTJSError",this.message=t}}class dt{host;hostVOT;schema;schemaVOT;fetch;fetchOpts;sessions={};requestLang;responseLang;userAgent=e.userAgent;paths={videoTranslation:"/video-translation/translate",videoTranslationFailAudio:"/video-translation/fail-audio-js",videoTranslationAudio:"/video-translation/audio",videoSubtitles:"/video-subtitles/get-subtitles",streamPing:"/stream-translation/ping-stream",streamTranslation:"/stream-translation/translate-stream",createSession:"/session/create"};isCustomLink(t){return!!(/\.(m3u8|m4(a|v)|mpd)/.exec(t)??/^https:\/\/cdn\.qstv\.on\.epicgames\.com/.exec(t))}headers={"User-Agent":this.userAgent,Accept:"application/x-protobuf","Accept-Language":"en","Content-Type":"application/x-protobuf",Pragma:"no-cache","Cache-Control":"no-cache","Sec-Fetch-Mode":"no-cors"};headersVOT={"User-Agent":`vot.js/${e.version}`,"Content-Type":"application/json",Pragma:"no-cache","Cache-Control":"no-cache"};constructor({host:t=e.host,hostVOT:o=e.hostVOT,fetchFn:i=O,fetchOpts:a={},requestLang:n="en",responseLang:r="ru",headers:s={}}={}){const l=/(http(s)?):\/\//,d=l.exec(t)?.[1];this.host=d?t.replace(`${d}://`,""):t,this.schema=d??"https";const u=l.exec(o)?.[1];this.hostVOT=u?o.replace(`${u}://`,""):o,this.schemaVOT=u??"https",this.fetch=i,this.fetchOpts=a,this.requestLang=n,this.responseLang=r,this.headers={...this.headers,...s}}getOpts(t,e={},o="POST"){return{method:o,headers:{...this.headers,...e},body:t,...this.fetchOpts}}async request(t,e,o={},i="POST"){const a=this.getOpts(new Blob([e]),o,i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(e,{"Content-Type":"application/json",...o},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestVOT(t,e,o={}){const i=this.getOpts(JSON.stringify(e),{...this.headersVOT,...o});try{const e=await this.fetch(`${this.schemaVOT}://${this.hostVOT}${t}`,i),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async getSession(t){const e=Math.floor(Date.now()/1e3),o=this.sessions[t];if(o&&o.timestamp+o.expires>e)return o;const{secretKey:i,expires:a,uuid:n}=await this.createSession(t);return this.sessions[t]={secretKey:i,expires:a,timestamp:e,uuid:n},this.sessions[t]}async translateVideoYAImpl({videoData:t,requestLang:o=this.requestLang,responseLang:i=this.responseLang,translationHelp:n=null,headers:r={},extraOpts:s={},shouldSendFailedAudio:l=!0}){const{url:d,duration:u=e.defaultDuration}=t,c=await this.getSession("video-translation"),h=B.encodeTranslationRequest(d,u,o,i,n,s),p=this.paths.videoTranslation,g=await _("Vtrans",c,h,p),m=await this.request(p,h,{...g,...r});if(!m.success)throw new st("requestTranslationFailed");const v=B.decodeTranslationResponse(m.data);a.log("translateVideo",v);const{status:f,translationId:b}=v;switch(f){case N.FAILED:throw v?.message?new lt("Yandex couldn't translate video",v):new st("requestTranslationFailed");case N.FINISHED:case N.PART_CONTENT:if(!v.url)throw new st("audioNotReceived");return{translationId:b,translated:!0,url:v.url,status:f,remainingTime:v.remainingTime??-1};case N.WAITING:case N.LONG_WAITING:return{translationId:b,translated:!1,status:f,remainingTime:v.remainingTime};case N.AUDIO_REQUESTED:return d.startsWith("https://youtu.be/")&&l?(await this.requestVtransFailAudio(d),await this.requestVtransAudio(d,v.translationId,{audioFile:new Uint8Array,fileId:R.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME}),await this.translateVideoYAImpl({videoData:t,requestLang:o,responseLang:i,translationHelp:n,headers:r,shouldSendFailedAudio:!1})):{translationId:b,translated:!1,status:f,remainingTime:v.remainingTime??-1};default:throw a.error("Unknown response",v),new lt("Unknown response from Yandex",v)}}async translateVideoVOTImpl({url:t,videoId:e,service:o,requestLang:i=this.requestLang,responseLang:a=this.responseLang,headers:n={}}){const r=function(t,e,o){return t===$.patreon?{service:"mux",videoId:new URL(o).pathname.slice(1)}:{service:t,videoId:e}}(o,e,t),s=await this.requestVOT(this.paths.videoTranslation,{provider:"yandex",service:r.service,videoId:r.videoId,fromLang:i,toLang:a,rawVideo:t},n);if(!s.success)throw new st("requestTranslationFailed");const l=s.data;switch(l.status){case"failed":throw new lt("Yandex couldn't translate video",l);case"success":if(!l.translatedUrl)throw new st("audioNotReceived");return{translationId:String(l.id),translated:!0,url:l.translatedUrl,status:1,remainingTime:-1};case"waiting":return{translationId:"",translated:!1,remainingTime:l.remainingTime,status:2,message:l.message}}}async requestVtransFailAudio(t){const e=await this.requestJSON(this.paths.videoTranslationFailAudio,JSON.stringify({video_url:t}),void 0,"PUT");if(!e.data||"string"==typeof e.data||1!==e.data.status)throw new lt("Failed to request to fake video translation fail audio js",e);return e}async requestVtransAudio(t,e,o,i,a={}){const n=await this.getSession("video-translation"),r=B.encodeTranslationAudioRequest(t,e,o,i),s=this.paths.videoTranslationAudio,l=await _("Vtrans",n,r,s),d=await this.request(s,r,{...l,...a},"PUT");if(!d.success)throw new lt("Failed to request video translation audio",d);return B.decodeTranslationAudioResponse(d.data)}async translateVideo({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:i=null,headers:a={},extraOpts:n={},shouldSendFailedAudio:r=!0}){const{url:s,videoId:l,host:d}=t;return this.isCustomLink(s)?await this.translateVideoVOTImpl({url:s,videoId:l,service:d,requestLang:e,responseLang:o,headers:a}):await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:i,headers:a,extraOpts:n,shouldSendFailedAudio:r})}async getSubtitles({videoData:t,requestLang:e=this.requestLang,headers:o={}}){const{url:i}=t;if(this.isCustomLink(i))return{waiting:!1,subtitles:[]};const a=await this.getSession("video-translation"),n=B.encodeSubtitlesRequest(i,e),r=this.paths.videoSubtitles,s=await _("Vsubs",a,n,r),l=await this.request(r,n,{...s,...o});if(!l.success)throw new lt("Failed to request video subtitles",l);return B.decodeSubtitlesResponse(l.data)}async pingStream({pingId:t,headers:e={}}){const o=await this.getSession("video-translation"),i=B.encodeStreamPingRequest(t),a=this.paths.streamPing,n=await _("Vtrans",o,i,a),r=await this.request(a,i,{...n,...e});if(!r.success)throw new lt("Failed to request stream ping",r);return!0}async translateStream({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,headers:i={}}){const{url:n}=t;if(this.isCustomLink(n))throw new st("VOTStreamNotSupportedUrl");const s=await this.getSession("video-translation"),l=B.encodeStreamRequest(n,e,o),d=this.paths.streamTranslation,u=await _("Vtrans",s,l,d),c=await this.request(d,l,{...u,...i});if(!c.success)throw new lt("Failed to request stream translation",c);const h=B.decodeStreamResponse(c.data),p=h.interval;switch(p){case r.NO_CONNECTION:case r.TRANSLATING:return{translated:!1,interval:p,message:p===r.NO_CONNECTION?"streamNoConnectionToServer":"translationTakeFewMinutes"};case r.STREAMING:return{translated:!0,interval:p,pingId:h.pingId,result:h.translatedInfo};default:throw a.error("Unknown response",h),new lt("Unknown response from Yandex",h)}}async createSession(t){const e=function(){let t="";for(let e=0;e<32;e++)t+="0123456789ABCDEF"[Math.floor(16*Math.random())];return t}(),o=B.encodeYandexSessionRequest(e,t),i=await this.request(this.paths.createSession,o,{"Vtrans-Signature":await A(o)});if(!i.success)throw new lt("Failed to request create session",i);return{...B.decodeYandexSessionResponse(i.data),uuid:e}}}class ut extends dt{constructor(t={}){t.host=t.host??e.hostWorker,super(t)}async request(t,e,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,...o},body:Array.from(e)}),{"Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,"Content-Type":"application/json",Accept:"application/json",...o},body:e}),{Accept:"application/json","Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}}class ct extends dt{constructor(t){super(t)}}class ht extends ut{constructor(t){super(t)}}class pt extends Error{constructor(t){super(t),this.name="VideoDataError",this.message=t}}const gt=/(file:\/\/(\/)?|(http(s)?:\/\/)(127\.0\.0\.1|localhost|192\.168\.(\d){1,3}\.(\d){1,3}))/;var mt;!function(t){t.udemy="udemy",t.coursera="coursera",t.douyin="douyin",t.artstation="artstation"}(mt||(mt={}));const vt=[{additionalData:"mobile",host:$.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:"shorts-video #player"},{additionalData:"mobile",host:$.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:".player-container"},{host:$.youtube,url:"https://youtu.be/",match:/^(www.)?youtube(-nocookie|kids)?.com$/,selector:".html5-video-container:not(#inline-player *)"},{host:$.invidious,url:"https://youtu.be/",match:["yewtu.be","yt.artemislena.eu","invidious.flokinet.to","iv.melmac.space","inv.nadeko.net","inv.tux.pizza","invidious.private.coffee","yt.drgnz.club","vid.puffyan.us","invidious.dhusch.de"],selector:"#player",needBypassCSP:!0},{host:$.piped,url:"https://youtu.be/",match:["piped.video","piped.tokhmi.xyz","piped.moomoo.me","piped.syncpundit.io","piped.mha.fi","watch.whatever.social","piped.garudalinux.org","efy.piped.pages.dev","watch.leptons.xyz","piped.lunar.icu","yt.dc09.ru","piped.mint.lgbt","il.ax","piped.privacy.com.de","piped.esmailelbob.xyz","piped.projectsegfau.lt","piped.in.projectsegfau.lt","piped.us.projectsegfau.lt","piped.privacydev.net","piped.palveluntarjoaja.eu","piped.smnz.de","piped.adminforge.de","piped.qdi.fi","piped.hostux.net","piped.chauvet.pro","piped.jotoma.de","piped.pfcd.me","piped.frontendfriendly.xyz"],selector:".shaka-video-container",needBypassCSP:!0},{host:$.poketube,url:"https://youtu.be/",match:["poketube.fun","pt.sudovanilla.org","poke.ggtyler.dev","poke.uk2.littlekai.co.uk","poke.blahai.gay"],selector:".video-player-container"},{host:$.ricktube,url:"https://youtu.be/",match:["ricktube.ru"],selector:"#oframeplayer > pjsdiv:has(video)"},{additionalData:"mobile",host:$.vk,url:"https://vk.com/video?z=",match:[/^m.vk.(com|ru)$/,/^m.vkvideo.ru$/],selector:"vk-video-player",shadowRoot:!0,needExtraData:!0},{additionalData:"clips",host:$.vk,url:"https://vk.com/video?z=",match:/^(www.|m.)?vk.(com|ru)$/,selector:'div[data-testid="clipcontainer-video"]',needExtraData:!0},{host:$.vk,url:"https://vk.com/video?z=",match:[/^(www.|m.)?vk.(com|ru)$/,/^(www.|m.)?vkvideo.ru$/],selector:".videoplayer_media",needExtraData:!0},{host:$.nine_gag,url:"https://9gag.com/gag/",match:/^9gag.com$/,selector:".video-post"},{host:$.twitch,url:"https://twitch.tv/",match:[/^m.twitch.tv$/,/^(www.)?twitch.tv$/,/^clips.twitch.tv$/,/^player.twitch.tv$/],selector:".video-ref, main > div > section > div > div > div"},{host:$.proxitok,url:"https://www.tiktok.com/",match:["proxitok.pabloferreiro.es","proxitok.pussthecat.org","tok.habedieeh.re","proxitok.esmailelbob.xyz","proxitok.privacydev.net","tok.artemislena.eu","tok.adminforge.de","tt.vern.cc","cringe.whatever.social","proxitok.lunar.icu","proxitok.privacy.com.de"],selector:".column.has-text-centered"},{host:$.tiktok,url:"https://www.tiktok.com/",match:/^(www.)?tiktok.com$/,selector:null},{host:mt.douyin,url:"https://www.douyin.com/",match:/^(www.)?douyin.com/,selector:".xg-video-container",needExtraData:!0,needBypassCSP:!0},{host:$.vimeo,url:"https://vimeo.com/",match:/^vimeo.com$/,needExtraData:!0,selector:".player"},{host:$.vimeo,url:"https://player.vimeo.com/",match:/^player.vimeo.com$/,additionalData:"embed",needExtraData:!0,needBypassCSP:!0,selector:".player"},{host:$.xvideos,url:"https://www.xvideos.com/",match:/^(www.)?(xvideos|xv-ru).com$/,selector:"#hlsplayer",needBypassCSP:!0},{host:$.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:/^[a-z]+.pornhub.com$/,selector:".mainPlayerDiv > .video-element-wrapper-js > div",eventSelector:".mgp_eventCatcher"},{additionalData:"embed",host:$.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:t=>t.host.includes("pornhub.com")&&t.pathname.startsWith("/embed/"),selector:"#player"},{host:$.twitter,url:"https://twitter.com/i/status/",match:/^(twitter|x).com$/,selector:'div[data-testid="videoComponent"] > div:nth-child(1) > div',eventSelector:'div[data-testid="videoPlayer"]',needBypassCSP:!0},{host:$.rumble,url:"https://rumble.com/",match:/^rumble.com$/,selector:"#videoPlayer > .videoPlayer-Rumble-cls > div"},{host:$.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/videos/"),selector:'div[role="main"] div[data-pagelet$="video" i]',needBypassCSP:!0},{additionalData:"reels",host:$.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/reel/"),selector:'div[role="main"]',needBypassCSP:!0},{host:$.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:".video-player > div > div > div:nth-child(2)"},{additionalData:"embed",host:$.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:"#app > div > div"},{host:$.bilibili,url:"https://www.bilibili.com/",match:/^(www|m|player).bilibili.com$/,selector:".bpx-player-video-wrap"},{additionalData:"old",host:$.bilibili,url:"https://www.bilibili.com/",match:/^(www|m).bilibili.com$/,selector:null},{host:$.mailru,url:"https://my.mail.ru/",match:/^my.mail.ru$/,selector:"#b-video-wrapper"},{host:$.bitchute,url:"https://www.bitchute.com/video/",match:/^(www.)?bitchute.com$/,selector:".video-js"},{host:$.eporner,url:"https://www.eporner.com/",match:/^(www.)?eporner.com$/,selector:".vjs-v7"},{host:$.peertube,url:"stub",match:["peertube.1312.media","tube.shanti.cafe","bee-tube.fr","video.sadmin.io","dalek.zone","review.peertube.biz","peervideo.club","tube.la-dina.net","peertube.tmp.rcp.tf","peertube.su","video.blender.org","videos.viorsan.com","tube-sciences-technologies.apps.education.fr","tube-numerique-educatif.apps.education.fr","tube-arts-lettres-sciences-humaines.apps.education.fr","beetoons.tv","comics.peertube.biz","makertube.net"],selector:".vjs-v7"},{host:$.dailymotion,url:"https://dai.ly/",match:/^geo([\d]+)?.dailymotion.com$/,selector:".player"},{host:$.trovo,url:"https://trovo.live/s/",match:/^trovo.live$/,selector:".player-video"},{host:$.yandexdisk,url:"https://yadi.sk/",match:/^disk.yandex.(ru|kz|com(\.(am|ge|tr))?|by|az|co\.il|ee|lt|lv|md|net|tj|tm|uz)$/,selector:".video-player__player > div:nth-child(1)",eventSelector:".video-player__player",needBypassCSP:!0,needExtraData:!0},{host:$.okru,url:"https://ok.ru/video/",match:/^ok.ru$/,selector:"vk-video-player",shadowRoot:!0},{host:$.googledrive,url:"https://drive.google.com/file/d/",match:/^youtube.googleapis.com$/,selector:".html5-video-container"},{host:$.bannedvideo,url:"https://madmaxworld.tv/watch?id=",match:/^(www.)?banned.video|madmaxworld.tv$/,selector:".vjs-v7",needExtraData:!0},{host:$.weverse,url:"https://weverse.io/",match:/^weverse.io$/,selector:".webplayer-internal-source-wrapper",needExtraData:!0},{host:$.newgrounds,url:"https://www.newgrounds.com/",match:/^(www.)?newgrounds.com$/,selector:".ng-video-player"},{host:$.egghead,url:"https://egghead.io/",match:/^egghead.io$/,selector:".cueplayer-react-video-holder"},{host:$.youku,url:"https://v.youku.com/",match:/^v.youku.com$/,selector:"#ykPlayer"},{host:$.archive,url:"https://archive.org/details/",match:/^archive.org$/,selector:".jw-media"},{host:$.kodik,url:"stub",match:/^kodik.(info|biz|cc)$/,selector:".fp-player",needExtraData:!0},{host:$.patreon,url:"stub",match:/^(www.)?patreon.com$/,selector:'div[data-tag="post-card"] div[elevation="subtle"] > div > div > div > div',needExtraData:!0},{additionalData:"old",host:$.reddit,url:"stub",match:/^old.reddit.com$/,selector:".reddit-video-player-root",needExtraData:!0,needBypassCSP:!0},{host:$.reddit,url:"stub",match:/^(www.|new.)?reddit.com$/,selector:"div[slot=post-media-container]",shadowRoot:!0,needExtraData:!0,needBypassCSP:!0},{host:$.kick,url:"https://kick.com/",match:/^kick.com$/,selector:"#injected-embedded-channel-player-video > div",needExtraData:!0},{host:$.appledeveloper,url:"https://developer.apple.com/",match:/^developer.apple.com$/,selector:".developer-video-player",needExtraData:!0,needBypassCSP:!0},{host:$.epicgames,url:"https://dev.epicgames.com/community/learning/",match:/^dev.epicgames.com$/,selector:".vjs-v7",needExtraData:!0},{host:$.nineanimetv,url:"https://9animetv.to/watch/",match:/^rapid-cloud.co$/,selector:".jw-media",needExtraData:!0},{host:$.odysee,url:"stub",match:/^odysee.com$/,selector:".vjs-v7",needExtraData:!0},{host:$.coursehunterLike,url:"stub",match:["coursehunter.net","coursetrain.net"],selector:"#oframeplayer > pjsdiv:has(video)",needExtraData:!0},{host:$.sap,url:"https://learning.sap.com/courses/",match:/^learning.sap.com$/,selector:".playkit-container",eventSelector:".playkit-player",needExtraData:!0,needBypassCSP:!0},{host:mt.udemy,url:"https://www.udemy.com/",match:/udemy.com$/,selector:'div[data-purpose="curriculum-item-viewer-content"] > section > div > div > div > div:nth-of-type(2)',needExtraData:!0},{host:mt.coursera,url:"https://www.coursera.org/",match:/coursera.org$/,selector:".vjs-v8",needExtraData:!0},{host:$.watchpornto,url:"https://watchporn.to/",match:/^watchporn.to$/,selector:".fp-player"},{host:$.linkedin,url:"https://www.linkedin.com/learning/",match:/^(www.)?linkedin.com$/,selector:".vjs-v7",needExtraData:!0,needBypassCSP:!0},{host:$.incestflix,url:"https://www.incestflix.net/watch/",match:/^(www.)?incestflix.(net|to|com)$/,selector:"#incflix-stream",needExtraData:!0},{host:$.porntn,url:"https://porntn.com/videos/",match:/^porntn.com$/,selector:".fp-player",needExtraData:!0},{host:$.dzen,url:"https://dzen.ru/video/watch/",match:/^dzen.ru$/,selector:".zen-ui-video-video-player"},{host:$.cloudflarestream,url:"stub",match:/^(watch|embed|iframe|customer-[^.]+).cloudflarestream.com$/,selector:null},{host:$.loom,url:"https://www.loom.com/share/",match:/^(www.)?loom.com$/,selector:".VideoLayersContainer",needExtraData:!0},{host:mt.artstation,url:"https://www.artstation.com/learning/",match:/^(www.)?artstation.com$/,selector:".vjs-v7",needExtraData:!0},{host:$.custom,url:"stub",match:t=>/([^.]+).(mp4|webm)/.test(t.pathname),rawResult:!0}];class ft extends Error{constructor(t){super(t),this.name="VideoHelper",this.message=t}}class bt{API_ORIGIN=window.location.origin;fetch;extraInfo;referer;origin;service;video;constructor({fetchFn:t=O,extraInfo:e=!0,referer:o=document.referrer??window.location.origin+"/",origin:i=window.location.origin,service:a,video:n}={}){this.fetch=t,this.extraInfo=e,this.referer=o,this.origin=/^(http(s)?):\/\//.test(String(i))?i:window.location.origin,this.service=a,this.video=n}async getVideoData(t){}async getVideoId(t){}returnBaseData(t){if(this.service)return{url:this.service.url+t,videoId:t,host:this.service.host,duration:void 0}}}class yt extends bt{static getPlayer(){const t=document.querySelector(".video-js");if(t)return t.player}async getVideoData(t){try{const e=yt.getPlayer();if(!e)throw new Error(`Video player doesn't have player option, videoId ${t}`);const{cache_:{sources:o,duration:i},textTracks_:{tracks_:a}}=e,n=o.find((t=>"video/mp4"===t.type));if(!n)throw new Error(`Failed to find video url for videoID ${t}`);const r=new URL(n.src),s=a.map((t=>({language:M(t.language),source:"linkedin",format:"vtt",url:t.src})));return{url:E(r),duration:i,subtitles:s}}catch(t){return void a.error("Failed to get linkedin video data",t.message)}}async getVideoId(t){return/\/learning\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}}class wt extends bt{static getPlayer(){if("undefined"==typeof Videoview)return;const t=Videoview;return t.getPlayerObject?t.getPlayerObject.call(void 0):void 0}getDefault(t){if(this.service)return{url:this.service.url+t,duration:void 0}}async getVideoData(t){const e=wt.getPlayer();if(!e)return this.getDefault(t);try{const{description:o,duration:i,md_title:a}=e.vars,n=(new DOMParser).parseFromString(o,"text/html"),r=Array.from(n.body.childNodes).filter((t=>"BR"!==t.nodeName)).map((t=>t.textContent)).join("\n");let s;return Object.hasOwn(e.vars,"subs")&&(s=e.vars.subs.map((t=>({language:M(t.lang),source:"vk",format:"vtt",url:t.url,isAutoGenerated:!!t.is_auto})))),{url:this.service.url+t,title:a,description:r,duration:i,subtitles:s}}catch(e){return a.error(`Failed to get VK video data, because: ${e.message}`),this.getDefault(t)}}async getVideoId(t){const e=/^\/(video|clip)-?\d{8,9}_\d{9}$/.exec(t.pathname);if(e)return e[0].slice(1);const o=/\/playlist\/[^/]+\/(video-?\d{8,9}_\d{9})/.exec(t.pathname);if(o)return o[1];const i=t.searchParams.get("z");if(i)return i.split("/")[0];const a=t.searchParams.get("oid"),n=t.searchParams.get("id");return a&&n?`video-${Math.abs(parseInt(a))}_${n}`:void 0}}class xt extends bt{async getVideoId(t){return/([^/]+)\/video\/([^/]+)/.exec(t.pathname)?.[0]}}class St extends bt{async getVideoId(t){return"youtu.be"===t.hostname&&(t.search=`?v=${t.pathname.replace("/","")}`,t.pathname="/watch"),/(?:watch|embed|shorts|live)\/([^/]+)/.exec(t.pathname)?.[1]??t.searchParams.get("v")}}const kt=["auto","ru","en","zh","ko","lt","lv","ar","fr","it","es","de","ja"],Tt=["ru","en","kk"],Ct=["srt","vtt","json"];var It;!function(t){t.Channel="Channel",t.Video="Video"}(It||(It={}));const Pt={[$.mailru]:class extends bt{API_ORIGIN="https://my.mail.ru";async getVideoMeta(t){try{const e=await this.fetch(`${this.API_ORIGIN}/+/video/meta/${t}?xemail=&ajax_call=1&func_name=&mna=&mnb=&ext=1&_=${(new Date).getTime()}`);return await e.json()}catch(t){return void a.error("Failed to get mail.ru video data",t.message)}}async getVideoId(t){const e=t.pathname;if(/\/(v|mail|bk|inbox)\//.exec(e))return e.slice(1);const o=/video\/embed\/([^/]+)/.exec(e)?.[1];if(!o)return;const i=await this.getVideoMeta(o);return i?i.meta.url.replace("//my.mail.ru/",""):void 0}},[$.weverse]:class extends bt{API_ORIGIN="https://global.apis.naver.com/weverse/wevweb";API_APP_ID="be4d79eb8fc7bd008ee82c8ec4ff6fd4";API_HMAC_KEY="1b9cb6378d959b45714bec49971ade22e6e24e42";HEADERS={Accept:"application/json, text/plain, */*",Origin:"https://weverse.io",Referer:"https://weverse.io/"};getURLData(){return{appId:this.API_APP_ID,language:"en",os:"WEB",platform:"WEB",wpf:"pc"}}async createHash(t){const e=Date.now(),o=t.substring(0,Math.min(255,t.length))+e,i=await async function(t,e){try{const o=P.encode(e),i=await L("SHA-1",t,o);return btoa(String.fromCharCode(...new Uint8Array(i)))}catch(t){return a.error(t),!1}}(this.API_HMAC_KEY,o);if(!i)throw new ft("Failed to get weverse HMAC signature");return{wmsgpad:e.toString(),wmd:i}}async getHashURLParams(t){const e=await this.createHash(t);return new URLSearchParams(e).toString()}async getPostPreview(t){const e=`/post/v1.0/post-${t}/preview?`+new URLSearchParams({fieldSet:"postForPreview",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{headers:this.HEADERS});return await o.json()}catch(e){return a.error(`Failed to get weverse post preview by postId: ${t}`,e.message),!1}}async getVideoInKey(t){const e=`/video/v1.1/vod/${t}/inKey?`+new URLSearchParams({gcc:"RU",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{method:"POST",headers:this.HEADERS});return await o.json()}catch(e){return a.error(`Failed to get weverse InKey by videoId: ${t}`,e.message),!1}}async getVideoInfo(t,e,o){const i=Date.now();try{const a=new URLSearchParams({key:e,sid:o,nonce:i.toString(),devt:"html5_pc",prv:"N",aup:"N",stpb:"N",cpl:"en",env:"prod",lc:"en",adi:JSON.stringify([{adSystem:null}]),adu:"/"}).toString(),n=await this.fetch(`https://global.apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/${t}?`+a,{headers:this.HEADERS});return await n.json()}catch(i){return a.error(`Failed to get weverse video info (infraVideoId: ${t}, inkey: ${e}, serviceId: ${o}`,i.message),!1}}extractVideoInfo(t){return t.find((t=>!1===t.useP2P&&t.source.includes(".mp4")))}async getVideoData(t){const e=await this.getPostPreview(t);if(!e)return;const{videoId:o,serviceId:i,infraVideoId:a}=e.extension.video;if(!(o&&i&&a))return;const n=await this.getVideoInKey(o);if(!n)return;const r=await this.getVideoInfo(a,n.inKey,i);if(!r)return;const s=this.extractVideoInfo(r.videos.list);return s?{url:s.source,duration:s.duration}:void 0}async getVideoId(t){return/([^/]+)\/(live|media)\/([^/]+)/.exec(t.pathname)?.[3]}},[$.kodik]:class extends bt{API_ORIGIN=window.location.origin;async getSecureData(t){try{const o=await this.fetch(`${this.API_ORIGIN}${t}`,{headers:{"User-Agent":e.userAgent,Origin:this.API_ORIGIN,Referer:this.API_ORIGIN}}),i=await o.text(),[a,n,r]=t.split("/").filter((t=>t)),s=(new DOMParser).parseFromString(i,"text/html"),l=Array.from(s.getElementsByTagName("script")).filter((t=>t.innerHTML.includes(`videoId = "${n}"`)));if(!l.length)throw new ft("Failed to find secure script");const d=/'{[^']+}'/.exec(l[0].textContent.trim())?.[0];if(!d)throw new ft("Secure json wasn't found in secure script");const u=JSON.parse(d.replaceAll("'",""));return{videoType:a,videoId:n,hash:r,...u}}catch(e){return a.error(`Failed to get kodik secure data by videoPath: ${t}.`,e.message),!1}}async getFtor(t){const{videoType:o,videoId:i,hash:n,d:r,d_sign:s,pd:l,pd_sign:d,ref:u,ref_sign:c}=t;try{const t=await this.fetch(this.API_ORIGIN+"/ftor",{method:"POST",headers:{"User-Agent":e.userAgent,Origin:this.API_ORIGIN,Referer:`${this.API_ORIGIN}/${o}/${i}/${n}/360p`},body:new URLSearchParams({d:r,d_sign:s,pd:l,pd_sign:d,ref:decodeURIComponent(u),ref_sign:c,bad_user:"false",cdn_is_working:"true",info:"{}",type:o,hash:n,id:i})});return await t.json()}catch(t){return a.error(`Failed to get kodik video data (type: ${o}, id: ${i}, hash: ${n})`,t.message),!1}}decryptUrl(t){const e=atob(t.replace(/[a-zA-Z]/g,(function(t){const e=t.charCodeAt(0)+13,o=t<="Z"?90:122;return String.fromCharCode(o>=e?e:e-26)})));return"https:"+e}async getVideoData(t){const e=await this.getSecureData(t);if(!e)return;const o=await this.getFtor(e);if(!o)return;const i=Object.entries(o.links[o.default.toString()]),a=i.find((([,t])=>"application/x-mpegURL"===t.type))?.[1];return a?{url:this.decryptUrl(a.src)}:void 0}async getVideoId(t){return/\/(seria|video)\/([^/]+)\/([^/]+)\/([\d]+)p/.exec(t.pathname)?.[0]}},[$.patreon]:class extends bt{API_ORIGIN="https://www.patreon.com/api";async getPosts(t){try{const e=await this.fetch(`${this.API_ORIGIN}/posts/${t}?json-api-use-default-includes=false`);return await e.json()}catch(e){return a.error(`Failed to get patreon posts by postId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getPosts(t);if(!e)return;const o=e.data.attributes.post_file.url;return o?{url:o}:void 0}async getVideoId(t){const e=/posts\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e.replace(/[^\d.]/g,"")}},[$.reddit]:class extends bt{API_ORIGIN="https://www.reddit.com";async getContentUrl(t){if(!this.service.additionalData||"old"!==this.service.additionalData)return document.querySelector("shreddit-player-2")?.src;const e=document.querySelector("[data-hls-url]");return e?.dataset.hlsUrl?.replaceAll("&","&")}async getVideoData(t){try{const e=await this.getContentUrl(t);if(!e)throw new ft("Failed to find content url");return{url:decodeURIComponent(e)}}catch(e){return void a.error(`Failed to get reddit video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/\/r\/(([^/]+)\/([^/]+)\/([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[$.bannedvideo]:class extends bt{API_ORIGIN="https://api.banned.video";async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/graphql`,{method:"POST",body:JSON.stringify({operationName:"GetVideo",query:"query GetVideo($id: String!) {\n getVideo(id: $id) {\n title\n description: summary\n duration: videoDuration\n videoUrl: directUrl\n isStream: live\n }\n }",variables:{id:t}}),headers:{"User-Agent":"bannedVideoFrontEnd","apollographql-client-name":"banned-web","apollographql-client-version":"1.3","content-type":"application/json"}});return await e.json()}catch(e){return console.error(`Failed to get bannedvideo video info by videoId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getVideoInfo(t);if(!e)return;const{videoUrl:o,duration:i,isStream:a,description:n,title:r}=e.data.getVideo;return{url:o,duration:i,isStream:a,title:r,description:n}}async getVideoId(t){return t.searchParams.get("id")??void 0}},[$.kick]:class extends bt{API_ORIGIN="https://kick.com/api";async getClipInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v2/clips/${t}`),o=await e.json(),{clip_url:i,duration:a,title:n}=o.clip;return{url:i,duration:a,title:n}}catch(e){return void a.error(`Failed to get kick clip info by clipId: ${t}.`,e.message)}}async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v1/video/${t}`),o=await e.json(),{source:i,livestream:a}=o,{session_title:n,duration:r}=a;return{url:i,duration:Math.round(r/1e3),title:n}}catch(e){return void a.error(`Failed to get kick video info by videoId: ${t}.`,e.message)}}async getVideoData(t){return t.startsWith("videos")?await this.getVideoInfo(t.replace("videos/","")):await this.getClipInfo(t.replace("clips/",""))}async getVideoId(t){return/([^/]+)\/((videos|clips)\/([^/]+))/.exec(t.pathname)?.[2]}},[$.appledeveloper]:class extends bt{API_ORIGIN="https://developer.apple.com";async getVideoData(t){try{const t=document.querySelector("meta[property='og:video']")?.content;if(!t)throw new ft("Failed to find content url");return{url:t}}catch(e){return void a.error(`Failed to get apple developer video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/videos\/play\/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0]}},[$.epicgames]:class extends bt{API_ORIGIN="https://dev.epicgames.com/community/api/learning";async getPostInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/post.json?hash_id=${t}`);return await e.json()}catch(e){return a.error(`Failed to get epicgames post info by videoId: ${t}.`,e.message),!1}}getVideoBlock(){const t=/videoUrl\s?=\s"([^"]+)"?/,e=Array.from(document.body.querySelectorAll("script")).find((e=>t.exec(e.innerHTML)));if(!e)return;const o=e.innerHTML.trim(),i=t.exec(o)?.[1]?.replace("qsep://","https://");if(!i)return;let a=/sources\s?=\s(\[([^\]]+)\])?/.exec(o)?.[1];if(!a)return{playlistUrl:i,subtitles:[]};try{a=(a.replace(/src:(\s)+?(videoUrl)/g,'src:"removed"').substring(0,a.lastIndexOf("},"))+"]").split("\n").map((t=>t.replace(/([^\s]+):\s?(?!.*\1)/,'"$1":'))).join("\n");const t=JSON.parse(a);return{playlistUrl:i,subtitles:t.filter((t=>"captions"===t.type))}}catch{return{playlistUrl:i,subtitles:[]}}}async getVideoData(t){const e=await this.getPostInfo(t);if(!e)return;const o=this.getVideoBlock();if(!o)return;const{playlistUrl:i,subtitles:a}=o,{title:n,description:r}=e;return{url:i,title:n,description:r,subtitles:a.map((t=>({language:M(t.srclang),source:"epicgames",format:"vtt",url:t.src})))}}async getVideoId(t){return new Promise((t=>{const e="https://dev.epicgames.com";window.addEventListener("message",(o=>{if(o.origin===e&&"string"==typeof o.data&&o.data.startsWith("getVideoId:")){const e=o.data.replace("getVideoId:","");return t(e)}})),window.top.postMessage("getVideoId",e)}))}},[$.nineanimetv]:class extends bt{API_ORIGIN="https://9animetv.to/ajax/episode";RAPID_CLOUD_ORIGIN="https://rapid-cloud.co/ajax/embed-6-v2";async getSourceId(t){try{const e=await this.fetch(`${this.API_ORIGIN}/servers?episodeId=${t}`),o=await e.json();return!!o.html&&/data-id="(\d+)"/.exec(o.html)?.[1]}catch(e){return a.error(`Failed to get 9animetv servers info by episodeId: ${t}.`,e.message),!1}}async getPlayerLink(t){try{const e=await this.fetch(`${this.API_ORIGIN}/sources?id=${t}`),o=await e.json();return!!o.link.includes("rapid-cloud.co")&&o.link}catch(e){return a.error(`Failed to get player link by sourceId: ${t}.`,e.message),!1}}async getRapidCloudData(t){try{const e=await this.fetch(`${this.RAPID_CLOUD_ORIGIN}/getSources?id=${t}`),o=await e.json();return o.encrypted?(a.warn("Encrypted RapidCloud data found. Let us know about it",o),!1):o}catch(e){return a.error(`Failed to get rapid cloud data by rapidId: ${t}.`,e.message),!1}}async getVideoData(t){const e=t.split("?ep=")[1],o=await this.getSourceId(e);if(!o)return;const i=await this.getPlayerLink(o);if(!i)return;const a=/\/([^/?]+)\?/.exec(i)?.[1];if(!a)return;const n=await this.getRapidCloudData(a);if(!n)return;const r=n.sources.find((t=>"hls"===t.type))?.file;if(!r)return;const s=n.tracks.reduce(((t,e)=>{const o=/([\w+]+)(-\d)?\.vtt/.exec(e.file)?.[1];if(!o)return t;const i=M(3===o.length?o:e.label);return t.find((t=>t.language===i))||t.push({language:i,source:"nineanimetv",format:"vtt",url:e.file}),t}),[]);return{url:r,subtitles:s}}async getVideoId(t){return new Promise((t=>{const e="https://9animetv.to";window.addEventListener("message",(o=>{if(o.origin===e&&"string"==typeof o.data&&o.data.startsWith("getVideoId:")){const e=o.data.replace("getVideoId:","");return t(e)}})),window.top.postMessage("getVideoId",e)}))}},[$.odysee]:class extends bt{API_ORIGIN="https://odysee.com";async getVideoData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/${t}`),o=await e.text(),i=/"contentUrl":(\s)?"([^"]+)"/.exec(o)?.[2];if(!i)throw new Error("Odysee url doesn't parsed");return{url:i}}catch(e){return void a.error(`Failed to get odysee video data by video ID: ${t}`,e.message)}}async getVideoId(t){return t.pathname.slice(1)}},[$.coursehunterLike]:class extends bt{API_ORIGIN=this.origin??"https://coursehunter.net";async getCourseId(){const t=window.course_id;if(void 0!==t)return String(t);const e=document.querySelector('input[name="course_id"]');return e?e.value:void 0}async getLessonsData(t){const e=window.lessons;if(e?.length)return e;try{const e=await this.fetch(`${this.API_ORIGIN}/api/v1/course/${t}/lessons`);return await e.json()}catch(e){return void a.error(`Failed to get CoursehunterLike lessons data by courseId: ${t}, because ${e.message}`)}}getLessondId(t){let e=t.split("?lesson=")?.[1];if(e)return+e;const o=document.querySelector(".lessons-item_active");return e=o?.dataset?.index,e?+e:1}async getVideoData(t){const e=await this.getCourseId();if(!e)return;const o=await this.getLessonsData(e);if(!o)return;const i=this.getLessondId(t),a=o?.[i-1],{file:n,duration:r,title:s}=a;return n?{url:n,duration:r,title:s}:void 0}async getVideoId(t){const e=/course\/([^/]+)/.exec(t.pathname)?.[0];return e?e+t.search:void 0}},[$.twitch]:class extends bt{API_ORIGIN="https://clips.twitch.tv";async getClipLink(t,e){const o=document.querySelector("script[type='application/ld+json']"),i=t.slice(1);if(o){const t=JSON.parse(o.innerText),e=t["@graph"].find((t=>"VideoObject"===t["@type"]))?.creator.url;if(!e)throw new ft("Failed to find channel link");return`${e.replace("https://www.twitch.tv/","")}/clip/${i}`}const a="embed"===i,n=document.querySelector(a?".tw-link[data-test-selector='stream-info-card-component__stream-avatar-link']":".clips-player a:not([class])");if(!n)return;return`${n.href.replace("https://www.twitch.tv/","")}/clip/${a?e:i}`}async getVideoId(t){const e=t.pathname;if(/^m\.twitch\.tv$/.test(e))return/videos\/([^/]+)/.exec(t.href)?.[0]??e.slice(1);if(/^player\.twitch\.tv$/.test(t.hostname))return`videos/${t.searchParams.get("video")}`;const o=/([^/]+)\/(?:clip)\/([^/]+)/.exec(e);if(o)return o[0];return/^clips\.twitch\.tv$/.test(t.hostname)?await this.getClipLink(e,t.searchParams.get("clip")):/(?:videos)\/([^/]+)/.exec(e)?.[0]}},[$.sap]:class extends bt{API_ORIGIN="https://learning.sap.com/";async requestKaltura(t,e,o){try{const i=await this.fetch(`https://${t}/api_v3/service/multirequest`,{method:"POST",body:JSON.stringify({1:{service:"session",action:"startWidgetSession",widgetId:`_${e}`},2:{service:"baseEntry",action:"list",ks:"{1:result:ks}",filter:{redirectFromEntryId:o},responseProfile:{type:1,fields:"id,referenceId,name,description,dataUrl,duration,flavorParamsIds,type,dvrStatus,externalSourceType,createdAt,updatedAt,endDate,plays,views,downloadUrl,creatorId"}},3:{service:"baseEntry",action:"getPlaybackContext",entryId:"{2:result:objects:0:id}",ks:"{1:result:ks}",contextDataParams:{objectType:"KalturaContextDataParams",flavorTags:"all"}},apiVersion:"3.3.0",format:1,ks:"",clientTag:"html5:v3.17.22",partnerId:e}),headers:{"Content-Type":"application/json"}});return await i.json()}catch(t){return void a.error("Failed to request kaltura data",t.message)}}async getKalturaData(t){try{const e=document.querySelector('script[data-nscript="beforeInteractive"]');if(!e)throw new ft("Failed to find script element");const o=/https:\/\/([^"]+)\/p\/([^"]+)\/embedPlaykitJs\/uiconf_id\/([^"]+)/.exec(e?.src);if(!o)throw new ft(`Failed to get sap data for videoId: ${t}`);const[,i,a]=o;let n=document.querySelector("#shadow")?.firstChild?.getAttribute("id");if(!n){const t=document.querySelector("#__NEXT_DATA__");if(!t)throw new ft("Failed to find next data element");n=/"sourceId":\s?"([^"]+)"/.exec(t.innerText)?.[1]}if(!i||Number.isNaN(+a)||!n)throw new ft(`One of the necessary parameters for getting a link to a sap video in wasn't found for ${t}. Params: kalturaDomain = ${i}, partnerId = ${a}, entryId = ${n}`);return await this.requestKaltura(i,a,n)}catch(t){return void a.error("Failed to get kaltura data",t.message)}}async getVideoData(t){const e=await this.getKalturaData(t);if(!e)return;const[,o,i]=e,{duration:a}=o.objects[0],n=i.sources.find((t=>"url"===t.format&&"http,https"===t.protocols&&t.url.includes(".mp4")))?.url;if(!n)return;return{url:n,subtitles:i.playbackCaptions.map((t=>({language:M(t.languageCode),source:"sap",format:"vtt",url:t.webVttUrl,isAutoGenerated:t.label.includes("auto-generated")}))),duration:a}}async getVideoId(t){return/((courses|learning-journeys)\/([^/]+)(\/[^/]+)?)/.exec(t.pathname)?.[1]}},[$.linkedin]:yt,[$.vimeo]:class extends bt{API_KEY="";DEFAULT_SITE_ORIGIN="https://vimeo.com";SITE_ORIGIN=this.isPrivatePlayer()?this.service?.url?.slice(0,-1)??this.DEFAULT_SITE_ORIGIN:this.DEFAULT_SITE_ORIGIN;isErrorData(t){return Object.hasOwn(t,"error")}isPrivatePlayer(){return this.referer&&!this.referer.includes("vimeo.com")}async getViewerData(){try{const t=await this.fetch("https://vimeo.com/_next/viewer"),e=await t.json(),{apiUrl:o,jwt:i}=e;return this.API_ORIGIN=`https://${o}`,this.API_KEY=`jwt ${i}`,e}catch(t){return a.error("Failed to get default viewer data.",t.message),!1}}async getVideoInfo(t){try{const e=new URLSearchParams({fields:"name,link,description,duration"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return a.error(`Failed to get video info by video ID: ${t}`,e.message),!1}}async getPrivateVideoSource(t){try{const{default_cdn:e,cdns:o}=t.dash,i=o[e].url,a=await this.fetch(i);if(200!==a.status)throw new ft(await a.text());const n=await a.json(),r=new URL(i),s=Array.from(n.base_url.matchAll(/\.\.\//g)).length+1,l=r.pathname.split("/");let d=n.base_url.replaceAll("../","");d=d&&!d.startsWith("/")?`/${d}`:d,r.pathname=l.slice(0,l.length-s).join("/")+d,r.pathname.endsWith("/")||(r.pathname+="/");const u=n.audio.find((t=>"audio/mp4"===t.mime_type&&"dash"===t.format));if(!u)throw new ft("Failed to find video data");const c=u.segments?.[0]?.url;if(!c)throw new ft("Failed to find first segment url");const[h,p]=c.split("?",2),g=new URLSearchParams(p);return g.delete("range"),r.pathname+=`${u.base_url}${h}`,r.href=r.href.split("?")[0]+"?"+g.toString(),r.href}catch(t){return a.error("Failed to get private video source",t.message),!1}}async getPrivateVideoInfo(t){try{if("undefined"==typeof playerConfig)return;const e=playerConfig,o=await this.getPrivateVideoSource(e.request.files);if(!o)throw new ft("Failed to get private video source");const{video:{title:i,duration:a},request:{text_tracks:n}}=e;return{url:`${this.SITE_ORIGIN}/${t}`,video_url:o,title:i,duration:a,subs:n}}catch(e){return a.error(`Failed to get private video info by video ID: ${t}`,e.message),!1}}async getSubsInfo(t){try{const e=new URLSearchParams({per_page:"100",fields:"language,type,link"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}/texttracks?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return a.error(`Failed to get subtitles info by video ID: ${t}`,e.message),!1}}async getVideoData(t){const e=this.isPrivatePlayer();if(!this.extraInfo)return this.returnBaseData(t);if(e){const e=await this.getPrivateVideoInfo(t);if(!e)return;const{url:o,subs:i,video_url:a,title:n,duration:r}=e,s=i.map((t=>({language:M(t.lang),source:"vimeo",format:"vtt",url:this.SITE_ORIGIN+t.url,isAutoGenerated:t.lang.includes("autogenerated")}))),l=s.length?[{target:"video_file_url",targetUrl:a},{target:"subtitles_file_url",targetUrl:s[0].url}]:null;return{...l?{url:o,translationHelp:l}:{url:a},subtitles:s,title:n,duration:r}}t.startsWith("video/")&&(t=t.replace("video/","")),t.includes("/")&&(t=t.replace("/",":"));if(!await this.getViewerData())return this.returnBaseData(t);const o=await this.getVideoInfo(t);if(!o)return this.returnBaseData(t);const i=await this.getSubsInfo(t),a=i?i.data.map((t=>({language:M(t.language),source:"vimeo",format:"vtt",url:t.link,isAutoGenerated:t.language.includes("autogen")}))):[],{link:n,duration:r,name:s,description:l}=o;return{url:n,title:s,description:l,subtitles:a,duration:r}}async getVideoId(t){const e=/[^/]+\/[^/]+$/.exec(t.pathname)?.[0];return this.isPrivatePlayer()?e:e?.startsWith("video/")?e.replace("video/",""):e??/[^/]+$/.exec(t.pathname)?.[0]}},[$.yandexdisk]:class extends bt{API_ORIGIN=window.location.origin;CLIENT_PREFIX="/client/disk";INLINE_PREFIX="/i/";DISK_PREFIX="/d/";isErrorData(t){return Object.hasOwn(t,"error")}async getClientVideoData(t){const e=new URL(window.location.href).searchParams.get("idDialog");if(!e)return;const o=document.querySelector("#preloaded-data");if(o)try{const t=JSON.parse(o.innerText),{idClient:i,sk:a}=t.config,n=await this.fetch(this.API_ORIGIN+"/models/?_m=resource",{method:"POST",body:new URLSearchParams({idClient:i,sk:a,"_model.0":"resource","id.0":e.replaceAll(" ","+")}).toString().replaceAll(/%2B/g,"+"),headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}),r=await n.json();if(!r.models)throw new ft("Failed to get resource info");const s=r.models[0].data;if(this.isErrorData(s))throw new ft(s.error?.message);const{meta:{short_url:l,video_info:d},name:u}=s;if(!d)throw new ft("There's no video open right now");if(!l)throw new ft("Access to the video is limited");const c=this.clearTitle(u);return{url:l,title:c,duration:Math.round(d.duration/1e3)}}catch(e){return void a.error(`Failed to get yandex disk video data by video ID: ${t}, because ${e.message}`)}}clearTitle(t){return t.replace(/(\.[^.]+)$/,"")}getBodyHash(t,e){const o=JSON.stringify({hash:t,sk:e});return encodeURIComponent(o)}async fetchList(t,e){const o=this.getBodyHash(t,e),i=await this.fetch(this.API_ORIGIN+"/public/api/fetch-list",{method:"POST",body:o}),a=await i.json();if(Object.hasOwn(a,"error"))throw new ft("Failed to fetch folder list");return a.resources}async getDownloadUrl(t,e){const o=this.getBodyHash(t,e),i=await this.fetch(this.API_ORIGIN+"/public/api/download-url",{method:"POST",body:o}),a=await i.json();if(a.error)throw new ft("Failed to get download url");return a.data.url}async getDiskVideoData(t){try{const e=document.getElementById("store-prefetch");if(!e)throw new ft("Failed to get prefetch data");const o=t.split("/").slice(3);if(!o.length)throw new ft("Failed to find video file path");const i=JSON.parse(e.innerText),{resources:a,rootResourceId:n,environment:{sk:r}}=i,s=a[n],l=o.length-1,d=o.filter(((t,e)=>e!==l)).join("/");let u=Object.values(a);d.includes("/")&&(u=await this.fetchList(`${s.hash}:/${d}`,r));const c=u.find((t=>t.name===o[l]));if(!c)throw new ft("Failed to find resource");if(c&&"dir"===c.type)throw new ft("Path is dir, but expected file");const{meta:{short_url:h,mediatype:p,videoDuration:g},path:m,name:v}=c;if("video"!==p)throw new ft("Resource isn't a video");const f=this.clearTitle(v),b=Math.round(g/1e3);if(h)return{url:h,duration:b,title:f};const y=await this.getDownloadUrl(m,r);return{url:E(new URL(y)),duration:b,title:f}}catch(e){return void a.error(`Failed to get yandex disk video data by disk video ID: ${t}`,e.message)}}async getVideoData(t){return t.startsWith(this.INLINE_PREFIX)?{url:this.service.url+t.slice(1)}:(t=decodeURIComponent(t)).startsWith(this.CLIENT_PREFIX)?await this.getClientVideoData(t):await this.getDiskVideoData(t)}async getVideoId(t){if(t.pathname.startsWith(this.CLIENT_PREFIX))return t.pathname+t.search;const e=/\/i\/([^/]+)/.exec(t.pathname)?.[0];return e||(/\/d\/([^/]+)\/([^/]+)/.exec(t.pathname)?t.pathname:void 0)}},[$.vk]:wt,[$.trovo]:class extends bt{async getVideoId(t){const e=t.searchParams.get("vid"),o=/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0];if(e&&o)return`${o}?vid=${e}`}},[$.incestflix]:class extends bt{async getVideoData(t){try{const t=document.querySelector("#incflix-stream source:first-of-type");if(!t)throw new ft("Failed to find source element");const e=t.getAttribute("src");if(!e)throw new ft("Failed to find source link");const o=new URL(e.startsWith("//")?`https:${e}`:e);return o.searchParams.append("media-proxy","video.mp4"),{url:E(o)}}catch(e){return void a.error(`Failed to get Incestflix data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[$.porntn]:class extends bt{async getVideoData(t){try{if("undefined"==typeof flashvars)return;const{rnd:t,video_url:e,video_title:o}=flashvars;if(!e||!t)throw new ft("Failed to find video source or rnd");const i=new URL(e);i.searchParams.append("rnd",t),a.log("PornTN get_file link",i.href);const n=await this.fetch(i.href,{method:"head"}),r=new URL(n.url);a.log("PornTN cdn link",r.href);return{url:E(r),title:o}}catch(e){return void a.error(`Failed to get PornTN data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/videos\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[$.googledrive]:class extends bt{getPlayerData(){const t=document.querySelector("#movie_player");return t?.getVideoData?.call()??void 0}async getVideoId(t){return this.getPlayerData()?.video_id}},[$.bilibili]:class extends bt{async getVideoId(t){const e=/bangumi\/play\/([^/]+)/.exec(t.pathname)?.[0];if(e)return e;const o=t.searchParams.get("bvid");if(o)return`video/${o}`;let i=/video\/([^/]+)/.exec(t.pathname)?.[0];return i&&null!==t.searchParams.get("p")&&(i+=`/?p=${t.searchParams.get("p")}`),i}},[$.xvideos]:class extends bt{async getVideoId(t){return/[^/]+\/[^/]+$/.exec(t.pathname)?.[0]}},[$.watchpornto]:class extends bt{async getVideoId(t){return/(video|embed)\/(\d+)(\/[^/]+\/)?/.exec(t.pathname)?.[0]}},[$.archive]:class extends bt{async getVideoId(t){return/(details|embed)\/([^/]+)/.exec(t.pathname)?.[2]}},[$.dailymotion]:class extends bt{async getVideoId(t){const e=Array.from(document.querySelectorAll("*")).filter((t=>t.innerHTML.trim().includes(".m3u8"))),o=e?.[1]?.lastChild?.src;return o?/\/video\/(\w+)\.m3u8/.exec(o)?.[1]:void 0}},[$.youku]:class extends bt{async getVideoId(t){return/v_show\/id_[\w=]+/.exec(t.pathname)?.[0]}},[$.egghead]:class extends bt{async getVideoId(t){return t.pathname.slice(1)}},[$.newgrounds]:class extends bt{async getVideoId(t){return/([^/]+)\/(view)\/([^/]+)/.exec(t.pathname)?.[0]}},[$.okru]:class extends bt{async getVideoId(t){return/\/video\/(\d+)/.exec(t.pathname)?.[1]}},[$.peertube]:class extends bt{async getVideoId(t){return/\/w\/([^/]+)/.exec(t.pathname)?.[0]}},[$.eporner]:class extends bt{async getVideoId(t){return/video-([^/]+)\/([^/]+)/.exec(t.pathname)?.[0]}},[$.bitchute]:class extends bt{async getVideoId(t){return/(video|embed)\/([^/]+)/.exec(t.pathname)?.[2]}},[$.rutube]:class extends bt{async getVideoId(t){return/(?:video|embed)\/([^/]+)/.exec(t.pathname)?.[1]}},[$.facebook]:class extends bt{async getVideoId(t){return t.pathname.slice(1)}},[$.rumble]:class extends bt{async getVideoId(t){return t.pathname.slice(1)}},[$.twitter]:class extends bt{async getVideoId(t){const e=/status\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e;const o=this.video?.closest('[data-testid="tweet"]'),i=o?.querySelector('a[role="link"][aria-label]')?.href;return i?/status\/([^/]+)/.exec(i)?.[1]:void 0}},[$.pornhub]:class extends bt{async getVideoId(t){return t.searchParams.get("viewkey")??/embed\/([^/]+)/.exec(t.pathname)?.[1]}},[$.tiktok]:xt,[$.proxitok]:xt,[$.nine_gag]:class extends bt{async getVideoId(t){return/gag\/([^/]+)/.exec(t.pathname)?.[1]}},[$.youtube]:St,[$.ricktube]:St,[$.invidious]:St,[$.poketube]:St,[$.piped]:St,[$.dzen]:class extends bt{async getVideoId(t){return/video\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[$.cloudflarestream]:class extends bt{async getVideoId(t){return t.pathname+t.search}},[$.loom]:class extends bt{getClientVersion(){if("undefined"==typeof SENTRY_RELEASE)return;const t=SENTRY_RELEASE;return t?.id}getDefault(t){if(this.service)return{url:this.service.url+t,duration:void 0}}async getVideoData(t){try{const o=this.getClientVersion();if(!o)throw new ft("Failed to get client version");const i=await this.fetch("https://www.loom.com/graphql",{headers:{"User-Agent":e.userAgent,"content-type":"application/json","x-loom-request-source":`loom_web_${o}`,"apollographql-client-name":"web","apollographql-client-version":o,"Alt-Used":"www.loom.com"},body:`{"operationName":"FetchCaptions","variables":{"videoId":"${t}"},"query":"query FetchCaptions($videoId: ID!, $password: String) {\\n fetchVideoTranscript(videoId: $videoId, password: $password) {\\n ... on VideoTranscriptDetails {\\n id\\n captions_source_url\\n language\\n __typename\\n }\\n ... on GenericError {\\n message\\n __typename\\n }\\n __typename\\n }\\n}"}`,method:"POST"});if(200!==i.status)throw new ft("Failed to get data from graphql");const a=(await i.json()).data.fetchVideoTranscript;if("GenericError"===a.__typename)throw new ft(a.message);return{url:this.service.url+t,subtitles:[{format:"vtt",language:M(a.language),source:"loom",url:a.captions_source_url}]}}catch(e){return a.error(`Failed to get Loom video data, because: ${e.message}`),this.getDefault(t)}}async getVideoId(t){return/(embed|share)\/([^/]+)?/.exec(t.pathname)?.[2]}},[mt.udemy]:class extends bt{API_ORIGIN="https://www.udemy.com/api-2.0";getModuleData(){const t=document.querySelector(".ud-app-loader[data-module-id='course-taking']"),e=t?.dataset?.moduleArgs;if(e)return JSON.parse(e)}getLectureId(){return/learn\/lecture\/([^/]+)/.exec(window.location.pathname)?.[1]}async getLectureData(t,e){try{const o=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}/lectures/${e}/?`+new URLSearchParams({"fields[lecture]":"title,description,asset","fields[asset]":"length,media_sources,captions"}).toString());return await o.json()}catch(o){return void a.error(`Failed to get lecture data by courseId: ${t} and lectureId: ${e}`,o.message)}}async getCourseLang(t){try{const e=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}?`+new URLSearchParams({"fields[course]":"locale"}).toString());return await e.json()}catch(e){return void a.error(`Failed to get course lang by courseId: ${t}`,e.message)}}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>M(t.locale_id)===e));return o||(o=t?.find((t=>"en"===M(t.locale_id)))??t?.[0]),o?.url}async getVideoData(t){const e=this.getModuleData();if(!e)return;const{courseId:o}=e,i=this.getLectureId();if(a.log(`[Udemy] courseId: ${o}, lectureId: ${i}`),!i)return;const n=await this.getLectureData(o,i);if(!n)return;const{title:r,description:s,asset:l}=n,{length:d,media_sources:u,captions:c}=l,h=this.findVideoUrl(u);if(!h)return void a.log("Failed to find .mp4 video file in media_sources",u);let p="en";const g=await this.getCourseLang(o);if(g){const{locale:{locale:t}}=g;p=t?M(t):p}kt.includes(p)||(p="en");const m=this.findSubtitleUrl(c,p);return m||a.log("Failed to find subtitle file in captions",c),{...m?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:m},{target:"video_file_url",targetUrl:h}],detectedLanguage:p}:{url:h,translationHelp:null},duration:d,title:r,description:s}}async getVideoId(t){return t.pathname.slice(1)}},[mt.coursera]:class extends bt{API_ORIGIN="https://www.coursera.org/api";async getCourseData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/onDemandCourses.v1/${t}`),o=await e.json();return o?.elements?.[0]}catch(e){return void a.error(`Failed to get course data by courseId: ${t}`,e.message)}}getPlayer(){return document.querySelector(".vjs-v8")}getPlayerData(){return this.getPlayer()?.player}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>M(t.srclang)===e));return o||(o=t?.find((t=>"en"===M(t.srclang)))||t?.[0]),o?.src}async getVideoData(t){const e=this.getPlayerData();if(!e)return void a.error("Failed to find player data");const{cache_:{duration:o},options_:{courseId:i,tracks:n,sources:r}}=e,s=this.findVideoUrl(r);if(!s)return void a.error("Failed to find .mp4 video file in sources",r);let l="en";const d=await this.getCourseData(i);if(d){const{primaryLanguageCodes:[t]}=d;l=t?M(t):"en"}kt.includes(l)||(l="en");const u=this.findSubtitleUrl(n,l);return u||a.warn("Failed to find subtitle file in tracks",n),{...u?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:u},{target:"video_file_url",targetUrl:s}]}:{url:s,translationHelp:null},detectedLanguage:l,duration:o}}async getVideoId(t){return/learn\/([^/]+)\/lecture\/([^/]+)/.exec(t.pathname)?.[0]}},[mt.douyin]:class extends bt{getPlayer(){if("undefined"!=typeof player)return player}async getVideoData(t){const e=this.getPlayer();if(!e)return;const{url:o,duration:i,lang:a,isLive:n}=e.config;if(!o)return;const r=o.find((t=>t.src.includes("www.douyin.com/aweme/v1/play/")));return r?{url:E(r.src),duration:i,isStream:n,...kt.includes(a)?{detectedLanguage:a}:{}}:void 0}async getVideoId(t){const e=/video\/([\d]+)/.exec(t.pathname)?.[0];if(e)return e;const o=this.getPlayer();return o?o.config.vid:void 0}},[mt.artstation]:class extends bt{API_ORIGIN="https://www.artstation.com/api/v2/learning";getCSRFToken(){return document.querySelector('meta[name="public-csrf-token"]')?.content}async getCourseInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/courses/${t}/autoplay.json`,{method:"POST",headers:{"PUBLIC-CSRF-TOKEN":this.getCSRFToken()}});return await e.json()}catch(e){return a.error(`Failed to get artstation course info by courseId: ${t}.`,e.message),!1}}async getVideoUrl(t){try{const e=await this.fetch(`${this.API_ORIGIN}/quicksilver/video_url.json?chapter_id=${t}`);return(await e.json()).url.replace("qsep://","https://")}catch(e){return a.error(`Failed to get artstation video url by chapterId: ${t}.`,e.message),!1}}async getVideoData(t){const[,e,,,o]=t.split("/"),i=await this.getCourseInfo(e);if(!i)return;const a=i.chapters.find((t=>t.hash_id===o));if(!a)return;const n=await this.getVideoUrl(a.id);if(!n)return;const{title:r,duration:s,subtitles:l}=a;return{url:n,title:r,duration:s,subtitles:l.filter((t=>"vtt"===t.format)).map((t=>({language:M(t.locale),source:"artstation",format:"vtt",url:t.file_url})))}}async getVideoId(t){return/courses\/(\w{3,5})\/([^/]+)\/chapters\/(\w{3,5})/.exec(t.pathname)?.[0]}}};class Lt{helpersData;constructor(t={}){this.helpersData=t}getHelper(t){return new Pt[t](this.helpersData)}}async function At(t,e={}){const o=new URL(window.location.href),i=t.host;if(Object.keys(Pt).includes(i)){const t=new Lt(e).getHelper(i);return await t.getVideoId(o)}return i===$.custom?o.href:void 0}function _t(t,e=","){const o=t/1e3,i=Math.floor(o/3600),a=Math.floor(o%3600/60),n=Math.floor(o%60),r=Math.floor(t%1e3);return`${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}${e}${r.toString().padStart(3,"0")}`}function Vt(t){const e=t.split(" ")?.[0]?.split(":");e.length<3&&e.unshift("00");const[o,i,a]=e;return 36e5*+o+6e4*+i+ +a.replace(/[,.]/,"")}function Ot(t,e="srt"){const o="vtt"===e,i=o?".":",",a=t.subtitles.map(((t,e)=>(o?"":`${e+1}\n`)+`${_t(t.startMs,i)} --\x3e ${_t(t.startMs+t.durationMs,i)}\n${t.text}\n\n`)).join("").trim();return o?`WEBVTT\n\n${a}`:a}function Mt(t,e="srt"){const o=function(t){return"string"!=typeof t?"json":/^(WEBVTT)(\r?\n)/.exec(t)?"vtt":"srt"}(t);return o===e?t:"json"===o?Ot(t,e):(t=function(t,e="srt"){const o=t.split(/\r?\n\r?\n/g);"vtt"===e&&o.shift(),/^\d+\r?\n/.exec(o?.[0]??"")&&(e="srt");const i=+("srt"===e);return{containsTokens:!1,subtitles:o.reduce(((t,e)=>{const o=e.trim().split("\n"),a=o[i],n=o.slice(i+1).join("\n");if(!(2===o.length&&e.includes(" --\x3e ")||a?.includes(" --\x3e ")))return 0===t.length||(t[t.length-1].text+=`\n\n${o.join("\n")}`),t;const[r,s]=a.split(" --\x3e "),l=Vt(r),d=Vt(s)-l;return t.push({text:n,startMs:l,durationMs:d,speakerId:"0"}),t}),[])}}(t,o),"json"===e?t:Ot(t,e))}const Et=globalThis,Bt=Et.trustedTypes,Nt=Bt?Bt.createPolicy("lit-html",{createHTML:t=>t}):void 0,Rt="$lit$",$t=`lit$${Math.random().toFixed(9).slice(2)}$`,Dt="?"+$t,Ft=`<${Dt}>`,qt=document,Ut=()=>qt.createComment(""),zt=t=>null===t||"object"!=typeof t&&"function"!=typeof t,Ht=Array.isArray,Wt=t=>Ht(t)||"function"==typeof t?.[Symbol.iterator],jt="[ \t\n\f\r]",Gt=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Yt=/-->/g,Jt=/>/g,Kt=RegExp(`>|${jt}(?:([^\\s"'>=/]+)(${jt}*=${jt}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),Zt=/'/g,Xt=/"/g,Qt=/^(?:script|style|textarea|title)$/i,te=t=>(e,...o)=>({_$litType$:t,strings:e,values:o}),ee=te(1),oe=te(2),ie=(te(3),Symbol.for("lit-noChange")),ae=Symbol.for("lit-nothing"),ne=new WeakMap,re=qt.createTreeWalker(qt,129);function se(t,e){if(!Ht(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==Nt?Nt.createHTML(e):e}const le=(t,e)=>{const o=t.length-1,i=[];let a,n=2===e?"":3===e?"":"",r=Gt;for(let e=0;e"===l[0]?(r=a??Gt,d=-1):void 0===l[1]?d=-2:(d=r.lastIndex-l[2].length,s=l[1],r=void 0===l[3]?Kt:'"'===l[3]?Xt:Zt):r===Xt||r===Zt?r=Kt:r===Yt||r===Jt?r=Gt:(r=Kt,a=void 0);const c=r===Kt&&t[e+1].startsWith("/>")?" ":"";n+=r===Gt?o+Ft:d>=0?(i.push(s),o.slice(0,d)+Rt+o.slice(d)+$t+c):o+$t+(-2===d?e:c)}return[se(t,n+(t[o]||"")+(2===e?"":3===e?"":"")),i]};class de{constructor({strings:t,_$litType$:e},o){let i;this.parts=[];let a=0,n=0;const r=t.length-1,s=this.parts,[l,d]=le(t,e);if(this.el=de.createElement(l,o),re.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(i=re.nextNode())&&s.length0){i.textContent=Bt?Bt.emptyScript:"";for(let o=0;o2||""!==o[0]||""!==o[1]?(this._$AH=Array(o.length-1).fill(new String),this.strings=o):this._$AH=ae}_$AI(t,e=this,o,i){const a=this.strings;let n=!1;if(void 0===a)t=ue(this,t,e,0),n=!zt(t)||t!==this._$AH&&t!==ie,n&&(this._$AH=t);else{const i=t;let r,s;for(t=a[0],r=0;r{const i=o?.renderBefore??e;let a=i._$litPart$;if(void 0===a){const t=o?.renderBefore??null;i._$litPart$=a=new he(e.insertBefore(Ut(),t),t,void 0,o??{})}return a._$AI(t),a};function we(t){return String(t).split("").map((t=>t.charCodeAt(0)))}function xe(t){return new Uint8Array(we(t))}function Se(t){const e=new ArrayBuffer(2*t.length),o=new Uint8Array(e);return new Uint16Array(e).set(we(t)),o}function ke(t){const e=255;return[t>>>24&e,t>>>16&e,t>>>8&e,t&e]}function Te(t){return 11+t}function Ce(t,e,o,i){return 11+e+1+1+(i?2+2*(o+1):o+1)+t}function Ie(t){let e=0;return t.forEach((t=>{e+=2+2*t[0].length+2+2+2*t[1].length+2})),11+e}function Pe(t,e){const o=2*e;let i=0;return t.forEach((t=>{i+=2+2*t[0].length+2+4})),18+o+2+i}class Le{_setIntegerFrame(t,e){const o=parseInt(e,10);this.frames.push({name:t,value:o,size:Te(o.toString().length)})}_setStringFrame(t,e){const o=e.toString();let i=13+2*o.length;"TDAT"===t&&(i=Te(o.length)),this.frames.push({name:t,value:o,size:i})}_setPictureFrame(t,e,o,i){const a=function(t){if(!t||!t.length)return null;if(255===t[0]&&216===t[1]&&255===t[2])return"image/jpeg";if(137===t[0]&&80===t[1]&&78===t[2]&&71===t[3])return"image/png";if(71===t[0]&&73===t[1]&&70===t[2])return"image/gif";if(87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])return"image/webp";const e=73===t[0]&&73===t[1]&&42===t[2]&&0===t[3],o=77===t[0]&&77===t[1]&&0===t[2]&&42===t[3];return e||o?"image/tiff":66===t[0]&&77===t[1]?"image/bmp":0===t[0]&&0===t[1]&&1===t[2]&&0===t[3]?"image/x-icon":null}(new Uint8Array(e)),n=o.toString();if(!a)throw new Error("Unknown picture MIME type");o||(i=!1),this.frames.push({name:"APIC",value:e,pictureType:t,mimeType:a,useUnicodeEncoding:i,description:n,size:Ce(e.byteLength,a.length,n.length,i)})}_setLyricsFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"USLT",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setCommentFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"COMM",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setPrivateFrame(t,e){const o=t.toString();var i,a;this.frames.push({name:"PRIV",value:e,id:o,size:(i=o.length,a=e.byteLength,10+i+1+a)})}_setUserStringFrame(t,e){const o=t.toString(),i=e.toString();var a,n;this.frames.push({name:"TXXX",description:o,value:i,size:(a=o.length,n=i.length,13+2*a+2+2+2*n)})}_setUrlLinkFrame(t,e){const o=e.toString();var i;this.frames.push({name:t,value:o,size:(i=o.length,10+i)})}_setPairedTextFrame(t,e){this.frames.push({name:t,value:e,size:Ie(e)})}_setSynchronisedLyricsFrame(t,e,o,i,a){const n=a.toString(),r=i.split("").map((t=>t.charCodeAt(0)));this.frames.push({name:"SYLT",value:e,language:r,description:n,type:t,timestampFormat:o,size:Pe(e,n.length)})}constructor(t){if(!t||"object"!=typeof t||!("byteLength"in t))throw new Error("First argument should be an instance of ArrayBuffer or Buffer");this.arrayBuffer=t,this.padding=4096,this.frames=[],this.url=""}setFrame(t,e){switch(t){case"TPE1":case"TCOM":case"TCON":{if(!Array.isArray(e))throw new Error(`${t} frame value should be an array of strings`);const o="TCON"===t?";":"/",i=e.join(o);this._setStringFrame(t,i);break}case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TMED":case"TPUB":case"TCOP":case"TKEY":case"TEXT":case"TDAT":case"TSRC":this._setStringFrame(t,e);break;case"TBPM":case"TLEN":case"TYER":this._setIntegerFrame(t,e);break;case"USLT":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("lyrics"in e))throw new Error("USLT frame value should be an object with keys description and lyrics");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setLyricsFrame(e.language,e.description,e.lyrics);break;case"APIC":if("object"!=typeof e||!("type"in e)||!("data"in e)||!("description"in e))throw new Error("APIC frame value should be an object with keys type, data and description");if(e.type<0||e.type>20)throw new Error("Incorrect APIC frame picture type");this._setPictureFrame(e.type,e.data,e.description,!!e.useUnicodeEncoding);break;case"TXXX":if("object"!=typeof e||!("description"in e)||!("value"in e))throw new Error("TXXX frame value should be an object with keys description and value");this._setUserStringFrame(e.description,e.value);break;case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":this._setUrlLinkFrame(t,e);break;case"COMM":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("text"in e))throw new Error("COMM frame value should be an object with keys description and text");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setCommentFrame(e.language,e.description,e.text);break;case"PRIV":if("object"!=typeof e||!("id"in e)||!("data"in e))throw new Error("PRIV frame value should be an object with keys id and data");this._setPrivateFrame(e.id,e.data);break;case"IPLS":if(!Array.isArray(e)||!Array.isArray(e[0]))throw new Error("IPLS frame value should be an array of pairs");this._setPairedTextFrame(t,e);break;case"SYLT":if("object"!=typeof e||!("type"in e)||!("text"in e)||!("timestampFormat"in e))throw new Error("SYLT frame value should be an object with keys type, text and timestampFormat");if(!Array.isArray(e.text)||!Array.isArray(e.text[0]))throw new Error("SYLT frame text value should be an array of pairs");if(e.type<0||e.type>6)throw new Error("Incorrect SYLT frame content type");if(e.timestampFormat<1||e.timestampFormat>2)throw new Error("Incorrect SYLT frame time stamp format");e.language=e.language||"eng",e.description=e.description||"",this._setSynchronisedLyricsFrame(e.type,e.text,e.timestampFormat,e.language,e.description);break;default:throw new Error(`Unsupported frame ${t}`)}return this}removeTag(){if(this.arrayBuffer.byteLength<10)return;const t=new Uint8Array(this.arrayBuffer),e=t[3],o=((i=[t[6],t[7],t[8],t[9]])[0]<<21)+(i[1]<<14)+(i[2]<<7)+i[3]+10;var i,a;73!==(a=t)[0]||68!==a[1]||51!==a[2]||e<2||e>4||(this.arrayBuffer=new Uint8Array(t.subarray(o)).buffer)}addTag(){this.removeTag();const t=[255,254],e=10+this.frames.reduce(((t,e)=>t+e.size),0)+this.padding,o=new ArrayBuffer(this.arrayBuffer.byteLength+e),i=new Uint8Array(o);let a=0,n=[];return n=[73,68,51,3],i.set(n,a),a+=n.length,a++,a++,n=function(t){const e=127;return[t>>>21&e,t>>>14&e,t>>>7&e,t&e]}(e-10),i.set(n,a),a+=n.length,this.frames.forEach((e=>{switch(n=xe(e.name),i.set(n,a),a+=n.length,n=ke(e.size-10),i.set(n,a),a+=n.length,a+=2,e.name){case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":n=xe(e.value),i.set(n,a),a+=n.length;break;case"TPE1":case"TCOM":case"TCON":case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TKEY":case"TMED":case"TPUB":case"TCOP":case"TEXT":case"TSRC":n=[1].concat(t),i.set(n,a),a+=n.length,n=Se(e.value),i.set(n,a),a+=n.length;break;case"TXXX":case"USLT":case"COMM":n=[1],"USLT"!==e.name&&"COMM"!==e.name||(n=n.concat(e.language)),n=n.concat(t),i.set(n,a),a+=n.length,n=Se(e.description),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=Se(e.value),i.set(n,a),a+=n.length;break;case"TBPM":case"TLEN":case"TDAT":case"TYER":a++,n=xe(e.value),i.set(n,a),a+=n.length;break;case"PRIV":n=xe(e.id),i.set(n,a),a+=n.length,a++,i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"APIC":n=[e.useUnicodeEncoding?1:0],i.set(n,a),a+=n.length,n=xe(e.mimeType),i.set(n,a),a+=n.length,n=[0,e.pictureType],i.set(n,a),a+=n.length,e.useUnicodeEncoding?(n=[].concat(t),i.set(n,a),a+=n.length,n=Se(e.description),i.set(n,a),a+=n.length,a+=2):(n=xe(e.description),i.set(n,a),a+=n.length,a++),i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"IPLS":n=[1],i.set(n,a),a+=n.length,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=Se(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=Se(e[1].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length}));break;case"SYLT":n=[1].concat(e.language).concat(e.timestampFormat).concat(e.type),i.set(n,a),a+=n.length,n=[].concat(t),i.set(n,a),a+=n.length,n=Se(e.description),i.set(n,a),a+=n.length,a+=2,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=Se(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length,n=ke(e[1]),i.set(n,a),a+=n.length}))}})),a+=this.padding,i.set(new Uint8Array(this.arrayBuffer),a),this.arrayBuffer=o,o}getBlob(){return new Blob([this.arrayBuffer],{type:"audio/mpeg"})}getURL(){return this.url||(this.url=URL.createObjectURL(this.getBlob())),this.url}revokeURL(){URL.revokeObjectURL(this.url)}}const Ae={version:"1.0.3",debug:!1,fetchFn:fetch.bind(window)};class _e{constructor(){this._vector=new Float32Array,this._position=0,this._frameCount=0}get vector(){return this._vector}get position(){return this._position}get startIndex(){return 2*this._position}get frameCount(){return this._frameCount}get endIndex(){return 2*(this._position+this._frameCount)}clear(){this.receive(this._frameCount),this.rewind()}put(t){this._frameCount+=t}putSamples(t,e,o=0){const i=2*(e=e||0);o>=0||(o=(t.length-i)/2);const a=2*o;this.ensureCapacity(o+this._frameCount);const n=this.endIndex;this.vector.set(t.subarray(i,i+a),n),this._frameCount+=o}putBuffer(t,e,o=0){e=e||0,o>=0||(o=t.frameCount-e),this.putSamples(t.vector,t.position+e,o)}receive(t){t>=0&&!(t>this._frameCount)||(t=this.frameCount),this._frameCount-=t,this._position+=t}receiveSamples(t,e=0){const o=2*e,i=this.startIndex;t.set(this._vector.subarray(i,i+o)),this.receive(e)}extract(t,e=0,o=0){const i=this.startIndex+2*e,a=2*o;t.set(this._vector.subarray(i,i+a))}ensureCapacity(t=0){const e=parseInt(2*t);if(this._vector.length0&&(this._vector.set(this._vector.subarray(this.startIndex,this.endIndex)),this._position=0)}}class Ve{constructor(t){t?(this._inputBuffer=new _e,this._outputBuffer=new _e):this._inputBuffer=this._outputBuffer=null}get inputBuffer(){return this._inputBuffer}set inputBuffer(t){this._inputBuffer=t}get outputBuffer(){return this._outputBuffer}set outputBuffer(t){this._outputBuffer=t}clear(){this._inputBuffer.clear(),this._outputBuffer.clear()}}class Oe extends Ve{constructor(t){super(t),this.reset(),this._rate=1}set rate(t){this._rate=t}reset(){this.slopeCount=0,this.prevSampleL=0,this.prevSampleR=0}clone(){const t=new Oe;return t.rate=this._rate,t}process(){const t=this._inputBuffer.frameCount;this._outputBuffer.ensureAdditionalCapacity(t/this._rate+1);const e=this.transpose(t);this._inputBuffer.receive(),this._outputBuffer.put(e)}transpose(t=0){if(0===t)return 0;const e=this._inputBuffer.vector,o=this._inputBuffer.startIndex,i=this._outputBuffer.vector,a=this._outputBuffer.endIndex;let n=0,r=0;for(;this.slopeCount<1;)i[a+2*r]=(1-this.slopeCount)*this.prevSampleL+this.slopeCount*e[o],i[a+2*r+1]=(1-this.slopeCount)*this.prevSampleR+this.slopeCount*e[o+1],r+=1,this.slopeCount+=this._rate;if(this.slopeCount-=1,1!==t)t:for(;;){for(;this.slopeCount>1;)if(this.slopeCount-=1,n+=1,n>=t-1)break t;const s=o+2*n;i[a+2*r]=(1-this.slopeCount)*e[s]+this.slopeCount*e[s+2],i[a+2*r+1]=(1-this.slopeCount)*e[s+1]+this.slopeCount*e[s+3],r+=1,this.slopeCount+=this._rate}return this.prevSampleL=e[o+2*t-2],this.prevSampleR=e[o+2*t-1],r}}class Me{constructor(t){this._pipe=t}get pipe(){return this._pipe}get inputBuffer(){return this._pipe.inputBuffer}get outputBuffer(){return this._pipe.outputBuffer}fillInputBuffer(){throw new Error("fillInputBuffer() not overridden")}fillOutputBuffer(t=0){for(;this.outputBuffer.frameCountthis._position)throw new RangeError("New position may not be greater than current position");const e=this.outputBufferPosition-(this._position-t);if(e<0)throw new RangeError("New position falls outside of history buffer");this.outputBufferPosition=e,this._position=t}get sourcePosition(){return this._sourcePosition}set sourcePosition(t){this.clear(),this._sourcePosition=t}onEnd(){this.callback()}fillInputBuffer(t=0){const e=new Float32Array(2*t),o=this.sourceSound.extract(e,t,this._sourcePosition);this._sourcePosition+=o,this.inputBuffer.putSamples(e,0,o)}extract(t,e=0){this.fillOutputBuffer(this.outputBufferPosition+e);const o=Math.min(e,this.outputBuffer.frameCount-this.outputBufferPosition);this.outputBuffer.extract(t,this.outputBufferPosition,o);const i=this.outputBufferPosition+o;return this.outputBufferPosition=Math.min(this.historyBufferSize,i),this.outputBuffer.receive(Math.max(i-this.historyBufferSize,0)),this._position+=o,o}handleSampleData(t){this.extract(t.data,4096)}clear(){super.clear(),this.outputBufferPosition=0}}const Ne=[[124,186,248,310,372,434,496,558,620,682,744,806,868,930,992,1054,1116,1178,1240,1302,1364,1426,1488,0],[-100,-75,-50,-25,25,50,75,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-20,-15,-10,-5,5,10,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-4,-3,-2,-1,1,2,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],Re=-10/1.5;class $e extends Ve{constructor(t){super(t),this._quickSeek=!0,this.midBufferDirty=!1,this.midBuffer=null,this.overlapLength=0,this.autoSeqSetting=!0,this.autoSeekSetting=!0,this._tempo=1,this.setParameters(44100,0,0,8)}clear(){super.clear(),this.clearMidBuffer()}clearMidBuffer(){this.midBufferDirty&&(this.midBufferDirty=!1,this.midBuffer=null)}setParameters(t,e,o,i){t>0&&(this.sampleRate=t),i>0&&(this.overlapMs=i),e>0?(this.sequenceMs=e,this.autoSeqSetting=!1):this.autoSeqSetting=!0,o>0?(this.seekWindowMs=o,this.autoSeekSetting=!1):this.autoSeekSetting=!0,this.calculateSequenceParameters(),this.calculateOverlapLength(this.overlapMs),this.tempo=this._tempo}set tempo(t){let e;this._tempo=t,this.calculateSequenceParameters(),this.nominalSkip=this._tempo*(this.seekWindowLength-this.overlapLength),this.skipFract=0,e=Math.floor(this.nominalSkip+.5),this.sampleReq=Math.max(e+this.overlapLength,this.seekWindowLength)+this.seekLength}get tempo(){return this._tempo}get inputChunkSize(){return this.sampleReq}get outputChunkSize(){return this.overlapLength+Math.max(0,this.seekWindowLength-2*this.overlapLength)}calculateOverlapLength(t=0){let e;e=this.sampleRate*t/1e3,e=e<16?16:e,e-=e%8,this.overlapLength=e,this.refMidBuffer=new Float32Array(2*this.overlapLength),this.midBuffer=new Float32Array(2*this.overlapLength)}checkLimits(t,e,o){return to?o:t}calculateSequenceParameters(){let t,e;this.autoSeqSetting&&(t=150+-50*this._tempo,t=this.checkLimits(t,50,125),this.sequenceMs=Math.floor(t+.5)),this.autoSeekSetting&&(e=28.333333333333332+Re*this._tempo,e=this.checkLimits(e,15,25),this.seekWindowMs=Math.floor(e+.5)),this.seekWindowLength=Math.floor(this.sampleRate*this.sequenceMs/1e3),this.seekLength=Math.floor(this.sampleRate*this.seekWindowMs/1e3)}set quickSeek(t){this._quickSeek=t}clone(){const t=new $e;return t.tempo=this._tempo,t.setParameters(this.sampleRate,this.sequenceMs,this.seekWindowMs,this.overlapMs),t}seekBestOverlapPosition(){return this._quickSeek?this.seekBestOverlapPositionStereoQuick():this.seekBestOverlapPositionStereo()}seekBestOverlapPositionStereo(){let t,e,o,i=0;for(this.preCalculateCorrelationReferenceStereo(),t=0,e=Number.MIN_VALUE;ie&&(e=o,t=i);return t}seekBestOverlapPositionStereoQuick(){let t,e,o,i,a,n=0;for(this.preCalculateCorrelationReferenceStereo(),e=Number.MIN_VALUE,t=0,i=0,a=0;n<4;n+=1){let r=0;for(;Ne[n][r]&&(a=i+Ne[n][r],!(a>=this.seekLength));)o=this.calculateCrossCorrelationStereo(2*a,this.refMidBuffer),o>e&&(e=o,t=a),r+=1;i=t}return t}preCalculateCorrelationReferenceStereo(){let t,e,o=0;for(;o=this.sampleReq;){t=this.seekBestOverlapPosition(),this._outputBuffer.ensureAdditionalCapacity(this.overlapLength),this.overlap(Math.floor(t)),this._outputBuffer.put(this.overlapLength),e=this.seekWindowLength-2*this.overlapLength,e>0&&this._outputBuffer.putBuffer(this._inputBuffer,t+this.overlapLength,e);const i=this._inputBuffer.startIndex+2*(t+this.seekWindowLength-this.overlapLength);this.midBuffer.set(this._inputBuffer.vector.subarray(i,i+2*this.overlapLength)),this.skipFract+=this.nominalSkip,o=Math.floor(this.skipFract),this.skipFract-=o,this._inputBuffer.receive(o)}}}const De=function(t,e){return(t>e?t-e:e-t)>1e-10};class Fe{constructor(){this.transposer=new Oe(!1),this.stretch=new $e(!1),this._inputBuffer=new _e,this._intermediateBuffer=new _e,this._outputBuffer=new _e,this._rate=0,this._tempo=0,this.virtualPitch=1,this.virtualRate=1,this.virtualTempo=1,this.calculateEffectiveRateAndTempo()}clear(){this.transposer.clear(),this.stretch.clear()}clone(){const t=new Fe;return t.rate=this.rate,t.tempo=this.tempo,t}get rate(){return this._rate}set rate(t){this.virtualRate=t,this.calculateEffectiveRateAndTempo()}set rateChange(t){this._rate=1+.01*t}get tempo(){return this._tempo}set tempo(t){this.virtualTempo=t,this.calculateEffectiveRateAndTempo()}set tempoChange(t){this.tempo=1+.01*t}set pitch(t){this.virtualPitch=t,this.calculateEffectiveRateAndTempo()}set pitchOctaves(t){this.pitch=Math.exp(.69314718056*t),this.calculateEffectiveRateAndTempo()}set pitchSemitones(t){this.pitchOctaves=t/12}get inputBuffer(){return this._inputBuffer}get outputBuffer(){return this._outputBuffer}calculateEffectiveRateAndTempo(){const t=this._tempo,e=this._rate;this._tempo=this.virtualTempo/this.virtualPitch,this._rate=this.virtualRate*this.virtualPitch,De(this._tempo,t)&&(this.stretch.tempo=this._tempo),De(this._rate,e)&&(this.transposer.rate=this._rate),this._rate>1?this._outputBuffer!=this.transposer.outputBuffer&&(this.stretch.inputBuffer=this._inputBuffer,this.stretch.outputBuffer=this._intermediateBuffer,this.transposer.inputBuffer=this._intermediateBuffer,this.transposer.outputBuffer=this._outputBuffer):this._outputBuffer!=this.stretch.outputBuffer&&(this.transposer.inputBuffer=this._inputBuffer,this.transposer.outputBuffer=this._intermediateBuffer,this.stretch.inputBuffer=this._intermediateBuffer,this.stretch.outputBuffer=this._outputBuffer)}process(){this._rate>1?(this.stretch.process(),this.transposer.process()):(this.transposer.process(),this.stretch.process())}}class qe{constructor(t){this.buffer=t,this._position=0}get dualChannel(){return this.buffer.numberOfChannels>1}get position(){return this._position}set position(t){this._position=t}extract(t,e=0,o=0){this.position=o;let i=this.buffer.getChannelData(0),a=this.dualChannel?this.buffer.getChannelData(1):this.buffer.getChannelData(0),n=0;for(;n=e?t:new Array(e-t.length+1).join(o)+t}(parseInt(t-60*e),2)}`},ze=function(t){const e=this.timePlayed,o=this.sampleRate;if(this.sourcePosition=t,this.timePlayed=t/o,e!==this.timePlayed){const t=new CustomEvent("play",{detail:{timePlayed:this.timePlayed,formattedTimePlayed:this.formattedTimePlayed,percentagePlayed:this.percentagePlayed}});this._node.dispatchEvent(t)}};class He{constructor(t,e,o,i=Ee){this._soundtouch=new Fe;const a=new qe(e);this.timePlayed=0,this.sourcePosition=0,this._filter=new Be(a,this._soundtouch,i),this._node=function(t,e,o=Ee,i=4096){const a=t.createScriptProcessor(i,2,2),n=new Float32Array(2*i);return a.onaudioprocess=t=>{let a=t.outputBuffer.getChannelData(0),r=t.outputBuffer.getChannelData(1),s=e.extract(n,i);o(e.sourcePosition),0===s&&e.onEnd();let l=0;for(;lze.call(this,t)),o),this.tempo=1,this.rate=1,this.duration=e.duration,this.sampleRate=t.sampleRate,this.listeners=[]}get formattedDuration(){return Ue(this.duration)}get formattedTimePlayed(){return Ue(this.timePlayed)}get percentagePlayed(){return 100*this._filter.sourcePosition/(this.duration*this.sampleRate)}set percentagePlayed(t){this._filter.sourcePosition=parseInt(t*this.duration*this.sampleRate),this.sourcePosition=this._filter.sourcePosition,this.timePlayed=this.sourcePosition/this.sampleRate}get node(){return this._node}set pitch(t){this._soundtouch.pitch=t}set pitchSemitones(t){this._soundtouch.pitchSemitones=t}set rate(t){this._soundtouch.rate=t}set tempo(t){this._soundtouch.tempo=t}connect(t){this._node.connect(t)}disconnect(){this._node.disconnect()}on(t,e){this.listeners.push({name:t,cb:e}),this._node.addEventListener(t,(t=>e(t.detail)))}off(t=null){let e=this.listeners;t&&(e=e.filter((e=>e.name===t))),e.forEach((t=>{this._node.removeEventListener(t.name,(e=>t.cb(e.detail)))}))}}const We=(...t)=>{if(Ae.debug)return console.log(`%c✦ chaimu.js v${Ae.version} ✦`,"background: #000; color: #fff; padding: 0 8px",...t)},je=["playing","ratechange","play","waiting","pause","seeked"];function Ge(){const t=window.AudioContext||window.webkitAudioContext;return t?new t:void 0}class Ye{static name="BasePlayer";chaimu;_src;fetch;constructor(t,e){this.chaimu=t,this._src=e,this.fetch=Ae.fetchFn}async init(){return new Promise((t=>t(this)))}clear(){return new Promise((t=>t(this)))}lipSync(t=!1){return this}handleVideoEvent=t=>(We(`handle video ${t.type}`),this.lipSync(t.type),this);removeVideoEvents(){for(const t of je)this.chaimu.video.removeEventListener(t,this.handleVideoEvent);return this}addVideoEvents(){for(const t of je)this.chaimu.video.addEventListener(t,this.handleVideoEvent);return this}async play(){return new Promise((t=>t(this)))}async pause(){return new Promise((t=>t(this)))}get name(){return this.constructor.name}set src(t){this._src=t}get src(){return this._src}get currentSrc(){return this._src}set volume(t){}get volume(){return 0}get playbackRate(){return 0}set playbackRate(t){}get currentTime(){return 0}}class Je extends Ye{static name="AudioPlayer";audio;gainNode;audioSource;constructor(t,e){super(t,e),this.updateAudio()}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.audioSource&&(this.audioSource.disconnect(this.gainNode),this.gainNode.disconnect()),this.gainNode=this.chaimu.audioContext.createGain(),this.gainNode.connect(this.chaimu.audioContext.destination),this.audioSource=this.chaimu.audioContext.createMediaElementSource(this.audio),this.audioSource.connect(this.gainNode),this):this}updateAudio(){return this.audio=new Audio(this.src),this.audio.crossOrigin="anonymous",this}async init(){return new Promise((t=>(this.updateAudio(),this.initAudioBooster(),t(this))))}audioErrorHandle=t=>{console.error("[AudioPlayer]",t)};lipSync(t=!1){if(We("[AudioPlayer] lipsync video",this.chaimu.video),!this.chaimu.video)return this;if(this.audio.currentTime=this.chaimu.video.currentTime,this.audio.playbackRate=this.chaimu.video.playbackRate,!t)return We("[AudioPlayer] lipsync mode isn't set"),this;switch(We(`[AudioPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"seeked":return this.chaimu.video.paused||this.syncPlay(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async clear(){return new Promise((t=>(this.audio.pause(),this.audio.src="",this.audio.removeAttribute("src"),t(this))))}syncPlay(){return We("[AudioPlayer] sync play called"),this.audio.play().catch(this.audioErrorHandle),this}async play(){return We("[AudioPlayer] play called"),await this.audio.play().catch(this.audioErrorHandle),this}async pause(){return new Promise((t=>(We("[AudioPlayer] pause called"),this.audio.pause(),t(this))))}set src(t){this._src=t,t?this.audio.src=t:this.clear()}get src(){return this._src}get currentSrc(){return this.audio.currentSrc}set volume(t){this.gainNode?this.gainNode.gain.value=t:this.audio.volume=t}get volume(){return this.gainNode?this.gainNode.gain.value:this.audio.volume}get playbackRate(){return this.audio.playbackRate}set playbackRate(t){this.audio.playbackRate=t}get currentTime(){return this.audio.currentTime}}class Ke extends Ye{static name="ChaimuPlayer";audioBuffer;sourceNode;gainNode;audioShifter;cleanerRunned=!1;async fetchAudio(){if(!this._src)throw new Error("No audio source provided");if(!this.chaimu.audioContext)throw new Error("No audio context available");We(`[ChaimuPlayer] Fetching audio from ${this._src}...`);try{const t=await this.fetch(this._src);We("[ChaimuPlayer] Decoding fetched audio...");const e=await t.arrayBuffer();this.audioBuffer=await this.chaimu.audioContext.decodeAudioData(e)}catch(t){throw new Error(`Failed to fetch audio file, because ${t.message}`)}return this}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.gainNode.disconnect(),this.gainNode=this.chaimu.audioContext.createGain(),this):this}async init(){return await this.fetchAudio(),this.initAudioBooster(),this}lipSync(t=!1){if(We("[ChaimuPlayer] lipsync video",this.chaimu.video,this),!this.chaimu.video)return this;if(!t)return We("[ChaimuPlayer] lipsync mode isn't set"),this;switch(We(`[ChaimuPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"ratechange":case"seeked":return this.chaimu.video.paused||this.start(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async reopenCtx(){if(!this.chaimu.audioContext)throw new Error("No audio context available");try{await this.chaimu.audioContext.close()}catch{}return this}async clear(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(We("clear audio context"),this.cleanerRunned=!0,await this.pause(),!this.gainNode)return this.cleanerRunned=!1,this;this.sourceNode&&(this.sourceNode.stop(),this.sourceNode.disconnect(this.gainNode),this.sourceNode=void 0),this.audioShifter&&(this.audioShifter._node.disconnect(this.gainNode),this.audioShifter=void 0),this.gainNode.disconnect();const t=this.volume;return this.gainNode=void 0,await this.reopenCtx(),this.chaimu.audioContext=Ge(),this.initAudioBooster(),this.volume=t,this.cleanerRunned=!1,this}async start(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(!this.audioBuffer)throw new Error("The player isn't initialized");return!this.gainNode||this.audioShifter&&this.audioShifter.duration"asr"===t.kind&&t.languageCode));if(i)return M(i.languageCode)}const a=e?.captions?.playerCaptionsTracklistRenderer?.captionTracks?.find((t=>"asr"===t.kind&&t.languageCode));if(a)return M(a.languageCode);const n=function(t,e){return`${t} ${e?e.split("\n").filter((t=>!Q.test(t))).join(" "):""}`.slice(0,450).replace(/[^\p{L}\s]+|\s+/gu," ").trim()}(o,i);return F.log(`Detecting language text: ${n}`),async function(t){const e=await Y.get("detectService",W);switch(e){case"yandexbrowser":case"msedge":return await Xe.detect(t,e);case"rust-server":return await Qe.detect(t);default:return"en"}}(n)}function io(){return/^m\.youtube\.com$/.test(window.location.hostname)}function ao(){return window.location.pathname.startsWith("/shorts/")&&!io()?document.querySelector("#shorts-player"):document.querySelector("#movie_player")}function no(){const t=ao();return t?.getPlayerResponse?t?.getPlayerResponse?.call()??null:t?.data?.playerResponse??null}function ro(){const t=ao();return t?.getVideoData?t?.getVideoData?.call()??null:t?.data?.playerResponse?.videoDetails??null}const so={isMobile:io,getPlayer:ao,getPlayerResponse:no,getPlayerData:ro,getVideoVolume:function(){const t=ao();return t?.getVolume?t.getVolume.call()/100:1},getSubtitles:function(t=rt.lang){const e=no(),o=e?.captions?.playerCaptionsTracklistRenderer;if(!o)return[];let i=o.captionTracks??[];const a=(o.translationLanguages??[]).find((e=>e.languageCode===t)),n=i.find((t=>"asr"===t?.kind))?.languageCode??"en";return i=i.reduce(((e,o)=>{if(!("languageCode"in o))return e;const i=o.languageCode?M(o.languageCode):void 0,r=o?.url||o?.baseUrl;if(!i||!r)return e;const s=`${r.startsWith("http")?r:`${window.location.origin}/${r}`}&fmt=json3`;return e.push({source:"youtube",format:"json",language:i,isAutoGenerated:"asr"===o?.kind,url:s}),a&&o.isTranslatable&&o.languageCode===n&&t!==i&&e.push({source:"youtube",format:"json",language:t,isAutoGenerated:"asr"===o?.kind,translatedFromLanguage:i,url:`${s}&tlang=${t}`}),e}),[]),F.log("youtube subtitles:",i),i},getVideoData:async function(){const t=ao(),e=no(),o=ro(),{title:i}=o??{},{shortDescription:a,isLive:n,title:r}=e?.videoDetails??{};let s=r?await oo(t,e,r,a):"en";s=kt.includes(s)?s:"en";const l={isLive:!!n,title:r,localizedTitle:i,description:a,detectedLanguage:s};return F.log("youtube video data:",l),console.log("[VOT] Detected language: ",l.detectedLanguage),l},setVideoVolume:function(t){const e=ao();if(e?.setVolume)return e.setVolume(Math.round(100*t)),!0},videoSeek:function(t,e){F.log("videoSeek",e);const o=(ao()?.getProgressState()?.seekableEnd||t.currentTime)-e;t.currentTime=o},isMuted:function(){const t=ao();return!!t?.isMuted&&t.isMuted.call()}};class lo{static formatYandexTokens(t){const e=t.startMs+t.durationMs;return t.tokens.reduce(((o,i,a)=>{const n=t.tokens[a+1],r=o[o.length-1],s=r?.alignRange?.end??0,l=s+i.text.length;if(i.alignRange={start:s,end:l},o.push(i),n){const t=i.startMs+i.durationMs,a=n.startMs?n.startMs-t:e-t;o.push({text:" ",startMs:t,durationMs:a,alignRange:{start:l,end:l+1}})}return o}),[])}static createTokens(t,e){const o=t.text.split(/([\n \t])/).reduce(((t,o)=>{if(!o.length)return t;const i=t[t.length-1]??e,a=i?.alignRange?.end??0,n=a+o.length;return t.push({text:o,alignRange:{start:a,end:n}}),t}),[]),i=Math.floor(t.durationMs/o.length),a=t.startMs+t.durationMs;return o.map(((e,n)=>{const r=n===o.length-1,s=t.startMs+i*n;return{...e,startMs:s,durationMs:r?a-s:i}}))}static processTokens(t,e){const o=[];let i;const{source:a,isAutoGenerated:n}=e;for(const e of t.subtitles){const t=e?.tokens?.length,r=t&&("yandex"===a||"youtube"===a&&n)?this.formatYandexTokens(e):this.createTokens(e,i);i=r[r.length-1],o.push({...e,tokens:r})}return t.containsTokens=!0,o}static formatYoutubeSubtitles(t,e=!1){if(!t?.events?.length)return console.error("[VOT] Invalid YouTube subtitles format:",t),{containsTokens:e,subtitles:[]};const o={containsTokens:e,subtitles:[]};for(let i=0;it.events[i+1].tStartMs&&(n=t.events[i+1].tStartMs-a.tStartMs);const r=[];let s=n;for(let t=0;tt.text)).join(" ");l&&o.subtitles.push({text:l,startMs:a.tStartMs,durationMs:n,...e?{tokens:r}:{}})}return o}static cleanJsonSubtitles(t){const{containsTokens:e,subtitles:o}=t;return{containsTokens:e,subtitles:o.map((t=>({...t,text:t.text.replace(/(<([^>]+)>)/gi,"")})))}}static async fetchWithTimeout(t,e=5e3){try{return await ot(t,{timeout:e})}catch(t){throw console.error("[VOT] Fetch failed:",t),t}}static async fetchSubtitles(t){const{source:e,isAutoGenerated:o,format:i,url:a}=t;try{const n=await this.fetchWithTimeout(a);let r;if(["vtt","srt"].includes(i)){const t=await n.text();r=await Mt(t,"json")}else r=await n.json();return"youtube"===e&&(r=this.formatYoutubeSubtitles(r,o)),"vk"===e&&(r=this.cleanJsonSubtitles(r)),r.subtitles=this.processTokens(r,t),console.log("[VOT] Processed subtitles:",r),r}catch(t){return console.error("[VOT] Failed to process subtitles:",t),{containsTokens:!1,subtitles:[]}}}static async getSubtitles(t,e){const{host:o,url:i,detectedLanguage:a,responseLanguage:n,videoId:r,duration:s,subtitles:l}=e,d="youtube"===o?so.getSubtitles(n):l??[];try{const e=await Promise.race([t.getSubtitles({videoData:{host:o,url:i,videoId:r,duration:s},requestLang:a}),new Promise(((t,e)=>setTimeout((()=>e(new Error("Timeout"))),5e3)))]);console.log("[VOT] Subtitles response:",e),e.waiting&&console.error("[VOT] Failed to get Yandex subtitles");const n=(e.subtitles??[]).reduce(((t,e)=>(e.language&&!t.find((t=>"yandex"===t.source&&t.language===e.language&&!t.translatedFromLanguage))&&t.push({source:"yandex",language:e.language,url:e.url}),e.translatedLanguage&&t.push({source:"yandex",language:e.translatedLanguage,translatedFromLanguage:e.language,url:e.translatedUrl}),t)),[]);return[...n,...d].sort(((t,e)=>{if(t.source!==e.source)return"yandex"===t.source?-1:1;if(t.language!==e.language&&(t.language===K||e.language===K))return t.language===K?-1:1;if("yandex"===t.source){if(t.translatedFromLanguage!==e.translatedFromLanguage)return t.translatedFromLanguage&&e.translatedFromLanguage?t.translatedFromLanguage===a?-1:1:t.language===e.language?t.translatedFromLanguage?1:-1:t.translatedFromLanguage?-1:1;if(!t.translatedFromLanguage)return t.language===a?-1:1}return"yandex"!==t.source&&t.isAutoGenerated!==e.isAutoGenerated?t.isAutoGenerated?1:-1:0}))}catch(t){const e="Timeout"===t.message?"Failed to get Yandex subtitles: timeout":"Error in getSubtitles function";throw console.error(`[VOT] ${e}`,t),t}}}class uo{constructor(t,e,o){this.video=t,this.container="youtube"===o.host&&"mobile"!==o.additionalData?e.parentElement:e,this.site=o,this.subtitlesContainer=this.createSubtitlesContainer(),this.position={left:25,top:75},this.dragging={active:!1,offset:{x:0,y:0}},this.subtitles=null,this.lastContent=null,this.highlightWords=!1,this.fontSize=20,this.opacity=.2,this.maxLength=300,this.abortController=new AbortController,this.bindEvents(),this.updateContainerRect()}createSubtitlesContainer(){return this.subtitlesContainer=document.createElement("vot-block"),this.subtitlesContainer.classList.add("vot-subtitles-widget"),this.container.appendChild(this.subtitlesContainer),this.subtitlesContainer}bindEvents(){const{signal:t}=this.abortController;this.onPointerDownBound=t=>this.onPointerDown(t),this.onPointerUpBound=()=>this.onPointerUp(),this.onPointerMoveBound=t=>this.onPointerMove(t),this.onTimeUpdateBound=this.debounce((()=>this.update()),100),document.addEventListener("pointerdown",this.onPointerDownBound,{signal:t}),document.addEventListener("pointerup",this.onPointerUpBound,{signal:t}),document.addEventListener("pointermove",this.onPointerMoveBound,{signal:t}),this.video?.addEventListener("timeupdate",this.onTimeUpdateBound,{signal:t}),this.resizeObserver=new ResizeObserver((()=>this.onResize())),this.resizeObserver.observe(this.container)}onPointerDown(t){if(!this.subtitlesContainer.contains(t.target))return;const e=this.subtitlesContainer.getBoundingClientRect(),o=this.container.getBoundingClientRect();this.dragging={active:!0,offset:{x:t.clientX-e.left,y:t.clientY-e.top},containerOffset:{x:o.left,y:o.top}}}onPointerUp(){this.dragging.active=!1}onPointerMove(t){if(!this.dragging.active)return;t.preventDefault();const{width:e,height:o}=this.container.getBoundingClientRect(),{containerOffset:i,offset:a}=this.dragging;this.position={left:(t.clientX-a.x-i.x)/e*100,top:(t.clientY-a.y-i.y)/o*100},this.applySubtitlePosition()}onResize(){this.updateContainerRect()}updateContainerRect(){this.containerRect=this.container.getBoundingClientRect(),this.applySubtitlePosition()}applySubtitlePosition(){const{width:t,height:e}=this.containerRect,{offsetWidth:o,offsetHeight:i}=this.subtitlesContainer,a=(t-o)/t*100,n=(e-i)/e*100;this.position.left=Math.max(0,Math.min(this.position.left,a)),this.position.top=Math.max(0,Math.min(this.position.top,n)),this.subtitlesContainer.style.left=`${this.position.left}%`,this.subtitlesContainer.style.top=`${this.position.top}%`}processTokens(t){if(t.at(-1).alignRange.end<=this.maxLength)return t;const e=[];let o=[],i=0;for(const a of t)i+=a.text.length,o.push(a),i>this.maxLength&&(e.push(this.trimChunk(o)),o=[],i=0);o.length&&e.push(this.trimChunk(o));const a=1e3*this.video.currentTime;return e.find((t=>t[0].startMs{const o=this.highlightWords&&(e>t.startMs+t.durationMs/2||e>t.startMs-100&&t.startMs+t.durationMs/2-e<275);return ee` +(()=>{var t={"./src/styles/main.scss":()=>{GM_addStyle('.vot-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-ontheme));background-color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;border:none;border-radius:4px;outline:none;padding:0 16px;font-size:14px;font-weight:500;line-height:36px;transition:box-shadow .2s;display:inline-block;position:relative;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 1px 5px rgba(0,0,0,.12)}.vot-button[hidden]{display:none!important}.vot-button::-moz-focus-inner{border:none}.vot-button:before,.vot-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-button:before{background-color:rgb(var(--vot-helper-ontheme));transition:opacity .2s}.vot-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-button:hover{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px rgba(0,0,0,.14),0 1px 10px rgba(0,0,0,.12)}.vot-button:hover:before{opacity:.08}.vot-button:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.vot-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size}.vot-button[disabled=true]{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.12);color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);box-shadow:none;cursor:initial}.vot-button[disabled=true]:before{opacity:0}.vot-button[disabled=true]:after{opacity:0}.vot-outlined-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;border:1px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.24);vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border-radius:4px;outline:none;margin:0;padding:0 16px;font-size:14px;font-weight:500;line-height:34px;display:inline-block;position:relative}.vot-outlined-button[hidden]{display:none!important}.vot-outlined-button::-moz-focus-inner{border:none}.vot-outlined-button:before,.vot-outlined-button:after{content:"";opacity:0;border-radius:3px;position:absolute;top:0;bottom:0;left:0;right:0}.vot-outlined-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-outlined-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-outlined-button:hover:before{opacity:.04}.vot-outlined-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-outlined-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-outlined-button[disabled=true]:before{opacity:0}.vot-outlined-button[disabled=true]:after{opacity:0}.vot-text-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border:none;border-radius:4px;outline:none;margin:0;padding:0 8px;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-text-button[hidden]{display:none!important}.vot-text-button::-moz-focus-inner{border:none}.vot-text-button:before,.vot-text-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-text-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-text-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-text-button:hover:before{opacity:.04}.vot-text-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-text-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-text-button[disabled=true]:before{opacity:0}.vot-text-button[disabled=true]:after{opacity:0}.vot-icon-button{--vot-helper-onsurface:rgba(var(--vot-onsurface-rgb,0,0,0),.87);box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;width:36px;height:36px;fill:var(--vot-helper-onsurface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border:none;border-radius:50%;outline:none;margin:0;padding:0;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-icon-button[hidden]{display:none!important}.vot-icon-button::-moz-focus-inner{border:none}.vot-icon-button:before,.vot-icon-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-icon-button:before{background-color:var(--vot-helper-onsurface);transition:opacity .2s}.vot-icon-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity .3s,background-size .4s}.vot-icon-button:hover:before{opacity:.04}.vot-icon-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size,opacity}.vot-icon-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);fill:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-icon-button[disabled=true]:before{opacity:0}.vot-icon-button[disabled=true]:after{opacity:0}.vot-textfield{display:inline-block;--vot-helper-theme:rgb(var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243)))!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari3:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;padding-top:6px!important;font-size:16px!important;line-height:1.5!important;position:relative!important}.vot-textfield[hidden]{display:none!important}.vot-textfield>input,.vot-textfield>textarea{box-sizing:border-box!important;border-style:solid!important;border-width:1px!important;border-color:transparent var(--vot-helper-safari2)var(--vot-helper-safari2)!important;width:100%!important;height:inherit!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;-webkit-text-fill-color:currentColor!important;font-family:inherit!important;font-size:inherit!important;line-height:inherit!important;caret-color:var(--vot-helper-theme)!important;background-color:transparent!important;border-radius:4px!important;margin:0!important;padding:15px 13px!important;transition:border .2s,box-shadow .2s!important;box-shadow:inset 1px 0 transparent,inset -1px 0 transparent,inset 0 -1px transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>textarea:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>input+span,.vot-textfield>textarea+span{width:100%!important;max-height:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;cursor:text!important;pointer-events:none!important;font-size:75%!important;line-height:15px!important;transition:color .2s,font-size .2s,line-height .2s!important;display:flex!important;position:absolute!important;top:0!important;left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{content:""!important;box-sizing:border-box!important;border-top:solid 1px var(--vot-helper-safari2)!important;pointer-events:none!important;min-width:10px!important;height:8px!important;margin-top:6px!important;transition:border .2s,box-shadow .2s!important;display:block!important;box-shadow:inset 0 1px transparent!important}.vot-textfield>input+span:before,.vot-textfield>textarea+span:before{border-left:1px solid transparent!important;border-radius:4px 0!important;margin-right:4px!important}.vot-textfield>input+span:after,.vot-textfield>textarea+span:after{border-right:1px solid transparent!important;border-radius:0 4px!important;flex-grow:1!important;margin-left:4px!important}.vot-textfield>input.vot-show-placeholer+span:before,.vot-textfield>textarea.vot-show-placeholer+span:before{margin-right:0!important}.vot-textfield>input.vot-show-placeholer+span:after,.vot-textfield>textarea.vot-show-placeholer+span:after{margin-left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>input:not(:focus):placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield:hover>input:not(:disabled),.vot-textfield:hover>textarea:not(:disabled){border-color:transparent var(--vot-helper-safari3)var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled)+span:before,.vot-textfield:hover>input:not(:disabled)+span:after,.vot-textfield:hover>textarea:not(:disabled)+span:before,.vot-textfield:hover>textarea:not(:disabled)+span:after{border-top-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>textarea:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield>input:focus,.vot-textfield>textarea:focus{border-color:transparent var(--vot-helper-theme)var(--vot-helper-theme)!important;box-shadow:inset 1px 0 var(--vot-helper-theme),inset -1px 0 var(--vot-helper-theme),inset 0 -1px var(--vot-helper-theme)!important;outline:none!important}.vot-textfield>input:focus+span,.vot-textfield>textarea:focus+span{color:var(--vot-helper-theme)!important}.vot-textfield>input:focus+span:before,.vot-textfield>input:focus+span:after,.vot-textfield>textarea:focus+span:before,.vot-textfield>textarea:focus+span:after{border-top-color:var(--vot-helper-theme)!important;box-shadow:inset 0 1px var(--vot-helper-theme)!important}.vot-textfield>input:disabled,.vot-textfield>input:disabled+span,.vot-textfield>textarea:disabled,.vot-textfield>textarea:disabled+span{border-color:transparent var(--vot-helper-safari1)var(--vot-helper-safari1)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;pointer-events:none!important}.vot-textfield>input:disabled+span:before,.vot-textfield>input:disabled+span:after,.vot-textfield>textarea:disabled+span:before,.vot-textfield>textarea:disabled+span:after{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>textarea:disabled:placeholder-shown{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>textarea:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>input:disabled:placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield>textarea:disabled:placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>textarea:disabled:placeholder-shown+span:after{border-top-color:transparent!important}@media not all and (-webkit-min-device-pixel-ratio:.0000264583),not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)){.vot-textfield>input,.vot-textfield>input+span,.vot-textfield>textarea,.vot-textfield>textarea+span,.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{transition-duration:.1s!important}}}.vot-checkbox{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));z-index:0;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-size:16px;line-height:1.5;display:inline-block;position:relative}.vot-checkbox-sub{padding-left:16px}.vot-checkbox[hidden]{display:none!important}.vot-checkbox>input{-webkit-appearance:none;appearance:none;z-index:10000;box-sizing:border-box;border:2px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);cursor:pointer;background:0 0;border-radius:2px;outline:none;width:18px;height:18px;margin:3px 1px;padding:0;transition:border-color .2s,background-color .2s;display:block;position:absolute}.vot-checkbox>input+span{box-sizing:border-box;width:inherit;cursor:pointer;padding-left:30px;font-weight:400;display:inline-block;position:relative}.vot-checkbox>input+span:before{content:"";background-color:rgb(var(--vot-onsurface-rgb,0,0,0));opacity:0;pointer-events:none;border-radius:50%;width:40px;height:40px;transition:opacity .3s,transform .2s;display:block;position:absolute;top:-8px;left:-10px;transform:scale(1)}.vot-checkbox>input+span:after{content:"";z-index:10000;pointer-events:none;border:0 solid transparent;border-width:0 0 2px 2px;width:10px;height:5px;transition:border-color .2s;display:block;position:absolute;top:3px;left:1px;transform:translate(3px,4px)rotate(-45deg);box-sizing:content-box!important}.vot-checkbox>input:checked{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:indeterminate{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:indeterminate+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-left-width:0;transform:translate(4px,3px)}.vot-checkbox:hover>input+span:before{opacity:.04}.vot-checkbox:active>input,.vot-checkbox:active:hover>input:not(:disabled){border-color:rgb(var(--vot-helper-theme))}.vot-checkbox:active>input:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);border-color:transparent}.vot-checkbox:active>input+span:before{opacity:1;transition:transform,opacity;transform:scale(0)}.vot-checkbox>input:disabled{border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:transparent}.vot-checkbox>input:disabled:indeterminate{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:transparent}.vot-checkbox>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled+span:before{opacity:0;transform:scale(0)}.vot-slider{display:inline-block;--vot-safari-helper1:rgba(var(--vot-primary-rgb,33,150,243),.04)!important;--vot-safari-helper2:rgba(var(--vot-primary-rgb,33,150,243),.12)!important;--vot-safari-helper3:rgba(var(--vot-primary-rgb,33,150,243),.16)!important;--vot-safari-helper4:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;width:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;font-size:16px!important;line-height:1.5!important}.vot-slider[hidden]{display:none!important}.vot-slider>input{-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important;background-color:transparent!important;border:none!important;width:100%!important;height:36px!important;margin:0 0 -36px!important;padding:0!important;display:block!important;position:relative!important;top:24px!important}.vot-slider>input:last-child{margin:0!important;position:static!important}.vot-slider>input:before{content:""!important;width:calc(100%*var(--vot-progress,0))!important;background:rgb(var(--vot-primary-rgb,33,150,243))!important;height:2px!important;display:block!important;position:absolute!important;top:calc(50% - 1px)!important}.vot-slider>input:disabled{cursor:default!important;opacity:.38!important}.vot-slider>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-webkit-slider-runnable-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-lower{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-upper{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-webkit-slider-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-fill-upper{opacity:.38!important}.vot-slider>input:disabled::-moz-range-progress{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-slider>input:disabled:-webkit-slider-thumb{color:rgb(var(--vot-surface-rgb,255,255,255))!important}.vot-slider>input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper4)!important}.vot-slider>input:active::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:active::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:focus{outline:none!important}.vot-slider>input::-webkit-slider-runnable-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-moz-range-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-ms-track{box-sizing:border-box!important;background-color:transparent!important;border:none!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important;padding:0 17px!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-moz-range-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-ms-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;margin:0!important}.vot-slider>input::-moz-range-thumb{-moz-appearance:none!important}.vot-slider>input::-ms-thumb{margin:0 17px!important}.vot-slider>input::-moz-range-progress{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-lower{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-upper{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-moz-focus-outer{border:none!important}.vot-slider>span{margin-bottom:36px!important;display:inline-block!important}.vot-slider:hover>input::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper1)!important}.vot-slider:hover>input::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-slider:hover>input:hover::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-select{font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;font-size:14px;font-weight:400;line-height:1.5;display:flex;--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0)!important;--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87)!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-select[hidden]{display:none!important}.vot-select-label{font-size:16px}.vot-select-outer{cursor:pointer;justify-content:space-between;align-items:center;width:120px;max-width:120px;padding:0 5px;display:flex;border-style:solid!important;border-width:1px!important;border-color:var(--vot-helper-safari1)!important;border-radius:4px!important;transition:border .2s!important}.vot-select-outer:hover{border-color:var(--vot-helper-safari2)!important}.vot-select-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vot-select-arrow-icon{justify-content:center;align-items:center;width:20px;height:32px;display:flex}.vot-select-content-list{flex-direction:column;display:flex}.vot-select-content-list .vot-select-content-item{cursor:pointer;border-radius:8px;padding:5px 10px}.vot-select-content-list .vot-select-content-item:not([inert]):hover{background-color:#2a2c31}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]{color:rgb(var(--vot-primary-rgb,33,150,243));background-color:rgba(var(--vot-primary-rgb,33,150,243),.2)}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]:hover{background-color:rgba(var(--vot-primary-rgb,33,150,243),.1)!important}.vot-select-content-list .vot-select-content-item[data-vot-disabled=true]{cursor:default}.vot-select-content-list .vot-select-content-item[hidden]{display:none!important}.vot-header{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-weight:700;line-height:1.5}.vot-header[hidden]{display:none!important}.vot-header:not(:first-child){padding-top:8px}.vot-header-level-1{font-size:2em}.vot-header-level-2{font-size:1.5em}.vot-header-level-3{font-size:1.17em}.vot-header-level-4{font-size:1em}.vot-header-level-5{font-size:.83em}.vot-header-level-6{font-size:.67em}.vot-info{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.5;display:flex}.vot-info[hidden]{display:none!important}.vot-info>:not(:first-child){color:rgba(var(--vot-helper-onsurface-rgb),.5);flex:1;margin-left:8px}.vot-details{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;cursor:pointer;border-radius:.5em;justify-content:space-between;align-items:center;margin:0 -.5em;padding:.5em;font-size:16px;line-height:1.5;transition:background .5s;display:flex}.vot-details[hidden]{display:none!important}.vot-details-arrow-icon{width:20px;height:32px;fill:rgba(var(--vot-helper-onsurface-rgb),.87);justify-content:center;align-items:center;display:flex;transform:scale(1.25)rotate(-90deg)}.vot-details:hover{background:rgba(var(--vot-onsurface-rgb,0,0,0),.04)}.vot-lang-select{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;display:flex}.vot-lang-select[hidden]{display:none!important}.vot-lang-select-icon{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.vot-segmented-button{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);-webkit-user-select:none;user-select:none;background:rgb(var(--vot-surface-rgb,255,255,255));max-width:100vw;height:32px;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;border-radius:4px;align-items:center;font-size:16px;line-height:1.5;transition:opacity .5s;display:flex;position:absolute;top:5rem;left:50%;overflow:hidden;transform:translate(-50%)}.vot-segmented-button[hidden]{display:none!important}.vot-segmented-button *{box-sizing:border-box!important}.vot-segmented-button .vot-separator{background:rgba(var(--vot-helper-theme-rgb),.1);width:1px;height:50%}.vot-segmented-button .vot-separator[hidden]{display:none!important}.vot-segmented-button .vot-segment,.vot-segmented-button .vot-segment-only-icon{height:100%;color:inherit;background-color:transparent;border:none;justify-content:center;align-items:center;padding:0 8px;transition:background-color .1s ease-in-out;display:flex;position:relative;overflow:hidden}.vot-segmented-button .vot-segment[hidden],.vot-segmented-button [hidden].vot-segment-only-icon{display:none!important}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before,.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before{background-color:rgb(var(--vot-helper-theme-rgb));transition:opacity .2s}.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-segmented-button .vot-segment:hover:before,.vot-segmented-button .vot-segment-only-icon:hover:before{opacity:.04}.vot-segmented-button .vot-segment:active:after,.vot-segmented-button .vot-segment-only-icon:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-segmented-button .vot-segment-only-icon{min-width:32px;padding:0}.vot-segmented-button .vot-segment-label{white-space:nowrap;color:inherit;margin-left:8px;font-weight:400}.vot-segmented-button[data-status=success] .vot-translate-button{color:rgb(var(--vot-primary-rgb,33,150,243));fill:rgb(var(--vot-primary-rgb,33,150,243))}.vot-segmented-button[data-status=error] .vot-translate-button{color:#f28b82;fill:#f28b82}.vot-segmented-button[data-loading=true] #vot-loading-icon{display:block!important}.vot-segmented-button[data-loading=true] #vot-translate-icon{display:none!important}.vot-segmented-button[data-direction=column]{flex-direction:column;height:fit-content}.vot-segmented-button[data-direction=column] .vot-segment-label{display:none}.vot-segmented-button[data-direction=column]>.vot-segment-only-icon,.vot-segmented-button[data-direction=column]>.vot-segment{padding:8px}.vot-segmented-button[data-direction=column] .vot-separator{width:50%;height:1px}.vot-segmented-button[data-position=left]{top:12.5vh;left:50px}.vot-segmented-button[data-position=right]{top:12.5vh;left:auto;right:0}.vot-segmented-button svg{width:24px}.vot-menu{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);-webkit-user-select:none;user-select:none;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;visibility:visible;opacity:1;transform-origin:top;border-radius:8px;min-width:300px;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;position:absolute;top:calc(5rem + 48px);left:50%;overflow:hidden;transform:translate(-50%)scale(1)}.vot-menu *{box-sizing:border-box!important}.vot-menu[hidden]{pointer-events:none;visibility:hidden;opacity:0;transform:translate(-50%)scale(0);display:block!important}.vot-menu-content-wrapper{min-height:100px;max-height:calc(var(--vot-container-height,75vh) - (5rem + 32px + 16px)*2);flex-direction:column;display:flex;overflow:auto}.vot-menu-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-menu-header-container:empty{padding:0 0 16px}.vot-menu-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-menu-title-container{font-size:inherit;font-weight:inherit;text-align:start;outline:0;flex:1;margin:0;display:flex}.vot-menu-title{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex:1;padding-top:16px;font-size:16px;font-weight:400;line-height:1}.vot-menu-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:8px;min-height:1.375rem;padding:0 16px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-menu-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-menu-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-menu-footer-container:empty{padding:16px 0 0}.vot-menu[data-position=left]{top:12.5vh;left:240px}.vot-menu[data-position=right]{top:12.5vh;left:auto;right:-80px}.vot-dialog{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);max-width:initial;max-height:initial;width:min(var(--vot-dialog-width,512px),100%);top:50%;bottom:50%;background-color:var(--vot-helper-surface);height:fit-content;color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);-webkit-user-select:none;user-select:none;visibility:visible;opacity:1;transform-origin:50%;border-radius:8px;margin:auto;padding:0;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;display:block;position:fixed;top:0;bottom:0;left:0;right:0;overflow-x:auto;overflow-y:hidden;transform:scale(1);box-shadow:0 0 16px rgba(0,0,0,.12),0 16px 16px rgba(0,0,0,.24)}[hidden]>.vot-dialog{pointer-events:none;opacity:0;transition:opacity .1s,transform .2s;transform:scale(.5)}.vot-dialog-container{visibility:visible;z-index:2147483647;position:absolute}.vot-dialog-container[hidden]{pointer-events:none;visibility:hidden;display:block!important}.vot-dialog-container *{box-sizing:border-box!important}.vot-dialog-backdrop{opacity:1;background-color:rgba(0,0,0,.6);transition:opacity .3s;position:fixed;top:0;bottom:0;left:0;right:0}[hidden]>.vot-dialog-backdrop{pointer-events:none;opacity:0}.vot-dialog-content-wrapper{flex-direction:column;max-height:75vh;display:flex;overflow:auto}.vot-dialog-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-dialog-header-container:empty{padding:0 0 20px}.vot-dialog-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-dialog-title-container{font-size:inherit;font-weight:inherit;outline:0;flex:1;margin:0;display:flex}.vot-dialog-title{padding-bottom:16px;padding-inline-start:20px;padding-inline-end:20px;flex:1;padding-top:20px;font-size:115.385%;font-weight:700;line-height:1}.vot-dialog-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:16px;min-height:1.375rem;padding:0 20px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-dialog-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-dialog-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-dialog-footer-container:empty{padding:20px 0 0}.vot-subtitles-widget{z-index:2147483647;pointer-events:none;justify-content:center;align-items:center;width:50%;min-height:20%;max-height:100%;display:flex;position:absolute;top:75%;left:25%}.vot-subtitles{--vot-subtitles-background:rgba(var(--vot-surface-rgb,46,47,52),var(--vot-subtitles-opacity,.8));background:var(--vot-subtitles-background,rgba(46,47,52,.8));width:max-content;max-width:100%;max-height:100%;color:var(--vot-subtitles-color,#e3e3e3);pointer-events:all;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:.5em;padding:.5em;font-size:20px;line-height:normal;position:relative}.vot-subtitles span{-webkit-user-select:text;user-select:text;font-size:inherit!important;line-height:normal!important}.vot-subtitles .passed{color:var(--vot-subtitles-passed-color,#2196f3)}:root{--vot-font-family:"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system;--vot-primary-rgb:139,180,245;--vot-onprimary-rgb:32,33,36;--vot-surface-rgb:32,33,36;--vot-onsurface-rgb:227,227,227;--vot-subtitles-color:rgb(var(--vot-onsurface-rgb,227,227,227));--vot-subtitles-passed-color:rgb(var(--vot-primary-rgb,33,150,243))}vot-block{display:block;visibility:visible!important}')},"./node_modules/bowser/es5.js":function(t){t.exports=function(t){var e={};function o(i){if(e[i])return e[i].exports;var a=e[i]={i,l:!1,exports:{}};return t[i].call(a.exports,a,a.exports,o),a.l=!0,a.exports}return o.m=t,o.c=e,o.d=function(t,e,i){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)o.d(i,a,function(e){return t[e]}.bind(null,a));return i},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=90)}({17:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i=o(18),a=function(){function t(){}return t.getFirstMatch=function(t,e){var o=e.match(t);return o&&o.length>0&&o[1]||""},t.getSecondMatch=function(t,e){var o=e.match(t);return o&&o.length>1&&o[2]||""},t.matchAndReturnConst=function(t,e,o){if(t.test(e))return o},t.getWindowsVersionName=function(t){switch(t){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},t.getMacOSVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),10===e[0])switch(e[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},t.getAndroidVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),!(1===e[0]&&e[1]<5))return 1===e[0]&&e[1]<6?"Cupcake":1===e[0]&&e[1]>=6?"Donut":2===e[0]&&e[1]<2?"Eclair":2===e[0]&&2===e[1]?"Froyo":2===e[0]&&e[1]>2?"Gingerbread":3===e[0]?"Honeycomb":4===e[0]&&e[1]<1?"Ice Cream Sandwich":4===e[0]&&e[1]<4?"Jelly Bean":4===e[0]&&e[1]>=4?"KitKat":5===e[0]?"Lollipop":6===e[0]?"Marshmallow":7===e[0]?"Nougat":8===e[0]?"Oreo":9===e[0]?"Pie":void 0},t.getVersionPrecision=function(t){return t.split(".").length},t.compareVersions=function(e,o,i){void 0===i&&(i=!1);var a=t.getVersionPrecision(e),n=t.getVersionPrecision(o),r=Math.max(a,n),s=0,l=t.map([e,o],(function(e){var o=r-t.getVersionPrecision(e),i=e+new Array(o+1).join(".0");return t.map(i.split("."),(function(t){return new Array(20-t.length).join("0")+t})).reverse()}));for(i&&(s=r-Math.min(a,n)),r-=1;r>=s;){if(l[0][r]>l[1][r])return 1;if(l[0][r]===l[1][r]){if(r===s)return 0;r-=1}else if(l[0][r]1?a-1:0),r=1;r0){var r=Object.keys(o),l=s.default.find(r,(function(t){return e.isOS(t)}));if(l){var d=this.satisfies(o[l]);if(void 0!==d)return d}var u=s.default.find(r,(function(t){return e.isPlatform(t)}));if(u){var c=this.satisfies(o[u]);if(void 0!==c)return c}}if(n>0){var h=Object.keys(a),p=s.default.find(h,(function(t){return e.isBrowser(t,!0)}));if(void 0!==p)return this.compareVersion(a[p])}},e.isBrowser=function(t,e){void 0===e&&(e=!1);var o=this.getBrowserName().toLowerCase(),i=t.toLowerCase(),a=s.default.getBrowserTypeByAlias(i);return e&&a&&(i=a.toLowerCase()),i===o},e.compareVersion=function(t){var e=[0],o=t,i=!1,a=this.getBrowserVersion();if("string"==typeof a)return">"===t[0]||"<"===t[0]?(o=t.substr(1),"="===t[1]?(i=!0,o=t.substr(2)):e=[],">"===t[0]?e.push(1):e.push(-1)):"="===t[0]?o=t.substr(1):"~"===t[0]&&(i=!0,o=t.substr(1)),e.indexOf(s.default.compareVersions(a,o,i))>-1},e.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},e.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},e.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},e.is=function(t,e){return void 0===e&&(e=!1),this.isBrowser(t,e)||this.isOS(t)||this.isPlatform(t)},e.some=function(t){var e=this;return void 0===t&&(t=[]),t.some((function(t){return e.is(t)}))},t}();e.default=d,t.exports=e.default},92:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=/version\/(\d+(\.?_?\d+)+)/i,r=[{test:[/googlebot/i],describe:function(t){var e={name:"Googlebot"},o=a.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/opera/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opr\/|opios/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/SamsungBrowser/i],describe:function(t){var e={name:"Samsung Internet for Android"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Whale/i],describe:function(t){var e={name:"NAVER Whale Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MZBrowser/i],describe:function(t){var e={name:"MZ Browser"},o=a.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/focus/i],describe:function(t){var e={name:"Focus"},o=a.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/swing/i],describe:function(t){var e={name:"Swing"},o=a.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/coast/i],describe:function(t){var e={name:"Opera Coast"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(t){var e={name:"Opera Touch"},o=a.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/yabrowser/i],describe:function(t){var e={name:"Yandex Browser"},o=a.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/ucbrowser/i],describe:function(t){var e={name:"UC Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Maxthon|mxios/i],describe:function(t){var e={name:"Maxthon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/epiphany/i],describe:function(t){var e={name:"Epiphany"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/puffin/i],describe:function(t){var e={name:"Puffin"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sleipnir/i],describe:function(t){var e={name:"Sleipnir"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/k-meleon/i],describe:function(t){var e={name:"K-Meleon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/micromessenger/i],describe:function(t){var e={name:"WeChat"},o=a.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qqbrowser/i],describe:function(t){var e={name:/qqbrowserlite/i.test(t)?"QQ Browser Lite":"QQ Browser"},o=a.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/msie|trident/i],describe:function(t){var e={name:"Internet Explorer"},o=a.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/\sedg\//i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/edg([ea]|ios)/i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/vivaldi/i],describe:function(t){var e={name:"Vivaldi"},o=a.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/seamonkey/i],describe:function(t){var e={name:"SeaMonkey"},o=a.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sailfish/i],describe:function(t){var e={name:"Sailfish"},o=a.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,t);return o&&(e.version=o),e}},{test:[/silk/i],describe:function(t){var e={name:"Amazon Silk"},o=a.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/phantom/i],describe:function(t){var e={name:"PhantomJS"},o=a.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/slimerjs/i],describe:function(t){var e={name:"SlimerJS"},o=a.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e={name:"BlackBerry"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e={name:"WebOS Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/bada/i],describe:function(t){var e={name:"Bada"},o=a.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/tizen/i],describe:function(t){var e={name:"Tizen"},o=a.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qupzilla/i],describe:function(t){var e={name:"QupZilla"},o=a.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var e={name:"Firefox"},o=a.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/electron/i],describe:function(t){var e={name:"Electron"},o=a.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MiuiBrowser/i],describe:function(t){var e={name:"Miui"},o=a.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/chromium/i],describe:function(t){var e={name:"Chromium"},o=a.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/chrome|crios|crmo/i],describe:function(t){var e={name:"Chrome"},o=a.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/GSA/i],describe:function(t){var e={name:"Google Search"},o=a.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e={name:"Android Browser"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/playstation 4/i],describe:function(t){var e={name:"PlayStation 4"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/safari|applewebkit/i],describe:function(t){var e={name:"Safari"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/.*/i],describe:function(t){var e=-1!==t.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:a.default.getFirstMatch(e,t),version:a.default.getSecondMatch(e,t)}}}];e.default=r,t.exports=e.default},93:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/Roku\/DVP/],describe:function(t){var e=a.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,t);return{name:n.OS_MAP.Roku,version:e}}},{test:[/windows phone/i],describe:function(t){var e=a.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.WindowsPhone,version:e}}},{test:[/windows /i],describe:function(t){var e=a.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,t),o=a.default.getWindowsVersionName(e);return{name:n.OS_MAP.Windows,version:e,versionName:o}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(t){var e={name:n.OS_MAP.iOS},o=a.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,t);return o&&(e.version=o),e}},{test:[/macintosh/i],describe:function(t){var e=a.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,t).replace(/[_\s]/g,"."),o=a.default.getMacOSVersionName(e),i={name:n.OS_MAP.MacOS,version:e};return o&&(i.versionName=o),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var e=a.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,t).replace(/[_\s]/g,".");return{name:n.OS_MAP.iOS,version:e}}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e=a.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,t),o=a.default.getAndroidVersionName(e),i={name:n.OS_MAP.Android,version:e};return o&&(i.versionName=o),i}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e=a.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,t),o={name:n.OS_MAP.WebOS};return e&&e.length&&(o.version=e),o}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e=a.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,t)||a.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,t)||a.default.getFirstMatch(/\bbb(\d+)/i,t);return{name:n.OS_MAP.BlackBerry,version:e}}},{test:[/bada/i],describe:function(t){var e=a.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Bada,version:e}}},{test:[/tizen/i],describe:function(t){var e=a.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Tizen,version:e}}},{test:[/linux/i],describe:function(){return{name:n.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:n.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var e=a.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.PlayStation4,version:e}}}];e.default=r,t.exports=e.default},94:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(t){var e=a.default.getFirstMatch(/(can-l01)/i,t)&&"Nova",o={type:n.PLATFORMS_MAP.mobile,vendor:"Huawei"};return e&&(o.model=e),o}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){var e=t.test(/ipod|iphone/i),o=t.test(/like (ipod|iphone)/i);return e&&!o},describe:function(t){var e=a.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:n.PLATFORMS_MAP.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"blackberry"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(t){return"bada"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"windows phone"===t.getBrowserName()},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(t){var e=Number(String(t.getOSVersion()).split(".")[0]);return"android"===t.getOSName(!0)&&e>=3},describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){return"android"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"macos"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(t){return"windows"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"linux"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"playstation 4"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}},{test:function(t){return"roku"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}}];e.default=r,t.exports=e.default},95:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:function(t){return"microsoft edge"===t.getBrowserName(!0)},describe:function(t){if(/\sedg\//i.test(t))return{name:n.ENGINE_MAP.Blink};var e=a.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,t);return{name:n.ENGINE_MAP.EdgeHTML,version:e}}},{test:[/trident/i],describe:function(t){var e={name:n.ENGINE_MAP.Trident},o=a.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){return t.test(/presto/i)},describe:function(t){var e={name:n.ENGINE_MAP.Presto},o=a.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=t.test(/gecko/i),o=t.test(/like gecko/i);return e&&!o},describe:function(t){var e={name:n.ENGINE_MAP.Gecko},o=a.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:n.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var e={name:n.ENGINE_MAP.WebKit},o=a.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}}];e.default=r,t.exports=e.default}})},"./node_modules/requestidlecallback-polyfill/index.js":()=>{window.requestIdleCallback=window.requestIdleCallback||function(t){var e=Date.now();return setTimeout((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),1)},window.cancelIdleCallback=window.cancelIdleCallback||function(t){clearTimeout(t)}}},e={};function o(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={exports:{}};return t[i].call(n.exports,n,n.exports,o),n.exports}(()=>{"use strict";var t=o("./node_modules/bowser/es5.js");const e={host:"api.browser.yandex.ru",hostVOT:"vot.toil.cc/v1",hostWorker:"vot-worker.toil.cc",mediaProxy:"media-proxy.toil.cc",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 YaBrowser/24.10.0.0 Safari/537.36",componentVersion:"24.12.2.856",hmac:"bt8xH3VOlb4mqf0nqAibnDOoiPlXsisf",defaultDuration:343,minChunkSize:5295308,loggerLevel:1,version:"2.1.4"};var i;!function(t){t[t.DEBUG=0]="DEBUG",t[t.INFO=1]="INFO",t[t.WARN=2]="WARN",t[t.ERROR=3]="ERROR",t[t.SILENCE=4]="SILENCE"}(i||(i={}));class a{static prefix=`[vot.js v${e.version}]`;static canLog(t){return e.loggerLevel<=t}static log(...t){a.canLog(i.DEBUG)&&console.log(a.prefix,...t)}static info(...t){a.canLog(i.INFO)&&console.info(a.prefix,...t)}static warn(...t){a.canLog(i.WARN)&&console.warn(a.prefix,...t)}static error(...t){a.canLog(i.ERROR)&&console.error(a.prefix,...t)}}const n=protobuf;var r;function s(t){switch(t){case 0:case"NO_CONNECTION":return r.NO_CONNECTION;case 10:case"TRANSLATING":return r.TRANSLATING;case 20:case"STREAMING":return r.STREAMING;default:return r.UNRECOGNIZED}}!function(t){t[t.NO_CONNECTION=0]="NO_CONNECTION",t[t.TRANSLATING=10]="TRANSLATING",t[t.STREAMING=20]="STREAMING",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(r||(r={}));const l={encode:(t,e=n.Writer.create())=>(""!==t.target&&e.uint32(10).string(t.target),""!==t.targetUrl&&e.uint32(18).string(t.targetUrl),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={target:"",targetUrl:""};for(;o.pos>>3){case 1:if(10!==t)break;a.target=o.string();continue;case 2:if(18!==t)break;a.targetUrl=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({target:I(t.target)?globalThis.String(t.target):"",targetUrl:I(t.targetUrl)?globalThis.String(t.targetUrl):""}),toJSON(t){const e={};return""!==t.target&&(e.target=t.target),""!==t.targetUrl&&(e.targetUrl=t.targetUrl),e},create:t=>l.fromPartial(t??{}),fromPartial(t){const e={target:"",targetUrl:""};return e.target=t.target??"",e.targetUrl=t.targetUrl??"",e}};const d={encode(t,e=n.Writer.create()){""!==t.url&&e.uint32(26).string(t.url),void 0!==t.deviceId&&e.uint32(34).string(t.deviceId),!1!==t.firstRequest&&e.uint32(40).bool(t.firstRequest),0!==t.duration&&e.uint32(49).double(t.duration),0!==t.unknown0&&e.uint32(56).int32(t.unknown0),""!==t.language&&e.uint32(66).string(t.language),!1!==t.forceSourceLang&&e.uint32(72).bool(t.forceSourceLang),0!==t.unknown1&&e.uint32(80).int32(t.unknown1);for(const o of t.translationHelp)l.encode(o,e.uint32(90).fork()).ldelim();return""!==t.responseLanguage&&e.uint32(114).string(t.responseLanguage),0!==t.unknown2&&e.uint32(120).int32(t.unknown2),0!==t.unknown3&&e.uint32(128).int32(t.unknown3),!1!==t.bypassCache&&e.uint32(136).bool(t.bypassCache),!1!==t.useNewModel&&e.uint32(144).bool(t.useNewModel),e},decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,useNewModel:!1};for(;o.pos>>3){case 3:if(26!==t)break;a.url=o.string();continue;case 4:if(34!==t)break;a.deviceId=o.string();continue;case 5:if(40!==t)break;a.firstRequest=o.bool();continue;case 6:if(49!==t)break;a.duration=o.double();continue;case 7:if(56!==t)break;a.unknown0=o.int32();continue;case 8:if(66!==t)break;a.language=o.string();continue;case 9:if(72!==t)break;a.forceSourceLang=o.bool();continue;case 10:if(80!==t)break;a.unknown1=o.int32();continue;case 11:if(90!==t)break;a.translationHelp.push(l.decode(o,o.uint32()));continue;case 14:if(114!==t)break;a.responseLanguage=o.string();continue;case 15:if(120!==t)break;a.unknown2=o.int32();continue;case 16:if(128!==t)break;a.unknown3=o.int32();continue;case 17:if(136!==t)break;a.bypassCache=o.bool();continue;case 18:if(144!==t)break;a.useNewModel=o.bool();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):"",deviceId:I(t.deviceId)?globalThis.String(t.deviceId):void 0,firstRequest:!!I(t.firstRequest)&&globalThis.Boolean(t.firstRequest),duration:I(t.duration)?globalThis.Number(t.duration):0,unknown0:I(t.unknown0)?globalThis.Number(t.unknown0):0,language:I(t.language)?globalThis.String(t.language):"",forceSourceLang:!!I(t.forceSourceLang)&&globalThis.Boolean(t.forceSourceLang),unknown1:I(t.unknown1)?globalThis.Number(t.unknown1):0,translationHelp:globalThis.Array.isArray(t?.translationHelp)?t.translationHelp.map((t=>l.fromJSON(t))):[],responseLanguage:I(t.responseLanguage)?globalThis.String(t.responseLanguage):"",unknown2:I(t.unknown2)?globalThis.Number(t.unknown2):0,unknown3:I(t.unknown3)?globalThis.Number(t.unknown3):0,bypassCache:!!I(t.bypassCache)&&globalThis.Boolean(t.bypassCache),useNewModel:!!I(t.useNewModel)&&globalThis.Boolean(t.useNewModel)}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),void 0!==t.deviceId&&(e.deviceId=t.deviceId),!1!==t.firstRequest&&(e.firstRequest=t.firstRequest),0!==t.duration&&(e.duration=t.duration),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.language&&(e.language=t.language),!1!==t.forceSourceLang&&(e.forceSourceLang=t.forceSourceLang),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),t.translationHelp?.length&&(e.translationHelp=t.translationHelp.map((t=>l.toJSON(t)))),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),0!==t.unknown3&&(e.unknown3=Math.round(t.unknown3)),!1!==t.bypassCache&&(e.bypassCache=t.bypassCache),!1!==t.useNewModel&&(e.useNewModel=t.useNewModel),e},create:t=>d.fromPartial(t??{}),fromPartial(t){const e={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,useNewModel:!1};return e.url=t.url??"",e.deviceId=t.deviceId??void 0,e.firstRequest=t.firstRequest??!1,e.duration=t.duration??0,e.unknown0=t.unknown0??0,e.language=t.language??"",e.forceSourceLang=t.forceSourceLang??!1,e.unknown1=t.unknown1??0,e.translationHelp=t.translationHelp?.map((t=>l.fromPartial(t)))||[],e.responseLanguage=t.responseLanguage??"",e.unknown2=t.unknown2??0,e.unknown3=t.unknown3??0,e.bypassCache=t.bypassCache??!1,e.useNewModel=t.useNewModel??!1,e}};const u={encode:(t,e=n.Writer.create())=>(void 0!==t.url&&e.uint32(10).string(t.url),void 0!==t.duration&&e.uint32(17).double(t.duration),0!==t.status&&e.uint32(32).int32(t.status),void 0!==t.remainingTime&&e.uint32(40).int32(t.remainingTime),void 0!==t.unknown0&&e.uint32(48).int32(t.unknown0),""!==t.translationId&&e.uint32(58).string(t.translationId),void 0!==t.language&&e.uint32(66).string(t.language),void 0!==t.message&&e.uint32(74).string(t.message),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(17!==t)break;a.duration=o.double();continue;case 4:if(32!==t)break;a.status=o.int32();continue;case 5:if(40!==t)break;a.remainingTime=o.int32();continue;case 6:if(48!==t)break;a.unknown0=o.int32();continue;case 7:if(58!==t)break;a.translationId=o.string();continue;case 8:if(66!==t)break;a.language=o.string();continue;case 9:if(74!==t)break;a.message=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):void 0,duration:I(t.duration)?globalThis.Number(t.duration):void 0,status:I(t.status)?globalThis.Number(t.status):0,remainingTime:I(t.remainingTime)?globalThis.Number(t.remainingTime):void 0,unknown0:I(t.unknown0)?globalThis.Number(t.unknown0):void 0,translationId:I(t.translationId)?globalThis.String(t.translationId):"",language:I(t.language)?globalThis.String(t.language):void 0,message:I(t.message)?globalThis.String(t.message):void 0}),toJSON(t){const e={};return void 0!==t.url&&(e.url=t.url),void 0!==t.duration&&(e.duration=t.duration),0!==t.status&&(e.status=Math.round(t.status)),void 0!==t.remainingTime&&(e.remainingTime=Math.round(t.remainingTime)),void 0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translationId&&(e.translationId=t.translationId),void 0!==t.language&&(e.language=t.language),void 0!==t.message&&(e.message=t.message),e},create:t=>u.fromPartial(t??{}),fromPartial(t){const e={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};return e.url=t.url??void 0,e.duration=t.duration??void 0,e.status=t.status??0,e.remainingTime=t.remainingTime??void 0,e.unknown0=t.unknown0??void 0,e.translationId=t.translationId??"",e.language=t.language??void 0,e.message=t.message??void 0,e}};function c(){return{audioFile:new Uint8Array(0),fileId:""}}const h={encode:(t,e=n.Writer.create())=>(0!==t.audioFile.length&&e.uint32(18).bytes(t.audioFile),""!==t.fileId&&e.uint32(10).string(t.fileId),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a=c();for(;o.pos>>3){case 2:if(18!==t)break;a.audioFile=o.bytes();continue;case 1:if(10!==t)break;a.fileId=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({audioFile:I(t.audioFile)?C(t.audioFile):new Uint8Array(0),fileId:I(t.fileId)?globalThis.String(t.fileId):""}),toJSON(t){const e={};return 0!==t.audioFile.length&&(e.audioFile=function(t){if(globalThis.Buffer)return globalThis.Buffer.from(t).toString("base64");{const e=[];return t.forEach((t=>{e.push(globalThis.String.fromCharCode(t))})),globalThis.btoa(e.join(""))}}(t.audioFile)),""!==t.fileId&&(e.fileId=t.fileId),e},create:t=>h.fromPartial(t??{}),fromPartial(t){const e=c();return e.audioFile=t.audioFile??new Uint8Array(0),e.fileId=t.fileId??"",e}};const p={encode:(t,e=n.Writer.create())=>(0!==t.audioPartsLength&&e.uint32(16).int32(t.audioPartsLength),void 0!==t.audioBuffer&&h.encode(t.audioBuffer,e.uint32(10).fork()).ldelim(),""!==t.fileId&&e.uint32(26).string(t.fileId),0!==t.unknown0&&e.uint32(32).int32(t.unknown0),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={audioPartsLength:0,audioBuffer:void 0,fileId:"",unknown0:0};for(;o.pos>>3){case 2:if(16!==t)break;a.audioPartsLength=o.int32();continue;case 1:if(10!==t)break;a.audioBuffer=h.decode(o,o.uint32());continue;case 3:if(26!==t)break;a.fileId=o.string();continue;case 4:if(32!==t)break;a.unknown0=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({audioPartsLength:I(t.audioPartsLength)?globalThis.Number(t.audioPartsLength):0,audioBuffer:I(t.audioBuffer)?h.fromJSON(t.audioBuffer):void 0,fileId:I(t.fileId)?globalThis.String(t.fileId):"",unknown0:I(t.unknown0)?globalThis.Number(t.unknown0):0}),toJSON(t){const e={};return 0!==t.audioPartsLength&&(e.audioPartsLength=Math.round(t.audioPartsLength)),void 0!==t.audioBuffer&&(e.audioBuffer=h.toJSON(t.audioBuffer)),""!==t.fileId&&(e.fileId=t.fileId),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),e},create:t=>p.fromPartial(t??{}),fromPartial(t){const e={audioPartsLength:0,audioBuffer:void 0,fileId:"",unknown0:0};return e.audioPartsLength=t.audioPartsLength??0,e.audioBuffer=void 0!==t.audioBuffer&&null!==t.audioBuffer?h.fromPartial(t.audioBuffer):void 0,e.fileId=t.fileId??"",e.unknown0=t.unknown0??0,e}};const g={encode:(t,e=n.Writer.create())=>(""!==t.translationId&&e.uint32(10).string(t.translationId),""!==t.url&&e.uint32(18).string(t.url),void 0!==t.partialAudioInfo&&p.encode(t.partialAudioInfo,e.uint32(34).fork()).ldelim(),void 0!==t.audioInfo&&h.encode(t.audioInfo,e.uint32(50).fork()).ldelim(),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={translationId:"",url:"",partialAudioInfo:void 0,audioInfo:void 0};for(;o.pos>>3){case 1:if(10!==t)break;a.translationId=o.string();continue;case 2:if(18!==t)break;a.url=o.string();continue;case 4:if(34!==t)break;a.partialAudioInfo=p.decode(o,o.uint32());continue;case 6:if(50!==t)break;a.audioInfo=h.decode(o,o.uint32());continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({translationId:I(t.translationId)?globalThis.String(t.translationId):"",url:I(t.url)?globalThis.String(t.url):"",partialAudioInfo:I(t.partialAudioInfo)?p.fromJSON(t.partialAudioInfo):void 0,audioInfo:I(t.audioInfo)?h.fromJSON(t.audioInfo):void 0}),toJSON(t){const e={};return""!==t.translationId&&(e.translationId=t.translationId),""!==t.url&&(e.url=t.url),void 0!==t.partialAudioInfo&&(e.partialAudioInfo=p.toJSON(t.partialAudioInfo)),void 0!==t.audioInfo&&(e.audioInfo=h.toJSON(t.audioInfo)),e},create:t=>g.fromPartial(t??{}),fromPartial(t){const e={translationId:"",url:"",partialAudioInfo:void 0,audioInfo:void 0};return e.translationId=t.translationId??"",e.url=t.url??"",e.partialAudioInfo=void 0!==t.partialAudioInfo&&null!==t.partialAudioInfo?p.fromPartial(t.partialAudioInfo):void 0,e.audioInfo=void 0!==t.audioInfo&&null!==t.audioInfo?h.fromPartial(t.audioInfo):void 0,e}};const m={encode(t,e=n.Writer.create()){0!==t.status&&e.uint32(8).int32(t.status);for(const o of t.remainingChunks)e.uint32(18).string(o);return e},decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={status:0,remainingChunks:[]};for(;o.pos>>3){case 1:if(8!==t)break;a.status=o.int32();continue;case 2:if(18!==t)break;a.remainingChunks.push(o.string());continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({status:I(t.status)?globalThis.Number(t.status):0,remainingChunks:globalThis.Array.isArray(t?.remainingChunks)?t.remainingChunks.map((t=>globalThis.String(t))):[]}),toJSON(t){const e={};return 0!==t.status&&(e.status=Math.round(t.status)),t.remainingChunks?.length&&(e.remainingChunks=t.remainingChunks),e},create:t=>m.fromPartial(t??{}),fromPartial(t){const e={status:0,remainingChunks:[]};return e.status=t.status??0,e.remainingChunks=t.remainingChunks?.map((t=>t))||[],e}};const v={encode:(t,e=n.Writer.create())=>(""!==t.language&&e.uint32(10).string(t.language),""!==t.url&&e.uint32(18).string(t.url),0!==t.unknown0&&e.uint32(24).int32(t.unknown0),""!==t.translatedLanguage&&e.uint32(34).string(t.translatedLanguage),""!==t.translatedUrl&&e.uint32(42).string(t.translatedUrl),0!==t.unknown1&&e.uint32(48).int32(t.unknown1),0!==t.unknown2&&e.uint32(56).int32(t.unknown2),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};for(;o.pos>>3){case 1:if(10!==t)break;a.language=o.string();continue;case 2:if(18!==t)break;a.url=o.string();continue;case 3:if(24!==t)break;a.unknown0=o.int32();continue;case 4:if(34!==t)break;a.translatedLanguage=o.string();continue;case 5:if(42!==t)break;a.translatedUrl=o.string();continue;case 6:if(48!==t)break;a.unknown1=o.int32();continue;case 7:if(56!==t)break;a.unknown2=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({language:I(t.language)?globalThis.String(t.language):"",url:I(t.url)?globalThis.String(t.url):"",unknown0:I(t.unknown0)?globalThis.Number(t.unknown0):0,translatedLanguage:I(t.translatedLanguage)?globalThis.String(t.translatedLanguage):"",translatedUrl:I(t.translatedUrl)?globalThis.String(t.translatedUrl):"",unknown1:I(t.unknown1)?globalThis.Number(t.unknown1):0,unknown2:I(t.unknown2)?globalThis.Number(t.unknown2):0}),toJSON(t){const e={};return""!==t.language&&(e.language=t.language),""!==t.url&&(e.url=t.url),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translatedLanguage&&(e.translatedLanguage=t.translatedLanguage),""!==t.translatedUrl&&(e.translatedUrl=t.translatedUrl),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),e},create:t=>v.fromPartial(t??{}),fromPartial(t){const e={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};return e.language=t.language??"",e.url=t.url??"",e.unknown0=t.unknown0??0,e.translatedLanguage=t.translatedLanguage??"",e.translatedUrl=t.translatedUrl??"",e.unknown1=t.unknown1??0,e.unknown2=t.unknown2??0,e}};const f={encode:(t,e=n.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.language&&e.uint32(18).string(t.language),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",language:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.language=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):"",language:I(t.language)?globalThis.String(t.language):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),e},create:t=>f.fromPartial(t??{}),fromPartial(t){const e={url:"",language:""};return e.url=t.url??"",e.language=t.language??"",e}};const b={encode(t,e=n.Writer.create()){!1!==t.waiting&&e.uint32(8).bool(t.waiting);for(const o of t.subtitles)v.encode(o,e.uint32(18).fork()).ldelim();return e},decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={waiting:!1,subtitles:[]};for(;o.pos>>3){case 1:if(8!==t)break;a.waiting=o.bool();continue;case 2:if(18!==t)break;a.subtitles.push(v.decode(o,o.uint32()));continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({waiting:!!I(t.waiting)&&globalThis.Boolean(t.waiting),subtitles:globalThis.Array.isArray(t?.subtitles)?t.subtitles.map((t=>v.fromJSON(t))):[]}),toJSON(t){const e={};return!1!==t.waiting&&(e.waiting=t.waiting),t.subtitles?.length&&(e.subtitles=t.subtitles.map((t=>v.toJSON(t)))),e},create:t=>b.fromPartial(t??{}),fromPartial(t){const e={waiting:!1,subtitles:[]};return e.waiting=t.waiting??!1,e.subtitles=t.subtitles?.map((t=>v.fromPartial(t)))||[],e}};const y={encode:(t,e=n.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.timestamp&&e.uint32(18).string(t.timestamp),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",timestamp:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.timestamp=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):"",timestamp:I(t.timestamp)?globalThis.String(t.timestamp):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.timestamp&&(e.timestamp=t.timestamp),e},create:t=>y.fromPartial(t??{}),fromPartial(t){const e={url:"",timestamp:""};return e.url=t.url??"",e.timestamp=t.timestamp??"",e}};const w={encode:(t,e=n.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.language&&e.uint32(18).string(t.language),""!==t.responseLanguage&&e.uint32(26).string(t.responseLanguage),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",language:"",responseLanguage:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.language=o.string();continue;case 3:if(26!==t)break;a.responseLanguage=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:I(t.url)?globalThis.String(t.url):"",language:I(t.language)?globalThis.String(t.language):"",responseLanguage:I(t.responseLanguage)?globalThis.String(t.responseLanguage):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),e},create:t=>w.fromPartial(t??{}),fromPartial(t){const e={url:"",language:"",responseLanguage:""};return e.url=t.url??"",e.language=t.language??"",e.responseLanguage=t.responseLanguage??"",e}};const x={encode:(t,e=n.Writer.create())=>(0!==t.interval&&e.uint32(8).int32(t.interval),void 0!==t.translatedInfo&&y.encode(t.translatedInfo,e.uint32(18).fork()).ldelim(),void 0!==t.pingId&&e.uint32(24).int32(t.pingId),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={interval:0,translatedInfo:void 0,pingId:void 0};for(;o.pos>>3){case 1:if(8!==t)break;a.interval=o.int32();continue;case 2:if(18!==t)break;a.translatedInfo=y.decode(o,o.uint32());continue;case 3:if(24!==t)break;a.pingId=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({interval:I(t.interval)?s(t.interval):0,translatedInfo:I(t.translatedInfo)?y.fromJSON(t.translatedInfo):void 0,pingId:I(t.pingId)?globalThis.Number(t.pingId):void 0}),toJSON(t){const e={};return 0!==t.interval&&(e.interval=function(t){switch(t){case r.NO_CONNECTION:return"NO_CONNECTION";case r.TRANSLATING:return"TRANSLATING";case r.STREAMING:return"STREAMING";case r.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.interval)),void 0!==t.translatedInfo&&(e.translatedInfo=y.toJSON(t.translatedInfo)),void 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>x.fromPartial(t??{}),fromPartial(t){const e={interval:0,translatedInfo:void 0,pingId:void 0};return e.interval=t.interval??0,e.translatedInfo=void 0!==t.translatedInfo&&null!==t.translatedInfo?y.fromPartial(t.translatedInfo):void 0,e.pingId=t.pingId??void 0,e}};const S={encode:(t,e=n.Writer.create())=>(0!==t.pingId&&e.uint32(8).int32(t.pingId),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={pingId:0};for(;o.pos>>3){case 1:if(8!==t)break;a.pingId=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({pingId:I(t.pingId)?globalThis.Number(t.pingId):0}),toJSON(t){const e={};return 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>S.fromPartial(t??{}),fromPartial(t){const e={pingId:0};return e.pingId=t.pingId??0,e}};const k={encode:(t,e=n.Writer.create())=>(""!==t.uuid&&e.uint32(10).string(t.uuid),""!==t.module&&e.uint32(18).string(t.module),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={uuid:"",module:""};for(;o.pos>>3){case 1:if(10!==t)break;a.uuid=o.string();continue;case 2:if(18!==t)break;a.module=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({uuid:I(t.uuid)?globalThis.String(t.uuid):"",module:I(t.module)?globalThis.String(t.module):""}),toJSON(t){const e={};return""!==t.uuid&&(e.uuid=t.uuid),""!==t.module&&(e.module=t.module),e},create:t=>k.fromPartial(t??{}),fromPartial(t){const e={uuid:"",module:""};return e.uuid=t.uuid??"",e.module=t.module??"",e}};const T={encode:(t,e=n.Writer.create())=>(""!==t.secretKey&&e.uint32(10).string(t.secretKey),0!==t.expires&&e.uint32(16).int32(t.expires),e),decode(t,e){const o=t instanceof n.Reader?t:n.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={secretKey:"",expires:0};for(;o.pos>>3){case 1:if(10!==t)break;a.secretKey=o.string();continue;case 2:if(16!==t)break;a.expires=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({secretKey:I(t.secretKey)?globalThis.String(t.secretKey):"",expires:I(t.expires)?globalThis.Number(t.expires):0}),toJSON(t){const e={};return""!==t.secretKey&&(e.secretKey=t.secretKey),0!==t.expires&&(e.expires=Math.round(t.expires)),e},create:t=>T.fromPartial(t??{}),fromPartial(t){const e={secretKey:"",expires:0};return e.secretKey=t.secretKey??"",e.expires=t.expires??0,e}};function C(t){if(globalThis.Buffer)return Uint8Array.from(globalThis.Buffer.from(t,"base64"));{const e=globalThis.atob(t),o=new Uint8Array(e.length);for(let t=0;tt+e.toString(16).padStart(2,"0")),"")}async function _(t,o,i,a){const{secretKey:n,uuid:r}=o,s=await A(i),l=`${r}:${a}:${e.componentVersion}`,d=P.encode(l);return{[`${t}-Signature`]:s,[`Sec-${t}-Sk`]:n,[`Sec-${t}-Token`]:`${await A(d)}:${l}`}}const V={afr:"af",aka:"ak",alb:"sq",amh:"am",ara:"ar",arm:"hy",asm:"as",aym:"ay",aze:"az",baq:"eu",bel:"be",ben:"bn",bos:"bs",bul:"bg",bur:"my",cat:"ca",chi:"zh",cos:"co",cze:"cs",dan:"da",div:"dv",dut:"nl",eng:"en",epo:"eo",est:"et",ewe:"ee",fin:"fi",fre:"fr",fry:"fy",geo:"ka",ger:"de",gla:"gd",gle:"ga",glg:"gl",gre:"el",grn:"gn",guj:"gu",hat:"ht",hau:"ha",hin:"hi",hrv:"hr",hun:"hu",ibo:"ig",ice:"is",ind:"id",ita:"it",jav:"jv",jpn:"ja",kan:"kn",kaz:"kk",khm:"km",kin:"rw",kir:"ky",kor:"ko",kur:"ku",lao:"lo",lat:"la",lav:"lv",lin:"ln",lit:"lt",ltz:"lb",lug:"lg",mac:"mk",mal:"ml",mao:"mi",mar:"mr",may:"ms",mlg:"mg",mlt:"mt",mon:"mn",nep:"ne",nor:"no",nya:"ny",ori:"or",orm:"om",pan:"pa",per:"fa",pol:"pl",por:"pt",pus:"ps",que:"qu",rum:"ro",rus:"ru",san:"sa",sin:"si",slo:"sk",slv:"sl",smo:"sm",sna:"sn",snd:"sd",som:"so",sot:"st",spa:"es",srp:"sr",sun:"su",swa:"sw",swe:"sv",tam:"ta",tat:"tt",tel:"te",tgk:"tg",tha:"th",tir:"ti",tso:"ts",tuk:"tk",tur:"tr",uig:"ug",ukr:"uk",urd:"ur",uzb:"uz",vie:"vi",wel:"cy",xho:"xh",yid:"yi",yor:"yo",zul:"zu"};async function O(t,o={headers:{"User-Agent":e.userAgent}}){const{timeout:i=3e3,...a}=o,n=new AbortController,r=setTimeout((()=>n.abort()),i),s=await fetch(t,{signal:n.signal,...a});return clearTimeout(r),s}function M(t){return 3===t.length?V[t]:t.toLowerCase().split(/[_;-]/)[0].trim()}function E(t,o="mp4"){const i=`https://${e.mediaProxy}/v1/proxy/video.${o}?format=base64&force=true`;return t instanceof URL?`${i}&url=${btoa(t.href)}&origin=${t.origin}&referer=${t.origin}`:`${i}&url=${btoa(t)}`}const B={encodeTranslationRequest:(t,e,o,i,a,{forceSourceLang:n=!1,bypassCache:r=!1,useNewModel:s=!0}={})=>d.encode({url:t,firstRequest:!0,duration:e,unknown0:1,language:o,forceSourceLang:n,unknown1:0,translationHelp:a||[],responseLanguage:i,unknown2:1,unknown3:1,bypassCache:r,useNewModel:s}).finish(),decodeTranslationResponse:t=>u.decode(new Uint8Array(t)),encodeTranslationAudioRequest:(t,e,o,i)=>g.encode({url:t,translationId:e,...i?{partialAudioInfo:{...i,audioBuffer:o}}:{audioInfo:o}}).finish(),decodeTranslationAudioResponse:t=>m.decode(new Uint8Array(t)),encodeSubtitlesRequest:(t,e)=>f.encode({url:t,language:e}).finish(),decodeSubtitlesResponse:t=>b.decode(new Uint8Array(t)),encodeStreamPingRequest:t=>S.encode({pingId:t}).finish(),encodeStreamRequest:(t,e,o)=>w.encode({url:t,language:e,responseLanguage:o}).finish(),decodeStreamResponse:t=>x.decode(new Uint8Array(t)),encodeYandexSessionRequest:(t,e)=>k.encode({uuid:t,module:e}).finish(),decodeYandexSessionResponse:t=>T.decode(new Uint8Array(t))};var N,R,$;!function(t){t[t.FAILED=0]="FAILED",t[t.FINISHED=1]="FINISHED",t[t.WAITING=2]="WAITING",t[t.LONG_WAITING=3]="LONG_WAITING",t[t.PART_CONTENT=5]="PART_CONTENT",t[t.AUDIO_REQUESTED=6]="AUDIO_REQUESTED"}(N||(N={})),function(t){t.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME="web_api_get_all_generating_urls_data_from_iframe",t.WEB_API_REPLACED_FETCH_INSIDE_IFRAME="web_api_replaced_fetch_inside_iframe",t.WEB_API_REPLACED_FETCH_FORCE_REQUEST_WITH_SEEK="web_api_replaced_fetch_force_request_with_seek",t.WEB_API_REPLACED_FETCH="web_api_replaced_fetch",t.ANDROID_API="android_api",t.WEB_API_SLOW="web_api_slow"}(R||(R={})),function(t){t.custom="custom",t.directlink="custom",t.youtube="youtube",t.piped="piped",t.invidious="invidious",t.vk="vk",t.nine_gag="nine_gag",t.gag="nine_gag",t.twitch="twitch",t.proxitok="proxitok",t.tiktok="tiktok",t.vimeo="vimeo",t.xvideos="xvideos",t.pornhub="pornhub",t.twitter="twitter",t.x="twitter",t.rumble="rumble",t.facebook="facebook",t.rutube="rutube",t.coub="coub",t.bilibili="bilibili",t.mail_ru="mailru",t.mailru="mailru",t.bitchute="bitchute",t.eporner="eporner",t.peertube="peertube",t.dailymotion="dailymotion",t.trovo="trovo",t.yandexdisk="yandexdisk",t.ok_ru="okru",t.okru="okru",t.googledrive="googledrive",t.bannedvideo="bannedvideo",t.weverse="weverse",t.newgrounds="newgrounds",t.egghead="egghead",t.youku="youku",t.archive="archive",t.kodik="kodik",t.patreon="patreon",t.reddit="reddit",t.kick="kick",t.apple_developer="apple_developer",t.appledeveloper="apple_developer",t.poketube="poketube",t.epicgames="epicgames",t.nineanimetv="nineanimetv",t.odysee="odysee",t.coursehunterLike="coursehunterLike",t.sap="sap",t.watchpornto="watchpornto",t.linkedin="linkedin",t.ricktube="ricktube",t.incestflix="incestflix",t.porntn="porntn",t.dzen="dzen",t.cloudflarestream="cloudflarestream",t.loom="loom"}($||($={}));const D=JSON.parse('{"recommended":"recommended","translateVideo":"Translate video","disableTranslate":"Turn off","translationSettings":"Translation settings","subtitlesSettings":"Subtitles settings","about":"About extension","resetSettings":"Reset settings","videoBeingTranslated":"The video is being translated","videoLanguage":"Video language","translationLanguage":"Translation language","translationTake":"The translation will take","translationTakeMoreThanHour":"The translation will take more than an hour","translationTakeAboutMinute":"The translation will take about a minute","translationTakeFewMinutes":"The translation will take a few minutes","translationTakeApproximatelyMinutes":"The translation will take approximately {0} minutes","translationTakeApproximatelyMinute":"The translation will take approximately {0} minutes","requestTranslationFailed":"Failed to request video translation","audioNotReceived":"Audio link not received","audioFormatNotSupported":"The audio format is not supported","VOTAutoTranslate":"Translate on open","VOTDontTranslateYourLang":"Don\'t translate from my language","VOTVolume":"Video volume","VOTVolumeTranslation":"Translation Volume","VOTAutoSetVolume":"Reduce video volume to ","VOTShowVideoSlider":"Video volume slider","VOTSyncVolume":"Link translation and video volume","VOTDisableFromYourLang":"You have disabled the translation of the video in your language","VOTVideoIsTooLong":"Video is too long","VOTNoVideoIDFound":"No video ID found","VOTSubtitles":"Subtitles","VOTSubtitlesDisabled":"Disabled","VOTSubtitlesMaxLength":"Subtitles max length","VOTHighlightWords":"Highlight words","VOTTranslatedFrom":"translated from","VOTAutogenerated":"autogenerated","VOTSettings":"VOT Settings","VOTMenuLanguage":"Menu language","VOTAuthors":"Authors","VOTVersion":"Version","VOTLoader":"Loader","VOTBrowser":"Browser","VOTShowPiPButton":"Show PiP button","langs":{"auto":"Auto","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","as":"Assamese","ay":"Aymara","az":"Azerbaijani","bn":"Bangla","eu":"Basque","be":"Belarusian","bho":"Bhojpuri","bs":"Bosnian","bg":"Bulgarian","my":"Burmese","ca":"Catalan","ceb":"Cebuano","zh":"Chinese","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fil":"Filipino","fi":"Finnish","fr":"French","gl":"Galician","lg":"Ganda","ka":"Georgian","de":"German","el":"Greek","gn":"Guarani","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jv":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","rw":"Kinyarwanda","ko":"Korean","kri":"Krio","ku":"Kurdish","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi","mn":"Mongolian","ne":"Nepali","nso":"Northern Sotho","no":"Norwegian","ny":"Nyanja","or":"Odia","om":"Oromo","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","qu":"Quechua","ro":"Romanian","ru":"Russian","sm":"Samoan","sa":"Sanskrit","gd":"Scottish Gaelic","sr":"Serbian","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","st":"Southern Sotho","es":"Spanish","su":"Sundanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","tt":"Tatar","te":"Telugu","th":"Thai","ti":"Tigrinya","ts":"Tsonga","tr":"Turkish","tk":"Turkmen","uk":"Ukrainian","ur":"Urdu","ug":"Uyghur","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"},"streamNoConnectionToServer":"There is no connection to the server","searchField":"Search...","VOTTranslateAPIErrors":"Translate errors from the API","VOTDetectService":"Language detection service","VOTProxyWorkerHost":"Enter the proxy worker address","VOTM3u8ProxyHost":"Enter the address of the m3u8 proxy worker","proxySettings":"Proxy Settings","translationTakeApproximatelyMinute2":"The translation will take approximately {0} minutes","VOTAudioBooster":"Extended translation volume increase","VOTSubtitlesDesign":"Subtitles design","VOTSubtitlesFontSize":"Font size of subtitles","VOTSubtitlesOpacity":"Transparency of the subtitle background","VOTPressNewHotkey":"Press the new hotkey...","VOTCreateTranslationHotkey":"Create Hotkey for Translation","VOTChangeHotkeyWithCurrent":"Change Hotkey (Current: {0})","VOTSubtitlesDownloadFormat":"The format for downloading subtitles","VOTDownloadWithName":"Download files with the video name","VOTUpdateLocaleFiles":"Update localization files","VOTLocaleHash":"Locale hash","VOTUpdatedAt":"Updated at","VOTNeedWebAudioAPI":"To enable this, you must have a Web Audio API","VOTMediaCSPEnabledOnSite":"Media CSP is enabled on this site","VOTOnlyBypassMediaCSP":"Use it only for bypassing Media CSP","VOTNewAudioPlayer":"Use the new audio player","VOTUseNewModel":"Use an experimental variation of Yandex voices for some videos","VOTTranslationErrorsService":"Error translation service","TranslationDelayed":"The translation is slightly delayed","VOTTranslationCompletedNotify":"The translation on the {0} has been completed!","VOTSendNotifyOnComplete":"Send a notification that the video has been translated","VOTBugReport":"Report a bug"}'),F={log:(...t)=>{}},q="media-proxy.toil.cc/v1/proxy/m3u8",U="vot-worker.toil.cc",z=.15,H="yandexbrowser",W="yandexbrowser",j=["FireMonkey","Greasemonkey","AdGuard","OrangeMonkey","Userscripts","Other (Polyfill)"];async function G(t,e,o,i,a=void 0){(a??t[e])===o&&(t[e]=i,await Y.set(e,i),console.log(`[VOT] Old ${e} converted to new ${i}`))}const Y=new class{gmSupport;constructor(){this.gmSupport="function"==typeof GM_getValue,F.log(`GM Storage Status: ${this.gmSupport}`)}syncGet(t,e=void 0){if(this.gmSupport)return GM_getValue(t,e);const o="number"==typeof e;const i=window.localStorage.getItem(t)??e;return o?Number(i):i}async get(t,e=void 0){return this.gmSupport?await GM_getValue(t,e):Promise.resolve(this.syncGet(t,e))}syncSet(t,e){return this.gmSupport?GM_setValue(t,e):window.localStorage.setItem(t,e)}async set(t,e){return this.gmSupport?await GM_setValue(t,e):Promise.resolve(this.syncSet(t,e))}syncDelete(t){return this.gmSupport?GM_deleteValue(t):window.localStorage.removeItem(t)}async delete(t){return this.gmSupport?await GM_deleteValue(t):Promise.resolve(this.syncDelete(t))}syncList(){return this.gmSupport?GM_listValues():["autoTranslate","dontTranslateLanguage","dontTranslateYourLang","autoSetVolumeYandexStyle","autoVolume","buttonPos","showVideoSlider","syncVolume","subtitlesMaxLength","highlightWords","responseLanguage","defaultVolume","audioProxy","showPiPButton","translateAPIErrors","translationService","detectService","m3u8ProxyHost","translateProxyEnabled","hotkeyButton","proxyWorkerHost","audioBooster","locale-version","locale-lang","locale-phrases"]}async list(){return this.gmSupport?await GM_listValues():Promise.resolve(this.syncList())}},J=navigator.language||navigator.userLanguage,K=J?.substr(0,2)?.toLowerCase()??"en";function Z(){return"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled}function X(){return"undefined"!=typeof Hls&&Hls?.isSupported()?new Hls({debug:!1,lowLatencyMode:!0,backBufferLength:90}):void 0}const Q=new RegExp([/(?:https?|ftp):\/\/\S+/g,/https?:\/\/\S+|www\.\S+/gm,/\b\S+\.\S+/gm,/#[^\s#]+/g,/Auto-generated by YouTube/g,/Provided to YouTube by/g,/Released on/g,/0x[a-fA-F0-9]{40}/g,/[13][a-km-zA-HJ-NP-Z1-9]{25,34}/g,/4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}/g,/Paypal/g].map((t=>t.source)).join("|"));function tt(t,e){const o=URL.createObjectURL(t),i=document.createElement("a");i.href=o,i.download=e,i.click(),URL.revokeObjectURL(o)}function et(t){return 0===t.trim().length?(new Date).toLocaleDateString("en-us").replaceAll("/","-"):t.replace(/[\\/:*?"'<>|]/g,"")}async function ot(t,e={}){const{timeout:o=15e3,...i}=e,a=new AbortController,n=new Headers(i.headers||{});try{if(t.includes("api.browser.yandex.ru"))throw new Error("Preventing yandex cors");return await fetch(t,{signal:a.signal,...i})}catch(e){return F.log("GM_fetch preventing cors by GM_xmlhttpRequest",e.message),new Promise(((e,a)=>{const r={};for(const[t,e]of n.entries())r[t]=e;GM_xmlhttpRequest({method:i.method||"GET",url:t,responseType:"blob",...i,data:i.body,timeout:o,headers:r,onload:t=>{const o=new Headers,i=t.responseHeaders.trim().split(/\r?\n/);for(const t of i){const[e,...i]=t.split(/:\s*/);e&&o.set(e,i.join(": "))}const a=new Response(t.response,{status:t.status,headers:o});Object.defineProperty(a,"url",{value:t.finalUrl??""}),e(a)},ontimeout:()=>a(new Error("Timeout")),onerror:t=>a(new Error(t)),onabort:()=>a(new Error("AbortError"))})}))}}function it(){return Math.floor(Date.now()/1e3)}const at="https://raw.githubusercontent.com/ilyhalight/voice-over-translation/master/src/localization",nt=["auto","en","ru","af","am","ar","az","bg","bn","bs","ca","cs","cy","da","de","el","es","et","eu","fa","fi","fr","gl","hi","hr","hu","hy","id","it","ja","jv","kk","km","kn","ko","lo","mk","ml","mn","ms","mt","my","ne","nl","pa","pl","pt","ro","si","sk","sl","sq","sr","su","sv","sw","tr","uk","ur","uz","vi","zh","zu"],rt=new class{lang="en";locale={};gmValues=["locale-phrases","locale-lang","locale-hash","locale-updated-at","locale-lang-override"];constructor(){const t=Y.syncGet("locale-lang-override","auto");this.lang=t&&"auto"!==t?t:(navigator.language||navigator.userLanguage)?.substr(0,2)?.toLowerCase()??"en",this.setLocaleFromJsonString(Y.syncGet("locale-phrases",""))}reset(){for(let t=0;ti&&o===this.lang)return;const a=await this.checkUpdates(t);if(await Y.set("locale-updated-at",i),a){F.log("Updating locale...");try{const e=await ot(`${at}/locales/${this.lang}.json${t?`?timestamp=${i}`:""}`);if(200!==e.status)throw e.status;const o=await e.text();await Y.set("locale-phrases",o),this.setLocaleFromJsonString(o),await Y.set("locale-hash",a),await Y.set("locale-lang",this.lang)}catch(t){console.error("[VOT] [localizationProvider] Failed to get locale, cause:",t),this.setLocaleFromJsonString(await Y.get("locale-phrases",""))}}}setLocaleFromJsonString(t){try{this.locale=JSON.parse(t)??{}}catch(t){console.error("[VOT] [localizationProvider]",t),this.locale={}}}getFromLocale(t,e){const o=e.split(".").reduce(((t,e)=>{if("object"==typeof t&&t)return t[e]}),t);return void 0===o&&console.warn("[VOT] [localizationProvider] locale",t,"doesn't contain key",e),o}getDefault(t){return this.getFromLocale(D,t)??t}get(t){return this.getFromLocale(this.locale,t)??this.getFromLocale(D,t)??t}};class st extends Error{constructor(t){super(rt.getDefault(t)),this.name="VOTLocalizedError",this.unlocalizedMessage=t,this.localizedMessage=rt.get(t)}}class lt extends Error{data;constructor(t,e=void 0){super(t),this.data=e,this.name="VOTJSError",this.message=t}}class dt{host;hostVOT;schema;schemaVOT;fetch;fetchOpts;sessions={};requestLang;responseLang;userAgent=e.userAgent;paths={videoTranslation:"/video-translation/translate",videoTranslationFailAudio:"/video-translation/fail-audio-js",videoTranslationAudio:"/video-translation/audio",videoSubtitles:"/video-subtitles/get-subtitles",streamPing:"/stream-translation/ping-stream",streamTranslation:"/stream-translation/translate-stream",createSession:"/session/create"};isCustomLink(t){return!!(/\.(m3u8|m4(a|v)|mpd)/.exec(t)??/^https:\/\/cdn\.qstv\.on\.epicgames\.com/.exec(t))}headers={"User-Agent":this.userAgent,Accept:"application/x-protobuf","Accept-Language":"en","Content-Type":"application/x-protobuf",Pragma:"no-cache","Cache-Control":"no-cache","Sec-Fetch-Mode":"no-cors"};headersVOT={"User-Agent":`vot.js/${e.version}`,"Content-Type":"application/json",Pragma:"no-cache","Cache-Control":"no-cache"};constructor({host:t=e.host,hostVOT:o=e.hostVOT,fetchFn:i=O,fetchOpts:a={},requestLang:n="en",responseLang:r="ru",headers:s={}}={}){const l=/(http(s)?):\/\//,d=l.exec(t)?.[1];this.host=d?t.replace(`${d}://`,""):t,this.schema=d??"https";const u=l.exec(o)?.[1];this.hostVOT=u?o.replace(`${u}://`,""):o,this.schemaVOT=u??"https",this.fetch=i,this.fetchOpts=a,this.requestLang=n,this.responseLang=r,this.headers={...this.headers,...s}}getOpts(t,e={},o="POST"){return{method:o,headers:{...this.headers,...e},body:t,...this.fetchOpts}}async request(t,e,o={},i="POST"){const a=this.getOpts(new Blob([e]),o,i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(e,{"Content-Type":"application/json",...o},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestVOT(t,e,o={}){const i=this.getOpts(JSON.stringify(e),{...this.headersVOT,...o});try{const e=await this.fetch(`${this.schemaVOT}://${this.hostVOT}${t}`,i),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async getSession(t){const e=Math.floor(Date.now()/1e3),o=this.sessions[t];if(o&&o.timestamp+o.expires>e)return o;const{secretKey:i,expires:a,uuid:n}=await this.createSession(t);return this.sessions[t]={secretKey:i,expires:a,timestamp:e,uuid:n},this.sessions[t]}async translateVideoYAImpl({videoData:t,requestLang:o=this.requestLang,responseLang:i=this.responseLang,translationHelp:n=null,headers:r={},extraOpts:s={},shouldSendFailedAudio:l=!0}){const{url:d,duration:u=e.defaultDuration}=t,c=await this.getSession("video-translation"),h=B.encodeTranslationRequest(d,u,o,i,n,s),p=this.paths.videoTranslation,g=await _("Vtrans",c,h,p),m=await this.request(p,h,{...g,...r});if(!m.success)throw new st("requestTranslationFailed");const v=B.decodeTranslationResponse(m.data);a.log("translateVideo",v);const{status:f,translationId:b}=v;switch(f){case N.FAILED:throw v?.message?new lt("Yandex couldn't translate video",v):new st("requestTranslationFailed");case N.FINISHED:case N.PART_CONTENT:if(!v.url)throw new st("audioNotReceived");return{translationId:b,translated:!0,url:v.url,status:f,remainingTime:v.remainingTime??-1};case N.WAITING:case N.LONG_WAITING:return{translationId:b,translated:!1,status:f,remainingTime:v.remainingTime};case N.AUDIO_REQUESTED:return d.startsWith("https://youtu.be/")&&l?(await this.requestVtransFailAudio(d),await this.requestVtransAudio(d,v.translationId,{audioFile:new Uint8Array,fileId:R.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME}),await this.translateVideoYAImpl({videoData:t,requestLang:o,responseLang:i,translationHelp:n,headers:r,shouldSendFailedAudio:!1})):{translationId:b,translated:!1,status:f,remainingTime:v.remainingTime??-1};default:throw a.error("Unknown response",v),new lt("Unknown response from Yandex",v)}}async translateVideoVOTImpl({url:t,videoId:e,service:o,requestLang:i=this.requestLang,responseLang:a=this.responseLang,headers:n={}}){const r=function(t,e,o){return t===$.patreon?{service:"mux",videoId:new URL(o).pathname.slice(1)}:{service:t,videoId:e}}(o,e,t),s=await this.requestVOT(this.paths.videoTranslation,{provider:"yandex",service:r.service,videoId:r.videoId,fromLang:i,toLang:a,rawVideo:t},n);if(!s.success)throw new st("requestTranslationFailed");const l=s.data;switch(l.status){case"failed":throw new lt("Yandex couldn't translate video",l);case"success":if(!l.translatedUrl)throw new st("audioNotReceived");return{translationId:String(l.id),translated:!0,url:l.translatedUrl,status:1,remainingTime:-1};case"waiting":return{translationId:"",translated:!1,remainingTime:l.remainingTime,status:2,message:l.message}}}async requestVtransFailAudio(t){const e=await this.requestJSON(this.paths.videoTranslationFailAudio,JSON.stringify({video_url:t}),void 0,"PUT");if(!e.data||"string"==typeof e.data||1!==e.data.status)throw new lt("Failed to request to fake video translation fail audio js",e);return e}async requestVtransAudio(t,e,o,i,a={}){const n=await this.getSession("video-translation"),r=B.encodeTranslationAudioRequest(t,e,o,i),s=this.paths.videoTranslationAudio,l=await _("Vtrans",n,r,s),d=await this.request(s,r,{...l,...a},"PUT");if(!d.success)throw new lt("Failed to request video translation audio",d);return B.decodeTranslationAudioResponse(d.data)}async translateVideo({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:i=null,headers:a={},extraOpts:n={},shouldSendFailedAudio:r=!0}){const{url:s,videoId:l,host:d}=t;return this.isCustomLink(s)?await this.translateVideoVOTImpl({url:s,videoId:l,service:d,requestLang:e,responseLang:o,headers:a}):await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:i,headers:a,extraOpts:n,shouldSendFailedAudio:r})}async getSubtitles({videoData:t,requestLang:e=this.requestLang,headers:o={}}){const{url:i}=t;if(this.isCustomLink(i))return{waiting:!1,subtitles:[]};const a=await this.getSession("video-translation"),n=B.encodeSubtitlesRequest(i,e),r=this.paths.videoSubtitles,s=await _("Vsubs",a,n,r),l=await this.request(r,n,{...s,...o});if(!l.success)throw new lt("Failed to request video subtitles",l);return B.decodeSubtitlesResponse(l.data)}async pingStream({pingId:t,headers:e={}}){const o=await this.getSession("video-translation"),i=B.encodeStreamPingRequest(t),a=this.paths.streamPing,n=await _("Vtrans",o,i,a),r=await this.request(a,i,{...n,...e});if(!r.success)throw new lt("Failed to request stream ping",r);return!0}async translateStream({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,headers:i={}}){const{url:n}=t;if(this.isCustomLink(n))throw new st("VOTStreamNotSupportedUrl");const s=await this.getSession("video-translation"),l=B.encodeStreamRequest(n,e,o),d=this.paths.streamTranslation,u=await _("Vtrans",s,l,d),c=await this.request(d,l,{...u,...i});if(!c.success)throw new lt("Failed to request stream translation",c);const h=B.decodeStreamResponse(c.data),p=h.interval;switch(p){case r.NO_CONNECTION:case r.TRANSLATING:return{translated:!1,interval:p,message:p===r.NO_CONNECTION?"streamNoConnectionToServer":"translationTakeFewMinutes"};case r.STREAMING:return{translated:!0,interval:p,pingId:h.pingId,result:h.translatedInfo};default:throw a.error("Unknown response",h),new lt("Unknown response from Yandex",h)}}async createSession(t){const e=function(){let t="";for(let e=0;e<32;e++)t+="0123456789ABCDEF"[Math.floor(16*Math.random())];return t}(),o=B.encodeYandexSessionRequest(e,t),i=await this.request(this.paths.createSession,o,{"Vtrans-Signature":await A(o)});if(!i.success)throw new lt("Failed to request create session",i);return{...B.decodeYandexSessionResponse(i.data),uuid:e}}}class ut extends dt{constructor(t={}){t.host=t.host??e.hostWorker,super(t)}async request(t,e,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,...o},body:Array.from(e)}),{"Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,"Content-Type":"application/json",Accept:"application/json",...o},body:e}),{Accept:"application/json","Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}}class ct extends dt{constructor(t){super(t)}}class ht extends ut{constructor(t){super(t)}}class pt extends Error{constructor(t){super(t),this.name="VideoDataError",this.message=t}}const gt=/(file:\/\/(\/)?|(http(s)?:\/\/)(127\.0\.0\.1|localhost|192\.168\.(\d){1,3}\.(\d){1,3}))/;var mt;!function(t){t.udemy="udemy",t.coursera="coursera",t.douyin="douyin",t.artstation="artstation"}(mt||(mt={}));const vt=[{additionalData:"mobile",host:$.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:"shorts-video #player"},{additionalData:"mobile",host:$.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:".player-container"},{host:$.youtube,url:"https://youtu.be/",match:/^(www.)?youtube(-nocookie|kids)?.com$/,selector:".html5-video-container:not(#inline-player *)"},{host:$.invidious,url:"https://youtu.be/",match:["yewtu.be","yt.artemislena.eu","invidious.flokinet.to","iv.melmac.space","inv.nadeko.net","inv.tux.pizza","invidious.private.coffee","yt.drgnz.club","vid.puffyan.us","invidious.dhusch.de"],selector:"#player",needBypassCSP:!0},{host:$.piped,url:"https://youtu.be/",match:["piped.video","piped.tokhmi.xyz","piped.moomoo.me","piped.syncpundit.io","piped.mha.fi","watch.whatever.social","piped.garudalinux.org","efy.piped.pages.dev","watch.leptons.xyz","piped.lunar.icu","yt.dc09.ru","piped.mint.lgbt","il.ax","piped.privacy.com.de","piped.esmailelbob.xyz","piped.projectsegfau.lt","piped.in.projectsegfau.lt","piped.us.projectsegfau.lt","piped.privacydev.net","piped.palveluntarjoaja.eu","piped.smnz.de","piped.adminforge.de","piped.qdi.fi","piped.hostux.net","piped.chauvet.pro","piped.jotoma.de","piped.pfcd.me","piped.frontendfriendly.xyz"],selector:".shaka-video-container",needBypassCSP:!0},{host:$.poketube,url:"https://youtu.be/",match:["poketube.fun","pt.sudovanilla.org","poke.ggtyler.dev","poke.uk2.littlekai.co.uk","poke.blahai.gay"],selector:".video-player-container"},{host:$.ricktube,url:"https://youtu.be/",match:["ricktube.ru"],selector:"#oframeplayer > pjsdiv:has(video)"},{additionalData:"mobile",host:$.vk,url:"https://vk.com/video?z=",match:[/^m.vk.(com|ru)$/,/^m.vkvideo.ru$/],selector:"vk-video-player",shadowRoot:!0,needExtraData:!0},{additionalData:"clips",host:$.vk,url:"https://vk.com/video?z=",match:/^(www.|m.)?vk.(com|ru)$/,selector:'div[data-testid="clipcontainer-video"]',needExtraData:!0},{host:$.vk,url:"https://vk.com/video?z=",match:[/^(www.|m.)?vk.(com|ru)$/,/^(www.|m.)?vkvideo.ru$/],selector:".videoplayer_media",needExtraData:!0},{host:$.nine_gag,url:"https://9gag.com/gag/",match:/^9gag.com$/,selector:".video-post"},{host:$.twitch,url:"https://twitch.tv/",match:[/^m.twitch.tv$/,/^(www.)?twitch.tv$/,/^clips.twitch.tv$/,/^player.twitch.tv$/],selector:".video-ref, main > div > section > div > div > div"},{host:$.proxitok,url:"https://www.tiktok.com/",match:["proxitok.pabloferreiro.es","proxitok.pussthecat.org","tok.habedieeh.re","proxitok.esmailelbob.xyz","proxitok.privacydev.net","tok.artemislena.eu","tok.adminforge.de","tt.vern.cc","cringe.whatever.social","proxitok.lunar.icu","proxitok.privacy.com.de"],selector:".column.has-text-centered"},{host:$.tiktok,url:"https://www.tiktok.com/",match:/^(www.)?tiktok.com$/,selector:null},{host:mt.douyin,url:"https://www.douyin.com/",match:/^(www.)?douyin.com/,selector:".xg-video-container",needExtraData:!0,needBypassCSP:!0},{host:$.vimeo,url:"https://vimeo.com/",match:/^vimeo.com$/,needExtraData:!0,selector:".player"},{host:$.vimeo,url:"https://player.vimeo.com/",match:/^player.vimeo.com$/,additionalData:"embed",needExtraData:!0,needBypassCSP:!0,selector:".player"},{host:$.xvideos,url:"https://www.xvideos.com/",match:/^(www.)?(xvideos|xv-ru).com$/,selector:"#hlsplayer",needBypassCSP:!0},{host:$.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:/^[a-z]+.pornhub.com$/,selector:".mainPlayerDiv > .video-element-wrapper-js > div",eventSelector:".mgp_eventCatcher"},{additionalData:"embed",host:$.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:t=>t.host.includes("pornhub.com")&&t.pathname.startsWith("/embed/"),selector:"#player"},{host:$.twitter,url:"https://twitter.com/i/status/",match:/^(twitter|x).com$/,selector:'div[data-testid="videoComponent"] > div:nth-child(1) > div',eventSelector:'div[data-testid="videoPlayer"]',needBypassCSP:!0},{host:$.rumble,url:"https://rumble.com/",match:/^rumble.com$/,selector:"#videoPlayer > .videoPlayer-Rumble-cls > div"},{host:$.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/videos/"),selector:'div[role="main"] div[data-pagelet$="video" i]',needBypassCSP:!0},{additionalData:"reels",host:$.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/reel/"),selector:'div[role="main"]',needBypassCSP:!0},{host:$.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:".video-player > div > div > div:nth-child(2)"},{additionalData:"embed",host:$.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:"#app > div > div"},{host:$.bilibili,url:"https://www.bilibili.com/",match:/^(www|m|player).bilibili.com$/,selector:".bpx-player-video-wrap"},{additionalData:"old",host:$.bilibili,url:"https://www.bilibili.com/",match:/^(www|m).bilibili.com$/,selector:null},{host:$.mailru,url:"https://my.mail.ru/",match:/^my.mail.ru$/,selector:"#b-video-wrapper"},{host:$.bitchute,url:"https://www.bitchute.com/video/",match:/^(www.)?bitchute.com$/,selector:".video-js"},{host:$.eporner,url:"https://www.eporner.com/",match:/^(www.)?eporner.com$/,selector:".vjs-v7"},{host:$.peertube,url:"stub",match:["peertube.1312.media","tube.shanti.cafe","bee-tube.fr","video.sadmin.io","dalek.zone","review.peertube.biz","peervideo.club","tube.la-dina.net","peertube.tmp.rcp.tf","peertube.su","video.blender.org","videos.viorsan.com","tube-sciences-technologies.apps.education.fr","tube-numerique-educatif.apps.education.fr","tube-arts-lettres-sciences-humaines.apps.education.fr","beetoons.tv","comics.peertube.biz","makertube.net"],selector:".vjs-v7"},{host:$.dailymotion,url:"https://dai.ly/",match:/^geo([\d]+)?.dailymotion.com$/,selector:".player"},{host:$.trovo,url:"https://trovo.live/s/",match:/^trovo.live$/,selector:".player-video"},{host:$.yandexdisk,url:"https://yadi.sk/",match:/^disk.yandex.(ru|kz|com(\.(am|ge|tr))?|by|az|co\.il|ee|lt|lv|md|net|tj|tm|uz)$/,selector:".video-player__player > div:nth-child(1)",eventSelector:".video-player__player",needBypassCSP:!0,needExtraData:!0},{host:$.okru,url:"https://ok.ru/video/",match:/^ok.ru$/,selector:"vk-video-player",shadowRoot:!0},{host:$.googledrive,url:"https://drive.google.com/file/d/",match:/^youtube.googleapis.com$/,selector:".html5-video-container"},{host:$.bannedvideo,url:"https://madmaxworld.tv/watch?id=",match:/^(www.)?banned.video|madmaxworld.tv$/,selector:".vjs-v7",needExtraData:!0},{host:$.weverse,url:"https://weverse.io/",match:/^weverse.io$/,selector:".webplayer-internal-source-wrapper",needExtraData:!0},{host:$.newgrounds,url:"https://www.newgrounds.com/",match:/^(www.)?newgrounds.com$/,selector:".ng-video-player"},{host:$.egghead,url:"https://egghead.io/",match:/^egghead.io$/,selector:".cueplayer-react-video-holder"},{host:$.youku,url:"https://v.youku.com/",match:/^v.youku.com$/,selector:"#ykPlayer"},{host:$.archive,url:"https://archive.org/details/",match:/^archive.org$/,selector:".jw-media"},{host:$.kodik,url:"stub",match:/^kodik.(info|biz|cc)$/,selector:".fp-player",needExtraData:!0},{host:$.patreon,url:"stub",match:/^(www.)?patreon.com$/,selector:'div[data-tag="post-card"] div[elevation="subtle"] > div > div > div > div',needExtraData:!0},{additionalData:"old",host:$.reddit,url:"stub",match:/^old.reddit.com$/,selector:".reddit-video-player-root",needExtraData:!0,needBypassCSP:!0},{host:$.reddit,url:"stub",match:/^(www.|new.)?reddit.com$/,selector:"div[slot=post-media-container]",shadowRoot:!0,needExtraData:!0,needBypassCSP:!0},{host:$.kick,url:"https://kick.com/",match:/^kick.com$/,selector:"#injected-embedded-channel-player-video > div",needExtraData:!0},{host:$.appledeveloper,url:"https://developer.apple.com/",match:/^developer.apple.com$/,selector:".developer-video-player",needExtraData:!0,needBypassCSP:!0},{host:$.epicgames,url:"https://dev.epicgames.com/community/learning/",match:/^dev.epicgames.com$/,selector:".vjs-v7",needExtraData:!0},{host:$.nineanimetv,url:"https://9animetv.to/watch/",match:/^rapid-cloud.co$/,selector:".jw-media",needExtraData:!0},{host:$.odysee,url:"stub",match:/^odysee.com$/,selector:".vjs-v7",needExtraData:!0},{host:$.coursehunterLike,url:"stub",match:["coursehunter.net","coursetrain.net"],selector:"#oframeplayer > pjsdiv:has(video)",needExtraData:!0},{host:$.sap,url:"https://learning.sap.com/courses/",match:/^learning.sap.com$/,selector:".playkit-container",eventSelector:".playkit-player",needExtraData:!0,needBypassCSP:!0},{host:mt.udemy,url:"https://www.udemy.com/",match:/udemy.com$/,selector:'div[data-purpose="curriculum-item-viewer-content"] > section > div > div > div > div:nth-of-type(2)',needExtraData:!0},{host:mt.coursera,url:"https://www.coursera.org/",match:/coursera.org$/,selector:".vjs-v8",needExtraData:!0},{host:$.watchpornto,url:"https://watchporn.to/",match:/^watchporn.to$/,selector:".fp-player"},{host:$.linkedin,url:"https://www.linkedin.com/learning/",match:/^(www.)?linkedin.com$/,selector:".vjs-v7",needExtraData:!0,needBypassCSP:!0},{host:$.incestflix,url:"https://www.incestflix.net/watch/",match:/^(www.)?incestflix.(net|to|com)$/,selector:"#incflix-stream",needExtraData:!0},{host:$.porntn,url:"https://porntn.com/videos/",match:/^porntn.com$/,selector:".fp-player",needExtraData:!0},{host:$.dzen,url:"https://dzen.ru/video/watch/",match:/^dzen.ru$/,selector:".zen-ui-video-video-player"},{host:$.cloudflarestream,url:"stub",match:/^(watch|embed|iframe|customer-[^.]+).cloudflarestream.com$/,selector:null},{host:$.loom,url:"https://www.loom.com/share/",match:/^(www.)?loom.com$/,selector:".VideoLayersContainer",needExtraData:!0},{host:mt.artstation,url:"https://www.artstation.com/learning/",match:/^(www.)?artstation.com$/,selector:".vjs-v7",needExtraData:!0},{host:$.custom,url:"stub",match:t=>/([^.]+).(mp4|webm)/.test(t.pathname),rawResult:!0}];class ft extends Error{constructor(t){super(t),this.name="VideoHelper",this.message=t}}class bt{API_ORIGIN=window.location.origin;fetch;extraInfo;referer;origin;service;video;constructor({fetchFn:t=O,extraInfo:e=!0,referer:o=document.referrer??window.location.origin+"/",origin:i=window.location.origin,service:a,video:n}={}){this.fetch=t,this.extraInfo=e,this.referer=o,this.origin=/^(http(s)?):\/\//.test(String(i))?i:window.location.origin,this.service=a,this.video=n}async getVideoData(t){}async getVideoId(t){}returnBaseData(t){if(this.service)return{url:this.service.url+t,videoId:t,host:this.service.host,duration:void 0}}}class yt extends bt{static getPlayer(){const t=document.querySelector(".video-js");if(t)return t.player}async getVideoData(t){try{const e=yt.getPlayer();if(!e)throw new Error(`Video player doesn't have player option, videoId ${t}`);const{cache_:{sources:o,duration:i},textTracks_:{tracks_:a}}=e,n=o.find((t=>"video/mp4"===t.type));if(!n)throw new Error(`Failed to find video url for videoID ${t}`);const r=new URL(n.src),s=a.map((t=>({language:M(t.language),source:"linkedin",format:"vtt",url:t.src})));return{url:E(r),duration:i,subtitles:s}}catch(t){return void a.error("Failed to get linkedin video data",t.message)}}async getVideoId(t){return/\/learning\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}}class wt extends bt{static getPlayer(){if("undefined"==typeof Videoview)return;const t=Videoview;return t.getPlayerObject?t.getPlayerObject.call(void 0):void 0}getDefault(t){if(this.service)return{url:this.service.url+t,duration:void 0}}async getVideoData(t){const e=wt.getPlayer();if(!e)return this.getDefault(t);try{const{description:o,duration:i,md_title:a}=e.vars,n=(new DOMParser).parseFromString(o,"text/html"),r=Array.from(n.body.childNodes).filter((t=>"BR"!==t.nodeName)).map((t=>t.textContent)).join("\n");let s;return Object.hasOwn(e.vars,"subs")&&(s=e.vars.subs.map((t=>({language:M(t.lang),source:"vk",format:"vtt",url:t.url,isAutoGenerated:!!t.is_auto})))),{url:this.service.url+t,title:a,description:r,duration:i,subtitles:s}}catch(e){return a.error(`Failed to get VK video data, because: ${e.message}`),this.getDefault(t)}}async getVideoId(t){const e=/^\/(video|clip)-?\d{8,9}_\d{9}$/.exec(t.pathname);if(e)return e[0].slice(1);const o=/\/playlist\/[^/]+\/(video-?\d{8,9}_\d{9})/.exec(t.pathname);if(o)return o[1];const i=t.searchParams.get("z");if(i)return i.split("/")[0];const a=t.searchParams.get("oid"),n=t.searchParams.get("id");return a&&n?`video-${Math.abs(parseInt(a))}_${n}`:void 0}}class xt extends bt{async getVideoId(t){return/([^/]+)\/video\/([^/]+)/.exec(t.pathname)?.[0]}}class St extends bt{async getVideoId(t){return"youtu.be"===t.hostname&&(t.search=`?v=${t.pathname.replace("/","")}`,t.pathname="/watch"),/(?:watch|embed|shorts|live)\/([^/]+)/.exec(t.pathname)?.[1]??t.searchParams.get("v")}}const kt=["auto","ru","en","zh","ko","lt","lv","ar","fr","it","es","de","ja"],Tt=["ru","en","kk"],Ct=["srt","vtt","json"];var It;!function(t){t.Channel="Channel",t.Video="Video"}(It||(It={}));const Pt={[$.mailru]:class extends bt{API_ORIGIN="https://my.mail.ru";async getVideoMeta(t){try{const e=await this.fetch(`${this.API_ORIGIN}/+/video/meta/${t}?xemail=&ajax_call=1&func_name=&mna=&mnb=&ext=1&_=${(new Date).getTime()}`);return await e.json()}catch(t){return void a.error("Failed to get mail.ru video data",t.message)}}async getVideoId(t){const e=t.pathname;if(/\/(v|mail|bk|inbox)\//.exec(e))return e.slice(1);const o=/video\/embed\/([^/]+)/.exec(e)?.[1];if(!o)return;const i=await this.getVideoMeta(o);return i?i.meta.url.replace("//my.mail.ru/",""):void 0}},[$.weverse]:class extends bt{API_ORIGIN="https://global.apis.naver.com/weverse/wevweb";API_APP_ID="be4d79eb8fc7bd008ee82c8ec4ff6fd4";API_HMAC_KEY="1b9cb6378d959b45714bec49971ade22e6e24e42";HEADERS={Accept:"application/json, text/plain, */*",Origin:"https://weverse.io",Referer:"https://weverse.io/"};getURLData(){return{appId:this.API_APP_ID,language:"en",os:"WEB",platform:"WEB",wpf:"pc"}}async createHash(t){const e=Date.now(),o=t.substring(0,Math.min(255,t.length))+e,i=await async function(t,e){try{const o=P.encode(e),i=await L("SHA-1",t,o);return btoa(String.fromCharCode(...new Uint8Array(i)))}catch(t){return a.error(t),!1}}(this.API_HMAC_KEY,o);if(!i)throw new ft("Failed to get weverse HMAC signature");return{wmsgpad:e.toString(),wmd:i}}async getHashURLParams(t){const e=await this.createHash(t);return new URLSearchParams(e).toString()}async getPostPreview(t){const e=`/post/v1.0/post-${t}/preview?`+new URLSearchParams({fieldSet:"postForPreview",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{headers:this.HEADERS});return await o.json()}catch(e){return a.error(`Failed to get weverse post preview by postId: ${t}`,e.message),!1}}async getVideoInKey(t){const e=`/video/v1.1/vod/${t}/inKey?`+new URLSearchParams({gcc:"RU",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{method:"POST",headers:this.HEADERS});return await o.json()}catch(e){return a.error(`Failed to get weverse InKey by videoId: ${t}`,e.message),!1}}async getVideoInfo(t,e,o){const i=Date.now();try{const a=new URLSearchParams({key:e,sid:o,nonce:i.toString(),devt:"html5_pc",prv:"N",aup:"N",stpb:"N",cpl:"en",env:"prod",lc:"en",adi:JSON.stringify([{adSystem:null}]),adu:"/"}).toString(),n=await this.fetch(`https://global.apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/${t}?`+a,{headers:this.HEADERS});return await n.json()}catch(i){return a.error(`Failed to get weverse video info (infraVideoId: ${t}, inkey: ${e}, serviceId: ${o}`,i.message),!1}}extractVideoInfo(t){return t.find((t=>!1===t.useP2P&&t.source.includes(".mp4")))}async getVideoData(t){const e=await this.getPostPreview(t);if(!e)return;const{videoId:o,serviceId:i,infraVideoId:a}=e.extension.video;if(!(o&&i&&a))return;const n=await this.getVideoInKey(o);if(!n)return;const r=await this.getVideoInfo(a,n.inKey,i);if(!r)return;const s=this.extractVideoInfo(r.videos.list);return s?{url:s.source,duration:s.duration}:void 0}async getVideoId(t){return/([^/]+)\/(live|media)\/([^/]+)/.exec(t.pathname)?.[3]}},[$.kodik]:class extends bt{API_ORIGIN=window.location.origin;async getSecureData(t){try{const o=await this.fetch(`${this.API_ORIGIN}${t}`,{headers:{"User-Agent":e.userAgent,Origin:this.API_ORIGIN,Referer:this.API_ORIGIN}}),i=await o.text(),[a,n,r]=t.split("/").filter((t=>t)),s=(new DOMParser).parseFromString(i,"text/html"),l=Array.from(s.getElementsByTagName("script")).filter((t=>t.innerHTML.includes(`videoId = "${n}"`)));if(!l.length)throw new ft("Failed to find secure script");const d=/'{[^']+}'/.exec(l[0].textContent.trim())?.[0];if(!d)throw new ft("Secure json wasn't found in secure script");const u=JSON.parse(d.replaceAll("'",""));return{videoType:a,videoId:n,hash:r,...u}}catch(e){return a.error(`Failed to get kodik secure data by videoPath: ${t}.`,e.message),!1}}async getFtor(t){const{videoType:o,videoId:i,hash:n,d:r,d_sign:s,pd:l,pd_sign:d,ref:u,ref_sign:c}=t;try{const t=await this.fetch(this.API_ORIGIN+"/ftor",{method:"POST",headers:{"User-Agent":e.userAgent,Origin:this.API_ORIGIN,Referer:`${this.API_ORIGIN}/${o}/${i}/${n}/360p`},body:new URLSearchParams({d:r,d_sign:s,pd:l,pd_sign:d,ref:decodeURIComponent(u),ref_sign:c,bad_user:"false",cdn_is_working:"true",info:"{}",type:o,hash:n,id:i})});return await t.json()}catch(t){return a.error(`Failed to get kodik video data (type: ${o}, id: ${i}, hash: ${n})`,t.message),!1}}decryptUrl(t){const e=atob(t.replace(/[a-zA-Z]/g,(function(t){const e=t.charCodeAt(0)+13,o=t<="Z"?90:122;return String.fromCharCode(o>=e?e:e-26)})));return"https:"+e}async getVideoData(t){const e=await this.getSecureData(t);if(!e)return;const o=await this.getFtor(e);if(!o)return;const i=Object.entries(o.links[o.default.toString()]),a=i.find((([,t])=>"application/x-mpegURL"===t.type))?.[1];return a?{url:this.decryptUrl(a.src)}:void 0}async getVideoId(t){return/\/(seria|video)\/([^/]+)\/([^/]+)\/([\d]+)p/.exec(t.pathname)?.[0]}},[$.patreon]:class extends bt{API_ORIGIN="https://www.patreon.com/api";async getPosts(t){try{const e=await this.fetch(`${this.API_ORIGIN}/posts/${t}?json-api-use-default-includes=false`);return await e.json()}catch(e){return a.error(`Failed to get patreon posts by postId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getPosts(t);if(!e)return;const o=e.data.attributes.post_file.url;return o?{url:o}:void 0}async getVideoId(t){const e=/posts\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e.replace(/[^\d.]/g,"")}},[$.reddit]:class extends bt{API_ORIGIN="https://www.reddit.com";async getContentUrl(t){if(!this.service.additionalData||"old"!==this.service.additionalData)return document.querySelector("shreddit-player-2")?.src;const e=document.querySelector("[data-hls-url]");return e?.dataset.hlsUrl?.replaceAll("&","&")}async getVideoData(t){try{const e=await this.getContentUrl(t);if(!e)throw new ft("Failed to find content url");return{url:decodeURIComponent(e)}}catch(e){return void a.error(`Failed to get reddit video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/\/r\/(([^/]+)\/([^/]+)\/([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[$.bannedvideo]:class extends bt{API_ORIGIN="https://api.banned.video";async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/graphql`,{method:"POST",body:JSON.stringify({operationName:"GetVideo",query:"query GetVideo($id: String!) {\n getVideo(id: $id) {\n title\n description: summary\n duration: videoDuration\n videoUrl: directUrl\n isStream: live\n }\n }",variables:{id:t}}),headers:{"User-Agent":"bannedVideoFrontEnd","apollographql-client-name":"banned-web","apollographql-client-version":"1.3","content-type":"application/json"}});return await e.json()}catch(e){return console.error(`Failed to get bannedvideo video info by videoId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getVideoInfo(t);if(!e)return;const{videoUrl:o,duration:i,isStream:a,description:n,title:r}=e.data.getVideo;return{url:o,duration:i,isStream:a,title:r,description:n}}async getVideoId(t){return t.searchParams.get("id")??void 0}},[$.kick]:class extends bt{API_ORIGIN="https://kick.com/api";async getClipInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v2/clips/${t}`),o=await e.json(),{clip_url:i,duration:a,title:n}=o.clip;return{url:i,duration:a,title:n}}catch(e){return void a.error(`Failed to get kick clip info by clipId: ${t}.`,e.message)}}async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v1/video/${t}`),o=await e.json(),{source:i,livestream:a}=o,{session_title:n,duration:r}=a;return{url:i,duration:Math.round(r/1e3),title:n}}catch(e){return void a.error(`Failed to get kick video info by videoId: ${t}.`,e.message)}}async getVideoData(t){return t.startsWith("videos")?await this.getVideoInfo(t.replace("videos/","")):await this.getClipInfo(t.replace("clips/",""))}async getVideoId(t){return/([^/]+)\/((videos|clips)\/([^/]+))/.exec(t.pathname)?.[2]}},[$.appledeveloper]:class extends bt{API_ORIGIN="https://developer.apple.com";async getVideoData(t){try{const t=document.querySelector("meta[property='og:video']")?.content;if(!t)throw new ft("Failed to find content url");return{url:t}}catch(e){return void a.error(`Failed to get apple developer video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/videos\/play\/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0]}},[$.epicgames]:class extends bt{API_ORIGIN="https://dev.epicgames.com/community/api/learning";async getPostInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/post.json?hash_id=${t}`);return await e.json()}catch(e){return a.error(`Failed to get epicgames post info by videoId: ${t}.`,e.message),!1}}getVideoBlock(){const t=/videoUrl\s?=\s"([^"]+)"?/,e=Array.from(document.body.querySelectorAll("script")).find((e=>t.exec(e.innerHTML)));if(!e)return;const o=e.innerHTML.trim(),i=t.exec(o)?.[1]?.replace("qsep://","https://");if(!i)return;let a=/sources\s?=\s(\[([^\]]+)\])?/.exec(o)?.[1];if(!a)return{playlistUrl:i,subtitles:[]};try{a=(a.replace(/src:(\s)+?(videoUrl)/g,'src:"removed"').substring(0,a.lastIndexOf("},"))+"]").split("\n").map((t=>t.replace(/([^\s]+):\s?(?!.*\1)/,'"$1":'))).join("\n");const t=JSON.parse(a);return{playlistUrl:i,subtitles:t.filter((t=>"captions"===t.type))}}catch{return{playlistUrl:i,subtitles:[]}}}async getVideoData(t){const e=await this.getPostInfo(t);if(!e)return;const o=this.getVideoBlock();if(!o)return;const{playlistUrl:i,subtitles:a}=o,{title:n,description:r}=e;return{url:i,title:n,description:r,subtitles:a.map((t=>({language:M(t.srclang),source:"epicgames",format:"vtt",url:t.src})))}}async getVideoId(t){return new Promise((t=>{const e="https://dev.epicgames.com";window.addEventListener("message",(o=>{if(o.origin===e&&"string"==typeof o.data&&o.data.startsWith("getVideoId:")){const e=o.data.replace("getVideoId:","");return t(e)}})),window.top.postMessage("getVideoId",e)}))}},[$.nineanimetv]:class extends bt{API_ORIGIN="https://9animetv.to/ajax/episode";RAPID_CLOUD_ORIGIN="https://rapid-cloud.co/ajax/embed-6-v2";async getSourceId(t){try{const e=await this.fetch(`${this.API_ORIGIN}/servers?episodeId=${t}`),o=await e.json();return!!o.html&&/data-id="(\d+)"/.exec(o.html)?.[1]}catch(e){return a.error(`Failed to get 9animetv servers info by episodeId: ${t}.`,e.message),!1}}async getPlayerLink(t){try{const e=await this.fetch(`${this.API_ORIGIN}/sources?id=${t}`),o=await e.json();return!!o.link.includes("rapid-cloud.co")&&o.link}catch(e){return a.error(`Failed to get player link by sourceId: ${t}.`,e.message),!1}}async getRapidCloudData(t){try{const e=await this.fetch(`${this.RAPID_CLOUD_ORIGIN}/getSources?id=${t}`),o=await e.json();return o.encrypted?(a.warn("Encrypted RapidCloud data found. Let us know about it",o),!1):o}catch(e){return a.error(`Failed to get rapid cloud data by rapidId: ${t}.`,e.message),!1}}async getVideoData(t){const e=t.split("?ep=")[1],o=await this.getSourceId(e);if(!o)return;const i=await this.getPlayerLink(o);if(!i)return;const a=/\/([^/?]+)\?/.exec(i)?.[1];if(!a)return;const n=await this.getRapidCloudData(a);if(!n)return;const r=n.sources.find((t=>"hls"===t.type))?.file;if(!r)return;const s=n.tracks.reduce(((t,e)=>{const o=/([\w+]+)(-\d)?\.vtt/.exec(e.file)?.[1];if(!o)return t;const i=M(3===o.length?o:e.label);return t.find((t=>t.language===i))||t.push({language:i,source:"nineanimetv",format:"vtt",url:e.file}),t}),[]);return{url:r,subtitles:s}}async getVideoId(t){return new Promise((t=>{const e="https://9animetv.to";window.addEventListener("message",(o=>{if(o.origin===e&&"string"==typeof o.data&&o.data.startsWith("getVideoId:")){const e=o.data.replace("getVideoId:","");return t(e)}})),window.top.postMessage("getVideoId",e)}))}},[$.odysee]:class extends bt{API_ORIGIN="https://odysee.com";async getVideoData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/${t}`),o=await e.text(),i=/"contentUrl":(\s)?"([^"]+)"/.exec(o)?.[2];if(!i)throw new Error("Odysee url doesn't parsed");return{url:i}}catch(e){return void a.error(`Failed to get odysee video data by video ID: ${t}`,e.message)}}async getVideoId(t){return t.pathname.slice(1)}},[$.coursehunterLike]:class extends bt{API_ORIGIN=this.origin??"https://coursehunter.net";async getCourseId(){const t=window.course_id;if(void 0!==t)return String(t);const e=document.querySelector('input[name="course_id"]');return e?e.value:void 0}async getLessonsData(t){const e=window.lessons;if(e?.length)return e;try{const e=await this.fetch(`${this.API_ORIGIN}/api/v1/course/${t}/lessons`);return await e.json()}catch(e){return void a.error(`Failed to get CoursehunterLike lessons data by courseId: ${t}, because ${e.message}`)}}getLessondId(t){let e=t.split("?lesson=")?.[1];if(e)return+e;const o=document.querySelector(".lessons-item_active");return e=o?.dataset?.index,e?+e:1}async getVideoData(t){const e=await this.getCourseId();if(!e)return;const o=await this.getLessonsData(e);if(!o)return;const i=this.getLessondId(t),a=o?.[i-1],{file:n,duration:r,title:s}=a;return n?{url:n,duration:r,title:s}:void 0}async getVideoId(t){const e=/course\/([^/]+)/.exec(t.pathname)?.[0];return e?e+t.search:void 0}},[$.twitch]:class extends bt{API_ORIGIN="https://clips.twitch.tv";async getClipLink(t,e){const o=document.querySelector("script[type='application/ld+json']"),i=t.slice(1);if(o){const t=JSON.parse(o.innerText),e=t["@graph"].find((t=>"VideoObject"===t["@type"]))?.creator.url;if(!e)throw new ft("Failed to find channel link");return`${e.replace("https://www.twitch.tv/","")}/clip/${i}`}const a="embed"===i,n=document.querySelector(a?".tw-link[data-test-selector='stream-info-card-component__stream-avatar-link']":".clips-player a:not([class])");if(!n)return;return`${n.href.replace("https://www.twitch.tv/","")}/clip/${a?e:i}`}async getVideoId(t){const e=t.pathname;if(/^m\.twitch\.tv$/.test(e))return/videos\/([^/]+)/.exec(t.href)?.[0]??e.slice(1);if(/^player\.twitch\.tv$/.test(t.hostname))return`videos/${t.searchParams.get("video")}`;const o=/([^/]+)\/(?:clip)\/([^/]+)/.exec(e);if(o)return o[0];return/^clips\.twitch\.tv$/.test(t.hostname)?await this.getClipLink(e,t.searchParams.get("clip")):/(?:videos)\/([^/]+)/.exec(e)?.[0]}},[$.sap]:class extends bt{API_ORIGIN="https://learning.sap.com/";async requestKaltura(t,e,o){try{const i=await this.fetch(`https://${t}/api_v3/service/multirequest`,{method:"POST",body:JSON.stringify({1:{service:"session",action:"startWidgetSession",widgetId:`_${e}`},2:{service:"baseEntry",action:"list",ks:"{1:result:ks}",filter:{redirectFromEntryId:o},responseProfile:{type:1,fields:"id,referenceId,name,description,dataUrl,duration,flavorParamsIds,type,dvrStatus,externalSourceType,createdAt,updatedAt,endDate,plays,views,downloadUrl,creatorId"}},3:{service:"baseEntry",action:"getPlaybackContext",entryId:"{2:result:objects:0:id}",ks:"{1:result:ks}",contextDataParams:{objectType:"KalturaContextDataParams",flavorTags:"all"}},apiVersion:"3.3.0",format:1,ks:"",clientTag:"html5:v3.17.22",partnerId:e}),headers:{"Content-Type":"application/json"}});return await i.json()}catch(t){return void a.error("Failed to request kaltura data",t.message)}}async getKalturaData(t){try{const e=document.querySelector('script[data-nscript="beforeInteractive"]');if(!e)throw new ft("Failed to find script element");const o=/https:\/\/([^"]+)\/p\/([^"]+)\/embedPlaykitJs\/uiconf_id\/([^"]+)/.exec(e?.src);if(!o)throw new ft(`Failed to get sap data for videoId: ${t}`);const[,i,a]=o;let n=document.querySelector("#shadow")?.firstChild?.getAttribute("id");if(!n){const t=document.querySelector("#__NEXT_DATA__");if(!t)throw new ft("Failed to find next data element");n=/"sourceId":\s?"([^"]+)"/.exec(t.innerText)?.[1]}if(!i||Number.isNaN(+a)||!n)throw new ft(`One of the necessary parameters for getting a link to a sap video in wasn't found for ${t}. Params: kalturaDomain = ${i}, partnerId = ${a}, entryId = ${n}`);return await this.requestKaltura(i,a,n)}catch(t){return void a.error("Failed to get kaltura data",t.message)}}async getVideoData(t){const e=await this.getKalturaData(t);if(!e)return;const[,o,i]=e,{duration:a}=o.objects[0],n=i.sources.find((t=>"url"===t.format&&"http,https"===t.protocols&&t.url.includes(".mp4")))?.url;if(!n)return;return{url:n,subtitles:i.playbackCaptions.map((t=>({language:M(t.languageCode),source:"sap",format:"vtt",url:t.webVttUrl,isAutoGenerated:t.label.includes("auto-generated")}))),duration:a}}async getVideoId(t){return/((courses|learning-journeys)\/([^/]+)(\/[^/]+)?)/.exec(t.pathname)?.[1]}},[$.linkedin]:yt,[$.vimeo]:class extends bt{API_KEY="";DEFAULT_SITE_ORIGIN="https://vimeo.com";SITE_ORIGIN=this.isPrivatePlayer()?this.service?.url?.slice(0,-1)??this.DEFAULT_SITE_ORIGIN:this.DEFAULT_SITE_ORIGIN;isErrorData(t){return Object.hasOwn(t,"error")}isPrivatePlayer(){return this.referer&&!this.referer.includes("vimeo.com")}async getViewerData(){try{const t=await this.fetch("https://vimeo.com/_next/viewer"),e=await t.json(),{apiUrl:o,jwt:i}=e;return this.API_ORIGIN=`https://${o}`,this.API_KEY=`jwt ${i}`,e}catch(t){return a.error("Failed to get default viewer data.",t.message),!1}}async getVideoInfo(t){try{const e=new URLSearchParams({fields:"name,link,description,duration"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return a.error(`Failed to get video info by video ID: ${t}`,e.message),!1}}async getPrivateVideoSource(t){try{const{default_cdn:e,cdns:o}=t.dash,i=o[e].url,a=await this.fetch(i);if(200!==a.status)throw new ft(await a.text());const n=await a.json(),r=new URL(i),s=Array.from(n.base_url.matchAll(/\.\.\//g)).length+1,l=r.pathname.split("/");let d=n.base_url.replaceAll("../","");d=d&&!d.startsWith("/")?`/${d}`:d,r.pathname=l.slice(0,l.length-s).join("/")+d,r.pathname.endsWith("/")||(r.pathname+="/");const u=n.audio.find((t=>"audio/mp4"===t.mime_type&&"dash"===t.format));if(!u)throw new ft("Failed to find video data");const c=u.segments?.[0]?.url;if(!c)throw new ft("Failed to find first segment url");const[h,p]=c.split("?",2),g=new URLSearchParams(p);return g.delete("range"),r.pathname+=`${u.base_url}${h}`,r.href=r.href.split("?")[0]+"?"+g.toString(),r.href}catch(t){return a.error("Failed to get private video source",t.message),!1}}async getPrivateVideoInfo(t){try{if("undefined"==typeof playerConfig)return;const e=playerConfig,o=await this.getPrivateVideoSource(e.request.files);if(!o)throw new ft("Failed to get private video source");const{video:{title:i,duration:a},request:{text_tracks:n}}=e;return{url:`${this.SITE_ORIGIN}/${t}`,video_url:o,title:i,duration:a,subs:n}}catch(e){return a.error(`Failed to get private video info by video ID: ${t}`,e.message),!1}}async getSubsInfo(t){try{const e=new URLSearchParams({per_page:"100",fields:"language,type,link"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}/texttracks?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return a.error(`Failed to get subtitles info by video ID: ${t}`,e.message),!1}}async getVideoData(t){const e=this.isPrivatePlayer();if(!this.extraInfo)return this.returnBaseData(t);if(e){const e=await this.getPrivateVideoInfo(t);if(!e)return;const{url:o,subs:i,video_url:a,title:n,duration:r}=e,s=i.map((t=>({language:M(t.lang),source:"vimeo",format:"vtt",url:this.SITE_ORIGIN+t.url,isAutoGenerated:t.lang.includes("autogenerated")}))),l=s.length?[{target:"video_file_url",targetUrl:a},{target:"subtitles_file_url",targetUrl:s[0].url}]:null;return{...l?{url:o,translationHelp:l}:{url:a},subtitles:s,title:n,duration:r}}t.startsWith("video/")&&(t=t.replace("video/","")),t.includes("/")&&(t=t.replace("/",":"));if(!await this.getViewerData())return this.returnBaseData(t);const o=await this.getVideoInfo(t);if(!o)return this.returnBaseData(t);const i=await this.getSubsInfo(t),a=i?i.data.map((t=>({language:M(t.language),source:"vimeo",format:"vtt",url:t.link,isAutoGenerated:t.language.includes("autogen")}))):[],{link:n,duration:r,name:s,description:l}=o;return{url:n,title:s,description:l,subtitles:a,duration:r}}async getVideoId(t){const e=/[^/]+\/[^/]+$/.exec(t.pathname)?.[0];return this.isPrivatePlayer()?e:e?.startsWith("video/")?e.replace("video/",""):e??/[^/]+$/.exec(t.pathname)?.[0]}},[$.yandexdisk]:class extends bt{API_ORIGIN=window.location.origin;CLIENT_PREFIX="/client/disk";INLINE_PREFIX="/i/";DISK_PREFIX="/d/";isErrorData(t){return Object.hasOwn(t,"error")}async getClientVideoData(t){const e=new URL(window.location.href).searchParams.get("idDialog");if(!e)return;const o=document.querySelector("#preloaded-data");if(o)try{const t=JSON.parse(o.innerText),{idClient:i,sk:a}=t.config,n=await this.fetch(this.API_ORIGIN+"/models/?_m=resource",{method:"POST",body:new URLSearchParams({idClient:i,sk:a,"_model.0":"resource","id.0":e.replaceAll(" ","+")}).toString().replaceAll(/%2B/g,"+"),headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}),r=await n.json();if(!r.models)throw new ft("Failed to get resource info");const s=r.models[0].data;if(this.isErrorData(s))throw new ft(s.error?.message);const{meta:{short_url:l,video_info:d},name:u}=s;if(!d)throw new ft("There's no video open right now");if(!l)throw new ft("Access to the video is limited");const c=this.clearTitle(u);return{url:l,title:c,duration:Math.round(d.duration/1e3)}}catch(e){return void a.error(`Failed to get yandex disk video data by video ID: ${t}, because ${e.message}`)}}clearTitle(t){return t.replace(/(\.[^.]+)$/,"")}getBodyHash(t,e){const o=JSON.stringify({hash:t,sk:e});return encodeURIComponent(o)}async fetchList(t,e){const o=this.getBodyHash(t,e),i=await this.fetch(this.API_ORIGIN+"/public/api/fetch-list",{method:"POST",body:o}),a=await i.json();if(Object.hasOwn(a,"error"))throw new ft("Failed to fetch folder list");return a.resources}async getDownloadUrl(t,e){const o=this.getBodyHash(t,e),i=await this.fetch(this.API_ORIGIN+"/public/api/download-url",{method:"POST",body:o}),a=await i.json();if(a.error)throw new ft("Failed to get download url");return a.data.url}async getDiskVideoData(t){try{const e=document.getElementById("store-prefetch");if(!e)throw new ft("Failed to get prefetch data");const o=t.split("/").slice(3);if(!o.length)throw new ft("Failed to find video file path");const i=JSON.parse(e.innerText),{resources:a,rootResourceId:n,environment:{sk:r}}=i,s=a[n],l=o.length-1,d=o.filter(((t,e)=>e!==l)).join("/");let u=Object.values(a);d.includes("/")&&(u=await this.fetchList(`${s.hash}:/${d}`,r));const c=u.find((t=>t.name===o[l]));if(!c)throw new ft("Failed to find resource");if(c&&"dir"===c.type)throw new ft("Path is dir, but expected file");const{meta:{short_url:h,mediatype:p,videoDuration:g},path:m,name:v}=c;if("video"!==p)throw new ft("Resource isn't a video");const f=this.clearTitle(v),b=Math.round(g/1e3);if(h)return{url:h,duration:b,title:f};const y=await this.getDownloadUrl(m,r);return{url:E(new URL(y)),duration:b,title:f}}catch(e){return void a.error(`Failed to get yandex disk video data by disk video ID: ${t}`,e.message)}}async getVideoData(t){return t.startsWith(this.INLINE_PREFIX)?{url:this.service.url+t.slice(1)}:(t=decodeURIComponent(t)).startsWith(this.CLIENT_PREFIX)?await this.getClientVideoData(t):await this.getDiskVideoData(t)}async getVideoId(t){if(t.pathname.startsWith(this.CLIENT_PREFIX))return t.pathname+t.search;const e=/\/i\/([^/]+)/.exec(t.pathname)?.[0];return e||(/\/d\/([^/]+)\/([^/]+)/.exec(t.pathname)?t.pathname:void 0)}},[$.vk]:wt,[$.trovo]:class extends bt{async getVideoId(t){const e=t.searchParams.get("vid"),o=/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0];if(e&&o)return`${o}?vid=${e}`}},[$.incestflix]:class extends bt{async getVideoData(t){try{const t=document.querySelector("#incflix-stream source:first-of-type");if(!t)throw new ft("Failed to find source element");const e=t.getAttribute("src");if(!e)throw new ft("Failed to find source link");const o=new URL(e.startsWith("//")?`https:${e}`:e);return o.searchParams.append("media-proxy","video.mp4"),{url:E(o)}}catch(e){return void a.error(`Failed to get Incestflix data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[$.porntn]:class extends bt{async getVideoData(t){try{if("undefined"==typeof flashvars)return;const{rnd:t,video_url:e,video_title:o}=flashvars;if(!e||!t)throw new ft("Failed to find video source or rnd");const i=new URL(e);i.searchParams.append("rnd",t),a.log("PornTN get_file link",i.href);const n=await this.fetch(i.href,{method:"head"}),r=new URL(n.url);a.log("PornTN cdn link",r.href);return{url:E(r),title:o}}catch(e){return void a.error(`Failed to get PornTN data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/videos\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[$.googledrive]:class extends bt{getPlayerData(){const t=document.querySelector("#movie_player");return t?.getVideoData?.call()??void 0}async getVideoId(t){return this.getPlayerData()?.video_id}},[$.bilibili]:class extends bt{async getVideoId(t){const e=/bangumi\/play\/([^/]+)/.exec(t.pathname)?.[0];if(e)return e;const o=t.searchParams.get("bvid");if(o)return`video/${o}`;let i=/video\/([^/]+)/.exec(t.pathname)?.[0];return i&&null!==t.searchParams.get("p")&&(i+=`/?p=${t.searchParams.get("p")}`),i}},[$.xvideos]:class extends bt{async getVideoId(t){return/[^/]+\/[^/]+$/.exec(t.pathname)?.[0]}},[$.watchpornto]:class extends bt{async getVideoId(t){return/(video|embed)\/(\d+)(\/[^/]+\/)?/.exec(t.pathname)?.[0]}},[$.archive]:class extends bt{async getVideoId(t){return/(details|embed)\/([^/]+)/.exec(t.pathname)?.[2]}},[$.dailymotion]:class extends bt{async getVideoId(t){const e=Array.from(document.querySelectorAll("*")).filter((t=>t.innerHTML.trim().includes(".m3u8"))),o=e?.[1]?.lastChild?.src;return o?/\/video\/(\w+)\.m3u8/.exec(o)?.[1]:void 0}},[$.youku]:class extends bt{async getVideoId(t){return/v_show\/id_[\w=]+/.exec(t.pathname)?.[0]}},[$.egghead]:class extends bt{async getVideoId(t){return t.pathname.slice(1)}},[$.newgrounds]:class extends bt{async getVideoId(t){return/([^/]+)\/(view)\/([^/]+)/.exec(t.pathname)?.[0]}},[$.okru]:class extends bt{async getVideoId(t){return/\/video\/(\d+)/.exec(t.pathname)?.[1]}},[$.peertube]:class extends bt{async getVideoId(t){return/\/w\/([^/]+)/.exec(t.pathname)?.[0]}},[$.eporner]:class extends bt{async getVideoId(t){return/video-([^/]+)\/([^/]+)/.exec(t.pathname)?.[0]}},[$.bitchute]:class extends bt{async getVideoId(t){return/(video|embed)\/([^/]+)/.exec(t.pathname)?.[2]}},[$.rutube]:class extends bt{async getVideoId(t){return/(?:video|embed)\/([^/]+)/.exec(t.pathname)?.[1]}},[$.facebook]:class extends bt{async getVideoId(t){return t.pathname.slice(1)}},[$.rumble]:class extends bt{async getVideoId(t){return t.pathname.slice(1)}},[$.twitter]:class extends bt{async getVideoId(t){const e=/status\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e;const o=this.video?.closest('[data-testid="tweet"]'),i=o?.querySelector('a[role="link"][aria-label]')?.href;return i?/status\/([^/]+)/.exec(i)?.[1]:void 0}},[$.pornhub]:class extends bt{async getVideoId(t){return t.searchParams.get("viewkey")??/embed\/([^/]+)/.exec(t.pathname)?.[1]}},[$.tiktok]:xt,[$.proxitok]:xt,[$.nine_gag]:class extends bt{async getVideoId(t){return/gag\/([^/]+)/.exec(t.pathname)?.[1]}},[$.youtube]:St,[$.ricktube]:St,[$.invidious]:St,[$.poketube]:St,[$.piped]:St,[$.dzen]:class extends bt{async getVideoId(t){return/video\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[$.cloudflarestream]:class extends bt{async getVideoId(t){return t.pathname+t.search}},[$.loom]:class extends bt{getClientVersion(){if("undefined"==typeof SENTRY_RELEASE)return;const t=SENTRY_RELEASE;return t?.id}getDefault(t){if(this.service)return{url:this.service.url+t,duration:void 0}}async getVideoData(t){try{const o=this.getClientVersion();if(!o)throw new ft("Failed to get client version");const i=await this.fetch("https://www.loom.com/graphql",{headers:{"User-Agent":e.userAgent,"content-type":"application/json","x-loom-request-source":`loom_web_${o}`,"apollographql-client-name":"web","apollographql-client-version":o,"Alt-Used":"www.loom.com"},body:`{"operationName":"FetchCaptions","variables":{"videoId":"${t}"},"query":"query FetchCaptions($videoId: ID!, $password: String) {\\n fetchVideoTranscript(videoId: $videoId, password: $password) {\\n ... on VideoTranscriptDetails {\\n id\\n captions_source_url\\n language\\n __typename\\n }\\n ... on GenericError {\\n message\\n __typename\\n }\\n __typename\\n }\\n}"}`,method:"POST"});if(200!==i.status)throw new ft("Failed to get data from graphql");const a=(await i.json()).data.fetchVideoTranscript;if("GenericError"===a.__typename)throw new ft(a.message);return{url:this.service.url+t,subtitles:[{format:"vtt",language:M(a.language),source:"loom",url:a.captions_source_url}]}}catch(e){return a.error(`Failed to get Loom video data, because: ${e.message}`),this.getDefault(t)}}async getVideoId(t){return/(embed|share)\/([^/]+)?/.exec(t.pathname)?.[2]}},[mt.udemy]:class extends bt{API_ORIGIN="https://www.udemy.com/api-2.0";getModuleData(){const t=document.querySelector(".ud-app-loader[data-module-id='course-taking']"),e=t?.dataset?.moduleArgs;if(e)return JSON.parse(e)}getLectureId(){return/learn\/lecture\/([^/]+)/.exec(window.location.pathname)?.[1]}async getLectureData(t,e){try{const o=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}/lectures/${e}/?`+new URLSearchParams({"fields[lecture]":"title,description,asset","fields[asset]":"length,media_sources,captions"}).toString());return await o.json()}catch(o){return void a.error(`Failed to get lecture data by courseId: ${t} and lectureId: ${e}`,o.message)}}async getCourseLang(t){try{const e=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}?`+new URLSearchParams({"fields[course]":"locale"}).toString());return await e.json()}catch(e){return void a.error(`Failed to get course lang by courseId: ${t}`,e.message)}}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>M(t.locale_id)===e));return o||(o=t?.find((t=>"en"===M(t.locale_id)))??t?.[0]),o?.url}async getVideoData(t){const e=this.getModuleData();if(!e)return;const{courseId:o}=e,i=this.getLectureId();if(a.log(`[Udemy] courseId: ${o}, lectureId: ${i}`),!i)return;const n=await this.getLectureData(o,i);if(!n)return;const{title:r,description:s,asset:l}=n,{length:d,media_sources:u,captions:c}=l,h=this.findVideoUrl(u);if(!h)return void a.log("Failed to find .mp4 video file in media_sources",u);let p="en";const g=await this.getCourseLang(o);if(g){const{locale:{locale:t}}=g;p=t?M(t):p}kt.includes(p)||(p="en");const m=this.findSubtitleUrl(c,p);return m||a.log("Failed to find subtitle file in captions",c),{...m?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:m},{target:"video_file_url",targetUrl:h}],detectedLanguage:p}:{url:h,translationHelp:null},duration:d,title:r,description:s}}async getVideoId(t){return t.pathname.slice(1)}},[mt.coursera]:class extends bt{API_ORIGIN="https://www.coursera.org/api";async getCourseData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/onDemandCourses.v1/${t}`),o=await e.json();return o?.elements?.[0]}catch(e){return void a.error(`Failed to get course data by courseId: ${t}`,e.message)}}getPlayer(){return document.querySelector(".vjs-v8")}getPlayerData(){return this.getPlayer()?.player}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>M(t.srclang)===e));return o||(o=t?.find((t=>"en"===M(t.srclang)))||t?.[0]),o?.src}async getVideoData(t){const e=this.getPlayerData();if(!e)return void a.error("Failed to find player data");const{cache_:{duration:o},options_:{courseId:i,tracks:n,sources:r}}=e,s=this.findVideoUrl(r);if(!s)return void a.error("Failed to find .mp4 video file in sources",r);let l="en";const d=await this.getCourseData(i);if(d){const{primaryLanguageCodes:[t]}=d;l=t?M(t):"en"}kt.includes(l)||(l="en");const u=this.findSubtitleUrl(n,l);return u||a.warn("Failed to find subtitle file in tracks",n),{...u?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:u},{target:"video_file_url",targetUrl:s}]}:{url:s,translationHelp:null},detectedLanguage:l,duration:o}}async getVideoId(t){return/learn\/([^/]+)\/lecture\/([^/]+)/.exec(t.pathname)?.[0]}},[mt.douyin]:class extends bt{getPlayer(){if("undefined"!=typeof player)return player}async getVideoData(t){const e=this.getPlayer();if(!e)return;const{url:o,duration:i,lang:a,isLive:n}=e.config;if(!o)return;const r=o.find((t=>t.src.includes("www.douyin.com/aweme/v1/play/")));return r?{url:E(r.src),duration:i,isStream:n,...kt.includes(a)?{detectedLanguage:a}:{}}:void 0}async getVideoId(t){const e=/video\/([\d]+)/.exec(t.pathname)?.[0];if(e)return e;const o=this.getPlayer();return o?o.config.vid:void 0}},[mt.artstation]:class extends bt{API_ORIGIN="https://www.artstation.com/api/v2/learning";getCSRFToken(){return document.querySelector('meta[name="public-csrf-token"]')?.content}async getCourseInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/courses/${t}/autoplay.json`,{method:"POST",headers:{"PUBLIC-CSRF-TOKEN":this.getCSRFToken()}});return await e.json()}catch(e){return a.error(`Failed to get artstation course info by courseId: ${t}.`,e.message),!1}}async getVideoUrl(t){try{const e=await this.fetch(`${this.API_ORIGIN}/quicksilver/video_url.json?chapter_id=${t}`);return(await e.json()).url.replace("qsep://","https://")}catch(e){return a.error(`Failed to get artstation video url by chapterId: ${t}.`,e.message),!1}}async getVideoData(t){const[,e,,,o]=t.split("/"),i=await this.getCourseInfo(e);if(!i)return;const a=i.chapters.find((t=>t.hash_id===o));if(!a)return;const n=await this.getVideoUrl(a.id);if(!n)return;const{title:r,duration:s,subtitles:l}=a;return{url:n,title:r,duration:s,subtitles:l.filter((t=>"vtt"===t.format)).map((t=>({language:M(t.locale),source:"artstation",format:"vtt",url:t.file_url})))}}async getVideoId(t){return/courses\/(\w{3,5})\/([^/]+)\/chapters\/(\w{3,5})/.exec(t.pathname)?.[0]}}};class Lt{helpersData;constructor(t={}){this.helpersData=t}getHelper(t){return new Pt[t](this.helpersData)}}async function At(t,e={}){const o=new URL(window.location.href),i=t.host;if(Object.keys(Pt).includes(i)){const t=new Lt(e).getHelper(i);return await t.getVideoId(o)}return i===$.custom?o.href:void 0}function _t(t,e=","){const o=t/1e3,i=Math.floor(o/3600),a=Math.floor(o%3600/60),n=Math.floor(o%60),r=Math.floor(t%1e3);return`${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}${e}${r.toString().padStart(3,"0")}`}function Vt(t){const e=t.split(" ")?.[0]?.split(":");e.length<3&&e.unshift("00");const[o,i,a]=e;return 36e5*+o+6e4*+i+ +a.replace(/[,.]/,"")}function Ot(t,e="srt"){const o="vtt"===e,i=o?".":",",a=t.subtitles.map(((t,e)=>(o?"":`${e+1}\n`)+`${_t(t.startMs,i)} --\x3e ${_t(t.startMs+t.durationMs,i)}\n${t.text}\n\n`)).join("").trim();return o?`WEBVTT\n\n${a}`:a}function Mt(t,e="srt"){const o=function(t){return"string"!=typeof t?"json":/^(WEBVTT)(\r?\n)/.exec(t)?"vtt":"srt"}(t);return o===e?t:"json"===o?Ot(t,e):(t=function(t,e="srt"){const o=t.split(/\r?\n\r?\n/g);"vtt"===e&&o.shift(),/^\d+\r?\n/.exec(o?.[0]??"")&&(e="srt");const i=+("srt"===e);return{containsTokens:!1,subtitles:o.reduce(((t,e)=>{const o=e.trim().split("\n"),a=o[i],n=o.slice(i+1).join("\n");if(!(2===o.length&&e.includes(" --\x3e ")||a?.includes(" --\x3e ")))return 0===t.length||(t[t.length-1].text+=`\n\n${o.join("\n")}`),t;const[r,s]=a.split(" --\x3e "),l=Vt(r),d=Vt(s)-l;return t.push({text:n,startMs:l,durationMs:d,speakerId:"0"}),t}),[])}}(t,o),"json"===e?t:Ot(t,e))}const Et=globalThis,Bt=Et.trustedTypes,Nt=Bt?Bt.createPolicy("lit-html",{createHTML:t=>t}):void 0,Rt="$lit$",$t=`lit$${Math.random().toFixed(9).slice(2)}$`,Dt="?"+$t,Ft=`<${Dt}>`,qt=document,Ut=()=>qt.createComment(""),zt=t=>null===t||"object"!=typeof t&&"function"!=typeof t,Ht=Array.isArray,Wt=t=>Ht(t)||"function"==typeof t?.[Symbol.iterator],jt="[ \t\n\f\r]",Gt=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Yt=/-->/g,Jt=/>/g,Kt=RegExp(`>|${jt}(?:([^\\s"'>=/]+)(${jt}*=${jt}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),Zt=/'/g,Xt=/"/g,Qt=/^(?:script|style|textarea|title)$/i,te=t=>(e,...o)=>({_$litType$:t,strings:e,values:o}),ee=te(1),oe=te(2),ie=(te(3),Symbol.for("lit-noChange")),ae=Symbol.for("lit-nothing"),ne=new WeakMap,re=qt.createTreeWalker(qt,129);function se(t,e){if(!Ht(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==Nt?Nt.createHTML(e):e}const le=(t,e)=>{const o=t.length-1,i=[];let a,n=2===e?"":3===e?"":"",r=Gt;for(let e=0;e"===l[0]?(r=a??Gt,d=-1):void 0===l[1]?d=-2:(d=r.lastIndex-l[2].length,s=l[1],r=void 0===l[3]?Kt:'"'===l[3]?Xt:Zt):r===Xt||r===Zt?r=Kt:r===Yt||r===Jt?r=Gt:(r=Kt,a=void 0);const c=r===Kt&&t[e+1].startsWith("/>")?" ":"";n+=r===Gt?o+Ft:d>=0?(i.push(s),o.slice(0,d)+Rt+o.slice(d)+$t+c):o+$t+(-2===d?e:c)}return[se(t,n+(t[o]||"")+(2===e?"":3===e?"":"")),i]};class de{constructor({strings:t,_$litType$:e},o){let i;this.parts=[];let a=0,n=0;const r=t.length-1,s=this.parts,[l,d]=le(t,e);if(this.el=de.createElement(l,o),re.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(i=re.nextNode())&&s.length0){i.textContent=Bt?Bt.emptyScript:"";for(let o=0;o2||""!==o[0]||""!==o[1]?(this._$AH=Array(o.length-1).fill(new String),this.strings=o):this._$AH=ae}_$AI(t,e=this,o,i){const a=this.strings;let n=!1;if(void 0===a)t=ue(this,t,e,0),n=!zt(t)||t!==this._$AH&&t!==ie,n&&(this._$AH=t);else{const i=t;let r,s;for(t=a[0],r=0;r{const i=o?.renderBefore??e;let a=i._$litPart$;if(void 0===a){const t=o?.renderBefore??null;i._$litPart$=a=new he(e.insertBefore(Ut(),t),t,void 0,o??{})}return a._$AI(t),a};function we(t){return String(t).split("").map((t=>t.charCodeAt(0)))}function xe(t){return new Uint8Array(we(t))}function Se(t){const e=new ArrayBuffer(2*t.length),o=new Uint8Array(e);return new Uint16Array(e).set(we(t)),o}function ke(t){const e=255;return[t>>>24&e,t>>>16&e,t>>>8&e,t&e]}function Te(t){return 11+t}function Ce(t,e,o,i){return 11+e+1+1+(i?2+2*(o+1):o+1)+t}function Ie(t){let e=0;return t.forEach((t=>{e+=2+2*t[0].length+2+2+2*t[1].length+2})),11+e}function Pe(t,e){const o=2*e;let i=0;return t.forEach((t=>{i+=2+2*t[0].length+2+4})),18+o+2+i}class Le{_setIntegerFrame(t,e){const o=parseInt(e,10);this.frames.push({name:t,value:o,size:Te(o.toString().length)})}_setStringFrame(t,e){const o=e.toString();let i=13+2*o.length;"TDAT"===t&&(i=Te(o.length)),this.frames.push({name:t,value:o,size:i})}_setPictureFrame(t,e,o,i){const a=function(t){if(!t||!t.length)return null;if(255===t[0]&&216===t[1]&&255===t[2])return"image/jpeg";if(137===t[0]&&80===t[1]&&78===t[2]&&71===t[3])return"image/png";if(71===t[0]&&73===t[1]&&70===t[2])return"image/gif";if(87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])return"image/webp";const e=73===t[0]&&73===t[1]&&42===t[2]&&0===t[3],o=77===t[0]&&77===t[1]&&0===t[2]&&42===t[3];return e||o?"image/tiff":66===t[0]&&77===t[1]?"image/bmp":0===t[0]&&0===t[1]&&1===t[2]&&0===t[3]?"image/x-icon":null}(new Uint8Array(e)),n=o.toString();if(!a)throw new Error("Unknown picture MIME type");o||(i=!1),this.frames.push({name:"APIC",value:e,pictureType:t,mimeType:a,useUnicodeEncoding:i,description:n,size:Ce(e.byteLength,a.length,n.length,i)})}_setLyricsFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"USLT",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setCommentFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"COMM",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setPrivateFrame(t,e){const o=t.toString();var i,a;this.frames.push({name:"PRIV",value:e,id:o,size:(i=o.length,a=e.byteLength,10+i+1+a)})}_setUserStringFrame(t,e){const o=t.toString(),i=e.toString();var a,n;this.frames.push({name:"TXXX",description:o,value:i,size:(a=o.length,n=i.length,13+2*a+2+2+2*n)})}_setUrlLinkFrame(t,e){const o=e.toString();var i;this.frames.push({name:t,value:o,size:(i=o.length,10+i)})}_setPairedTextFrame(t,e){this.frames.push({name:t,value:e,size:Ie(e)})}_setSynchronisedLyricsFrame(t,e,o,i,a){const n=a.toString(),r=i.split("").map((t=>t.charCodeAt(0)));this.frames.push({name:"SYLT",value:e,language:r,description:n,type:t,timestampFormat:o,size:Pe(e,n.length)})}constructor(t){if(!t||"object"!=typeof t||!("byteLength"in t))throw new Error("First argument should be an instance of ArrayBuffer or Buffer");this.arrayBuffer=t,this.padding=4096,this.frames=[],this.url=""}setFrame(t,e){switch(t){case"TPE1":case"TCOM":case"TCON":{if(!Array.isArray(e))throw new Error(`${t} frame value should be an array of strings`);const o="TCON"===t?";":"/",i=e.join(o);this._setStringFrame(t,i);break}case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TMED":case"TPUB":case"TCOP":case"TKEY":case"TEXT":case"TDAT":case"TSRC":this._setStringFrame(t,e);break;case"TBPM":case"TLEN":case"TYER":this._setIntegerFrame(t,e);break;case"USLT":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("lyrics"in e))throw new Error("USLT frame value should be an object with keys description and lyrics");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setLyricsFrame(e.language,e.description,e.lyrics);break;case"APIC":if("object"!=typeof e||!("type"in e)||!("data"in e)||!("description"in e))throw new Error("APIC frame value should be an object with keys type, data and description");if(e.type<0||e.type>20)throw new Error("Incorrect APIC frame picture type");this._setPictureFrame(e.type,e.data,e.description,!!e.useUnicodeEncoding);break;case"TXXX":if("object"!=typeof e||!("description"in e)||!("value"in e))throw new Error("TXXX frame value should be an object with keys description and value");this._setUserStringFrame(e.description,e.value);break;case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":this._setUrlLinkFrame(t,e);break;case"COMM":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("text"in e))throw new Error("COMM frame value should be an object with keys description and text");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setCommentFrame(e.language,e.description,e.text);break;case"PRIV":if("object"!=typeof e||!("id"in e)||!("data"in e))throw new Error("PRIV frame value should be an object with keys id and data");this._setPrivateFrame(e.id,e.data);break;case"IPLS":if(!Array.isArray(e)||!Array.isArray(e[0]))throw new Error("IPLS frame value should be an array of pairs");this._setPairedTextFrame(t,e);break;case"SYLT":if("object"!=typeof e||!("type"in e)||!("text"in e)||!("timestampFormat"in e))throw new Error("SYLT frame value should be an object with keys type, text and timestampFormat");if(!Array.isArray(e.text)||!Array.isArray(e.text[0]))throw new Error("SYLT frame text value should be an array of pairs");if(e.type<0||e.type>6)throw new Error("Incorrect SYLT frame content type");if(e.timestampFormat<1||e.timestampFormat>2)throw new Error("Incorrect SYLT frame time stamp format");e.language=e.language||"eng",e.description=e.description||"",this._setSynchronisedLyricsFrame(e.type,e.text,e.timestampFormat,e.language,e.description);break;default:throw new Error(`Unsupported frame ${t}`)}return this}removeTag(){if(this.arrayBuffer.byteLength<10)return;const t=new Uint8Array(this.arrayBuffer),e=t[3],o=((i=[t[6],t[7],t[8],t[9]])[0]<<21)+(i[1]<<14)+(i[2]<<7)+i[3]+10;var i,a;73!==(a=t)[0]||68!==a[1]||51!==a[2]||e<2||e>4||(this.arrayBuffer=new Uint8Array(t.subarray(o)).buffer)}addTag(){this.removeTag();const t=[255,254],e=10+this.frames.reduce(((t,e)=>t+e.size),0)+this.padding,o=new ArrayBuffer(this.arrayBuffer.byteLength+e),i=new Uint8Array(o);let a=0,n=[];return n=[73,68,51,3],i.set(n,a),a+=n.length,a++,a++,n=function(t){const e=127;return[t>>>21&e,t>>>14&e,t>>>7&e,t&e]}(e-10),i.set(n,a),a+=n.length,this.frames.forEach((e=>{switch(n=xe(e.name),i.set(n,a),a+=n.length,n=ke(e.size-10),i.set(n,a),a+=n.length,a+=2,e.name){case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":n=xe(e.value),i.set(n,a),a+=n.length;break;case"TPE1":case"TCOM":case"TCON":case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TKEY":case"TMED":case"TPUB":case"TCOP":case"TEXT":case"TSRC":n=[1].concat(t),i.set(n,a),a+=n.length,n=Se(e.value),i.set(n,a),a+=n.length;break;case"TXXX":case"USLT":case"COMM":n=[1],"USLT"!==e.name&&"COMM"!==e.name||(n=n.concat(e.language)),n=n.concat(t),i.set(n,a),a+=n.length,n=Se(e.description),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=Se(e.value),i.set(n,a),a+=n.length;break;case"TBPM":case"TLEN":case"TDAT":case"TYER":a++,n=xe(e.value),i.set(n,a),a+=n.length;break;case"PRIV":n=xe(e.id),i.set(n,a),a+=n.length,a++,i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"APIC":n=[e.useUnicodeEncoding?1:0],i.set(n,a),a+=n.length,n=xe(e.mimeType),i.set(n,a),a+=n.length,n=[0,e.pictureType],i.set(n,a),a+=n.length,e.useUnicodeEncoding?(n=[].concat(t),i.set(n,a),a+=n.length,n=Se(e.description),i.set(n,a),a+=n.length,a+=2):(n=xe(e.description),i.set(n,a),a+=n.length,a++),i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"IPLS":n=[1],i.set(n,a),a+=n.length,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=Se(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=Se(e[1].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length}));break;case"SYLT":n=[1].concat(e.language).concat(e.timestampFormat).concat(e.type),i.set(n,a),a+=n.length,n=[].concat(t),i.set(n,a),a+=n.length,n=Se(e.description),i.set(n,a),a+=n.length,a+=2,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=Se(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length,n=ke(e[1]),i.set(n,a),a+=n.length}))}})),a+=this.padding,i.set(new Uint8Array(this.arrayBuffer),a),this.arrayBuffer=o,o}getBlob(){return new Blob([this.arrayBuffer],{type:"audio/mpeg"})}getURL(){return this.url||(this.url=URL.createObjectURL(this.getBlob())),this.url}revokeURL(){URL.revokeObjectURL(this.url)}}const Ae={version:"1.0.3",debug:!1,fetchFn:fetch.bind(window)};class _e{constructor(){this._vector=new Float32Array,this._position=0,this._frameCount=0}get vector(){return this._vector}get position(){return this._position}get startIndex(){return 2*this._position}get frameCount(){return this._frameCount}get endIndex(){return 2*(this._position+this._frameCount)}clear(){this.receive(this._frameCount),this.rewind()}put(t){this._frameCount+=t}putSamples(t,e,o=0){const i=2*(e=e||0);o>=0||(o=(t.length-i)/2);const a=2*o;this.ensureCapacity(o+this._frameCount);const n=this.endIndex;this.vector.set(t.subarray(i,i+a),n),this._frameCount+=o}putBuffer(t,e,o=0){e=e||0,o>=0||(o=t.frameCount-e),this.putSamples(t.vector,t.position+e,o)}receive(t){t>=0&&!(t>this._frameCount)||(t=this.frameCount),this._frameCount-=t,this._position+=t}receiveSamples(t,e=0){const o=2*e,i=this.startIndex;t.set(this._vector.subarray(i,i+o)),this.receive(e)}extract(t,e=0,o=0){const i=this.startIndex+2*e,a=2*o;t.set(this._vector.subarray(i,i+a))}ensureCapacity(t=0){const e=parseInt(2*t);if(this._vector.length0&&(this._vector.set(this._vector.subarray(this.startIndex,this.endIndex)),this._position=0)}}class Ve{constructor(t){t?(this._inputBuffer=new _e,this._outputBuffer=new _e):this._inputBuffer=this._outputBuffer=null}get inputBuffer(){return this._inputBuffer}set inputBuffer(t){this._inputBuffer=t}get outputBuffer(){return this._outputBuffer}set outputBuffer(t){this._outputBuffer=t}clear(){this._inputBuffer.clear(),this._outputBuffer.clear()}}class Oe extends Ve{constructor(t){super(t),this.reset(),this._rate=1}set rate(t){this._rate=t}reset(){this.slopeCount=0,this.prevSampleL=0,this.prevSampleR=0}clone(){const t=new Oe;return t.rate=this._rate,t}process(){const t=this._inputBuffer.frameCount;this._outputBuffer.ensureAdditionalCapacity(t/this._rate+1);const e=this.transpose(t);this._inputBuffer.receive(),this._outputBuffer.put(e)}transpose(t=0){if(0===t)return 0;const e=this._inputBuffer.vector,o=this._inputBuffer.startIndex,i=this._outputBuffer.vector,a=this._outputBuffer.endIndex;let n=0,r=0;for(;this.slopeCount<1;)i[a+2*r]=(1-this.slopeCount)*this.prevSampleL+this.slopeCount*e[o],i[a+2*r+1]=(1-this.slopeCount)*this.prevSampleR+this.slopeCount*e[o+1],r+=1,this.slopeCount+=this._rate;if(this.slopeCount-=1,1!==t)t:for(;;){for(;this.slopeCount>1;)if(this.slopeCount-=1,n+=1,n>=t-1)break t;const s=o+2*n;i[a+2*r]=(1-this.slopeCount)*e[s]+this.slopeCount*e[s+2],i[a+2*r+1]=(1-this.slopeCount)*e[s+1]+this.slopeCount*e[s+3],r+=1,this.slopeCount+=this._rate}return this.prevSampleL=e[o+2*t-2],this.prevSampleR=e[o+2*t-1],r}}class Me{constructor(t){this._pipe=t}get pipe(){return this._pipe}get inputBuffer(){return this._pipe.inputBuffer}get outputBuffer(){return this._pipe.outputBuffer}fillInputBuffer(){throw new Error("fillInputBuffer() not overridden")}fillOutputBuffer(t=0){for(;this.outputBuffer.frameCountthis._position)throw new RangeError("New position may not be greater than current position");const e=this.outputBufferPosition-(this._position-t);if(e<0)throw new RangeError("New position falls outside of history buffer");this.outputBufferPosition=e,this._position=t}get sourcePosition(){return this._sourcePosition}set sourcePosition(t){this.clear(),this._sourcePosition=t}onEnd(){this.callback()}fillInputBuffer(t=0){const e=new Float32Array(2*t),o=this.sourceSound.extract(e,t,this._sourcePosition);this._sourcePosition+=o,this.inputBuffer.putSamples(e,0,o)}extract(t,e=0){this.fillOutputBuffer(this.outputBufferPosition+e);const o=Math.min(e,this.outputBuffer.frameCount-this.outputBufferPosition);this.outputBuffer.extract(t,this.outputBufferPosition,o);const i=this.outputBufferPosition+o;return this.outputBufferPosition=Math.min(this.historyBufferSize,i),this.outputBuffer.receive(Math.max(i-this.historyBufferSize,0)),this._position+=o,o}handleSampleData(t){this.extract(t.data,4096)}clear(){super.clear(),this.outputBufferPosition=0}}const Ne=[[124,186,248,310,372,434,496,558,620,682,744,806,868,930,992,1054,1116,1178,1240,1302,1364,1426,1488,0],[-100,-75,-50,-25,25,50,75,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-20,-15,-10,-5,5,10,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-4,-3,-2,-1,1,2,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],Re=-10/1.5;class $e extends Ve{constructor(t){super(t),this._quickSeek=!0,this.midBufferDirty=!1,this.midBuffer=null,this.overlapLength=0,this.autoSeqSetting=!0,this.autoSeekSetting=!0,this._tempo=1,this.setParameters(44100,0,0,8)}clear(){super.clear(),this.clearMidBuffer()}clearMidBuffer(){this.midBufferDirty&&(this.midBufferDirty=!1,this.midBuffer=null)}setParameters(t,e,o,i){t>0&&(this.sampleRate=t),i>0&&(this.overlapMs=i),e>0?(this.sequenceMs=e,this.autoSeqSetting=!1):this.autoSeqSetting=!0,o>0?(this.seekWindowMs=o,this.autoSeekSetting=!1):this.autoSeekSetting=!0,this.calculateSequenceParameters(),this.calculateOverlapLength(this.overlapMs),this.tempo=this._tempo}set tempo(t){let e;this._tempo=t,this.calculateSequenceParameters(),this.nominalSkip=this._tempo*(this.seekWindowLength-this.overlapLength),this.skipFract=0,e=Math.floor(this.nominalSkip+.5),this.sampleReq=Math.max(e+this.overlapLength,this.seekWindowLength)+this.seekLength}get tempo(){return this._tempo}get inputChunkSize(){return this.sampleReq}get outputChunkSize(){return this.overlapLength+Math.max(0,this.seekWindowLength-2*this.overlapLength)}calculateOverlapLength(t=0){let e;e=this.sampleRate*t/1e3,e=e<16?16:e,e-=e%8,this.overlapLength=e,this.refMidBuffer=new Float32Array(2*this.overlapLength),this.midBuffer=new Float32Array(2*this.overlapLength)}checkLimits(t,e,o){return to?o:t}calculateSequenceParameters(){let t,e;this.autoSeqSetting&&(t=150+-50*this._tempo,t=this.checkLimits(t,50,125),this.sequenceMs=Math.floor(t+.5)),this.autoSeekSetting&&(e=28.333333333333332+Re*this._tempo,e=this.checkLimits(e,15,25),this.seekWindowMs=Math.floor(e+.5)),this.seekWindowLength=Math.floor(this.sampleRate*this.sequenceMs/1e3),this.seekLength=Math.floor(this.sampleRate*this.seekWindowMs/1e3)}set quickSeek(t){this._quickSeek=t}clone(){const t=new $e;return t.tempo=this._tempo,t.setParameters(this.sampleRate,this.sequenceMs,this.seekWindowMs,this.overlapMs),t}seekBestOverlapPosition(){return this._quickSeek?this.seekBestOverlapPositionStereoQuick():this.seekBestOverlapPositionStereo()}seekBestOverlapPositionStereo(){let t,e,o,i=0;for(this.preCalculateCorrelationReferenceStereo(),t=0,e=Number.MIN_VALUE;ie&&(e=o,t=i);return t}seekBestOverlapPositionStereoQuick(){let t,e,o,i,a,n=0;for(this.preCalculateCorrelationReferenceStereo(),e=Number.MIN_VALUE,t=0,i=0,a=0;n<4;n+=1){let r=0;for(;Ne[n][r]&&(a=i+Ne[n][r],!(a>=this.seekLength));)o=this.calculateCrossCorrelationStereo(2*a,this.refMidBuffer),o>e&&(e=o,t=a),r+=1;i=t}return t}preCalculateCorrelationReferenceStereo(){let t,e,o=0;for(;o=this.sampleReq;){t=this.seekBestOverlapPosition(),this._outputBuffer.ensureAdditionalCapacity(this.overlapLength),this.overlap(Math.floor(t)),this._outputBuffer.put(this.overlapLength),e=this.seekWindowLength-2*this.overlapLength,e>0&&this._outputBuffer.putBuffer(this._inputBuffer,t+this.overlapLength,e);const i=this._inputBuffer.startIndex+2*(t+this.seekWindowLength-this.overlapLength);this.midBuffer.set(this._inputBuffer.vector.subarray(i,i+2*this.overlapLength)),this.skipFract+=this.nominalSkip,o=Math.floor(this.skipFract),this.skipFract-=o,this._inputBuffer.receive(o)}}}const De=function(t,e){return(t>e?t-e:e-t)>1e-10};class Fe{constructor(){this.transposer=new Oe(!1),this.stretch=new $e(!1),this._inputBuffer=new _e,this._intermediateBuffer=new _e,this._outputBuffer=new _e,this._rate=0,this._tempo=0,this.virtualPitch=1,this.virtualRate=1,this.virtualTempo=1,this.calculateEffectiveRateAndTempo()}clear(){this.transposer.clear(),this.stretch.clear()}clone(){const t=new Fe;return t.rate=this.rate,t.tempo=this.tempo,t}get rate(){return this._rate}set rate(t){this.virtualRate=t,this.calculateEffectiveRateAndTempo()}set rateChange(t){this._rate=1+.01*t}get tempo(){return this._tempo}set tempo(t){this.virtualTempo=t,this.calculateEffectiveRateAndTempo()}set tempoChange(t){this.tempo=1+.01*t}set pitch(t){this.virtualPitch=t,this.calculateEffectiveRateAndTempo()}set pitchOctaves(t){this.pitch=Math.exp(.69314718056*t),this.calculateEffectiveRateAndTempo()}set pitchSemitones(t){this.pitchOctaves=t/12}get inputBuffer(){return this._inputBuffer}get outputBuffer(){return this._outputBuffer}calculateEffectiveRateAndTempo(){const t=this._tempo,e=this._rate;this._tempo=this.virtualTempo/this.virtualPitch,this._rate=this.virtualRate*this.virtualPitch,De(this._tempo,t)&&(this.stretch.tempo=this._tempo),De(this._rate,e)&&(this.transposer.rate=this._rate),this._rate>1?this._outputBuffer!=this.transposer.outputBuffer&&(this.stretch.inputBuffer=this._inputBuffer,this.stretch.outputBuffer=this._intermediateBuffer,this.transposer.inputBuffer=this._intermediateBuffer,this.transposer.outputBuffer=this._outputBuffer):this._outputBuffer!=this.stretch.outputBuffer&&(this.transposer.inputBuffer=this._inputBuffer,this.transposer.outputBuffer=this._intermediateBuffer,this.stretch.inputBuffer=this._intermediateBuffer,this.stretch.outputBuffer=this._outputBuffer)}process(){this._rate>1?(this.stretch.process(),this.transposer.process()):(this.transposer.process(),this.stretch.process())}}class qe{constructor(t){this.buffer=t,this._position=0}get dualChannel(){return this.buffer.numberOfChannels>1}get position(){return this._position}set position(t){this._position=t}extract(t,e=0,o=0){this.position=o;let i=this.buffer.getChannelData(0),a=this.dualChannel?this.buffer.getChannelData(1):this.buffer.getChannelData(0),n=0;for(;n=e?t:new Array(e-t.length+1).join(o)+t}(parseInt(t-60*e),2)}`},ze=function(t){const e=this.timePlayed,o=this.sampleRate;if(this.sourcePosition=t,this.timePlayed=t/o,e!==this.timePlayed){const t=new CustomEvent("play",{detail:{timePlayed:this.timePlayed,formattedTimePlayed:this.formattedTimePlayed,percentagePlayed:this.percentagePlayed}});this._node.dispatchEvent(t)}};class He{constructor(t,e,o,i=Ee){this._soundtouch=new Fe;const a=new qe(e);this.timePlayed=0,this.sourcePosition=0,this._filter=new Be(a,this._soundtouch,i),this._node=function(t,e,o=Ee,i=4096){const a=t.createScriptProcessor(i,2,2),n=new Float32Array(2*i);return a.onaudioprocess=t=>{let a=t.outputBuffer.getChannelData(0),r=t.outputBuffer.getChannelData(1),s=e.extract(n,i);o(e.sourcePosition),0===s&&e.onEnd();let l=0;for(;lze.call(this,t)),o),this.tempo=1,this.rate=1,this.duration=e.duration,this.sampleRate=t.sampleRate,this.listeners=[]}get formattedDuration(){return Ue(this.duration)}get formattedTimePlayed(){return Ue(this.timePlayed)}get percentagePlayed(){return 100*this._filter.sourcePosition/(this.duration*this.sampleRate)}set percentagePlayed(t){this._filter.sourcePosition=parseInt(t*this.duration*this.sampleRate),this.sourcePosition=this._filter.sourcePosition,this.timePlayed=this.sourcePosition/this.sampleRate}get node(){return this._node}set pitch(t){this._soundtouch.pitch=t}set pitchSemitones(t){this._soundtouch.pitchSemitones=t}set rate(t){this._soundtouch.rate=t}set tempo(t){this._soundtouch.tempo=t}connect(t){this._node.connect(t)}disconnect(){this._node.disconnect()}on(t,e){this.listeners.push({name:t,cb:e}),this._node.addEventListener(t,(t=>e(t.detail)))}off(t=null){let e=this.listeners;t&&(e=e.filter((e=>e.name===t))),e.forEach((t=>{this._node.removeEventListener(t.name,(e=>t.cb(e.detail)))}))}}const We=(...t)=>{if(Ae.debug)return console.log(`%c✦ chaimu.js v${Ae.version} ✦`,"background: #000; color: #fff; padding: 0 8px",...t)},je=["playing","ratechange","play","waiting","pause","seeked"];function Ge(){const t=window.AudioContext||window.webkitAudioContext;return t?new t:void 0}class Ye{static name="BasePlayer";chaimu;_src;fetch;constructor(t,e){this.chaimu=t,this._src=e,this.fetch=Ae.fetchFn}async init(){return new Promise((t=>t(this)))}clear(){return new Promise((t=>t(this)))}lipSync(t=!1){return this}handleVideoEvent=t=>(We(`handle video ${t.type}`),this.lipSync(t.type),this);removeVideoEvents(){for(const t of je)this.chaimu.video.removeEventListener(t,this.handleVideoEvent);return this}addVideoEvents(){for(const t of je)this.chaimu.video.addEventListener(t,this.handleVideoEvent);return this}async play(){return new Promise((t=>t(this)))}async pause(){return new Promise((t=>t(this)))}get name(){return this.constructor.name}set src(t){this._src=t}get src(){return this._src}get currentSrc(){return this._src}set volume(t){}get volume(){return 0}get playbackRate(){return 0}set playbackRate(t){}get currentTime(){return 0}}class Je extends Ye{static name="AudioPlayer";audio;gainNode;audioSource;constructor(t,e){super(t,e),this.updateAudio()}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.audioSource&&(this.audioSource.disconnect(this.gainNode),this.gainNode.disconnect()),this.gainNode=this.chaimu.audioContext.createGain(),this.gainNode.connect(this.chaimu.audioContext.destination),this.audioSource=this.chaimu.audioContext.createMediaElementSource(this.audio),this.audioSource.connect(this.gainNode),this):this}updateAudio(){return this.audio=new Audio(this.src),this.audio.crossOrigin="anonymous",this}async init(){return new Promise((t=>(this.updateAudio(),this.initAudioBooster(),t(this))))}audioErrorHandle=t=>{console.error("[AudioPlayer]",t)};lipSync(t=!1){if(We("[AudioPlayer] lipsync video",this.chaimu.video),!this.chaimu.video)return this;if(this.audio.currentTime=this.chaimu.video.currentTime,this.audio.playbackRate=this.chaimu.video.playbackRate,!t)return We("[AudioPlayer] lipsync mode isn't set"),this;switch(We(`[AudioPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"seeked":return this.chaimu.video.paused||this.syncPlay(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async clear(){return new Promise((t=>(this.audio.pause(),this.audio.src="",this.audio.removeAttribute("src"),t(this))))}syncPlay(){return We("[AudioPlayer] sync play called"),this.audio.play().catch(this.audioErrorHandle),this}async play(){return We("[AudioPlayer] play called"),await this.audio.play().catch(this.audioErrorHandle),this}async pause(){return new Promise((t=>(We("[AudioPlayer] pause called"),this.audio.pause(),t(this))))}set src(t){this._src=t,t?this.audio.src=t:this.clear()}get src(){return this._src}get currentSrc(){return this.audio.currentSrc}set volume(t){this.gainNode?this.gainNode.gain.value=t:this.audio.volume=t}get volume(){return this.gainNode?this.gainNode.gain.value:this.audio.volume}get playbackRate(){return this.audio.playbackRate}set playbackRate(t){this.audio.playbackRate=t}get currentTime(){return this.audio.currentTime}}class Ke extends Ye{static name="ChaimuPlayer";audioBuffer;sourceNode;gainNode;audioShifter;cleanerRunned=!1;async fetchAudio(){if(!this._src)throw new Error("No audio source provided");if(!this.chaimu.audioContext)throw new Error("No audio context available");We(`[ChaimuPlayer] Fetching audio from ${this._src}...`);try{const t=await this.fetch(this._src);We("[ChaimuPlayer] Decoding fetched audio...");const e=await t.arrayBuffer();this.audioBuffer=await this.chaimu.audioContext.decodeAudioData(e)}catch(t){throw new Error(`Failed to fetch audio file, because ${t.message}`)}return this}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.gainNode.disconnect(),this.gainNode=this.chaimu.audioContext.createGain(),this):this}async init(){return await this.fetchAudio(),this.initAudioBooster(),this}lipSync(t=!1){if(We("[ChaimuPlayer] lipsync video",this.chaimu.video,this),!this.chaimu.video)return this;if(!t)return We("[ChaimuPlayer] lipsync mode isn't set"),this;switch(We(`[ChaimuPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"ratechange":case"seeked":return this.chaimu.video.paused||this.start(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async reopenCtx(){if(!this.chaimu.audioContext)throw new Error("No audio context available");try{await this.chaimu.audioContext.close()}catch{}return this}async clear(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(We("clear audio context"),this.cleanerRunned=!0,await this.pause(),!this.gainNode)return this.cleanerRunned=!1,this;this.sourceNode&&(this.sourceNode.stop(),this.sourceNode.disconnect(this.gainNode),this.sourceNode=void 0),this.audioShifter&&(this.audioShifter._node.disconnect(this.gainNode),this.audioShifter=void 0),this.gainNode.disconnect();const t=this.volume;return this.gainNode=void 0,await this.reopenCtx(),this.chaimu.audioContext=Ge(),this.initAudioBooster(),this.volume=t,this.cleanerRunned=!1,this}async start(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(!this.audioBuffer)throw new Error("The player isn't initialized");return!this.gainNode||this.audioShifter&&this.audioShifter.duration"asr"===t.kind&&t.languageCode));if(i)return M(i.languageCode)}const a=e?.captions?.playerCaptionsTracklistRenderer?.captionTracks?.find((t=>"asr"===t.kind&&t.languageCode));if(a)return M(a.languageCode);const n=function(t,e){return`${t} ${e?e.split("\n").filter((t=>!Q.test(t))).join(" "):""}`.slice(0,450).replace(/[^\p{L}\s]+|\s+/gu," ").trim()}(o,i);return F.log(`Detecting language text: ${n}`),async function(t){const e=await Y.get("detectService",W);switch(e){case"yandexbrowser":case"msedge":return await Xe.detect(t,e);case"rust-server":return await Qe.detect(t);default:return"en"}}(n)}function io(){return/^m\.youtube\.com$/.test(window.location.hostname)}function ao(){return window.location.pathname.startsWith("/shorts/")&&!io()?document.querySelector("#shorts-player"):document.querySelector("#movie_player")}function no(){const t=ao();return t?.getPlayerResponse?t?.getPlayerResponse?.call()??null:t?.data?.playerResponse??null}function ro(){const t=ao();return t?.getVideoData?t?.getVideoData?.call()??null:t?.data?.playerResponse?.videoDetails??null}const so={isMobile:io,getPlayer:ao,getPlayerResponse:no,getPlayerData:ro,getVideoVolume:function(){const t=ao();return t?.getVolume?t.getVolume.call()/100:1},getSubtitles:function(t=rt.lang){const e=no(),o=e?.captions?.playerCaptionsTracklistRenderer;if(!o)return[];let i=o.captionTracks??[];const a=(o.translationLanguages??[]).find((e=>e.languageCode===t)),n=i.find((t=>"asr"===t?.kind))?.languageCode??"en";return i=i.reduce(((e,o)=>{if(!("languageCode"in o))return e;const i=o.languageCode?M(o.languageCode):void 0,r=o?.url||o?.baseUrl;if(!i||!r)return e;const s=`${r.startsWith("http")?r:`${window.location.origin}/${r}`}&fmt=json3`;return e.push({source:"youtube",format:"json",language:i,isAutoGenerated:"asr"===o?.kind,url:s}),a&&o.isTranslatable&&o.languageCode===n&&t!==i&&e.push({source:"youtube",format:"json",language:t,isAutoGenerated:"asr"===o?.kind,translatedFromLanguage:i,url:`${s}&tlang=${t}`}),e}),[]),F.log("youtube subtitles:",i),i},getVideoData:async function(){const t=ao(),e=no(),o=ro(),{title:i}=o??{},{shortDescription:a,isLive:n,title:r}=e?.videoDetails??{};let s=r?await oo(t,e,r,a):"en";s=kt.includes(s)?s:"en";const l={isLive:!!n,title:r,localizedTitle:i,description:a,detectedLanguage:s};return F.log("youtube video data:",l),console.log("[VOT] Detected language: ",l.detectedLanguage),l},setVideoVolume:function(t){const e=ao();if(e?.setVolume)return e.setVolume(Math.round(100*t)),!0},videoSeek:function(t,e){F.log("videoSeek",e);const o=(ao()?.getProgressState()?.seekableEnd||t.currentTime)-e;t.currentTime=o},isMuted:function(){const t=ao();return!!t?.isMuted&&t.isMuted.call()}};class lo{static formatYandexTokens(t){const e=t.startMs+t.durationMs;return t.tokens.reduce(((o,i,a)=>{const n=t.tokens[a+1],r=o[o.length-1],s=r?.alignRange?.end??0,l=s+i.text.length;if(i.alignRange={start:s,end:l},o.push(i),n){const t=i.startMs+i.durationMs,a=n.startMs?n.startMs-t:e-t;o.push({text:" ",startMs:t,durationMs:a,alignRange:{start:l,end:l+1}})}return o}),[])}static createTokens(t,e){const o=t.text.split(/([\n \t])/).reduce(((t,o)=>{if(!o.length)return t;const i=t[t.length-1]??e,a=i?.alignRange?.end??0,n=a+o.length;return t.push({text:o,alignRange:{start:a,end:n}}),t}),[]),i=Math.floor(t.durationMs/o.length),a=t.startMs+t.durationMs;return o.map(((e,n)=>{const r=n===o.length-1,s=t.startMs+i*n;return{...e,startMs:s,durationMs:r?a-s:i}}))}static processTokens(t,e){const o=[];let i;const{source:a,isAutoGenerated:n}=e;for(const e of t.subtitles){const t=e?.tokens?.length,r=t&&("yandex"===a||"youtube"===a&&n)?this.formatYandexTokens(e):this.createTokens(e,i);i=r[r.length-1],o.push({...e,tokens:r})}return t.containsTokens=!0,o}static formatYoutubeSubtitles(t,e=!1){if(!t?.events?.length)return console.error("[VOT] Invalid YouTube subtitles format:",t),{containsTokens:e,subtitles:[]};const o={containsTokens:e,subtitles:[]};for(let i=0;it.events[i+1].tStartMs&&(n=t.events[i+1].tStartMs-a.tStartMs);const r=[];let s=n;for(let t=0;tt.text)).join(" ");l&&o.subtitles.push({text:l,startMs:a.tStartMs,durationMs:n,...e?{tokens:r}:{}})}return o}static cleanJsonSubtitles(t){const{containsTokens:e,subtitles:o}=t;return{containsTokens:e,subtitles:o.map((t=>({...t,text:t.text.replace(/(<([^>]+)>)/gi,"")})))}}static async fetchWithTimeout(t,e=5e3){try{return await ot(t,{timeout:e})}catch(t){throw console.error("[VOT] Fetch failed:",t),t}}static async fetchSubtitles(t){const{source:e,isAutoGenerated:o,format:i,url:a}=t;try{const n=await this.fetchWithTimeout(a);let r;if(["vtt","srt"].includes(i)){const t=await n.text();r=await Mt(t,"json")}else r=await n.json();return"youtube"===e&&(r=this.formatYoutubeSubtitles(r,o)),"vk"===e&&(r=this.cleanJsonSubtitles(r)),r.subtitles=this.processTokens(r,t),console.log("[VOT] Processed subtitles:",r),r}catch(t){return console.error("[VOT] Failed to process subtitles:",t),{containsTokens:!1,subtitles:[]}}}static async getSubtitles(t,e){const{host:o,url:i,detectedLanguage:a,responseLanguage:n,videoId:r,duration:s,subtitles:l}=e,d="youtube"===o?so.getSubtitles(n):l??[];try{const e=await Promise.race([t.getSubtitles({videoData:{host:o,url:i,videoId:r,duration:s},requestLang:a}),new Promise(((t,e)=>setTimeout((()=>e(new Error("Timeout"))),5e3)))]);console.log("[VOT] Subtitles response:",e),e.waiting&&console.error("[VOT] Failed to get Yandex subtitles");const n=(e.subtitles??[]).reduce(((t,e)=>(e.language&&!t.find((t=>"yandex"===t.source&&t.language===e.language&&!t.translatedFromLanguage))&&t.push({source:"yandex",language:e.language,url:e.url}),e.translatedLanguage&&t.push({source:"yandex",language:e.translatedLanguage,translatedFromLanguage:e.language,url:e.translatedUrl}),t)),[]);return[...n,...d].sort(((t,e)=>{if(t.source!==e.source)return"yandex"===t.source?-1:1;if(t.language!==e.language&&(t.language===K||e.language===K))return t.language===K?-1:1;if("yandex"===t.source){if(t.translatedFromLanguage!==e.translatedFromLanguage)return t.translatedFromLanguage&&e.translatedFromLanguage?t.translatedFromLanguage===a?-1:1:t.language===e.language?t.translatedFromLanguage?1:-1:t.translatedFromLanguage?-1:1;if(!t.translatedFromLanguage)return t.language===a?-1:1}return"yandex"!==t.source&&t.isAutoGenerated!==e.isAutoGenerated?t.isAutoGenerated?1:-1:0}))}catch(t){const e="Timeout"===t.message?"Failed to get Yandex subtitles: timeout":"Error in getSubtitles function";throw console.error(`[VOT] ${e}`,t),t}}}class uo{constructor(t,e,o){this.video=t,this.container="youtube"===o.host&&"mobile"!==o.additionalData?e.parentElement:e,this.site=o,this.subtitlesContainer=this.createSubtitlesContainer(),this.position={left:25,top:75},this.dragging={active:!1,offset:{x:0,y:0}},this.subtitles=null,this.lastContent=null,this.highlightWords=!1,this.fontSize=20,this.opacity=.2,this.maxLength=300,this.abortController=new AbortController,this.bindEvents(),this.updateContainerRect()}createSubtitlesContainer(){return this.subtitlesContainer=document.createElement("vot-block"),this.subtitlesContainer.classList.add("vot-subtitles-widget"),this.container.appendChild(this.subtitlesContainer),this.subtitlesContainer}bindEvents(){const{signal:t}=this.abortController;this.onPointerDownBound=t=>this.onPointerDown(t),this.onPointerUpBound=()=>this.onPointerUp(),this.onPointerMoveBound=t=>this.onPointerMove(t),this.onTimeUpdateBound=this.debounce((()=>this.update()),100),document.addEventListener("pointerdown",this.onPointerDownBound,{signal:t}),document.addEventListener("pointerup",this.onPointerUpBound,{signal:t}),document.addEventListener("pointermove",this.onPointerMoveBound,{signal:t}),this.video?.addEventListener("timeupdate",this.onTimeUpdateBound,{signal:t}),this.resizeObserver=new ResizeObserver((()=>this.onResize())),this.resizeObserver.observe(this.container)}onPointerDown(t){if(!this.subtitlesContainer.contains(t.target))return;const e=this.subtitlesContainer.getBoundingClientRect(),o=this.container.getBoundingClientRect();this.dragging={active:!0,offset:{x:t.clientX-e.left,y:t.clientY-e.top},containerOffset:{x:o.left,y:o.top}}}onPointerUp(){this.dragging.active=!1}onPointerMove(t){if(!this.dragging.active)return;t.preventDefault();const{width:e,height:o}=this.container.getBoundingClientRect(),{containerOffset:i,offset:a}=this.dragging;this.position={left:(t.clientX-a.x-i.x)/e*100,top:(t.clientY-a.y-i.y)/o*100},this.applySubtitlePosition()}onResize(){this.updateContainerRect()}updateContainerRect(){this.containerRect=this.container.getBoundingClientRect(),this.applySubtitlePosition()}applySubtitlePosition(){const{width:t,height:e}=this.containerRect,{offsetWidth:o,offsetHeight:i}=this.subtitlesContainer,a=(t-o)/t*100,n=(e-i)/e*100;this.position.left=Math.max(0,Math.min(this.position.left,a)),this.position.top=Math.max(0,Math.min(this.position.top,n)),this.subtitlesContainer.style.left=`${this.position.left}%`,this.subtitlesContainer.style.top=`${this.position.top}%`}processTokens(t){if(t.at(-1).alignRange.end<=this.maxLength)return t;const e=[];let o=[],i=0;for(const a of t)i+=a.text.length,o.push(a),i>this.maxLength&&(e.push(this.trimChunk(o)),o=[],i=0);o.length&&e.push(this.trimChunk(o));const a=1e3*this.video.currentTime;return e.find((t=>t[0].startMs{const o=this.highlightWords&&(e>t.startMs+t.durationMs/2||e>t.startMs-100&&t.startMs+t.durationMs/2-e<275);return ee` ${t.text.replace("\\n","
")}
`}))}debounce(t,e){let o;return(...i)=>{clearTimeout(o),o=setTimeout((()=>t.apply(this,i)),e)}}setContent(t){if(!t||!this.video)return this.subtitles=null,void ye(null,this.subtitlesContainer);this.subtitles=t,this.update()}setMaxLength(t){"number"==typeof t&&t>0&&(this.maxLength=t,this.update())}setHighlightWords(t){this.highlightWords=Boolean(t),this.update()}setFontSize(t){this.fontSize=t;const e=this.subtitlesContainer?.querySelector(".vot-subtitles");e&&(e.style.fontSize=`${t}px`)}setOpacity(t){this.opacity=((100-+t)/100).toFixed(2);const e=this.subtitlesContainer?.querySelector(".vot-subtitles");e&&e.style.setProperty("--vot-subtitles-opacity",this.opacity)}update(){if(!this.video||!this.subtitles)return;const t=1e3*this.video.currentTime,e=this.subtitles.subtitles.findLast((e=>e.startMs - `,c);const h=bo(n,r,s,{onSelectCb:l});return d.append(u.container,c,h.container),{container:d,fromSelect:u,icon:c,toSelect:h}},updateSlider:mo,animateLoader:function(t,e="139, 180, 245"){const o=t.querySelector(".vot-loader-helper"),i=t.querySelector(".vot-loader-main");anime.timeline({...po,targets:[o,i],duration:250}).add({"fill-opacity":0,"stroke-width":2,d:"M 12 1.5 C 17.799 1.5 22.5 6.201 22.5 12 C 22.5 17.799 17.799 22.5 12 22.5 C 6.201 22.5 1.5 17.799 1.5 12 C 1.5 6.201 6.201 1.5 12 1.5 Z",duration:0}).add({targets:o,stroke:`rgb(${e})`,"stroke-opacity":0,duration:0},0).add({targets:i,stroke:"#888888","stroke-opacity":.25},0);const a=anime.timeline({targets:o,easing:"easeInOutSine",duration:1e3,autoplay:!1}).add({strokeOpacity:1,duration:0},0).add({strokeDashoffset:[anime.setDashoffset,0]},0);return t=>{a.seek(a.duration*(t/100))}},afterAnimateLoader:function(t,e="139, 180, 245"){const o=t.querySelector(".vot-loader-helper"),i=t.querySelector(".vot-loader-main");anime.timeline({...po,targets:i,duration:600}).add({d:"M 9.0596 14.8571 L 9.7667 15.5642 L 10.4738 14.8571 L 17.0071 8.3238 C 17.0457 8.2852 17.0937 8.25 17.2333 8.25 C 17.373 8.25 17.421 8.2852 17.4596 8.3238 C 17.4981 8.3624 17.5333 8.4104 17.5333 8.55 C 17.5333 8.6896 17.4981 8.7376 17.4596 8.7762 L 9.9929 16.2429 C 9.9011 16.3346 9.8397 16.35 9.7667 16.35 C 9.6937 16.35 9.6322 16.3346 9.5404 16.2429 L 6.0738 12.7762 C 6.0352 12.7376 6 12.6897 6 12.55 C 6 12.4103 6.0352 12.3624 6.0738 12.3238 C 6.1124 12.2852 6.1603 12.25 6.3 12.25 C 6.4397 12.25 6.4876 12.2852 6.5262 12.3238 L 9.0596 14.8571 Z",duration:0}).add({strokeDashoffset:[anime.setDashoffset,0],stroke:`rgb(${e})`,"stroke-opacity":1}),setTimeout((()=>{anime.timeline({...po,targets:i,duration:600}).add({d:"M12 15.575C11.8667 15.575 11.7417 15.5542 11.625 15.5125C11.5083 15.4708 11.4 15.4 11.3 15.3L7.7 11.7C7.5 11.5 7.40417 11.2667 7.4125 11C7.42083 10.7333 7.51667 10.5 7.7 10.3C7.9 10.1 8.1375 9.99583 8.4125 9.9875C8.6875 9.97917 8.925 10.075 9.125 10.275L11 12.15V5C11 4.71667 11.0958 4.47917 11.2875 4.2875C11.4792 4.09583 11.7167 4 12 4C12.2833 4 12.5208 4.09583 12.7125 4.2875C12.9042 4.47917 13 4.71667 13 5V12.15L14.875 10.275C15.075 10.075 15.3125 9.97917 15.5875 9.9875C15.8625 9.99583 16.1 10.1 16.3 10.3C16.4833 10.5 16.5792 10.7333 16.5875 11C16.5958 11.2667 16.5 11.5 16.3 11.7L12.7 15.3C12.6 15.4 12.4917 15.4708 12.375 15.5125C12.2583 15.5542 12.1333 15.575 12 15.575ZM6 20C5.45 20 4.97917 19.8042 4.5875 19.4125C4.19583 19.0208 4 18.55 4 18V16C4 15.7167 4.09583 15.4792 4.2875 15.2875C4.47917 15.0958 4.71667 15 5 15C5.28333 15 5.52083 15.0958 5.7125 15.2875C5.90417 15.4792 6 15.7167 6 16V18H18V16C18 15.7167 18.0958 15.4792 18.2875 15.2875C18.4792 15.0958 18.7167 15 19 15C19.2833 15 19.5208 15.0958 19.7125 15.2875C19.9042 15.4792 20 15.7167 20 16V18C20 18.55 19.8042 19.0208 19.4125 19.4125C19.0208 19.8042 18.55 20 18 20H6Z",duration:100}).add({targets:o,d:"",duration:200},0).add({targets:i,"stroke-width":"0",stroke:`rgba(${e}), 0)`,"fill-opacity":"1","stroke-dasharray":"0","stroke-dashoffset":"0",duration:0})}),2e3)},createDetails:function(t){const e=document.createElement("vot-block");e.classList.add("vot-details");const o=document.createElement("vot-block");o.append(t);const i=document.createElement("vot-block");return i.classList.add("vot-details-arrow-icon"),ye(ho,i),e.append(o,i),{container:e,header:o,arrowIcon:i}}};o("./node_modules/requestidlecallback-polyfill/index.js");class wo{constructor(){this.listeners=new Set}hasListener(t){return this.listeners.has(t)}dispatchToListener(t,...e){try{t(...e)}catch(t){console.error("[VOT]",t)}}addListener(t){if(this.hasListener(t))throw new Error("[VOT] The listener has already been added.");this.listeners.add(t)}removeListener(t){if(!this.hasListener(t))throw new Error("[VOT] The listener has not been added yet.");this.listeners.delete(t)}dispatch(...t){for(const e of Array.from(this.listeners))this.dispatchToListener(e,...t)}}const xo=new Set(["advertise","promo","sponsor","banner","commercial","preroll","midroll","postroll","ad-container","sponsored"]),So=(()=>{const t=Array.from(xo).join("|");return new RegExp(t,"i")})(),ko=t=>{const e=[];for(let o=0;o({label:rt.get("langs")[t]??t.toUpperCase(),value:t,selected:e===t})))}const Io=t=>t?rt.get("VOTChangeHotkeyWithCurrent").replace("{0}",t.replace("Key","")):rt.get("VOTCreateTranslationHotkey");let Po;class Lo{translateFromLang="auto";translateToLang=K;timer;videoData="";firstPlay=!0;audioContext=Ge();hls=X();votClient;audioPlayer;videoTranslations=[];videoTranslationTTL=7200;translateProxyEnabled=0;cachedTranslation;downloadTranslationUrl=null;autoRetry;streamPing;votOpts;volumeOnStart;tempOriginalVolume;tempVolume;firstSyncVolume=!0;longWaitingResCount=0;subtitlesList=[];subtitlesListVideoId=null;dragging;constructor(t,e,o){F.log("[VideoHandler] add video:",t,"container:",e,this),this.video=t,this.container=e,this.site=o,this.abortController=new AbortController,this.extraEvents=[],this.init()}async translateVideoImpl(t,e,o,i=null){if(clearTimeout(this.autoRetry),F.log(t,`Translate video (requestLang: ${e}, responseLang: ${o})`),await At(this.site,{fetchFn:ot,video:this.video})!==t.videoId)return null;try{const a=await this.votClient.translateVideo({videoData:t,requestLang:e,responseLang:o,translationHelp:i,extraOpts:{useNewModel:this.data?.useNewModel}});if(F.log("Translate video result",a),a.translated&&a.remainingTime<1)return F.log("Video translation finished with this data: ",a),a;const n=a.message??rt.get("translationTakeFewMinutes");await this.updateTranslationErrorMsg(a.remainingTime>0?function(t){let e=Math.floor(t/60),o=Math.floor(t%60);return o/60>=.66&&(e+=1,o=0),e>=60?rt.get("translationTakeMoreThanHour"):1===e||0===e&&o>0?rt.get("translationTakeAboutMinute"):11!==e&&e%10==1?rt.get("translationTakeApproximatelyMinute2").replace("{0}",e):![12,13,14].includes(e)&&[2,3,4].includes(e%10)?rt.get("translationTakeApproximatelyMinute").replace("{0}",e):rt.get("translationTakeApproximatelyMinutes").replace("{0}",e)}(a.remainingTime):n)}catch(t){return console.error("[VOT] Failed to translate video",t),await this.updateTranslationErrorMsg(t.data?.message??t),null}return new Promise((a=>{const n=this.subtitlesList.some((t=>"yandex"===t.source))?2e4:3e4;this.autoRetry=setTimeout((async()=>{const n=await this.translateVideoImpl(t,e,o,i);(!n||n.translated&&n.remainingTime<1)&&a(n)}),n)}))}async translateStreamImpl(t,e,o){if(clearTimeout(this.autoRetry),F.log(t,`Translate stream (requestLang: ${e}, responseLang: ${o})`),await At(this.site,{fetchFn:ot,video:this.video})!==t.videoId)return null;try{const i=await this.votClient.translateStream({videoData:t,requestLang:e,responseLang:o});if(F.log("Translate stream result",i),!i.translated&&10===i.interval)return await this.updateTranslationErrorMsg(rt.get("translationTakeFewMinutes")),new Promise((a=>{this.autoRetry=setTimeout((async()=>{const i=await this.translateStreamImpl(t,e,o);i&&!i.translated&&10===i.interval||a(i)}),1e3*i.interval)}));if(i.message)throw F.log(`Stream translation aborted! Message: ${i.message}`),new st("streamNoConnectionToServer");if(!i.result)throw F.log("Failed to find translation result! Data:",i),new st("audioNotReceived");return F.log("Stream translated successfully. Running...",i),this.streamPing=setInterval((async()=>{F.log("Ping stream translation",i.pingId),this.votClient.pingStream({pingId:i.pingId})}),1e3*i.interval),i}catch(t){return console.error("[VOT] Failed to translate stream",t),await this.updateTranslationErrorMsg(t.data?.message??t),null}}async autoTranslate(){if(this.firstPlay&&1===this.data.autoTranslate&&this.videoData.videoId){this.firstPlay=!1;try{await this.translateExecutor(this.videoData.videoId)}catch(t){console.error("[VOT]",t),this.transformBtn("error","VOTLocalizedError"===t?.name?t.localizedMessage:t)}}}getPreferAudio(){return!this.audioContext||(!this.data.newAudioPlayer||(!!this.videoData.isStream||!(this.data.newAudioPlayer&&!this.data.onlyBypassMediaCSP)&&!this.site.needBypassCSP))}createPlayer(){const t=this.getPreferAudio();return F.log("preferAudio:",t),this.audioPlayer=new Ze({video:this.video,debug:!1,fetchFn:ot,preferAudio:t}),this}async init(){if(this.initialized)return;const t={autoTranslate:Y.get("autoTranslate",0),dontTranslateLanguage:Y.get("dontTranslateLanguage",[K]),dontTranslateYourLang:Y.get("dontTranslateYourLang",1),autoSetVolumeYandexStyle:Y.get("autoSetVolumeYandexStyle",1),autoVolume:Y.get("autoVolume",z),buttonPos:Y.get("buttonPos","default"),showVideoSlider:Y.get("showVideoSlider",1),syncVolume:Y.get("syncVolume",0),downloadWithName:Y.get("downloadWithName",1),sendNotifyOnComplete:Y.get("sendNotifyOnComplete",0),subtitlesMaxLength:Y.get("subtitlesMaxLength",300),highlightWords:Y.get("highlightWords",0),subtitlesFontSize:Y.get("subtitlesFontSize",20),subtitlesOpacity:Y.get("subtitlesOpacity",20),subtitlesDownloadFormat:Y.get("subtitlesDownloadFormat","srt"),responseLanguage:Y.get("responseLanguage",K),defaultVolume:Y.get("defaultVolume",100),onlyBypassMediaCSP:Y.get("onlyBypassMediaCSP",Number(!!this.audioContext)),newAudioPlayer:Y.get("newAudioPlayer",Number(!!this.audioContext)),showPiPButton:Y.get("showPiPButton",0),translateAPIErrors:Y.get("translateAPIErrors",1),translationService:Y.get("translationService",H),detectService:Y.get("detectService",W),hotkeyButton:Y.get("hotkeyButton",null),m3u8ProxyHost:Y.get("m3u8ProxyHost",q),proxyWorkerHost:Y.get("proxyWorkerHost",U),audioBooster:Y.get("audioBooster",0),useNewModel:Y.get("useNewModel",1),localeHash:Y.get("locale-hash",""),localeUpdatedAt:Y.get("locale-updated-at",0)};if(this.data=Object.fromEntries(await Promise.all(Object.entries(t).map((async([t,e])=>[t,await e])))),console.log("[VOT] data from db: ",this.data),await G(this.data,"m3u8ProxyHost","m3u8-proxy.toil.cc",q),await G(this.data,"proxyWorkerHost","vot.toil.cc",U),await G(this.data,"detectService","yandex",W),await G(this.data,"translationService","yandex",H),await G(this.data,"dontTranslateLanguage",!1,[this.data.dontTranslateLanguage],Array.isArray(this.data.dontTranslateLanguage)),!this.translateProxyEnabled&&GM_info?.scriptHandler&&j.includes(GM_info.scriptHandler)&&(this.translateProxyEnabled=1),Po)"UA"===Po&&(this.translateProxyEnabled=2);else try{const t=await ot("https://speed.cloudflare.com/meta",{timeout:7e3}),{country:e}=await t.json();Po=e,this.translateProxyEnabled="UA"===e?2:this.translateProxyEnabled}catch(t){console.error("[VOT] Error getting country:",t)}F.log("translateProxyEnabled",this.translateProxyEnabled),F.log("Extension compatibility passed..."),this.votOpts={headers:this.translateProxyEnabled?{}:{"sec-ch-ua":null,"sec-ch-ua-mobile":null,"sec-ch-ua-platform":null},fetchFn:ot,hostVOT:"https://vot.toil.cc/v1",host:this.translateProxyEnabled?this.data.proxyWorkerHost:"api.browser.yandex.ru"},this.votClient=new(this.translateProxyEnabled?ht:ct)(this.votOpts),this.subtitlesWidget=new uo(this.video,this.container,this.site),this.subtitlesWidget.setMaxLength(this.data.subtitlesMaxLength),this.subtitlesWidget.setHighlightWords(this.data.highlightWords),this.subtitlesWidget.setFontSize(this.data.subtitlesFontSize),this.subtitlesWidget.setOpacity(this.data.subtitlesOpacity),this.initUI(),this.initUIEvents(),this.videoData=await this.getVideoData(),this.createPlayer(),this.setSelectMenuValues(this.videoData.detectedLanguage,this.data.responseLanguage??"ru"),this.translateToLang=this.data.responseLanguage??"ru",this.initExtraEvents(),await Promise.all([this.updateSubtitles(),this.autoTranslate()]),this.initialized=!0}isLoadingText(t){return t.includes(rt.get("translationTake"))||t.includes(rt.get("TranslationDelayed"))}transformBtn(t,e){this.votButton.container.dataset.status=t;const o="error"===t&&this.isLoadingText(e);return this.setLoadingBtn(o),this.votButton.label.textContent=e,this.votButton.container.title="error"===t?e:"",this}setLoadingBtn(t=!1){return this.votButton.container.dataset.loading=t,this}initUI(){this.votButton=yo.createVOTButton(rt.get("translateVideo")),this.votButton.container.style.opacity=0,this.data?.buttonPos&&"default"!==this.data?.buttonPos&&this.container.clientWidth>550?(this.votButton.container.dataset.direction="column",this.votButton.container.dataset.position=this.data?.buttonPos):(this.votButton.container.dataset.direction="row",this.votButton.container.dataset.position="default"),this.container.appendChild(this.votButton.container),this.votButton.pipButton.hidden=!Z()||!this.data?.showPiPButton,this.votButton.separator2.hidden=!Z()||!this.data?.showPiPButton,this.votButton.container.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()})),this.votMenu=yo.createVOTMenu(rt.get("VOTSettings")),this.votMenu.container.dataset.position=this.container.clientWidth&&this.container.clientWidth>550?this.data?.buttonPos:"default",this.container.appendChild(this.votMenu.container),this.votDownloadButton=yo.createIconButton(oe``,c);const h=bo(n,r,s,{onSelectCb:l});return d.append(u.container,c,h.container),{container:d,fromSelect:u,icon:c,toSelect:h}},updateSlider:mo,animateLoader:function(t,e="139, 180, 245"){const o=t.querySelector(".vot-loader-helper"),i=t.querySelector(".vot-loader-main");anime.timeline({...po,targets:[o,i],duration:250}).add({"fill-opacity":0,"stroke-width":2,d:"M 12 1.5 C 17.799 1.5 22.5 6.201 22.5 12 C 22.5 17.799 17.799 22.5 12 22.5 C 6.201 22.5 1.5 17.799 1.5 12 C 1.5 6.201 6.201 1.5 12 1.5 Z",duration:0}).add({targets:o,stroke:`rgb(${e})`,"stroke-opacity":0,duration:0},0).add({targets:i,stroke:"#888888","stroke-opacity":.25},0);const a=anime.timeline({targets:o,easing:"easeInOutSine",duration:1e3,autoplay:!1}).add({strokeOpacity:1,duration:0},0).add({strokeDashoffset:[anime.setDashoffset,0]},0);return t=>{a.seek(a.duration*(t/100))}},afterAnimateLoader:function(t,e="139, 180, 245"){const o=t.querySelector(".vot-loader-helper"),i=t.querySelector(".vot-loader-main");anime.timeline({...po,targets:i,duration:600}).add({d:"M 9.0596 14.8571 L 9.7667 15.5642 L 10.4738 14.8571 L 17.0071 8.3238 C 17.0457 8.2852 17.0937 8.25 17.2333 8.25 C 17.373 8.25 17.421 8.2852 17.4596 8.3238 C 17.4981 8.3624 17.5333 8.4104 17.5333 8.55 C 17.5333 8.6896 17.4981 8.7376 17.4596 8.7762 L 9.9929 16.2429 C 9.9011 16.3346 9.8397 16.35 9.7667 16.35 C 9.6937 16.35 9.6322 16.3346 9.5404 16.2429 L 6.0738 12.7762 C 6.0352 12.7376 6 12.6897 6 12.55 C 6 12.4103 6.0352 12.3624 6.0738 12.3238 C 6.1124 12.2852 6.1603 12.25 6.3 12.25 C 6.4397 12.25 6.4876 12.2852 6.5262 12.3238 L 9.0596 14.8571 Z",duration:0}).add({strokeDashoffset:[anime.setDashoffset,0],stroke:`rgb(${e})`,"stroke-opacity":1}),setTimeout((()=>{anime.timeline({...po,targets:i,duration:600}).add({d:"M12 15.575C11.8667 15.575 11.7417 15.5542 11.625 15.5125C11.5083 15.4708 11.4 15.4 11.3 15.3L7.7 11.7C7.5 11.5 7.40417 11.2667 7.4125 11C7.42083 10.7333 7.51667 10.5 7.7 10.3C7.9 10.1 8.1375 9.99583 8.4125 9.9875C8.6875 9.97917 8.925 10.075 9.125 10.275L11 12.15V5C11 4.71667 11.0958 4.47917 11.2875 4.2875C11.4792 4.09583 11.7167 4 12 4C12.2833 4 12.5208 4.09583 12.7125 4.2875C12.9042 4.47917 13 4.71667 13 5V12.15L14.875 10.275C15.075 10.075 15.3125 9.97917 15.5875 9.9875C15.8625 9.99583 16.1 10.1 16.3 10.3C16.4833 10.5 16.5792 10.7333 16.5875 11C16.5958 11.2667 16.5 11.5 16.3 11.7L12.7 15.3C12.6 15.4 12.4917 15.4708 12.375 15.5125C12.2583 15.5542 12.1333 15.575 12 15.575ZM6 20C5.45 20 4.97917 19.8042 4.5875 19.4125C4.19583 19.0208 4 18.55 4 18V16C4 15.7167 4.09583 15.4792 4.2875 15.2875C4.47917 15.0958 4.71667 15 5 15C5.28333 15 5.52083 15.0958 5.7125 15.2875C5.90417 15.4792 6 15.7167 6 16V18H18V16C18 15.7167 18.0958 15.4792 18.2875 15.2875C18.4792 15.0958 18.7167 15 19 15C19.2833 15 19.5208 15.0958 19.7125 15.2875C19.9042 15.4792 20 15.7167 20 16V18C20 18.55 19.8042 19.0208 19.4125 19.4125C19.0208 19.8042 18.55 20 18 20H6Z",duration:100}).add({targets:o,d:"",duration:200},0).add({targets:i,"stroke-width":"0",stroke:`rgba(${e}), 0)`,"fill-opacity":"1","stroke-dasharray":"0","stroke-dashoffset":"0",duration:0})}),2e3)},createDetails:function(t){const e=document.createElement("vot-block");e.classList.add("vot-details");const o=document.createElement("vot-block");o.append(t);const i=document.createElement("vot-block");return i.classList.add("vot-details-arrow-icon"),ye(ho,i),e.append(o,i),{container:e,header:o,arrowIcon:i}}};o("./node_modules/requestidlecallback-polyfill/index.js");class wo{constructor(){this.listeners=new Set}hasListener(t){return this.listeners.has(t)}dispatchToListener(t,...e){try{t(...e)}catch(t){console.error("[VOT]",t)}}addListener(t){if(this.hasListener(t))throw new Error("[VOT] The listener has already been added.");this.listeners.add(t)}removeListener(t){if(!this.hasListener(t))throw new Error("[VOT] The listener has not been added yet.");this.listeners.delete(t)}dispatch(...t){for(const e of Array.from(this.listeners))this.dispatchToListener(e,...t)}}const xo=new Set(["advertise","promo","sponsor","banner","commercial","preroll","midroll","postroll","ad-container","sponsored"]),So=(()=>{const t=Array.from(xo).join("|");return new RegExp(t,"i")})(),ko=t=>{const e=[];for(let o=0;o({label:rt.get("langs")[t]??t.toUpperCase(),value:t,selected:e===t})))}const Io=t=>t?rt.get("VOTChangeHotkeyWithCurrent").replace("{0}",t.replace("Key","")):rt.get("VOTCreateTranslationHotkey");let Po;class Lo{translateFromLang="auto";translateToLang=K;timer;videoData="";firstPlay=!0;audioContext=Ge();hls=X();votClient;audioPlayer;videoTranslations=[];videoTranslationTTL=7200;translateProxyEnabled=0;cachedTranslation;downloadTranslationUrl=null;autoRetry;streamPing;votOpts;volumeOnStart;tempOriginalVolume;tempVolume;firstSyncVolume=!0;longWaitingResCount=0;subtitlesList=[];subtitlesListVideoId=null;dragging;constructor(t,e,o){F.log("[VideoHandler] add video:",t,"container:",e,this),this.video=t,this.container=e,this.site=o,this.abortController=new AbortController,this.extraEvents=[],this.init()}async translateVideoImpl(t,e,o,i=null){if(clearTimeout(this.autoRetry),F.log(t,`Translate video (requestLang: ${e}, responseLang: ${o})`),await At(this.site,{fetchFn:ot,video:this.video})!==t.videoId)return null;try{const a=await this.votClient.translateVideo({videoData:t,requestLang:e,responseLang:o,translationHelp:i,extraOpts:{useNewModel:this.data?.useNewModel}});if(F.log("Translate video result",a),a.translated&&a.remainingTime<1)return F.log("Video translation finished with this data: ",a),a;const n=a.message??rt.get("translationTakeFewMinutes");await this.updateTranslationErrorMsg(a.remainingTime>0?function(t){let e=Math.floor(t/60),o=Math.floor(t%60);return o/60>=.66&&(e+=1,o=0),e>=60?rt.get("translationTakeMoreThanHour"):1===e||0===e&&o>0?rt.get("translationTakeAboutMinute"):11!==e&&e%10==1?rt.get("translationTakeApproximatelyMinute2").replace("{0}",e):![12,13,14].includes(e)&&[2,3,4].includes(e%10)?rt.get("translationTakeApproximatelyMinute").replace("{0}",e):rt.get("translationTakeApproximatelyMinutes").replace("{0}",e)}(a.remainingTime):n)}catch(t){return console.error("[VOT] Failed to translate video",t),await this.updateTranslationErrorMsg(t.data?.message??t),null}return new Promise((a=>{const n=this.subtitlesList.some((t=>"yandex"===t.source))?2e4:3e4;this.autoRetry=setTimeout((async()=>{const n=await this.translateVideoImpl(t,e,o,i);(!n||n.translated&&n.remainingTime<1)&&a(n)}),n)}))}async translateStreamImpl(t,e,o){if(clearTimeout(this.autoRetry),F.log(t,`Translate stream (requestLang: ${e}, responseLang: ${o})`),await At(this.site,{fetchFn:ot,video:this.video})!==t.videoId)return null;try{const i=await this.votClient.translateStream({videoData:t,requestLang:e,responseLang:o});if(F.log("Translate stream result",i),!i.translated&&10===i.interval)return await this.updateTranslationErrorMsg(rt.get("translationTakeFewMinutes")),new Promise((a=>{this.autoRetry=setTimeout((async()=>{const i=await this.translateStreamImpl(t,e,o);i&&!i.translated&&10===i.interval||a(i)}),1e3*i.interval)}));if(i.message)throw F.log(`Stream translation aborted! Message: ${i.message}`),new st("streamNoConnectionToServer");if(!i.result)throw F.log("Failed to find translation result! Data:",i),new st("audioNotReceived");return F.log("Stream translated successfully. Running...",i),this.streamPing=setInterval((async()=>{F.log("Ping stream translation",i.pingId),this.votClient.pingStream({pingId:i.pingId})}),1e3*i.interval),i}catch(t){return console.error("[VOT] Failed to translate stream",t),await this.updateTranslationErrorMsg(t.data?.message??t),null}}async autoTranslate(){if(this.firstPlay&&1===this.data.autoTranslate&&this.videoData.videoId){this.firstPlay=!1;try{await this.translateExecutor(this.videoData.videoId)}catch(t){console.error("[VOT]",t),this.transformBtn("error","VOTLocalizedError"===t?.name?t.localizedMessage:t)}}}getPreferAudio(){return!this.audioContext||(!this.data.newAudioPlayer||(!!this.videoData.isStream||!(this.data.newAudioPlayer&&!this.data.onlyBypassMediaCSP)&&!this.site.needBypassCSP))}createPlayer(){const t=this.getPreferAudio();return F.log("preferAudio:",t),this.audioPlayer=new Ze({video:this.video,debug:!1,fetchFn:ot,preferAudio:t}),this}async init(){if(this.initialized)return;const t={autoTranslate:Y.get("autoTranslate",0),dontTranslateLanguage:Y.get("dontTranslateLanguage",[K]),dontTranslateYourLang:Y.get("dontTranslateYourLang",1),autoSetVolumeYandexStyle:Y.get("autoSetVolumeYandexStyle",1),autoVolume:Y.get("autoVolume",z),buttonPos:Y.get("buttonPos","default"),showVideoSlider:Y.get("showVideoSlider",1),syncVolume:Y.get("syncVolume",0),downloadWithName:Y.get("downloadWithName",1),sendNotifyOnComplete:Y.get("sendNotifyOnComplete",0),subtitlesMaxLength:Y.get("subtitlesMaxLength",300),highlightWords:Y.get("highlightWords",0),subtitlesFontSize:Y.get("subtitlesFontSize",20),subtitlesOpacity:Y.get("subtitlesOpacity",20),subtitlesDownloadFormat:Y.get("subtitlesDownloadFormat","srt"),responseLanguage:Y.get("responseLanguage",K),defaultVolume:Y.get("defaultVolume",100),onlyBypassMediaCSP:Y.get("onlyBypassMediaCSP",Number(!!this.audioContext)),newAudioPlayer:Y.get("newAudioPlayer",Number(!!this.audioContext)),showPiPButton:Y.get("showPiPButton",0),translateAPIErrors:Y.get("translateAPIErrors",1),translationService:Y.get("translationService",H),detectService:Y.get("detectService",W),hotkeyButton:Y.get("hotkeyButton",null),m3u8ProxyHost:Y.get("m3u8ProxyHost",q),proxyWorkerHost:Y.get("proxyWorkerHost",U),audioBooster:Y.get("audioBooster",0),useNewModel:Y.get("useNewModel",1),localeHash:Y.get("locale-hash",""),localeUpdatedAt:Y.get("locale-updated-at",0)};if(this.data=Object.fromEntries(await Promise.all(Object.entries(t).map((async([t,e])=>[t,await e])))),console.log("[VOT] data from db: ",this.data),await G(this.data,"m3u8ProxyHost","m3u8-proxy.toil.cc",q),await G(this.data,"proxyWorkerHost","vot.toil.cc",U),await G(this.data,"detectService","yandex",W),await G(this.data,"translationService","yandex",H),await G(this.data,"dontTranslateLanguage",!1,[this.data.dontTranslateLanguage],Array.isArray(this.data.dontTranslateLanguage)),!this.translateProxyEnabled&&GM_info?.scriptHandler&&j.includes(GM_info.scriptHandler)&&(this.translateProxyEnabled=1),Po)"UA"===Po&&(this.translateProxyEnabled=2);else try{const t=await ot("https://speed.cloudflare.com/meta",{timeout:7e3}),{country:e}=await t.json();Po=e,this.translateProxyEnabled="UA"===e?2:this.translateProxyEnabled}catch(t){console.error("[VOT] Error getting country:",t)}F.log("translateProxyEnabled",this.translateProxyEnabled),F.log("Extension compatibility passed..."),this.votOpts={fetchFn:ot,hostVOT:"https://vot.toil.cc/v1",host:this.translateProxyEnabled?this.data.proxyWorkerHost:"api.browser.yandex.ru"},this.votClient=new(this.translateProxyEnabled?ht:ct)(this.votOpts),this.subtitlesWidget=new uo(this.video,this.container,this.site),this.subtitlesWidget.setMaxLength(this.data.subtitlesMaxLength),this.subtitlesWidget.setHighlightWords(this.data.highlightWords),this.subtitlesWidget.setFontSize(this.data.subtitlesFontSize),this.subtitlesWidget.setOpacity(this.data.subtitlesOpacity),this.initUI(),this.initUIEvents(),this.videoData=await this.getVideoData(),this.createPlayer(),this.setSelectMenuValues(this.videoData.detectedLanguage,this.data.responseLanguage??"ru"),this.translateToLang=this.data.responseLanguage??"ru",this.initExtraEvents(),await Promise.all([this.updateSubtitles(),this.autoTranslate()]),this.initialized=!0}isLoadingText(t){return t.includes(rt.get("translationTake"))||t.includes(rt.get("TranslationDelayed"))}transformBtn(t,e){this.votButton.container.dataset.status=t;const o="error"===t&&this.isLoadingText(e);return this.setLoadingBtn(o),this.votButton.label.textContent=e,this.votButton.container.title="error"===t?e:"",this}setLoadingBtn(t=!1){return this.votButton.container.dataset.loading=t,this}initUI(){this.votButton=yo.createVOTButton(rt.get("translateVideo")),this.votButton.container.style.opacity=0,this.data?.buttonPos&&"default"!==this.data?.buttonPos&&this.container.clientWidth>550?(this.votButton.container.dataset.direction="column",this.votButton.container.dataset.position=this.data?.buttonPos):(this.votButton.container.dataset.direction="row",this.votButton.container.dataset.position="default"),this.container.appendChild(this.votButton.container),this.votButton.pipButton.hidden=!Z()||!this.data?.showPiPButton,this.votButton.separator2.hidden=!Z()||!this.data?.showPiPButton,this.votButton.container.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()})),this.votMenu=yo.createVOTMenu(rt.get("VOTSettings")),this.votMenu.container.dataset.position=this.container.clientWidth&&this.container.clientWidth>550?this.data?.buttonPos:"default",this.container.appendChild(this.votMenu.container),this.votDownloadButton=yo.createIconButton(oe` { + const requestHeaders = {}; + + for (const [key, value] of headers.entries()) { + requestHeaders[key] = value; + } + GM_xmlhttpRequest({ method: fetchOptions.method || "GET", url, @@ -2576,16 +2580,17 @@ async function GM_fetch(url, opts = {}) { ...fetchOptions, data: fetchOptions.body, timeout, + headers: requestHeaders, onload: (resp) => { - // chrome \n and ":", firefox \r\n and ": " (Only in GM_xmlhttpRequest) - // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#examples - const headers = Object.fromEntries( - resp.responseHeaders - .trim() - .split(/\r?\n/) - .map((line) => line.split(/: (.+)/)) - .filter(([key]) => key && /^[\w-]+$/.test(key)), - ); + const headers = new Headers(); + + const lines = resp.responseHeaders.trim().split(/\r?\n/); + for (const line of lines) { + const [key, ...values] = line.split(/:\s*/); + if (key) { + headers.set(key, values.join(": ")); + } + } const response = new Response(resp.response, { status: resp.status, @@ -2598,7 +2603,7 @@ async function GM_fetch(url, opts = {}) { resolve(response); }, ontimeout: () => reject(new Error("Timeout")), - onerror: (error) => reject(error), + onerror: (error) => reject(new Error(error)), onabort: () => reject(new Error("AbortError")), }); }); @@ -10242,13 +10247,6 @@ class VideoHandler { debug.log("Extension compatibility passed..."); this.votOpts = { - headers: this.translateProxyEnabled - ? {} - : { - "sec-ch-ua": null, - "sec-ch-ua-mobile": null, - "sec-ch-ua-platform": null, - }, fetchFn: GM_fetch, hostVOT: votBackendUrl, host: this.translateProxyEnabled ? this.data.proxyWorkerHost : workerHost, diff --git a/src/config/config.js b/src/config/config.js index 971c63db..7c53b1e9 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -26,7 +26,6 @@ const foswlyTranslateUrl = "https://translate.toil.cc/v2"; const detectRustServerUrl = "https://rust-server-531j.onrender.com/detect"; const proxyOnlyExtensions = [ - "Violentmonkey", "FireMonkey", "Greasemonkey", "AdGuard", diff --git a/src/index.js b/src/index.js index 6ab798e8..dabc8447 100644 --- a/src/index.js +++ b/src/index.js @@ -501,13 +501,6 @@ class VideoHandler { debug.log("Extension compatibility passed..."); this.votOpts = { - headers: this.translateProxyEnabled - ? {} - : { - "sec-ch-ua": null, - "sec-ch-ua-mobile": null, - "sec-ch-ua-platform": null, - }, fetchFn: GM_fetch, hostVOT: votBackendUrl, host: this.translateProxyEnabled ? this.data.proxyWorkerHost : workerHost, diff --git a/src/utils/utils.js b/src/utils/utils.js index 6844343f..c7b39472 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -115,22 +115,27 @@ function clearFileName(filename) { async function GM_fetch(url, opts = {}) { const { timeout = 15000, ...fetchOptions } = opts; const controller = new AbortController(); + const headers = new Headers(fetchOptions.headers || {}); try { if (url.includes("api.browser.yandex.ru")) { throw new Error("Preventing yandex cors"); } - - const response = await fetch(url, { + return await fetch(url, { signal: controller.signal, ...fetchOptions, }); - return response; } catch (err) { // Если fetch завершился ошибкой, используем GM_xmlhttpRequest // https://greasyfork.org/ru/scripts/421384-gm-fetch/code debug.log("GM_fetch preventing cors by GM_xmlhttpRequest", err.message); return new Promise((resolve, reject) => { + const requestHeaders = {}; + + for (const [key, value] of headers.entries()) { + requestHeaders[key] = value; + } + GM_xmlhttpRequest({ method: fetchOptions.method || "GET", url, @@ -138,16 +143,17 @@ async function GM_fetch(url, opts = {}) { ...fetchOptions, data: fetchOptions.body, timeout, + headers: requestHeaders, onload: (resp) => { - // chrome \n and ":", firefox \r\n and ": " (Only in GM_xmlhttpRequest) - // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#examples - const headers = Object.fromEntries( - resp.responseHeaders - .trim() - .split(/\r?\n/) - .map((line) => line.split(/: (.+)/)) - .filter(([key]) => key && /^[\w-]+$/.test(key)), - ); + const headers = new Headers(); + + const lines = resp.responseHeaders.trim().split(/\r?\n/); + for (const line of lines) { + const [key, ...values] = line.split(/:\s*/); + if (key) { + headers.set(key, values.join(": ")); + } + } const response = new Response(resp.response, { status: resp.status, @@ -160,7 +166,7 @@ async function GM_fetch(url, opts = {}) { resolve(response); }, ontimeout: () => reject(new Error("Timeout")), - onerror: (error) => reject(error), + onerror: (error) => reject(new Error(error)), onabort: () => reject(new Error("AbortError")), }); });