azot 5.0.0-alpha.22 → 5.0.0-alpha.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/azot.mjs CHANGED
@@ -1,20 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{A as shortVersion,C as SETTINGS_PATH,D as VITE_API_URL,E as APP_TITLE,O as VITE_PUBLIC_KEY,S as EXTENSIONS_SOURCES_DIR,T as APP_NAME,_ as APP_TEMP_DIR,a as prompt,b as EXTENSIONS_DIR,c as FileStorage,d as normalizeError,f as clearOutdatedLogs,g as APP_LOG_DIR,h as APP_DATA_DIR,i as httpClient,j as package_default,k as fullVersion,l as createConf,m as APP_CONFIG_DIR,n as load,o as getCurrentDateTimeString,p as logger,r as HttpClient,s as getLogPrefix,t as createContext,u as errors,v as DOWNLOAD_DIR,w as resolveDir,x as EXTENSIONS_INDEX_PATH,y as EXTENSIONS_DATA_DIR}from"./context-D70eLebO.mjs";import{createRequire}from"node:module";import fs,{constants,existsSync,rmSync}from"node:fs";import*as path$1 from"node:path";import path,{basename,dirname,extname,join,parse,resolve}from"node:path";import yargs from"yargs";import"urlpattern-polyfill";import colors from"picocolors";import*as fs$1 from"node:fs/promises";import fsp,{open,readFile,readdir,rm,stat,writeFile}from"node:fs/promises";import process$1,{platform,stdout}from"node:process";import{hideBin}from"yargs/helpers";import{EventEmitter as EventEmitter$1}from"node:events";import{z}from"zod";import{DASH_FORMATS,HLS_FORMATS,Input,UrlSource}from"dasha";import kyImport from"ky";import{Agent,ProxyAgent}from"undici";import{checkbox,confirm}from"@inquirer/prompts";import{execFileSync}from"node:child_process";import{createAuthClient}from"better-auth/client";import{deviceAuthorizationClient}from"better-auth/client/plugins";import{tributeClient}from"@tribute-tg/better-auth";import{QueryCache,QueryClient}from"@tanstack/query-core";import{createHash}from"node:crypto";import{inspect}from"node:util";import{ALL_FORMATS as ALL_FORMATS$1,EncodedAudioPacketSource,EncodedPacketSink,EncodedVideoPacketSource,Input as Input$1,MkvOutputFormat,Mp4OutputFormat,Output,StreamSource,StreamTarget,TextSubtitleSource,UrlSource as UrlSource$1}from"mediabunny";import{finished,pipeline}from"node:stream/promises";import{Readable}from"node:stream";import{isatty}from"node:tty";import{createSpinner}from"nanospinner";import{RemoteCdm,requestMediaKeySystemAccess}from"okova";import{Decryption,FilePathSource,FilePathTarget,Input as Input$2,Output as Output$1}from"shifro";import{convert}from"@transcrobes/subs-convert";import open$1 from"open";var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__commonJSMin=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),__copyProps=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=__getOwnPropNames(t),a=0,o=i.length,s;a<o;a++)s=i[a],!__hasOwnProp.call(e,s)&&s!==n&&__defProp(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=__getOwnPropDesc(t,s))||r.enumerable});return e},__toESM=(e,t,n)=>(n=e==null?{}:__create(__getProtoOf(e)),__copyProps(t||!e||!e.__esModule?__defProp(n,`default`,{value:e,enumerable:!0}):n,e)),__require=createRequire(import.meta.url);const getWinConsoleAddonPath=()=>{let e=[];process.resourcesPath&&e.push(join(process.resourcesPath,`bin`,`winconsole.node`));let t=join(__dirname,`..`,`..`,`..`);return e.push(join(t,`assets`,`bin`,`win32`,`winconsole.node`)),e.push(join(t,`native`,`winconsole`,`build`,`Release`,`winconsole.node`)),e.find(e=>existsSync(e))||null},loadWinConsoleAddon=()=>{if(process.platform!==`win32`)return null;let e=getWinConsoleAddonPath();if(!e)return null;try{return __require(e)}catch{return null}};if(process.platform===`win32`){let e=loadWinConsoleAddon();e&&(e.attachParentConsole?.(),e.enableUtf8?.())}const getCliArgs=(e=process.argv,t=process.env)=>t.ELECTRON_RUN_AS_NODE===`1`?e.slice(2):hideBin(e),getDefaultLanguage=()=>Intl.DateTimeFormat().resolvedOptions().locale.startsWith(`ru`)?`ru`:`en`,THEME={dark:`dark`,light:`light`,system:`system`},VIDEO_CONTAINER_FORMAT={mp4:`mp4`,mkv:`mkv`},SettingsSchema=z.object({downloadDir:z.string().default(DOWNLOAD_DIR),binariesDir:z.string().default(resolveDir(join(APP_CONFIG_DIR,`bin`))),drmDir:z.string().default(resolveDir(join(APP_CONFIG_DIR,`drm`))),language:z.string().default(getDefaultLanguage()),theme:z.enum([THEME.dark,THEME.light,THEME.system]).default(THEME.system),preferHardsub:z.coerce.boolean().default(!1),retry:z.coerce.number().int().min(1).max(10).default(3),connections:z.coerce.number().int().min(1).max(64).default(4),maxActiveDownloads:z.coerce.number().int().min(1).default(1),proxy:z.string().optional(),proxyMeta:z.string().optional(),proxyMedia:z.string().optional(),movieFilenameTemplate:z.string().default(`{title} ({quality}, {codec})`),seriesFilenameTemplate:z.string().default(`{title} S{s}E{e} ({quality}, {codec})`),developerMode:z.coerce.boolean().default(!1),allowUnknownSources:z.coerce.boolean().default(!1),videoContainerFormat:z.enum([VIDEO_CONTAINER_FORMAT.mp4,VIDEO_CONTAINER_FORMAT.mkv]).default(VIDEO_CONTAINER_FORMAT.mp4),useAlternativeServer:z.coerce.boolean().default(!1),automaticUpdates:z.coerce.boolean().default(!0)}),defaultSettings=SettingsSchema.parse({});var SettingsStore=class{#e;constructor(e){this.#e=createConf({defaults:defaultSettings,cwd:dirname(e),configName:basename(e,`.json`)}),this.#t()}#t(){let e=this.#e.store,t=SettingsSchema.safeParse(e),n=`{title}.{audioType}.{quality}.{tag}.{format}.{codec}`,r=`{title}.S{s}E{e}.{episodeTitle}.{audioType}.{quality}.{tag}.{format}.{codec}`;if(e.movieFilenameTemplate===`{title}.{audioType}.{quality}.{tag}.{format}.{codec}`&&this.#e.set(`movieFilenameTemplate`,e.seriesFilenameTemplate),e.seriesFilenameTemplate===`{title}.S{s}E{e}.{episodeTitle}.{audioType}.{quality}.{tag}.{format}.{codec}`&&this.#e.set(`seriesFilenameTemplate`,e.seriesFilenameTemplate),!t.success){console.warn(`Settings validation failed! Resetting to defaults.`,t.error.flatten()),this.#e.set(defaultSettings);return}Object.hasOwn(e,`askForOptions`)&&this.#e.set(t.data)}getAll(){return this.#e.store}get(e){return this.#e.get(e)}set(e){let t={...this.#e.store,...e},n=SettingsSchema.safeParse(t);if(!n.success)throw console.error(`Invalid settings update:`,n.error.flatten()),Error(`Settings update failed validation.`);this.#e.set(n.data)}onDidChange(e){this.#e.onDidAnyChange(e)}};const exists=async e=>{try{return await fsp.access(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}},ls=async(e,{recursive:t=!1}={})=>await fsp.readdir(e,{withFileTypes:!0,recursive:t}),rm$1=async(e,{recursive:t=!0,force:n=!0}={})=>{await fsp.rm(e,{recursive:t,force:n})},mkdir=async(e,{recursive:t=!0}={})=>{await fsp.mkdir(e,{recursive:t})},assertDownloadDirWritable=async e=>{try{await fsp.access(e,constants.W_OK)}catch(e){let t=e.code;throw t===`EPERM`||t===`EACCES`||t===`ENOENT`?Object.assign(Error(`Download directory is not writable`),{code:`DOWNLOAD_DIR_NOT_WRITABLE`}):e}},readJson=async e=>{try{let t=await fsp.readFile(e,{encoding:`utf8`});return JSON.parse(t)}catch(t){throw Error(`Failed to read JSON file: ${e}`,{cause:t})}},writeJson=async(e,t)=>{let n=parse(e).dir;try{let r=await exists(n);n&&!r&&await fsp.mkdir(n),await fsp.writeFile(e,JSON.stringify(t,null,2),`utf8`)}catch(t){throw Error(`Failed to save data to file: ${e}`,{cause:t})}},tar={extract:(e,t)=>execFileSync(`tar`,[`-xf`,e,...t?[`-C`,t]:[]],{stdio:`inherit`})},INSTALL_EXTENSION_ERROR_CODES={CHANNEL_NOT_FOUND:`EXTENSION_INSTALL_CHANNEL_NOT_FOUND`,VERSION_NOT_FOUND:`EXTENSION_INSTALL_VERSION_NOT_FOUND`,RELEASE_NOT_FOUND:`EXTENSION_INSTALL_RELEASE_NOT_FOUND`,ASSET_NOT_FOUND:`EXTENSION_INSTALL_ASSET_NOT_FOUND`,UNSUPPORTED_SOURCE:`EXTENSION_INSTALL_UNSUPPORTED_SOURCE`,UNSUPPORTED_PACKAGE_TYPE:`EXTENSION_INSTALL_UNSUPPORTED_PACKAGE_TYPE`,IMPORT_INVALID:`EXTENSION_INSTALL_IMPORT_INVALID`,SOURCE_NOT_FOUND:`EXTENSION_INSTALL_SOURCE_NOT_FOUND`,UNKNOWN:`EXTENSION_INSTALL_UNKNOWN`},KNOWN_INSTALL_EXTENSION_ERROR_CODES=new Set(Object.values(INSTALL_EXTENSION_ERROR_CODES));var InstallExtensionError=class extends Error{code;details;hint;constructor(e){super(e.message),this.name=`InstallExtensionError`,this.code=e.code,this.details=e.details,this.hint=e.hint}toPayload(){return{code:this.code,message:this.message,details:this.details,hint:this.hint}}};const createInstallExtensionError=(e,t,n,r)=>new InstallExtensionError({code:e,message:t,details:n,hint:r}),getChannel=e=>{let t=(e?.startsWith(`v`)?e[1]:e?.[0])??``;return Number.isNaN(parseInt(t))?e?.split(`.`).at(0)||`latest`:e?.split(`-`).at(1)?.split(`.`).at(0)||`latest`},getReleaseTag=e=>(e.version||e.tag_name||``).replace(/^v/,``),toUniqueList=e=>[...new Set(e.filter(Boolean))],getAvailableReleaseDetails=e=>({availableVersions:toUniqueList((e||[]).map(e=>getReleaseTag(e))),availableChannels:toUniqueList((e||[]).map(e=>getChannel(getReleaseTag(e))))}),createRequestedReleaseNotFoundError=(e,t,n)=>{let r={source:n,preferredVersion:e.preferredVersion,preferredChannel:e.preferredChannel,appChannel:e.appChannel,...getAvailableReleaseDetails(t)};return e.preferredVersion?createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.VERSION_NOT_FOUND,`Release not found for requested version: ${e.preferredVersion}`,r):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.CHANNEL_NOT_FOUND,`Release not found for requested channel: ${e.preferredChannel}`,r)},selectRelease=(e,t,n)=>{if(!e?.length)return null;if(t.preferredVersion)return e.find(e=>getReleaseTag(e)===t.preferredVersion)||null;if(!t.isExplicitSelection){let t=e.find(e=>getChannel(getReleaseTag(e))===`latest`);if(t)return t}return e.find(e=>getChannel(getReleaseTag(e))===t.preferredChannel)||(t.allowFallback&&t.preferredChannel!==`latest`?(logger.debug(`Release ${t.preferredChannel} not found for ${n}, falling back to latest stable`),e.find(e=>getChannel(getReleaseTag(e))===`latest`)||(logger.debug(`Latest stable release not found for ${n}, falling back to latest with any channel`),e.at(0)||null)):null)},parseReleasePreference=e=>{let[,t=``]=e.split(`@`),n=e.replace(t?`@${t}`:``,``),r=getChannel(package_default.version),i=!!t;return{name:n,preferredVersion:Number.isNaN(parseInt(t[0]??``))?``:t,preferredChannel:i?getChannel(t):r,appChannel:r,isExplicitSelection:i,allowFallback:!i&&r!==`latest`}},fetchExtensionAsset=async(e,t)=>{logger.info(`Fetching bundle...`),logger.debug(e);let n=await fetch(e);if(!n.ok)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`Failed to download extension bundle: ${n.status} ${n.statusText}`,{url:e,status:n.status,statusText:n.statusText});let r=n.headers.get(`content-disposition`)?.split(`filename=`)[1]?.split(`;`)[0]?.replaceAll(`"`,``),i=path.basename(e),a=t||r||i,o=await n.arrayBuffer(),s=path.join(EXTENSIONS_SOURCES_DIR,a);return await fsp.writeFile(s,Buffer.from(o)),await fsp.stat(s).then(e=>{logger.debug(`Bundle downloaded (${e.size/1e3} KB): ${s}`)}).catch(()=>{logger.error(`Bundle download failed: can't find output file`)}),s},downloadExtension=async(e,t)=>{if(e.startsWith(`npm:`)||e.startsWith(`@streamyx/`))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.UNSUPPORTED_SOURCE,`NPM extension sources are no longer supported`,{source:e});let n=e,r=e,i=path.dirname(e),a=i!==`.`&&await fsp.stat(i).then(()=>!0,()=>!1),o=e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`/`)||e.startsWith(`~`)||a,s=await fsp.stat(e).then(()=>!0,()=>!1),c=e.startsWith(`https://`),l=e.startsWith(`gl:`)||e.startsWith(`gitlab:`),u=e.startsWith(`github:`)||e.startsWith(`gh:`);if(o&&!s&&!c&&!u&&!l)throw logger.warn(`Installed extension not found: ${e}`),logger.warn(`Run 'azot list' and remove the extension from the list.`),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.SOURCE_NOT_FOUND,`Installed extension source not found: ${e}`,{source:e});e=e.replace(/^gl:/,``).replace(/^gitlab:/,``).replace(/^gh:/,``).replace(/^github:/,``);let d=parseReleasePreference(e),{name:f}=d;if(c)n=await fetchExtensionAsset(e);else if(u){let[e,t]=f.split(`/`),r=`https://api.github.com/repos/${e}/${t}/releases`,i=await fetch(r).then(e=>e.json());if(i?.message&&!Array.isArray(i))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitHub releases request failed: ${i.message}`,{source:f,provider:`github`,apiMessage:i.message});let a=Array.isArray(i)?i:[],o=selectRelease(a,d,f);if(!o)throw d.isExplicitSelection?createRequestedReleaseNotFoundError(d,a,f):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitHub release not found`,{source:f,provider:`github`,...getAvailableReleaseDetails(a)});let s=o.assets?.find(e=>e.name.endsWith(`.tgz`)||e.name.endsWith(`.zip`));if(!s)throw logger.debug(o),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`GitHub release asset not found`,{source:f,provider:`github`,releaseTag:getReleaseTag(o)});let c=s.browser_download_url;n=await fetchExtensionAsset(c)}else if(!s){let e=t?.find(e=>e.name===f),r=e?.releases||[],i=selectRelease(r,d,f),a=i?.assets.find(e=>e.name.endsWith(`.tgz`));if(e&&!i&&d.isExplicitSelection)throw createRequestedReleaseNotFoundError(d,r,f);if(a)n=await fetchExtensionAsset(a.url,a.name);else{let[e,t=`streamyx-extensions`]=f.split(`/`).reverse(),r=`https://gitlab.com/api/v4/projects/${t}%2F${e}/releases`,i=await fetch(r).then(e=>e.json());if(i?.message&&!Array.isArray(i))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitLab releases request failed: ${i.message}`,{source:f,provider:`gitlab`,apiMessage:i.message});let a=Array.isArray(i)?i:[],o=selectRelease(a,d,f);if(!o)throw d.isExplicitSelection?createRequestedReleaseNotFoundError(d,a,f):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitLab release not found`,{source:f,provider:`gitlab`,...getAvailableReleaseDetails(a)});let s=o.assets?.links?.find(e=>e.name.endsWith(`.tgz`));if(!s)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`GitLab release asset not found`,{source:f,provider:`gitlab`,releaseTag:getReleaseTag(o)});n=await fetchExtensionAsset(s.direct_asset_url||s.url,s.name)}}let p=path.extname(n),m=p===`.zip`,h=p===`.tgz`,g=new Set([`.js`,`.mjs`,`.cjs`]).has(p),_=await fsp.stat(n).then(e=>e.isDirectory()).catch(()=>!1);if(g?r=path.dirname(n):_?r=n:(r=n.replace(`.tgz`,``).replace(`.zip`,``),await exists(r)||await mkdir(r)),m||h)tar.extract(n,r),await rm$1(n);else if(!(g||_))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.UNSUPPORTED_PACKAGE_TYPE,`Unsupported package type`,{source:e,extensionSource:n,packageType:p||`unknown`});return r},getExports=e=>e&&`exports`in e?e.exports:e,getExtensionName=e=>e?.package?.name||`(unknown extension)`,getExtensionApiVersion=e=>{let t=getExports(e);return!t||typeof t!=`object`?null:typeof t.resolveEntries==`function`?`v2`:typeof t.getMediaInfo==`function`?`legacy-media`:typeof t.fetchContentMetadata==`function`?`legacy-content`:null},isSupportedExtensionExports=e=>getExtensionApiVersion(e)!==null,getCompatibleExtensionExports=e=>{let t=getExports(e);if(!t||typeof t!=`object`)throw Error(`Invalid extension exports`);return t},initializeExtension=async e=>{let t=getCompatibleExtensionExports(e),n=getExtensionName(e);try{if(typeof t.setup==`function`){await t.setup();return}typeof t.init==`function`&&await t.init()}catch(e){let r=typeof t.setup==`function`?`setup`:`init`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${n} ${r} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},loginWithExtension=async(e,t)=>{let n=getCompatibleExtensionExports(e),r=getExtensionName(e);try{if(typeof n.auth?.login==`function`){await n.auth.login(t);return}typeof n.login==`function`&&await n.login(t)}catch(e){let t=typeof n.auth?.login==`function`?`auth.login`:`login`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${r} ${t} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},logoutWithExtension=async e=>{let t=getCompatibleExtensionExports(e),n=getExtensionName(e);try{if(typeof t.auth?.logout==`function`){await t.auth.logout();return}typeof t.logout==`function`&&await t.logout()}catch(e){let r=typeof t.auth?.logout==`function`?`auth.logout`:`logout`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${n} ${r} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},runBeforeDownloadHook=async e=>{let t=getCompatibleExtensionExports(e);typeof t.hooks?.beforeDownload==`function`&&await t.hooks.beforeDownload()},runAfterDownloadHook=async(e,{skipMux:t=!1}={})=>{let n=getCompatibleExtensionExports(e),r=getExtensionName(e);if(!t&&typeof n.hooks?.afterMux==`function`)try{await n.hooks.afterMux()}catch(e){let t=e instanceof Error?e:Error(String(e));logger.error(`Extension ${r} hooks.afterMux failed: ${t.message}`),t.stack&&logger.debug(t.stack)}if(typeof n.onDownloadFinished==`function`)try{await n.onDownloadFinished()}catch(e){let t=e instanceof Error?e:Error(String(e));logger.error(`Extension ${r} onDownloadFinished failed: ${t.message}`),t.stack&&logger.debug(t.stack)}},loadExtension=async(e,{context:t,dirname:n,skipValidation:r})=>{let i=await load(e,{dirname:n,context:t}).finally(()=>{});if(!i)return null;let a=`default`in i.exports?i.exports.default:i.exports;if(!r&&!isSupportedExtensionExports(a))throw logger.error(`Incompatible extension interface`),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Incompatible extension interface`,{extensionPath:e});return i.exports=a,i},sanitizeExtensionName=e=>e.split(`/`).reverse()[0].replaceAll(`@`,``).replace(`extension-`,``).replace(`-extension`,``),readExtensionInfo=async e=>{let t=[join(e,`package.json`),join(e,`package`,`package.json`)],n;for(let e of t)if(await exists(e)){n=e;break}let r={},i=``,a=``,o=``;if(n){let e=dirname(n);r=__require(n)||{},i=join(e,r.main||`index.js`),a=r.name,o=e}else{let t=await ls(e),n=t.find(e=>e.name===`index.js`)||t.find(e=>e.name===`main.js`)||t.find(e=>e.name===`service.js`)||t.find(e=>e.name===`extension.js`)||t.find(e=>e.name.endsWith(`.js`));n&&(i=join(e,n.name),a=parse(i).name)}if(!i)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Extension main script not found: ${e}`,{dir:e});return o||=dirname(i),{name:sanitizeExtensionName(a),path:i,dir:o,package:r}},importExtension=async(e,t)=>{try{let n=await readExtensionInfo(e),r=n.package?.config?.title||n.name,i=createContext({name:n.name,title:r,dir:EXTENSIONS_DATA_DIR});await i.cookieStore.import(join(EXTENSIONS_DATA_DIR,n.name,`cookies.txt`));let a=await loadExtension(n.path,{context:i,dirname:n.dir});if(!a)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Failed to load extension script: ${n.path}`,{source:t,dir:e,path:n.path});return{source:t,exports:a.exports,context:i,...n}}catch(e){throw logger.error(`Error importing module: ${e.message}`),logger.debug(e instanceof Error?e.stack||e.message:String(e)),e}},PRIMARY_API_URL=VITE_API_URL;let apiBaseUrl=PRIMARY_API_URL;const normalizeBase=e=>e.replace(/\/+$/,``),getApiBaseUrl=()=>normalizeBase(apiBaseUrl),joinUrl=(e,t)=>{let n=normalizeBase(e);return t?`${n}/${t.startsWith(`/`)?t.slice(1):t}`:n},getApiUrl=e=>joinUrl(getApiBaseUrl(),e);let publicKey=null;async function verifyResponse(e){if(!publicKey){logger.debug(`Public key not found`);let e=await fetchPublicKey();if(e)logger.debug(`Public key found: ${e.slice(0,50)}...`);else return logger.error(`Public key not found in response`),!1;if(publicKey=await importPublicKey(e).catch(()=>null),!publicKey)return logger.error(`Public key import failed`),!1}let t=e.headers.get(`X-Signature-Timestamp`),n=e.headers.get(`X-Signature`);if(!t||!n)return logger.error(`Signature headers not found`),!1;if(Date.now()-parseInt(t)>3e5)return!1;let r=`${t}:${await e.clone().text()}`,i=base64ToArrayBuffer(n),a=new TextEncoder,o=crypto.subtle.verify({name:`ECDSA`,hash:`SHA-256`},publicKey,i,a.encode(r));return o||(publicKey=null),o}const getPublicKeyFromEnv=()=>atob(VITE_PUBLIC_KEY);async function fetchPublicKey(e=`/auth/.well-known/public-key`){try{let t=await fetch(`${getApiBaseUrl()}${e}`);return t.ok?await t.text():getPublicKeyFromEnv()}catch(e){return logger.error(e.message),getPublicKeyFromEnv()}}async function importPublicKey(e){let t=base64ToArrayBuffer(e.replace(`-----BEGIN PUBLIC KEY-----`,``).replace(`-----END PUBLIC KEY-----`,``).trim());return crypto.subtle.importKey(`spki`,t,{name:`ECDSA`,namedCurve:`P-256`},!0,[`verify`])}function base64ToArrayBuffer(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}const createClient$1=e=>createAuthClient({baseURL:`${e}/auth`,plugins:[deviceAuthorizationClient(),tributeClient()],fetchOptions:{retry:0,onSuccess:e=>{let t=e.response.headers.get(`set-auth-token`);t&&(authState.accessToken=t,saveAuth(authState))},auth:{type:`Bearer`,token:()=>authState.accessToken||loadAuth().then(e=>e?.accessToken)},onResponse:async e=>await verifyResponse(e.response).catch(()=>!1)?(logger.debug(`Response verified: ${e.response.url}`),e):(logger.error(`Response verification failed: ${e.response.status} ${e.response.statusText} ${e.response.url}`),errors.emit(`error`,{code:`SIGNATURE_VERIFICATION_FAILED`}),new Response(JSON.stringify({error:`SIGNATURE_VERIFICATION_FAILED`,message:`Signature verification failed`}),{status:401,statusText:`Unauthorized`}))}});let authClientBaseUrl=``,authClient=createClient$1(getApiBaseUrl());const getAuthClient=()=>{let e=getApiBaseUrl();return(!authClient||authClientBaseUrl!==e)&&(authClientBaseUrl=e,authClient=createClient$1(e)),authClient},getJson=async(e,t,n={})=>{let{signal:r,timeoutMs:i=1e4}=n,a=new AbortController,o=()=>a.abort(r?.reason);r?.addEventListener(`abort`,o,{once:!0});let s=!1,c=setTimeout(()=>{s=!0,a.abort(Error(`Request timeout`))},i);try{let n=await fetch(e,{...t,signal:a.signal});if(!n.ok)throw Error(`Request failed: ${n.status}`);return n.json()}catch(e){throw s&&e instanceof DOMException&&e.name===`AbortError`?Error(`Request timed out after ${i}ms`,{cause:e}):e}finally{clearTimeout(c),r?.removeEventListener(`abort`,o)}},backendApi={getExtensions:(e,t)=>getJson(getApiUrl(`extensions`),{headers:e?{Authorization:`Bearer ${e}`}:void 0},{signal:t}),getSubscriptions:(e,t)=>getJson(getApiUrl(`subscriptions`),{headers:{Authorization:`Bearer ${e}`}},{signal:t})},STALE_TIME=300*1e3,GC_TIME=300*1e3,queryClient=new QueryClient({queryCache:new QueryCache,defaultOptions:{queries:{staleTime:STALE_TIME,gcTime:GC_TIME}}}),cache={get:e=>queryClient.getQueryData(e),set:(e,t)=>queryClient.setQueryData(e,t),reset:e=>{e?queryClient.removeQueries({queryKey:e}):queryClient.clear()},invalidate:e=>queryClient.invalidateQueries({queryKey:e}),refresh:async(e,t)=>(queryClient.invalidateQueries({queryKey:e}),useQuery({queryKey:e,queryFn:t}))},useQuery=async({queryKey:e,queryFn:t,staleTime:n,enabled:r=!0})=>{try{let i=queryClient.getQueryState(e),a=i?i?.isInvalidated||!i?.dataUpdatedAt&&!i?.errorUpdatedAt||Date.now()-i.dataUpdatedAt>(n??STALE_TIME):!0,o=()=>cache.reset(e),s=()=>cache.invalidate(e),c=()=>cache.refresh(e,t);return r?i&&!a?{data:i.data,reset:o,invalidate:s,refresh:c}:{data:await queryClient.fetchQuery({queryKey:e,queryFn:t,staleTime:n}),reset:o,invalidate:s,refresh:c}:{data:null,reset:o,invalidate:s,refresh:c}}catch(t){throw queryClient.removeQueries({queryKey:e}),t}},sessionStorage=new FileStorage(join(APP_DATA_DIR,`session.json`)),authState={accessToken:``,tokenType:``,scope:``,createdAt:``},saveAuth=async e=>{sessionStorage.setItem(`access_token`,e.access_token),sessionStorage.setItem(`token_type`,e.token_type||`Bearer`),sessionStorage.setItem(`scope`,e.scope),sessionStorage.setItem(`created_at`,new Date().toISOString()),authState.accessToken=e.access_token,authState.tokenType=e.token_type||`Bearer`,authState.scope=e.scope,authState.createdAt=new Date().toISOString()},loadAuth=async()=>{let e=sessionStorage.getItem(`access_token`),t=sessionStorage.getItem(`token_type`),n=sessionStorage.getItem(`scope`),r=sessionStorage.getItem(`created_at`);return!e||!t||!n||!r?null:{accessToken:e,tokenType:t,scope:n,createdAt:new Date(r)}},getAuth=async()=>{let e=await useQuery({queryKey:[`session`,getApiBaseUrl()],queryFn:()=>getAuthClient().getSession()});return{session:e.data?.data?.session,user:e.data?.data?.user,error:e.data?.error}},getSubscriptions=async()=>{let{user:e,error:t}=await getAuth(),n=await useQuery({queryKey:[`subscriptions`,getApiBaseUrl()],queryFn:async()=>getAuthClient().subscription.list(),enabled:!!e?.id});return{data:n.data?.data,error:n.data?.error??t}},basicBenefits=[`lowConnectionsCount`,`oneDevice`],plusBenefits=[`mediumConnectionsCount`,`twoDevices`,`proxy`,`decryption`,`customIcon`,`tags`,`parallelDownloads`,`userExtensions`,`portableBuild`],proBenefits=[`highConnectionsCount`,`threeDevices`,`customMuxFormat`,`customDecrypter`,`customDrmClient`,`premiumExtensions`],benefits={basic:basicBenefits,plus:plusBenefits,pro:[...basicBenefits,...plusBenefits,...proBenefits]},getUserSubscriptions=()=>useQuery({queryKey:[`lava-subscriptions`,getApiBaseUrl()],queryFn:async()=>{let e=authState.accessToken||(await loadAuth())?.accessToken;return e?backendApi.getSubscriptions(e):[]}}),getUserPlan=async()=>{let e=await getSubscriptions();return{plan:(await getUserSubscriptions()).data?.[0]?.productTitle||e.data?.find(e=>new Date(e.expiresAt)>new Date)?.tributeSubscriptionName,error:e.error}},getCustomerState=async()=>{let{user:e,session:t}=await getAuth(),{plan:n,error:r}=await getUserPlan();return{user:e,session:t,error:r,plan:n,grantedBenefits:n?benefits[n.toLowerCase()]??[]:[]}};var require_builtins=__commonJSMin(((e,t)=>{t.exports={instagram:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h={Referer:`https://www.instagram.com/`},g={"X-IG-App-ID":`936619743392459`,"User-Agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36`},_=async e=>{let t=new URLSearchParams({doc_id:`8845758582119845`,variables:JSON.stringify({shortcode:e,child_comment_count:3,fetch_comment_count:40,parent_comment_count:24,has_threaded_comments:!0})});try{let e=await n(`https://www.instagram.com/graphql/query/?${t.toString()}`,{headers:g});return e.ok?(await e.json()).data?.xdt_shortcode_media??null:(a.error(`GraphQL request failed with status: ${e.status}`),null)}catch(e){return a.error(`Error during GraphQL fetch:`,e),null}},v=async e=>{try{let t=await n(`https://www.instagram.com/p/${e}/embed/captioned/`,{headers:{"User-Agent":g[`User-Agent`]}});if(!t.ok)return null;let r=(await t.text()).match(/window\.__additionalDataLoaded\('extra',\s*({.+?})\s*\);/);return r?.[1]?JSON.parse(r[1]).shortcode_media??null:null}catch(e){return a.error(`Error during embed page fetch:`,e),null}},y=e=>{let t=e.edge_media_to_caption?.edges?.[0]?.node?.text||`Instagram Post`,n=[],r=e=>{if(!e)return;let r=e.is_video&&e.video_url?e.video_url:e.display_url;r&&n.push({title:t,input:new p({source:new m(r,{requestInit:{headers:h}})})})},i=e.edge_sidecar_to_children?.edges;if(i?.length)for(let e of i)r(e.node);else r(e);return n};t.exports=f({canHandle:e=>{try{let t=new URL(e).hostname.toLowerCase();return t===`instagram.com`||t.endsWith(`.instagram.com`)}catch{return!1}},async resolveEntries(e){let t=new URLPattern({pathname:`/:type(p|reel|tv|reels|videos)/:shortcode{/*}?`,baseURL:new URL(e).origin}).exec(e)?.pathname.groups.shortcode;if(!t)return a.error(`Could not extract a valid Instagram shortcode from the URL`),a.debug(e),[];try{let e=await _(t);return e||=(a.warn(`GraphQL method failed. Falling back to embed page scraping.`),await v(t)),e?y(e):(a.error(`All extraction methods failed. The post may be private, deleted, or require a login.`),[])}catch(e){return a.error(`A critical error occurred while fetching Instagram metadata:`,e),[]}}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/41/91/13/419113d2-6246-c557-669e-0f0a5c62bcc5/Prod-0-0-1x_U007epad-0-1-0-sRGB-85-220.png/460x0w.webp`,title:`Instagram`,name:`Instagram`},pkg:{name:`instagram`,version:`0.0.1`,private:!0,keywords:[`social-networks`],homepage:`https://instagram.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`instagram.ts`,config:{icon:`https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/41/91/13/419113d2-6246-c557-669e-0f0a5c62bcc5/Prod-0-0-1x_U007epad-0-1-0-sRGB-85-220.png/460x0w.webp`,title:`Instagram`}}},ntv:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=(e,t,n)=>e.split(t)[1]?.split(n)[0],g=(e,t)=>{let n=h(e,`<${t}>`,`</${t}>`)?.trim();if(!n)return;let r=n.match(/<!\[CDATA\[(.*?)\]\]>/s);return r?.[1]?r[1].trim():n.split(`DATA[`)[1]?.split(`]`)[0]?.trim()||n},_=async(e,t)=>{let r=await n(e);return r.ok?await r.text():(a.error(`Failed to fetch ${t}. Status: ${r.status} ${r.statusText}`),null)},v=async(e,t,n)=>{let r=new URL(e).pathname,i=new Set;for(let n of t.split(`href="/serial`)){if(!n.startsWith(`/`))continue;let t=n.split(`"`)[0];!t||t.length<=1||t.includes(`/issues/`)||t.includes(`/about/`)||t.split(`/`).length<=2||i.add(e.replace(r,`/serial${t}`))}let a=[];for(let e of i)a.push(...await y(e,n));return a},y=async(e,t=new Set)=>{if(t.has(e))return[];t.add(e);let n=await _(e,`NTV page`);if(!n)return[];let r=h(n,`<meta property="ya:ovs:feed_url" content="`,`">`)??h(n,`<meta property="ya:ovs:feed_url" content="`,`" />`);if(!r)return new URL(e).pathname.includes(`/serial`)?v(e,n,t):(a.error(`Could not find video link in the page.`),[]);let i=r.split(`video/`)[1]?.split(`/`)[0];if(!i)return a.error(`Could not parse NTV video id.`),[];let o=await _(`https://www.ntv.ru/vi${i}/`,`NTV XML metadata`);if(!o)return[];let s=g(o,`dash`)||g(o,`hls`),c=g(o,`file`)||g(o,`video`),l=g(o,`hifile`)||g(o,`hd_video`)||s||c;if(!l)return a.error(`Could not resolve NTV media URL.`),[];let u=h(o,`<embed_tag>`,`</embed_tag>`)||`NTV`,d=h(n,`"name":"`,`"`),f=d?.includes(`серия`)?d.split(`-`)[0]:void 0,y=f?parseInt(f,10):void 0,b=h(o,`<subtitles>`,`</subtitles>`),x=b?`https://www.ntv.ru${b}`:void 0;x&&a.debug(`Subtitles: ${x}`);let S=new p({source:new m(l)});return x&&S.addSubtitleTrack(new m(x),{languageCode:`ru`,name:`Russian`}),[{type:y?`episode`:`video`,title:u,season:y?1:void 0,episode:y,input:S}]};t.exports=f({resolveEntries(e){return y(e,new Set)}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.ntv.ru/static/images/logo.png`,title:`НТВ`,name:`НТВ`},pkg:{name:`ntv`,version:`0.0.9`,private:!0,keywords:[`tv-channels`],homepage:`https://www.ntv.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`ntv.ts`,config:{icon:`https://static.ntv.ru/static/images/logo.png`,title:`НТВ`}}},rbc:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=await n(e);if(!t.ok)throw Error(`Failed to fetch RBC page: ${t.status} ${t.statusText}`);let r=(await t.text()).match(/(?:https?:)?\/\/[^\s"'<>]+\.m3u8(?:\?[^\s"'<>]*)?/i)?.[0];if(!r)throw Error(`Could not find RBC playlist URL.`);return[{type:`video`,input:new p({source:new m(r.startsWith(`//`)?`https:${r}`:r)})}]}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/A-G-s2Q1x2iqq3qHCAo66-nllrtlqEr7XNU_JKXt4mQ/preset:web_app_icon_160/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS80MGViMWY3MS1kMDkzLTQ2NDMtOTkyNi0xZWM0ZjkwNzViMTQ=.webp`,title:`РБК`,name:`РБК`},pkg:{name:`rbc`,version:`0.0.2`,private:!0,keywords:[`news`],homepage:`https://rbc.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`rbc.ts`,config:{icon:`https://static.rustore.ru/imgproxy/A-G-s2Q1x2iqq3qHCAo66-nllrtlqEr7XNU_JKXt4mQ/preset:web_app_icon_160/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS80MGViMWY3MS1kMDkzLTQ2NDMtOTkyNi0xZWM0ZjkwNzViMTQ=.webp`,title:`РБК`}}},rutube:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=[`/video/:id{/}?`,`/play/embed/:id{/}?`,`/shorts/:id{/}?`,`/yappy/:yappyId{/}?`,`/video/private/:id{/}?`],g=e=>{let t={yappyId:``,id:``,key:``};t.key=new URL(e).searchParams.get(`p`)??``;for(let n of h){let r=new URLPattern(n,`https://rutube.ru`).exec(e);r&&(Object.assign(t,r.pathname.groups),Object.assign(t,r.search.groups))}return t},_=async e=>{let t=(await n(`https://rutube.ru/pangolin/api/web/yappy/yappypage/?client=wdp&videoId=${e}&page=1&page_size=15`).then(e=>e.json()).catch(()=>null))?.results?.find(t=>String(t.id)===e)?.link;return t?[{type:`video`,title:`rutube_yappy_${e}`,input:new p({source:new m(t)})}]:(a.error(`ErrorEmptyDownload`),[])};t.exports=f({async resolveEntries(e){let t=g(e);if(t.yappyId)return _(t.yappyId);if(!t.id)return a.error(`Could not extract Rutube video id`),[];let r=new URL(`https://rutube.ru/api/play/options/${t.id}/?no_404=true&referer&pver=v2`);t.key&&r.searchParams.set(`p`,t.key);let i=await n(r).then(e=>e.json()).catch(e=>(e instanceof Error&&a.debug(e.message),null));return i?i.detail||!i.video_balancer?.m3u8?(a.error(`Play info is empty`),[]):i.live_streams?.hls?(a.error(`Live videos are not supported`),[]):[{type:`video`,title:i.title?.trim()||`rutube_${t.id}`,input:new p({source:new m(i.video_balancer.m3u8)})}]:(a.error(`Cannot fetch play info`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/vcyBc0LG-3ybXcGs_-_OJXH9ULjoegHlLs-DacemG08/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjQ2MjA3L2NvbnRlbnQvSUNPTi9hNTZhZWJlMy01NjVhLTRiZjYtOTQyZC0xZjE0OTk0YjlhNmUucG5n.webp`,title:`RUTUBE`,name:`RUTUBE`},pkg:{name:`rutube`,version:`0.0.13`,private:!0,keywords:[`video-hostings`],homepage:`https://rutube.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`rutube.ts`,config:{icon:`https://static.rustore.ru/imgproxy/vcyBc0LG-3ybXcGs_-_OJXH9ULjoegHlLs-DacemG08/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjQ2MjA3L2NvbnRlbnQvSUNPTi9hNTZhZWJlMy01NjVhLTRiZjYtOTQyZC0xZjE0OTk0YjlhNmUucG5n.webp`,title:`RUTUBE`}}},soundcloud:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask;let p=d.utils,m=d.Input,h=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let g={version:``,id:``},_=async()=>{try{let e=await n(`https://soundcloud.com/`).then(e=>e.text()).catch(e=>{let t=e instanceof Error&&e.cause!=null?String(e.cause):``;return e instanceof Error&&t.includes(`ECONNRESET`)&&a.warn(`Soundcloud may be blocked in your region. Use proxy or VPN to bypass restrictions.`),``}),t=e.match(/window\.__sc_version="([0-9]{10})"/)?.[1];if(t&&g.version===t)return g.id;let r=``;for(let t of e.matchAll(/<script.+src="(.+)">/g)){let e=t[1];if(!e?.startsWith(`https://a-v2.sndcdn.com/`))continue;let i=(await n(e).then(e=>e.text()).catch(()=>``)).match(/\("client_id=[A-Za-z0-9]{32}"\)/)?.[0].match(/[A-Za-z0-9]{32}/)?.[0];if(i){r=i;break}}return t&&(g.version=t,g.id=r),r}catch{return``}},v=e=>e.audioCodecs?.some(e=>e===`aac`||e===`mp3`)??!1;t.exports=f({async resolveEntries(e,t){let{author:r,song:i,accessKey:a,shortLink:o}=p.execUrlPatterns(e,[`:author/:song/s-:accessKey`,`:author/:song`,`:shortLink`],[`https://soundcloud.com`,`https://on.soundcloud.com`]).pathname,s=await _();if(!s)throw Error(`No client ID`);let c;if(new URL(e).hostname===`on.soundcloud.com`&&o&&(c=await n(`https://on.soundcloud.com/${o}/`,{redirect:`manual`}).then(e=>{let t=e.headers.get(`location`);if(e.status===302&&t?.startsWith(`https://soundcloud.com/`))return t.split(`?`,1)[0]}).catch(()=>void 0)),!c&&r&&i&&(c=`https://soundcloud.com/${r}/${i}${a?`/s-${a}`:``}`),!c)throw Error(`Could not fetch`);let l=await n(`https://api-v2.soundcloud.com/resolve?url=${c}&client_id=${s}`).then(e=>e.status===200?e.json():null).catch(()=>null);if(!l)throw Error(`Could not fetch`);let u=l.media?.transcodings;if(!u?.length)throw Error(`Empty download`);let d=u.find(e=>e.preset===`opus_0_0`),f=u.find(e=>e.preset===`mp3_0_0`);if(f&&(v(t)||!d)&&(d=f),!d)throw Error(`Empty download`);let g=`${d.url}${d.url.includes(`?`)?`&`:`?`}client_id=${s}&track_authorization=${l.track_authorization}`;if(!g.startsWith(`https://api-v2.soundcloud.com/media/soundcloud:tracks:`))throw Error(`Empty download`);let y=await n(g).then(async e=>(await e.json()).url??``).catch(()=>``);if(!y)throw Error(`Could not fetch`);return[{type:`audio`,title:l.title.trim(),author:l.user.username.trim(),input:new m({source:new h(y)})}]}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://play-lh.googleusercontent.com/JSSeB3XQtb9sHD5FWTqVM4AksY_Kg2q20eExenxGqPJZdn2uVQxi8eoHkP5MA-IR4w=w480-h960-rw`,title:`SoundCloud`,name:`SoundCloud`},pkg:{name:`soundcloud`,version:`0.0.6`,private:!0,keywords:[`music`],homepage:`https://soundcloud.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`soundcloud.ts`,config:{icon:`https://play-lh.googleusercontent.com/JSSeB3XQtb9sHD5FWTqVM4AksY_Kg2q20eExenxGqPJZdn2uVQxi8eoHkP5MA-IR4w=w480-h960-rw`,title:`SoundCloud`}}},tiktok:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({canHandle:e=>{try{let t=new URL(e).hostname.toLowerCase();return t===`tiktok.com`||t.endsWith(`.tiktok.com`)}catch{return!1}},async resolveEntries(e){let t=await n(e);if(!t.ok)return a.error(`Failed to fetch TikTok page. Status: ${t.status}`),[];let r=(await t.text()).split(`<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__" type="application/json">`)[1]?.split(`<\/script>`)[0];if(!r)return a.error(`Could not find target script tag. TikTok might have updated their page structure.`),[];let i;try{i=JSON.parse(r)}catch(t){return a.error(`Failed to parse TikTok page JSON`,t,{url:e}),[]}let o=i.__DEFAULT_SCOPE__?.[`webapp.video-detail`],s=o?.itemInfo?.itemStruct;if(!s)return a.error(`Could not find video data in the JSON payload. The content might be unavailable or the structure has changed.`),o?.statusMsg&&a.error(`Error ${o.statusCode}: ${o.statusMsg}`),[];let l=s.video?.playAddr;return l?[{type:`video`,title:s.desc||`TikTok Video`,input:new p({source:new m(l,{requestInit:{headers:{Referer:`https://www.tiktok.com/`,Cookie:c.cookie}}})})}]:(a.error(`Could not find a video URL (playAddr) in the JSON payload.`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{name:`TikTok`,tag:`TT`,icon:`https://play-lh.googleusercontent.com/LdBITldj-tJxqLm-CsWSbnt4BMo2gk53cgM7mWIL-zn44m1ywLyQgxRsHKqp8r0qceXs=w480-h960-rw`,permissions:[],matches:[`https://*.tiktok.com/*`],manifestVersion:1,title:`TikTok`},pkg:{name:`tiktok`,version:`0.0.2`,private:!0,keywords:[`social-networks`],homepage:`https://www.tiktok.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`tiktok.ts`,config:{name:`TikTok`,tag:`TT`,icon:`https://play-lh.googleusercontent.com/LdBITldj-tJxqLm-CsWSbnt4BMo2gk53cgM7mWIL-zn44m1ywLyQgxRsHKqp8r0qceXs=w480-h960-rw`,permissions:[],matches:[`https://*.tiktok.com/*`],manifestVersion:1,title:`TikTok`}}},virtualroom:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=new URL(e).searchParams.get(`recordId`);if(!t)return a.error(`Could not extract VirtualRoom recordId.`),[];let r=await n(`https://mv1.virtualroom.ru/vr/player/records/${t}/info`).then(e=>e.ok?e.json():null).catch(()=>null),i=await n(`https://mv1.virtualroom.ru/vr/player/records/${t}/events`).then(e=>e.ok?e.json():null).catch(()=>null),o=r?.data?.roomParameters?.name??`VirtualRoom`;return(i?.data?.translations??[]).filter(e=>!!e.url).map(e=>({title:[o,e.type,e.source,e.start].filter(Boolean).join(` `),input:new p({source:new m(e.url)})}))}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://sun9-50.userapi.com/impg/rY5N7sdA93TFdjkeYqPTnPIjvCJ0rALo_V7V8g/zLAaAv0PpvY.jpg?size=400x400&quality=95&sign=5ddcd6358131b204b8619cb8eeff943f&type=album`,title:`VirtualRoom`,name:`VirtualRoom`},pkg:{name:`virtualroom`,version:`0.0.7`,private:!0,keywords:[`videotelephony`],homepage:`https://virtualroom.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`virtualroom.ts`,config:{icon:`https://sun9-50.userapi.com/impg/rY5N7sdA93TFdjkeYqPTnPIjvCJ0rALo_V7V8g/zLAaAv0PpvY.jpg?size=400x400&quality=95&sign=5ddcd6358131b204b8619cb8eeff943f&type=album`,title:`VirtualRoom`}}},vk:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=[`2160`,`1440`,`1080`,`720`,`480`,`360`,`240`,`144`],g=e=>{let t=e.match(/video-(\d+)_(\d+)/);return t?{ownerId:t[1],videoId:t[2]}:null},_=e=>{if(!e)return null;for(let t of e)if(Array.isArray(t)){for(let e of t)if(e&&typeof e==`object`&&`player`in e)return e}return null},v=(e,t)=>{let n=t.videoQuality?.replace(`p`,``).trim(),r=h.filter(t=>!!e[`url${t}`]);return r.length?n&&r.includes(n)?n:r[0]:null};t.exports=f({async resolveEntries(e,t){let r=g(e);if(!r)return a.error(`Could not extract VK video identifiers`),[];let i=await n(`https://vkvideo.ru/al_video.php?act=show`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded; charset=utf-8`,accept:`*/*`,"accept-language":`ru-RU,ru;q=0.9`,"sec-ch-ua":`"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"`,"sec-ch-ua-mobile":`?0`,"sec-ch-ua-platform":`"macOS"`,"sec-fetch-dest":`empty`,"sec-fetch-mode":`cors`,"sec-fetch-site":`same-origin`,"x-requested-with":`XMLHttpRequest`,Referer:e,"Referrer-Policy":`strict-origin-when-cross-origin`},body:new URLSearchParams({al:`1`,autoplay:`1`,claim:``,force_no_repeat:`true`,is_video_page:`true`,list:``,module:`direct`,t:``,video:`-${r.ownerId}_${r.videoId}`}).toString()});if(!i.ok)throw Error(`VK request failed: ${i.status} ${i.statusText}`);let o=_((await i.json()).payload),s=o?.player?.params,l=s&&s.length>0?s[0]:void 0;if(!o||!l)return a.error(`Could not find VK player payload`),[];if(o.mvData?.is_active_live===1||o.mvData?.is_active_live===`1`)return a.error(`Live videos are not supported`),[];let u=v(l,t),d=u?l[`url${u}`]:void 0,f=l.dash_sep||d;return f?[{type:`video`,title:[l.md_title?.trim(),l.md_author?.trim()].filter(Boolean).join(` `),input:new p({source:new m(f,{requestInit:{headers:{Referer:e,Cookie:c.cookie}}})})}]:(a.error(`Could not find video URL`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/kSjDiz_MKxD_jzwgEqqaIjQZTE-NEP1Xt8HtJT7EU4s/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjAyNzgyMzI5NS9jb250ZW50L0lDT04vOTc0ODYwMTgtNTc4NS00MjRkLTljYWItNGZlNDk2ZDI3Yzc2LnBuZw==.webp`,title:`VK`,name:`VK`},pkg:{name:`vk`,version:`0.0.8`,private:!0,keywords:[`video-hostings`],homepage:`https://vkvideo.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`vk.ts`,config:{icon:`https://static.rustore.ru/imgproxy/kSjDiz_MKxD_jzwgEqqaIjQZTE-NEP1Xt8HtJT7EU4s/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjAyNzgyMzI5NS9jb250ZW50L0lDT04vOTc0ODYwMTgtNTc4NS00MjRkLTljYWItNGZlNDk2ZDI3Yzc2LnBuZw==.webp`,title:`VK`}}},weibo:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask;let p=d.utils,m=d.Input,h=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=p.execUrlPatterns(e,[`/:userId(\\d+)/:bid`,`/detail/:mid`],[`https://weibo.com/`,`https://m.weibo.cn`]),r=t.pathname.bid||t.pathname.mid;if(!r)return[];let i=await n(`https://m.weibo.cn/statuses/show?id=${r}`,{credentials:`include`,referrer:`https://m.weibo.cn/status/${t.pathname.bid??r}?jumpfrom=weibocom`,method:`GET`,mode:`cors`}).then(e=>e.json()).catch(()=>null);if(!i?.data)return a.error(`Could not resolve Weibo post metadata`),[];let o=[],s=i.data.pics,c=i.data.page_info;if(s?.length)for(let e of s.filter(e=>e.type===`video`||e.type===`livephoto`))e.videoSrc&&o.push({type:`video`,title:e.pid,input:new m({source:new h(e.videoSrc)})});else if(c?.type===`video`){let e=Object.values(c.urls??{})[0],t=c.media_info?.stream_url_hd||c.media_info?.stream_url,n=e||t;n&&o.push({type:`video`,title:c.title||c.page_title,input:new m({source:new h(n)})})}return o}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://play-lh.googleusercontent.com/TTKq2trnzgtoyM0jc1pyrrmXtA_Yd3A2hxubZtDahdZStYf4GPANZa-wjDb1ELHrGqh_=w480-h960-rw`,title:`Weibo`,name:`Weibo`},pkg:{name:`weibo`,version:`0.0.6`,private:!0,keywords:[`social-networks`],homepage:`https://weibo.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`weibo.ts`,config:{icon:`https://play-lh.googleusercontent.com/TTKq2trnzgtoyM0jc1pyrrmXtA_Yd3A2hxubZtDahdZStYf4GPANZa-wjDb1ELHrGqh_=w480-h960-rw`,title:`Weibo`}}}}})),import_builtins=__toESM(require_builtins(),1);const extractExtensionInfo=e=>({name:e.name,source:e.source,dir:e.dir,path:e.path,package:e.package,installedAt:e.installedAt||new Date().toISOString()});var ExtensionManager=class ExtensionManager extends EventEmitter$1{extensions=new Map;extensionDirs;indexPath;infoList=[];constructor({dirs:e,indexPath:t}={}){super(),this.extensionDirs=e??[process.cwd()],this.indexPath=t??path$1.join(process.cwd(),`index.json`)}async init(){return await this.ensureValidIndexPath(),await this.loadInfo(),this}async loadInfo(){return this.infoList=await readJson(this.indexPath).catch(()=>[]),this.infoList}async saveInfo(){return await this.ensureValidIndexPath(),await writeJson(this.indexPath,this.infoList)}async ensureValidIndexPath(){(await fs$1.stat(this.indexPath).catch(()=>null))?.isDirectory()&&(logger.warn(`Invalid extensions index path repaired: ${this.indexPath}`),await rm$1(this.indexPath),await fs$1.writeFile(this.indexPath,`[]`,`utf8`))}static async getAvailableExtensions(){try{return(await backendApi.getExtensions(authState.accessToken,AbortSignal.timeout(8e3))).data}catch(e){return logger.warn(`Failed to fetch extensions catalog: ${e instanceof Error?e.message:String(e)}`),[]}}async discover(){for(let e of this.extensionDirs){logger.debug(`Loading extensions from ${e}`);let t=await fs$1.readdir(e,{withFileTypes:!0}).catch(()=>[]);for(let n of t)if(n.isDirectory()){let t=path$1.join(e,n.name);if(await fs$1.readdir(t).then(e=>e.filter(e=>!e.startsWith(`.`))).then(e=>!e.length))continue;await this.loadExtension(t)}}for(let e of this.infoList)this.extensionDirs.some(t=>e.dir?.includes(t))||!e.dir||(logger.debug(`Loading dev extension from ${e.dir}`),await this.loadExtension(e.dir))}async#e(scriptPath,context){const code=await fs$1.readFile(scriptPath,`utf8`),{Azot,fetch,console,localStorage,cookieStore,window,document,navigator}=context,module={exports:{}};eval(`(() => {${code}})();`);const exports=module.exports;return{exports,context}}async prepareContext(e,t){let n=createContext({name:e,dir:EXTENSIONS_DATA_DIR,title:t});return await n.cookieStore.import(path$1.join(EXTENSIONS_DATA_DIR,e,`cookies.txt`)),n}async loadScript(e,t){let n=t.name,r=t.config?.title||n,i=await this.prepareContext(n,r),a=await load(e,{dirname:t.dir,context:i});if(a)return a.exports=`default`in a.exports?a.exports.default:a.exports,a}async loadCoreExtensions(){let e=Object.keys(import_builtins.default);logger.debug(`Loading ${e.length} built-in extensions: ${e.join(`, `)}`);for(let e of Object.values(import_builtins.default)){let t=e.pkg.name,n=e.manifest?.name;try{let r=await this.prepareContext(t,n),i={exports:e.create(r),package:e.pkg,context:r};this.validate(i),this.extensions.set(t,i),this.emit(`loaded`,t)}catch(e){logger.debug(e instanceof Error?e.message:String(e)),this.emit(`error`,e,t)}}}async loadExtension(e){try{logger.debug(`Loading extension from ${e}`);let t=await readExtensionInfo(e).catch(e=>logger.error(e));if(!t)return;t.package.dir=t.dir;let n=await this.loadScript(t.path,t.package);if(!n)return;let r={package:t.package,exports:n.exports,context:n.context};this.validate(r),this.extensions.set(t.package.name,r),this.emit(`loaded`,t.package.name)}catch(t){this.emit(`error`,t,e)}}validate(e){if(typeof e!=`object`||!e||!isSupportedExtensionExports(e.exports))throw Error(`Invalid extension interface: ${e.package.name}`)}getExtension(e){return this.extensions.get(e)??Array.from(this.extensions.values()).find(t=>t.package.name===e)??null}async getExtensionForUrl(e){for(let t of this.extensions.values()){let n=null,r=t.exports.canHandle,i=new URL(e).hostname.includes(t.package.name);if(n=typeof r==`function`?await r(e):typeof r==`string`?new URLPattern(r).test(e):i,n)return t}return null}async install(e){let t=await ExtensionManager.getAvailableExtensions(),n=[];for(let r of e){let e=await stat(r).then(e=>e.isDirectory()).catch(()=>!1)?r:await downloadExtension(r,t);if(!e)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.SOURCE_NOT_FOUND,`Extension source not found: ${r}`,{source:r});let i=await importExtension(e,r);if(!i)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Extension import failed: ${r}`,{source:r,dir:e});n.push(i);let a=this.infoList.find(({name:e})=>e===i.name);if(a){let e=a.source;e!==i.source&&await rm$1(e);let t=a.dir?this.#t(a.dir):null,n=i.dir?this.#t(i.dir):null;t&&t!==n&&await rm$1(t),a.installedAt=new Date().toISOString(),Object.assign(a,extractExtensionInfo(i)),logger.info(`Extension ${i.name} updated`)}else this.infoList.push(extractExtensionInfo(i)),logger.info(`Extension ${i.name} added`)}if(await this.saveInfo(),n.length)for(let e of n)this.extensions.set(e.name,e)}#t(e){let t=path$1.parse(e);return t.dir===EXTENSIONS_SOURCES_DIR?e:t.dir}async uninstall(e){for(let t of e){let e=this.infoList.find(e=>e.name===t);if(!e){logger.error(`Extension ${t} not found`);return}let n=e.dir??``,r=n?.includes(EXTENSIONS_SOURCES_DIR);await exists(n)?(r&&await rm$1(this.#t(n)),this.infoList=this.infoList.filter(e=>e.name!==t),logger.info(`Extension ${t} removed`),this.extensions.delete(t)):logger.warn(`Extension ${t} directory not found: ${n}`)}await this.saveInfo()}async importCookies(e,t){let n=this.getExtension(e);if(!n)throw Error(`Extension ${e} not found`);return await n.context.cookieStore.import(t,{removeSource:!1})}async login(e,t={}){let n=this.getExtension(e);n&&await loginWithExtension(n,t)}async logout(e){for(let t of e){let e=this.getExtension(t);if(!e)return;logger.info(`Logging out...`),await logoutWithExtension(e),logger.debug(`Clearing localStorage...`),e.context.localStorage.clear(),logger.debug(`Clearing cookies store...`);let n=await e.context.cookieStore.getAll();for(let t of n)await e.context.cookieStore.delete(t);logger.info(`Logged out from extension ${t}`)}}list(){return Array.from(this.extensions.values()).map(e=>({name:e.package.name,version:e.package.version,description:e.package.description,package:e.package}))}};const mergeExtensionHeadersIntoDrm=(e,t)=>!e||`payload`in e||`keys`in e?e:{...e,headers:{...e.headers,...t?.context.http.headers}},defaultLegacyRequestFilter=async(e,t)=>{if(!t)return e;let n=await e.clone().arrayBuffer(),r=Buffer.from(n).toString(`base64`),i=t.replace(`{{challenge}}`,r);return new Request(e.url,{method:e.method,headers:e.headers,body:i})},defaultLegacyResponseFilter=async e=>{let t=await e.clone().arrayBuffer();if(t[0]===123){let n=null;try{n=JSON.parse(Buffer.from(t).toString(`utf8`))}catch(e){logger.error(`Can't parse license response as JSON`),logger.debug(e.message),logger.debug(`Base64 response data: ${Buffer.from(t).toString(`base64`)}`)}if(!n)return e;try{let n=`CAIS`,r=n+Buffer.from(t).toString(`utf8`).split(`"${n}`)[1].split(`"`)[0],i=Buffer.from(r,`base64`);return new Response(i,{status:e.status,headers:e.headers})}catch{logger.error(`Can't recognize license response`),logger.error(`Response: ${JSON.stringify(n)}`)}}return e},normalizeLegacyMediaInfoList=e=>typeof e==`string`?[{sources:[{url:e}]}]:Array.isArray(e)&&typeof e[0]==`string`?e.map(e=>({sources:[{url:e}]})):Array.isArray(e)?e:e&&typeof e==`object`?[e]:[],normalizeLegacyStreams=e=>e.sources??e.streams??[],resolveLegacyMediaMetadata=(e,t)=>({id:e.id,title:e.title,tag:t.package.config?.tag,seasonNumber:e.seasonNumber??e.season,episodeNumber:e.episodeNumber??e.episode,episodeTitle:e.episodeTitle}),resolveLegacyMediaResources=async(e,t,n)=>{let r=getCompatibleExtensionExports(n);if(typeof r.getMediaInfo==`function`){let i=normalizeLegacyMediaInfoList(await r.getMediaInfo(e,t));if(!i.length)return logger.info(`No metadata found`),[];let a=[];for(let e of i){if(typeof r.refreshMediaInfo==`function`){let n=await r.refreshMediaInfo(e,t);n&&typeof n==`object`&&Object.assign(e,n)}let i=normalizeLegacyStreams(e);for(let t of i){let r=typeof t==`string`?{url:t}:t;a.push({source:{url:r.url,headers:r.headers,drm:r.drm&&!Array.isArray(r.drm)&&typeof r.drm==`object`?{server:r.drm.server}:void 0},metadata:resolveLegacyMediaMetadata(e,n),drm:r.drm&&!Array.isArray(r.drm)&&typeof r.drm==`object`?{server:r.drm.server}:void 0})}}return logger.info(`Fetching metadata finished`),a}let i=await r.fetchContentMetadata?.(e,t);if(!i?.length)return logger.info(`No metadata found`),[];let a=[];for(let e of i){let r={...e},i;if(!r.source&&n.exports.fetchContentSource&&r.id){let e=await n.exports.fetchContentSource(r.id,t);e&&(r.source=e)}if(!r.source?.url){logger.error(`Can't find content source`);continue}r.source.drm&&`payload`in r.source.drm&&n.exports.fetchContentDrm&&(i=r.source.drm.payload,r.source.drm=void 0);let{source:o,...s}=r,c=mergeExtensionHeadersIntoDrm(r.source.drm,n);o.drm=c,o.headers={...o.headers,...n.context.http.headers},n.exports.tag&&(s.tag=n.exports.tag),a.push({source:o,metadata:s,drm:c,drmPayload:i})}return logger.info(`Fetching metadata finished`),a},resolveLegacyMediaResourceDrm=async(e,t,n)=>{if(e.drmPayload&&n?.exports.fetchContentDrm){let r=mergeExtensionHeadersIntoDrm(await n.exports.fetchContentDrm(e.drmPayload,t),n);return e.source.drm=r,e.drm=r,r}let r=mergeExtensionHeadersIntoDrm(e.source.drm??e.drm,n);return e.source.drm=r,e.drm=r,r},createLegacyDrmLicenseResolver=e=>{let t=e.template?defaultLegacyRequestFilter:void 0,n=defaultLegacyResponseFilter,r=new HttpClient;return async({url:i,data:a})=>{let o=new Request(i,{body:Buffer.from(a),method:`POST`,headers:e.headers}),s=await t?.(o,e.template)||o,c=await r.fetch(s.url,{body:await s.arrayBuffer(),headers:s.headers,method:s.method}),l=await n?.(c)||c;return new Uint8Array(await l.arrayBuffer())}},resolvedInputs=new Map,normalizeHeaders=e=>{if(!e)return;let t=Object.fromEntries(new Headers(e).entries());return Object.keys(t).length?t:void 0},serializeMediaEntry=e=>{let{input:t,...n}=e;return n},createEntryCacheKey=(e,t,n)=>createHash(`sha1`).update(JSON.stringify({extension:e.package.name,url:t,id:n.id??null,title:n.title??null,season:n.season??null,episode:n.episode??null})).digest(`hex`),extractInputSource=(e,t)=>{let n=e.source??e._rootSource,r=n?.rootPath;if(typeof r!=`string`||!r)return t??null;let i=n?._url instanceof Request?n._url.headers:void 0,a=n?._options?.requestInit?.headers,o={...normalizeHeaders(i),...normalizeHeaders(a)};return{...t??{},url:r,headers:Object.keys(o).length?o:t?.headers}},createEntryMetadata=(e,t)=>{let n=e.id??e.details?.id;return{id:n==null?void 0:String(n),title:e.title,tag:t.package.config?.tag,seasonNumber:e.season,episodeNumber:e.episode,episodeTitle:e.episodeTitle}},normalizeResolvedResources=e=>e.length?e.length===1?e[0]:e:null,createDirectMediaMetadata=e=>{let t;try{t=new URL(e)}catch{throw Error(`Invalid direct media URL: ${e}`)}let n=t.pathname.replace(/\/+$/,``).split(`/`).filter(Boolean).pop(),r=n?.split(`.`).slice(0,-1).join(`.`)||n||t.hostname||`download`;return{source:{url:e},metadata:{title:r}}},configureExtensionProxy=(e,t)=>{let n=t.proxy||t.proxyMeta;n&&(e.context.http.configure({proxyUrl:n}),httpClient.configure({proxyUrl:n}))},analyzeMediaResource=async(e,t,n)=>{if(!n){logger.warn(`No suitable extension available. Downloading as a direct link...`);let{source:n,metadata:r}=createDirectMediaMetadata(e);return n.audioLanguage=t.languages?.[0],n.http2=t.http2,{source:n,metadata:r}}if(configureExtensionProxy(n,t),await initializeExtension(n),getExtensionApiVersion(n)===`v2`){let r=getCompatibleExtensionExports(n);logger.info(`Resolving media entries...`);let i=await r.resolveEntries(e,t);if(!i?.length)return logger.info(`No metadata found`),null;let a=i.map(t=>{let r=t,i=serializeMediaEntry(t),a=t.input?createEntryCacheKey(n,e,r):void 0;a&&t.input&&resolvedInputs.set(a,t.input);let o=t.input?extractInputSource(t.input):null;return{source:o??{url:e},metadata:createEntryMetadata(i,n),extension:{api:`v2`,entry:i,cacheKey:a,hasResolvedSource:!!o}}});return logger.info(`Resolving media entries finished`),normalizeResolvedResources(a)}return logger.info(`Fetching content metadata...`),normalizeResolvedResources(await resolveLegacyMediaResources(e,t,n))},materializeMediaResource=async({resource:e,url:t,options:n,extension:r})=>{if(!r||!e.extension||e.extension.api!==`v2`||getExtensionApiVersion(r)!==`v2`)return{source:e.source};configureExtensionProxy(r,n),await initializeExtension(r);let i=getCompatibleExtensionExports(r),a=e.extension.entry,o=e.extension.cacheKey?resolvedInputs.get(e.extension.cacheKey):void 0;if(!o&&typeof i.resolveMedia==`function`&&(o=await i.resolveMedia(t,n,a)??void 0,o&&e.extension.cacheKey&&resolvedInputs.set(e.extension.cacheKey,o)),!o){if(e.extension.hasResolvedSource)return{source:e.source,entry:a};throw Error(`Extension ${r.package.name} could not materialize media entry. Provide resolveMedia() or an inline input rooted in UrlSource.`)}return{source:extractInputSource(o,e.source)??e.source,input:o,entry:a}},resolveMediaResourceDrm=async(e,t,n)=>resolveLegacyMediaResourceDrm(e,t,n);var DownloadRunState=class{#e=[];#t=new Set;#n=new Map;#r=new Map;#i=new Set;get activeRunCount(){return this.#r.size}get queuedCount(){return this.#e.length}getActiveRun(e){return this.#r.get(e)}setActiveRun(e,t){this.#r.set(e,t)}deleteActiveRun(e){this.#r.delete(e)}getActiveJob(e){return this.#n.get(e)}setActiveJob(e){this.#n.set(e.id,e)}deleteActiveJob(e){this.#n.delete(e)}queueResumeAfterStop(e){this.#i.add(e)}consumeResumeAfterStop(e){let t=this.#i.has(e);return t&&this.#i.delete(e),t}enqueue(e){this.#t.has(e.id)||this.#r.has(e.id)||(this.#e.push(e.id),this.#t.add(e.id))}dequeue(e){if(!this.#t.has(e))return!1;let t=this.#e.indexOf(e);return t!==-1&&this.#e.splice(t,1),this.#t.delete(e),!0}dequeueNext(e){for(;this.#e.length>0;){let t=this.#e.shift();if(!t)return;this.#t.delete(t);let n=e(t);if(n&&n.status===`queued`)return n}}};const ERROR_DETAIL_KEYS=[`code`,`errno`,`syscall`,`address`,`port`,`host`,`hostname`,`path`,`type`],isResponseLike=e=>typeof e==`object`&&!!e&&`status`in e&&`statusText`in e&&`url`in e,getOwnErrorDetails=e=>{let t=[],n=e;for(let e of ERROR_DETAIL_KEYS){let r=n[e];r==null||r===``||t.push(`${e}=${String(r)}`)}return t},formatErrorDetails=(e,t=0)=>{if(t>3)return`[max-depth]`;if(e instanceof Error){let n=getOwnErrorDetails(e),r=`cause`in e?e.cause:void 0,i=[`${e.name}: ${e.message}`];return n.length&&i.push(`details=${n.join(`, `)}`),r!==void 0&&r!==e&&i.push(`cause=${formatErrorDetails(r,t+1)}`),i.join(` | `)}return isResponseLike(e)?`Response ${e.status} ${e.statusText} url=${e.url}`:inspect(e,{depth:2,breakLength:1/0})},logErrorDetails=(e,t)=>{logger.debug(`${e}: ${formatErrorDetails(t)}`),t instanceof Error&&t.stack&&logger.debug(t.stack)},getTrackDescription=(e,t)=>{let n=`${t} ∙ `;return e.type===`subtitle`?n+=`SUBTITLES`:n+=e.type?.toUpperCase(),e.type===`video`&&(e.width&&(n+=` ∙ ${e.width}x${e.height}`),e.bitrate&&(n+=` ∙ ${Math.round(e.bitrate/1e3)} KiB/s`)),e.type===`audio`&&(e.languageCode&&(n+=` ∙ ${e.languageCode.toUpperCase()}`),e.name&&(n+=` (${e.name})`),e.sampleRate&&(n+=` ∙ ${e.sampleRate} kHz`),e.bitrate&&(n+=` ∙ ${Math.round(e.bitrate/1e3)} KiB/s`)),e.type===`subtitle`&&(e.languageCode&&(n+=` ∙ ${e.languageCode.toUpperCase()}`),e.name&&(n+=` (${e.name})`),e.forced&&(n+=` FORCED`)),n},getTrackId=e=>e.id,findDuplicateTrackIds=e=>{let t=new Map;for(let n of e){let e=getTrackId(n),r=t.get(e);if(r){r.push(n);continue}t.set(e,[n])}return Array.from(t.entries()).filter(([,e])=>e.length>1)},assertUniqueTrackIds=e=>{let t=findDuplicateTrackIds(e);if(!t.length)return;let n=t.map(([e,t])=>`${e} (${t.length} copies)`).join(`, `);throw Object.assign(Error(`Duplicate tracks selected: ${n}`),{code:`DUPLICATE_TRACKS_SELECTED`})},getErrorCode=e=>{if(!e||typeof e!=`object`||!(`code`in e))return;let t=e.code;return typeof t==`string`?t:void 0};var DownloaderError=class extends Error{code;constructor(e,t=e,n){super(t,n),this.name=`DownloaderError`,this.code=e}};const normalizeDownloaderError=(e,t=`DOWNLOAD_FAILED`)=>{if(e instanceof DownloaderError||e instanceof Error&&e.name===`AbortError`)return e;if(e instanceof Error){let n=new DownloaderError(getErrorCode(e)??t,e.message,{cause:e});return e.stack&&(n.stack=e.stack),n}return new DownloaderError(t,typeof e==`string`?e:`Unknown error`)},sanitizeFilename=e=>{let t=e.replace(/[<>:"/\\|?*\x00-\x1F]/g,``);t=t.replace(/^[\s.]+|[\s.]+$/g,``),t=t.replace(/\s+/g,` `);let n=t.lastIndexOf(`.`),r=n>0,i=r?t.slice(n):``,a=r?t.slice(0,n):t;if(i.length>=255)t=t.slice(0,255);else{let e=255-i.length;a.length>e&&(a=a.slice(0,e)),t=a+i}let o=/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i;if(i.length<255){let e=t.lastIndexOf(`.`),n=e>0;if(i=n?t.slice(e):``,a=n?t.slice(0,e):t,o.test(a)){let e=255-i.length;t=`_${a}`.slice(0,e)+i}}return t.length===0?`untitled`:t},fillTemplate=(e,t)=>Object.keys(t).reduce((e,n)=>{let r=`{${n}}`,i=t[n];if(!i){let t=RegExp(`(?:\\.|^)\\{${n}\\}(?=\\.|$)|\\{${n}\\}(\\.|$)|\\{${n}\\}`,`g`);return e.replace(t,(e,t)=>``).replaceAll(`....`,`...`)}return e.replaceAll(r,i)},e).replaceAll(` `,` `),resolveContainerFormat=e=>typeof e==`string`&&e.trim()||`mp4`,createDownloadMetadata=e=>{let t=`seasonNumber`in e?`${e.seasonNumber}`:``,n=`episodeNumber`in e?`${e.episodeNumber}`:``,r=t?`S${t}`:``,i=n?`E${n}`:``,a=t&&n?`${r}:${i}`:``,o=`episodeTitle`in e&&e.episodeTitle?.trim()?`"${e.episodeTitle}"`:``;return{title:`${e.title??``} ${a} ${o}`.trim()}},resolveDownloadOutputPlan=({settings:e,options:t,source:n,meta:r,allTracks:i})=>{let a=r.title,o=r.tag,s=`seasonNumber`in r?r.seasonNumber:void 0,c=`episodeNumber`in r?r.episodeNumber:void 0,l=`episodeTitle`in r?r.episodeTitle:``,u=i.find(e=>e.type===`video`)?.codec??``,d=e.get(`downloadDir`),f=t.movieTemplate||e.get(`movieFilenameTemplate`),p=t.episodeTemplate||e.get(`seriesFilenameTemplate`),m=`${sanitizeFilename(fillTemplate(c?p:f,{title:a??``,s:s?s.toString().padStart(2,`0`):``,e:c?c.toString().padStart(2,`0`):``,quality:t.videoQuality??``,codec:u,tag:o??``,episodeTitle:l??``,audioType:n.audioType?n.audioType.toUpperCase():``,format:`WEB-DL`}))}.${resolveContainerFormat(t.format||e.get(`videoContainerFormat`))}`,h=t.outputPath||join(d,m),g=parse(h);return{downloadDir:d,outputPath:h,resolvedFilenameWithoutExtension:g.name,filenameWithExtension:g.base,outputDirectory:g.dir||d,downloadMetadata:createDownloadMetadata(r)}},openFileHandle=async(e,t,n)=>n??open(e,t),createMediabunnyFileSource=e=>{let t=null;return new StreamSource({getSize:async()=>(t=await openFileHandle(e,`r`,t),(await t.stat()).size),read:async(n,r)=>{t=await openFileHandle(e,`r`,t);let i=new Uint8Array(r-n);return await t.read(i,0,r-n,n),i},dispose:async()=>{let e=t;t=null,await e?.close()},prefetchProfile:`fileSystem`})},createMediabunnyFileTarget=e=>{let t=null;return new StreamTarget(new WritableStream({start:async()=>{t=await openFileHandle(e,`w`,t)},write:async n=>{if(!t)throw Error(`MediaBunny output handle was not initialized for ${e}`);await t.write(n.data,0,n.data.byteLength,n.position)},close:async()=>{let e=t;t=null,await e?.close()},abort:async()=>{let e=t;t=null,await e?.close()}}),{chunked:!0})},inspectMedia=async(e,t)=>{let n=new Input$1({formats:ALL_FORMATS$1,source:e.startsWith(`https`)?new UrlSource$1(e,{requestInit:{headers:t}}):createMediabunnyFileSource(e)});return{tracks:await n.getTracks(),primaryVideoTrack:await n.getPrimaryVideoTrack(),primaryAudioTrack:await n.getPrimaryAudioTrack()}},ALL_DASHA_FORMATS=[...DASH_FORMATS,...HLS_FORMATS],SENSITIVE_HEADER_KEYS=new Set([`authorization`,`cookie`,`set-cookie`,`api-key`]),getSafeHeadersForLogging=e=>Object.fromEntries(Object.keys(e).map(t=>[t,SENSITIVE_HEADER_KEYS.has(t.toLowerCase())?`[REDACTED]`:e[t]])),getManifestFormats=e=>e===`mpd`?DASH_FORMATS:e===`m3u8`?HLS_FORMATS:ALL_DASHA_FORMATS,createManifestInput=({http:e,source:t,detection:n})=>(logger.debug(`Fetching manifest...`),logger.debug(t.url),t.headers&&logger.debug(JSON.stringify(getSafeHeadersForLogging(t.headers))),new Input({source:new UrlSource(t.url,{requestInit:{headers:t.headers},fetchFn:e.fetch.bind(e)}),formats:getManifestFormats(n.kind)})),getStableHash=e=>createHash(`sha1`).update(e).digest(`hex`),normalizeTrackLanguageCode=(e,t)=>{if(e)switch(e){case`aar`:case`abk`:return`rus`;case`ave`:return`eng`;case`zu`:return t?.includes(`start.film`)?`ru`:`zu`;default:return e}},createPreparedTrackId=({origin:e,type:t,sourceUrl:n,languageCode:r,name:i,codec:a})=>`${e}:${t}:${getStableHash([n??``,r??``,i??``,a??``].join(`|`))}`,createPreparedTrackFromManifestTrack=async(e,t)=>{let[n,r,i,a,o,s]=await Promise.all([e.getCodec(),e.getBitrate(),e.getLanguageCode(),e.getName(),e.getDisposition(),e.hasOnlyKeyPackets()]),c={id:`manifest:${e.type}:${e.id}`,origin:`manifest`,type:e.type,codec:n,bitrate:r,languageCode:normalizeTrackLanguageCode(i,t),name:a,forced:o.forced,hearingImpaired:o.hearingImpaired,visuallyImpaired:o.visuallyImpaired,isDefault:o.default,isIFrameOnly:s,inputTrack:e};if(e.isVideoTrack()){let[t,n]=await Promise.all([e.getDisplayWidth(),e.getDisplayHeight()]);c.width=t,c.height=n}if(e.isAudioTrack()){let[t,n]=await Promise.all([e.getNumberOfChannels(),e.getSampleRate()]);c.numberOfChannels=t,c.sampleRate=n}return c},ensurePreparedTrackSegments=async e=>e.segments?e.segments:e.inputTrack?(e.segmentsPromise??=e.inputTrack.getSegments().then(t=>(e.segments=t,e.segmentCount=t.length,t)),e.segmentsPromise):(e.segments=[],e.segmentCount=0,e.segments),filterByCodecs=(e,t)=>{let n=e.filter(e=>t.some(t=>t===e.codec));return n.length?n:e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0))},filterByQuality=(e,t)=>{let n=t?parseInt(String(t),10)*16/9:void 0,r=e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0));if(!t)return r;let i=e.filter(e=>Number(e.height)===Number(t));if(i.length)return i;let a=e.filter(e=>Number(e.width)===Number(n));return a.length?a:r},filterByChannels=(e,t)=>e.filter(e=>e.numberOfChannels===Number(t)),normalizeLanguage=e=>e?.trim().toLowerCase()??``,getLanguageFamily=e=>normalizeLanguage(e).slice(0,2),getLanguageVariant=e=>normalizeLanguage(e)||`und`,matchesRequestedLanguage=(e,t)=>{let n=normalizeLanguage(e),r=normalizeLanguage(t);return!n||!r?!1:n===r||n.startsWith(`${r}-`)?!0:getLanguageFamily(n)===getLanguageFamily(r)},getUniqueLanguageFamilies=e=>Array.from(new Map(e.map(e=>normalizeLanguage(e)).filter(Boolean).map(e=>[getLanguageFamily(e),e])).values()),takeBestTracksPerVariant=(e,t)=>{let n=new Map;for(let r of e){let e=getLanguageVariant(r.languageCode),i=n.get(e);if(!i){n.set(e,[r]);continue}i.length<t&&i.push(r)}return Array.from(n.values()).flat()},filterByLanguages=(e,t,n=1)=>{let r=e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0)),i=getUniqueLanguageFamilies(t),a=[];for(let e of i){let t=r.filter(t=>matchesRequestedLanguage(t.languageCode,e));t.length&&a.push(...takeBestTracksPerVariant(t,n))}let o=getUniqueLanguageFamilies(e.map(e=>e.languageCode||`und`));if(!a.length)for(let e of o){let t=r.filter(t=>matchesRequestedLanguage(t.languageCode??`und`,e));t.length&&a.push(...takeBestTracksPerVariant(t,n))}return a},filterPairableAudios=(e,t)=>{if(!t?.inputTrack)return e;let n=t.inputTrack,r=e.filter(e=>e.inputTrack?e.inputTrack.canBePairedWith(n):!0);return r.length?r:e},toKbps=e=>(e??0)/1e3,getSegmentCountLabel=async e=>{if(typeof e.segmentCount==`number`)return`${e.segmentCount} Segments`;if(!e.inputTrack)return`Direct`;try{return`${(await ensurePreparedTrackSegments(e)).length} Segments`}catch{return`? Segments`}},buildSelectedTracks=({videos:e,audios:t,subtitles:n})=>({videos:e,audios:t,subtitles:n,all:[...e,...t,...n]});async function getTracks(e,t,n){let r=t.videoQuality,i=e.filter(e=>e.type===`video`&&!e.isIFrameOnly),a=e.filter(e=>e.type===`audio`),o=e.filter(e=>e.type===`subtitle`);if(t.select){let e=await Promise.all(i.map(async(e,t)=>({name:`${e.width??`?`}x${e.height??`?`} | ${toKbps(e.bitrate)||`?`} Kbps | ${e.codec??`?`} | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),t=i.length?await checkbox({message:`Select video streams`,pageSize:12,choices:e,loop:!1}):[],n=i.filter(e=>t.includes(e.id)),r=await Promise.all(a.map(async(e,t)=>({name:`${e.name?`${e.name} | `:``}${toKbps(e.bitrate)||`?`} Kbps | ${e.codec?`${e.codec} | `:``}${e.languageCode||`und`} | ${e.numberOfChannels??`?`}CH | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),s=a.length?await checkbox({message:`Select audio streams`,pageSize:12,choices:r,loop:!1}):[],c=a.filter(e=>s.includes(e.id)),l=await Promise.all(o.map(async(e,t)=>({name:`${e.codec??`?`} | ${e.languageCode||`und`} | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),u=o.length?await checkbox({message:`Select subtitles`,pageSize:12,choices:l,loop:!1}):[];return buildSelectedTracks({videos:n,audios:c,subtitles:o.filter(e=>u.includes(e.id))})}t.videoCodecs&&(i=filterByCodecs(i,t.videoCodecs)),i=filterByQuality(i,r||NaN);let s=i[0],c=[...t.languages||[]],l=n.audioLanguage?.slice(0,2);!c.length&&l&&c.push(l);let u=filterPairableAudios(a,s);t.audioChannels&&(u=filterByChannels(u,t.audioChannels)),t.audioCodecs&&(u=filterByCodecs(u,t.audioCodecs));let d=filterByLanguages(u,c,1);d.length&&(u=d);let f=c.at(-1),p=f?u.map(e=>!e.languageCode||e.languageCode===`und`?{...e,languageCode:f}:e):u,m=o.filter(e=>t.subtitleLanguages?.length?t.subtitleLanguages.some(t=>matchesRequestedLanguage(e.languageCode||`und`,t)):!1);return buildSelectedTracks({videos:t.skipVideo||!s?[]:[s],audios:t.skipAudio?[]:p,subtitles:t.skipSubtitles?[]:m})}const createEmptyPreparedTracks=()=>({videos:[],audios:[],subtitles:[],all:[]}),audioCodecMap={aac:`aac`,mp4a:`aac`,"mp4a.40.2":`aac`,ac3:`ac3`,"ac-3":`ac3`,eac3:`eac3`,"ec-3":`eac3`,opus:`opus`,vorbis:`vorbis`,flac:`flac`},tryGetUrl=e=>{if(!e)return null;try{return new URL(e)}catch{return null}},normalizePathname=e=>{let t=tryGetUrl(e);if(t)try{return decodeURIComponent(t.pathname)}catch{return t.pathname}},normalizeAudioStreamCodec=e=>{if(!e)return`aac`;let t=e.toLowerCase();return audioCodecMap[t]??audioCodecMap[t.split(`.`)[0]??``]??`aac`},countTracksByType=(e,t)=>e.filter(e=>e.type===t).length,logExtractedTracks=e=>{let t=`Extracted, there are `;if(e.length===0)t+=`no tracks`;else{t+=`${e.length} tracks`;let n=countTracksByType(e,`video`);n&&(t+=`, ${n} video tracks`);let r=countTracksByType(e,`audio`);r&&(t+=`, ${r} audio tracks`);let i=countTracksByType(e,`subtitle`);i&&(t+=`, ${i} subtitle tracks`)}logger.info(t)},appendAdditionalSubtitles=(e,t=[])=>{let n=[...t];for(let t of e.subtitles??[]){let r=normalizePathname(t.url),i=normalizeTrackLanguageCode(t.language,e.url);n.some(e=>{let t=normalizePathname(e.sourceUrl);return!r||!t?!1:r===t})||n.push({id:createPreparedTrackId({origin:`external-subtitle`,type:`subtitle`,sourceUrl:t.url,languageCode:i,name:t.label||t.title,codec:t.format}),origin:`external-subtitle`,type:`subtitle`,sourceUrl:t.url,languageCode:i,codec:t.format,forced:t.forced,name:t.label||t.title})}return n},prepareProgressiveSource=async({options:e,source:t,meta:n,detection:r})=>{let i={...e},a={...n};if(!a.title){let e=tryGetUrl(t.url)?.pathname.split(`/`).pop();e&&(a.title=e)}let{primaryVideoTrack:o,primaryAudioTrack:s}=await inspectMedia(t.url,t.headers),c=await o?.getCodec(),l=await o?.getCodedWidth(),u=await o?.getCodedHeight();i.videoQuality||=u?`${u}p`:void 0;let d=createEmptyPreparedTracks();if(d.subtitles=appendAdditionalSubtitles(t),d.all.push(...d.subtitles),r.isAudio&&!i.skipAudio){let e={id:createPreparedTrackId({origin:`progressive`,type:`audio`,sourceUrl:t.url,languageCode:t.audioLanguage,codec:await s?.getCodec()}),origin:`progressive`,type:`audio`,codec:normalizeAudioStreamCodec(await s?.getCodec()),languageCode:normalizeTrackLanguageCode(await s?.getLanguageCode(),t.url)??normalizeTrackLanguageCode(t.audioLanguage,t.url)??`und`,numberOfChannels:await s?.getNumberOfChannels(),sampleRate:await s?.getSampleRate(),sourceUrl:t.url};return d.audios.push(e),d.all.push(e),{options:i,source:t,meta:a,allTracks:[e],tracks:d}}if(!i.skipVideo){let e=parseInt((i.videoQuality??``).replace(`p`,``),10),n={id:createPreparedTrackId({origin:`progressive`,type:`video`,sourceUrl:t.url,codec:c}),origin:`progressive`,type:`video`,codec:c??`avc`,width:l??void 0,height:u??(e||void 0),sourceUrl:t.url};return d.videos.push(n),d.all.push(n),{options:i,source:t,meta:a,allTracks:[n],tracks:d}}return{options:i,source:t,meta:a,allTracks:[],tracks:d}},prepareInputSource=async({options:e,source:t,meta:n,input:r,disposeInput:i=!0})=>{let a={...e},o={...n},s=i;try{let e=await r.getTracks();if(!e.length)throw new DownloaderError(`MANIFEST_PARSE_FAILED`,`Failed to parse manifest`);let n=await Promise.all(e.map(e=>createPreparedTrackFromManifestTrack(e,t.url)));logExtractedTracks(n);let c=await getTracks(n,a,t),l=c.videos[0]?.height;if(l&&(a.videoQuality=`${l}p`),!o.title){let e=tryGetUrl(t.url)?.host;e&&(o.title=`${e}_${getCurrentDateTimeString()}`)}return s=!1,{options:a,source:t,meta:o,allTracks:n,tracks:c,dispose:i?()=>r.dispose?.():void 0}}finally{s&&r.dispose?.()}},prepareManifestSource=async({http:e,options:t,source:n,meta:r,detection:i})=>prepareInputSource({options:t,source:n,meta:r,input:createManifestInput({http:e,source:n,detection:i})}),prepareSource=async({http:e,options:t,source:n,meta:r,input:i,detection:a})=>i?prepareInputSource({options:t,source:n,meta:r,input:i,disposeInput:!1}):a.strategy===`progressive`?prepareProgressiveSource({options:t,source:n,meta:r,detection:a}):prepareManifestSource({http:e,options:t,source:n,meta:r,detection:a}),hasSuffix=(e,t)=>{try{let n=new URL(e);return n.pathname.endsWith(t)||n.search.endsWith(t)}catch{return!1}},selectPreparationStrategy=async(e,t)=>{let n=hasSuffix(t.url,`.m3u8`),r=hasSuffix(t.url,`.mpd`),i=hasSuffix(t.url,`.mp4`),a=hasSuffix(t.url,`.mov`),o=!1,s=!1;if(!n&&!r&&!i&&!a)try{let n=await e.fetch(t.url,{method:`HEAD`,headers:t.headers});if(!n.ok)logger.warn(`HEAD request for ${t.url} returned ${n.status} ${n.statusText}`);else{let e=n.headers.get(`content-type`);o=!!e?.includes(`audio`),s=!!e?.includes(`video`)}}catch(e){let n=e instanceof Error?e.message:String(e);logger.warn(`HEAD request failed for ${t.url}: ${n}`)}return r?{strategy:`manifest`,kind:`mpd`,isAudio:o,isVideo:s,matchedContentLabel:`Dynamic Adaptive Streaming over HTTP`}:n?{strategy:`manifest`,kind:`m3u8`,isAudio:o,isVideo:s,matchedContentLabel:`HTTP Live Streaming`}:o||s||i||a?{strategy:`progressive`,kind:`progressive`,isAudio:o,isVideo:s,matchedContentLabel:`Progressive Stream`}:{strategy:`manifest`,kind:`unknown`,isAudio:o,isVideo:s}};var require_reusify=__commonJSMin(((e,t)=>{function n(e){var t=new e,n=t;function r(){var r=t;return r.next?t=r.next:(t=new e,n=t),r.next=null,r}function i(e){n.next=e,n=e}return{get:r,release:i}}t.exports=n})),require_queue=__commonJSMin(((e,t)=>{var n=require_reusify();function r(e,t,r){if(typeof e==`function`&&(r=t,t=e,e=null),!(r>=1))throw Error(`fastqueue concurrency must be equal to or greater than 1`);var o=n(a),s=null,c=null,l=0,u=null,d={push:v,drain:i,saturated:i,pause:p,paused:!1,get concurrency(){return r},set concurrency(e){if(!(e>=1))throw Error(`fastqueue concurrency must be equal to or greater than 1`);if(r=e,!d.paused)for(;s&&l<r;)l++,b()},running:f,resume:g,idle:_,length:m,getQueue:h,unshift:y,empty:i,kill:x,killAndDrain:S,error:w,abort:C};return d;function f(){return l}function p(){d.paused=!0}function m(){for(var e=s,t=0;e;)e=e.next,t++;return t}function h(){for(var e=s,t=[];e;)t.push(e.value),e=e.next;return t}function g(){if(d.paused){if(d.paused=!1,s===null){l++,b();return}for(;s&&l<r;)l++,b()}}function _(){return l===0&&d.length()===0}function v(n,a){var f=o.get();f.context=e,f.release=b,f.value=n,f.callback=a||i,f.errorHandler=u,l>=r||d.paused?c?(c.next=f,c=f):(s=f,c=f,d.saturated()):(l++,t.call(e,f.value,f.worked))}function y(n,a){var f=o.get();f.context=e,f.release=b,f.value=n,f.callback=a||i,f.errorHandler=u,l>=r||d.paused?s?(f.next=s,s=f):(s=f,c=f,d.saturated()):(l++,t.call(e,f.value,f.worked))}function b(n){n&&o.release(n);var i=s;i&&l<=r?d.paused?l--:(c===s&&(c=null),s=i.next,i.next=null,t.call(e,i.value,i.worked),c===null&&d.empty()):--l===0&&d.drain()}function x(){s=null,c=null,d.drain=i}function S(){s=null,c=null,d.drain(),d.drain=i}function C(){var e=s;for(s=null,c=null;e;){var t=e.next,n=e.callback,r=e.errorHandler,a=e.value,o=e.context;e.value=null,e.callback=i,e.errorHandler=null,r&&r(Error(`abort`),a),n.call(o,Error(`abort`)),e.release(e),e=t}d.drain=i}function w(e){u=e}}function i(){}function a(){this.value=null,this.callback=i,this.next=null,this.release=i,this.context=null,this.errorHandler=null;var e=this;this.worked=function(t,n){var r=e.callback,a=e.errorHandler,o=e.value;e.value=null,e.callback=i,e.errorHandler&&a(t,o),r.call(e.context,t,n),e.release(e)}}function o(e,t,n){typeof e==`function`&&(n=t,t=e,e=null);function a(e,n){t.call(this,e).then(function(e){n(null,e)},n)}var o=r(e,a,n),s=o.push,c=o.unshift;return o.push=l,o.unshift=u,o.drained=d,o;function l(e){var t=new Promise(function(t,n){s(e,function(e,r){if(e){n(e);return}t(r)})});return t.catch(i),t}function u(e){var t=new Promise(function(t,n){c(e,function(e,r){if(e){n(e);return}t(r)})});return t.catch(i),t}function d(){return new Promise(function(e){process.nextTick(function(){if(o.idle())e();else{var t=o.drain;o.drain=function(){typeof t==`function`&&t(),e(),o.drain=t}}})})}}t.exports=r,t.exports.promise=o})),import_queue=__toESM(require_queue(),1);const DEFAULT_CONNECT_TIMEOUT=3e5,createClient=(e={})=>{let t=e.maxRetries??5,{proxy:n}=e,r=n?new ProxyAgent({uri:n,allowH2:!0}):new Agent({allowH2:!0});return kyImport.create({fetch:e.fetch,dispatcher:r,proxy:n,timeout:DEFAULT_CONNECT_TIMEOUT,retry:{limit:t,methods:[`get`,`head`],statusCodes:[408,413,429,500,502,503,504],backoffLimit:3e4},throwHttpErrors:!0,redirect:`follow`,headers:{"user-agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36`}})},sleep=e=>new Promise(t=>setTimeout(t,e)),createTempFileDir=async(e,t)=>{let n=await fsp.stat(t).catch(()=>null);(!n||!n.isDirectory())&&await fsp.mkdir(t,{recursive:!0});let r=getTempFileDirPath(e,t),i=await fsp.stat(r).catch(()=>null);return(!i||!i.isDirectory())&&await fsp.mkdir(r,{recursive:!0}),r},getTempFileDirPath=(e,t)=>{let n=path.resolve(e),r=path.parse(e).name,i=createHash(`sha1`).update(n).digest(`hex`).slice(0,10);return path.join(t,`${r}-${i}`)},ensureDirExists=async e=>{let t=path.dirname(e),n=path.resolve(t);path.parse(n).root!==n&&(await fsp.stat(t).then(()=>!0).catch(()=>!1)||await fsp.mkdir(t,{recursive:!0}))},clear=async(...e)=>{let t=[];for(let n of e)n&&t.push(fsp.rm(n,{recursive:!0,force:!0}).catch(()=>void 0));await Promise.all(t)},getDefaultResumeFilePath=e=>`${e}.part.json`,resolvePath=e=>{if(e.filePath)return e.filePath;if(e.output)return getDefaultResumeFilePath(e.output);throw Error(`Either output or filePath is required for FileResumeStore`)},isRetryableRenameError=e=>{if(!e||typeof e!=`object`)return!1;let t=`code`in e?e.code:void 0;return t===`EPERM`||t===`EACCES`||t===`EBUSY`},replaceFile=async(e,t)=>{let n=process$1.platform===`win32`?[0,50,150,300,500]:[0],r;for(let i of n){i>0&&await sleep(i);try{await fsp.rename(e,t);return}catch(n){if(r=n,!isRetryableRenameError(n))break;await fsp.rm(t,{force:!0}).catch(()=>void 0);try{await fsp.rename(e,t);return}catch(e){if(r=e,!isRetryableRenameError(e))break}}}throw r};var FileResumeStore=class{async get(e){let t=resolvePath(e);if(!await fsp.stat(t).then(()=>!0).catch(()=>!1))return null;try{let e=await fsp.readFile(t,`utf8`);return JSON.parse(e)}catch{return null}}async set(e,t){let n=resolvePath(e);await ensureDirExists(n);let r=`${n}.${process$1.pid}.${Date.now().toString(36)}.tmp`;await fsp.writeFile(r,JSON.stringify(t));try{await replaceFile(r,n)}finally{try{await fsp.rm(r,{force:!0})}catch{}}}async delete(e){let t=resolvePath(e);await fsp.rm(t,{force:!0}).catch(()=>void 0)}};const toAbsoluteOutputPath=e=>path.resolve(e),getDefaultResumeKey=e=>createHash(`sha1`).update(toAbsoluteOutputPath(e)).digest(`hex`),toStateParts=e=>e.map((e,t)=>({index:t,start:e.start,end:e.end,output:e.output,completed:!1,bytesWritten:0})),hasSameLayout=(e,t)=>e.parts.length===t.length?e.parts.every((e,n)=>{let r=t[n];return r?e.start===r.start&&e.end===r.end&&(e.output??null)===(r.output??null):!1}):!1,hasSameSignature=(e,t)=>!t||!e.sourceSignature?!0:e.sourceSignature===t,normalizeDownloadedBytes=e=>{let t=e.parts.reduce((e,t)=>e+t.bytesWritten,0);return t>0?t:e.bytesDownloaded},isValidResumeState=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.version===2&&typeof t.key==`string`&&Array.isArray(t.parts)&&typeof t.bytesDownloaded==`number`};var ResumeManager=class{key;output;filePath;cleanupOnSuccess;store;target;trustExplicitKey;constructor(e={}){if(this.output=e.output,this.filePath=e.filePath,this.key=e.key??(this.output?getDefaultResumeKey(this.output):``),!this.key)throw Error(`Resume key is required when output is not provided`);this.store=e.store??new FileResumeStore,this.cleanupOnSuccess=e.cleanupOnSuccess??!0,this.target={key:this.key,output:this.output,filePath:this.filePath},this.trustExplicitKey=typeof e.key==`string`&&e.key.length>0}async read(){let e=await this.store.get(this.target);return isValidResumeState(e)?e:null}async write(e){let t=new Date().toISOString(),n={...e,version:2,key:this.key,output:e.output??this.output,bytesDownloaded:normalizeDownloadedBytes(e),createdAt:e.createdAt||t,updatedAt:t};await this.store.set(this.target,n)}async delete(){await this.store.delete(this.target)}createState(e){let t=new Date().toISOString();return{version:2,key:this.key,output:this.output,input:e.input,bytesTotal:e.bytesTotal,bytesDownloaded:0,parts:toStateParts(e.parts),sourceSignature:e.sourceSignature,planner:e.planner,createdAt:t,updatedAt:t}}reconcileState(e,t){let n=e.version!==2,r=e.key!==this.key,i=!this.trustExplicitKey&&!hasSameSignature(e,t.sourceSignature),a=!hasSameLayout(e,t.parts);if(n||r||i||a)return{state:this.createState(t),reset:!0};let o={...e,key:this.key,output:this.output,input:t.input,bytesTotal:t.bytesTotal,sourceSignature:t.sourceSignature,planner:t.planner,parts:t.parts.map((t,n)=>{let r=e.parts[n];return{index:n,start:t.start,end:t.end,output:t.output,completed:r?.completed??!1,bytesWritten:r?.bytesWritten??0}}),createdAt:e.createdAt,updatedAt:e.updatedAt};return o.bytesDownloaded=normalizeDownloadedBytes(o),{state:o,reset:!1}}markPartCompleted(e,t,n){let r=e.parts[t];if(!r)return e;let i=r.bytesWritten;return r.completed=!0,r.bytesWritten=n,e.bytesDownloaded=Math.max(0,e.bytesDownloaded-i+n),e.updatedAt=new Date().toISOString(),e}async getProgress(){let e=await this.read();if(!e)return null;let t=e.bytesDownloaded;if(e.bytesTotal){let n=e.bytesTotal;return{bytesDownloaded:t,totalBytes:n,percentComplete:n>0?Math.round(t/n*100):0}}let n=e.parts.length,r=e.parts.filter(e=>e.completed).length;return{bytesDownloaded:t,totalBytes:null,percentComplete:n>0?Math.round(r/n*100):0,segmentsCompleted:r,segmentsTotal:n}}};const DEFAULT_MAX_PART_SIZE=8*2**20,getPartOutput=(e,t,n)=>{let r=`part_${n}.part`;return path.join(t,r)},getPartSize=(e,t,n)=>{let r=Math.ceil(e/Math.max(1,t));return Math.max(1,Math.min(r,Math.max(1,n)))},getRanges=(e,t,n)=>{let r=getPartSize(e,t,n),i=[],a=0;for(;a<e;){let t=Math.min(e-1,a+r-1);i.push([a,t]),a=t+1}return i},getRangeHeader=e=>{let[t,n]=e;return`bytes=${t}-${n||``}`},getParts=e=>getRanges(e.contentLength,e.maxWorkerCount,e.maxChunkSize??DEFAULT_MAX_PART_SIZE).map(t=>{let[n,r]=t,i=new Headers(e.requestInit?.headers);return i.set(`Range`,getRangeHeader([n,r])),{url:e.url,headers:i,start:n,end:r}}),createAbortError$1=e=>{let t=e?Error(`The operation was aborted`,{cause:e}):Error(`The operation was aborted`);return t.name=`AbortError`,t},isAbortLikeError=e=>{if(!(e instanceof Error))return!1;if(e.name===`AbortError`||e.code===`ABORT_ERR`)return!0;let t=e.cause;return t instanceof Error&&t.name===`AbortError`},fetchWorker=async e=>await e.client.get(e.url,{redirect:`follow`,...e.requestInit}),saveData=(e,t,n)=>async r=>{if(n?.aborted)throw createAbortError$1();let i=typeof t==`number`?{flags:`r+`,start:t}:{flags:`w`},a=fs.createWriteStream(e,i),o=Readable.fromWeb(r.body);try{await pipeline(o,a,{signal:n})}catch(e){throw isAbortLikeError(e)?createAbortError$1(e):e}if(n?.aborted)throw createAbortError$1();return r},updateProgress=(e,t,n)=>r=>{if(n?.aborted)throw createAbortError$1();let i=parseInt(r.headers.get(`content-length`)||`0`);if(e.increase(i),n?.aborted)throw createAbortError$1();return t&&!n?.aborted?t(e.toProgressInfo()):e.log(),r},resolveResumeOptions=e=>typeof e==`boolean`?{enabled:e,cleanupOnSuccess:!0}:e?{enabled:e.enabled??!0,key:e.key,store:e.store,filePath:e.filePath,cleanupOnSuccess:e.cleanupOnSuccess??!0}:{enabled:!1,cleanupOnSuccess:!0},resolveDownloadConfig=e=>({tempDir:e.tempDir??process.cwd(),maxRetries:e.maxRetries??5,maxChunkSize:e.maxChunkSize??DEFAULT_MAX_PART_SIZE,maxWorkerCount:e.maxWorkerCount??4,resume:resolveResumeOptions(e.resume),proxy:e.proxy,requestInit:e.requestInit,fetchFn:e.fetchFn}),DEFAULT_STATE={total:{b:0,mb:0},current:{b:0,mb:0},chunkSize:0,chunkSizes:[],averageSize:{b:0,mb:0},averageTotal:{b:0,mb:0},speed:{bps:0,mbps:0}},formatSeconds=e=>{let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60,i=t>0?`${t}h`:``,a=n>0?`${n}m`:``,o=r>0?`${r}s`:``;return t>0?`${i} ${a||`0m`} ${o&&`${o}`}`:!t&&n>0?`${a} ${o&&`${o}`}`:o},createProgress=(e=0)=>{let t=structuredClone(DEFAULT_STATE),n=0,r=setInterval(()=>{n>1&&(t.speed.bps=t.current.b/n),n+=.5},500);return{state:t,setTotal:e=>{t.total.b=e,t.total.mb=e/1024/1024},setCurrent(e){t.current.b=e,t.current.mb=e/1024/1024},increase(n){t.current.b+=n,t.current.mb=t.current.b/1024/1024,t.speed.mbps=t.speed.bps/1024/1024,t.chunkSize=n,t.chunkSizes.push(n),t.averageSize.b=t.current.b/t.chunkSizes.length,t.averageSize.mb=t.averageSize.b/1024/1024,t.averageTotal.b=e*t.averageSize.b,t.averageTotal.mb=t.averageTotal.b/1024/1024},stop(){clearInterval(r),Object.assign(t,DEFAULT_STATE)},log(){let e=t.current.b,n=t.total.b,r=e+(n?`/${n}`:``);stdout.write(`\rDownloading [${r}]`)},stopLog(){stdout.write(`
3
- `)},toString(){let e=``;t.speed.bps&&(e+=`${t.speed.mbps.toFixed(1)} MB/s – `),e+=`${t.current.mb.toFixed(1)}`,t.total.b?e+=` of ${t.total.mb.toFixed(1)} MB`:e+=` MB`;let r=t.total.b||t.averageTotal.b;if(r){let i=r-t.speed.bps*n,a=Math.round(i/t.speed.bps),o=formatSeconds(a);a&&isFinite(a)&&o&&(e+=`, ${o} left`)}return e},toProgressInfo(){let e=t.total.b||null;return{bytesDownloaded:t.current.b,totalBytes:e,percentComplete:e?t.current.b/e*100:null,bytesPerSecond:t.speed.bps,estimatedSecondsRemaining:t.speed.bps>0&&e?(e-t.current.b)/t.speed.bps:null}}}},VOLATILE_HEADER_NAMES=new Set([`authorization`,`cookie`,`set-cookie`,`x-amz-date`,`x-amz-security-token`,`x-amz-content-sha256`,`x-goog-date`,`x-goog-security-token`]),serializeHeaders=(e,t={})=>{if(!e)return[];let n=t.includeVolatile??!1,r=[];return new Headers(e).forEach((e,t)=>{!n&&VOLATILE_HEADER_NAMES.has(t.toLowerCase())||r.push([t,e])}),r.sort(([e],[t])=>e.localeCompare(t)),r},normalizeUrlForSignature=e=>{try{let t=new URL(e),n=t.pathname.split(`/`).map(e=>e&&(e.includes(`=`)||e.includes(`,`)?`:volatile`:e)).join(`/`);return`${t.origin}${n}`}catch{let t=String(e);return(t.split(`#`)[0]??t).split(`?`)[0]||t}},createPartSignature=e=>({url:normalizeUrlForSignature(e.url),start:e.start,end:e.end,output:e.output,headers:serializeHeaders(e.headers)}),createSourceSignature=e=>{let t={input:Array.isArray(e.input)?e.input.map(e=>createPartSignature(e)):normalizeUrlForSignature(String(e.resolvedUrl)),requestHeaders:serializeHeaders(e.requestHeaders),parts:e.parts.map(e=>createPartSignature(e)),maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize};return createHash(`sha1`).update(JSON.stringify(t)).digest(`hex`)},loadOrCreateResumeState=async e=>{if(!e.manager)return null;let t={input:Array.isArray(e.input)?e.input:e.resolvedUrl,parts:e.parts,bytesTotal:e.bytesTotal,sourceSignature:e.sourceSignature,planner:{maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize}},n=await e.manager.read(),r=(n?e.manager.reconcileState(n,t):null)?.state??e.manager.createState(t);return await e.manager.write(r),r},ensureAllPartsCompleted=e=>{if(e&&!e.parts.every(e=>e.completed))throw Error(`Not all segments were downloaded successfully. Try resuming later.`)},planDownloadParts=e=>{if(Array.isArray(e.input))return e.input.map((t,n)=>({...t,output:getPartOutput(e.url,e.tempFileDir,n)}));if(!e.acceptsRanges)throw Error(`Unable to get parts`);if(!e.size)throw Error(`Size is not known`);return getParts({url:e.url,requestInit:e.requestInit,contentLength:e.size,maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize})},ensureOutputReadyForRanges=async e=>{if(!e.parts.some(t=>typeof t.start==`number`&&(t.output??e.output)===e.output)||await fsp.stat(e.output).then(()=>!0).catch(()=>!1))return;let t=await fsp.open(e.output,`w`);e.size&&e.size>0&&await t.truncate(e.size),await t.close()},createAbortError=()=>{let e=Error(`The operation was aborted`);return e.name=`AbortError`,e},parseContentRange=e=>{let t=e.match(/bytes\s+(\d+)-(\d+)\/(\d+|\*)/i);if(!t||!t[1]||!t[2]||!t[3])return null;let n=parseInt(t[1],10),r=parseInt(t[2],10),i=t[3];if(!Number.isFinite(n)||!Number.isFinite(r)||r<n)return null;if(i===`*`)return{start:n,end:r,total:null};let a=parseInt(i,10);return!Number.isFinite(a)||a<=0?null:{start:n,end:r,total:a}},validateRangedPartResponse=(e,t)=>{if(typeof t.start!=`number`||typeof t.end!=`number`)return;if(e.status!==206)throw Error(`Range request failed for bytes=${t.start}-${t.end}: expected 206, got ${e.status}`);let n=e.headers.get(`content-range`);if(!n)throw Error(`Range request failed for bytes=${t.start}-${t.end}: missing Content-Range header`);let r=parseContentRange(n);if(!r)throw Error(`Range request failed for bytes=${t.start}-${t.end}: invalid Content-Range "${n}"`);if(r.start!==t.start||r.end!==t.end)throw Error(`Range request failed for bytes=${t.start}-${t.end}: got bytes=${r.start}-${r.end}`)},resolvePartSize=async(e,t,n)=>{let r=e.headers.get(`content-length`);if(r){let e=parseInt(r,10);if(Number.isFinite(e)&&e>0)return e}let i=e.headers.get(`content-range`);if(i){let e=i.match(/bytes\s+(\d+)-(\d+)\//i);if(e&&e[1]&&e[2]){let t=parseInt(e[1],10),n=parseInt(e[2],10);if(Number.isFinite(t)&&Number.isFinite(n)&&n>=t)return n-t+1}}return typeof t.start==`number`&&typeof t.end==`number`?Math.max(0,t.end-t.start+1):t.output&&t.output!==n?fsp.stat(t.output).then(e=>e.size).catch(()=>0):0},getPendingPartIndexes=(e,t)=>e.map((e,t)=>t).filter(e=>!(t?.parts[e]?.completed??!1)),createStateWriteScheduler=e=>{let t=Promise.resolve();return{enqueue:()=>(t=t.then(e),t),onIdle:()=>t}},runPartQueue=async e=>{let t=e.signal??e.requestInit?.signal??void 0,n=()=>{if(t?.aborted)throw createAbortError()};n();let r=getPendingPartIndexes(e.parts,e.resumeState),i=import_queue.promise(async r=>{let{index:i,part:a}=r;n();let o=await fetchWorker({index:i,client:e.client,url:a.url,requestInit:{...e.requestInit,signal:t,headers:a.headers??e.requestInit?.headers}});if(n(),validateRangedPartResponse(o,a),await saveData(a.output??e.output,a.start,t)(o),updateProgress(e.progress,e.onProgress,t)(o),n(),e.resumeState&&e.resumeManager){let t=await resolvePartSize(o,a,e.output);e.resumeManager.markPartCompleted(e.resumeState,i,t),await c.enqueue()}},e.maxWorkerCount),a=()=>{i.pause(),i.killAndDrain(),i.kill()};if(t?.aborted)throw a(),createAbortError();let o=()=>{},s=t?new Promise((e,n)=>{let r=()=>{a(),n(createAbortError())};t.addEventListener(`abort`,r,{once:!0}),o=()=>t.removeEventListener(`abort`,r)}):null,c=createStateWriteScheduler(async()=>{!e.resumeState||!e.resumeManager||await e.resumeManager.write(e.resumeState)}),l=r.map(t=>{let r=e.parts[t];return r?(n(),i.push({index:t,part:r})):Promise.resolve()}),u=[];try{let e=Promise.allSettled(l);s&&(await Promise.race([e,s]),n()),u=await e}finally{o(),await c.onIdle()}let d=u.find(e=>e.status===`rejected`);if(d?.status===`rejected`)throw d.reason},pipePartToOutput=async(e,t)=>{await new Promise((n,r)=>{let i=fs.createReadStream(e),a=()=>{t.off(`error`,o),i.off(`error`,s),i.off(`end`,c)},o=e=>{a(),r(Error(`Output write stream error`,{cause:e}))},s=e=>{a(),r(Error(`Segment read stream error`,{cause:e}))},c=()=>{a(),n()};t.on(`error`,o),i.on(`error`,s),i.on(`end`,c),i.pipe(t,{end:!1})})},mergePartOutputs=async e=>{let t=e.parts.map(e=>e.output).filter(t=>!!t&&t!==e.output);if(!t.length)return;let n=fs.createWriteStream(e.output);for(let e of t)await pipePartToOutput(e,n);n.end(),await finished(n)},validateOutputSize=async e=>{if(!e.expectedSize)return;let t=await fsp.stat(e.output).then(e=>e.size).catch(()=>null);if(t&&t!==e.expectedSize)throw Error(`Actual size ${t} doesn't match expected size ${e.expectedSize}`)},finalizeDownload=async e=>{e.resumeManager&&e.resumeManager.cleanupOnSuccess&&await e.resumeManager.delete(),await clear(e.tempFileDir)},executeDownloadFlow=async e=>{let t=createSourceSignature({input:e.input,resolvedUrl:e.url,parts:e.parts,requestHeaders:e.requestInit?.headers,maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize}),n=await loadOrCreateResumeState({manager:e.resumeManager,input:e.input,resolvedUrl:e.url,parts:e.parts,bytesTotal:e.size??void 0,sourceSignature:t,maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize}),r=createProgress(e.parts.length);e.size&&r.setTotal(e.size),n?.bytesDownloaded&&r.setCurrent(n.bytesDownloaded),await ensureOutputReadyForRanges({output:e.output,size:e.size,parts:e.parts});try{await runPartQueue({parts:e.parts,output:e.output,maxWorkerCount:e.maxWorkerCount,client:e.client,requestInit:e.requestInit,progress:r,onProgress:e.onProgress,resumeState:n,resumeManager:e.resumeManager,signal:e.signal})}finally{r.stop(),e.onProgress||r.stopLog()}ensureAllPartsCompleted(n),await mergePartOutputs({output:e.output,parts:e.parts}),await validateOutputSize({output:e.output,expectedSize:Array.isArray(e.input)?null:e.size}),await finalizeDownload({tempFileDir:e.tempFileDir,resumeManager:e.resumeManager})},probeInput=async e=>{let t=new Headers(e.requestInit?.headers);t.set(`Range`,`bytes=0-0`);let n=Array.isArray(e.input)?e.input[0]?.url:e.input;if(!n)throw Error(`Input is empty`);let r=await e.client.head(n,{...e.requestInit,headers:t}),i=r.headers.get(`content-type`),a=r.headers.get(`content-length`),o=r.headers.get(`content-range`),s=o?.split(`/`)?.[1]||a,c=s&&!Array.isArray(e.input)?parseInt(s,10):null,l=r.headers.get(`accept-ranges`)===`bytes`||!!o?.includes(`bytes`)||!!i?.includes(`video`)||!!i?.includes(`audio`)||!!i?.includes(`octet-stream`);return{url:r.url,size:c,acceptsRanges:l}};var Download=class e{input;output;resume;onProgress;config;client;resumeManager;probe;tempFileDir;constructor(e){this.input=e.input,this.output=e.output,this.resume=e.resume,this.onProgress=e.onProgress,this.config=resolveDownloadConfig(e),this.client=createClient({maxRetries:this.config.maxRetries,proxy:this.config.proxy,fetch:this.config.fetchFn}),this.config.resume.enabled&&(this.resumeManager=new ResumeManager({output:this.output,key:this.config.resume.key,filePath:this.config.resume.filePath,store:this.config.resume.store,cleanupOnSuccess:this.config.resume.cleanupOnSuccess}))}static async init(t){let n=new e(t);return await n._init(),n}async _init(){this.probe=await probeInput({client:this.client,input:this.input,requestInit:this.config.requestInit}),await ensureDirExists(this.output),this.tempFileDir=await createTempFileDir(this.output,this.config.tempDir),this.config.resume.enabled||(await clear(this.output,getDefaultResumeFilePath(this.output),this.tempFileDir),this.tempFileDir=await createTempFileDir(this.output,this.config.tempDir))}async execute(){if(!this.probe||!this.tempFileDir)throw Error(`Download was not initialized. Use Download.init(options).`);let e=planDownloadParts({input:this.input,url:this.probe.url,size:this.probe.size,acceptsRanges:this.probe.acceptsRanges,requestInit:this.config.requestInit,tempFileDir:this.tempFileDir,maxWorkerCount:this.config.maxWorkerCount,maxChunkSize:this.config.maxChunkSize});await executeDownloadFlow({input:this.input,output:this.output,url:this.probe.url,size:this.probe.size,requestInit:this.config.requestInit,maxWorkerCount:this.config.maxWorkerCount,maxChunkSize:this.config.maxChunkSize,onProgress:this.onProgress,client:this.client,parts:e,tempFileDir:this.tempFileDir,resumeManager:this.resumeManager,signal:this.config.requestInit?.signal??void 0})}async getSize(){if(this.probe||=await probeInput({client:this.client,input:this.input,requestInit:this.config.requestInit}),!this.probe.size)throw Error(`Size is not known`);return this.probe.size}};const retry=async({attempts:e,fn:t,shouldRetry:n,onRetry:r})=>{let i=Math.max(1,Math.trunc(e)),a;for(let e=1;e<=i;e+=1)try{return await t(e)}catch(t){if(a=t,e>=i||!n?.(t,e))throw t;await r?.(t,e)}throw a instanceof Error?a:Error(String(a))},forceNanospinnerTtyIfNeeded=()=>{if(process.platform===`win32`&&!isatty(process.stderr.fd)&&loadWinConsoleAddon()?.getConsoleSize?.()?.columns)try{let e=__require(`nanospinner/dist/consts.js`);e&&e.isTTY===!1&&(e.isTTY=!0,e.symbols?.frames?.length===1&&(e.symbols.frames=[`-`,`\\`,`|`,`/`]))}catch{}},getSpinnerStream=e=>{let t=process.stderr;if(!e||process.platform!==`win32`)return t;if(!t.columns||t.columns!==e){let n=Object.getOwnPropertyDescriptor(t,`columns`)??Object.getOwnPropertyDescriptor(Object.getPrototypeOf(t),`columns`);if(!n||n.writable||n.set)try{t.columns=e}catch{}if(t.columns!==e){let n=Object.create(t);return Object.defineProperty(n,`columns`,{value:e,configurable:!0,enumerable:!0,writable:!0}),logger.warn(`Unable to override stderr.columns; using spinner-local width ${e}.`),n}}return t},logLevelsColors={debug:`gray`,info:`green`,warn:`yellow`,error:`red`},getColorizedLogLevel=e=>{let t=e.toUpperCase(),n=colors[logLevelsColors[e]];return n(t)},withPrefixedText=(e,t)=>typeof t==`string`?`${e} ${t}`:t&&{...t,text:`${e} ${t.text??``}`.trimEnd()},createSpinner$1=(e,t)=>{forceNanospinnerTtyIfNeeded();let n=getLogPrefix(getColorizedLogLevel(`info`)),r=createSpinner(e,{stream:getSpinnerStream(loadWinConsoleAddon()?.getConsoleSize?.()?.columns??process.stderr.columns??process.stdout.columns??(process.platform===`win32`?120:80))}).start({text:`${n} ${e}`,color:t}),i=r.update.bind(r),a=r.success.bind(r),o=r.error.bind(r);return r.update=e=>i(withPrefixedText(n,e)),r.success=e=>a(withPrefixedText(n,e)),r.error=e=>o(withPrefixedText(n,e)),r},MAX_SAFE_MOLNIA_WORKERS=16,getWidevinePssh=e=>{if(!(!e||typeof e!=`object`||!(`drm`in e)))return e.drm?.widevine?.pssh},getTrackResumeKey=(e,t)=>createHash(`sha1`).update(`${e}:${getTrackId(t)}`).digest(`hex`),buildTrackArtifactPath=({outputDirectory:e,resolvedFilenameWithoutExtension:t,track:n})=>join(e,`${t}.${createHash(`sha256`).update(getTrackId(n)).digest(`hex`).slice(0,6)}.${n.type===`subtitle`?`vtt`:n.type===`audio`?`m4a`:`mp4`}`),getSegmentRangeHeaders=(e,t)=>{if(t)return{Range:`bytes=${e}-${e+t-1}`}},buildTrackDownloadInput=async e=>{if(e.sourceUrl&&!e.inputTrack)return e.sourceUrl;let t=[],n=await ensurePreparedTrackSegments(e),r=n[0];r?.initSegment&&t.push({url:r.initSegment.location.path,headers:getSegmentRangeHeaders(r.initSegment.location.offset,r.initSegment.location.length)});for(let e of n)t.push({url:e.location.path,headers:getSegmentRangeHeaders(e.location.offset,e.location.length)});return!t.length&&e.sourceUrl?e.sourceUrl:t.length===1&&!t[0]?.headers?t[0].url:t},resolveMaxWorkerCount=e=>{let t=Math.max(1,Math.trunc(e)),n=Math.min(MAX_SAFE_MOLNIA_WORKERS,t);return{normalizedRequestedConnections:t,maxWorkerCount:n,wasClamped:t!==n}},resolveMaxAttempts=e=>Math.max(1,Math.trunc(e)+1),buildTrackResume=(e,t)=>t.origin===`manifest`?{enabled:!0,key:getTrackResumeKey(e,t)}:!0,buildTrackProgressInfo=({title:e,progress:t,track:n,filepath:r,target:i})=>{let a={b:t.totalBytes??NaN,mb:(t.totalBytes??NaN)/1024/1024},o={b:t.bytesDownloaded??NaN,mb:(t.bytesDownloaded??NaN)/1024/1024},s=t.totalBytes?Math.round(t.bytesDownloaded/t.totalBytes*100):void 0;return{title:e,total:a,current:o,percentage:s,speed:{bps:t.bytesPerSecond??NaN,mbps:(t.bytesPerSecond??NaN)/1024/1024},trackName:basename(r),trackPath:r,finalName:i.finalName,finalPath:i.finalPath,state:s===100?`downloaded`:`downloading`,quality:n.type===`video`&&n.width?`${n.width}x${n.height}`:void 0,codec:n.type===`video`?n.codec??void 0:void 0}},buildTrackProgressMessage=e=>`Downloading ∙ ${`${(e.bytesDownloaded/1024/1024).toFixed(2)} MB`}${e.totalBytes?` of ${(e.totalBytes/1024/1024).toFixed(2)} MB`:``}`,collectPsshList=e=>e.flatMap(e=>{let t=e.segments?.[0],n=getWidevinePssh(t?.initSegment?.encryption)??getWidevinePssh(t?.encryption);return n?[n]:[]}).map(e=>{let t=e;return typeof t==`string`?t:t instanceof Uint8Array||t instanceof ArrayBuffer?Buffer.from(t).toString(`base64`):ArrayBuffer.isView(t)?Buffer.from(t.buffer).toString(`base64`):String(t)}),toDownloadArtifact=(e,t)=>({path:t,type:e.type,language:e.languageCode,label:e.name??void 0,forced:e.type===`subtitle`?e.forced:!1}),downloadTrack=async({track:e,filepath:t,description:n,target:r,source:i,options:a,settings:o,abortSignal:s,title:c,emitProgress:l})=>{logger.info(n),logger.debug(`Path: ${t}`);let u=a.connections??o.get(`connections`)??1,{maxWorkerCount:d,wasClamped:f}=resolveMaxWorkerCount(u);f&&logger.warn(`Connections value ${u} was clamped to ${d} for stability`),logger.debug(`Max worker count: ${d}`);let p=createSpinner$1(`Downloading`,`yellow`),m=``,h=await buildTrackDownloadInput(e),g=resolveMaxAttempts(a.retry??o.get(`retry`)??1);try{await retry({attempts:g,fn:async()=>{let n=await Download.init({input:h,output:t,tempDir:APP_TEMP_DIR,requestInit:{headers:i.headers,signal:s},proxy:a.proxyMedia||a.proxy||void 0,resume:buildTrackResume(i.url,e),maxRetries:a.retry,maxWorkerCount:d,onProgress:n=>{l(buildTrackProgressInfo({title:c,progress:n,track:e,filepath:t,target:r})),m=buildTrackProgressMessage(n),p.update(m)}});if(s?.aborted){logger.debug(`Track download skipped, already aborted: ${t}`);let e=Error(`The operation was aborted`);throw e.name=`AbortError`,e}await n.execute()},shouldRetry:e=>!(e instanceof Error&&e.name===`AbortError`),onRetry:async(e,n)=>{let r=e instanceof Error?e.message:String(e);logger.warn(`Track download retry ${n}/${g-1} scheduled for ${t}: ${r}`)}}),p.success(m)}catch(e){if(p.error(n),e instanceof Error&&e.name===`AbortError`)throw e;let t=e instanceof Error?e.message:String(e);throw logger.error(`Download track failed: ${t}`),e instanceof Error&&e.stack?logger.debug(e.stack):logger.debug(t),e instanceof Error?e:Error(t)}},isAbortError=e=>e instanceof Error&&e.name===`AbortError`,isAbortSignal=e=>!!e&&typeof e==`object`&&`aborted`in e&&`addEventListener`in e&&typeof e.addEventListener==`function`;var Downloader=class extends EventEmitter$1{#e;#t;#n;#r;#i;#a;constructor({settings:e,downloadsStorage:t}){super(),this.#i=e,this.#a=t}async start(e,t,n={id:crypto.randomUUID()},r,i){isAbortSignal(r)?(this.#r=new AbortController,r.addEventListener(`abort`,()=>{this.#r?.abort()})):this.#r=void 0;let a=new HttpClient({proxyUrl:e.proxy||e.proxyMeta||void 0});this.#e={...e},this.#t=t,this.#n={...n};let o;try{this.#o();let e=await selectPreparationStrategy(a,this.#t);e.matchedContentLabel&&logger.info(`Content Matched: ${e.matchedContentLabel}`),logger.info(`Parsing streams...`),o=await prepareSource({http:a,options:this.#e,source:this.#t,meta:this.#n,input:i,detection:e}),this.#e=o.options,this.#n=o.meta,await assertDownloadDirWritable(this.#i.get(`downloadDir`));let t=resolveDownloadOutputPlan({settings:this.#i,options:this.#e,source:this.#t,meta:this.#n,allTracks:o.allTracks});return this.#s(t.outputPath,t.resolvedFilenameWithoutExtension),await this.#c(o,t)}catch(e){if(isAbortError(e))throw e;let t=normalizeDownloaderError(e);throw this.emit(`error`,t),t}finally{await o?.dispose?.()}}#o(){logger.debug(`URL: ${this.#t.url}`);let e=`seasonNumber`in this.#n?this.#n.seasonNumber:void 0,t=`episodeNumber`in this.#n?this.#n.episodeNumber:void 0,n=`episodeTitle`in this.#n?this.#n.episodeTitle:``,r=[this.#n.title,e?`S${e}`:``,t?`E${t}`:``,n].filter(Boolean).join(` ∙ `);r&&logger.info(r)}#s(e,t){this.emit(`output-path`,e),logger.debug(`Resolved output path: ${e}`);let n=createDownloadMetadata(this.#n),r=this.#a.getByFilePath(e);r&&(r.title=n.title||t),logger.debug(`Emit download start`),this.emit(`start`,this.#a.jobs)}async#c(e,t){logger.debug(`Downloading tracks`);let n=[];assertUniqueTrackIds(e.tracks.all);for(let r of e.tracks.all){let e=buildTrackArtifactPath({outputDirectory:t.outputDirectory,resolvedFilenameWithoutExtension:t.resolvedFilenameWithoutExtension,track:r}),i=getTrackDescription(r,t.resolvedFilenameWithoutExtension);r.type===`subtitle`&&logger.debug(`URL: ${r.sourceUrl??`manifest subtitle track`}`),await downloadTrack({track:r,filepath:e,description:i,target:{finalName:t.filenameWithExtension,finalPath:t.outputPath},source:this.#t,options:this.#e,settings:this.#i,abortSignal:this.#r?.signal,title:createDownloadMetadata(this.#n).title,emitProgress:e=>{this.emit(`progress`,e,t.outputPath)}}),await exists(e)&&n.push(toDownloadArtifact(r,e))}return{downloaded:n,psshList:collectPsshList(e.tracks.all),selectedTracks:e.tracks.all}}};const describeUrl=e=>{try{let t=new URL(e),n=[...new Set(t.searchParams.keys())],r=n.length?`?${n.join(`,`)}`:``;return`${t.origin}${t.pathname}${r}`}catch{return e}},getContentKeys=async(e,t)=>{let{verbose:n,url:r,resolveLicense:i}=t,a=Buffer.from(e,`base64`),o=`cenc`,s=joinUrl(getApiBaseUrl(),`drm`),c=new RemoteCdm({keySystem:`com.widevine.alpha`,baseUrl:s,headers:{Authorization:`Bearer ${authState.accessToken}`}}),l=`initializing`,u=null;try{logger.debug(`DRM key request started: license=${describeUrl(r)}, remoteCdm=${describeUrl(s)}, psshLength=${e.length}, initDataBytes=${a.length}`),l=`requesting-media-key-system-access`;let t=requestMediaKeySystemAccess(c.keySystem,[]);l=`creating-media-keys`;let o=await t.createMediaKeys({cdm:c});l=`creating-session`,u=o.createSession(),l=`generating-license-request`,logger.debug(`Generating license request...`);let d=u.waitForLicenseRequest();await u.generateRequest(`cenc`,a);let f=await d;logger.debug(`License request of ${f.length} bytes generated for session ${u.sessionId}`),l=`requesting-license`,logger.debug(`Requesting license at ${r}`);let p=await i({url:r,pssh:e,data:new Uint8Array(f),sessionId:u.sessionId});if(p[0]===123||p[0]===60){logger.debug(`License response is not binary`);let e=Buffer.from(p).toString(`utf8`);if(logger.debug(e),e.includes(`<html>`))throw Error(`Invalid license response`)}l=`updating-session`,logger.debug(`Updating session...`),await u.update(new Uint8Array(p)),l=`waiting-for-key-statuses-change`,logger.debug(`Waiting for key statuses change...`);let m=await u.waitForKeyStatusesChange();logger.debug(`Keys count: ${m.length}`),l=`closing-session`,await u.close(),await u.remove();for(let e of m){let t=`Key: ${e.keyId}:${e.key}`;n?logger.info(t):logger.debug(t)}return m.map(e=>({kid:e.keyId,key:e.key}))}catch(e){throw logger.error(`Failed to get DRM content keys at stage=${l} for license=${describeUrl(r)} via remoteCdm=${describeUrl(s)}`),logErrorDetails(`DRM content key error`,e),e}finally{if(u){try{await u.close()}catch{}try{await u.remove()}catch{}}}},extractDecryptionKeys=async({keys:e,drm:t,psshList:n,drmDir:r,resolveLicense:i,licenseUrl:a})=>{logger.debug(`Extracting decryption keys`);let o=[],s=t&&`keys`in t?t.keys:[],c=[...e||[],...s];c.length&&o.push(...c);let l=a??(t&&`server`in t?t.server:void 0);if(i&&l){let e=[...new Set(n??[])];for(let[t,n]of e.entries()){logger.debug(`Resolving DRM keys for PSSH ${t+1}/${e.length} using ${describeUrl(l)}`),logger.debug(`PSSH: ${n}`);let a=await getContentKeys(n,{url:l,resolveLicense:i,clientDir:r});a&&a.length&&o.push(...a)}o.length||(logger.warn(`Can't get decryption keys`),logger.debug(`PSSH: ${e.join(`, `)}`))}return o};var Decrypter=class{strategy;constructor(e){this.strategy=e}async prepare(){await this.strategy.prepare?.()}async process(e){let t=await this.strategy.decryptFile(e);return e.cleanup&&await rm(e.input,{force:!0}),t}};const normalizeHex=e=>e.replaceAll(`-`,``).toLowerCase();var ShifroDecrypter=class{async decryptFile(e){let t=new Map;for(let n of e.keys){if(!n.kid)throw Error(`Shifro requires a KID for every decryption key`);t.set(normalizeHex(n.kid),normalizeHex(n.key))}return logger.debug(`Decrypting via shifro: ${e.input}`),await(await Decryption.init({input:new Input$2({source:new FilePathSource(e.input),keys:t}),output:new Output$1({target:new FilePathTarget(e.output)})})).execute(),e.output}};const cueBlockHeaderRegex=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}\.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}\.\d{3})([^\n]*)/g,preambleStartRegex=/^\uFEFF?WEBVTT(?:.|\n)*?\n{2}/,subtitleTimestampRegex=/(?:(\d{2}):)?(\d{2}):(\d{2})\.(\d{3})/,knownLanguageCodes={ar:`ara`,de:`deu`,en:`eng`,es:`spa`,fr:`fra`,hi:`hin`,it:`ita`,ja:`jpn`,ko:`kor`,pl:`pol`,pt:`por`,ru:`rus`,th:`tha`,tr:`tur`,uk:`ukr`,und:`und`,vi:`vie`,zh:`zho`},isSubtitleInput=e=>e===`subtitle`||e===`text`,parseMuxTimestamp=e=>{let t=e.trim().split(`:`);if(t.length<2||t.length>3)throw Error(`Invalid trim timestamp: ${e}`);let n=Number(t.at(-1)),r=Number(t.at(-2)),i=t.length===3?Number(t[0]):0;if(![i,r,n].every(e=>Number.isFinite(e)&&e>=0))throw Error(`Invalid trim timestamp: ${e}`);return i*3600+r*60+n},parseSubtitleTimestamp=e=>{let t=subtitleTimestampRegex.exec(e);if(!t)throw Error(`Invalid WebVTT timestamp: ${e}`);return 3600*1e3*Number(t[1]||`0`)+60*1e3*Number(t[2])+1e3*Number(t[3])+Number(t[4])},formatWebVttTimestamp=e=>{let t=Math.floor(e/(3600*1e3)),n=Math.floor(e%(3600*1e3)/(60*1e3)),r=Math.floor(e%(60*1e3)/1e3),i=e%1e3;return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}.${i.toString().padStart(3,`0`)}`},formatSubtitleConversionIssues=e=>{let t=[e.invalidEntries?.length?`${e.invalidEntries.length} invalid entries`:void 0,e.invalidTimecodes?.length?`${e.invalidTimecodes.length} invalid timecodes`:void 0,e.invalidIndices?.length?`${e.invalidIndices.length} invalid indices`:void 0,e.timecodeIssues?.reversedTimecodes?.length?`${e.timecodeIssues.reversedTimecodes.length} reversed timecodes`:void 0,e.timecodeIssues?.overlappingTimecodes?.length?`${e.timecodeIssues.overlappingTimecodes.length} overlapping timecodes`:void 0].filter(Boolean);return t.length?` (${t.join(`, `)})`:``},convertSubtitleTextToWebVtt=e=>{let t=e.replaceAll(`\r
4
- `,`
5
- `).replaceAll(`\r`,`
6
- `).trim();if(preambleStartRegex.test(t))return t;let{subtitle:n,status:r}=convert(e,`.vtt`);if(!r.success)throw Error(`Failed to convert subtitle to WebVTT${formatSubtitleConversionIssues(r)}.`);return n.replaceAll(`\r
7
- `,`
8
- `).replaceAll(`\r`,`
9
- `).trim()},normalizeLanguageCode=e=>{if(!e)return;let t=e.trim().toLowerCase();if(!t)return;let n=t.split(`-`)[0]??t;return/^[a-z]{3}$/.test(n)?n:knownLanguageCodes[n]},createOutputFormat=e=>{switch(extname(e).toLowerCase()){case`.mp4`:return new Mp4OutputFormat;case`.mkv`:return new MkvOutputFormat;default:throw Error(`Unsupported mux output format: ${e}`)}},createInput=e=>new Input$1({formats:ALL_FORMATS$1,source:createMediabunnyFileSource(e)}),getTrimRange=e=>{let t=e.trimBegin?parseMuxTimestamp(e.trimBegin):void 0,n=e.trimEnd?parseMuxTimestamp(e.trimEnd):void 0;if(t!==void 0&&n!==void 0&&n<=t)throw Error(`trimEnd must be greater than trimBegin`);return{trimBegin:t,trimEnd:n}},prepareVideoTrack=async(e,t,n,r,i)=>{let a=createInput(t),o=await a.getPrimaryVideoTrack();if(!o)throw Error(`Missing video track in ${t}`);let s=o.codec;if(!s)throw Error(`Unknown video codec in ${t}`);if(i!==void 0&&i>=await o.computeDuration())throw Error(`trimBegin excludes the full video track in ${t}`);let c=new EncodedPacketSink(o),l=i===void 0?await c.getFirstKeyPacket({verifyKeyPackets:!0}):await c.getKeyPacket(i,{verifyKeyPackets:!0})??await c.getFirstKeyPacket({verifyKeyPackets:!0});if(!l)throw Error(`No video packets found in ${t}`);let u=new EncodedVideoPacketSource(s);return e.addVideoTrack(u,{disposition:o.disposition,name:n??o.name??void 0,rotation:r.supportsVideoRotationMetadata?o.rotation:void 0}),{kind:`video`,input:a,sink:c,source:u,startPacket:l,startTimestamp:l.timestamp,emit:async e=>{let t={decoderConfig:await o.getDecoderConfig()??void 0},n=!0;for await(let r of c.packets(l,void 0,{verifyKeyPackets:!0}))await u.add(r.clone({timestamp:r.timestamp-e}),n?t:void 0),n=!1;u.close()}}},prepareAudioTrack=async(e,t,n,r,i)=>{let a=createInput(t),o=await a.getPrimaryAudioTrack();if(!o)throw Error(`Missing audio track in ${t}`);let s=o.codec;if(!s)throw Error(`Unknown audio codec in ${t}`);if(i!==void 0&&i>=await o.computeDuration())throw Error(`trimBegin excludes the full audio track in ${t}`);let c=new EncodedPacketSink(o),l=i===void 0?await c.getFirstPacket():await c.getPacket(i)??await c.getFirstPacket();if(!l)throw Error(`No audio packets found in ${t}`);let u=new EncodedAudioPacketSource(s);return e.addAudioTrack(u,{disposition:o.disposition,languageCode:normalizeLanguageCode(n)??normalizeLanguageCode(o.languageCode),name:r??o.name??void 0}),{kind:`audio`,input:a,sink:c,source:u,startPacket:l,startTimestamp:l.timestamp,emit:async e=>{let t={decoderConfig:await o.getDecoderConfig()??void 0},n=!0;for await(let r of c.packets(l))await u.add(r.clone({timestamp:r.timestamp-e}),n?t:void 0),n=!1;u.close()}}},rebaseWebVtt=(e,{trimBegin:t,trimEnd:n,commonStart:r})=>{let i=e.replaceAll(`\r
10
- `,`
11
- `).replaceAll(`\r`,`
12
- `).trim();if(!preambleStartRegex.test(i))throw Error(`Only WebVTT subtitles are supported by the MediaBunny muxer.`);let a=t===void 0?void 0:Math.round(t*1e3),o=n===void 0?void 0:Math.round(n*1e3),s=Math.round(r*1e3);cueBlockHeaderRegex.lastIndex=0;let c=cueBlockHeaderRegex.exec(i),l=i.slice(0,c?.index??i.length).trimEnd(),u=[],d=c?i.slice(c.index):``;for(;;){cueBlockHeaderRegex.lastIndex=0;let e=cueBlockHeaderRegex.exec(d);if(!e)break;let t=e.index+e[0].length,n=d.indexOf(`
13
- `,t)+1,r=d.indexOf(`
14
-
15
- `,t);r===-1&&(r=d.length);let i=e[1]?.trim(),c=e[4]?.trim(),l=d.slice(n,r).trim(),f=parseSubtitleTimestamp(e[2]),p=parseSubtitleTimestamp(e[3]),m=Math.max(f,a??f)-s,h=Math.min(p,o??p)-s;if(h>m){let e=`${formatWebVttTimestamp(m)} --> ${formatWebVttTimestamp(h)}${c?` ${c}`:``}`;u.push([i,e,l].filter(Boolean).join(`
16
- `))}d=d.slice(r).trimStart()}return[l,...u].filter(Boolean).join(`
17
-
18
- `)},addTrackToOutput=async(e,t,n,r,i)=>{if(n.type===`video`)return prepareVideoTrack(e,n.path,n.label,t,r);if(n.type===`audio`)return prepareAudioTrack(e,n.path,n.language,n.label,r);if(isSubtitleInput(n.type)){let t=convertSubtitleTextToWebVtt(await readFile(n.path,`utf8`)),a=new TextSubtitleSource(`webvtt`);return e.addSubtitleTrack(a,{disposition:n.forced?{forced:!0}:void 0,languageCode:normalizeLanguageCode(n.language),name:n.label}),{kind:`subtitle`,source:a,emit:async e=>{let n=rebaseWebVtt(t,{trimBegin:r,trimEnd:i,commonStart:e});await a.add(n),a.close()}}}throw Error(`Unsupported mux input type: ${n.type}`)};var MediaBunnyMuxer=class{async mux(e){let{trimBegin:t,trimEnd:n}=getTrimRange(e),r=createOutputFormat(e.output),i=new Output({format:r,target:createMediabunnyFileTarget(e.output)}),a=[];try{for(let o of e.inputs)a.push(await addTrackToOutput(i,r,o,t,n));let o=a.filter(e=>e.kind!==`subtitle`);if(!a.length)throw Error(`No tracks provided for muxing.`);let s=o.length>0?Math.min(...o.map(e=>e.startTimestamp)):t??0;await i.start();for(let e of a){if(e.kind===`subtitle`){await e.emit(s);continue}await e.emit(s)}return await i.finalize(),e.output}catch(e){throw await i.cancel().catch(()=>void 0),e}finally{for(let e of a)e.kind!==`subtitle`&&e.input.dispose()}}},Muxer=class{strategy;constructor(e){this.strategy=e}async prepare(){await this.strategy.prepare?.()}async process(e){let t=await this.strategy.mux(e);if(e.cleanup)for(let t of new Set(e.inputs.map(e=>e.path)))await rm(t,{force:!0});return t}},ProcessingHandler=class{fn;next=null;constructor(e){this.fn=e,this.next=null}},ProcessingChain=class{first=null;last=null;constructor(){this.first=null,this.last=null}add(e){let t=new ProcessingHandler(e);return this.first?this.last.next=t:this.first=t,this.last=t,this}async process(e){let t=this.first,n=async()=>await t.fn(e,async()=>{if(t=t.next,t)return await n();throw Error(`No handler detected`)});return await n()}};const decryption=async(e,t)=>{if(!e.keys.length)return t();let n=createSpinner$1(`Decrypting`),r=new Decrypter(new ShifroDecrypter);await r.prepare();for(let t of e.inputs){let n=extname(t.path),i=t.path.replace(n,`.dec`+n);if(!(t.type!==`video`&&t.type!==`audio`)){if(await r.process({input:t.path,output:i,keys:e.keys,type:t.type,cleanup:!0}),!existsSync(i))throw Error(`Decryption failed for file ${t.path}. Unable to find ${i}`);t.path=i}}n.success(`Decrypted`),await t()},muxing=async(e,t)=>{if(e.skipMux)return t();let n=createSpinner$1(`Muxing`),r=new Muxer(new MediaBunnyMuxer);await r.prepare(),await r.process({inputs:e.inputs,output:e.output,trimBegin:e.trimBegin,trimEnd:e.trimEnd,cleanup:!0}),existsSync(e.output)?(n.success(`Muxed`),logger.debug(`Muxed: ${e.output}`)):n.error(`Muxing failed. Output file not found: ${e.output}`)},MIN_CONNECTIONS=1,BASIC_MAX_CONNECTIONS=4,PLUS_MAX_CONNECTIONS=8,PRO_MAX_CONNECTIONS=16,normalizeConnections=(e,t)=>Math.max(MIN_CONNECTIONS,Math.trunc(typeof e==`number`&&Number.isFinite(e)?e:t)),resolveMaxConnectionsByBenefits=e=>e.includes(`highConnectionsCount`)?PRO_MAX_CONNECTIONS:e.includes(`mediumConnectionsCount`)?PLUS_MAX_CONNECTIONS:BASIC_MAX_CONNECTIONS,sanitizeConnectionsByBenefits=({requestedConnections:e,fallbackConnections:t=MIN_CONNECTIONS,grantedBenefits:n})=>{let r=normalizeConnections(e,normalizeConnections(t,MIN_CONNECTIONS)),i=resolveMaxConnectionsByBenefits(n),a=Math.min(r,i);return{connections:a,normalizedRequestedConnections:r,maxAllowedConnections:i,wasClamped:a<r}},verifySettings=async e=>{let{grantedBenefits:t}=await getCustomerState(),n=null,r=t.includes(`parallelDownloads`),i=e.maxActiveDownloads&&e.maxActiveDownloads>1;if(!r&&i&&(n=Error(`PARALLEL_DOWNLOADS_NOT_ALLOWED`),e.maxActiveDownloads=1),e.proxy||e.proxyMeta||e.proxyMedia){let r=t.includes(`proxy`),i=e.proxy||e.proxyMeta||e.proxyMedia;!r&&i&&(n=Error(`PROXY_NOT_ALLOWED`),delete e.proxy,delete e.proxyMeta,delete e.proxyMedia)}if(e.videoContainerFormat&&e.videoContainerFormat!==`mp4`&&(t.includes(`customMuxFormat`)||(n=Error(`CUSTOM_MUX_FORMAT_NOT_ALLOWED`),e.videoContainerFormat=`mp4`)),typeof e.connections==`number`){let{connections:n}=sanitizeConnectionsByBenefits({requestedConnections:e.connections,grantedBenefits:t});e.connections=n}return{error:n,data:e}},getBaseDownloadOptions=e=>({retry:e.get(`retry`),connections:e.get(`connections`),proxy:e.get(`proxy`),proxyMeta:e.get(`proxyMeta`),proxyMedia:e.get(`proxyMedia`),movieTemplate:e.get(`movieFilenameTemplate`),episodeTemplate:e.get(`seriesFilenameTemplate`),hardsub:e.get(`preferHardsub`),format:e.get(`videoContainerFormat`)}),applyBenefitLimitedConnections=({options:e,fallbackConnections:t,grantedBenefits:n})=>{let r=sanitizeConnectionsByBenefits({requestedConnections:e.connections,fallbackConnections:t,grantedBenefits:n});return{options:{...e,connections:r.connections},limit:r}},resolveDownloadJobOptions=({settings:e,requestedOptions:t,filePath:n,grantedBenefits:r})=>{let i=getBaseDownloadOptions(e),{options:a,limit:o}=applyBenefitLimitedConnections({options:{...i,...t},fallbackConnections:i.connections,grantedBenefits:r});return n&&(a.outputPath=n),{baseOptions:i,options:a,limit:o}};var DownloadJobRunner=class{settings;extensionManager;downloadsStorage;callbacks;constructor(e,t,n,r){this.settings=e,this.extensionManager=t,this.downloadsStorage=n,this.callbacks=r}async run(e,t,n){let r;try{e.status=`downloading`,await this.callbacks.persistJob(e),this.callbacks.emitStatusChanged(e);let{options:i,limit:a}=resolveDownloadJobOptions({settings:this.settings,requestedOptions:e.options,filePath:e.filePath,grantedBenefits:n});a.wasClamped&&logger.warn(`Connections value ${a.normalizedRequestedConnections} exceeds tier limit (${a.maxAllowedConnections}). Using ${a.connections}.`);let o=new Downloader({settings:this.settings,downloadsStorage:this.downloadsStorage});this.#e(e,t,o);let s=e.resource;if(!s)throw Error(`Download job is missing a media resource`);let c=e.url?await this.extensionManager.getExtensionForUrl(e.url):null,l=e.url?await materializeMediaResource({resource:s,url:e.url,options:i,extension:c}):{source:s.source};r=l.input,s.source=l.source,await this.callbacks.persistJob(e),c&&await runBeforeDownloadHook(c);let{downloaded:u=[],psshList:d,selectedTracks:f}=await o.start(i,l.source,s.metadata,t.signal,l.input);if(t.signal.aborted)return;if(!u.length)throw errors.emit(`error`,{code:`NO_FILES_DOWNLOADED`}),Error(`No files were downloaded`);u.length&&!e.filePath&&(e.filePath=u[0]?.path),this.callbacks.trackArtifact(e.id,e.filePath);for(let t of u)this.callbacks.trackArtifact(e.id,t.path);if(e.status!==`downloading`)return;e.status=`processing`,this.callbacks.emitStatusChanged(e);let p=await this.#r({job:e,options:i,psshList:d??[],selectedTracks:f,extension:c,resolvedEntry:l.entry,resolvedInput:l.input}),m=new ProcessingChain;m.add(decryption).add(muxing),await m.process({inputs:u,output:e.filePath,keys:p,trimBegin:i.trimBegin,trimEnd:i.trimEnd,binariesDir:this.settings.get(`binariesDir`),skipMux:i.skipMux}),c&&await runAfterDownloadHook(c,{skipMux:i.skipMux}),e.status=`completed`,e.progress=100,this.callbacks.emitStatusChanged(e),this.callbacks.emitJobCompleted(e)}catch(t){if(t instanceof Error&&t.name===`AbortError`){logger.debug(`Download was aborted (paused): ${e.id}`);return}let{normalizedError:n,alreadyHandled:r}=this.#t(e,t);if(this.#n(n),r)return;logger.error(`Download job failed: ${n}`),logErrorDetails(`Download job failure`,n),this.callbacks.emitStatusChanged(e),this.callbacks.emitJobError(e,n)}finally{await r?.dispose?.()}}#e(e,t,n){n.on(`output-path`,t=>{e.filePath=t,this.callbacks.trackArtifact(e.id,t),this.callbacks.persistJob(e),logger.debug(`Job output path persisted early: id=${e.id}, path=${t}`)});let r={};n.on(`progress`,n=>{if(t.signal.aborted||e.status!==`downloading`)return;r[n.trackPath]=n,this.callbacks.trackArtifact(e.id,n.trackPath),this.callbacks.trackArtifact(e.id,n.finalPath);let i=0,a=0;for(let e in r)i+=r[e].current.b,a+=r[e].total.b;let o=a>0?i/a*100:0;e.filePath=n.finalPath,e.progress=o,e.downloadedBytes=i,e.totalBytes=a,n.quality&&(e.quality=n.quality),n.codec&&(e.codec=n.codec),this.callbacks.emitProgress(e),this.callbacks.persistJob(e)}),n.on(`error`,n=>{if(e.status===`paused`||t.signal.aborted)return;let{normalizedError:r,alreadyHandled:i}=this.#t(e,n);i||(logger.error(`Downloader process failed: ${r.message}`),r.stack&&logger.debug(r.stack),this.callbacks.emitStatusChanged(e),this.callbacks.emitJobError(e,r))})}#t(e,t){let n=t instanceof Error?t:Error(String(t)),r=e.status===`error`&&e.error===n.message;return r||(e.status=`error`,e.error=n.message),{normalizedError:n,alreadyHandled:r}}#n(e){(e&&typeof e==`object`&&`code`in e?String(e.code):``)===`DOWNLOAD_DIR_NOT_WRITABLE`&&errors.emit(`error`,{code:`DOWNLOAD_DIR_NOT_WRITABLE`})}async#r({job:e,options:t,psshList:n,selectedTracks:r,extension:i,resolvedEntry:a,resolvedInput:o}){let s=e.resource?.source?.drm??e.resource?.drm;e.resource?.drmPayload&&e.url&&(s=await resolveMediaResourceDrm(e.resource,t,i));let c=await this.#i({extension:i,selectedTracks:r,resolvedEntry:a,resolvedInput:o,options:t}),l=await this.#a({extension:i,selectedTracks:r,resolvedEntry:a,resolvedInput:o,options:t}),u=s&&`server`in s?createLegacyDrmLicenseResolver(s):void 0,d=l.resolveLicense??u,f=l.licenseUrl??(s&&`server`in s?s.server:void 0);return extractDecryptionKeys({keys:[...t.keys??[],...c],drm:s,psshList:n,drmDir:this.settings.get(`drmDir`),resolveLicense:d,licenseUrl:f}).catch(r=>{throw logger.error(`Failed to extract decryption keys for job ${e.id}`),logger.debug(`DRM extraction context: title=${e.title||e.resource?.metadata?.title||`(unknown)`}, drmServer=${s&&`server`in s?s.server:`(none)`}, psshCount=${n.length}, providedKeyCount=${t.keys?.length??0}`),r instanceof Error?(logErrorDetails(`DRM extraction failure`,r),r.message===`Unauthorized`&&errors.emit(`error`,{code:`DRM_UNAUTHORIZED`}),r.message===`Forbidden`&&errors.emit(`error`,{code:`DRM_FORBIDDEN`})):logger.debug(String(r)),r})}async#i({extension:e,selectedTracks:t,resolvedEntry:n,resolvedInput:r,options:i}){if(!e||!n||!r)return[];let a=getCompatibleExtensionExports(e);if(typeof a.drm?.getKeys!=`function`)return[];let o=new Map,s={...n,input:r};for(let e of t){if(!e.inputTrack)continue;let t=(await ensurePreparedTrackSegments(e).catch(()=>[]))[0],n=t?.initSegment?.encryption??t?.encryption,r=[n?.drm?.widevine?`widevine`:null,n?.drm?.playready?`playready`:null,n?.drm?.fairplay?`fairplay`:null].filter(Boolean)[0];if(!r)continue;let c=await a.drm.getKeys({system:r,entry:s,track:e.inputTrack,options:i});for(let[e,t]of c??[])o.set(e,t)}return Array.from(o,([e,t])=>({kid:e,key:t}))}async#a({extension:e,selectedTracks:t,resolvedEntry:n,resolvedInput:r,options:i}){if(!e||!n||!r)return{};let a=getCompatibleExtensionExports(e);if(typeof a.drm?.getLicense!=`function`)return{};let o=await this.#o(t);if(!o.size)return{};let s={...n,input:r};return{licenseUrl:`extension://${e.package.name}/license`,resolveLicense:async({pssh:e,data:t})=>{let n=o.get(e);if(!n)throw Error(`No DRM track binding found for PSSH ${e}`);return await a.drm.getLicense({system:n.system,entry:s,track:n.track,options:i,data:t})}}}async#o(e){let t=new Map;for(let n of e){if(!n.inputTrack)continue;let e=(await ensurePreparedTrackSegments(n).catch(()=>[]))[0],r=e?.initSegment?.encryption??e?.encryption;for(let e of[this.#s(n,`widevine`,r?.drm?.widevine?.pssh),this.#s(n,`playready`,r?.drm?.playready?.pssh),this.#s(n,`fairplay`,r?.drm?.fairplay?.pssh)])!e||t.has(e.pssh)||t.set(e.pssh,e)}return t}#s(e,t,n){if(!e.inputTrack||!n)return null;let r=typeof n==`string`?n:n instanceof Uint8Array||n instanceof ArrayBuffer?Buffer.from(n).toString(`base64`):null;return r?{pssh:r,system:t,track:e.inputTrack}:null}},DownloadManager=class extends EventEmitter$1{settings;extensionManager;downloadsStorage;#e=new DownloadRunState;#t=new Map;#n=null;#r;maxActiveDownloads;constructor(e,t,n){super(),this.settings=e,this.extensionManager=t,this.downloadsStorage=n,this.maxActiveDownloads=e.get(`maxActiveDownloads`),this.#r=new DownloadJobRunner(e,t,n,{persistJob:e=>this.downloadsStorage.update(e),emitStatusChanged:e=>this.emit(`job-status-changed`,e),emitProgress:e=>this.emit(`job-progress`,e),emitJobError:(e,t)=>this.emit(`job-error`,e,t),emitJobCompleted:e=>this.emit(`job-completed`,e),trackArtifact:(e,t)=>this.#m(e,t)}),logger.debug(`Created download manager with max active downloads: ${this.maxActiveDownloads}`)}async initializeFromStorage(){let e=new Set([`downloading`,`queued`,`processing`,`pending`,`analyzing`]);for(let t of this.downloadsStorage.jobs)t.status===`paused`||t.status===`completed`||t.status===`error`||e.has(t.status)&&(t.status!==`queued`&&(t.status=`queued`,t.error=void 0,await this.downloadsStorage.update(t)),this.#d(t));this.#s()}async analyze(e,t={}){if(!e){let e=Error(`Cannot prepare job without a URL.`);throw this.emit(`error`,e),e}let n=await analyzeMediaResource(e,t,await this.extensionManager.getExtensionForUrl(e));if(!n)throw Error(`No media resource found`);return n}async add(e){if(!e.url&&!e.resource)throw Error(`Job must have either a URL or a pre-prepared resource.`);let t={id:crypto.randomUUID(),status:`queued`,progress:0,downloadedBytes:0,createdAt:new Date().toISOString(),...e};logger.debug(`Adding new job: ${t.id}`),logger.debug(`URL: ${t.url}`),await this.downloadsStorage.add(t),this.emit(`job-added`,t),this.#d(t),this.#s()}async pause(e){let t=await this.#i(e,`pause`);t&&logger.debug(`Paused download: ${t.id}`)}async resume(e){let t=this.#e.getActiveRun(e);if(t){t.cancellationReason===`pause`||t.controller.signal.aborted?(this.#e.queueResumeAfterStop(e),logger.debug(`Resume queued until stop completes: ${e}`)):logger.debug(`Resume skipped while job is active: ${e}`);return}let n=this.#y(e);if(!n){logger.warn(`Resume failed: Job ${e} not found`);return}if(n.status===`paused`){await this.#a(n),logger.debug(`Resumed download: ${n.id}`);return}n.status===`error`&&await this.#o(n)&&logger.debug(`Retried download: ${n.id}`)}async remove(e){await this.#i(e,`remove`),await this.downloadsStorage.delete(e),this.#t.delete(e)}async removeWithFile(e){let t=this.#y(e),n=await this.#i(e,`remove-with-file`)||t,r=this.#h(e,n);await this.downloadsStorage.delete(e),await this.#_(r),this.#t.delete(e)}async#i(e,t){let n=this.#f(e),r=this.#e.getActiveRun(e),i=this.#y(e);return r?t===`pause`&&r.job.status!==`downloading`?(logger.debug(`Pause ignored for non-downloading stage: id=${e}, stage=${r.job.status}`),r.job):(r.cancellationReason=t,t===`pause`&&(r.job.status=`paused`,r.job.error=void 0,await this.downloadsStorage.update(r.job),this.emit(`job-status-changed`,r.job)),r.controller.abort(),await r.runPromise,r.job):(t===`pause`&&i&&(n||i.status===`queued`)&&(i.status=`paused`,i.error=void 0,await this.downloadsStorage.update(i),this.emit(`job-status-changed`,i)),i??void 0)}async#a(e){e.status=`queued`,e.error=void 0,await this.downloadsStorage.update(e),this.emit(`job-status-changed`,e),this.#d(e),this.#s()}async#o(e){let t=this.#h(e.id,e);this.#t.delete(e.id),await this.#_(t),e.status=`analyzing`,e.error=void 0,e.progress=0,e.downloadedBytes=0,e.totalBytes=void 0,e.quality=void 0,e.codec=void 0,await this.downloadsStorage.update(e),this.emit(`job-status-changed`,e);try{if(e.url){let t=await this.analyze(e.url,e.options??{}),n=this.#g(e,t);if(!n)throw Error(`No media resource found`);e.resource=n}return await this.#a(e),!0}catch(t){return e.status=`error`,e.error=t instanceof Error?t.message:String(t),await this.downloadsStorage.update(e),this.emit(`job-status-changed`,e),this.emit(`job-error`,e,t),!1}}#s(){for(this.maxActiveDownloads=this.settings.get(`maxActiveDownloads`);this.#e.activeRunCount<this.maxActiveDownloads;){let e=this.#p();if(!e)break;this.#c(e)}this.#e.queuedCount===0&&this.#e.activeRunCount===0&&this.emit(`idle`)}#c(e){if(e.status!==`queued`){logger.warn(`Skipping non-queued job start: ${e.id} (${e.status})`);return}let t=new AbortController,n={controller:t,job:e,runPromise:Promise.resolve()};this.#e.setActiveRun(e.id,n),n.runPromise=this.#u(e,t).catch(e=>{let t=e instanceof Error?e:Error(`Download run failed: ${String(e)}`);logger.error(t.message),this.emit(`error`,t)})}async#l(){if(this.#n)return this.#n;try{let{grantedBenefits:e}=await getCustomerState();this.#n=e}catch(e){let t=e instanceof Error?e.message:String(e);logger.warn(`Failed to resolve customer plan for connection limits. Falling back to Free limits: ${t}`),this.#n=[]}return this.#n}async#u(e,t){this.#e.setActiveJob(e);try{let n=await this.#l();await this.#r.run(e,t,n)}finally{let t=this.#e.getActiveRun(e.id);if(t){let n=t?.cancellationReason,r=n===`pause`&&this.#e.consumeResumeAfterStop(e.id);n===`pause`?(e.status=`paused`,e.error=void 0,await this.downloadsStorage.update(e),this.emit(`job-status-changed`,e)):n!==`remove`&&n!==`remove-with-file`&&await this.downloadsStorage.update(e),this.#e.deleteActiveJob(e.id),this.#e.deleteActiveRun(e.id),r&&e.status===`paused`&&(e.status=`queued`,e.error=void 0,await this.downloadsStorage.update(e),this.emit(`job-status-changed`,e),this.#d(e)),this.#s()}}}#d(e){this.#e.enqueue(e)}#f(e){return this.#e.dequeue(e)}#p(){return this.#e.dequeueNext(e=>this.#y(e))}#m(e,t){if(!t)return;let n=this.#t.get(e);n||(n=new Set,this.#t.set(e,n)),n.add(t)}#h(e,t){let n=new Set;for(let t of this.#t.get(e)??[])n.add(t);t?.filePath&&n.add(t.filePath);let r=new Set;for(let e of n)r.add(e),r.add(`${e}.part.json`),r.add(this.#v(e));return r}#g(e,t){let n=Array.isArray(t)?t:[t];if(n.length<=1)return n[0];let r=e.resource?.metadata,i=e.resource?.source.url,a=r&&`seasonNumber`in r?r.seasonNumber:null,o=r&&`episodeNumber`in r?r.episodeNumber:null,s=r&&`episodeTitle`in r?r.episodeTitle:null;return n.find(e=>{let t=e.metadata;if(r?.id&&t?.id)return r.id===t.id;let n=t&&`seasonNumber`in t?t.seasonNumber:null,c=t&&`episodeNumber`in t?t.episodeNumber:null,l=t&&`episodeTitle`in t?t.episodeTitle:null;return r?.title&&t?.title&&r.title===t.title&&a===n&&o===c&&s===l?!0:!!i&&i===e.source.url})??n[0]}async#_(e){e.size!==0&&await Promise.all([...e].map(e=>rm(e,{recursive:!0,force:!0}).catch(()=>void 0)))}#v(e){let t=resolve(e),n=parse(e).name;return join(APP_TEMP_DIR,`${n}-${createHash(`sha1`).update(t).digest(`hex`).slice(0,10)}`)}#y(e){return this.#e.getActiveJob(e)||this.downloadsStorage.get(e)}onJobAdded(e){return this.on(`job-added`,e),()=>this.removeListener(`job-added`,e)}onJobStatusChanged(e){return this.on(`job-status-changed`,e),()=>this.removeListener(`job-status-changed`,e)}onJobProgress(e){return this.on(`job-progress`,e),()=>this.removeListener(`job-progress`,e)}onJobCompleted(e){return this.on(`job-completed`,e),()=>this.removeListener(`job-completed`,e)}onJobError(e){return this.on(`job-error`,e),()=>this.removeListener(`job-error`,e)}onIdle(e){return this.on(`idle`,e),()=>this.removeListener(`idle`,e)}onError(e){return this.on(`error`,e),()=>this.removeListener(`error`,e)}waitForIdle(){return new Promise(e=>this.onIdle(e))}};const parseSingleEpisode=e=>{if(!e)return null;let[t,n]=e.toLowerCase().split(`e`);return[parseInt(t.trim().toLowerCase().replace(`s`,``)),parseFloat(n?.trim())]},parseEpisodesBySeasons=e=>{let t=0,n=9999,r=[],i=e.split(`,`);for(let e of i){let[t,i]=e.split(`-`),a=parseSingleEpisode(t),o=parseSingleEpisode(i);if(a&&!i){let[e,t]=a;if(isNaN(t))for(let t=0;t<=n;t++)r.push([e,t]);else r.push([e,t])}else if(a&&o){let[e,t]=a,[i,s]=o;for(let a=e;a<=i;a++){let e=t||0,o=a===i?s:n;for(let t=e;t<=o;t++)r.push([a,t])}}}let a=new Map;for(let[e,t]of r)a.has(e)||a.set(e,new Set),a.get(e)?.add(t);return a},parseHeaders=e=>{if(!e)return{};let t={},n=typeof e==`string`?e.split(`|`):e;for(let e of n){let[n,...r]=e.split(`:`),i=r.join(`:`);if(!i)throw Error(`Can't parse header: ${e}`);t[n.trim()]=i.trim()}return t},validateUrl=async e=>{let t=!1,n=e;do try{n?t=!!new URL(n):n=(await prompt.ask({fields:{url:{label:`URL`}}})).url}catch{n=(await prompt.ask({fields:{url:{label:`URL`}}})).url}while(!t);return n!==e&&logger.debug(`URL: ${n}`),n},compareJobsByCreatedAtDesc=(e,t)=>new Date(t.createdAt??0).getTime()-new Date(e.createdAt??0).getTime();var DownloadsStorage=class{filePath;jobs=[];#e=Promise.resolve();constructor(e){this.filePath=e}parse(e){let t=JSON.parse(e),n=Object.entries(t);return new Map(n)}async load(){await this.#e;try{let e=await readFile(this.filePath,{encoding:`utf8`});this.jobs=JSON.parse(e).toSorted(compareJobsByCreatedAtDesc)}catch{this.jobs=[]}return this}get size(){return this.jobs.length}async add(e){await this.#t(async()=>{this.jobs.unshift(e),await this.save()})}async update(e){await this.#t(async()=>{let t=this.jobs.findIndex(t=>t.id===e.id);t!==-1&&(this.jobs[t]=e,await this.save())})}getByFilePath(e){return this.jobs.find(t=>t.filePath===e)}get(e){return this.jobs.find(t=>t.id===e)}has(e){return this.jobs.some(t=>t.id===e)}async delete(e){await this.#t(async()=>{let t=this.jobs.findIndex(t=>t.id===e);t!==-1&&(this.jobs.splice(t,1),await this.save())})}async deleteWithFile(e){let t=await this.#t(async()=>{let t=this.jobs.findIndex(t=>t.id===e);if(t===-1)return null;let[n]=this.jobs.splice(t,1);return await this.save(),n??null});t?.filePath&&await rm(t.filePath,{recursive:!0,force:!0})}async clear(){await this.#t(async()=>{this.jobs=[],await this.save()})}async save(){return writeFile(this.filePath,JSON.stringify(this.jobs,null,2))}#t(e){let t=this.#e.then(e,e);return this.#e=t.then(()=>void 0,()=>void 0),t}};const downloadCommand={command:[`download [urls..]`,`$0 [urls..]`],aliases:[`dl`],describe:`Download media content by URL`,builder:e=>e.option(`quality`,{alias:`q`,describe:`Video resolution quality - 2160p/1080p/720p/..., defaults to highest available`,type:`string`}).option(`video-codec`,{alias:`v`,describe:`Video codec - avc | hevc | vp8 | vp9 | av1 | vc1, defaults to any`,type:`string`}).option(`video-range`,{alias:`r`,describe:`Video color range - sdr | hlg | hdr10 | hdr10+ | dv, defaults to sdr`,type:`string`}).option(`video-bitrate`,{describe:`Video bitrate (in kbps), defaults to highest available`,type:`number`}).option(`video-dimension`,{describe:`Video dimension - 2D/3D (HSBS/HOU/FSBS/OU), defaults to 2D`,default:`2D`,type:`string`}).option(`audio-codec`,{alias:`a`,describe:`Audio codec - aac | opus | mp3 | vorbis | flac | alac | ac3 | eac3 | dts, defaults to any`,type:`string`}).option(`audio-channels`,{alias:`c`,describe:`Audio channels, matches sub-channel layouts like 5.1 with 6.0`,type:`number`}).option(`audio-bitrate`,{describe:`Audio bitrate (in kbps), defaults to highest available`,type:`number`}).option(`subs-format`,{alias:`s`,describe:`Subtitle format - SRT/SSA/ASS/TTML/VTT/STPP/WVTT`,type:`string`}).option(`subs-lang`,{alias:`S`,describe:`Subtitles language(s)`,type:`string`}).option(`lang`,{alias:`l`,describe:`Video/audio language(s)`,type:`string`}).option(`skip-video`,{describe:`do not download video`,type:`boolean`}).option(`skip-audio`,{describe:`do not download audio`,type:`boolean`}).option(`skip-subtitles`,{describe:`do not download subtitles`,type:`boolean`}).option(`skip-mux`,{describe:`Disable merge audio/video/subs into single file`,type:`boolean`}).option(`select`,{describe:`Select audio/video/subtitle streams from manifest manually`,type:`boolean`}).option(`episodes`,{alias:`e`,describe:"Seasons/episodes to download, e.g. `S01E01`, `S01-S05,S07`, `S01E01-S02E03`, `S02-S02E03`, etc.",type:`string`,coerce:e=>parseEpisodesBySeasons(e)}).option(`retry`,{alias:`R`,describe:`Number of retries in case of unsuccessful request`,type:`number`,default:defaultSettings.retry}).option(`connections`,{alias:`C`,describe:`Number of parallel http connections per download`,type:`number`,default:defaultSettings.connections}).option(`proxy`,{describe:`Use specified HTTP/HTTPS proxy for all requests`,type:`string`}).option(`proxy-meta`,{describe:`Use specified HTTP/HTTPS proxy for metadata fetching`,type:`string`}).option(`proxy-media`,{describe:`Use specified HTTP/HTTPS proxy for media downloading`,type:`string`}).option(`movie-template`,{describe:`Movie filename template`,type:`string`,default:defaultSettings.movieFilenameTemplate}).option(`episode-template`,{describe:`Episode filename template`,type:`string`,default:defaultSettings.seriesFilenameTemplate}).option(`hardsub`,{describe:`Download hardsubbed video if available`,type:`boolean`}).option(`trim-begin`,{describe:`Trim video at the beginning; example: 00:00:06`,type:`string`}).option(`trim-end`,{describe:`Trim video at the end; example: 00:01:30`,type:`string`}).option(`key`,{describe:`Set content decryption key (if manifest URL as main URL passed), format: KID:KEY`,type:`array`,string:!0,coerce:e=>e.map(e=>{let[t,n]=e.split(`:`);return{kid:t,key:n}})}).option(`header`,{alias:`H`,describe:`Pass custom header(s) for manifest request`,type:`array`,string:!0,coerce:e=>parseHeaders(e)}).option(`format`,{alias:`f`,describe:`Video container format - mp4 | mkv (Pro only)`,type:`string`,choices:[`mp4`,`mkv`]}),handler:async e=>{let t=e;t.videoQuality=e.quality;let n=new SettingsStore(SETTINGS_PATH);if(t.format){let{error:e}=await verifySettings({videoContainerFormat:t.format});e&&(logger.error(`Invalid format: ${e.message}`),logger.info(`Learn more: https://azot.mov/pricing`),process.exit(1))}let r=[];try{({grantedBenefits:r}=await getCustomerState())}catch(e){let t=e instanceof Error?e.message:String(e);logger.warn(`Failed to resolve customer plan for connection limits. Falling back to Free limits: ${t}`)}let{options:i,limit:{normalizedRequestedConnections:a,maxAllowedConnections:o,wasClamped:s,connections:c}}=applyBenefitLimitedConnections({options:t,fallbackConnections:n.get(`connections`),grantedBenefits:r});Object.assign(t,i),s&&logger.warn(`Connections value ${a} exceeds tier limit (${o}). Using ${c}.`);let l=new ExtensionManager({dirs:[EXTENSIONS_SOURCES_DIR],indexPath:EXTENSIONS_INDEX_PATH});await l.init(),await l.loadCoreExtensions(),await l.discover();let u=new DownloadsStorage(join(APP_CONFIG_DIR,`downloads.json`));await u.load();let d=new DownloadManager(n,l,u);loadAuth().then(e=>Object.assign(authState,e)),d.onJobCompleted(e=>{logger.debug(`Job completed: ${e.id}`)}),d.onJobError(e=>{logger.debug(`Job failed: ${e.error}`)}),d.onError(e=>{logger.error(`Download manager error: ${e.message}`)});let f=(Array.isArray(e.urls)?e.urls:[]).filter(e=>e!==process.argv[1]),p=f.length>0?f:[``];for(let e of p){let n=await validateUrl(e),r=await d.analyze(n,t),i=Array.isArray(r)?r:[r];for(let e of i)d.add({url:n,options:t,resource:e})}await d.waitForIdle()}},CLIENT_ID=`azot-desktop`,login=async()=>{if(await loadAuth()&&!await confirm({message:`You're already logged in. Do you want to log in again?`,default:!1})){logger.debug(`Login cancelled`);return}let e=createSpinner(`Requesting device authorization...`);e.start();try{let t=getAuthClient(),{data:n,error:r}=await t.device.code({client_id:CLIENT_ID,scope:`openid profile email`});if(e.stop(),r||!n)logger.error(`Failed to request device authorization: ${r?.error_description||r?.statusText||`Unknown error`}`),logger.debug(r);else{let{device_code:e,user_code:r,verification_uri:i,verification_uri_complete:a,interval:o=5,expires_in:s}=n;console.log(``),console.log(colors.cyan(`📱 Device Authorization Required`)),console.log(``),console.log(`Please visit: ${colors.underline(colors.blue(i))}`),console.log(`Enter code: ${colors.bold(colors.green(r))}`),console.log(``),await confirm({message:`Open browser automatically?`,default:!0})&&await open$1(a||i),console.log(colors.gray(`Waiting for authorization (expires in ${Math.floor(s/60)} minutes)...`));let c=await pollForToken(t,e,CLIENT_ID,o);if(c){await saveAuth(c);let{data:e}=await t.getSession({fetchOptions:{headers:{Authorization:`Bearer ${c.access_token}`}}});console.log(colors.green(`✅ Login successful! Logged in as ${e?.user?.name||e?.user?.email||`User`}`))}}}catch(t){e.stop(),logger.error(`Login failed: ${t instanceof Error?t.message:`Unknown error`}`)}};async function pollForToken(e,t,n,r){let i=r,a=createSpinner(``,{color:`cyan`}),o=0;return new Promise(r=>{let s=async()=>{o=(o+1)%4,a.update(colors.gray(`Polling for authorization${`.`.repeat(o)}${` `.repeat(3-o)}`)),a.isSpinning()||a.start();try{let{data:o,error:s}=await e.device.token({grant_type:`urn:ietf:params:oauth:grant-type:device_code`,device_code:t,client_id:n,fetchOptions:{headers:{"user-agent":`Azot Desktop`}}});if(o?.access_token){a.stop(),r(o);return}else if(s)switch(s.error){case`authorization_pending`:break;case`slow_down`:i+=5,a.update(colors.yellow(`Slowing down polling to ${i}s`));break;case`access_denied`:a.stop(),logger.error(`Access was denied by the user`);break;case`expired_token`:a.stop(),logger.error(`The device code has expired. Please try again.`);break;default:a.stop(),logger.error(`Error: ${s.error_description}`)}}catch(e){a.stop(),logger.error(`Network error: ${e instanceof Error?e.message:`Unknown error`}`);return}setTimeout(s,i*1e3)};setTimeout(s,i*1e3)})}const logout=async()=>{logger.info(`Logging out...`);let e=await getAuthClient().signOut();e.error?logger.error(`Logout failed: ${e.error.message}`):(logger.info(`Logout successful`),await saveAuth({}))},loginCommand={command:`login [extension]`,describe:`Login to extension (or if no extension is specified, login to Azot account)`,builder:e=>e.option(`username`,{alias:`u`,describe:`Username`,type:`string`}).option(`password`,{alias:`p`,describe:`Password`,type:`string`}).option(`otp`,{alias:`o`,describe:`One-time password`,type:`string`}),handler:async e=>{let t=e.extension,n={username:e.username,password:e.password,otp:e.otp};if(t){let e=new ExtensionManager({dirs:[EXTENSIONS_SOURCES_DIR],indexPath:EXTENSIONS_INDEX_PATH});await e.init(),await e.discover(),await e.login(t,n)}else login()}},listCommand={command:`list`,aliases:[`ls`],describe:`Lists information about installed/active extensions`,handler:async()=>{let e=await new ExtensionManager({indexPath:EXTENSIONS_INDEX_PATH}).init();if(!e.infoList.length)return console.log(`No added extensions found`);for(let t of e.infoList){let e=`${colors.bold(colors.blue(t.name.padEnd(15)))}`,n=colors.green(t.package?.version);console.log(e+n)}console.log(`
19
- `+colors.dim(`Location: ${EXTENSIONS_DIR}`))}},rtf=new Intl.RelativeTimeFormat(`en`,{style:`long`}),getTimeAgo=e=>{let t=Math.floor(e/24),n=Math.abs(t);return n>365?rtf.format(Math.floor(t/365),`year`):n>30?rtf.format(Math.floor(t/30),`month`):n>7?rtf.format(Math.floor(t/7),`week`):n>1?rtf.format(Math.floor(t),`day`):rtf.format(Math.floor(e),`hour`)},row=(e,t,n)=>{let r=`${colors.bold(colors.blue(e.padEnd(15)))}`,i=colors.green(t.padEnd(10)),a=colors.dim(n);console.log(r+i+a)},listRemoteCommand={command:`list-remote`,aliases:[`ls-remote`],describe:`List all available extensions`,handler:async()=>{loadAuth().then(e=>Object.assign(authState,e));let e=await ExtensionManager.getAvailableExtensions(),t=Date.now();for(let n of e){let e=n.releases.toSorted((e,t)=>new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime()).at(0);if(!e)continue;let r=e.createdAt,i=new Date(r).getTime()-t,a=getTimeAgo(Math.floor(i/36e5));row(n.name,e.version,a)}}},logoutCommand={command:`logout [extensions..]`,describe:`Logout from extension (or if no extension is specified, logout from Azot account)`,handler:async e=>{let t=e.extensions;if(t?.length){let e=new ExtensionManager({dirs:[EXTENSIONS_SOURCES_DIR],indexPath:EXTENSIONS_INDEX_PATH});await e.init(),await e.discover(),await e.logout(t)}else logout()}},settingsCommand={command:`settings [key] [value]`,describe:`CLI access to get/set configuration settings`,handler:async e=>{let t=new SettingsStore(SETTINGS_PATH),n=e.key,r=e.value;if(n&&r){t.set({[n]:r}),console.log(`Setting ${colors.bold(colors.blue(n))} set to ${colors.green(r)}`);return}else if(n){let e=t.get(n);console.log(e?`Setting ${colors.bold(colors.blue(n))} is ${colors.green(e)}`:`Setting ${colors.bold(colors.blue(n))} is not found`);return}let i=t.getAll();for(let[e,t]of Object.entries(i)){let n=`${e}`.padEnd(25),r=String(t).replaceAll(`{`,`{{`).replaceAll(`}`,`}}`);console.log(`${colors.bold(colors.blue(n))} ${r}`)}console.log(`
20
- `+colors.dim(`Location: ${SETTINGS_PATH}`))}},uninstallCommand={command:`uninstall <extensions..>`,aliases:[`rm`],describe:`Uninstall an extension`,handler:async e=>{let t=e.extensions,n=new ExtensionManager({dirs:[EXTENSIONS_SOURCES_DIR],indexPath:EXTENSIONS_INDEX_PATH});await n.init(),await n.uninstall(t)}},installCommand={command:`install <extensions..>`,aliases:[`i`],describe:`Install extension`,handler:async e=>{let t=e.extensions,n=new ExtensionManager({dirs:[EXTENSIONS_SOURCES_DIR],indexPath:EXTENSIONS_INDEX_PATH});await n.init(),await n.install(t)}},logsCommand={command:`logs`,describe:`Show logs list`,handler:async()=>{let e=APP_LOG_DIR,t=await readdir(e).then(e=>e.filter(e=>e.endsWith(`.log`))),n=t=>join(e,t);t.length||logger.info(`No logs found`);for(let e of t)logger.info(n(e))}};logger.debug(fullVersion);const cliArgs=getCliArgs(process.argv);logger.debug(`${APP_NAME} ${cliArgs.join(` `)}`),errors.on(`error`,e=>{let t=normalizeError(e);logger.error(t.message)});const description=`${colors.magenta(colors.bold(APP_TITLE))} is ${package_default.description.toLocaleLowerCase()}`,usage=colors.bold(`Usage: $0 <command> ${colors.cyan(`[...options]`)}`);yargs(cliArgs).scriptName(APP_NAME).usage(`${description}\n\n${usage}`).command(downloadCommand).command(listCommand).command(listRemoteCommand).command(installCommand).command(uninstallCommand).command(loginCommand).command(logoutCommand).command(settingsCommand).command(logsCommand).option(`debug`,{describe:`Debug mode`,type:`boolean`}).wrap(yargs().terminalWidth()).help().alias(`h`,`help`).showHelpOnFail(!1).version(shortVersion).updateStrings({"Commands:":colors.bold(`Commands:`),"Options:":colors.bold(`Options:`),default:colors.dim(`default`),aliases:colors.dim(`aliases`),boolean:colors.dim(`boolean`),string:colors.dim(`string`),number:colors.dim(`number`)}).epilogue(`Learn more about Azot: ${colors.magenta(`https://azot.mov`)}.`).parse(),clearOutdatedLogs(APP_LOG_DIR),process.on(`uncaughtException`,e=>{logger.fatal(`Unexpected error: ${e.message}`),e.stack&&logger.debug(e.stack),rmSync(APP_TEMP_DIR,{recursive:!0,force:!0}),process.exit(1)});export{};
2
+ const gz=b;(function(fS,fT){const gy=b,fU=fS();while(!![]){try{const fV=parseInt(gy(0x134))/0x1*(-parseInt(gy(0x15f))/0x2)+parseInt(gy(0x1cd))/0x3+parseInt(gy(0x209))/0x4+-parseInt(gy(0x14b))/0x5+-parseInt(gy(0x1b5))/0x6+-parseInt(gy(0x130))/0x7+parseInt(gy(0x1aa))/0x8;if(fV===fT)break;else fU['push'](fU['shift']());}catch(fW){fU['push'](fU['shift']());}}}(a,0x3e00d));import{A as c,C as d,D as f,E as g,M as h,O as i,S as j,T as k,_ as l,a as m,b as n,c as o,d as p,f as q,g as r,h as s,i as t,j as u,k as v,l as w,m as x,n as y,o as A,p as B,r as C,s as D,t as E,u as F,v as G,w as H,x as I,y as J}from'./context-CO_QfIEj.mjs';import{createRequire}from'node:module';import K,{constants,existsSync,readFileSync,readdirSync,rmSync,statSync,writeFileSync}from'node:fs';import*as L from'node:path';import M,{basename,dirname,extname,join,parse,resolve}from'node:path';import N from'yargs';import'urlpattern-polyfill';import O from'picocolors';import*as P from'node:fs/promises';import Q,{open,readFile,readdir,rm,stat,writeFile}from'node:fs/promises';import R,{platform,stdout}from'node:process';import{hideBin}from'yargs/helpers';import{EventEmitter as S}from'node:events';import{z}from'zod';function a(){const ks=['command','(unknown)','catch','deleteActiveJob','Episode\x20filename\x20template','tracks','No\x20metadata\x20found','padEnd','object','getPrototypeOf','add','url','\x20using\x20','removeListener','tag_name','getFirstKeyPacket','total','getOwnPropertyDescriptor','ask','Russian','created_at','minify','vorbis','CLI\x20access\x20to\x20get/set\x20configuration\x20settings','/video/private/:id{/}?','clone','proxyMeta','bytes=','package','\x20is\x20','\x20bytes\x20generated\x20for\x20session\x20','closing-session','info','MP4','https://www.ntv.ru','current','mid','resourcesPath','Options:','server','status','/yappy/:yappyId{/}?','closed','maxActiveDownloads','target','https://soundcloud.com/','DASH_FORMATS','bin','dataUpdatedAt','@streamyx/','onProgress','<meta\x20property=\x22ya:ovs:feed_url\x22\x20content=\x22','Job\x20completed:\x20','timecodeIssues','languageCode','uninstall\x20<extensions..>','reverse','MP3','coerce','headers','emit','\x20FORCED','video-bitrate','toUpperCase','update','attachParentConsole','\x22name\x22:\x22','red','text','job','pkg','extname','getExtension','getLicense','mangled','context','POST','console','debug','/events','edges','The\x20device\x20code\x20has\x20expired.\x20Please\x20try\x20again.','\x20kHz','VirtualRoom','read','unshift','every','cacheKey','enum','source','DASH','scope','seriesFilenameTemplate','create','exports','parts','Can\x27t\x20recognize\x20license\x20response','private','movieFilenameTemplate','AbortError','skip-subtitles','settings\x20[key]\x20[value]','toFixed','codec','function','option','default','lang','144','assign','push','green','RELEASE_NOT_FOUND','manifest','off','store','totalBytes','cookie','extensions','UrlSource','code','stat','toISOString','webvtt','jobs','finalize','Muxing\x20failed.\x20Output\x20file\x20not\x20found:\x20','toString','yappyId','https://www.tiktok.com/','getQueryData','error','onJobError','warn','lastIndex','all','isNaN','startsWith','dir','quality','createState','kor','kid','paused','match','2819096YfawDj','map','playready','prompt','213098qKkZqa','ntv.ts','subs-format','index','https://instagram.com/*','platform','/info','some','callbacks','start','tempFileDir','tiktok','length','src','mp4','exactPaths','Failed\x20to\x20read\x20JSON\x20file:\x20','EXTENSION_INSTALL_UNKNOWN','Response\x20','findIndex','description','https:','addEventListener','1130800RgciLr','alert','localStorage','.mkv','getCodec','Path\x20to\x20the\x20input\x20file','utils','confirm','next','min','toLowerCase','fetch','stream_url','log','/detail/:mid','trim','includes','Error:\x20','infoList','https://vkvideo.ru/','2egnYTu','invalidTimecodes','job-completed','floor','No\x20media\x20resource\x20found','https://sun9-50.userapi.com/impg/rY5N7sdA93TFdjkeYqPTnPIjvCJ0rALo_V7V8g/zLAaAv0PpvY.jpg?size=400x400&quality=95&sign=5ddcd6358131b204b8619cb8eeff943f&type=album','abort','key','emitStatusChanged','type','videoQuality','keyId','subtitle','slice','discover','drm','input','inherit','Could\x20not\x20find\x20VK\x20player\x20payload','-----BEGIN\x20PUBLIC\x20KEY-----','subtitleLanguages','replaceAll','sampleRate','sleep','outputPath','defineExtension','writeFile','<html>','downloading','relative','settings','https://github.com/vitalygashkov','gitlab','end','Skipping\x20non-queued\x20job\x20start:\x20','Direct','resolve','https://*.weibo.com/*','openid\x20profile\x20email','ALL_FORMATS','yellow','then','node','version','stop','initSegment','removeEventListener','Output\x20write\x20stream\x20error','stack','getTime','segmentCount','Download\x20was\x20not\x20initialized.\x20Use\x20Download.init(options).','error_description','\x20url=','downloadsStorage','proxy','document','array','GitHub\x20release\x20not\x20found','season','video','portableBuild','matchedContentLabel','statusText','Polling\x20for\x20authorization','output','https://soundcloud.com/*','webapp.video-detail','dequeue','variable','NTV','method','delete','ELECTRON_RUN_AS_NODE',').\x20Using\x20','5029200AzAAXP','mkdir','sha1','number','job-status-changed','cookieStore','hint','boolean','split','pathname','resume','1705650mLyJIs','mediumConnectionsCount','config','find','DRM\x20content\x20key\x20error','head','<script\x20id=\x22__UNIVERSAL_DATA_FOR_REHYDRATION__\x22\x20type=\x22application/json\x22>','setItem','page_title','auth','name','Input','reversedTimecodes','downloaded','from','Password','skipVideo','timestamp','process','Soundcloud\x20may\x20be\x20blocked\x20in\x20your\x20region.\x20Use\x20proxy\x20or\x20VPN\x20to\x20bypass\x20restrictions.','json','join','language','Subtitles\x20language(s)','1303074DCGeED','defineProperty','audioLanguage','job-error','octet-stream','kind','package.json','underline','track_authorization','execUrlPatterns','string','videoCodecs','HLS','keys','has','tag','X-Signature-Timestamp','\x20failed:\x20','blue','trimBegin','esm','getTracks','Invalid\x20settings\x20update:','content-range','message','connections','allTracks','system','Request\x20failed:\x20','details','title','replace','maxChunkSize','Bundle\x20a\x20Node.js\x20entry\x20file\x20for\x20distribution','Signature\x20headers\x20not\x20found','onJobProgress','start.film','episodeTitle','invalidateQueries','logout','isArray','dev','notify','filePath','resolvedFilenameWithoutExtension','loadScript','ntv','hex','path','createSession','0.0.13','Azot','filter','close','entry','offset','kill','\x20for\x20license=','get','hasResolvedSource','1268872zXKVBT','indexPath','utf8','Extension\x20','progress','pssh','inputTrack','Vitaly\x20Gashkov','resumeManager','CUSTOM_MUX_FORMAT_NOT_ALLOWED','bind','No\x20tracks\x20provided\x20for\x20muxing.','set','Only\x20WebVTT\x20subtitles\x20are\x20supported\x20by\x20the\x20MediaBunny\x20muxer.','service.js','setup','m3u8','magenta','isDirectory','speed','loadExtension','Obfuscation\x20finished','bold'];a=function(){return ks;};return a();}import{DASH_FORMATS,HLS_FORMATS,Input,UrlSource}from'dasha';import T from'ky';import{Agent,ProxyAgent}from'undici';import{checkbox,confirm}from'@inquirer/prompts';import{execFileSync}from'node:child_process';import{createAuthClient}from'better-auth/client';import{deviceAuthorizationClient}from'better-auth/client/plugins';function b(c,d){c=c-0xc4;const e=a();let f=e[c];return f;}import{tributeClient}from'@tribute-tg/better-auth';import{QueryCache,QueryClient}from'@tanstack/query-core';import{createHash}from'node:crypto';import{inspect}from'node:util';import{ALL_FORMATS as U,EncodedAudioPacketSource,EncodedPacketSink,EncodedVideoPacketSource,Input as V,MkvOutputFormat,Mp4OutputFormat,Output,StreamSource,StreamTarget,TextSubtitleSource,UrlSource as W}from'mediabunny';import{finished,pipeline}from'node:stream/promises';import{Readable}from'node:stream';import{isatty}from'node:tty';import{createSpinner}from'nanospinner';import{RemoteCdm,requestMediaKeySystemAccess}from'okova';import{Decryption,FilePathSource,FilePathTarget,Input as X,Output as Y}from'shifro';import{convert}from'@transcrobes/subs-convert';import Z from'open';var a0=Object['create'],a1=Object['defineProperty'],a2=Object[gz(0x231)],a3=Object['getOwnPropertyNames'],a4=Object[gz(0x229)],a5=Object['prototype']['hasOwnProperty'],a6=(fS,fT)=>()=>(fT||(fS((fT={'exports':{}})['exports'],fT),fS=null),fT['exports']),a7=(fS,fT,fU,fV)=>{if(fT&&typeof fT=='object'||typeof fT=='function'){for(var fW=a3(fT),fX=0x0,fY=fW['length'],fZ;fX<fY;fX++)fZ=fW[fX],!a5['call'](fS,fZ)&&fZ!==fU&&a1(fS,fZ,{'get':(g0=>fT[g0])['bind'](null,fZ),'enumerable':!(fV=a2(fT,fZ))||fV['enumerable']});}return fS;},a8=(fS,fT,fU)=>(fU=fS==null?{}:a0(a4(fS)),a7(fT||!fS||!fS['__esModule']?a1(fU,'default',{'value':fS,'enumerable':!0x0}):fU,fS)),a9=createRequire(import.meta.url);const aa=()=>{const gA=gz;let fS=[];process['resourcesPath']&&fS['push'](join(process[gA(0xc4)],gA(0xce),'winconsole.node'));let fT=join(__dirname,'..','..','..');return fS[gA(0x10d)](join(fT,'assets','bin','win32','winconsole.node')),fS[gA(0x10d)](join(fT,'native','winconsole','build','Release','winconsole.node')),fS['find'](fU=>existsSync(fU))||null;},ab=()=>{if(process['platform']!=='win32')return null;let fS=aa();if(!fS)return null;try{return a9(fS);}catch{return null;}};if(process['platform']==='win32'){let g1=ab();g1&&(g1[gz(0xe0)]?.(),g1['enableUtf8']?.());}const ac=(fS=process['argv'],fT=process.env)=>fT[gz(0x1a8)]==='1'?fS['slice'](0x2):hideBin(fS),ad={'target':'node','compact':!0x0,'identifierNamesGenerator':gz(0xe9),'renameGlobals':!0x0,'simplify':!0x0,'controlFlowFlattening':!0x1,'deadCodeInjection':!0x1,'debugProtection':!0x1,'numbersToExpressions':!0x1,'selfDefending':!0x1,'splitStrings':!0x1,'stringArray':!0x0,'stringArrayCallsTransform':!0x1,'stringArrayEncoding':[],'stringArrayIndexShift':!0x0,'stringArrayRotate':!0x0,'stringArrayShuffle':!0x0,'stringArrayWrappersCount':0x1,'stringArrayWrappersChainedCalls':!0x0,'stringArrayWrappersType':gz(0x1a4),'stringArrayThreshold':0.1,'transformObjectKeys':!0x1,'unicodeEscapeSequence':!0x1},ae=fS=>{let fT=['B','KB','MB','GB'],fU=fS,fV=0x0;for(;fU>=0x400&&fV<fT['length']-0x1;)fU/=0x400,fV+=0x1;return fU['toFixed'](fV===0x0?0x0:0x2)+'\x20'+fT[fV];},af=async(fS,fT)=>{const gB=gz;let fU=readFileSync(fS,'utf8'),{default:fV}=await import('javascript-obfuscator');console['log']('Obfuscating\x20'+fS+'...'),console['time'](gB(0x21e));let fW=fV['obfuscate'](fU,ad);console['timeEnd']('Obfuscation\x20finished');let fX=fW['getObfuscatedCode'](),fY=Buffer['byteLength'](fU,'utf8'),fZ=Buffer['byteLength'](fX,'utf8'),g0=fY===0x0?0x0:fZ/fY;return console['log']('Size\x20changed\x20from\x20'+ae(fY)+'\x20to\x20'+ae(fZ)+',\x20'+g0['toFixed'](0x2)+'x\x20increase'),writeFileSync(fT||fS,fX),fX;},ag=new Set(['.ts','.js','.cjs','.mjs']),ah=new Set(['index','main']),ai=fS=>{const gC=gz;if(existsSync(fS))try{if(!statSync(fS)['isDirectory']())return;let fT=readdirSync(fS)['filter'](fW=>!fW['endsWith']('.d.ts'))['filter'](fW=>ag['has'](M[gC(0xe6)](fW))),fU=fW=>M['basename'](fW,M['extname'](fW)),fV=fT['find'](fW=>ah['has'](fU(fW)))||fT[0x0];return fV?M['join'](fS,fV):void 0x0;}catch{return;}},aj=()=>{const gD=gz;let fS=[process['cwd'](),M['join'](process['cwd'](),gD(0x141)),M['join'](process['cwd'](),'lib')];for(let fT of fS){let fU=ai(fT);if(fU)return fU;}},ak=fS=>fS===gz(0x1e1)?'mjs':'cjs',al=(fS,fT)=>M['join'](process['cwd'](),'dist',M['parse'](fS)['name']+'.'+ak(fT)),am=fS=>{const gE=gz;let fT=M[gE(0x17c)](process['cwd'](),fS);if(!fT||fT['startsWith']('..'))throw Error('Entry\x20file\x20must\x20be\x20inside\x20the\x20current\x20working\x20directory:\x20'+fS);return'./'+fT['split'](M['sep'])['join']('/');},an=fS=>{let fT=fS['input']||fS['entry']||aj();if(!fT)throw Error('No\x20entry\x20file\x20found');return M['resolve'](fT);},ao=()=>{throw Error('The\x20`build`\x20and\x20`dev`\x20commands\x20are\x20unavailable\x20in\x20the\x20desktop-distributed\x20CLI.\x20Use\x20the\x20npm-installed\x20`azot`\x20package\x20in\x20a\x20Node.js\x20environment\x20instead.');},ap=fS=>fS['positional'](gz(0x203),{'describe':gz(0x150),'type':gz(0x1d7)})['option']('input',{'alias':'i','describe':'Path\x20to\x20the\x20input\x20file','type':'string'})[gz(0x108)]('format',{'alias':'f','describe':'Output\x20format','choices':['cjs','esm'],'default':'cjs'})['option']('minify',{'describe':'Minify\x20output','type':'boolean'}),aq=fS=>{let fT=M['resolve'](fS);for(;;){let fU=M['join'](fT,'package.json');if(existsSync(fU))return fU;let fV=M['dirname'](fT);if(fV===fT)return;fT=fV;}},ar=fS=>{const gF=gz;let fT=aq(fS);if(!fT){let fU='Could\x20not\x20find\x20package.json\x20starting\x20from\x20'+fS;throw B['error'](fU),Error(fU);}try{let fV=JSON['parse'](readFileSync(fT,'utf8'));if(!fV||typeof fV!='object'||Array['isArray'](fV))throw Error('package.json\x20must\x20contain\x20a\x20JSON\x20object');let fW=fV;if(fW['private']!==void 0x0&&typeof fW[gF(0x100)]!='boolean')throw Error('package.json\x20field\x20\x22private\x22\x20must\x20be\x20a\x20boolean\x20when\x20present');return{'private':fW['private']};}catch(fX){let fY='Failed\x20to\x20load\x20package.json\x20for\x20build\x20command\x20from\x20'+fT;throw B['error'](fY),B['debug'](fX),Error(fY);}},as={'command':'build\x20[entry]','describe':gz(0x1ee),'builder':fS=>ap(fS)[gz(0x108)]('watch',{'describe':'Watch\x20file\x20changes','type':'boolean'})['option']('obfuscate',{'describe':'Obfuscate\x20output','type':'boolean'}),'handler':async fS=>{const gG=gz;ao();let fT=an(fS),fU=typeof fS['minify']=='boolean'?fS[gG(0x235)]:!0x0,fV=fS['watch']===!0x0,fW=fS['format']??'cjs',{build:fX}=await import('tsdown');await fX({'entry':am(fT),'format':fW,'platform':'node','target':'node24','watch':fV,'minify':fU,'inlineOnly':!0x1});let fY=al(fT,fW),fZ=ar(process['cwd']());(typeof fS['obfuscate']=='boolean'?fS['obfuscate']:fZ['private'])&&await af(fY,fY);}},at={'command':'dev\x20[entry]','describe':'Watch\x20and\x20rebuild\x20a\x20Node.js\x20entry\x20file\x20during\x20development','builder':fS=>ap(fS),'handler':async fS=>{const gH=gz;ao();let fT=an(fS),fU=typeof fS['minify']=='boolean'?fS['minify']:!0x1,{build:fV}=await import('tsdown');await fV({'entry':am(fT),'format':fS['format']??'cjs','platform':gH(0x189),'target':'node24','watch':!0x0,'minify':fU});}},au=()=>Intl['DateTimeFormat']()['resolvedOptions']()['locale']['startsWith']('ru')?'ru':'en',av={'dark':'dark','light':'light','system':'system'},aw={'mp4':gz(0x142),'mkv':'mkv'},ax=z['object']({'downloadDir':z['string']()['default'](G),'binariesDir':z['string']()['default'](H(join(x,'bin'))),'drmDir':z['string']()['default'](H(join(x,gz(0x16e)))),'language':z['string']()['default'](au()),'theme':z['enum']([av['dark'],av['light'],av[gz(0x1e8)]])['default'](av['system']),'preferHardsub':z[gz(0xd9)]['boolean']()[gz(0x109)](!0x1),'retry':z['coerce']['number']()['int']()['min'](0x1)['max'](0xa)['default'](0x3),'connections':z['coerce']['number']()['int']()['min'](0x1)['max'](0x40)['default'](0x4),'maxActiveDownloads':z['coerce']['number']()['int']()['min'](0x1)['default'](0x1),'proxy':z['string']()['optional'](),'proxyMeta':z['string']()['optional'](),'proxyMedia':z['string']()['optional'](),'movieFilenameTemplate':z['string']()['default']('{title}\x20({quality},\x20{codec})'),'seriesFilenameTemplate':z['string']()['default']('{title}\x20S{s}E{e}\x20({quality},\x20{codec})'),'developerMode':z['coerce']['boolean']()['default'](!0x1),'allowUnknownSources':z['coerce']['boolean']()['default'](!0x1),'videoContainerFormat':z[gz(0xf7)]([aw['mp4'],aw['mkv']])['default'](aw['mp4']),'useAlternativeServer':z['coerce']['boolean']()['default'](!0x1),'automaticUpdates':z['coerce']['boolean']()['default'](!0x0)}),ay=ax['parse']({});var az=class{#e;constructor(fS){this.#e=w({'defaults':ay,'cwd':dirname(fS),'configName':basename(fS,'.json')}),this.#t();}#t(){const gI=gz;let fS=this.#e['store'],fT=ax['safeParse'](fS),fU='{title}.{audioType}.{quality}.{tag}.{format}.{codec}',fV='{title}.S{s}E{e}.{episodeTitle}.{audioType}.{quality}.{tag}.{format}.{codec}';if(fS['movieFilenameTemplate']==='{title}.{audioType}.{quality}.{tag}.{format}.{codec}'&&this.#e['set'](gI(0x101),fS['seriesFilenameTemplate']),fS['seriesFilenameTemplate']==='{title}.S{s}E{e}.{episodeTitle}.{audioType}.{quality}.{tag}.{format}.{codec}'&&this.#e['set'](gI(0xfb),fS['seriesFilenameTemplate']),!fT['success']){console['warn']('Settings\x20validation\x20failed!\x20Resetting\x20to\x20defaults.',fT['error']['flatten']()),this.#e['set'](ay);return;}Object['hasOwn'](fS,'askForOptions')&&this.#e['set'](fT['data']);}['getAll'](){return this.#e['store'];}['get'](fS){return this.#e['get'](fS);}['set'](fS){const gJ=gz;let fT={...this.#e['store'],...fS},fU=ax['safeParse'](fT);if(!fU['success'])throw console['error'](gJ(0x1e3),fU['error']['flatten']()),Error('Settings\x20update\x20failed\x20validation.');this.#e['set'](fU['data']);}['onDidChange'](fS){this.#e['onDidAnyChange'](fS);}};const aA=async fS=>{const gK=gz;try{return await Q['access'](fS),!0x0;}catch(fT){if(fT[gK(0x117)]==='ENOENT')return!0x1;throw fT;}},aB=async(fS,{recursive:fT=!0x1}={})=>await Q['readdir'](fS,{'withFileTypes':!0x0,'recursive':fT}),aC=async(fS,{recursive:fT=!0x0,force:fU=!0x0}={})=>{await Q['rm'](fS,{'recursive':fT,'force':fU});},aD=async(fS,{recursive:fT=!0x0}={})=>{await Q['mkdir'](fS,{'recursive':fT});},aE=async fS=>{try{await Q['access'](fS,constants['W_OK']);}catch(fT){let fU=fT['code'];throw fU==='EPERM'||fU==='EACCES'||fU==='ENOENT'?Object['assign'](Error('Download\x20directory\x20is\x20not\x20writable'),{'code':'DOWNLOAD_DIR_NOT_WRITABLE'}):fT;}},aF=async fS=>{const gL=gz;try{let fT=await Q['readFile'](fS,{'encoding':'utf8'});return JSON['parse'](fT);}catch(fU){throw Error(gL(0x144)+fS,{'cause':fU});}},aG=async(fS,fT)=>{const gM=gz;let fU=parse(fS)['dir'];try{let fV=await aA(fU);fU&&!fV&&await Q['mkdir'](fU),await Q[gM(0x179)](fS,JSON['stringify'](fT,null,0x2),gM(0x20b));}catch(fW){throw Error('Failed\x20to\x20save\x20data\x20to\x20file:\x20'+fS,{'cause':fW});}},aH={'extract':(fS,fT)=>execFileSync('tar',['-xf',fS,...fT?['-C',fT]:[]],{'stdio':gz(0x170)})},aI={'CHANNEL_NOT_FOUND':'EXTENSION_INSTALL_CHANNEL_NOT_FOUND','VERSION_NOT_FOUND':'EXTENSION_INSTALL_VERSION_NOT_FOUND','RELEASE_NOT_FOUND':'EXTENSION_INSTALL_RELEASE_NOT_FOUND','ASSET_NOT_FOUND':'EXTENSION_INSTALL_ASSET_NOT_FOUND','UNSUPPORTED_SOURCE':'EXTENSION_INSTALL_UNSUPPORTED_SOURCE','UNSUPPORTED_PACKAGE_TYPE':'EXTENSION_INSTALL_UNSUPPORTED_PACKAGE_TYPE','IMPORT_INVALID':'EXTENSION_INSTALL_IMPORT_INVALID','SOURCE_NOT_FOUND':'EXTENSION_INSTALL_SOURCE_NOT_FOUND','UNKNOWN':gz(0x145)},aJ=new Set(Object['values'](aI));var aK=class extends Error{[gz(0x117)];[gz(0x1ea)];['hint'];constructor(fS){super(fS['message']),this['name']='InstallExtensionError',this['code']=fS['code'],this['details']=fS['details'],this['hint']=fS['hint'];}['toPayload'](){const gN=gz;return{'code':this['code'],'message':this['message'],'details':this['details'],'hint':this[gN(0x1b0)]};}};const aL=(fS,fT,fU,fV)=>new aK({'code':fS,'message':fT,'details':fU,'hint':fV}),aM=fS=>{let fT=(fS?.['startsWith']('v')?fS[0x1]:fS?.[0x0])??'';return Number['isNaN'](parseInt(fT))?fS?.['split']('.')['at'](0x0)||'latest':fS?.['split']('-')['at'](0x1)?.['split']('.')['at'](0x0)||'latest';},aN=fS=>(fS['version']||fS[gz(0x22e)]||'')['replace'](/^v/,''),aO=fS=>[...new Set(fS['filter'](Boolean))],aP=fS=>({'availableVersions':aO((fS||[])[gz(0x131)](fT=>aN(fT))),'availableChannels':aO((fS||[])[gz(0x131)](fT=>aM(aN(fT))))}),aQ=(fS,fT,fU)=>{let fV={'source':fU,'preferredVersion':fS['preferredVersion'],'preferredChannel':fS['preferredChannel'],'appChannel':fS['appChannel'],...aP(fT)};return fS['preferredVersion']?aL(aI['VERSION_NOT_FOUND'],'Release\x20not\x20found\x20for\x20requested\x20version:\x20'+fS['preferredVersion'],fV):aL(aI['CHANNEL_NOT_FOUND'],'Release\x20not\x20found\x20for\x20requested\x20channel:\x20'+fS['preferredChannel'],fV);},aR=(fS,fT,fU)=>{const gO=gz;if(!fS?.['length'])return null;if(fT['preferredVersion'])return fS[gO(0x1b8)](fV=>aN(fV)===fT['preferredVersion'])||null;if(!fT['isExplicitSelection']){let fV=fS['find'](fW=>aM(aN(fW))==='latest');if(fV)return fV;}return fS['find'](fW=>aM(aN(fW))===fT['preferredChannel'])||(fT['allowFallback']&&fT['preferredChannel']!=='latest'?(B['debug']('Release\x20'+fT['preferredChannel']+'\x20not\x20found\x20for\x20'+fU+',\x20falling\x20back\x20to\x20latest\x20stable'),fS['find'](fW=>aM(aN(fW))==='latest')||(B['debug']('Latest\x20stable\x20release\x20not\x20found\x20for\x20'+fU+',\x20falling\x20back\x20to\x20latest\x20with\x20any\x20channel'),fS['at'](0x0)||null)):null);},aS=fS=>{const gP=gz;let [,fT='']=fS['split']('@'),fU=fS['replace'](fT?'@'+fT:'',''),fV=aM(h[gP(0x18a)]),fW=!!fT;return{'name':fU,'preferredVersion':Number[gP(0x127)](parseInt(fT[0x0]??''))?'':fT,'preferredChannel':fW?aM(fT):fV,'appChannel':fV,'isExplicitSelection':fW,'allowFallback':!fW&&fV!=='latest'};},aT=async(fS,fT)=>{const gQ=gz;B['info']('Fetching\x20bundle...'),B['debug'](fS);let fU=await fetch(fS);if(!fU['ok'])throw aL(aI['ASSET_NOT_FOUND'],'Failed\x20to\x20download\x20extension\x20bundle:\x20'+fU['status']+'\x20'+fU['statusText'],{'url':fS,'status':fU['status'],'statusText':fU[gQ(0x19e)]});let fV=fU['headers']['get']('content-disposition')?.['split']('filename=')[0x1]?.['split'](';')[0x0]?.[gQ(0x174)]('\x22',''),fW=M['basename'](fS),fX=fT||fV||fW,fY=await fU['arrayBuffer'](),fZ=M['join'](j,fX);return await Q['writeFile'](fZ,Buffer[gQ(0x1c3)](fY)),await Q['stat'](fZ)['then'](g0=>{B['debug']('Bundle\x20downloaded\x20('+g0['size']/0x3e8+'\x20KB):\x20'+fZ);})['catch'](()=>{B['error']('Bundle\x20download\x20failed:\x20can\x27t\x20find\x20output\x20file');}),fZ;},aU=async(fS,fT)=>{const gR=gz;if(fS['startsWith']('npm:')||fS[gR(0x128)](gR(0xd0)))throw aL(aI['UNSUPPORTED_SOURCE'],'NPM\x20extension\x20sources\x20are\x20no\x20longer\x20supported',{'source':fS});let fU=fS,fV=fS,fW=M['dirname'](fS),fX=fW!=='.'&&await Q['stat'](fW)['then'](()=>!0x0,()=>!0x1),fY=fS['startsWith']('./')||fS['startsWith']('../')||fS['startsWith']('/')||fS['startsWith']('~')||fX,fZ=await Q[gR(0x118)](fS)['then'](()=>!0x0,()=>!0x1),g0=fS['startsWith']('https://'),g2=fS['startsWith']('gl:')||fS['startsWith']('gitlab:'),g3=fS['startsWith']('github:')||fS['startsWith']('gh:');if(fY&&!fZ&&!g0&&!g3&&!g2)throw B['warn']('Installed\x20extension\x20not\x20found:\x20'+fS),B[gR(0x124)]('Run\x20\x27azot\x20list\x27\x20and\x20remove\x20the\x20extension\x20from\x20the\x20list.'),aL(aI['SOURCE_NOT_FOUND'],'Installed\x20extension\x20source\x20not\x20found:\x20'+fS,{'source':fS});fS=fS['replace'](/^gl:/,'')['replace'](/^gitlab:/,'')['replace'](/^gh:/,'')['replace'](/^github:/,'');let g4=aS(fS),{name:g5}=g4;if(g0)fU=await aT(fS);else{if(g3){let [gb,gc]=g5['split']('/'),gd='https://api.github.com/repos/'+gb+'/'+gc+'/releases',ge=await fetch(gd)['then'](gj=>gj['json']());if(ge?.['message']&&!Array['isArray'](ge))throw aL(aI[gR(0x10f)],'GitHub\x20releases\x20request\x20failed:\x20'+ge['message'],{'source':g5,'provider':'github','apiMessage':ge['message']});let gf=Array['isArray'](ge)?ge:[],gg=aR(gf,g4,g5);if(!gg)throw g4['isExplicitSelection']?aQ(g4,gf,g5):aL(aI['RELEASE_NOT_FOUND'],gR(0x199),{'source':g5,'provider':'github',...aP(gf)});let gh=gg['assets']?.['find'](gj=>gj['name']['endsWith']('.tgz')||gj['name']['endsWith']('.zip'));if(!gh)throw B['debug'](gg),aL(aI['ASSET_NOT_FOUND'],'GitHub\x20release\x20asset\x20not\x20found',{'source':g5,'provider':'github','releaseTag':aN(gg)});let gi=gh['browser_download_url'];fU=await aT(gi);}else{if(!fZ){let gj=fT?.[gR(0x1b8)](gn=>gn['name']===g5),gk=gj?.['releases']||[],gl=aR(gk,g4,g5),gm=gl?.['assets']['find'](gn=>gn['name']['endsWith']('.tgz'));if(gj&&!gl&&g4['isExplicitSelection'])throw aQ(g4,gk,g5);if(gm)fU=await aT(gm['url'],gm['name']);else{let [gn,go='streamyx-extensions']=g5['split']('/')['reverse'](),gp='https://gitlab.com/api/v4/projects/'+go+'%2F'+gn+'/releases',gq=await fetch(gp)['then'](gu=>gu['json']());if(gq?.['message']&&!Array['isArray'](gq))throw aL(aI['RELEASE_NOT_FOUND'],'GitLab\x20releases\x20request\x20failed:\x20'+gq['message'],{'source':g5,'provider':'gitlab','apiMessage':gq['message']});let gr=Array['isArray'](gq)?gq:[],gs=aR(gr,g4,g5);if(!gs)throw g4['isExplicitSelection']?aQ(g4,gr,g5):aL(aI['RELEASE_NOT_FOUND'],'GitLab\x20release\x20not\x20found',{'source':g5,'provider':'gitlab',...aP(gr)});let gt=gs['assets']?.['links']?.[gR(0x1b8)](gu=>gu['name']['endsWith']('.tgz'));if(!gt)throw aL(aI['ASSET_NOT_FOUND'],'GitLab\x20release\x20asset\x20not\x20found',{'source':g5,'provider':gR(0x17f),'releaseTag':aN(gs)});fU=await aT(gt['direct_asset_url']||gt[gR(0x22b)],gt[gR(0x1bf)]);}}}}let g6=M['extname'](fU),g7=g6==='.zip',g8=g6==='.tgz',g9=new Set(['.js','.mjs','.cjs'])['has'](g6),ga=await Q[gR(0x118)](fU)['then'](gu=>gu['isDirectory']())['catch'](()=>!0x1);if(g9?fV=M['dirname'](fU):ga?fV=fU:(fV=fU['replace']('.tgz','')['replace']('.zip',''),await aA(fV)||await aD(fV)),g7||g8)aH['extract'](fU,fV),await aC(fU);else{if(!(g9||ga))throw aL(aI['UNSUPPORTED_PACKAGE_TYPE'],'Unsupported\x20package\x20type',{'source':fS,'extensionSource':fU,'packageType':g6||'unknown'});}return fV;},aV='__matchRules',aW=fS=>typeof fS=='object'&&!!fS&&!Array['isArray'](fS),aX=fS=>{let fT=fS['trim']()['match'](/^(\*|https?):\/\/([^/]+)(\/.*)$/i);if(!fT)return null;let [,fU,fV,fW]=fT,fX=fU['toLowerCase'](),fY=fX==='*'?['http','https']:fX==='http'||fX==='https'?[fX]:null;if(!fY)return null;let fZ=fV['trim']()['toLowerCase'](),g0=!0x1,g2=[],g3=[];if(fZ==='*')g0=!0x0;else{if(fZ['startsWith']('*.')){let g6=fZ['slice'](0x1);if(!g6['startsWith']('.')||g6['length']<=0x1)return null;g3=[g6];}else{if(!fZ['includes']('*'))g2=[fZ];else return null;}}if(!fW['startsWith']('/'))return null;let g4=fW['indexOf']('*');if(g4!==-0x1&&g4!==fW['length']-0x1)return null;let g5=g4===-0x1?fW:fW['slice'](0x0,-0x1);return{'schemes':fY,'matchAnyHost':g0,'exactHosts':g2,'wildcardHostSuffixes':g3,'exactPaths':g4===-0x1?[g5]:void 0x0,'pathPrefixes':g4===-0x1?void 0x0:[g5]};},aY=fS=>{if(!Array['isArray'](fS))return;let fT=fS['filter'](fU=>typeof fU=='string'&&!!fU['trim']())['map'](aX)['filter'](fU=>!!fU);return fT['length']?fT:void 0x0;},aZ=(fS,fT)=>fT['matchAnyHost']||fT['exactHosts']['includes'](fS)||fT['wildcardHostSuffixes']['some'](fU=>fS['endsWith'](fU)),b0=(fS,fT)=>fT[gz(0x143)]?.['includes'](fS)||!!fT['pathPrefixes']?.['some'](fU=>fS[gz(0x128)](fU))||!fT[gz(0x143)]?.['length']&&!fT['pathPrefixes']?.['length'],b1=({manifest:fS,packageJson:fT,fallbackName:fU})=>{let fV=aW(fT?.['config'])?fT['config']:null,fW=(aW(fS)?fS:null)??fV??{},fX=typeof fW['name']=='string'&&fW['name']||typeof fW['title']=='string'&&fW['title']||fU,fY={...fW,'name':fX,'title':typeof fW['title']=='string'&&fW['title']?fW['title']:fX};(typeof fY['icon']!='string'||!fY['icon'])&&delete fY['icon'],(typeof fY['tag']!='string'||!fY['tag'])&&delete fY['tag'],Array['isArray'](fY['permissions'])||delete fY['permissions'],Array['isArray'](fY['regions'])||delete fY['regions'],typeof fY['manifestVersion']!='number'&&delete fY['manifestVersion'];let fZ=aY(fW['matches']);return fZ?(fY['matches']=Array['isArray'](fW['matches'])?fW['matches']['filter'](g0=>typeof g0=='string'):void 0x0,Object['defineProperty'](fY,aV,{'value':fZ,'enumerable':!0x1,'configurable':!0x1,'writable':!0x1})):delete fY['matches'],fY;},b2=async({dir:fS,packageJson:fT,fallbackName:fU})=>{let fV=join(fS,'manifest.json');return b1({'manifest':await aA(fV)?await aF(fV):null,'packageJson':fT,'fallbackName':fU});},b3=fS=>fS['manifest']?.['name']||fS['manifest']?.['title']||fS['package']?.['config']?.['title']||fS['package']?.['name']||fS['name']||'(unknown\x20extension)',b4=fS=>fS[gz(0x110)]?.['tag']||fS['package']?.['config']?.['tag']||void 0x0,b5=(fS,fT)=>{const gS=gz;let fU=fS['manifest']?.[aV];if(!Array['isArray'](fU)||!fU[gS(0x140)])return!0x1;let fV=fT['protocol']['slice'](0x0,-0x1)['toLowerCase'](),fW=fT['hostname']['toLowerCase'](),fX=fT['pathname'];return fU[gS(0x13b)](fY=>!(fY['schemes']?.['length']&&!fY['schemes']['includes'](fV)||!aZ(fW,fY)||!b0(fX,fY)));},b6=fS=>{let fT=fS['manifest']?.[aV];return Array['isArray'](fT)&&fT['length']>0x0;},b7=fS=>fS&&'exports'in fS?fS['exports']:fS,b8=fS=>fS?.['package']?.['name']||'(unknown\x20extension)',b9=fS=>{let fT=b7(fS);return!fT||typeof fT!='object'?null:typeof fT['resolveEntries']=='function'?'v2':typeof fT['getMediaInfo']=='function'?'legacy-media':typeof fT['fetchContentMetadata']=='function'?'legacy-content':null;},ba=fS=>b9(fS)!==null,bb=fS=>{const gT=gz;let fT=b7(fS);if(!fT||typeof fT!=gT(0x228))throw Error('Invalid\x20extension\x20exports');return fT;},bc=async fS=>{const gU=gz;let fT=bb(fS),fU=b8(fS);try{if(typeof fT['setup']=='function'){await fT['setup']();return;}typeof fT['init']=='function'&&await fT['init']();}catch(fV){let fW=typeof fT['setup']==gU(0x107)?gU(0x218):'init',fX=fV instanceof Error?fV:Error(String(fV));throw B['error']('Extension\x20'+fU+'\x20'+fW+'\x20failed:\x20'+fX['message']),fX['stack']&&B['debug'](fX['stack']),fX;}},bd=async(fS,fT)=>{const gV=gz;let fU=bb(fS),fV=b8(fS);try{if(typeof fU[gV(0x1be)]?.['login']=='function'){await fU['auth']['login'](fT);return;}typeof fU['login']=='function'&&await fU['login'](fT);}catch(fW){let fX=typeof fU[gV(0x1be)]?.['login']=='function'?'auth.login':'login',fY=fW instanceof Error?fW:Error(String(fW));throw B['error']('Extension\x20'+fV+'\x20'+fX+'\x20failed:\x20'+fY['message']),fY['stack']&&B['debug'](fY['stack']),fY;}},be=async fS=>{const gW=gz;let fT=bb(fS),fU=b8(fS);try{if(typeof fT['auth']?.['logout']=='function'){await fT['auth']['logout']();return;}typeof fT[gW(0x1f4)]=='function'&&await fT['logout']();}catch(fV){let fW=typeof fT['auth']?.['logout']==gW(0x107)?'auth.logout':'logout',fX=fV instanceof Error?fV:Error(String(fV));throw B['error'](gW(0x20c)+fU+'\x20'+fW+gW(0x1de)+fX['message']),fX['stack']&&B['debug'](fX['stack']),fX;}},bf=async fS=>{let fT=bb(fS);typeof fT['hooks']?.['beforeDownload']=='function'&&await fT['hooks']['beforeDownload']();},bg=async(fS,{skipMux:fT=!0x1}={})=>{const gX=gz;let fU=bb(fS),fV=b8(fS);if(!fT&&typeof fU['hooks']?.['afterMux']=='function')try{await fU['hooks']['afterMux']();}catch(fW){let fX=fW instanceof Error?fW:Error(String(fW));B['error']('Extension\x20'+fV+'\x20hooks.afterMux\x20failed:\x20'+fX['message']),fX['stack']&&B['debug'](fX['stack']);}if(typeof fU['onDownloadFinished']=='function')try{await fU['onDownloadFinished']();}catch(fY){let fZ=fY instanceof Error?fY:Error(String(fY));B['error']('Extension\x20'+fV+'\x20onDownloadFinished\x20failed:\x20'+fZ[gX(0x1e5)]),fZ['stack']&&B['debug'](fZ['stack']);}},bh=async(fS,{context:fT,dirname:fU,skipValidation:fV})=>{const gY=gz;let fW=await y(fS,{'dirname':fU,'context':fT})['finally'](()=>{});if(!fW)return null;let fX='default'in fW['exports']?fW[gY(0xfd)]['default']:fW['exports'];if(!fV&&!ba(fX))throw B['error']('Incompatible\x20extension\x20interface'),aL(aI['IMPORT_INVALID'],'Incompatible\x20extension\x20interface',{'extensionPath':fS});return fW['exports']=fX,fW;},bi=fS=>fS['split']('/')[gz(0xd7)]()[0x0]['replaceAll']('@','')['replace']('extension-','')['replace']('-extension',''),bj=async fS=>{const gZ=gz;let fT=[join(fS,'package.json'),join(fS,'package',gZ(0x1d3))],fU;for(let g3 of fT)if(await aA(g3)){fU=g3;break;}let fV={},fW='',fX='',fY='',fZ=fS;if(fU){fZ=dirname(fU),fV=await aF(fU)||{};let g4=fV['main']||'index.js';fW=join(fZ,g4),fX=fV[gZ(0x1bf)],fY=fZ;}else{let g5=await aB(fS),g6=g5['find'](g7=>g7['name']==='index.js')||g5['find'](g7=>g7['name']==='main.js')||g5['find'](g7=>g7['name']===gZ(0x217))||g5['find'](g7=>g7['name']==='extension.js')||g5['find'](g7=>g7['name']['endsWith']('.js'));g6&&(fW=join(fS,g6['name']),fX=parse(fW)['name']);}if(!fW)throw aL(aI['IMPORT_INVALID'],'Extension\x20main\x20script\x20not\x20found:\x20'+fS,{'dir':fS});fY||=dirname(fW);let g0=bi(fX),g2=await b2({'dir':fZ,'packageJson':fV,'fallbackName':g0});return{'name':g0,'path':fW,'dir':fY,'package':fV,'manifest':g2};},bk=async(fS,fT)=>{const h0=gz;try{let fU=await bj(fS),fV=b3(fU),fW=E({'name':fU['name'],'title':fV,'dir':J});await fW[h0(0x1af)]['import'](join(J,fU['name'],'cookies.txt'));let fX=await bh(fU['path'],{'context':fW,'dirname':fU[h0(0x129)]});if(!fX)throw aL(aI['IMPORT_INVALID'],'Failed\x20to\x20load\x20extension\x20script:\x20'+fU['path'],{'source':fT,'dir':fS,'path':fU['path']});return{'source':fT,'exports':fX['exports'],'context':fW,...fU};}catch(fY){throw B['error']('Error\x20importing\x20module:\x20'+fY['message']),B['debug'](fY instanceof Error?fY[h0(0x18f)]||fY['message']:String(fY)),fY;}},bl=f;let bm=bl;const bn=fS=>fS['replace'](/\/+$/,''),bo=()=>bn(bm),bp=(fS,fT)=>{let fU=bn(fS);return fT?fU+'/'+(fT['startsWith']('/')?fT['slice'](0x1):fT):fU;},bq=fS=>bp(bo(),fS);let br=null;async function bs(fS){const h1=gz;if(!br){B['debug']('Public\x20key\x20not\x20found');let fZ=await bu();if(fZ)B['debug']('Public\x20key\x20found:\x20'+fZ['slice'](0x0,0x32)+'...');else return B['error']('Public\x20key\x20not\x20found\x20in\x20response'),!0x1;if(br=await bv(fZ)[h1(0x222)](()=>null),!br)return B['error']('Public\x20key\x20import\x20failed'),!0x1;}let fT=fS[h1(0xda)]['get'](h1(0x1dd)),fU=fS['headers']['get']('X-Signature');if(!fT||!fU)return B['error'](h1(0x1ef)),!0x1;if(Date['now']()-parseInt(fT)>0x493e0)return!0x1;let fV=fT+':'+await fS[h1(0x239)]()['text'](),fW=bw(fU),fX=new TextEncoder(),fY=crypto['subtle']['verify']({'name':'ECDSA','hash':'SHA-256'},br,fW,fX['encode'](fV));return fY||(br=null),fY;}const bt=()=>atob(i);async function bu(fS='/auth/.well-known/public-key'){try{let fT=await fetch(''+bo()+fS);return fT['ok']?await fT['text']():bt();}catch(fU){return B['error'](fU['message']),bt();}}async function bv(fS){const h2=gz;let fT=bw(fS['replace'](h2(0x172),'')['replace']('-----END\x20PUBLIC\x20KEY-----','')[h2(0x15a)]());return crypto['subtle']['importKey']('spki',fT,{'name':'ECDSA','namedCurve':'P-256'},!0x0,['verify']);}function bw(fS){let fT=atob(fS),fU=new Uint8Array(fT['length']);for(let fV=0x0;fV<fT['length'];fV++)fU[fV]=fT['charCodeAt'](fV);return fU['buffer'];}const bx=fS=>createAuthClient({'baseURL':fS+'/auth','plugins':[deviceAuthorizationClient(),tributeClient()],'fetchOptions':{'retry':0x0,'onSuccess':fT=>{const h3=gz;let fU=fT['response'][h3(0xda)][h3(0x207)]('set-auth-token');fU&&(bJ['accessToken']=fU,bK(bJ));},'auth':{'type':'Bearer','token':()=>bJ['accessToken']||bL()['then'](fT=>fT?.['accessToken'])},'onResponse':async fT=>await bs(fT['response'])['catch'](()=>!0x1)?(B['debug']('Response\x20verified:\x20'+fT['response']['url']),fT):(B[gz(0x122)]('Response\x20verification\x20failed:\x20'+fT['response']['status']+'\x20'+fT['response']['statusText']+'\x20'+fT['response']['url']),F['emit']('error',{'code':'SIGNATURE_VERIFICATION_FAILED'}),new Response(JSON['stringify']({'error':'SIGNATURE_VERIFICATION_FAILED','message':'Signature\x20verification\x20failed'}),{'status':0x191,'statusText':'Unauthorized'}))}});let by='',bz=bx(bo());const bA=()=>{let fS=bo();return(!bz||by!==fS)&&(by=fS,bz=bx(fS)),bz;},bB=async(fS,fT,fU={})=>{const h4=gz;let {signal:fV,timeoutMs:fW=0x2710}=fU,fX=new AbortController(),fY=()=>fX[h4(0x165)](fV?.['reason']);fV?.['addEventListener'](h4(0x165),fY,{'once':!0x0});let fZ=!0x1,g0=setTimeout(()=>{fZ=!0x0,fX['abort'](Error('Request\x20timeout'));},fW);try{let g2=await fetch(fS,{...fT,'signal':fX['signal']});if(!g2['ok'])throw Error(h4(0x1e9)+g2['status']);return g2['json']();}catch(g3){throw fZ&&g3 instanceof DOMException&&g3['name']==='AbortError'?Error('Request\x20timed\x20out\x20after\x20'+fW+'ms',{'cause':g3}):g3;}finally{clearTimeout(g0),fV?.['removeEventListener']('abort',fY);}},bC={'getExtensions':(fS,fT)=>bB(bq('extensions'),{'headers':fS?{'Authorization':'Bearer\x20'+fS}:void 0x0},{'signal':fT}),'getSubscriptions':(fS,fT)=>bB(bq('subscriptions'),{'headers':{'Authorization':'Bearer\x20'+fS}},{'signal':fT})},bD=0x12c*0x3e8,bE=0x12c*0x3e8,bF=new QueryClient({'queryCache':new QueryCache(),'defaultOptions':{'queries':{'staleTime':bD,'gcTime':bE}}}),bG={'get':fS=>bF[gz(0x121)](fS),'set':(fS,fT)=>bF['setQueryData'](fS,fT),'reset':fS=>{fS?bF['removeQueries']({'queryKey':fS}):bF['clear']();},'invalidate':fS=>bF['invalidateQueries']({'queryKey':fS}),'refresh':async(fS,fT)=>(bF[gz(0x1f3)]({'queryKey':fS}),bH({'queryKey':fS,'queryFn':fT}))},bH=async({queryKey:fS,queryFn:fT,staleTime:fU,enabled:fV=!0x0})=>{const h5=gz;try{let fW=bF['getQueryState'](fS),fX=fW?fW?.['isInvalidated']||!fW?.[h5(0xcf)]&&!fW?.['errorUpdatedAt']||Date['now']()-fW['dataUpdatedAt']>(fU??bD):!0x0,fY=()=>bG['reset'](fS),fZ=()=>bG['invalidate'](fS),g0=()=>bG['refresh'](fS,fT);return fV?fW&&!fX?{'data':fW['data'],'reset':fY,'invalidate':fZ,'refresh':g0}:{'data':await bF['fetchQuery']({'queryKey':fS,'queryFn':fT,'staleTime':fU}),'reset':fY,'invalidate':fZ,'refresh':g0}:{'data':null,'reset':fY,'invalidate':fZ,'refresh':g0};}catch(g2){throw bF['removeQueries']({'queryKey':fS}),g2;}},bI=new o(join(s,'session.json')),bJ={'accessToken':'','tokenType':'','scope':'','createdAt':''},bK=async fS=>{const h6=gz;bI['setItem']('access_token',fS['access_token']),bI['setItem']('token_type',fS['token_type']||'Bearer'),bI['setItem']('scope',fS['scope']),bI[h6(0x1bc)](h6(0x234),new Date()['toISOString']()),bJ['accessToken']=fS['access_token'],bJ['tokenType']=fS['token_type']||'Bearer',bJ['scope']=fS[h6(0xfa)],bJ['createdAt']=new Date()[h6(0x119)]();},bL=async()=>{let fS=bI['getItem']('access_token'),fT=bI['getItem']('token_type'),fU=bI['getItem']('scope'),fV=bI['getItem']('created_at');return!fS||!fT||!fU||!fV?null:{'accessToken':fS,'tokenType':fT,'scope':fU,'createdAt':new Date(fV)};},bM=async()=>{const h7=gz;let fS=await bH({'queryKey':['session',bo()],'queryFn':()=>bA()['getSession']()});return{'session':fS['data']?.['data']?.['session'],'user':fS['data']?.['data']?.['user'],'error':fS['data']?.[h7(0x122)]};},bN=async()=>{let {user:fS,error:fT}=await bM(),fU=await bH({'queryKey':['subscriptions',bo()],'queryFn':async()=>bA()['subscription']['list'](),'enabled':!!fS?.['id']});return{'data':fU['data']?.['data'],'error':fU['data']?.['error']??fT};},bO=['lowConnectionsCount','oneDevice'],bP=['mediumConnectionsCount','twoDevices','proxy','decryption','customIcon','tags','parallelDownloads','userExtensions',gz(0x19c)],bQ=['highConnectionsCount','threeDevices','customMuxFormat','customDecrypter','customDrmClient','premiumExtensions'],bR={'basic':bO,'plus':bP,'pro':[...bO,...bP,...bQ]},bS=()=>bH({'queryKey':['lava-subscriptions',bo()],'queryFn':async()=>{let fS=bJ['accessToken']||(await bL())?.['accessToken'];return fS?bC['getSubscriptions'](fS):[];}}),bT=async()=>{let fS=await bN();return{'plan':(await bS())['data']?.[0x0]?.['productTitle']||fS['data']?.['find'](fT=>new Date(fT['expiresAt'])>new Date())?.['tributeSubscriptionName'],'error':fS['error']};},bU=async()=>{let {user:fS,session:fT}=await bM(),{plan:fU,error:fV}=await bT();return{'user':fS,'session':fT,'error':fV,'plan':fU,'grantedBenefits':fU?bR[fU['toLowerCase']()]??[]:[]};};var bV=a6((fS,fT)=>{const hb=gz;fT['exports']={'instagram':{'create':fU=>{let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{const h8=b;let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=gg=>gg);let g8=g7['defineExtension'];g7['version'],g7['sleep'],g7['input'],g7['prompt'],g7['notify'],g7['confirm'],g7['ask'],g7['utils'];let g9=g7['Input'],ga=g7['UrlSource'];g7['ALL_FORMATS'],g7[h8(0xf9)],g7[h8(0xcd)],g7['HLS'],g7['HLS_FORMATS'],g7[h8(0x241)],g7['MP3'];let gb={'Referer':'https://www.instagram.com/'},gc={'X-IG-App-ID':'936619743392459','User-Agent':'Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/107.0.0.0\x20Safari/537.36'},gd=async gg=>{let gh=new URLSearchParams({'doc_id':'8845758582119845','variables':JSON['stringify']({'shortcode':gg,'child_comment_count':0x3,'fetch_comment_count':0x28,'parent_comment_count':0x18,'has_threaded_comments':!0x0})});try{let gi=await fX('https://www.instagram.com/graphql/query/?'+gh['toString'](),{'headers':gc});return gi['ok']?(await gi['json']())['data']?.['xdt_shortcode_media']??null:(g0['error']('GraphQL\x20request\x20failed\x20with\x20status:\x20'+gi['status']),null);}catch(gj){return g0['error']('Error\x20during\x20GraphQL\x20fetch:',gj),null;}},ge=async gg=>{try{let gh=await fX('https://www.instagram.com/p/'+gg+'/embed/captioned/',{'headers':{'User-Agent':gc['User-Agent']}});if(!gh['ok'])return null;let gi=(await gh['text']())['match'](/window\.__additionalDataLoaded\('extra',\s*({.+?})\s*\);/);return gi?.[0x1]?JSON['parse'](gi[0x1])['shortcode_media']??null:null;}catch(gj){return g0['error']('Error\x20during\x20embed\x20page\x20fetch:',gj),null;}},gf=gg=>{const h9=h8;let gh=gg['edge_media_to_caption']?.['edges']?.[0x0]?.['node']?.['text']||'Instagram\x20Post',gi=[],gj=gl=>{if(!gl)return;let gm=gl['is_video']&&gl['video_url']?gl['video_url']:gl['display_url'];gm&&gi['push']({'title':gh,'input':new g9({'source':new ga(gm,{'requestInit':{'headers':gb}})})});},gk=gg['edge_sidecar_to_children']?.[h9(0xef)];if(gk?.['length']){for(let gl of gk)gj(gl['node']);}else gj(gg);return gi;};fV['exports']=g8({async 'resolveEntries'(gg){const ha=h8;let gh=new URLPattern({'pathname':'/:type(p|reel|tv|reels|videos)/:shortcode{/*}?','baseURL':new URL(gg)['origin']})['exec'](gg)?.[ha(0x1b3)]['groups']['shortcode'];if(!gh)return g0['error']('Could\x20not\x20extract\x20a\x20valid\x20Instagram\x20shortcode\x20from\x20the\x20URL'),g0['debug'](gg),[];try{let gi=await gd(gh);return gi||=(g0['warn']('GraphQL\x20method\x20failed.\x20Falling\x20back\x20to\x20embed\x20page\x20scraping.'),await ge(gh)),gi?gf(gi):(g0['error']('All\x20extraction\x20methods\x20failed.\x20The\x20post\x20may\x20be\x20private,\x20deleted,\x20or\x20require\x20a\x20login.'),[]);}catch(gj){return g0['error']('A\x20critical\x20error\x20occurred\x20while\x20fetching\x20Instagram\x20metadata:',gj),[];}}});})(fU['Azot'],fU['fetch'],fU['localStorage'],fU['cookieStore'],fU['console'],fU['prompt'],fU['alert'],fU['document'],fU['navigator'],fU['window']),fV['exports']['default']||fV['exports'];},'manifest':{'manifestVersion':0x1,'name':'Instagram','icon':'https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/41/91/13/419113d2-6246-c557-669e-0f0a5c62bcc5/Prod-0-0-1x_U007epad-0-1-0-sRGB-85-220.png/460x0w.webp','matches':[hb(0x138),'https://*.instagram.com/*']},'pkg':{'name':'instagram','version':'0.0.1','private':!0x0,'keywords':['social-networks'],'homepage':'https://instagram.com/','author':{'name':'Azot','url':'https://azot.mov/'},'contributors':[{'name':'Vitaly\x20Gashkov','email':'vitalygashkov@vk.com','url':'https://github.com/vitalygashkov'}],'type':'module','main':'instagram.ts'}},'ntv':{'create':fU=>{const hf=hb;let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=gg=>gg);let g8=g7['defineExtension'];g7['version'],g7['sleep'],g7['input'],g7['prompt'],g7['notify'],g7['confirm'],g7['ask'],g7['utils'];let g9=g7['Input'],ga=g7['UrlSource'];g7['ALL_FORMATS'],g7['DASH'],g7['DASH_FORMATS'],g7['HLS'],g7['HLS_FORMATS'],g7['MP4'],g7['MP3'];let gb=(gg,gh,gi)=>gg['split'](gh)[0x1]?.['split'](gi)[0x0],gc=(gg,gh)=>{let gi=gb(gg,'<'+gh+'>','</'+gh+'>')?.['trim']();if(!gi)return;let gj=gi['match'](/<!\[CDATA\[(.*?)\]\]>/s);return gj?.[0x1]?gj[0x1]['trim']():gi['split']('DATA[')[0x1]?.['split'](']')[0x0]?.['trim']()||gi;},gd=async(gg,gh)=>{const hc=b;let gi=await fX(gg);return gi['ok']?await gi['text']():(g0['error']('Failed\x20to\x20fetch\x20'+gh+'.\x20Status:\x20'+gi['status']+'\x20'+gi[hc(0x19e)]),null);},ge=async(gg,gh,gi)=>{const hd=b;let gj=new URL(gg)['pathname'],gk=new Set();for(let gm of gh['split']('href=\x22/serial')){if(!gm[hd(0x128)]('/'))continue;let gn=gm['split']('\x22')[0x0];!gn||gn['length']<=0x1||gn['includes']('/issues/')||gn['includes']('/about/')||gn['split']('/')['length']<=0x2||gk['add'](gg['replace'](gj,'/serial'+gn));}let gl=[];for(let go of gk)gl['push'](...await gf(go,gi));return gl;},gf=async(gg,gh=new Set())=>{const he=b;if(gh['has'](gg))return[];gh['add'](gg);let gi=await gd(gg,'NTV\x20page');if(!gi)return[];let gj=gb(gi,he(0xd2),'\x22>')??gb(gi,'<meta\x20property=\x22ya:ovs:feed_url\x22\x20content=\x22','\x22\x20/>');if(!gj)return new URL(gg)['pathname']['includes']('/serial')?ge(gg,gi,gh):(g0[he(0x122)]('Could\x20not\x20find\x20video\x20link\x20in\x20the\x20page.'),[]);let gk=gj['split']('video/')[0x1]?.['split']('/')[0x0];if(!gk)return g0['error']('Could\x20not\x20parse\x20NTV\x20video\x20id.'),[];let gl=await gd('https://www.ntv.ru/vi'+gk+'/','NTV\x20XML\x20metadata');if(!gl)return[];let gm=gc(gl,'dash')||gc(gl,'hls'),gn=gc(gl,'file')||gc(gl,'video'),go=gc(gl,'hifile')||gc(gl,'hd_video')||gm||gn;if(!go)return g0[he(0x122)]('Could\x20not\x20resolve\x20NTV\x20media\x20URL.'),[];let gp=gb(gl,'<embed_tag>','</embed_tag>')||he(0x1a5),gq=gb(gi,he(0xe1),'\x22'),gr=gq?.['includes']('серия')?gq[he(0x1b2)]('-')[0x0]:void 0x0,gs=gr?parseInt(gr,0xa):void 0x0,gt=gb(gl,'<subtitles>','</subtitles>'),gu=gt?he(0x242)+gt:void 0x0;gu&&g0['debug']('Subtitles:\x20'+gu);let gv=new g9({'source':new ga(go)});return gu&&gv['addSubtitleTrack'](new ga(gu),{'languageCode':'ru','name':he(0x233)}),[{'type':gs?'episode':'video','title':gp,'season':gs?0x1:void 0x0,'episode':gs,'input':gv}];};fV['exports']=g8({'resolveEntries'(gg){return gf(gg,new Set());}});})(fU[hf(0x200)],fU['fetch'],fU[hf(0x14d)],fU['cookieStore'],fU[hf(0xec)],fU['prompt'],fU['alert'],fU[hf(0x197)],fU['navigator'],fU['window']),fV['exports']['default']||fV['exports'];},'manifest':{'manifestVersion':0x1,'name':'НТВ','icon':'https://static.ntv.ru/static/images/logo.png','matches':['https://ntv.ru/*','https://*.ntv.ru/*']},'pkg':{'name':hb(0x1fb),'version':'0.0.9','private':!0x0,'keywords':['tv-channels'],'homepage':'https://www.ntv.ru/','author':{'name':'Azot','url':'https://azot.mov/'},'contributors':[{'name':'Vitaly\x20Gashkov','email':'vitalygashkov@vk.com','url':hb(0x17e)}],'type':'module','main':hb(0x135)}},'rbc':{'create':fU=>{const hh=hb;let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=gb=>gb);let g8=g7['defineExtension'];g7['version'],g7['sleep'],g7['input'],g7['prompt'],g7['notify'],g7['confirm'],g7['ask'],g7['utils'];let g9=g7['Input'],ga=g7['UrlSource'];g7['ALL_FORMATS'],g7['DASH'],g7['DASH_FORMATS'],g7['HLS'],g7['HLS_FORMATS'],g7['MP4'],g7['MP3'],fV['exports']=g8({async 'resolveEntries'(gb){const hg=b;let gc=await fX(gb);if(!gc['ok'])throw Error('Failed\x20to\x20fetch\x20RBC\x20page:\x20'+gc['status']+'\x20'+gc['statusText']);let gd=(await gc['text']())['match'](/(?:https?:)?\/\/[^\s"'<>]+\.m3u8(?:\?[^\s"'<>]*)?/i)?.[0x0];if(!gd)throw Error('Could\x20not\x20find\x20RBC\x20playlist\x20URL.');return[{'type':'video','input':new g9({'source':new ga(gd['startsWith']('//')?hg(0x149)+gd:gd)})}];}});})(fU['Azot'],fU['fetch'],fU['localStorage'],fU['cookieStore'],fU['console'],fU['prompt'],fU['alert'],fU['document'],fU['navigator'],fU['window']),fV['exports']['default']||fV[hh(0xfd)];},'manifest':{'manifestVersion':0x1,'name':'РБК','icon':'https://static.rustore.ru/imgproxy/A-G-s2Q1x2iqq3qHCAo66-nllrtlqEr7XNU_JKXt4mQ/preset:web_app_icon_160/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS80MGViMWY3MS1kMDkzLTQ2NDMtOTkyNi0xZWM0ZjkwNzViMTQ=.webp','matches':['https://rbc.ru/*','https://*.rbc.ru/*']},'pkg':{'name':'rbc','version':'0.0.2','private':!0x0,'keywords':['news'],'homepage':'https://rbc.ru/','author':{'name':'Azot','url':'https://azot.mov/'},'contributors':[{'name':'Vitaly\x20Gashkov','email':'vitalygashkov@vk.com','url':'https://github.com/vitalygashkov'}],'type':'module','main':'rbc.ts'}},'rutube':{'create':fU=>{const hk=hb;let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{const hi=b;let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=ge=>ge);let g8=g7[hi(0x178)];g7['version'],g7[hi(0x176)],g7['input'],g7['prompt'],g7['notify'],g7['confirm'],g7['ask'],g7['utils'];let g9=g7['Input'],ga=g7[hi(0x116)];g7['ALL_FORMATS'],g7['DASH'],g7['DASH_FORMATS'],g7[hi(0x1d9)],g7['HLS_FORMATS'],g7['MP4'],g7['MP3'];let gb=['/video/:id{/}?','/play/embed/:id{/}?','/shorts/:id{/}?',hi(0xc8),hi(0x238)],gc=ge=>{let gf={'yappyId':'','id':'','key':''};gf['key']=new URL(ge)['searchParams']['get']('p')??'';for(let gg of gb){let gh=new URLPattern(gg,'https://rutube.ru')['exec'](ge);gh&&(Object['assign'](gf,gh['pathname']['groups']),Object['assign'](gf,gh['search']['groups']));}return gf;},gd=async ge=>{let gf=(await fX('https://rutube.ru/pangolin/api/web/yappy/yappypage/?client=wdp&videoId='+ge+'&page=1&page_size=15')['then'](gg=>gg['json']())['catch'](()=>null))?.['results']?.['find'](gg=>String(gg['id'])===ge)?.['link'];return gf?[{'type':'video','title':'rutube_yappy_'+ge,'input':new g9({'source':new ga(gf)})}]:(g0['error']('ErrorEmptyDownload'),[]);};fV['exports']=g8({async 'resolveEntries'(ge){const hj=hi;let gf=gc(ge);if(gf['yappyId'])return gd(gf[hj(0x11f)]);if(!gf['id'])return g0['error']('Could\x20not\x20extract\x20Rutube\x20video\x20id'),[];let gg=new URL('https://rutube.ru/api/play/options/'+gf['id']+'/?no_404=true&referer&pver=v2');gf['key']&&gg['searchParams']['set']('p',gf['key']);let gh=await fX(gg)['then'](gi=>gi[hj(0x1c9)]())['catch'](gi=>(gi instanceof Error&&g0[hj(0xed)](gi['message']),null));return gh?gh['detail']||!gh['video_balancer']?.[hj(0x219)]?(g0[hj(0x122)]('Play\x20info\x20is\x20empty'),[]):gh['live_streams']?.['hls']?(g0['error']('Live\x20videos\x20are\x20not\x20supported'),[]):[{'type':'video','title':gh['title']?.[hj(0x15a)]()||'rutube_'+gf['id'],'input':new g9({'source':new ga(gh['video_balancer']['m3u8'])})}]:(g0['error']('Cannot\x20fetch\x20play\x20info'),[]);}});})(fU[hk(0x200)],fU['fetch'],fU['localStorage'],fU['cookieStore'],fU['console'],fU['prompt'],fU['alert'],fU['document'],fU['navigator'],fU['window']),fV['exports']['default']||fV['exports'];},'manifest':{'manifestVersion':0x1,'name':'RUTUBE','icon':'https://static.rustore.ru/imgproxy/vcyBc0LG-3ybXcGs_-_OJXH9ULjoegHlLs-DacemG08/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjQ2MjA3L2NvbnRlbnQvSUNPTi9hNTZhZWJlMy01NjVhLTRiZjYtOTQyZC0xZjE0OTk0YjlhNmUucG5n.webp','matches':['https://rutube.ru/*','https://*.rutube.ru/*']},'pkg':{'name':'rutube','version':hb(0x1ff),'private':!0x0,'keywords':['video-hostings'],'homepage':'https://rutube.ru/','author':{'name':'Azot','url':'https://azot.mov/'},'contributors':[{'name':'Vitaly\x20Gashkov','email':'vitalygashkov@vk.com','url':'https://github.com/vitalygashkov'}],'type':'module','main':'rutube.ts'}},'soundcloud':{'create':fU=>{const hq=hb;let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{const hl=b;let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=gf=>gf);let g8=g7['defineExtension'];g7['version'],g7['sleep'],g7['input'],g7['prompt'],g7['notify'],g7['confirm'],g7[hl(0x232)];let g9=g7[hl(0x151)],ga=g7['Input'],gb=g7['UrlSource'];g7['ALL_FORMATS'],g7['DASH'],g7['DASH_FORMATS'],g7['HLS'],g7['HLS_FORMATS'],g7['MP4'],g7[hl(0xd8)];let gc={'version':'','id':''},gd=async()=>{const hm=hl;try{let gf=await fX('https://soundcloud.com/')[hm(0x188)](gi=>gi[hm(0xe3)]())['catch'](gi=>{const hn=hm;let gj=gi instanceof Error&&gi['cause']!=null?String(gi['cause']):'';return gi instanceof Error&&gj['includes']('ECONNRESET')&&g0['warn'](hn(0x1c8)),'';}),gg=gf['match'](/window\.__sc_version="([0-9]{10})"/)?.[0x1];if(gg&&gc['version']===gg)return gc['id'];let gh='';for(let gi of gf['matchAll'](/<script.+src="(.+)">/g)){let gj=gi[0x1];if(!gj?.['startsWith']('https://a-v2.sndcdn.com/'))continue;let gk=(await fX(gj)['then'](gl=>gl['text']())['catch'](()=>''))[hm(0x12f)](/\("client_id=[A-Za-z0-9]{32}"\)/)?.[0x0][hm(0x12f)](/[A-Za-z0-9]{32}/)?.[0x0];if(gk){gh=gk;break;}}return gg&&(gc[hm(0x18a)]=gg,gc['id']=gh),gh;}catch{return'';}},ge=gf=>gf['audioCodecs']?.['some'](gg=>gg==='aac'||gg==='mp3')??!0x1;fV['exports']=g8({async 'resolveEntries'(gf,gg){const ho=hl;let {author:gh,song:gi,accessKey:gj,shortLink:gk}=g9[ho(0x1d6)](gf,[':author/:song/s-:accessKey',':author/:song',':shortLink'],['https://soundcloud.com','https://on.soundcloud.com'])['pathname'],gl=await gd();if(!gl)throw Error('No\x20client\x20ID');let gm;if(new URL(gf)['hostname']==='on.soundcloud.com'&&gk&&(gm=await fX('https://on.soundcloud.com/'+gk+'/',{'redirect':'manual'})['then'](gt=>{const hp=ho;let gu=gt['headers']['get']('location');if(gt['status']===0x12e&&gu?.['startsWith'](hp(0xcc)))return gu['split']('?',0x1)[0x0];})['catch'](()=>void 0x0)),!gm&&gh&&gi&&(gm='https://soundcloud.com/'+gh+'/'+gi+(gj?'/s-'+gj:'')),!gm)throw Error('Could\x20not\x20fetch');let gn=await fX('https://api-v2.soundcloud.com/resolve?url='+gm+'&client_id='+gl)['then'](gt=>gt['status']===0xc8?gt['json']():null)['catch'](()=>null);if(!gn)throw Error('Could\x20not\x20fetch');let go=gn['media']?.['transcodings'];if(!go?.['length'])throw Error('Empty\x20download');let gp=go['find'](gt=>gt['preset']==='opus_0_0'),gq=go['find'](gt=>gt['preset']==='mp3_0_0');if(gq&&(ge(gg)||!gp)&&(gp=gq),!gp)throw Error('Empty\x20download');let gr=''+gp['url']+(gp['url']['includes']('?')?'&':'?')+'client_id='+gl+'&track_authorization='+gn[ho(0x1d5)];if(!gr['startsWith']('https://api-v2.soundcloud.com/media/soundcloud:tracks:'))throw Error('Empty\x20download');let gs=await fX(gr)['then'](async gt=>(await gt['json']())['url']??'')['catch'](()=>'');if(!gs)throw Error('Could\x20not\x20fetch');return[{'type':'audio','title':gn['title']['trim'](),'author':gn['user']['username']['trim'](),'input':new ga({'source':new gb(gs)})}];}});})(fU['Azot'],fU['fetch'],fU['localStorage'],fU[hq(0x1af)],fU['console'],fU['prompt'],fU['alert'],fU['document'],fU['navigator'],fU['window']),fV['exports'][hq(0x109)]||fV['exports'];},'manifest':{'manifestVersion':0x1,'name':'SoundCloud','icon':'https://play-lh.googleusercontent.com/JSSeB3XQtb9sHD5FWTqVM4AksY_Kg2q20eExenxGqPJZdn2uVQxi8eoHkP5MA-IR4w=w480-h960-rw','matches':[hb(0x1a1),'https://*.soundcloud.com/*']},'pkg':{'name':'soundcloud','version':'0.0.6','private':!0x0,'keywords':['music'],'homepage':'https://soundcloud.com/','author':{'name':'Azot','url':'https://azot.mov/'},'contributors':[{'name':hb(0x210),'email':'vitalygashkov@vk.com','url':'https://github.com/vitalygashkov'}],'type':'module','main':'soundcloud.ts'}},'tiktok':{'create':fU=>{let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{const hr=b;let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=gb=>gb);let g8=g7['defineExtension'];g7['version'],g7['sleep'],g7['input'],g7['prompt'],g7['notify'],g7['confirm'],g7['ask'],g7['utils'];let g9=g7[hr(0x1c0)],ga=g7['UrlSource'];g7['ALL_FORMATS'],g7['DASH'],g7['DASH_FORMATS'],g7['HLS'],g7['HLS_FORMATS'],g7['MP4'],g7['MP3'],fV['exports']=g8({async 'resolveEntries'(gb){const hs=hr;let gc=await fX(gb);if(!gc['ok'])return g0['error']('Failed\x20to\x20fetch\x20TikTok\x20page.\x20Status:\x20'+gc['status']),[];let gd=(await gc['text']())['split'](hs(0x1bb))[0x1]?.['split']('</script>')[0x0];if(!gd)return g0['error']('Could\x20not\x20find\x20target\x20script\x20tag.\x20TikTok\x20might\x20have\x20updated\x20their\x20page\x20structure.'),[];let ge;try{ge=JSON['parse'](gd);}catch(gi){return g0['error']('Failed\x20to\x20parse\x20TikTok\x20page\x20JSON',gi,{'url':gb}),[];}let gf=ge['__DEFAULT_SCOPE__']?.[hs(0x1a2)],gg=gf?.['itemInfo']?.['itemStruct'];if(!gg)return g0['error']('Could\x20not\x20find\x20video\x20data\x20in\x20the\x20JSON\x20payload.\x20The\x20content\x20might\x20be\x20unavailable\x20or\x20the\x20structure\x20has\x20changed.'),gf?.['statusMsg']&&g0['error']('Error\x20'+gf['statusCode']+':\x20'+gf['statusMsg']),[];let gh=gg['video']?.['playAddr'];return gh?[{'type':'video','title':gg['desc']||'TikTok\x20Video','input':new g9({'source':new ga(gh,{'requestInit':{'headers':{'Referer':'https://www.tiktok.com/','Cookie':g4['cookie']}}})})}]:(g0['error']('Could\x20not\x20find\x20a\x20video\x20URL\x20(playAddr)\x20in\x20the\x20JSON\x20payload.'),[]);}});})(fU['Azot'],fU['fetch'],fU['localStorage'],fU['cookieStore'],fU['console'],fU['prompt'],fU['alert'],fU['document'],fU['navigator'],fU['window']),fV['exports']['default']||fV['exports'];},'manifest':{'manifestVersion':0x1,'name':'TikTok','tag':'TT','icon':'https://play-lh.googleusercontent.com/LdBITldj-tJxqLm-CsWSbnt4BMo2gk53cgM7mWIL-zn44m1ywLyQgxRsHKqp8r0qceXs=w480-h960-rw','permissions':[],'matches':['https://tiktok.com/*','https://*.tiktok.com/*']},'pkg':{'name':hb(0x13f),'version':'0.0.2','private':!0x0,'keywords':['social-networks'],'homepage':hb(0x120),'author':{'name':'Azot','url':'https://azot.mov/'},'contributors':[{'name':'Vitaly\x20Gashkov','email':'vitalygashkov@vk.com','url':'https://github.com/vitalygashkov'}],'type':'module','main':'tiktok.ts'}},'virtualroom':{'create':fU=>{const hv=hb;let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{const ht=b;let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=gb=>gb);let g8=g7['defineExtension'];g7['version'],g7['sleep'],g7['input'],g7[ht(0x133)],g7[ht(0x1f7)],g7['confirm'],g7['ask'],g7['utils'];let g9=g7['Input'],ga=g7['UrlSource'];g7[ht(0x186)],g7['DASH'],g7['DASH_FORMATS'],g7['HLS'],g7['HLS_FORMATS'],g7['MP4'],g7['MP3'],fV['exports']=g8({async 'resolveEntries'(gb){const hu=ht;let gc=new URL(gb)['searchParams']['get']('recordId');if(!gc)return g0['error']('Could\x20not\x20extract\x20VirtualRoom\x20recordId.'),[];let gd=await fX('https://mv1.virtualroom.ru/vr/player/records/'+gc+hu(0x13a))['then'](gg=>gg['ok']?gg['json']():null)['catch'](()=>null),ge=await fX('https://mv1.virtualroom.ru/vr/player/records/'+gc+hu(0xee))['then'](gg=>gg['ok']?gg['json']():null)['catch'](()=>null),gf=gd?.['data']?.['roomParameters']?.[hu(0x1bf)]??hu(0xf2);return(ge?.['data']?.['translations']??[])['filter'](gg=>!!gg['url'])['map'](gg=>({'title':[gf,gg['type'],gg['source'],gg['start']]['filter'](Boolean)[hu(0x1ca)]('\x20'),'input':new g9({'source':new ga(gg['url'])})}));}});})(fU['Azot'],fU['fetch'],fU['localStorage'],fU['cookieStore'],fU['console'],fU['prompt'],fU[hv(0x14c)],fU['document'],fU['navigator'],fU['window']),fV['exports']['default']||fV['exports'];},'manifest':{'manifestVersion':0x1,'name':'VirtualRoom','icon':hb(0x164),'matches':['https://virtualroom.ru/*','https://*.virtualroom.ru/*']},'pkg':{'name':'virtualroom','version':'0.0.7','private':!0x0,'keywords':['videotelephony'],'homepage':'https://virtualroom.ru/','author':{'name':'Azot','url':'https://azot.mov/'},'contributors':[{'name':hb(0x210),'email':'vitalygashkov@vk.com','url':'https://github.com/vitalygashkov'}],'type':'module','main':'virtualroom.ts'}},'vk':{'create':fU=>{const hz=hb;let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{const hw=b;let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=gf=>gf);let g8=g7['defineExtension'];g7['version'],g7['sleep'],g7['input'],g7['prompt'],g7['notify'],g7['confirm'],g7['ask'],g7[hw(0x151)];let g9=g7['Input'],ga=g7['UrlSource'];g7['ALL_FORMATS'],g7[hw(0xf9)],g7['DASH_FORMATS'],g7['HLS'],g7['HLS_FORMATS'],g7['MP4'],g7['MP3'];let gb=['2160','1440','1080','720','480','360','240',hw(0x10b)],gc=gf=>{let gg=gf['match'](/video-(\d+)_(\d+)/);return gg?{'ownerId':gg[0x1],'videoId':gg[0x2]}:null;},gd=gf=>{if(!gf)return null;for(let gg of gf)if(Array['isArray'](gg)){for(let gh of gg)if(gh&&typeof gh=='object'&&'player'in gh)return gh;}return null;},ge=(gf,gg)=>{const hx=hw;let gh=gg['videoQuality']?.['replace']('p','')['trim'](),gi=gb['filter'](gj=>!!gf['url'+gj]);return gi['length']?gh&&gi[hx(0x15b)](gh)?gh:gi[0x0]:null;};fV['exports']=g8({async 'resolveEntries'(gf,gg){const hy=hw;let gh=gc(gf);if(!gh)return g0['error']('Could\x20not\x20extract\x20VK\x20video\x20identifiers'),[];let gi=await fX('https://vkvideo.ru/al_video.php?act=show',{'method':hy(0xeb),'headers':{'content-type':'application/x-www-form-urlencoded;\x20charset=utf-8','accept':'*/*','accept-language':'ru-RU,ru;q=0.9','sec-ch-ua':'\x22Chromium\x22;v=\x22130\x22,\x20\x22Google\x20Chrome\x22;v=\x22130\x22,\x20\x22Not?A_Brand\x22;v=\x2299\x22','sec-ch-ua-mobile':'?0','sec-ch-ua-platform':'\x22macOS\x22','sec-fetch-dest':'empty','sec-fetch-mode':'cors','sec-fetch-site':'same-origin','x-requested-with':'XMLHttpRequest','Referer':gf,'Referrer-Policy':'strict-origin-when-cross-origin'},'body':new URLSearchParams({'al':'1','autoplay':'1','claim':'','force_no_repeat':'true','is_video_page':'true','list':'','module':'direct','t':'','video':'-'+gh['ownerId']+'_'+gh['videoId']})[hy(0x11e)]()});if(!gi['ok'])throw Error('VK\x20request\x20failed:\x20'+gi['status']+'\x20'+gi['statusText']);let gj=gd((await gi['json']())['payload']),gk=gj?.['player']?.['params'],gl=gk&&gk['length']>0x0?gk[0x0]:void 0x0;if(!gj||!gl)return g0['error'](hy(0x171)),[];if(gj['mvData']?.['is_active_live']===0x1||gj['mvData']?.['is_active_live']==='1')return g0['error']('Live\x20videos\x20are\x20not\x20supported'),[];let gm=ge(gl,gg),gn=gm?gl['url'+gm]:void 0x0,go=gl['dash_sep']||gn;return go?[{'type':'video','title':[gl['md_title']?.['trim'](),gl['md_author']?.['trim']()]['filter'](Boolean)['join']('\x20'),'input':new g9({'source':new ga(go,{'requestInit':{'headers':{'Referer':gf,'Cookie':g4['cookie']}}})})}]:(g0['error']('Could\x20not\x20find\x20video\x20URL'),[]);}});})(fU['Azot'],fU['fetch'],fU['localStorage'],fU[hz(0x1af)],fU['console'],fU['prompt'],fU['alert'],fU[hz(0x197)],fU['navigator'],fU['window']),fV['exports']['default']||fV['exports'];},'manifest':{'manifestVersion':0x1,'name':'VK','icon':'https://static.rustore.ru/imgproxy/kSjDiz_MKxD_jzwgEqqaIjQZTE-NEP1Xt8HtJT7EU4s/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjAyNzgyMzI5NS9jb250ZW50L0lDT04vOTc0ODYwMTgtNTc4NS00MjRkLTljYWItNGZlNDk2ZDI3Yzc2LnBuZw==.webp','matches':['https://vk.com/*','https://*.vk.com/*','https://vkvideo.ru/*','https://*.vkvideo.ru/*']},'pkg':{'name':'vk','version':'0.0.8','private':!0x0,'keywords':['video-hostings'],'homepage':hb(0x15e),'author':{'name':'Azot','url':'https://azot.mov/'},'contributors':[{'name':'Vitaly\x20Gashkov','email':'vitalygashkov@vk.com','url':'https://github.com/vitalygashkov'}],'type':'module','main':'vk.ts'}},'weibo':{'create':fU=>{const hC=hb;let fV={'exports':{}};return((fW,fX,fY,fZ,g0,g2,g3,g4,g5,g6)=>{const hA=b;let g7=fW??Streamyx??{};g7&&(g7['defineExtension']||=gc=>gc);let g8=g7['defineExtension'];g7['version'],g7['sleep'],g7['input'],g7['prompt'],g7['notify'],g7[hA(0x152)],g7[hA(0x232)];let g9=g7['utils'],ga=g7['Input'],gb=g7['UrlSource'];g7[hA(0x186)],g7['DASH'],g7['DASH_FORMATS'],g7['HLS'],g7['HLS_FORMATS'],g7['MP4'],g7['MP3'],fV['exports']=g8({async 'resolveEntries'(gc){const hB=hA;let gd=g9['execUrlPatterns'](gc,['/:userId(\x5cd+)/:bid',hB(0x159)],['https://weibo.com/','https://m.weibo.cn']),ge=gd['pathname']['bid']||gd['pathname'][hB(0x244)];if(!ge)return[];let gf=await fX('https://m.weibo.cn/statuses/show?id='+ge,{'credentials':'include','referrer':'https://m.weibo.cn/status/'+(gd['pathname']['bid']??ge)+'?jumpfrom=weibocom','method':'GET','mode':'cors'})['then'](gj=>gj['json']())['catch'](()=>null);if(!gf?.['data'])return g0['error']('Could\x20not\x20resolve\x20Weibo\x20post\x20metadata'),[];let gg=[],gh=gf['data']['pics'],gi=gf['data']['page_info'];if(gh?.['length']){for(let gj of gh['filter'](gk=>gk[hB(0x168)]===hB(0x19b)||gk['type']==='livephoto'))gj['videoSrc']&&gg['push']({'type':'video','title':gj['pid'],'input':new ga({'source':new gb(gj['videoSrc'])})});}else{if(gi?.['type']==='video'){let gk=Object['values'](gi['urls']??{})[0x0],gl=gi['media_info']?.['stream_url_hd']||gi['media_info']?.[hB(0x157)],gm=gk||gl;gm&&gg['push']({'type':'video','title':gi['title']||gi[hB(0x1bd)],'input':new ga({'source':new gb(gm)})});}}return gg;}});})(fU[hC(0x200)],fU['fetch'],fU['localStorage'],fU['cookieStore'],fU['console'],fU['prompt'],fU['alert'],fU['document'],fU['navigator'],fU['window']),fV['exports']['default']||fV['exports'];},'manifest':{'manifestVersion':0x1,'name':'Weibo','icon':'https://play-lh.googleusercontent.com/TTKq2trnzgtoyM0jc1pyrrmXtA_Yd3A2hxubZtDahdZStYf4GPANZa-wjDb1ELHrGqh_=w480-h960-rw','matches':['https://weibo.com/*',hb(0x184),'https://weibo.cn/*','https://*.weibo.cn/*']},'pkg':{'name':'weibo','version':'0.0.6','private':!0x0,'keywords':['social-networks'],'homepage':'https://weibo.com/','author':{'name':hb(0x200),'url':'https://azot.mov/'},'contributors':[{'name':'Vitaly\x20Gashkov','email':'vitalygashkov@vk.com','url':'https://github.com/vitalygashkov'}],'type':'module','main':'weibo.ts'}}};}),bW=a8(bV(),0x1);const bX=fS=>({'name':fS['name'],'source':fS['source'],'dir':fS['dir'],'path':fS['path'],'package':fS['package'],'manifest':fS['manifest'],'installedAt':fS['installedAt']||new Date()['toISOString']()});var bY=class gw extends S{['extensions']=new Map();['extensionDirs'];['indexPath'];['infoList']=[];constructor({dirs:fS,indexPath:fT}={}){const hD=gz;super(),this['extensionDirs']=fS??[process['cwd']()],this[hD(0x20a)]=fT??L[hD(0x1ca)](process['cwd'](),'index.json');}async['init'](){return await this['ensureValidIndexPath'](),await this['loadInfo'](),this;}async['loadInfo'](){return this['infoList']=await aF(this['indexPath'])['catch'](()=>[]),this['infoList'];}async['saveInfo'](){const hE=gz;return await this['ensureValidIndexPath'](),await aG(this[hE(0x20a)],this['infoList']);}async['ensureValidIndexPath'](){const hF=gz;(await P['stat'](this['indexPath'])['catch'](()=>null))?.[hF(0x21b)]()&&(B['warn']('Invalid\x20extensions\x20index\x20path\x20repaired:\x20'+this['indexPath']),await aC(this['indexPath']),await P[hF(0x179)](this['indexPath'],'[]','utf8'));}static async['getAvailableExtensions'](){try{return(await bC['getExtensions'](bJ['accessToken'],AbortSignal['timeout'](0x1f40)))['data'];}catch(fS){return B['warn']('Failed\x20to\x20fetch\x20extensions\x20catalog:\x20'+(fS instanceof Error?fS['message']:String(fS))),[];}}async['discover'](){const hG=gz;for(let fS of this['extensionDirs']){B['debug']('Loading\x20extensions\x20from\x20'+fS);let fT=await P['readdir'](fS,{'withFileTypes':!0x0})['catch'](()=>[]);for(let fU of fT)if(fU['isDirectory']()){let fV=L['join'](fS,fU[hG(0x1bf)]);if(await P['readdir'](fV)['then'](fW=>fW['filter'](fX=>!fX['startsWith']('.')))['then'](fW=>!fW['length']))continue;await this['loadExtension'](fV);}}for(let fW of this['infoList'])this['extensionDirs']['some'](fX=>fW['dir']?.['includes'](fX))||!fW['dir']||(B['debug']('Loading\x20dev\x20extension\x20from\x20'+fW['dir']),await this['loadExtension'](fW['dir']));}async #e(fS,fT){const fU=await P['readFile'](fS,'utf8'),{Azot:fV,fetch:fW,console:fX,localStorage:fY,cookieStore:fZ,window:g0,document:g2,navigator:g3}=fT,g4={'exports':{}};eval('(()\x20=>\x20{'+fU+'})();');const g5=g4['exports'];return{'exports':g5,'context':fT};}async['prepareContext'](fS,fT){const hH=gz;let fU=E({'name':fS,'dir':J,'title':fT});return await fU['cookieStore']['import'](L[hH(0x1ca)](J,fS,'cookies.txt')),fU;}async['loadScript'](fS,fT){const hI=gz;let fU=fT['name'],fV=b3(fT),fW=await this['prepareContext'](fU,fV),fX=await y(fS,{'dirname':fT['dir'],'context':fW});if(fX)return fX['exports']='default'in fX[hI(0xfd)]?fX['exports']['default']:fX['exports'],fX;}async['loadCoreExtensions'](){const hJ=gz;let fS=Object['keys'](bW['default']);B['debug']('Loading\x20'+fS['length']+'\x20built-in\x20extensions:\x20'+fS['join'](',\x20'));for(let fT of Object['values'](bW['default'])){let fU=fT['pkg']['name'],fV=b1({'manifest':fT[hJ(0x110)],'packageJson':fT[hJ(0xe5)],'fallbackName':fU}),fW=fV['name'];try{let fX=await this['prepareContext'](fU,fW),fY={'exports':fT[hJ(0xfc)](fX),'package':fT['pkg'],'manifest':fV,'context':fX};this['validate'](fY),this['extensions']['set'](fU,fY),this['emit']('loaded',fU);}catch(fZ){B['debug'](fZ instanceof Error?fZ['message']:String(fZ)),this['emit']('error',fZ,fU);}}}async[gz(0x21d)](fS){const hK=gz;try{B['debug']('Loading\x20extension\x20from\x20'+fS);let fT=await bj(fS)['catch'](fW=>B['error'](fW));if(!fT)return;fT['package']['dir']=fT['dir'];let fU=await this[hK(0x1fa)](fT['path'],fT);if(!fU)return;let fV={'package':fT['package'],'manifest':fT['manifest'],'exports':fU['exports'],'context':fU[hK(0xea)]};this['validate'](fV),this['extensions']['set'](fT['package']['name'],fV),this['emit']('loaded',fT[hK(0x23c)]['name']);}catch(fW){this['emit']('error',fW,fS);}}['validate'](fS){const hL=gz;if(typeof fS!='object'||!fS||!ba(fS['exports']))throw Error('Invalid\x20extension\x20interface:\x20'+fS[hL(0x23c)]['name']);}['getExtension'](fS){const hM=gz;return this[hM(0x115)][hM(0x207)](fS)??Array['from'](this['extensions']['values']())['find'](fT=>fT['package']['name']===fS)??null;}async['getExtensionForUrl'](fS){const hN=gz;let fT;try{fT=new URL(fS);}catch(fU){return B['debug']('Invalid\x20extension\x20URL:\x20'+fS),B['debug'](fU instanceof Error?fU['message']:String(fU)),null;}for(let fV of this['extensions']['values']()){let fW=null,fX=fV[hN(0xfd)]['canHandle'],fY=fT['hostname']['includes'](fV['package']['name']);if(fW=b6(fV)?b5(fV,fT):typeof fX=='function'?await fX(fS):typeof fX==hN(0x1d7)?new URLPattern(fX)['test'](fS):fY,fW)return fV;}return null;}async['install'](fS){let fT=await gw['getAvailableExtensions'](),fU=[];for(let fV of fS){let fW=await stat(fV)['then'](fZ=>fZ['isDirectory']())['catch'](()=>!0x1)?fV:await aU(fV,fT);if(!fW)throw aL(aI['SOURCE_NOT_FOUND'],'Extension\x20source\x20not\x20found:\x20'+fV,{'source':fV});let fX=await bk(fW,fV);if(!fX)throw aL(aI['IMPORT_INVALID'],'Extension\x20import\x20failed:\x20'+fV,{'source':fV,'dir':fW});fU['push'](fX);let fY=this['infoList']['find'](({name:fZ})=>fZ===fX['name']);if(fY){let fZ=fY['source'];fZ!==fX['source']&&await aC(fZ);let g0=fY['dir']?this.#t(fY['dir']):null,g2=fX['dir']?this.#t(fX['dir']):null;g0&&g0!==g2&&await aC(g0),fY['installedAt']=new Date()['toISOString'](),Object['assign'](fY,bX(fX)),B['info']('Extension\x20'+fX['name']+'\x20updated');}else this['infoList']['push'](bX(fX)),B['info']('Extension\x20'+fX['name']+'\x20added');}if(await this['saveInfo'](),fU['length']){for(let g3 of fU)this['extensions']['set'](g3['name'],g3);}}#t(fS){let fT=L['parse'](fS);return fT['dir']===j?fS:fT['dir'];}async['uninstall'](fS){const hO=gz;for(let fT of fS){let fU=this['infoList']['find'](fX=>fX['name']===fT);if(!fU){B['error']('Extension\x20'+fT+'\x20not\x20found');return;}let fV=fU['dir']??'',fW=fV?.['includes'](j);await aA(fV)?(fW&&await aC(this.#t(fV)),this['infoList']=this[hO(0x15d)]['filter'](fX=>fX['name']!==fT),B['info']('Extension\x20'+fT+'\x20removed'),this['extensions']['delete'](fT)):B['warn']('Extension\x20'+fT+'\x20directory\x20not\x20found:\x20'+fV);}await this['saveInfo']();}async['importCookies'](fS,fT){const hP=gz;let fU=this['getExtension'](fS);if(!fU)throw Error(hP(0x20c)+fS+'\x20not\x20found');return await fU['context']['cookieStore']['import'](fT,{'removeSource':!0x1});}async['login'](fS,fT={}){const hQ=gz;let fU=this[hQ(0xe7)](fS);fU&&await bd(fU,fT);}async['logout'](fS){const hR=gz;for(let fT of fS){let fU=this[hR(0xe7)](fT);if(!fU)return;B['info']('Logging\x20out...'),await be(fU),B['debug']('Clearing\x20localStorage...'),fU['context']['localStorage']['clear'](),B['debug']('Clearing\x20cookies\x20store...');let fV=await fU['context']['cookieStore']['getAll']();for(let fW of fV)await fU['context']['cookieStore']['delete'](fW);B['info']('Logged\x20out\x20from\x20extension\x20'+fT);}}['list'](){const hS=gz;return Array['from'](this['extensions']['values']())[hS(0x131)](fS=>({'name':fS['package']['name'],'version':fS[hS(0x23c)]['version'],'description':fS['package'][hS(0x148)],'manifest':fS['manifest'],'package':fS['package']}));}};const bZ=(fS,fT)=>!fS||'payload'in fS||'keys'in fS?fS:{...fS,'headers':{...fS['headers'],...fT?.[gz(0xea)]['http']['headers']}},c0=async(fS,fT)=>{const hT=gz;if(!fT)return fS;let fU=await fS['clone']()['arrayBuffer'](),fV=Buffer['from'](fU)['toString']('base64'),fW=fT[hT(0x1ec)]('{{challenge}}',fV);return new Request(fS['url'],{'method':fS[hT(0x1a6)],'headers':fS['headers'],'body':fW});},c1=async fS=>{const hU=gz;let fT=await fS['clone']()['arrayBuffer']();if(fT[0x0]===0x7b){let fU=null;try{fU=JSON['parse'](Buffer['from'](fT)['toString']('utf8'));}catch(fV){B['error']('Can\x27t\x20parse\x20license\x20response\x20as\x20JSON'),B['debug'](fV['message']),B['debug']('Base64\x20response\x20data:\x20'+Buffer['from'](fT)['toString']('base64'));}if(!fU)return fS;try{let fW='CAIS',fX=fW+Buffer['from'](fT)['toString']('utf8')['split']('\x22'+fW)[0x1]['split']('\x22')[0x0],fY=Buffer['from'](fX,'base64');return new Response(fY,{'status':fS['status'],'headers':fS['headers']});}catch{B['error'](hU(0xff)),B['error']('Response:\x20'+JSON['stringify'](fU));}}return fS;},c2=fS=>typeof fS=='string'?[{'sources':[{'url':fS}]}]:Array['isArray'](fS)&&typeof fS[0x0]==gz(0x1d7)?fS['map'](fT=>({'sources':[{'url':fT}]})):Array['isArray'](fS)?fS:fS&&typeof fS=='object'?[fS]:[],c3=fS=>fS['sources']??fS['streams']??[],c4=(fS,fT)=>({'id':fS['id'],'title':fS['title'],'tag':b4(fT),'seasonNumber':fS['seasonNumber']??fS['season'],'episodeNumber':fS['episodeNumber']??fS['episode'],'episodeTitle':fS['episodeTitle']}),c5=async(fS,fT,fU)=>{const hV=gz;let fV=bb(fU);if(typeof fV['getMediaInfo']=='function'){let fY=c2(await fV['getMediaInfo'](fS,fT));if(!fY[hV(0x140)])return B['info']('No\x20metadata\x20found'),[];let fZ=[];for(let g0 of fY){if(typeof fV['refreshMediaInfo']=='function'){let g3=await fV['refreshMediaInfo'](g0,fT);g3&&typeof g3=='object'&&Object['assign'](g0,g3);}let g2=c3(g0);for(let g4 of g2){let g5=typeof g4=='string'?{'url':g4}:g4;fZ['push']({'source':{'url':g5['url'],'headers':g5['headers'],'drm':g5['drm']&&!Array['isArray'](g5['drm'])&&typeof g5[hV(0x16e)]=='object'?{'server':g5['drm']['server']}:void 0x0},'metadata':c4(g0,fU),'drm':g5['drm']&&!Array['isArray'](g5['drm'])&&typeof g5['drm']=='object'?{'server':g5['drm']['server']}:void 0x0});}}return B['info']('Fetching\x20metadata\x20finished'),fZ;}let fW=await fV['fetchContentMetadata']?.(fS,fT);if(!fW?.['length'])return B['info'](hV(0x226)),[];let fX=[];for(let g6 of fW){let g7={...g6},g8;if(!g7['source']&&fU[hV(0xfd)]['fetchContentSource']&&g7['id']){let gc=await fU['exports']['fetchContentSource'](g7['id'],fT);gc&&(g7['source']=gc);}if(!g7[hV(0xf8)]?.['url']){B[hV(0x122)]('Can\x27t\x20find\x20content\x20source');continue;}g7['source']['drm']&&'payload'in g7['source']['drm']&&fU['exports']['fetchContentDrm']&&(g8=g7['source'][hV(0x16e)]['payload'],g7['source']['drm']=void 0x0);let {source:g9,...ga}=g7,gb=bZ(g7['source']['drm'],fU);g9['drm']=gb,g9['headers']={...g9['headers'],...fU['context']['http']['headers']},fU['exports'][hV(0x1dc)]&&(ga['tag']=fU['exports']['tag']),fX['push']({'source':g9,'metadata':ga,'drm':gb,'drmPayload':g8});}return B['info']('Fetching\x20metadata\x20finished'),fX;},c6=async(fS,fT,fU)=>{if(fS['drmPayload']&&fU?.['exports']['fetchContentDrm']){let fW=bZ(await fU['exports']['fetchContentDrm'](fS['drmPayload'],fT),fU);return fS['source']['drm']=fW,fS['drm']=fW,fW;}let fV=bZ(fS['source']['drm']??fS['drm'],fU);return fS['source']['drm']=fV,fS['drm']=fV,fV;},c7=fS=>{let fT=fS['template']?c0:void 0x0,fU=c1,fV=new C();return async({url:fW,data:fX})=>{const hW=b;let fY=new Request(fW,{'body':Buffer['from'](fX),'method':'POST','headers':fS['headers']}),fZ=await fT?.(fY,fS['template'])||fY,g0=await fV['fetch'](fZ['url'],{'body':await fZ['arrayBuffer'](),'headers':fZ[hW(0xda)],'method':fZ['method']}),g2=await fU?.(g0)||g0;return new Uint8Array(await g2['arrayBuffer']());};},c8=new Map(),c9=fS=>{if(!fS)return;let fT=Object['fromEntries'](new Headers(fS)['entries']());return Object['keys'](fT)['length']?fT:void 0x0;},ca=fS=>{let {input:fT,...fU}=fS;return fU;},cb=(fS,fT,fU)=>createHash('sha1')[gz(0xdf)](JSON['stringify']({'extension':fS['package']['name'],'url':fT,'id':fU['id']??null,'title':fU['title']??null,'season':fU['season']??null,'episode':fU['episode']??null}))['digest']('hex'),cc=(fS,fT)=>{const hX=gz;let fU=fS['source']??fS['_rootSource'],fV=fU?.['rootPath'];if(typeof fV!='string'||!fV)return fT??null;let fW=fU?.['_url']instanceof Request?fU['_url']['headers']:void 0x0,fX=fU?.['_options']?.['requestInit']?.[hX(0xda)],fY={...c9(fW),...c9(fX)};return{...fT??{},'url':fV,'headers':Object['keys'](fY)['length']?fY:fT?.['headers']};},cd=(fS,fT)=>{const hY=gz;let fU=fS['id']??fS['details']?.['id'];return{'id':fU==null?void 0x0:String(fU),'title':fS['title'],'tag':b4(fT),'seasonNumber':fS[hY(0x19a)],'episodeNumber':fS['episode'],'episodeTitle':fS['episodeTitle']};},ce=fS=>fS['length']?fS['length']===0x1?fS[0x0]:fS:null,cf=fS=>{let fT;try{fT=new URL(fS);}catch{throw Error('Invalid\x20direct\x20media\x20URL:\x20'+fS);}let fU=fT['pathname']['replace'](/\/+$/,'')['split']('/')['filter'](Boolean)['pop'](),fV=fU?.['split']('.')['slice'](0x0,-0x1)['join']('.')||fU||fT['hostname']||'download';return{'source':{'url':fS},'metadata':{'title':fV}};},cg=async(fS,fT)=>{const hZ=gz;let fU=fT['proxy']||fT[hZ(0x23a)];fU&&(await fS['context']['http']['configure']({'proxyUrl':fU}),await t['configure']({'proxyUrl':fU}));},ch=async(fS,fT,fU)=>{const i0=gz;if(!fU){B['warn']('No\x20suitable\x20extension\x20available.\x20Downloading\x20as\x20a\x20direct\x20link...');let {source:fV,metadata:fW}=cf(fS);return fV[i0(0x1cf)]=fT['languages']?.[0x0],fV['http2']=fT['http2'],{'source':fV,'metadata':fW};}if(await cg(fU,fT),await bc(fU),b9(fU)==='v2'){let fX=bb(fU);B['info']('Resolving\x20media\x20entries...');let fY=await fX['resolveEntries'](fS,fT);if(!fY?.['length'])return B[i0(0x240)]('No\x20metadata\x20found'),null;let fZ=fY['map'](g0=>{let g2=g0,g3=ca(g0),g4=g0['input']?cb(fU,fS,g2):void 0x0;g4&&g0['input']&&c8['set'](g4,g0['input']);let g5=g0['input']?cc(g0['input']):null;return{'source':g5??{'url':fS},'metadata':cd(g3,fU),'extension':{'api':'v2','entry':g3,'cacheKey':g4,'hasResolvedSource':!!g5}};});return B['info']('Resolving\x20media\x20entries\x20finished'),ce(fZ);}return B['info']('Fetching\x20content\x20metadata...'),ce(await c5(fS,fT,fU));},ci=async({resource:fS,url:fT,options:fU,extension:fV})=>{const i1=gz;if(!fV||!fS['extension']||fS['extension']['api']!=='v2'||b9(fV)!=='v2')return{'source':fS['source']};await cg(fV,fU),await bc(fV);let fW=bb(fV),fX=fS['extension']['entry'],fY=fS['extension']['cacheKey']?c8['get'](fS['extension'][i1(0xf6)]):void 0x0;if(!fY&&typeof fW['resolveMedia']=='function'&&(fY=await fW['resolveMedia'](fT,fU,fX)??void 0x0,fY&&fS['extension']['cacheKey']&&c8['set'](fS['extension']['cacheKey'],fY)),!fY){if(fS['extension'][i1(0x208)])return{'source':fS['source'],'entry':fX};throw Error('Extension\x20'+fV['package']['name']+'\x20could\x20not\x20materialize\x20media\x20entry.\x20Provide\x20resolveMedia()\x20or\x20an\x20inline\x20input\x20rooted\x20in\x20UrlSource.');}return{'source':cc(fY,fS['source'])??fS['source'],'input':fY,'entry':fX};},cj=async(fS,fT,fU)=>c6(fS,fT,fU);var ck=class{#e=[];#t=new Set();#n=new Map();#r=new Map();#i=new Set();get['activeRunCount'](){return this.#r['size'];}get['queuedCount'](){const i2=gz;return this.#e[i2(0x140)];}['getActiveRun'](fS){const i3=gz;return this.#r[i3(0x207)](fS);}['setActiveRun'](fS,fT){this.#r['set'](fS,fT);}['deleteActiveRun'](fS){this.#r['delete'](fS);}['getActiveJob'](fS){return this.#n['get'](fS);}['setActiveJob'](fS){this.#n['set'](fS['id'],fS);}[gz(0x223)](fS){const i4=gz;this.#n[i4(0x1a7)](fS);}['queueResumeAfterStop'](fS){this.#i['add'](fS);}['consumeResumeAfterStop'](fS){const i5=gz;let fT=this.#i[i5(0x1db)](fS);return fT&&this.#i['delete'](fS),fT;}['enqueue'](fS){const i6=gz;this.#t[i6(0x1db)](fS['id'])||this.#r['has'](fS['id'])||(this.#e['push'](fS['id']),this.#t['add'](fS['id']));}['dequeue'](fS){const i7=gz;if(!this.#t['has'](fS))return!0x1;let fT=this.#e['indexOf'](fS);return fT!==-0x1&&this.#e['splice'](fT,0x1),this.#t[i7(0x1a7)](fS),!0x0;}['dequeueNext'](fS){for(;this.#e['length']>0x0;){let fT=this.#e['shift']();if(!fT)return;this.#t['delete'](fT);let fU=fS(fT);if(fU&&fU['status']==='queued')return fU;}}};const cl=['code','errno','syscall','address','port','host','hostname','path','type'],cm=fS=>typeof fS=='object'&&!!fS&&'status'in fS&&'statusText'in fS&&'url'in fS,cn=fS=>{let fT=[],fU=fS;for(let fV of cl){let fW=fU[fV];fW==null||fW===''||fT['push'](fV+'='+String(fW));}return fT;},co=(fS,fT=0x0)=>{const i8=gz;if(fT>0x3)return'[max-depth]';if(fS instanceof Error){let fU=cn(fS),fV='cause'in fS?fS['cause']:void 0x0,fW=[fS['name']+':\x20'+fS['message']];return fU[i8(0x140)]&&fW['push']('details='+fU['join'](',\x20')),fV!==void 0x0&&fV!==fS&&fW['push']('cause='+co(fV,fT+0x1)),fW['join']('\x20|\x20');}return cm(fS)?i8(0x146)+fS['status']+'\x20'+fS['statusText']+i8(0x194)+fS['url']:inspect(fS,{'depth':0x2,'breakLength':0x1/0x0});},cp=(fS,fT)=>{B['debug'](fS+':\x20'+co(fT)),fT instanceof Error&&fT['stack']&&B['debug'](fT['stack']);},cq=(fS,fT)=>{const i9=gz;let fU=fT+'\x20∙\x20';return fS['type']==='subtitle'?fU+='SUBTITLES':fU+=fS['type']?.['toUpperCase'](),fS['type']==='video'&&(fS['width']&&(fU+='\x20∙\x20'+fS['width']+'x'+fS['height']),fS['bitrate']&&(fU+='\x20∙\x20'+Math['round'](fS['bitrate']/0x3e8)+'\x20KiB/s')),fS['type']==='audio'&&(fS[i9(0xd5)]&&(fU+='\x20∙\x20'+fS['languageCode']['toUpperCase']()),fS['name']&&(fU+='\x20('+fS['name']+')'),fS['sampleRate']&&(fU+='\x20∙\x20'+fS['sampleRate']+i9(0xf1)),fS['bitrate']&&(fU+='\x20∙\x20'+Math['round'](fS['bitrate']/0x3e8)+'\x20KiB/s')),fS['type']==='subtitle'&&(fS['languageCode']&&(fU+='\x20∙\x20'+fS['languageCode']['toUpperCase']()),fS['name']&&(fU+='\x20('+fS['name']+')'),fS['forced']&&(fU+=i9(0xdc))),fU;},cr=fS=>fS['id'],cs=fS=>{const ia=gz;let fT=new Map();for(let fU of fS){let fV=cr(fU),fW=fT['get'](fV);if(fW){fW['push'](fU);continue;}fT['set'](fV,[fU]);}return Array['from'](fT['entries']())['filter'](([,fX])=>fX[ia(0x140)]>0x1);},ct=fS=>{const ib=gz;let fT=cs(fS);if(!fT['length'])return;let fU=fT[ib(0x131)](([fV,fW])=>fV+'\x20('+fW['length']+'\x20copies)')['join'](',\x20');throw Object['assign'](Error('Duplicate\x20tracks\x20selected:\x20'+fU),{'code':'DUPLICATE_TRACKS_SELECTED'});},cu=fS=>{if(!fS||typeof fS!='object'||!('code'in fS))return;let fT=fS['code'];return typeof fT=='string'?fT:void 0x0;};var cv=class extends Error{['code'];constructor(fS,fT=fS,fU){super(fT,fU),this['name']='DownloaderError',this['code']=fS;}};const cw=(fS,fT='DOWNLOAD_FAILED')=>{if(fS instanceof cv||fS instanceof Error&&fS['name']==='AbortError')return fS;if(fS instanceof Error){let fU=new cv(cu(fS)??fT,fS['message'],{'cause':fS});return fS['stack']&&(fU['stack']=fS['stack']),fU;}return new cv(fT,typeof fS=='string'?fS:'Unknown\x20error');},cx=fS=>{const ic=gz;let fT=fS['replace'](/[<>:"/\\|?*\x00-\x1F]/g,'');fT=fT['replace'](/^[\s.]+|[\s.]+$/g,''),fT=fT['replace'](/\s+/g,'\x20');let fU=fT['lastIndexOf']('.'),fV=fU>0x0,fW=fV?fT['slice'](fU):'',fX=fV?fT['slice'](0x0,fU):fT;if(fW['length']>=0xff)fT=fT['slice'](0x0,0xff);else{let fZ=0xff-fW['length'];fX['length']>fZ&&(fX=fX[ic(0x16c)](0x0,fZ)),fT=fX+fW;}let fY=/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i;if(fW['length']<0xff){let g0=fT['lastIndexOf']('.'),g2=g0>0x0;if(fW=g2?fT['slice'](g0):'',fX=g2?fT[ic(0x16c)](0x0,g0):fT,fY['test'](fX)){let g3=0xff-fW['length'];fT=('_'+fX)['slice'](0x0,g3)+fW;}}return fT[ic(0x140)]===0x0?'untitled':fT;},cy=(fS,fT)=>Object['keys'](fT)['reduce']((fU,fV)=>{let fW='{'+fV+'}',fX=fT[fV];if(!fX){let fY=RegExp('(?:\x5c.|^)\x5c{'+fV+'\x5c}(?=\x5c.|$)|\x5c{'+fV+'\x5c}(\x5c.|$)|\x5c{'+fV+'\x5c}','g');return fU['replace'](fY,(fZ,g0)=>'')['replaceAll']('....','...');}return fU['replaceAll'](fW,fX);},fS)['replaceAll']('\x20\x20','\x20'),cz=fS=>typeof fS=='string'&&fS['trim']()||'mp4',cA=fS=>{let fT='seasonNumber'in fS?''+fS['seasonNumber']:'',fU='episodeNumber'in fS?''+fS['episodeNumber']:'',fV=fT?'S'+fT:'',fW=fU?'E'+fU:'',fX=fT&&fU?fV+':'+fW:'',fY='episodeTitle'in fS&&fS['episodeTitle']?.['trim']()?'\x22'+fS['episodeTitle']+'\x22':'';return{'title':((fS['title']??'')+'\x20'+fX+'\x20'+fY)['trim']()};},cB=({settings:fS,options:fT,source:fU,meta:fV,allTracks:fW})=>{const id=gz;let fX=fV[id(0x1eb)],fY=fV['tag'],fZ='seasonNumber'in fV?fV['seasonNumber']:void 0x0,g0='episodeNumber'in fV?fV['episodeNumber']:void 0x0,g2='episodeTitle'in fV?fV['episodeTitle']:'',g3=fW['find'](ga=>ga['type']==='video')?.['codec']??'',g4=fS['get']('downloadDir'),g5=fT['movieTemplate']||fS['get']('movieFilenameTemplate'),g6=fT['episodeTemplate']||fS['get']('seriesFilenameTemplate'),g7=cx(cy(g0?g6:g5,{'title':fX??'','s':fZ?fZ['toString']()['padStart'](0x2,'0'):'','e':g0?g0['toString']()['padStart'](0x2,'0'):'','quality':fT['videoQuality']??'','codec':g3,'tag':fY??'','episodeTitle':g2??'','audioType':fU['audioType']?fU['audioType']['toUpperCase']():'','format':'WEB-DL'}))+'.'+cz(fT['format']||fS['get']('videoContainerFormat')),g8=fT['outputPath']||join(g4,g7),g9=parse(g8);return{'downloadDir':g4,'outputPath':g8,'resolvedFilenameWithoutExtension':g9[id(0x1bf)],'filenameWithExtension':g9['base'],'outputDirectory':g9['dir']||g4,'downloadMetadata':cA(fV)};},cC=async(fS,fT,fU)=>fU??open(fS,fT),cD=fS=>{let fT=null;return new StreamSource({'getSize':async()=>(fT=await cC(fS,'r',fT),(await fT['stat']())['size']),'read':async(fU,fV)=>{const ie=b;fT=await cC(fS,'r',fT);let fW=new Uint8Array(fV-fU);return await fT[ie(0xf3)](fW,0x0,fV-fU,fU),fW;},'dispose':async()=>{const ig=b;let fU=fT;fT=null,await fU?.[ig(0x202)]();},'prefetchProfile':'fileSystem'});},cE=fS=>{let fT=null;return new StreamTarget(new WritableStream({'start':async()=>{fT=await cC(fS,'w',fT);},'write':async fU=>{if(!fT)throw Error('MediaBunny\x20output\x20handle\x20was\x20not\x20initialized\x20for\x20'+fS);await fT['write'](fU['data'],0x0,fU['data']['byteLength'],fU['position']);},'close':async()=>{let fU=fT;fT=null,await fU?.['close']();},'abort':async()=>{let fU=fT;fT=null,await fU?.['close']();}}),{'chunked':!0x0});},cF=async(fS,fT)=>{let fU=new V({'formats':U,'source':fS['startsWith']('https')?new W(fS,{'requestInit':{'headers':fT}}):cD(fS)});return{'tracks':await fU['getTracks'](),'primaryVideoTrack':await fU['getPrimaryVideoTrack'](),'primaryAudioTrack':await fU['getPrimaryAudioTrack']()};},cG=[...DASH_FORMATS,...HLS_FORMATS],cH=new Set(['authorization',gz(0x114),'set-cookie','api-key']),cI=fS=>Object['fromEntries'](Object[gz(0x1da)](fS)['map'](fT=>[fT,cH['has'](fT['toLowerCase']())?'[REDACTED]':fS[fT]])),cJ=fS=>fS==='mpd'?DASH_FORMATS:fS===gz(0x219)?HLS_FORMATS:cG,cK=({http:fS,source:fT,detection:fU})=>(B['debug']('Fetching\x20manifest...'),B['debug'](fT['url']),fT[gz(0xda)]&&B['debug'](JSON['stringify'](cI(fT[gz(0xda)]))),new Input({'source':new UrlSource(fT['url'],{'requestInit':{'headers':fT['headers']},'fetchFn':fS[gz(0x156)]['bind'](fS)}),'formats':cJ(fU['kind'])})),cL=fS=>createHash('sha1')['update'](fS)['digest']('hex'),cM=(fS,fT)=>{const ih=gz;if(fS)switch(fS){case'aar':case'abk':return'rus';case'ave':return'eng';case'zu':return fT?.['includes'](ih(0x1f1))?'ru':'zu';default:return fS;}},cN=({origin:fS,type:fT,sourceUrl:fU,languageCode:fV,name:fW,codec:fX})=>fS+':'+fT+':'+cL([fU??'',fV??'',fW??'',fX??'']['join']('|')),cO=async(fS,fT)=>{const ii=gz;let [fU,fV,fW,fX,fY,fZ]=await Promise['all']([fS[ii(0x14f)](),fS['getBitrate'](),fS['getLanguageCode'](),fS['getName'](),fS['getDisposition'](),fS['hasOnlyKeyPackets']()]),g0={'id':'manifest:'+fS['type']+':'+fS['id'],'origin':ii(0x110),'type':fS['type'],'codec':fU,'bitrate':fV,'languageCode':cM(fW,fT),'name':fX,'forced':fY['forced'],'hearingImpaired':fY['hearingImpaired'],'visuallyImpaired':fY['visuallyImpaired'],'isDefault':fY['default'],'isIFrameOnly':fZ,'inputTrack':fS};if(fS['isVideoTrack']()){let [g2,g3]=await Promise['all']([fS['getDisplayWidth'](),fS['getDisplayHeight']()]);g0['width']=g2,g0['height']=g3;}if(fS['isAudioTrack']()){let [g4,g5]=await Promise['all']([fS['getNumberOfChannels'](),fS['getSampleRate']()]);g0['numberOfChannels']=g4,g0[ii(0x175)]=g5;}return g0;},cP=async fS=>fS['segments']?fS['segments']:fS['inputTrack']?(fS['segmentsPromise']??=fS[gz(0x20f)]['getSegments']()[gz(0x188)](fT=>(fS['segments']=fT,fS['segmentCount']=fT['length'],fT)),fS['segmentsPromise']):(fS['segments']=[],fS['segmentCount']=0x0,fS['segments']),cQ=(fS,fT)=>{let fU=fS['filter'](fV=>fT['some'](fW=>fW===fV['codec']));return fU['length']?fU:fS['toSorted']((fV,fW)=>(fW['bitrate']??0x0)-(fV['bitrate']??0x0));},cR=(fS,fT)=>{let fU=fT?parseInt(String(fT),0xa)*0x10/0x9:void 0x0,fV=fS['toSorted']((fY,fZ)=>(fZ['bitrate']??0x0)-(fY['bitrate']??0x0));if(!fT)return fV;let fW=fS['filter'](fY=>Number(fY['height'])===Number(fT));if(fW['length'])return fW;let fX=fS['filter'](fY=>Number(fY['width'])===Number(fU));return fX['length']?fX:fV;},cS=(fS,fT)=>fS[gz(0x201)](fU=>fU['numberOfChannels']===Number(fT)),cT=fS=>fS?.['trim']()['toLowerCase']()??'',cU=fS=>cT(fS)['slice'](0x0,0x2),cV=fS=>cT(fS)||'und',cW=(fS,fT)=>{let fU=cT(fS),fV=cT(fT);return!fU||!fV?!0x1:fU===fV||fU['startsWith'](fV+'-')?!0x0:cU(fU)===cU(fV);},cX=fS=>Array['from'](new Map(fS['map'](fT=>cT(fT))['filter'](Boolean)['map'](fT=>[cU(fT),fT]))['values']()),cY=(fS,fT)=>{const ij=gz;let fU=new Map();for(let fV of fS){let fW=cV(fV[ij(0xd5)]),fX=fU['get'](fW);if(!fX){fU['set'](fW,[fV]);continue;}fX['length']<fT&&fX['push'](fV);}return Array['from'](fU['values']())['flat']();},cZ=(fS,fT,fU=0x1)=>{let fV=fS['toSorted']((fZ,g0)=>(g0['bitrate']??0x0)-(fZ['bitrate']??0x0)),fW=cX(fT),fX=[];for(let fZ of fW){let g0=fV['filter'](g2=>cW(g2['languageCode'],fZ));g0['length']&&fX['push'](...cY(g0,fU));}let fY=cX(fS['map'](g2=>g2['languageCode']||'und'));if(!fX['length'])for(let g2 of fY){let g3=fV['filter'](g4=>cW(g4['languageCode']??'und',g2));g3['length']&&fX['push'](...cY(g3,fU));}return fX;},d0=(fS,fT)=>{const ik=gz;if(!fT?.['inputTrack'])return fS;let fU=fT['inputTrack'],fV=fS['filter'](fW=>fW[ik(0x20f)]?fW['inputTrack']['canBePairedWith'](fU):!0x0);return fV['length']?fV:fS;},d1=fS=>(fS??0x0)/0x3e8,d2=async fS=>{const il=gz;if(typeof fS['segmentCount']=='number')return fS[il(0x191)]+'\x20Segments';if(!fS['inputTrack'])return il(0x182);try{return(await cP(fS))['length']+'\x20Segments';}catch{return'?\x20Segments';}},d3=({videos:fS,audios:fT,subtitles:fU})=>({'videos':fS,'audios':fT,'subtitles':fU,'all':[...fS,...fT,...fU]});async function d4(fS,fT,fU){const im=gz;let fV=fT['videoQuality'],fW=fS['filter'](g8=>g8['type']==='video'&&!g8['isIFrameOnly']),fX=fS['filter'](g8=>g8[im(0x168)]==='audio'),fY=fS['filter'](g8=>g8['type']==='subtitle');if(fT['select']){let g8=await Promise['all'](fW['map'](async(gg,gh)=>({'name':(gg['width']??'?')+'x'+(gg['height']??'?')+'\x20|\x20'+(d1(gg['bitrate'])||'?')+'\x20Kbps\x20|\x20'+(gg['codec']??'?')+'\x20|\x20'+await d2(gg),'value':gg['id'],'checked':gh===0x0}))),g9=fW['length']?await checkbox({'message':'Select\x20video\x20streams','pageSize':0xc,'choices':g8,'loop':!0x1}):[],ga=fW[im(0x201)](gg=>g9['includes'](gg['id'])),gb=await Promise['all'](fX['map'](async(gg,gh)=>({'name':''+(gg['name']?gg['name']+'\x20|\x20':'')+(d1(gg['bitrate'])||'?')+'\x20Kbps\x20|\x20'+(gg['codec']?gg['codec']+'\x20|\x20':'')+(gg['languageCode']||'und')+'\x20|\x20'+(gg['numberOfChannels']??'?')+'CH\x20|\x20'+await d2(gg),'value':gg['id'],'checked':gh===0x0}))),gc=fX['length']?await checkbox({'message':'Select\x20audio\x20streams','pageSize':0xc,'choices':gb,'loop':!0x1}):[],gd=fX['filter'](gg=>gc['includes'](gg['id'])),ge=await Promise['all'](fY['map'](async(gg,gh)=>({'name':(gg['codec']??'?')+'\x20|\x20'+(gg['languageCode']||'und')+'\x20|\x20'+await d2(gg),'value':gg['id'],'checked':gh===0x0}))),gf=fY['length']?await checkbox({'message':'Select\x20subtitles','pageSize':0xc,'choices':ge,'loop':!0x1}):[];return d3({'videos':ga,'audios':gd,'subtitles':fY['filter'](gg=>gf['includes'](gg['id']))});}fT['videoCodecs']&&(fW=cQ(fW,fT[im(0x1d8)])),fW=cR(fW,fV||NaN);let fZ=fW[0x0],g0=[...fT['languages']||[]],g2=fU['audioLanguage']?.['slice'](0x0,0x2);!g0['length']&&g2&&g0['push'](g2);let g3=d0(fX,fZ);fT['audioChannels']&&(g3=cS(g3,fT['audioChannels'])),fT['audioCodecs']&&(g3=cQ(g3,fT['audioCodecs']));let g4=cZ(g3,g0,0x1);g4['length']&&(g3=g4);let g5=g0['at'](-0x1),g6=g5?g3['map'](gg=>!gg['languageCode']||gg['languageCode']==='und'?{...gg,'languageCode':g5}:gg):g3,g7=fY['filter'](gg=>fT[im(0x173)]?.['length']?fT['subtitleLanguages']['some'](gh=>cW(gg['languageCode']||'und',gh)):!0x1);return d3({'videos':fT['skipVideo']||!fZ?[]:[fZ],'audios':fT['skipAudio']?[]:g6,'subtitles':fT['skipSubtitles']?[]:g7});}const d5=()=>({'videos':[],'audios':[],'subtitles':[],'all':[]}),d6={'aac':'aac','mp4a':'aac','mp4a.40.2':'aac','ac3':'ac3','ac-3':'ac3','eac3':'eac3','ec-3':'eac3','opus':'opus','vorbis':gz(0x236),'flac':'flac'},d7=fS=>{if(!fS)return null;try{return new URL(fS);}catch{return null;}},d8=fS=>{const io=gz;let fT=d7(fS);if(fT)try{return decodeURIComponent(fT['pathname']);}catch{return fT[io(0x1b3)];}},d9=fS=>{if(!fS)return'aac';let fT=fS['toLowerCase']();return d6[fT]??d6[fT['split']('.')[0x0]??'']??'aac';},da=(fS,fT)=>fS['filter'](fU=>fU['type']===fT)['length'],db=fS=>{let fT='Extracted,\x20there\x20are\x20';if(fS['length']===0x0)fT+='no\x20tracks';else{fT+=fS['length']+'\x20tracks';let fU=da(fS,'video');fU&&(fT+=',\x20'+fU+'\x20video\x20tracks');let fV=da(fS,'audio');fV&&(fT+=',\x20'+fV+'\x20audio\x20tracks');let fW=da(fS,'subtitle');fW&&(fT+=',\x20'+fW+'\x20subtitle\x20tracks');}B['info'](fT);},dc=(fS,fT=[])=>{const ip=gz;let fU=[...fT];for(let fV of fS['subtitles']??[]){let fW=d8(fV[ip(0x22b)]),fX=cM(fV['language'],fS['url']);fU['some'](fY=>{let fZ=d8(fY['sourceUrl']);return!fW||!fZ?!0x1:fW===fZ;})||fU['push']({'id':cN({'origin':'external-subtitle','type':'subtitle','sourceUrl':fV['url'],'languageCode':fX,'name':fV['label']||fV[ip(0x1eb)],'codec':fV['format']}),'origin':'external-subtitle','type':ip(0x16b),'sourceUrl':fV['url'],'languageCode':fX,'codec':fV['format'],'forced':fV['forced'],'name':fV['label']||fV['title']});}return fU;},dd=async({options:fS,source:fT,meta:fU,detection:fV})=>{const iq=gz;let fW={...fS},fX={...fU};if(!fX['title']){let g5=d7(fT['url'])?.['pathname']['split']('/')['pop']();g5&&(fX['title']=g5);}let {primaryVideoTrack:fY,primaryAudioTrack:fZ}=await cF(fT['url'],fT[iq(0xda)]),g0=await fY?.['getCodec'](),g2=await fY?.['getCodedWidth'](),g3=await fY?.['getCodedHeight']();fW['videoQuality']||=g3?g3+'p':void 0x0;let g4=d5();if(g4['subtitles']=dc(fT),g4['all']['push'](...g4['subtitles']),fV['isAudio']&&!fW['skipAudio']){let g6={'id':cN({'origin':'progressive','type':'audio','sourceUrl':fT['url'],'languageCode':fT['audioLanguage'],'codec':await fZ?.[iq(0x14f)]()}),'origin':'progressive','type':'audio','codec':d9(await fZ?.['getCodec']()),'languageCode':cM(await fZ?.['getLanguageCode'](),fT['url'])??cM(fT['audioLanguage'],fT[iq(0x22b)])??'und','numberOfChannels':await fZ?.['getNumberOfChannels'](),'sampleRate':await fZ?.['getSampleRate'](),'sourceUrl':fT['url']};return g4['audios']['push'](g6),g4['all']['push'](g6),{'options':fW,'source':fT,'meta':fX,'allTracks':[g6],'tracks':g4};}if(!fW[iq(0x1c5)]){let g7=parseInt((fW['videoQuality']??'')['replace']('p',''),0xa),g8={'id':cN({'origin':'progressive','type':'video','sourceUrl':fT['url'],'codec':g0}),'origin':'progressive','type':'video','codec':g0??'avc','width':g2??void 0x0,'height':g3??(g7||void 0x0),'sourceUrl':fT['url']};return g4['videos']['push'](g8),g4['all']['push'](g8),{'options':fW,'source':fT,'meta':fX,'allTracks':[g8],'tracks':g4};}return{'options':fW,'source':fT,'meta':fX,'allTracks':[],'tracks':g4};},de=async({options:fS,source:fT,meta:fU,input:fV,disposeInput:fW=!0x0})=>{const ir=gz;let fX={...fS},fY={...fU},fZ=fW;try{let g0=await fV[ir(0x1e2)]();if(!g0['length'])throw new cv('MANIFEST_PARSE_FAILED','Failed\x20to\x20parse\x20manifest');let g2=await Promise['all'](g0[ir(0x131)](g5=>cO(g5,fT['url'])));db(g2);let g3=await d4(g2,fX,fT),g4=g3['videos'][0x0]?.['height'];if(g4&&(fX['videoQuality']=g4+'p'),!fY['title']){let g5=d7(fT['url'])?.['host'];g5&&(fY['title']=g5+'_'+A());}return fZ=!0x1,{'options':fX,'source':fT,'meta':fY,'allTracks':g2,'tracks':g3,'dispose':fW?()=>fV['dispose']?.():void 0x0};}finally{fZ&&fV['dispose']?.();}},df=async({http:fS,options:fT,source:fU,meta:fV,detection:fW})=>de({'options':fT,'source':fU,'meta':fV,'input':cK({'http':fS,'source':fU,'detection':fW})}),dg=async({http:fS,options:fT,source:fU,meta:fV,input:fW,detection:fX})=>fW?de({'options':fT,'source':fU,'meta':fV,'input':fW,'disposeInput':!0x1}):fX['strategy']==='progressive'?dd({'options':fT,'source':fU,'meta':fV,'detection':fX}):df({'http':fS,'options':fT,'source':fU,'meta':fV,'detection':fX}),dh=(fS,fT)=>{const is=gz;try{let fU=new URL(fS);return fU[is(0x1b3)]['endsWith'](fT)||fU['search']['endsWith'](fT);}catch{return!0x1;}},di=async(fS,fT)=>{const it=gz;let fU=dh(fT['url'],'.m3u8'),fV=dh(fT['url'],'.mpd'),fW=dh(fT[it(0x22b)],'.mp4'),fX=dh(fT['url'],'.mov'),fY=!0x1,fZ=!0x1;if(!fU&&!fV&&!fW&&!fX)try{let g0=await fS['fetch'](fT['url'],{'method':'HEAD','headers':fT['headers']});if(!g0['ok'])B['warn']('HEAD\x20request\x20for\x20'+fT['url']+'\x20returned\x20'+g0['status']+'\x20'+g0['statusText']);else{let g2=g0['headers']['get']('content-type');fY=!!g2?.[it(0x15b)]('audio'),fZ=!!g2?.['includes']('video');}}catch(g3){let g4=g3 instanceof Error?g3['message']:String(g3);B['warn']('HEAD\x20request\x20failed\x20for\x20'+fT['url']+':\x20'+g4);}return fV?{'strategy':'manifest','kind':'mpd','isAudio':fY,'isVideo':fZ,'matchedContentLabel':'Dynamic\x20Adaptive\x20Streaming\x20over\x20HTTP'}:fU?{'strategy':'manifest','kind':'m3u8','isAudio':fY,'isVideo':fZ,'matchedContentLabel':'HTTP\x20Live\x20Streaming'}:fY||fZ||fW||fX?{'strategy':'progressive','kind':'progressive','isAudio':fY,'isVideo':fZ,'matchedContentLabel':'Progressive\x20Stream'}:{'strategy':'manifest','kind':'unknown','isAudio':fY,'isVideo':fZ};};var dj=a6((fS,fT)=>{function fU(fV){var fW=new fV(),fX=fW;function fY(){var g0=fW;return g0['next']?fW=g0['next']:(fW=new fV(),fX=fW),g0['next']=null,g0;}function fZ(g0){const iu=b;fX[iu(0x153)]=g0,fX=g0;}return{'get':fY,'release':fZ};}fT['exports']=fU;}),dk=a6((fS,fT)=>{var fU=dj();function fV(fZ,g0,g2){if(typeof fZ=='function'&&(g2=g0,g0=fZ,fZ=null),!(g2>=0x1))throw Error('fastqueue\x20concurrency\x20must\x20be\x20equal\x20to\x20or\x20greater\x20than\x201');var g3=fU(fX),g4=null,g5=null,g6=0x0,g7=null,g8={'push':gf,'drain':fW,'saturated':fW,'pause':ga,'paused':!0x1,get 'concurrency'(){return g2;},set 'concurrency'(gm){if(!(gm>=0x1))throw Error('fastqueue\x20concurrency\x20must\x20be\x20equal\x20to\x20or\x20greater\x20than\x201');if(g2=gm,!g8['paused']){for(;g4&&g6<g2;)g6++,gh();}},'running':g9,'resume':gd,'idle':ge,'length':gb,'getQueue':gc,'unshift':gg,'empty':fW,'kill':gi,'killAndDrain':gj,'error':gl,'abort':gk};return g8;function g9(){return g6;}function ga(){g8['paused']=!0x0;}function gb(){for(var gm=g4,gn=0x0;gm;)gm=gm['next'],gn++;return gn;}function gc(){for(var gm=g4,gn=[];gm;)gn['push'](gm['value']),gm=gm['next'];return gn;}function gd(){if(g8['paused']){if(g8['paused']=!0x1,g4===null){g6++,gh();return;}for(;g4&&g6<g2;)g6++,gh();}}function ge(){return g6===0x0&&g8['length']()===0x0;}function gf(gm,gn){var go=g3['get']();go['context']=fZ,go['release']=gh,go['value']=gm,go['callback']=gn||fW,go['errorHandler']=g7,g6>=g2||g8['paused']?g5?(g5['next']=go,g5=go):(g4=go,g5=go,g8['saturated']()):(g6++,g0['call'](fZ,go['value'],go['worked']));}function gg(gm,gn){var go=g3['get']();go['context']=fZ,go['release']=gh,go['value']=gm,go['callback']=gn||fW,go['errorHandler']=g7,g6>=g2||g8['paused']?g4?(go['next']=g4,g4=go):(g4=go,g5=go,g8['saturated']()):(g6++,g0['call'](fZ,go['value'],go['worked']));}function gh(gm){const iv=b;gm&&g3['release'](gm);var gn=g4;gn&&g6<=g2?g8['paused']?g6--:(g5===g4&&(g5=null),g4=gn['next'],gn[iv(0x153)]=null,g0['call'](fZ,gn['value'],gn['worked']),g5===null&&g8['empty']()):--g6===0x0&&g8['drain']();}function gi(){g4=null,g5=null,g8['drain']=fW;}function gj(){g4=null,g5=null,g8['drain'](),g8['drain']=fW;}function gk(){var gm=g4;for(g4=null,g5=null;gm;){var gn=gm['next'],go=gm['callback'],gp=gm['errorHandler'],gq=gm['value'],gr=gm['context'];gm['value']=null,gm['callback']=fW,gm['errorHandler']=null,gp&&gp(Error('abort'),gq),go['call'](gr,Error('abort')),gm['release'](gm),gm=gn;}g8['drain']=fW;}function gl(gm){g7=gm;}}function fW(){}function fX(){this['value']=null,this['callback']=fW,this['next']=null,this['release']=fW,this['context']=null,this['errorHandler']=null;var fZ=this;this['worked']=function(g0,g2){var g3=fZ['callback'],g4=fZ['errorHandler'],g5=fZ['value'];fZ['value']=null,fZ['callback']=fW,fZ['errorHandler']&&g4(g0,g5),g3['call'](fZ['context'],g0,g2),fZ['release'](fZ);};}function fY(fZ,g0,g2){const iw=b;typeof fZ=='function'&&(g2=g0,g0=fZ,fZ=null);function g3(ga,gb){g0['call'](this,ga)['then'](function(gc){gb(null,gc);},gb);}var g4=fV(fZ,g3,g2),g5=g4['push'],g6=g4[iw(0xf4)];return g4['push']=g7,g4['unshift']=g8,g4['drained']=g9,g4;function g7(ga){var gb=new Promise(function(gc,gd){g5(ga,function(ge,gf){if(ge){gd(ge);return;}gc(gf);});});return gb['catch'](fW),gb;}function g8(ga){const ix=iw;var gb=new Promise(function(gc,gd){g6(ga,function(ge,gf){if(ge){gd(ge);return;}gc(gf);});});return gb[ix(0x222)](fW),gb;}function g9(){return new Promise(function(ga){process['nextTick'](function(){if(g4['idle']())ga();else{var gb=g4['drain'];g4['drain']=function(){typeof gb=='function'&&gb(),ga(),g4['drain']=gb;};}});});}}fT['exports']=fV,fT['exports']['promise']=fY;}),dl=a8(dk(),0x1);const dm=0x493e0,dn=(fS={})=>{const iy=gz;let fT=fS['maxRetries']??0x5,{proxy:fU}=fS,fV=fU?new ProxyAgent({'uri':fU,'allowH2':!0x0}):new Agent({'allowH2':!0x0}),fW=T['create']({'fetch':fS['fetch'],'dispatcher':fV,'proxy':fU,'timeout':dm,'retry':{'limit':fT,'methods':['get',iy(0x1ba)],'statusCodes':[0x198,0x19d,0x1ad,0x1f4,0x1f6,0x1f7,0x1f8],'backoffLimit':0x7530},'throwHttpErrors':!0x0,'redirect':'follow','headers':{'user-agent':'Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/127.0.0.0\x20Safari/537.36'}});return Object['assign'](fW,{'close':async()=>{const iz=iy;fV[iz(0xc9)]||fV['destroyed']||await fV['close']();},'destroy':async fX=>{fV['destroyed']||await fV['destroy'](fX);}});},dp=fS=>new Promise(fT=>setTimeout(fT,fS)),dq=async(fS,fT)=>{const iA=gz;let fU=await Q[iA(0x118)](fT)['catch'](()=>null);(!fU||!fU['isDirectory']())&&await Q[iA(0x1ab)](fT,{'recursive':!0x0});let fV=dr(fS,fT),fW=await Q['stat'](fV)['catch'](()=>null);return(!fW||!fW['isDirectory']())&&await Q['mkdir'](fV,{'recursive':!0x0}),fV;},dr=(fS,fT)=>{const iB=gz;let fU=M[iB(0x183)](fS),fV=M['parse'](fS)['name'],fW=createHash(iB(0x1ac))['update'](fU)['digest']('hex')[iB(0x16c)](0x0,0xa);return M['join'](fT,fV+'-'+fW);},ds=async fS=>{let fT=M['dirname'](fS),fU=M['resolve'](fT);M['parse'](fU)['root']!==fU&&(await Q['stat'](fT)['then'](()=>!0x0)['catch'](()=>!0x1)||await Q['mkdir'](fT,{'recursive':!0x0}));},dt=async(...fS)=>{const iC=gz;let fT=[];for(let fU of fS)fU&&fT['push'](Q['rm'](fU,{'recursive':!0x0,'force':!0x0})['catch'](()=>void 0x0));await Promise[iC(0x126)](fT);},du=fS=>fS+'.part.json',dv=fS=>{if(fS['filePath'])return fS['filePath'];if(fS['output'])return du(fS['output']);throw Error('Either\x20output\x20or\x20filePath\x20is\x20required\x20for\x20FileResumeStore');},dw=fS=>{if(!fS||typeof fS!='object')return!0x1;let fT='code'in fS?fS['code']:void 0x0;return fT==='EPERM'||fT==='EACCES'||fT==='EBUSY';},dx=async(fS,fT)=>{const iD=gz;let fU=R[iD(0x139)]==='win32'?[0x0,0x32,0x96,0x12c,0x1f4]:[0x0],fV;for(let fW of fU){fW>0x0&&await dp(fW);try{await Q['rename'](fS,fT);return;}catch(fX){if(fV=fX,!dw(fX))break;await Q['rm'](fT,{'force':!0x0})['catch'](()=>void 0x0);try{await Q['rename'](fS,fT);return;}catch(fY){if(fV=fY,!dw(fY))break;}}}throw fV;};var dy=class{async['get'](fS){const iE=gz;let fT=dv(fS);if(!await Q['stat'](fT)['then'](()=>!0x0)['catch'](()=>!0x1))return null;try{let fU=await Q['readFile'](fT,iE(0x20b));return JSON['parse'](fU);}catch{return null;}}async['set'](fS,fT){let fU=dv(fS);await ds(fU);let fV=fU+'.'+R['pid']+'.'+Date['now']()['toString'](0x24)+'.tmp';await Q['writeFile'](fV,JSON['stringify'](fT));try{await dx(fV,fU);}finally{try{await Q['rm'](fV,{'force':!0x0});}catch{}}}async[gz(0x1a7)](fS){let fT=dv(fS);await Q['rm'](fT,{'force':!0x0})['catch'](()=>void 0x0);}};const dz=fS=>M['resolve'](fS),dA=fS=>createHash('sha1')['update'](dz(fS))['digest']('hex'),dB=fS=>fS['map']((fT,fU)=>({'index':fU,'start':fT['start'],'end':fT[gz(0x180)],'output':fT['output'],'completed':!0x1,'bytesWritten':0x0})),dC=(fS,fT)=>fS['parts'][gz(0x140)]===fT['length']?fS[gz(0xfe)]['every']((fU,fV)=>{const iF=gz;let fW=fT[fV];return fW?fU['start']===fW['start']&&fU[iF(0x180)]===fW['end']&&(fU['output']??null)===(fW['output']??null):!0x1;}):!0x1,dD=(fS,fT)=>!fT||!fS['sourceSignature']?!0x0:fS['sourceSignature']===fT,dE=fS=>{let fT=fS['parts']['reduce']((fU,fV)=>fU+fV['bytesWritten'],0x0);return fT>0x0?fT:fS['bytesDownloaded'];},dF=fS=>{const iG=gz;if(!fS||typeof fS!='object')return!0x1;let fT=fS;return fT['version']===0x2&&typeof fT[iG(0x166)]=='string'&&Array['isArray'](fT['parts'])&&typeof fT['bytesDownloaded']=='number';};var dG=class{['key'];['output'];['filePath'];['cleanupOnSuccess'];['store'];['target'];['trustExplicitKey'];constructor(fS={}){const iH=gz;if(this['output']=fS['output'],this['filePath']=fS['filePath'],this['key']=fS['key']??(this['output']?dA(this['output']):''),!this['key'])throw Error('Resume\x20key\x20is\x20required\x20when\x20output\x20is\x20not\x20provided');this['store']=fS['store']??new dy(),this['cleanupOnSuccess']=fS['cleanupOnSuccess']??!0x0,this[iH(0xcb)]={'key':this['key'],'output':this['output'],'filePath':this['filePath']},this['trustExplicitKey']=typeof fS['key']=='string'&&fS['key']['length']>0x0;}async['read'](){let fS=await this['store']['get'](this['target']);return dF(fS)?fS:null;}async['write'](fS){const iI=gz;let fT=new Date()['toISOString'](),fU={...fS,'version':0x2,'key':this['key'],'output':fS['output']??this['output'],'bytesDownloaded':dE(fS),'createdAt':fS['createdAt']||fT,'updatedAt':fT};await this[iI(0x112)]['set'](this['target'],fU);}async['delete'](){await this['store']['delete'](this['target']);}['createState'](fS){let fT=new Date()['toISOString']();return{'version':0x2,'key':this['key'],'output':this['output'],'input':fS['input'],'bytesTotal':fS['bytesTotal'],'bytesDownloaded':0x0,'parts':dB(fS['parts']),'sourceSignature':fS['sourceSignature'],'planner':fS['planner'],'createdAt':fT,'updatedAt':fT};}['reconcileState'](fS,fT){const iJ=gz;let fU=fS['version']!==0x2,fV=fS[iJ(0x166)]!==this[iJ(0x166)],fW=!this['trustExplicitKey']&&!dD(fS,fT['sourceSignature']),fX=!dC(fS,fT['parts']);if(fU||fV||fW||fX)return{'state':this['createState'](fT),'reset':!0x0};let fY={...fS,'key':this['key'],'output':this[iJ(0x1a0)],'input':fT['input'],'bytesTotal':fT['bytesTotal'],'sourceSignature':fT['sourceSignature'],'planner':fT['planner'],'parts':fT['parts']['map']((fZ,g0)=>{const iK=iJ;let g2=fS['parts'][g0];return{'index':g0,'start':fZ['start'],'end':fZ['end'],'output':fZ[iK(0x1a0)],'completed':g2?.['completed']??!0x1,'bytesWritten':g2?.['bytesWritten']??0x0};}),'createdAt':fS['createdAt'],'updatedAt':fS['updatedAt']};return fY['bytesDownloaded']=dE(fY),{'state':fY,'reset':!0x1};}['markPartCompleted'](fS,fT,fU){const iL=gz;let fV=fS[iL(0xfe)][fT];if(!fV)return fS;let fW=fV['bytesWritten'];return fV['completed']=!0x0,fV['bytesWritten']=fU,fS['bytesDownloaded']=Math['max'](0x0,fS['bytesDownloaded']-fW+fU),fS['updatedAt']=new Date()['toISOString'](),fS;}async['getProgress'](){let fS=await this['read']();if(!fS)return null;let fT=fS['bytesDownloaded'];if(fS['bytesTotal']){let fW=fS['bytesTotal'];return{'bytesDownloaded':fT,'totalBytes':fW,'percentComplete':fW>0x0?Math['round'](fT/fW*0x64):0x0};}let fU=fS['parts']['length'],fV=fS['parts']['filter'](fX=>fX['completed'])['length'];return{'bytesDownloaded':fT,'totalBytes':null,'percentComplete':fU>0x0?Math['round'](fV/fU*0x64):0x0,'segmentsCompleted':fV,'segmentsTotal':fU};}};const dH=0x8*0x2**0x14,dI=(fS,fT,fU)=>{let fV='part_'+fU+'.part';return M['join'](fT,fV);},dJ=(fS,fT,fU)=>{let fV=Math['ceil'](fS/Math['max'](0x1,fT));return Math['max'](0x1,Math['min'](fV,Math['max'](0x1,fU)));},dK=(fS,fT,fU)=>{let fV=dJ(fS,fT,fU),fW=[],fX=0x0;for(;fX<fS;){let fY=Math['min'](fS-0x1,fX+fV-0x1);fW['push']([fX,fY]),fX=fY+0x1;}return fW;},dL=fS=>{let [fT,fU]=fS;return'bytes='+fT+'-'+(fU||'');},dM=fS=>dK(fS['contentLength'],fS['maxWorkerCount'],fS['maxChunkSize']??dH)['map'](fT=>{let [fU,fV]=fT,fW=new Headers(fS['requestInit']?.['headers']);return fW['set']('Range',dL([fU,fV])),{'url':fS['url'],'headers':fW,'start':fU,'end':fV};}),dN=fS=>{const iM=gz;let fT=fS?Error('The\x20operation\x20was\x20aborted',{'cause':fS}):Error('The\x20operation\x20was\x20aborted');return fT[iM(0x1bf)]='AbortError',fT;},dO=fS=>{const iN=gz;if(!(fS instanceof Error))return!0x1;if(fS['name']===iN(0x102)||fS['code']==='ABORT_ERR')return!0x0;let fT=fS['cause'];return fT instanceof Error&&fT['name']==='AbortError';},dP=async fS=>await fS['client'][gz(0x207)](fS[gz(0x22b)],{'redirect':'follow',...fS['requestInit']}),dQ=(fS,fT,fU)=>async fV=>{if(fU?.['aborted'])throw dN();let fW=typeof fT=='number'?{'flags':'r+','start':fT}:{'flags':'w'},fX=K['createWriteStream'](fS,fW),fY=Readable['fromWeb'](fV['body']);try{await pipeline(fY,fX,{'signal':fU});}catch(fZ){throw dO(fZ)?dN(fZ):fZ;}if(fU?.['aborted'])throw dN();return fV;},dR=(fS,fT,fU)=>fV=>{const iO=gz;if(fU?.['aborted'])throw dN();let fW=parseInt(fV['headers'][iO(0x207)]('content-length')||'0');if(fS['increase'](fW),fU?.['aborted'])throw dN();return fT&&!fU?.['aborted']?fT(fS['toProgressInfo']()):fS[iO(0x158)](),fV;},dS=fS=>typeof fS=='boolean'?{'enabled':fS,'cleanupOnSuccess':!0x0}:fS?{'enabled':fS['enabled']??!0x0,'key':fS['key'],'store':fS['store'],'filePath':fS['filePath'],'cleanupOnSuccess':fS['cleanupOnSuccess']??!0x0}:{'enabled':!0x1,'cleanupOnSuccess':!0x0},dT=fS=>({'tempDir':fS['tempDir']??process['cwd'](),'maxRetries':fS['maxRetries']??0x5,'maxChunkSize':fS['maxChunkSize']??dH,'maxWorkerCount':fS['maxWorkerCount']??0x4,'resume':dS(fS[gz(0x1b4)]),'proxy':fS['proxy'],'requestInit':fS['requestInit'],'fetchFn':fS['fetchFn']}),dU={'total':{'b':0x0,'mb':0x0},'current':{'b':0x0,'mb':0x0},'chunkSize':0x0,'chunkSizes':[],'averageSize':{'b':0x0,'mb':0x0},'averageTotal':{'b':0x0,'mb':0x0},'speed':{'bps':0x0,'mbps':0x0}},dV=fS=>{const iP=gz;let fT=Math[iP(0x162)](fS/0xe10),fU=Math['floor'](fS%0xe10/0x3c),fV=fS%0x3c,fW=fT>0x0?fT+'h':'',fX=fU>0x0?fU+'m':'',fY=fV>0x0?fV+'s':'';return fT>0x0?fW+'\x20'+(fX||'0m')+'\x20'+(fY&&''+fY):!fT&&fU>0x0?fX+'\x20'+(fY&&''+fY):fY;},dW=(fS=0x0)=>{let fT=structuredClone(dU),fU=0x0,fV=setInterval(()=>{fU>0x1&&(fT['speed']['bps']=fT['current']['b']/fU),fU+=0.5;},0x1f4);return{'state':fT,'setTotal':fW=>{const iQ=b;fT['total']['b']=fW,fT[iQ(0x230)]['mb']=fW/0x400/0x400;},'setCurrent'(fW){fT['current']['b']=fW,fT['current']['mb']=fW/0x400/0x400;},'increase'(fW){const iR=b;fT['current']['b']+=fW,fT[iR(0x243)]['mb']=fT['current']['b']/0x400/0x400,fT['speed']['mbps']=fT['speed']['bps']/0x400/0x400,fT['chunkSize']=fW,fT['chunkSizes'][iR(0x10d)](fW),fT['averageSize']['b']=fT['current']['b']/fT['chunkSizes']['length'],fT['averageSize']['mb']=fT['averageSize']['b']/0x400/0x400,fT['averageTotal']['b']=fS*fT['averageSize']['b'],fT['averageTotal']['mb']=fT['averageTotal']['b']/0x400/0x400;},'stop'(){clearInterval(fV),Object['assign'](fT,dU);},'log'(){let fW=fT['current']['b'],fX=fT['total']['b'],fY=fW+(fX?'/'+fX:'');stdout['write']('\x0dDownloading\x20['+fY+']');},'stopLog'(){stdout['write']('\x0a');},'toString'(){const iS=b;let fW='';fT[iS(0x21c)]['bps']&&(fW+=fT['speed']['mbps']['toFixed'](0x1)+'\x20MB/s\x20–\x20'),fW+=''+fT['current']['mb']['toFixed'](0x1),fT['total']['b']?fW+='\x20of\x20'+fT['total']['mb']['toFixed'](0x1)+'\x20MB':fW+='\x20MB';let fX=fT['total']['b']||fT['averageTotal']['b'];if(fX){let fY=fX-fT['speed']['bps']*fU,fZ=Math['round'](fY/fT['speed']['bps']),g0=dV(fZ);fZ&&isFinite(fZ)&&g0&&(fW+=',\x20'+g0+'\x20left');}return fW;},'toProgressInfo'(){const iT=b;let fW=fT['total']['b']||null;return{'bytesDownloaded':fT['current']['b'],'totalBytes':fW,'percentComplete':fW?fT['current']['b']/fW*0x64:null,'bytesPerSecond':fT[iT(0x21c)]['bps'],'estimatedSecondsRemaining':fT['speed']['bps']>0x0&&fW?(fW-fT['current']['b'])/fT['speed']['bps']:null};}};},dX=new Set(['authorization',gz(0x114),'set-cookie','x-amz-date','x-amz-security-token','x-amz-content-sha256','x-goog-date','x-goog-security-token']),dY=(fS,fT={})=>{if(!fS)return[];let fU=fT['includeVolatile']??!0x1,fV=[];return new Headers(fS)['forEach']((fW,fX)=>{!fU&&dX['has'](fX['toLowerCase']())||fV['push']([fX,fW]);}),fV['sort'](([fW],[fX])=>fW['localeCompare'](fX)),fV;},dZ=fS=>{const iU=gz;try{let fT=new URL(fS),fU=fT['pathname']['split']('/')['map'](fV=>fV&&(fV['includes']('=')||fV['includes'](',')?':volatile':fV))['join']('/');return''+fT['origin']+fU;}catch{let fV=String(fS);return(fV[iU(0x1b2)]('#')[0x0]??fV)['split']('?')[0x0]||fV;}},e0=fS=>({'url':dZ(fS['url']),'start':fS['start'],'end':fS['end'],'output':fS['output'],'headers':dY(fS['headers'])}),e1=fS=>{const iV=gz;let fT={'input':Array[iV(0x1f5)](fS['input'])?fS['input']['map'](fU=>e0(fU)):dZ(String(fS['resolvedUrl'])),'requestHeaders':dY(fS['requestHeaders']),'parts':fS[iV(0xfe)]['map'](fU=>e0(fU)),'maxWorkerCount':fS['maxWorkerCount'],'maxChunkSize':fS['maxChunkSize']};return createHash('sha1')['update'](JSON['stringify'](fT))['digest'](iV(0x1fc));},e2=async fS=>{const iW=gz;if(!fS['manager'])return null;let fT={'input':Array['isArray'](fS['input'])?fS['input']:fS['resolvedUrl'],'parts':fS['parts'],'bytesTotal':fS['bytesTotal'],'sourceSignature':fS['sourceSignature'],'planner':{'maxWorkerCount':fS['maxWorkerCount'],'maxChunkSize':fS[iW(0x1ed)]}},fU=await fS['manager']['read'](),fV=(fU?fS['manager']['reconcileState'](fU,fT):null)?.['state']??fS['manager'][iW(0x12b)](fT);return await fS['manager']['write'](fV),fV;},e3=fS=>{const iX=gz;if(fS&&!fS['parts'][iX(0xf5)](fT=>fT['completed']))throw Error('Not\x20all\x20segments\x20were\x20downloaded\x20successfully.\x20Try\x20resuming\x20later.');},e4=fS=>{if(Array['isArray'](fS['input']))return fS['input']['map']((fT,fU)=>({...fT,'output':dI(fS['url'],fS['tempFileDir'],fU)}));if(!fS['acceptsRanges'])throw Error('Unable\x20to\x20get\x20parts');if(!fS['size'])throw Error('Size\x20is\x20not\x20known');return dM({'url':fS['url'],'requestInit':fS['requestInit'],'contentLength':fS['size'],'maxWorkerCount':fS['maxWorkerCount'],'maxChunkSize':fS['maxChunkSize']});},e5=async fS=>{const iY=gz;if(!fS['parts']['some'](fU=>typeof fU['start']=='number'&&(fU['output']??fS[iY(0x1a0)])===fS['output'])||await Q['stat'](fS['output'])[iY(0x188)](()=>!0x0)['catch'](()=>!0x1))return;let fT=await Q['open'](fS['output'],'w');fS['size']&&fS['size']>0x0&&await fT['truncate'](fS['size']),await fT['close']();},e6=()=>{let fS=Error('The\x20operation\x20was\x20aborted');return fS['name']='AbortError',fS;},e7=fS=>{let fT=fS['match'](/bytes\s+(\d+)-(\d+)\/(\d+|\*)/i);if(!fT||!fT[0x1]||!fT[0x2]||!fT[0x3])return null;let fU=parseInt(fT[0x1],0xa),fV=parseInt(fT[0x2],0xa),fW=fT[0x3];if(!Number['isFinite'](fU)||!Number['isFinite'](fV)||fV<fU)return null;if(fW==='*')return{'start':fU,'end':fV,'total':null};let fX=parseInt(fW,0xa);return!Number['isFinite'](fX)||fX<=0x0?null:{'start':fU,'end':fV,'total':fX};},e8=(fS,fT)=>{const iZ=gz;if(typeof fT['start']!='number'||typeof fT['end']!='number')return;if(fS['status']!==0xce)throw Error('Range\x20request\x20failed\x20for\x20bytes='+fT['start']+'-'+fT['end']+':\x20expected\x20206,\x20got\x20'+fS['status']);let fU=fS['headers']['get'](iZ(0x1e4));if(!fU)throw Error('Range\x20request\x20failed\x20for\x20bytes='+fT['start']+'-'+fT['end']+':\x20missing\x20Content-Range\x20header');let fV=e7(fU);if(!fV)throw Error('Range\x20request\x20failed\x20for\x20bytes='+fT['start']+'-'+fT[iZ(0x180)]+':\x20invalid\x20Content-Range\x20\x22'+fU+'\x22');if(fV['start']!==fT['start']||fV['end']!==fT['end'])throw Error('Range\x20request\x20failed\x20for\x20bytes='+fT['start']+'-'+fT['end']+':\x20got\x20bytes='+fV[iZ(0x13d)]+'-'+fV['end']);},e9=async(fS,fT,fU)=>{const j0=gz;let fV=fS['headers']['get']('content-length');if(fV){let fX=parseInt(fV,0xa);if(Number['isFinite'](fX)&&fX>0x0)return fX;}let fW=fS['headers']['get'](j0(0x1e4));if(fW){let fY=fW['match'](/bytes\s+(\d+)-(\d+)\//i);if(fY&&fY[0x1]&&fY[0x2]){let fZ=parseInt(fY[0x1],0xa),g0=parseInt(fY[0x2],0xa);if(Number['isFinite'](fZ)&&Number['isFinite'](g0)&&g0>=fZ)return g0-fZ+0x1;}}return typeof fT['start']=='number'&&typeof fT['end']=='number'?Math['max'](0x0,fT['end']-fT['start']+0x1):fT['output']&&fT['output']!==fU?Q['stat'](fT['output'])['then'](g2=>g2['size'])['catch'](()=>0x0):0x0;},ea=(fS,fT)=>fS[gz(0x131)]((fU,fV)=>fV)['filter'](fU=>!(fT?.['parts'][fU]?.['completed']??!0x1)),eb=fS=>{const j1=gz;let fT=Promise[j1(0x183)]();return{'enqueue':()=>(fT=fT['then'](fS),fT),'onIdle':()=>fT};},ec=async fS=>{const j4=gz;let fT=fS['signal']??fS['requestInit']?.['signal']??void 0x0,fU=()=>{if(fT?.['aborted'])throw e6();};fU();let fV=ea(fS['parts'],fS['resumeState']),fW=dl['promise'](async g5=>{let {index:g6,part:g7}=g5;fU();let g8=await dP({'index':g6,'client':fS['client'],'url':g7['url'],'requestInit':{...fS['requestInit'],'signal':fT,'headers':g7['headers']??fS['requestInit']?.['headers']}});if(fU(),e8(g8,g7),await dQ(g7['output']??fS['output'],g7['start'],fT)(g8),dR(fS['progress'],fS['onProgress'],fT)(g8),fU(),fS['resumeState']&&fS['resumeManager']){let g9=await e9(g8,g7,fS['output']);fS['resumeManager']['markPartCompleted'](fS['resumeState'],g6,g9),await g0['enqueue']();}},fS['maxWorkerCount']),fX=()=>{const j2=b;fW['pause'](),fW['killAndDrain'](),fW[j2(0x205)]();};if(fT?.['aborted'])throw fX(),e6();let fY=()=>{},fZ=fT?new Promise((g5,g6)=>{const j3=b;let g7=()=>{fX(),g6(e6());};fT['addEventListener']('abort',g7,{'once':!0x0}),fY=()=>fT[j3(0x18d)]('abort',g7);}):null,g0=eb(async()=>{!fS['resumeState']||!fS['resumeManager']||await fS['resumeManager']['write'](fS['resumeState']);}),g2=fV[j4(0x131)](g5=>{let g6=fS['parts'][g5];return g6?(fU(),fW['push']({'index':g5,'part':g6})):Promise['resolve']();}),g3=[];try{let g5=Promise['allSettled'](g2);fZ&&(await Promise['race']([g5,fZ]),fU()),g3=await g5;}finally{fY(),await g0['onIdle']();}let g4=g3[j4(0x1b8)](g6=>g6['status']==='rejected');if(g4?.['status']==='rejected')throw g4['reason'];},ed=async(fS,fT)=>{await new Promise((fU,fV)=>{let fW=K['createReadStream'](fS),fX=()=>{const j5=b;fT['off']('error',fY),fW[j5(0x111)]('error',fZ),fW['off']('end',g0);},fY=g2=>{const j6=b;fX(),fV(Error(j6(0x18e),{'cause':g2}));},fZ=g2=>{fX(),fV(Error('Segment\x20read\x20stream\x20error',{'cause':g2}));},g0=()=>{fX(),fU();};fT['on']('error',fY),fW['on']('error',fZ),fW['on']('end',g0),fW['pipe'](fT,{'end':!0x1});});},ee=async fS=>{const j7=gz;let fT=fS[j7(0xfe)]['map'](fV=>fV['output'])['filter'](fV=>!!fV&&fV!==fS['output']);if(!fT['length'])return;let fU=K['createWriteStream'](fS['output']);for(let fV of fT)await ed(fV,fU);fU['end'](),await finished(fU);},ef=async fS=>{if(!fS['expectedSize'])return;let fT=await Q['stat'](fS['output'])['then'](fU=>fU['size'])['catch'](()=>null);if(fT&&fT!==fS['expectedSize'])throw Error('Actual\x20size\x20'+fT+'\x20doesn\x27t\x20match\x20expected\x20size\x20'+fS['expectedSize']);},eg=async fS=>{fS['resumeManager']&&fS['resumeManager']['cleanupOnSuccess']&&await fS['resumeManager']['delete'](),await dt(fS['tempFileDir']);},eh=async fS=>{const j8=gz;let fT=e1({'input':fS['input'],'resolvedUrl':fS['url'],'parts':fS[j8(0xfe)],'requestHeaders':fS['requestInit']?.['headers'],'maxWorkerCount':fS['maxWorkerCount'],'maxChunkSize':fS['maxChunkSize']}),fU=await e2({'manager':fS['resumeManager'],'input':fS['input'],'resolvedUrl':fS['url'],'parts':fS['parts'],'bytesTotal':fS['size']??void 0x0,'sourceSignature':fT,'maxWorkerCount':fS['maxWorkerCount'],'maxChunkSize':fS['maxChunkSize']}),fV=dW(fS['parts']['length']);fS['size']&&fV['setTotal'](fS['size']),fU?.['bytesDownloaded']&&fV['setCurrent'](fU['bytesDownloaded']),await e5({'output':fS['output'],'size':fS['size'],'parts':fS['parts']});try{await ec({'parts':fS['parts'],'output':fS['output'],'maxWorkerCount':fS['maxWorkerCount'],'client':fS['client'],'requestInit':fS['requestInit'],'progress':fV,'onProgress':fS['onProgress'],'resumeState':fU,'resumeManager':fS['resumeManager'],'signal':fS['signal']});}finally{fV['stop'](),fS['onProgress']||fV['stopLog']();}e3(fU),await ee({'output':fS['output'],'parts':fS['parts']}),await ef({'output':fS[j8(0x1a0)],'expectedSize':Array['isArray'](fS['input'])?null:fS['size']}),await eg({'tempFileDir':fS['tempFileDir'],'resumeManager':fS['resumeManager']});},ei=async fS=>{const j9=gz;let fT=new Headers(fS['requestInit']?.['headers']);fT['set']('Range','bytes=0-0');let fU=Array['isArray'](fS[j9(0x16f)])?fS['input'][0x0]?.['url']:fS[j9(0x16f)];if(!fU)throw Error('Input\x20is\x20empty');let fV=await fS['client']['head'](fU,{...fS['requestInit'],'headers':fT}),fW=fV['headers']['get']('content-type'),fX=fV['headers']['get']('content-length'),fY=fV['headers'][j9(0x207)]('content-range'),fZ=fY?.['split']('/')?.[0x1]||fX,g0=fZ&&!Array['isArray'](fS['input'])?parseInt(fZ,0xa):null,g2=fV['headers']['get']('accept-ranges')==='bytes'||!!fY?.['includes']('bytes')||!!fW?.['includes']('video')||!!fW?.['includes']('audio')||!!fW?.['includes'](j9(0x1d1));return{'url':fV['url'],'size':g0,'acceptsRanges':g2};};var ej=class gx{['input'];['output'];['resume'];[gz(0xd1)];['config'];['client'];['resumeManager'];['probe'];[gz(0x13e)];constructor(fS){const ja=gz;this['input']=fS['input'],this['output']=fS['output'],this['resume']=fS['resume'],this['onProgress']=fS['onProgress'],this['config']=dT(fS),this['client']=dn({'maxRetries':this['config']['maxRetries'],'proxy':this[ja(0x1b7)]['proxy'],'fetch':this['config']['fetchFn']}),this['config']['resume']['enabled']&&(this[ja(0x211)]=new dG({'output':this['output'],'key':this['config']['resume']['key'],'filePath':this['config']['resume'][ja(0x1f8)],'store':this['config']['resume']['store'],'cleanupOnSuccess':this['config']['resume']['cleanupOnSuccess']}));}static async['init'](fS){let fT=new gx(fS);return await fT['_init'](),fT;}async['_init'](){const jb=gz;this['probe']=await ei({'client':this['client'],'input':this[jb(0x16f)],'requestInit':this['config']['requestInit']}),await ds(this['output']),this[jb(0x13e)]=await dq(this['output'],this['config']['tempDir']),this['config']['resume']['enabled']||(await dt(this['output'],du(this['output']),this['tempFileDir']),this[jb(0x13e)]=await dq(this['output'],this['config']['tempDir']));}async['execute'](){const jc=gz;if(!this['probe']||!this['tempFileDir'])throw Error(jc(0x192));try{let fS=e4({'input':this['input'],'url':this['probe']['url'],'size':this['probe']['size'],'acceptsRanges':this['probe']['acceptsRanges'],'requestInit':this['config']['requestInit'],'tempFileDir':this['tempFileDir'],'maxWorkerCount':this['config']['maxWorkerCount'],'maxChunkSize':this['config']['maxChunkSize']});await eh({'input':this['input'],'output':this['output'],'url':this['probe']['url'],'size':this['probe']['size'],'requestInit':this['config']['requestInit'],'maxWorkerCount':this['config']['maxWorkerCount'],'maxChunkSize':this['config']['maxChunkSize'],'onProgress':this['onProgress'],'client':this['client'],'parts':fS,'tempFileDir':this['tempFileDir'],'resumeManager':this['resumeManager'],'signal':this['config']['requestInit']?.['signal']??void 0x0});}finally{await this['close']();}}async['getSize'](){if(this['probe']||=await ei({'client':this['client'],'input':this['input'],'requestInit':this['config']['requestInit']}),!this['probe']['size'])throw Error('Size\x20is\x20not\x20known');return this['probe']['size'];}async['close'](){const jd=gz;await this['client'][jd(0x202)]();}};const ek=async({attempts:fS,fn:fT,shouldRetry:fU,onRetry:fV})=>{let fW=Math['max'](0x1,Math['trunc'](fS)),fX;for(let fY=0x1;fY<=fW;fY+=0x1)try{return await fT(fY);}catch(fZ){if(fX=fZ,fY>=fW||!fU?.(fZ,fY))throw fZ;await fV?.(fZ,fY);}throw fX instanceof Error?fX:Error(String(fX));},el=()=>{const je=gz;if(process[je(0x139)]==='win32'&&!isatty(process['stderr']['fd'])&&ab()?.['getConsoleSize']?.()?.['columns'])try{let fS=a9('nanospinner/dist/consts.js');fS&&fS['isTTY']===!0x1&&(fS['isTTY']=!0x0,fS['symbols']?.['frames']?.['length']===0x1&&(fS['symbols']['frames']=['-','\x5c','|','/']));}catch{}},em=fS=>{const jf=gz;let fT=process['stderr'];if(!fS||process['platform']!=='win32')return fT;if(!fT['columns']||fT['columns']!==fS){let fU=Object['getOwnPropertyDescriptor'](fT,'columns')??Object['getOwnPropertyDescriptor'](Object['getPrototypeOf'](fT),'columns');if(!fU||fU['writable']||fU['set'])try{fT['columns']=fS;}catch{}if(fT['columns']!==fS){let fV=Object['create'](fT);return Object[jf(0x1ce)](fV,'columns',{'value':fS,'configurable':!0x0,'enumerable':!0x0,'writable':!0x0}),B[jf(0x124)]('Unable\x20to\x20override\x20stderr.columns;\x20using\x20spinner-local\x20width\x20'+fS+'.'),fV;}}return fT;},en={'debug':'gray','info':'green','warn':'yellow','error':gz(0xe2)},eo=fS=>{const jg=gz;let fT=fS[jg(0xde)](),fU=O[en[fS]];return fU(fT);},ep=(fS,fT)=>typeof fT=='string'?fS+'\x20'+fT:fT&&{...fT,'text':(fS+'\x20'+(fT['text']??''))['trimEnd']()},eq=(fS,fT)=>{const jh=gz;el();let fU=D(eo('info')),fV=createSpinner(fS,{'stream':em(ab()?.['getConsoleSize']?.()?.['columns']??process['stderr']['columns']??process['stdout']['columns']??(process['platform']==='win32'?0x78:0x50))})['start']({'text':fU+'\x20'+fS,'color':fT}),fW=fV['update']['bind'](fV),fX=fV['success'][jh(0x213)](fV),fY=fV['error']['bind'](fV);return fV['update']=fZ=>fW(ep(fU,fZ)),fV['success']=fZ=>fX(ep(fU,fZ)),fV['error']=fZ=>fY(ep(fU,fZ)),fV;},er=0x10,es=fS=>{const ji=gz;if(!(!fS||typeof fS!='object'||!(ji(0x16e)in fS)))return fS['drm']?.['widevine']?.['pssh'];},et=(fS,fT)=>createHash('sha1')['update'](fS+':'+cr(fT))['digest']('hex'),eu=({outputDirectory:fS,resolvedFilenameWithoutExtension:fT,track:fU})=>join(fS,fT+'.'+createHash('sha256')['update'](cr(fU))['digest']('hex')['slice'](0x0,0x6)+'.'+(fU['type']==='subtitle'?'vtt':fU['type']==='audio'?'m4a':'mp4')),ev=(fS,fT)=>{const jj=gz;if(fT)return{'Range':jj(0x23b)+fS+'-'+(fS+fT-0x1)};},ew=async fS=>{const jk=gz;if(fS['sourceUrl']&&!fS['inputTrack'])return fS['sourceUrl'];let fT=[],fU=await cP(fS),fV=fU[0x0];fV?.['initSegment']&&fT['push']({'url':fV['initSegment']['location']['path'],'headers':ev(fV['initSegment']['location']['offset'],fV['initSegment']['location']['length'])});for(let fW of fU)fT['push']({'url':fW['location']['path'],'headers':ev(fW['location'][jk(0x204)],fW['location']['length'])});return!fT['length']&&fS['sourceUrl']?fS['sourceUrl']:fT['length']===0x1&&!fT[0x0]?.['headers']?fT[0x0][jk(0x22b)]:fT;},ex=fS=>{let fT=Math['max'](0x1,Math['trunc'](fS)),fU=Math['min'](er,fT);return{'normalizedRequestedConnections':fT,'maxWorkerCount':fU,'wasClamped':fT!==fU};},ey=fS=>Math['max'](0x1,Math['trunc'](fS)+0x1),ez=(fS,fT)=>fT['origin']==='manifest'?{'enabled':!0x0,'key':et(fS,fT)}:!0x0,eA=({title:fS,progress:fT,track:fU,filepath:fV,target:fW})=>{const jl=gz;let fX={'b':fT[jl(0x113)]??NaN,'mb':(fT['totalBytes']??NaN)/0x400/0x400},fY={'b':fT['bytesDownloaded']??NaN,'mb':(fT['bytesDownloaded']??NaN)/0x400/0x400},fZ=fT['totalBytes']?Math['round'](fT['bytesDownloaded']/fT['totalBytes']*0x64):void 0x0;return{'title':fS,'total':fX,'current':fY,'percentage':fZ,'speed':{'bps':fT['bytesPerSecond']??NaN,'mbps':(fT['bytesPerSecond']??NaN)/0x400/0x400},'trackName':basename(fV),'trackPath':fV,'finalName':fW['finalName'],'finalPath':fW['finalPath'],'state':fZ===0x64?jl(0x1c2):'downloading','quality':fU['type']==='video'&&fU['width']?fU['width']+'x'+fU['height']:void 0x0,'codec':fU['type']===jl(0x19b)?fU['codec']??void 0x0:void 0x0};},eB=fS=>'Downloading\x20∙\x20'+((fS['bytesDownloaded']/0x400/0x400)[gz(0x105)](0x2)+'\x20MB')+(fS['totalBytes']?'\x20of\x20'+(fS[gz(0x113)]/0x400/0x400)['toFixed'](0x2)+'\x20MB':''),eC=fS=>fS['flatMap'](fT=>{let fU=fT['segments']?.[0x0],fV=es(fU?.['initSegment']?.['encryption'])??es(fU?.['encryption']);return fV?[fV]:[];})[gz(0x131)](fT=>{let fU=fT;return typeof fU=='string'?fU:fU instanceof Uint8Array||fU instanceof ArrayBuffer?Buffer['from'](fU)['toString']('base64'):ArrayBuffer['isView'](fU)?Buffer['from'](fU['buffer'])['toString']('base64'):String(fU);}),eD=(fS,fT)=>({'path':fT,'type':fS['type'],'language':fS['languageCode'],'label':fS['name']??void 0x0,'forced':fS['type']==='subtitle'?fS['forced']:!0x1}),eE=async({track:fS,filepath:fT,description:fU,target:fV,source:fW,options:fX,settings:fY,abortSignal:fZ,title:g0,emitProgress:g2})=>{const jm=gz;B['info'](fU),B['debug']('Path:\x20'+fT);let g3=fX['connections']??fY['get']('connections')??0x1,{maxWorkerCount:g4,wasClamped:g5}=ex(g3);g5&&B[jm(0x124)]('Connections\x20value\x20'+g3+'\x20was\x20clamped\x20to\x20'+g4+'\x20for\x20stability'),B['debug']('Max\x20worker\x20count:\x20'+g4);let g6=eq('Downloading',jm(0x187)),g7='',g8=await ew(fS),g9=ey(fX['retry']??fY['get']('retry')??0x1);try{await ek({'attempts':g9,'fn':async()=>{const jn=jm;let ga=await ej['init']({'input':g8,'output':fT,'tempDir':l,'requestInit':{'headers':fW['headers'],'signal':fZ},'proxy':fX['proxyMedia']||fX[jn(0x196)]||void 0x0,'resume':ez(fW['url'],fS),'maxRetries':fX['retry'],'maxWorkerCount':g4,'onProgress':gb=>{g2(eA({'title':g0,'progress':gb,'track':fS,'filepath':fT,'target':fV})),g7=eB(gb),g6['update'](g7);}});if(fZ?.['aborted']){B[jn(0xed)]('Track\x20download\x20skipped,\x20already\x20aborted:\x20'+fT);let gb=Error('The\x20operation\x20was\x20aborted');throw gb['name']='AbortError',gb;}await ga['execute']();},'shouldRetry':ga=>!(ga instanceof Error&&ga['name']==='AbortError'),'onRetry':async(ga,gb)=>{let gc=ga instanceof Error?ga['message']:String(ga);B['warn']('Track\x20download\x20retry\x20'+gb+'/'+(g9-0x1)+'\x20scheduled\x20for\x20'+fT+':\x20'+gc);}}),g6['success'](g7);}catch(ga){if(g6['error'](fU),ga instanceof Error&&ga['name']==='AbortError')throw ga;let gb=ga instanceof Error?ga['message']:String(ga);throw B['error']('Download\x20track\x20failed:\x20'+gb),ga instanceof Error&&ga['stack']?B['debug'](ga['stack']):B['debug'](gb),ga instanceof Error?ga:Error(gb);}},eF=fS=>fS instanceof Error&&fS['name']==='AbortError',eG=fS=>!!fS&&typeof fS=='object'&&'aborted'in fS&&'addEventListener'in fS&&typeof fS[gz(0x14a)]=='function';var eH=class extends S{#e;#t;#n;#r;#i;#a;constructor({settings:fS,downloadsStorage:fT}){super(),this.#i=fS,this.#a=fT;}async['start'](fS,fT,fU={'id':crypto['randomUUID']()},fV,fW){const jo=gz;eG(fV)?(this.#r=new AbortController(),fV['addEventListener']('abort',()=>{this.#r?.['abort']();})):this.#r=void 0x0;let fX=new C({'proxyUrl':fS['proxy']||fS['proxyMeta']||void 0x0});this.#e={...fS},this.#t=fT,this.#n={...fU};let fY;try{this.#o();let fZ=await di(fX,this.#t);fZ[jo(0x19d)]&&B['info']('Content\x20Matched:\x20'+fZ['matchedContentLabel']),B['info']('Parsing\x20streams...'),fY=await dg({'http':fX,'options':this.#e,'source':this.#t,'meta':this.#n,'input':fW,'detection':fZ}),this.#e=fY['options'],this.#n=fY['meta'],await aE(this.#i['get']('downloadDir'));let g0=cB({'settings':this.#i,'options':this.#e,'source':this.#t,'meta':this.#n,'allTracks':fY[jo(0x1e7)]});return this.#s(g0['outputPath'],g0[jo(0x1f9)]),await this.#c(fY,g0);}catch(g2){if(eF(g2))throw g2;let g3=cw(g2);throw this['emit']('error',g3),g3;}finally{await fY?.['dispose']?.();}}#o(){const jp=gz;B['debug']('URL:\x20'+this.#t[jp(0x22b)]);let fS='seasonNumber'in this.#n?this.#n['seasonNumber']:void 0x0,fT='episodeNumber'in this.#n?this.#n['episodeNumber']:void 0x0,fU='episodeTitle'in this.#n?this.#n['episodeTitle']:'',fV=[this.#n['title'],fS?'S'+fS:'',fT?'E'+fT:'',fU]['filter'](Boolean)['join']('\x20∙\x20');fV&&B['info'](fV);}#s(fS,fT){this['emit']('output-path',fS),B['debug']('Resolved\x20output\x20path:\x20'+fS);let fU=cA(this.#n),fV=this.#a['getByFilePath'](fS);fV&&(fV['title']=fU['title']||fT),B['debug']('Emit\x20download\x20start'),this['emit']('start',this.#a['jobs']);}async #c(fS,fT){const jq=gz;B['debug']('Downloading\x20tracks');let fU=[];ct(fS['tracks']['all']);for(let fV of fS[jq(0x225)]['all']){let fW=eu({'outputDirectory':fT['outputDirectory'],'resolvedFilenameWithoutExtension':fT['resolvedFilenameWithoutExtension'],'track':fV}),fX=cq(fV,fT['resolvedFilenameWithoutExtension']);fV[jq(0x168)]==='subtitle'&&B['debug']('URL:\x20'+(fV['sourceUrl']??'manifest\x20subtitle\x20track')),await eE({'track':fV,'filepath':fW,'description':fX,'target':{'finalName':fT['filenameWithExtension'],'finalPath':fT['outputPath']},'source':this.#t,'options':this.#e,'settings':this.#i,'abortSignal':this.#r?.['signal'],'title':cA(this.#n)['title'],'emitProgress':fY=>{const jr=jq;this['emit']('progress',fY,fT[jr(0x177)]);}}),await aA(fW)&&fU['push'](eD(fV,fW));}return{'downloaded':fU,'psshList':eC(fS['tracks']['all']),'selectedTracks':fS['tracks']['all']};}};const eI=fS=>{const js=gz;try{let fT=new URL(fS),fU=[...new Set(fT['searchParams']['keys']())],fV=fU['length']?'?'+fU['join'](','):'';return''+fT['origin']+fT[js(0x1b3)]+fV;}catch{return fS;}},eJ=async(fS,fT)=>{const jt=gz;let {verbose:fU,url:fV,resolveLicense:fW}=fT,fX=Buffer[jt(0x1c3)](fS,'base64'),fY='cenc',fZ=bp(bo(),'drm'),g0=new RemoteCdm({'keySystem':'com.widevine.alpha','baseUrl':fZ,'headers':{'Authorization':'Bearer\x20'+bJ['accessToken']}}),g2='initializing',g3=null;try{B['debug']('DRM\x20key\x20request\x20started:\x20license='+eI(fV)+',\x20remoteCdm='+eI(fZ)+',\x20psshLength='+fS['length']+',\x20initDataBytes='+fX[jt(0x140)]),g2='requesting-media-key-system-access';let g4=requestMediaKeySystemAccess(g0['keySystem'],[]);g2='creating-media-keys';let g5=await g4['createMediaKeys']({'cdm':g0});g2='creating-session',g3=g5[jt(0x1fe)](),g2='generating-license-request',B['debug']('Generating\x20license\x20request...');let g6=g3['waitForLicenseRequest']();await g3['generateRequest']('cenc',fX);let g7=await g6;B['debug']('License\x20request\x20of\x20'+g7['length']+jt(0x23e)+g3['sessionId']),g2='requesting-license',B['debug']('Requesting\x20license\x20at\x20'+fV);let g8=await fW({'url':fV,'pssh':fS,'data':new Uint8Array(g7),'sessionId':g3['sessionId']});if(g8[0x0]===0x7b||g8[0x0]===0x3c){B['debug']('License\x20response\x20is\x20not\x20binary');let ga=Buffer['from'](g8)['toString']('utf8');if(B[jt(0xed)](ga),ga['includes'](jt(0x17a)))throw Error('Invalid\x20license\x20response');}g2='updating-session',B['debug']('Updating\x20session...'),await g3['update'](new Uint8Array(g8)),g2='waiting-for-key-statuses-change',B['debug']('Waiting\x20for\x20key\x20statuses\x20change...');let g9=await g3['waitForKeyStatusesChange']();B['debug']('Keys\x20count:\x20'+g9['length']),g2=jt(0x23f),await g3['close'](),await g3['remove']();for(let gb of g9){let gc='Key:\x20'+gb['keyId']+':'+gb[jt(0x166)];fU?B['info'](gc):B['debug'](gc);}return g9[jt(0x131)](gd=>({'kid':gd[jt(0x16a)],'key':gd['key']}));}catch(gd){throw B['error']('Failed\x20to\x20get\x20DRM\x20content\x20keys\x20at\x20stage='+g2+jt(0x206)+eI(fV)+'\x20via\x20remoteCdm='+eI(fZ)),cp(jt(0x1b9),gd),gd;}finally{if(g3){try{await g3['close']();}catch{}try{await g3['remove']();}catch{}}}},eK=async({keys:fS,drm:fT,psshList:fU,drmDir:fV,resolveLicense:fW,licenseUrl:fX})=>{const ju=gz;B['debug']('Extracting\x20decryption\x20keys');let fY=[],fZ=fT&&'keys'in fT?fT['keys']:[],g0=[...fS||[],...fZ];g0['length']&&fY['push'](...g0);let g2=fX??(fT&&ju(0xc6)in fT?fT['server']:void 0x0);if(fW&&g2){let g3=[...new Set(fU??[])];for(let [g4,g5]of g3['entries']()){B['debug']('Resolving\x20DRM\x20keys\x20for\x20PSSH\x20'+(g4+0x1)+'/'+g3['length']+ju(0x22c)+eI(g2)),B['debug']('PSSH:\x20'+g5);let g6=await eJ(g5,{'url':g2,'resolveLicense':fW,'clientDir':fV});g6&&g6['length']&&fY['push'](...g6);}fY[ju(0x140)]||(B['warn']('Can\x27t\x20get\x20decryption\x20keys'),B['debug']('PSSH:\x20'+g3['join'](',\x20')));}return fY;};var eL=class{['strategy'];constructor(fS){this['strategy']=fS;}async['prepare'](){await this['strategy']['prepare']?.();}async['process'](fS){let fT=await this['strategy']['decryptFile'](fS);return fS['cleanup']&&await rm(fS['input'],{'force':!0x0}),fT;}};const eM=fS=>fS['replaceAll']('-','')['toLowerCase']();var eN=class{async['decryptFile'](fS){const jv=gz;let fT=new Map();for(let fU of fS['keys']){if(!fU['kid'])throw Error('Shifro\x20requires\x20a\x20KID\x20for\x20every\x20decryption\x20key');fT['set'](eM(fU[jv(0x12d)]),eM(fU['key']));}return B['debug']('Decrypting\x20via\x20shifro:\x20'+fS['input']),await(await Decryption['init']({'input':new X({'source':new FilePathSource(fS['input']),'keys':fT}),'output':new Y({'target':new FilePathTarget(fS['output'])})}))['execute'](),fS['output'];}};const eO=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}\.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}\.\d{3})([^\n]*)/g,eP=/^\uFEFF?WEBVTT(?:.|\n)*?\n{2}/,eQ=/(?:(\d{2}):)?(\d{2}):(\d{2})\.(\d{3})/,eR={'ar':'ara','de':'deu','en':'eng','es':'spa','fr':'fra','hi':'hin','it':'ita','ja':'jpn','ko':gz(0x12c),'pl':'pol','pt':'por','ru':'rus','th':'tha','tr':'tur','uk':'ukr','und':'und','vi':'vie','zh':'zho'},eS=fS=>fS==='subtitle'||fS==='text',eT=fS=>{let fT=fS['trim']()['split'](':');if(fT['length']<0x2||fT['length']>0x3)throw Error('Invalid\x20trim\x20timestamp:\x20'+fS);let fU=Number(fT['at'](-0x1)),fV=Number(fT['at'](-0x2)),fW=fT['length']===0x3?Number(fT[0x0]):0x0;if(![fW,fV,fU]['every'](fX=>Number['isFinite'](fX)&&fX>=0x0))throw Error('Invalid\x20trim\x20timestamp:\x20'+fS);return fW*0xe10+fV*0x3c+fU;},eU=fS=>{let fT=eQ['exec'](fS);if(!fT)throw Error('Invalid\x20WebVTT\x20timestamp:\x20'+fS);return 0xe10*0x3e8*Number(fT[0x1]||'0')+0x3c*0x3e8*Number(fT[0x2])+0x3e8*Number(fT[0x3])+Number(fT[0x4]);},eV=fS=>{const jw=gz;let fT=Math['floor'](fS/(0xe10*0x3e8)),fU=Math['floor'](fS%(0xe10*0x3e8)/(0x3c*0x3e8)),fV=Math['floor'](fS%(0x3c*0x3e8)/0x3e8),fW=fS%0x3e8;return fT['toString']()['padStart'](0x2,'0')+':'+fU[jw(0x11e)]()['padStart'](0x2,'0')+':'+fV['toString']()['padStart'](0x2,'0')+'.'+fW['toString']()['padStart'](0x3,'0');},eW=fS=>{const jx=gz;let fT=[fS['invalidEntries']?.[jx(0x140)]?fS['invalidEntries']['length']+'\x20invalid\x20entries':void 0x0,fS[jx(0x160)]?.['length']?fS['invalidTimecodes']['length']+'\x20invalid\x20timecodes':void 0x0,fS['invalidIndices']?.['length']?fS['invalidIndices']['length']+'\x20invalid\x20indices':void 0x0,fS['timecodeIssues']?.['reversedTimecodes']?.['length']?fS[jx(0xd4)][jx(0x1c1)][jx(0x140)]+'\x20reversed\x20timecodes':void 0x0,fS['timecodeIssues']?.['overlappingTimecodes']?.['length']?fS['timecodeIssues']['overlappingTimecodes']['length']+'\x20overlapping\x20timecodes':void 0x0]['filter'](Boolean);return fT['length']?'\x20('+fT['join'](',\x20')+')':'';},eX=fS=>{const jy=gz;let fT=fS['replaceAll']('\x0d\x0a','\x0a')['replaceAll']('\x0d','\x0a')['trim']();if(eP['test'](fT))return fT;let {subtitle:fU,status:fV}=convert(fS,'.vtt');if(!fV['success'])throw Error('Failed\x20to\x20convert\x20subtitle\x20to\x20WebVTT'+eW(fV)+'.');return fU['replaceAll']('\x0d\x0a','\x0a')['replaceAll']('\x0d','\x0a')[jy(0x15a)]();},eY=fS=>{const jz=gz;if(!fS)return;let fT=fS['trim']()[jz(0x155)]();if(!fT)return;let fU=fT['split']('-')[0x0]??fT;return/^[a-z]{3}$/['test'](fU)?fU:eR[fU];},eZ=fS=>{const jA=gz;switch(extname(fS)['toLowerCase']()){case'.mp4':return new Mp4OutputFormat();case jA(0x14e):return new MkvOutputFormat();default:throw Error('Unsupported\x20mux\x20output\x20format:\x20'+fS);}},f0=fS=>new V({'formats':U,'source':cD(fS)}),f1=fS=>{const jB=gz;let fT=fS[jB(0x1e0)]?eT(fS['trimBegin']):void 0x0,fU=fS['trimEnd']?eT(fS['trimEnd']):void 0x0;if(fT!==void 0x0&&fU!==void 0x0&&fU<=fT)throw Error('trimEnd\x20must\x20be\x20greater\x20than\x20trimBegin');return{'trimBegin':fT,'trimEnd':fU};},f2=async(fS,fT,fU,fV,fW)=>{const jC=gz;let fX=f0(fT),fY=await fX['getPrimaryVideoTrack']();if(!fY)throw Error('Missing\x20video\x20track\x20in\x20'+fT);let fZ=fY['codec'];if(!fZ)throw Error('Unknown\x20video\x20codec\x20in\x20'+fT);if(fW!==void 0x0&&fW>=await fY['computeDuration']())throw Error('trimBegin\x20excludes\x20the\x20full\x20video\x20track\x20in\x20'+fT);let g0=new EncodedPacketSink(fY),g2=fW===void 0x0?await g0['getFirstKeyPacket']({'verifyKeyPackets':!0x0}):await g0['getKeyPacket'](fW,{'verifyKeyPackets':!0x0})??await g0[jC(0x22f)]({'verifyKeyPackets':!0x0});if(!g2)throw Error('No\x20video\x20packets\x20found\x20in\x20'+fT);let g3=new EncodedVideoPacketSource(fZ);return fS['addVideoTrack'](g3,{'disposition':fY['disposition'],'name':fU??fY['name']??void 0x0,'rotation':fV['supportsVideoRotationMetadata']?fY['rotation']:void 0x0}),{'kind':'video','input':fX,'sink':g0,'source':g3,'startPacket':g2,'startTimestamp':g2[jC(0x1c6)],'emit':async g4=>{let g5={'decoderConfig':await fY['getDecoderConfig']()??void 0x0},g6=!0x0;for await(let g7 of g0['packets'](g2,void 0x0,{'verifyKeyPackets':!0x0}))await g3['add'](g7['clone']({'timestamp':g7['timestamp']-g4}),g6?g5:void 0x0),g6=!0x1;g3['close']();}};},f3=async(fS,fT,fU,fV,fW)=>{let fX=f0(fT),fY=await fX['getPrimaryAudioTrack']();if(!fY)throw Error('Missing\x20audio\x20track\x20in\x20'+fT);let fZ=fY['codec'];if(!fZ)throw Error('Unknown\x20audio\x20codec\x20in\x20'+fT);if(fW!==void 0x0&&fW>=await fY['computeDuration']())throw Error('trimBegin\x20excludes\x20the\x20full\x20audio\x20track\x20in\x20'+fT);let g0=new EncodedPacketSink(fY),g2=fW===void 0x0?await g0['getFirstPacket']():await g0['getPacket'](fW)??await g0['getFirstPacket']();if(!g2)throw Error('No\x20audio\x20packets\x20found\x20in\x20'+fT);let g3=new EncodedAudioPacketSource(fZ);return fS['addAudioTrack'](g3,{'disposition':fY['disposition'],'languageCode':eY(fU)??eY(fY['languageCode']),'name':fV??fY['name']??void 0x0}),{'kind':'audio','input':fX,'sink':g0,'source':g3,'startPacket':g2,'startTimestamp':g2['timestamp'],'emit':async g4=>{const jD=b;let g5={'decoderConfig':await fY['getDecoderConfig']()??void 0x0},g6=!0x0;for await(let g7 of g0['packets'](g2))await g3[jD(0x22a)](g7['clone']({'timestamp':g7['timestamp']-g4}),g6?g5:void 0x0),g6=!0x1;g3['close']();}};},f4=(fS,{trimBegin:fT,trimEnd:fU,commonStart:fV})=>{const jE=gz;let fW=fS['replaceAll']('\x0d\x0a','\x0a')['replaceAll']('\x0d','\x0a')['trim']();if(!eP['test'](fW))throw Error(jE(0x216));let fX=fT===void 0x0?void 0x0:Math['round'](fT*0x3e8),fY=fU===void 0x0?void 0x0:Math['round'](fU*0x3e8),fZ=Math['round'](fV*0x3e8);eO['lastIndex']=0x0;let g0=eO['exec'](fW),g2=fW['slice'](0x0,g0?.['index']??fW['length'])['trimEnd'](),g3=[],g4=g0?fW['slice'](g0[jE(0x137)]):'';for(;;){eO[jE(0x125)]=0x0;let g5=eO['exec'](g4);if(!g5)break;let g6=g5['index']+g5[0x0]['length'],g7=g4['indexOf']('\x0a',g6)+0x1,g8=g4['indexOf']('\x0a\x0a',g6);g8===-0x1&&(g8=g4['length']);let g9=g5[0x1]?.['trim'](),ga=g5[0x4]?.['trim'](),gb=g4['slice'](g7,g8)[jE(0x15a)](),gc=eU(g5[0x2]),gd=eU(g5[0x3]),ge=Math['max'](gc,fX??gc)-fZ,gf=Math['min'](gd,fY??gd)-fZ;if(gf>ge){let gg=eV(ge)+'\x20-->\x20'+eV(gf)+(ga?'\x20'+ga:'');g3['push']([g9,gg,gb]['filter'](Boolean)['join']('\x0a'));}g4=g4['slice'](g8)['trimStart']();}return[g2,...g3]['filter'](Boolean)['join']('\x0a\x0a');},f5=async(fS,fT,fU,fV,fW)=>{const jF=gz;if(fU['type']==='video')return f2(fS,fU['path'],fU['label'],fT,fV);if(fU['type']==='audio')return f3(fS,fU[jF(0x1fd)],fU[jF(0x1cb)],fU['label'],fV);if(eS(fU['type'])){let fX=eX(await readFile(fU['path'],'utf8')),fY=new TextSubtitleSource(jF(0x11a));return fS['addSubtitleTrack'](fY,{'disposition':fU['forced']?{'forced':!0x0}:void 0x0,'languageCode':eY(fU['language']),'name':fU['label']}),{'kind':'subtitle','source':fY,'emit':async fZ=>{let g0=f4(fX,{'trimBegin':fV,'trimEnd':fW,'commonStart':fZ});await fY['add'](g0),fY['close']();}};}throw Error('Unsupported\x20mux\x20input\x20type:\x20'+fU['type']);};var f6=class{async['mux'](fS){const jG=gz;let {trimBegin:fT,trimEnd:fU}=f1(fS),fV=eZ(fS['output']),fW=new Output({'format':fV,'target':cE(fS[jG(0x1a0)])}),fX=[];try{for(let g0 of fS['inputs'])fX['push'](await f5(fW,fV,g0,fT,fU));let fY=fX['filter'](g2=>g2['kind']!==jG(0x16b));if(!fX['length'])throw Error(jG(0x214));let fZ=fY['length']>0x0?Math['min'](...fY['map'](g2=>g2['startTimestamp'])):fT??0x0;await fW['start']();for(let g2 of fX){if(g2[jG(0x1d2)]==='subtitle'){await g2['emit'](fZ);continue;}await g2['emit'](fZ);}return await fW[jG(0x11c)](),fS['output'];}catch(g3){throw await fW['cancel']()['catch'](()=>void 0x0),g3;}finally{for(let g4 of fX)g4['kind']!=='subtitle'&&g4['input']['dispose']();}}},f7=class{['strategy'];constructor(fS){this['strategy']=fS;}async['prepare'](){await this['strategy']['prepare']?.();}async['process'](fS){let fT=await this['strategy']['mux'](fS);if(fS['cleanup']){for(let fU of new Set(fS['inputs']['map'](fV=>fV['path'])))await rm(fU,{'force':!0x0});}return fT;}},f8=class{['fn'];['next']=null;constructor(fS){this['fn']=fS,this['next']=null;}},f9=class{['first']=null;['last']=null;constructor(){this['first']=null,this['last']=null;}['add'](fS){let fT=new f8(fS);return this['first']?this['last']['next']=fT:this['first']=fT,this['last']=fT,this;}async[gz(0x1c7)](fS){let fT=this['first'],fU=async()=>await fT['fn'](fS,async()=>{if(fT=fT['next'],fT)return await fU();throw Error('No\x20handler\x20detected');});return await fU();}};const fa=async(fS,fT)=>{const jH=gz;if(!fS['keys']['length'])return fT();let fU=eq('Decrypting'),fV=new eL(new eN());await fV['prepare']();for(let fW of fS['inputs']){let fX=extname(fW['path']),fY=fW['path'][jH(0x1ec)](fX,'.dec'+fX);if(!(fW['type']!=='video'&&fW['type']!=='audio')){if(await fV['process']({'input':fW['path'],'output':fY,'keys':fS['keys'],'type':fW['type'],'cleanup':!0x0}),!existsSync(fY))throw Error('Decryption\x20failed\x20for\x20file\x20'+fW['path']+'.\x20Unable\x20to\x20find\x20'+fY);fW['path']=fY;}}fU['success']('Decrypted'),await fT();},fb=async(fS,fT)=>{const jI=gz;if(fS['skipMux'])return fT();let fU=eq('Muxing'),fV=new f7(new f6());await fV['prepare'](),await fV['process']({'inputs':fS['inputs'],'output':fS['output'],'trimBegin':fS['trimBegin'],'trimEnd':fS['trimEnd'],'cleanup':!0x0}),existsSync(fS['output'])?(fU['success']('Muxed'),B['debug']('Muxed:\x20'+fS['output'])):fU[jI(0x122)](jI(0x11d)+fS[jI(0x1a0)]);},fc=0x1,fd=0x4,fe=0x8,ff=0x10,fg=(fS,fT)=>Math['max'](fc,Math['trunc'](typeof fS=='number'&&Number['isFinite'](fS)?fS:fT)),fh=fS=>fS['includes']('highConnectionsCount')?ff:fS['includes'](gz(0x1b6))?fe:fd,fi=({requestedConnections:fS,fallbackConnections:fT=fc,grantedBenefits:fU})=>{const jJ=gz;let fV=fg(fS,fg(fT,fc)),fW=fh(fU),fX=Math[jJ(0x154)](fV,fW);return{'connections':fX,'normalizedRequestedConnections':fV,'maxAllowedConnections':fW,'wasClamped':fX<fV};},fj=async fS=>{const jK=gz;let {grantedBenefits:fT}=await bU(),fU=null,fV=fT['includes']('parallelDownloads'),fW=fS[jK(0xca)]&&fS[jK(0xca)]>0x1;if(!fV&&fW&&(fU=Error('PARALLEL_DOWNLOADS_NOT_ALLOWED'),fS['maxActiveDownloads']=0x1),fS[jK(0x196)]||fS['proxyMeta']||fS['proxyMedia']){let fX=fT['includes']('proxy'),fY=fS['proxy']||fS['proxyMeta']||fS['proxyMedia'];!fX&&fY&&(fU=Error('PROXY_NOT_ALLOWED'),delete fS['proxy'],delete fS['proxyMeta'],delete fS['proxyMedia']);}if(fS['videoContainerFormat']&&fS['videoContainerFormat']!=='mp4'&&(fT['includes']('customMuxFormat')||(fU=Error(jK(0x212)),fS['videoContainerFormat']='mp4')),typeof fS[jK(0x1e6)]=='number'){let {connections:fZ}=fi({'requestedConnections':fS[jK(0x1e6)],'grantedBenefits':fT});fS['connections']=fZ;}return{'error':fU,'data':fS};},fk=fS=>({'retry':fS['get']('retry'),'connections':fS['get']('connections'),'proxy':fS['get']('proxy'),'proxyMeta':fS['get']('proxyMeta'),'proxyMedia':fS['get']('proxyMedia'),'movieTemplate':fS['get']('movieFilenameTemplate'),'episodeTemplate':fS[gz(0x207)]('seriesFilenameTemplate'),'hardsub':fS['get']('preferHardsub'),'format':fS['get']('videoContainerFormat')}),fl=({options:fS,fallbackConnections:fT,grantedBenefits:fU})=>{let fV=fi({'requestedConnections':fS['connections'],'fallbackConnections':fT,'grantedBenefits':fU});return{'options':{...fS,'connections':fV['connections']},'limit':fV};},fm=({settings:fS,requestedOptions:fT,filePath:fU,grantedBenefits:fV})=>{let fW=fk(fS),{options:fX,limit:fY}=fl({'options':{...fW,...fT},'fallbackConnections':fW['connections'],'grantedBenefits':fV});return fU&&(fX['outputPath']=fU),{'baseOptions':fW,'options':fX,'limit':fY};};var fn=class{['settings'];['extensionManager'];['downloadsStorage'];['callbacks'];constructor(fS,fT,fU,fV){const jL=gz;this['settings']=fS,this['extensionManager']=fT,this['downloadsStorage']=fU,this[jL(0x13c)]=fV;}async['run'](fS,fT,fU){const jM=gz;let fV;try{fS['status']=jM(0x17b),await this['callbacks']['persistJob'](fS),this['callbacks']['emitStatusChanged'](fS);let {options:fW,limit:fX}=fm({'settings':this['settings'],'requestedOptions':fS['options'],'filePath':fS['filePath'],'grantedBenefits':fU});fX['wasClamped']&&B['warn']('Connections\x20value\x20'+fX['normalizedRequestedConnections']+'\x20exceeds\x20tier\x20limit\x20('+fX['maxAllowedConnections']+jM(0x1a9)+fX['connections']+'.');let fY=new eH({'settings':this[jM(0x17d)],'downloadsStorage':this['downloadsStorage']});this.#e(fS,fT,fY);let fZ=fS['resource'];if(!fZ)throw Error('Download\x20job\x20is\x20missing\x20a\x20media\x20resource');let g0=fS['url']?await this['extensionManager']['getExtensionForUrl'](fS[jM(0x22b)]):null,g2=fS['url']?await ci({'resource':fZ,'url':fS['url'],'options':fW,'extension':g0}):{'source':fZ['source']};fV=g2['input'],fZ['source']=g2['source'],await this['callbacks']['persistJob'](fS),g0&&await bf(g0);let {downloaded:g3=[],psshList:g4,selectedTracks:g5}=await fY['start'](fW,g2['source'],fZ['metadata'],fT['signal'],g2['input']);if(fT['signal']['aborted'])return;if(!g3['length'])throw F['emit']('error',{'code':'NO_FILES_DOWNLOADED'}),Error('No\x20files\x20were\x20downloaded');g3['length']&&!fS['filePath']&&(fS['filePath']=g3[0x0]?.['path']),this['callbacks']['trackArtifact'](fS['id'],fS['filePath']);for(let g8 of g3)this['callbacks']['trackArtifact'](fS['id'],g8['path']);if(fS['status']!=='downloading')return;fS['status']='processing',this['callbacks']['emitStatusChanged'](fS);let g6=await this.#r({'job':fS,'options':fW,'psshList':g4??[],'selectedTracks':g5,'extension':g0,'resolvedEntry':g2['entry'],'resolvedInput':g2['input']}),g7=new f9();g7['add'](fa)['add'](fb),await g7['process']({'inputs':g3,'output':fS['filePath'],'keys':g6,'trimBegin':fW['trimBegin'],'trimEnd':fW['trimEnd'],'binariesDir':this['settings']['get']('binariesDir'),'skipMux':fW['skipMux']}),g0&&await bg(g0,{'skipMux':fW['skipMux']}),fS[jM(0xc7)]='completed',fS['progress']=0x64,this['callbacks'][jM(0x167)](fS),this['callbacks']['emitJobCompleted'](fS);}catch(g9){if(g9 instanceof Error&&g9['name']==='AbortError'){B['debug']('Download\x20was\x20aborted\x20(paused):\x20'+fS['id']);return;}let {normalizedError:ga,alreadyHandled:gb}=this.#t(fS,g9);if(this.#n(ga),gb)return;B['error']('Download\x20job\x20failed:\x20'+ga),cp('Download\x20job\x20failure',ga),this['callbacks']['emitStatusChanged'](fS),this['callbacks']['emitJobError'](fS,ga);}finally{await fV?.['dispose']?.();}}#e(fS,fT,fU){fU['on']('output-path',fW=>{fS['filePath']=fW,this['callbacks']['trackArtifact'](fS['id'],fW),this['callbacks']['persistJob'](fS),B['debug']('Job\x20output\x20path\x20persisted\x20early:\x20id='+fS['id']+',\x20path='+fW);});let fV={};fU['on']('progress',fW=>{const jN=b;if(fT['signal']['aborted']||fS['status']!=='downloading')return;fV[fW['trackPath']]=fW,this['callbacks']['trackArtifact'](fS['id'],fW['trackPath']),this['callbacks']['trackArtifact'](fS['id'],fW['finalPath']);let fX=0x0,fY=0x0;for(let g0 in fV)fX+=fV[g0]['current']['b'],fY+=fV[g0]['total']['b'];let fZ=fY>0x0?fX/fY*0x64:0x0;fS['filePath']=fW['finalPath'],fS['progress']=fZ,fS['downloadedBytes']=fX,fS['totalBytes']=fY,fW[jN(0x12a)]&&(fS['quality']=fW['quality']),fW[jN(0x106)]&&(fS['codec']=fW['codec']),this['callbacks']['emitProgress'](fS),this[jN(0x13c)]['persistJob'](fS);}),fU['on']('error',fW=>{const jO=b;if(fS['status']==='paused'||fT['signal']['aborted'])return;let {normalizedError:fX,alreadyHandled:fY}=this.#t(fS,fW);fY||(B['error']('Downloader\x20process\x20failed:\x20'+fX['message']),fX[jO(0x18f)]&&B['debug'](fX['stack']),this['callbacks']['emitStatusChanged'](fS),this['callbacks']['emitJobError'](fS,fX));});}#t(fS,fT){const jP=gz;let fU=fT instanceof Error?fT:Error(String(fT)),fV=fS['status']==='error'&&fS['error']===fU[jP(0x1e5)];return fV||(fS['status']='error',fS['error']=fU['message']),{'normalizedError':fU,'alreadyHandled':fV};}#n(fS){(fS&&typeof fS=='object'&&'code'in fS?String(fS['code']):'')==='DOWNLOAD_DIR_NOT_WRITABLE'&&F['emit']('error',{'code':'DOWNLOAD_DIR_NOT_WRITABLE'});}async #r({job:fS,options:fT,psshList:fU,selectedTracks:fV,extension:fW,resolvedEntry:fX,resolvedInput:fY}){const jQ=gz;let fZ=fS['resource']?.['source']?.[jQ(0x16e)]??fS['resource']?.[jQ(0x16e)];fS['resource']?.['drmPayload']&&fS['url']&&(fZ=await cj(fS['resource'],fT,fW));let g0=await this.#i({'extension':fW,'selectedTracks':fV,'resolvedEntry':fX,'resolvedInput':fY,'options':fT}),g2=await this.#a({'extension':fW,'selectedTracks':fV,'resolvedEntry':fX,'resolvedInput':fY,'options':fT}),g3=fZ&&'server'in fZ?c7(fZ):void 0x0,g4=g2['resolveLicense']??g3,g5=g2['licenseUrl']??(fZ&&'server'in fZ?fZ['server']:void 0x0);return eK({'keys':[...fT['keys']??[],...g0],'drm':fZ,'psshList':fU,'drmDir':this['settings']['get']('drmDir'),'resolveLicense':g4,'licenseUrl':g5})['catch'](g6=>{const jR=jQ;throw B['error']('Failed\x20to\x20extract\x20decryption\x20keys\x20for\x20job\x20'+fS['id']),B['debug']('DRM\x20extraction\x20context:\x20title='+(fS['title']||fS['resource']?.['metadata']?.['title']||jR(0x221))+',\x20drmServer='+(fZ&&'server'in fZ?fZ['server']:'(none)')+',\x20psshCount='+fU['length']+',\x20providedKeyCount='+(fT['keys']?.[jR(0x140)]??0x0)),g6 instanceof Error?(cp('DRM\x20extraction\x20failure',g6),g6['message']==='Unauthorized'&&F['emit']('error',{'code':'DRM_UNAUTHORIZED'}),g6['message']==='Forbidden'&&F['emit']('error',{'code':'DRM_FORBIDDEN'})):B['debug'](String(g6)),g6;});}async #i({extension:fS,selectedTracks:fT,resolvedEntry:fU,resolvedInput:fV,options:fW}){const jS=gz;if(!fS||!fU||!fV)return[];let fX=bb(fS);if(typeof fX['drm']?.['getKeys']!='function')return[];let fY=new Map(),fZ={...fU,'input':fV};for(let g0 of fT){if(!g0['inputTrack'])continue;let g2=(await cP(g0)['catch'](()=>[]))[0x0],g3=g2?.[jS(0x18c)]?.['encryption']??g2?.['encryption'],g4=[g3?.['drm']?.['widevine']?'widevine':null,g3?.['drm']?.['playready']?jS(0x132):null,g3?.['drm']?.['fairplay']?'fairplay':null][jS(0x201)](Boolean)[0x0];if(!g4)continue;let g5=await fX['drm']['getKeys']({'system':g4,'entry':fZ,'track':g0['inputTrack'],'options':fW});for(let [g6,g7]of g5??[])fY['set'](g6,g7);}return Array['from'](fY,([g8,g9])=>({'kid':g8,'key':g9}));}async #a({extension:fS,selectedTracks:fT,resolvedEntry:fU,resolvedInput:fV,options:fW}){const jT=gz;if(!fS||!fU||!fV)return{};let fX=bb(fS);if(typeof fX[jT(0x16e)]?.[jT(0xe8)]!='function')return{};let fY=await this.#o(fT);if(!fY['size'])return{};let fZ={...fU,'input':fV};return{'licenseUrl':'extension://'+fS['package']['name']+'/license','resolveLicense':async({pssh:g0,data:g2})=>{let g3=fY['get'](g0);if(!g3)throw Error('No\x20DRM\x20track\x20binding\x20found\x20for\x20PSSH\x20'+g0);return await fX['drm']['getLicense']({'system':g3['system'],'entry':fZ,'track':g3['track'],'options':fW,'data':g2});}};}async #o(fS){const jU=gz;let fT=new Map();for(let fU of fS){if(!fU['inputTrack'])continue;let fV=(await cP(fU)['catch'](()=>[]))[0x0],fW=fV?.[jU(0x18c)]?.['encryption']??fV?.['encryption'];for(let fX of[this.#s(fU,'widevine',fW?.['drm']?.['widevine']?.['pssh']),this.#s(fU,'playready',fW?.['drm']?.['playready']?.['pssh']),this.#s(fU,'fairplay',fW?.['drm']?.['fairplay']?.['pssh'])])!fX||fT['has'](fX['pssh'])||fT['set'](fX[jU(0x20e)],fX);}return fT;}#s(fS,fT,fU){const jV=gz;if(!fS['inputTrack']||!fU)return null;let fV=typeof fU=='string'?fU:fU instanceof Uint8Array||fU instanceof ArrayBuffer?Buffer['from'](fU)[jV(0x11e)]('base64'):null;return fV?{'pssh':fV,'system':fT,'track':fS['inputTrack']}:null;}},fo=class extends S{['settings'];['extensionManager'];['downloadsStorage'];#e=new ck();#t=new Map();#n=null;#r;['maxActiveDownloads'];constructor(fS,fT,fU){const jW=gz;super(),this['settings']=fS,this['extensionManager']=fT,this['downloadsStorage']=fU,this['maxActiveDownloads']=fS['get']('maxActiveDownloads'),this.#r=new fn(fS,fT,fU,{'persistJob':fV=>this['downloadsStorage']['update'](fV),'emitStatusChanged':fV=>this['emit']('job-status-changed',fV),'emitProgress':fV=>this[jW(0xdb)]('job-progress',fV),'emitJobError':(fV,fW)=>this['emit']('job-error',fV,fW),'emitJobCompleted':fV=>this['emit'](jW(0x161),fV),'trackArtifact':(fV,fW)=>this.#m(fV,fW)}),B['debug']('Created\x20download\x20manager\x20with\x20max\x20active\x20downloads:\x20'+this['maxActiveDownloads']);}async['initializeFromStorage'](){let fS=new Set(['downloading','queued','processing','pending','analyzing']);for(let fT of this['downloadsStorage']['jobs'])fT['status']==='paused'||fT['status']==='completed'||fT['status']==='error'||fS['has'](fT['status'])&&(fT['status']!=='queued'&&(fT['status']='queued',fT['error']=void 0x0,await this['downloadsStorage']['update'](fT)),this.#d(fT));this.#s();}async['analyze'](fS,fT={}){if(!fS){let fV=Error('Cannot\x20prepare\x20job\x20without\x20a\x20URL.');throw this['emit']('error',fV),fV;}let fU=await ch(fS,fT,await this['extensionManager']['getExtensionForUrl'](fS));if(!fU)throw Error('No\x20media\x20resource\x20found');return fU;}async['add'](fS){const jX=gz;if(!fS[jX(0x22b)]&&!fS['resource'])throw Error('Job\x20must\x20have\x20either\x20a\x20URL\x20or\x20a\x20pre-prepared\x20resource.');let fT={'id':crypto['randomUUID'](),'status':'queued','progress':0x0,'downloadedBytes':0x0,'createdAt':new Date()['toISOString'](),...fS};B['debug']('Adding\x20new\x20job:\x20'+fT['id']),B['debug']('URL:\x20'+fT['url']),await this['downloadsStorage']['add'](fT),this['emit']('job-added',fT),this.#d(fT),this.#s();}async['pause'](fS){let fT=await this.#i(fS,'pause');fT&&B['debug']('Paused\x20download:\x20'+fT['id']);}async['resume'](fS){const jY=gz;let fT=this.#e['getActiveRun'](fS);if(fT){fT['cancellationReason']==='pause'||fT['controller']['signal']['aborted']?(this.#e['queueResumeAfterStop'](fS),B['debug']('Resume\x20queued\x20until\x20stop\x20completes:\x20'+fS)):B['debug']('Resume\x20skipped\x20while\x20job\x20is\x20active:\x20'+fS);return;}let fU=this.#y(fS);if(!fU){B['warn']('Resume\x20failed:\x20Job\x20'+fS+'\x20not\x20found');return;}if(fU['status']===jY(0x12e)){await this.#a(fU),B['debug']('Resumed\x20download:\x20'+fU['id']);return;}fU['status']==='error'&&await this.#o(fU)&&B['debug']('Retried\x20download:\x20'+fU['id']);}async['remove'](fS){await this.#i(fS,'remove'),await this['downloadsStorage']['delete'](fS),this.#t['delete'](fS);}async['removeWithFile'](fS){let fT=this.#y(fS),fU=await this.#i(fS,'remove-with-file')||fT,fV=this.#h(fS,fU);await this['downloadsStorage']['delete'](fS),await this.#_(fV),this.#t['delete'](fS);}async #i(fS,fT){const jZ=gz;let fU=this.#f(fS),fV=this.#e['getActiveRun'](fS),fW=this.#y(fS);return fV?fT==='pause'&&fV['job']['status']!=='downloading'?(B['debug']('Pause\x20ignored\x20for\x20non-downloading\x20stage:\x20id='+fS+',\x20stage='+fV['job']['status']),fV['job']):(fV['cancellationReason']=fT,fT==='pause'&&(fV[jZ(0xe4)]['status']=jZ(0x12e),fV['job']['error']=void 0x0,await this['downloadsStorage']['update'](fV['job']),this['emit']('job-status-changed',fV[jZ(0xe4)])),fV['controller'][jZ(0x165)](),await fV['runPromise'],fV['job']):(fT==='pause'&&fW&&(fU||fW[jZ(0xc7)]==='queued')&&(fW['status']='paused',fW['error']=void 0x0,await this['downloadsStorage'][jZ(0xdf)](fW),this['emit']('job-status-changed',fW)),fW??void 0x0);}async #a(fS){fS['status']='queued',fS['error']=void 0x0,await this['downloadsStorage']['update'](fS),this['emit']('job-status-changed',fS),this.#d(fS),this.#s();}async #o(fS){const k0=gz;let fT=this.#h(fS['id'],fS);this.#t['delete'](fS['id']),await this.#_(fT),fS['status']='analyzing',fS[k0(0x122)]=void 0x0,fS[k0(0x20d)]=0x0,fS['downloadedBytes']=0x0,fS['totalBytes']=void 0x0,fS['quality']=void 0x0,fS['codec']=void 0x0,await this[k0(0x195)]['update'](fS),this['emit']('job-status-changed',fS);try{if(fS['url']){let fU=await this['analyze'](fS['url'],fS['options']??{}),fV=this.#g(fS,fU);if(!fV)throw Error(k0(0x163));fS['resource']=fV;}return await this.#a(fS),!0x0;}catch(fW){return fS['status']=k0(0x122),fS['error']=fW instanceof Error?fW[k0(0x1e5)]:String(fW),await this['downloadsStorage']['update'](fS),this['emit']('job-status-changed',fS),this['emit']('job-error',fS,fW),!0x1;}}#s(){for(this['maxActiveDownloads']=this['settings']['get']('maxActiveDownloads');this.#e['activeRunCount']<this['maxActiveDownloads'];){let fS=this.#p();if(!fS)break;this.#c(fS);}this.#e['queuedCount']===0x0&&this.#e['activeRunCount']===0x0&&this['emit']('idle');}#c(fS){const k1=gz;if(fS['status']!=='queued'){B['warn'](k1(0x181)+fS['id']+'\x20('+fS['status']+')');return;}let fT=new AbortController(),fU={'controller':fT,'job':fS,'runPromise':Promise[k1(0x183)]()};this.#e['setActiveRun'](fS['id'],fU),fU['runPromise']=this.#u(fS,fT)['catch'](fV=>{let fW=fV instanceof Error?fV:Error('Download\x20run\x20failed:\x20'+String(fV));B['error'](fW['message']),this['emit']('error',fW);});}async #l(){const k2=gz;if(this.#n)return this.#n;try{let {grantedBenefits:fS}=await bU();this.#n=fS;}catch(fT){let fU=fT instanceof Error?fT[k2(0x1e5)]:String(fT);B[k2(0x124)]('Failed\x20to\x20resolve\x20customer\x20plan\x20for\x20connection\x20limits.\x20Falling\x20back\x20to\x20Free\x20limits:\x20'+fU),this.#n=[];}return this.#n;}async #u(fS,fT){const k3=gz;this.#e['setActiveJob'](fS);try{let fU=await this.#l();await this.#r['run'](fS,fT,fU);}finally{let fV=this.#e['getActiveRun'](fS['id']);if(fV){let fW=fV?.['cancellationReason'],fX=fW==='pause'&&this.#e['consumeResumeAfterStop'](fS['id']);fW==='pause'?(fS['status']='paused',fS['error']=void 0x0,await this['downloadsStorage']['update'](fS),this[k3(0xdb)]('job-status-changed',fS)):fW!=='remove'&&fW!=='remove-with-file'&&await this['downloadsStorage']['update'](fS),this.#e['deleteActiveJob'](fS['id']),this.#e['deleteActiveRun'](fS['id']),fX&&fS['status']==='paused'&&(fS['status']='queued',fS['error']=void 0x0,await this['downloadsStorage']['update'](fS),this['emit'](k3(0x1ae),fS),this.#d(fS)),this.#s();}}}#d(fS){this.#e['enqueue'](fS);}#f(fS){const k4=gz;return this.#e[k4(0x1a3)](fS);}#p(){return this.#e['dequeueNext'](fS=>this.#y(fS));}#m(fS,fT){const k5=gz;if(!fT)return;let fU=this.#t[k5(0x207)](fS);fU||(fU=new Set(),this.#t[k5(0x215)](fS,fU)),fU['add'](fT);}#h(fS,fT){const k6=gz;let fU=new Set();for(let fW of this.#t['get'](fS)??[])fU['add'](fW);fT?.['filePath']&&fU['add'](fT['filePath']);let fV=new Set();for(let fX of fU)fV['add'](fX),fV[k6(0x22a)](fX+'.part.json'),fV['add'](this.#v(fX));return fV;}#g(fS,fT){const k7=gz;let fU=Array[k7(0x1f5)](fT)?fT:[fT];if(fU[k7(0x140)]<=0x1)return fU[0x0];let fV=fS['resource']?.['metadata'],fW=fS['resource']?.['source']['url'],fX=fV&&'seasonNumber'in fV?fV['seasonNumber']:null,fY=fV&&'episodeNumber'in fV?fV['episodeNumber']:null,fZ=fV&&'episodeTitle'in fV?fV[k7(0x1f2)]:null;return fU['find'](g0=>{let g2=g0['metadata'];if(fV?.['id']&&g2?.['id'])return fV['id']===g2['id'];let g3=g2&&'seasonNumber'in g2?g2['seasonNumber']:null,g4=g2&&'episodeNumber'in g2?g2['episodeNumber']:null,g5=g2&&'episodeTitle'in g2?g2['episodeTitle']:null;return fV?.['title']&&g2?.['title']&&fV['title']===g2['title']&&fX===g3&&fY===g4&&fZ===g5?!0x0:!!fW&&fW===g0['source']['url'];})??fU[0x0];}async #_(fS){fS['size']!==0x0&&await Promise['all']([...fS]['map'](fT=>rm(fT,{'recursive':!0x0,'force':!0x0})['catch'](()=>void 0x0)));}#v(fS){let fT=resolve(fS),fU=parse(fS)['name'];return join(l,fU+'-'+createHash('sha1')['update'](fT)['digest']('hex')['slice'](0x0,0xa));}#y(fS){return this.#e['getActiveJob'](fS)||this['downloadsStorage']['get'](fS);}['onJobAdded'](fS){const k8=gz;return this['on']('job-added',fS),()=>this[k8(0x22d)]('job-added',fS);}['onJobStatusChanged'](fS){return this['on']('job-status-changed',fS),()=>this['removeListener']('job-status-changed',fS);}[gz(0x1f0)](fS){return this['on']('job-progress',fS),()=>this['removeListener']('job-progress',fS);}['onJobCompleted'](fS){const k9=gz;return this['on']('job-completed',fS),()=>this[k9(0x22d)]('job-completed',fS);}[gz(0x123)](fS){const ka=gz;return this['on'](ka(0x1d0),fS),()=>this['removeListener']('job-error',fS);}['onIdle'](fS){return this['on']('idle',fS),()=>this['removeListener']('idle',fS);}['onError'](fS){return this['on']('error',fS),()=>this['removeListener']('error',fS);}['waitForIdle'](){return new Promise(fS=>this['onIdle'](fS));}};const fp=fS=>{if(!fS)return null;let [fT,fU]=fS['toLowerCase']()['split']('e');return[parseInt(fT['trim']()['toLowerCase']()['replace']('s','')),parseFloat(fU?.['trim']())];},fq=fS=>{const kb=gz;let fT=0x0,fU=0x270f,fV=[],fW=fS['split'](',');for(let fY of fW){let [fZ,g0]=fY['split']('-'),g2=fp(fZ),g3=fp(g0);if(g2&&!g0){let [g4,g5]=g2;if(isNaN(g5)){for(let g6=0x0;g6<=fU;g6++)fV['push']([g4,g6]);}else fV['push']([g4,g5]);}else{if(g2&&g3){let [g7,g8]=g2,[g9,ga]=g3;for(let gb=g7;gb<=g9;gb++){let gc=g8||0x0,gd=gb===g9?ga:fU;for(let ge=gc;ge<=gd;ge++)fV['push']([gb,ge]);}}}}let fX=new Map();for(let [gf,gg]of fV)fX['has'](gf)||fX['set'](gf,new Set()),fX[kb(0x207)](gf)?.['add'](gg);return fX;},fr=fS=>{if(!fS)return{};let fT={},fU=typeof fS=='string'?fS['split']('|'):fS;for(let fV of fU){let [fW,...fX]=fV['split'](':'),fY=fX['join'](':');if(!fY)throw Error('Can\x27t\x20parse\x20header:\x20'+fV);fT[fW['trim']()]=fY['trim']();}return fT;},ft=async fS=>{let fT=!0x1,fU=fS;do try{fU?fT=!!new URL(fU):fU=(await m['ask']({'fields':{'url':{'label':'URL'}}}))['url'];}catch{fU=(await m['ask']({'fields':{'url':{'label':'URL'}}}))['url'];}while(!fT);return fU!==fS&&B['debug']('URL:\x20'+fU),fU;},fu=(fS,fT)=>new Date(fT['createdAt']??0x0)['getTime']()-new Date(fS['createdAt']??0x0)['getTime']();var fv=class{['filePath'];['jobs']=[];#e=Promise['resolve']();constructor(fS){this['filePath']=fS;}['parse'](fS){let fT=JSON['parse'](fS),fU=Object['entries'](fT);return new Map(fU);}async['load'](){await this.#e;try{let fS=await readFile(this['filePath'],{'encoding':'utf8'});this['jobs']=JSON['parse'](fS)['toSorted'](fu);}catch{this['jobs']=[];}return this;}get['size'](){return this['jobs']['length'];}async['add'](fS){await this.#t(async()=>{this['jobs']['unshift'](fS),await this['save']();});}async['update'](fS){await this.#t(async()=>{let fT=this['jobs']['findIndex'](fU=>fU['id']===fS['id']);fT!==-0x1&&(this['jobs'][fT]=fS,await this['save']());});}['getByFilePath'](fS){const kc=gz;return this[kc(0x11b)][kc(0x1b8)](fT=>fT['filePath']===fS);}['get'](fS){return this['jobs']['find'](fT=>fT['id']===fS);}['has'](fS){const kd=gz;return this['jobs'][kd(0x13b)](fT=>fT['id']===fS);}async[gz(0x1a7)](fS){await this.#t(async()=>{const ke=b;let fT=this['jobs'][ke(0x147)](fU=>fU['id']===fS);fT!==-0x1&&(this['jobs']['splice'](fT,0x1),await this['save']());});}async['deleteWithFile'](fS){let fT=await this.#t(async()=>{let fU=this['jobs']['findIndex'](fW=>fW['id']===fS);if(fU===-0x1)return null;let [fV]=this['jobs']['splice'](fU,0x1);return await this['save'](),fV??null;});fT?.['filePath']&&await rm(fT['filePath'],{'recursive':!0x0,'force':!0x0});}async['clear'](){await this.#t(async()=>{this['jobs']=[],await this['save']();});}async['save'](){const kf=gz;return writeFile(this[kf(0x1f8)],JSON['stringify'](this['jobs'],null,0x2));}#t(fS){const kg=gz;let fT=this.#e[kg(0x188)](fS,fS);return this.#e=fT['then'](()=>void 0x0,()=>void 0x0),fT;}};const fw={'command':['download\x20[urls..]','$0\x20[urls..]'],'aliases':['dl'],'describe':'Download\x20media\x20content\x20by\x20URL','builder':fS=>fS['option']('quality',{'alias':'q','describe':'Video\x20resolution\x20quality\x20-\x202160p/1080p/720p/...,\x20defaults\x20to\x20highest\x20available','type':'string'})['option']('video-codec',{'alias':'v','describe':'Video\x20codec\x20-\x20avc\x20|\x20hevc\x20|\x20vp8\x20|\x20vp9\x20|\x20av1\x20|\x20vc1,\x20defaults\x20to\x20any','type':gz(0x1d7)})['option']('video-range',{'alias':'r','describe':'Video\x20color\x20range\x20-\x20sdr\x20|\x20hlg\x20|\x20hdr10\x20|\x20hdr10+\x20|\x20dv,\x20defaults\x20to\x20sdr','type':'string'})['option'](gz(0xdd),{'describe':'Video\x20bitrate\x20(in\x20kbps),\x20defaults\x20to\x20highest\x20available','type':'number'})[gz(0x108)]('video-dimension',{'describe':'Video\x20dimension\x20-\x202D/3D\x20(HSBS/HOU/FSBS/OU),\x20defaults\x20to\x202D','default':'2D','type':'string'})['option']('audio-codec',{'alias':'a','describe':'Audio\x20codec\x20-\x20aac\x20|\x20opus\x20|\x20mp3\x20|\x20vorbis\x20|\x20flac\x20|\x20alac\x20|\x20ac3\x20|\x20eac3\x20|\x20dts,\x20defaults\x20to\x20any','type':'string'})['option']('audio-channels',{'alias':'c','describe':'Audio\x20channels,\x20matches\x20sub-channel\x20layouts\x20like\x205.1\x20with\x206.0','type':'number'})['option']('audio-bitrate',{'describe':'Audio\x20bitrate\x20(in\x20kbps),\x20defaults\x20to\x20highest\x20available','type':'number'})['option'](gz(0x136),{'alias':'s','describe':'Subtitle\x20format\x20-\x20SRT/SSA/ASS/TTML/VTT/STPP/WVTT','type':gz(0x1d7)})['option']('subs-lang',{'alias':'S','describe':gz(0x1cc),'type':gz(0x1d7)})['option'](gz(0x10a),{'alias':'l','describe':'Video/audio\x20language(s)','type':'string'})[gz(0x108)]('skip-video',{'describe':'do\x20not\x20download\x20video','type':'boolean'})['option']('skip-audio',{'describe':'do\x20not\x20download\x20audio','type':'boolean'})['option'](gz(0x103),{'describe':'do\x20not\x20download\x20subtitles','type':gz(0x1b1)})['option']('skip-mux',{'describe':'Disable\x20merge\x20audio/video/subs\x20into\x20single\x20file','type':'boolean'})[gz(0x108)]('select',{'describe':'Select\x20audio/video/subtitle\x20streams\x20from\x20manifest\x20manually','type':'boolean'})['option']('episodes',{'alias':'e','describe':'Seasons/episodes\x20to\x20download,\x20e.g.\x20`S01E01`,\x20`S01-S05,S07`,\x20`S01E01-S02E03`,\x20`S02-S02E03`,\x20etc.','type':'string','coerce':fT=>fq(fT)})['option']('retry',{'alias':'R','describe':'Number\x20of\x20retries\x20in\x20case\x20of\x20unsuccessful\x20request','type':gz(0x1ad),'default':ay['retry']})['option']('connections',{'alias':'C','describe':'Number\x20of\x20parallel\x20http\x20connections\x20per\x20download','type':'number','default':ay['connections']})['option']('proxy',{'describe':'Use\x20specified\x20HTTP/HTTPS\x20proxy\x20for\x20all\x20requests','type':'string'})['option']('proxy-meta',{'describe':'Use\x20specified\x20HTTP/HTTPS\x20proxy\x20for\x20metadata\x20fetching','type':'string'})['option']('proxy-media',{'describe':'Use\x20specified\x20HTTP/HTTPS\x20proxy\x20for\x20media\x20downloading','type':'string'})['option']('movie-template',{'describe':'Movie\x20filename\x20template','type':'string','default':ay['movieFilenameTemplate']})['option']('episode-template',{'describe':gz(0x224),'type':'string','default':ay['seriesFilenameTemplate']})['option']('hardsub',{'describe':'Download\x20hardsubbed\x20video\x20if\x20available','type':'boolean'})['option']('trim-begin',{'describe':'Trim\x20video\x20at\x20the\x20beginning;\x20example:\x2000:00:06','type':'string'})['option']('trim-end',{'describe':'Trim\x20video\x20at\x20the\x20end;\x20example:\x2000:01:30','type':'string'})['option']('key',{'describe':'Set\x20content\x20decryption\x20key\x20(if\x20manifest\x20URL\x20as\x20main\x20URL\x20passed),\x20format:\x20KID:KEY','type':'array','string':!0x0,'coerce':fT=>fT['map'](fU=>{let [fV,fW]=fU['split'](':');return{'kid':fV,'key':fW};})})[gz(0x108)]('header',{'alias':'H','describe':'Pass\x20custom\x20header(s)\x20for\x20manifest\x20request','type':gz(0x198),'string':!0x0,'coerce':fT=>fr(fT)})[gz(0x108)]('format',{'alias':'f','describe':'Video\x20container\x20format\x20-\x20mp4\x20|\x20mkv\x20(Pro\x20only)','type':'string','choices':['mp4','mkv']}),'handler':async fS=>{const kh=gz;let fT=fS;fT[kh(0x169)]=fS['quality'];let fU=new az(d);if(fT['format']){let {error:g7}=await fj({'videoContainerFormat':fT['format']});g7&&(B[kh(0x122)]('Invalid\x20format:\x20'+g7['message']),B['info']('Learn\x20more:\x20https://azot.mov/pricing'),process['exit'](0x1));}let fV=[];try{({grantedBenefits:fV}=await bU());}catch(g8){let g9=g8 instanceof Error?g8['message']:String(g8);B['warn']('Failed\x20to\x20resolve\x20customer\x20plan\x20for\x20connection\x20limits.\x20Falling\x20back\x20to\x20Free\x20limits:\x20'+g9);}let {options:fW,limit:{normalizedRequestedConnections:fX,maxAllowedConnections:fY,wasClamped:fZ,connections:g0}}=fl({'options':fT,'fallbackConnections':fU[kh(0x207)]('connections'),'grantedBenefits':fV});Object[kh(0x10c)](fT,fW),fZ&&B['warn']('Connections\x20value\x20'+fX+'\x20exceeds\x20tier\x20limit\x20('+fY+').\x20Using\x20'+g0+'.');let g2=new bY({'dirs':[j],'indexPath':I});await g2['init'](),await g2['loadCoreExtensions'](),await g2[kh(0x16d)]();let g3=new fv(join(x,'downloads.json'));await g3['load']();let g4=new fo(fU,g2,g3);bL()['then'](ga=>Object['assign'](bJ,ga)),g4['onJobCompleted'](ga=>{const ki=kh;B['debug'](ki(0xd3)+ga['id']);}),g4['onJobError'](ga=>{const kj=kh;B['debug']('Job\x20failed:\x20'+ga[kj(0x122)]);}),g4['onError'](ga=>{B['error']('Download\x20manager\x20error:\x20'+ga['message']);});let g5=(Array['isArray'](fS['urls'])?fS['urls']:[])['filter'](ga=>ga!==process['argv'][0x1]),g6=g5[kh(0x140)]>0x0?g5:[''];for(let ga of g6){let gb=await ft(ga),gc=await g4['analyze'](gb,fT),gd=Array['isArray'](gc)?gc:[gc];for(let ge of gd)g4[kh(0x22a)]({'url':gb,'options':fT,'resource':ge});}await g4['waitForIdle']();}},fx='azot-desktop',fy=async()=>{const kk=gz;if(await bL()&&!await confirm({'message':'You\x27re\x20already\x20logged\x20in.\x20Do\x20you\x20want\x20to\x20log\x20in\x20again?','default':!0x1})){B[kk(0xed)]('Login\x20cancelled');return;}let fS=createSpinner('Requesting\x20device\x20authorization...');fS['start']();try{let fT=bA(),{data:fU,error:fV}=await fT['device'][kk(0x117)]({'client_id':fx,'scope':kk(0x185)});if(fS['stop'](),fV||!fU)B['error']('Failed\x20to\x20request\x20device\x20authorization:\x20'+(fV?.[kk(0x193)]||fV?.['statusText']||'Unknown\x20error')),B['debug'](fV);else{let {device_code:fW,user_code:fX,verification_uri:fY,verification_uri_complete:fZ,interval:g0=0x5,expires_in:g2}=fU;console['log'](''),console['log'](O['cyan']('📱\x20Device\x20Authorization\x20Required')),console['log'](''),console['log']('Please\x20visit:\x20'+O[kk(0x1d4)](O['blue'](fY))),console['log']('Enter\x20code:\x20'+O[kk(0x21f)](O['green'](fX))),console['log'](''),await confirm({'message':'Open\x20browser\x20automatically?','default':!0x0})&&await Z(fZ||fY),console['log'](O['gray']('Waiting\x20for\x20authorization\x20(expires\x20in\x20'+Math['floor'](g2/0x3c)+'\x20minutes)...'));let g3=await fz(fT,fW,fx,g0);if(g3){await bK(g3);let {data:g4}=await fT['getSession']({'fetchOptions':{'headers':{'Authorization':'Bearer\x20'+g3['access_token']}}});console['log'](O['green']('✅\x20Login\x20successful!\x20Logged\x20in\x20as\x20'+(g4?.['user']?.['name']||g4?.['user']?.['email']||'User')));}}}catch(g5){fS[kk(0x18b)](),B['error']('Login\x20failed:\x20'+(g5 instanceof Error?g5['message']:'Unknown\x20error'));}};async function fz(fS,fT,fU,fV){let fW=fV,fX=createSpinner('',{'color':'cyan'}),fY=0x0;return new Promise(fZ=>{let g0=async()=>{const kl=b;fY=(fY+0x1)%0x4,fX['update'](O['gray'](kl(0x19f)+'.'['repeat'](fY)+'\x20'['repeat'](0x3-fY))),fX['isSpinning']()||fX['start']();try{let {data:g2,error:g3}=await fS['device']['token']({'grant_type':'urn:ietf:params:oauth:grant-type:device_code','device_code':fT,'client_id':fU,'fetchOptions':{'headers':{'user-agent':'Azot\x20Desktop'}}});if(g2?.['access_token']){fX['stop'](),fZ(g2);return;}else{if(g3)switch(g3[kl(0x122)]){case'authorization_pending':break;case'slow_down':fW+=0x5,fX[kl(0xdf)](O['yellow']('Slowing\x20down\x20polling\x20to\x20'+fW+'s'));break;case'access_denied':fX['stop'](),B['error']('Access\x20was\x20denied\x20by\x20the\x20user');break;case'expired_token':fX['stop'](),B['error'](kl(0xf0));break;default:fX['stop'](),B['error'](kl(0x15c)+g3['error_description']);}}}catch(g4){fX['stop'](),B['error']('Network\x20error:\x20'+(g4 instanceof Error?g4[kl(0x1e5)]:'Unknown\x20error'));return;}setTimeout(g0,fW*0x3e8);};setTimeout(g0,fW*0x3e8);});}const fA=async()=>{B['info']('Logging\x20out...');let fS=await bA()['signOut']();fS['error']?B['error']('Logout\x20failed:\x20'+fS['error']['message']):(B['info']('Logout\x20successful'),await bK({}));},fB={'command':'login\x20[extension]','describe':'Login\x20to\x20extension\x20(or\x20if\x20no\x20extension\x20is\x20specified,\x20login\x20to\x20Azot\x20account)','builder':fS=>fS['option']('username',{'alias':'u','describe':'Username','type':'string'})['option']('password',{'alias':'p','describe':gz(0x1c4),'type':'string'})['option']('otp',{'alias':'o','describe':'One-time\x20password','type':gz(0x1d7)}),'handler':async fS=>{let fT=fS['extension'],fU={'username':fS['username'],'password':fS['password'],'otp':fS['otp']};if(fT){let fV=new bY({'dirs':[j],'indexPath':I});await fV['init'](),await fV['discover'](),await fV['login'](fT,fU);}else fy();}},fC={'command':'list','aliases':['ls'],'describe':'Lists\x20information\x20about\x20installed/active\x20extensions','handler':async()=>{const km=gz;let fS=await new bY({'indexPath':I})['init']();if(!fS['infoList']['length'])return console[km(0x158)]('No\x20added\x20extensions\x20found');for(let fT of fS[km(0x15d)]){let fU=''+O[km(0x21f)](O['blue'](fT['name']['padEnd'](0xf))),fV=O['green'](fT['package']?.['version']);console['log'](fU+fV);}console[km(0x158)]('\x0a'+O['dim']('Location:\x20'+n));}},fD=new Intl['RelativeTimeFormat']('en',{'style':'long'}),fE=fS=>{let fT=Math['floor'](fS/0x18),fU=Math['abs'](fT);return fU>0x16d?fD['format'](Math['floor'](fT/0x16d),'year'):fU>0x1e?fD['format'](Math['floor'](fT/0x1e),'month'):fU>0x7?fD['format'](Math['floor'](fT/0x7),'week'):fU>0x1?fD['format'](Math['floor'](fT),'day'):fD['format'](Math['floor'](fS),'hour');},fF=(fS,fT,fU)=>{const kn=gz;let fV=''+O['bold'](O['blue'](fS[kn(0x227)](0xf))),fW=O['green'](fT['padEnd'](0xa)),fX=O['dim'](fU);console['log'](fV+fW+fX);},fG={'command':'list-remote','aliases':['ls-remote'],'describe':'List\x20all\x20available\x20extensions','handler':async()=>{const ko=gz;bL()[ko(0x188)](fU=>Object['assign'](bJ,fU));let fS=await bY['getAvailableExtensions'](),fT=Date['now']();for(let fU of fS){let fV=fU['releases']['toSorted']((fZ,g0)=>new Date(g0['createdAt'])['getTime']()-new Date(fZ['createdAt'])['getTime']())['at'](0x0);if(!fV)continue;let fW=fV['createdAt'],fX=new Date(fW)[ko(0x190)]()-fT,fY=fE(Math['floor'](fX/0x36ee80));fF(fU[ko(0x1bf)],fV['version'],fY);}}},fH={'command':'logout\x20[extensions..]','describe':'Logout\x20from\x20extension\x20(or\x20if\x20no\x20extension\x20is\x20specified,\x20logout\x20from\x20Azot\x20account)','handler':async fS=>{const kp=gz;let fT=fS['extensions'];if(fT?.['length']){let fU=new bY({'dirs':[j],'indexPath':I});await fU['init'](),await fU['discover'](),await fU[kp(0x1f4)](fT);}else fA();}},fI={'command':gz(0x104),'describe':gz(0x237),'handler':async fS=>{const kq=gz;let fT=new az(d),fU=fS[kq(0x166)],fV=fS['value'];if(fU&&fV){fT['set']({[fU]:fV}),console['log']('Setting\x20'+O['bold'](O['blue'](fU))+'\x20set\x20to\x20'+O['green'](fV));return;}else{if(fU){let fX=fT['get'](fU);console['log'](fX?'Setting\x20'+O['bold'](O[kq(0x1df)](fU))+'\x20is\x20'+O[kq(0x10e)](fX):'Setting\x20'+O['bold'](O['blue'](fU))+'\x20is\x20not\x20found');return;}}let fW=fT['getAll']();for(let [fY,fZ]of Object['entries'](fW)){let g0=(''+fY)[kq(0x227)](0x19),g2=String(fZ)['replaceAll']('{','{{')['replaceAll']('}','}}');console['log'](O['bold'](O['blue'](g0))+'\x20'+g2);}console['log']('\x0a'+O['dim']('Location:\x20'+d));}},fJ={'command':gz(0xd6),'aliases':['rm'],'describe':'Uninstall\x20an\x20extension','handler':async fS=>{let fT=fS['extensions'],fU=new bY({'dirs':[j],'indexPath':I});await fU['init'](),await fU['uninstall'](fT);}},fK={'command':'install\x20<extensions..>','aliases':['i'],'describe':'Install\x20extension','handler':async fS=>{let fT=fS['extensions'],fU=new bY({'dirs':[j],'indexPath':I});await fU['init'](),await fU['install'](fT);}},fL={'command':'logs','describe':'Show\x20logs\x20list','handler':async()=>{const kr=gz;let fS=r,fT=await readdir(fS)['then'](fV=>fV['filter'](fW=>fW['endsWith']('.log'))),fU=fV=>join(fS,fV);fT['length']||B['info']('No\x20logs\x20found');for(let fV of fT)B[kr(0x240)](fU(fV));}};B['debug'](v);const fM=ac(process['argv']);B['debug'](k+'\x20'+fM['join']('\x20'));const fN=new Set(['build',gz(0x1f6)]);F['on'](gz(0x122),fS=>{let fT=p(fS);B['error'](fT['message']);});const fO=O[gz(0x21a)](O['bold'](g))+gz(0x23d)+h['description']['toLocaleLowerCase'](),fP=O['bold']('Usage:\x20$0\x20<command>\x20'+O['cyan']('[...options]')),fQ=(fS,fT)=>{let fU=fT instanceof Error?fT:Error(String(fT));B['fatal'](fS+':\x20'+fU['message']),fU['stack']&&B['debug'](fU['stack']),rmSync(l,{'recursive':!0x0,'force':!0x0}),process['exit'](0x1);};process['on']('uncaughtException',fS=>{fQ('Unexpected\x20error',fS);}),process['on']('unhandledRejection',fS=>{fQ('Unhandled\x20promise\x20rejection',fS);}),!c&&fN['has'](fM[0x0]??'')&&fQ('CLI\x20error',Error('The\x20`build`\x20and\x20`dev`\x20commands\x20are\x20unavailable\x20in\x20the\x20desktop-distributed\x20CLI.\x20Use\x20the\x20npm-installed\x20`azot`\x20package\x20in\x20a\x20Node.js\x20environment\x20instead.'));const fR=N(fM)['scriptName'](k)['usage'](fO+'\x0a\x0a'+fP)[gz(0x220)](fw)['command'](fC)['command'](fG)['command'](fK)['command'](fJ)['command'](fB)['command'](fH)['command'](fI)['command'](fL)['option']('debug',{'describe':'Debug\x20mode','type':'boolean'})['wrap'](N()['terminalWidth']())['help']()['alias']('h','help')['showHelpOnFail'](!0x1)['version'](u)['updateStrings']({'Commands:':O['bold']('Commands:'),'Options:':O['bold'](gz(0xc5)),'default':O['dim']('default'),'aliases':O['dim']('aliases'),'boolean':O['dim']('boolean'),'string':O['dim']('string'),'number':O['dim'](gz(0x1ad))})['epilogue']('Learn\x20more\x20about\x20Azot:\x20'+O['magenta']('https://azot.mov')+'.');c&&fR['command'](as)['command'](at),fR['parseAsync']()['then'](()=>q(r))['then'](()=>process['exit'](0x0))['catch'](fS=>{fQ('CLI\x20error',fS);});export{};