| 1 |
- !function(){"use strict";async function e(t,a){let n;const r=new Promise((e,t)=>{browser.downloads.onChanged.addListener(function a(r){r.id==n&&r.state&&("complete"==r.state.current&&(browser.downloads.search({id:n}).then(t=>e({filename:t[0]&&t[0].filename})).catch(()=>e({})),browser.downloads.onChanged.removeListener(a)),"interrupted"==r.state.current&&(r.error&&"USER_CANCELED"==r.error.current?e({cancelled:!0}):t(new Error(r.state.current)),browser.downloads.onChanged.removeListener(a)))})});try{n=await browser.downloads.download(t)}catch(n){if(n.message){const r=n.message.toLowerCase(),o=r.includes("illegal characters")||r.includes("invalid filename");if(o&&t.filename.startsWith("."))return t.filename=a+t.filename,e(t,a);if(o&&t.filename.includes(","))return t.filename=t.filename.replace(/,/g,a),e(t,a);if(o&&t.filename.match(/\u200C|\u200D|\u200E|\u200F/))return t.filename=t.filename.replace(/\u200C|\u200D|\u200E|\u200F/g,a),e(t,a);if(o&&!t.filename.match(/^[\x00-\x7F]+$/))return t.filename=t.filename.replace(/[^\x00-\x7F]+/g,a),e(t,a);if((r.includes("'incognito'")||r.includes('"incognito"'))&&t.incognito)return delete t.incognito,e(t,a);if("conflictaction prompt not yet implemented"==r&&t.conflictAction)return delete t.conflictAction,e(t,a);if(r.includes("canceled"))return{cancelled:!0};throw n}throw n}return r}let t,a,n;async function r(e,t,a){e[a]&&!e[t]&&(e[t]=e[a],delete e[a])}async function o(e){a&&delete a[e];const t=await s();if(t[e]){const a=t[e].autoSave;t[e]={autoSave:a},await c(t)}}function i(e){return a||(a={}),void 0===e||a[e]||(a[e]={}),a}async function s(e){if(!t){const e=await browser.storage.local.get();t=e.tabsData||{}}return async function(){if(!n){n=!0;const e=await browser.tabs.query({currentWindow:!0,highlighted:!0});Object.keys(t).filter(t=>{if("autoSaveAll"!=t&&"autoSaveUnpinned"!=t&&"profileName"!=t)return!e.find(e=>e.id==t)}).forEach(e=>delete t[e]),await browser.storage.local.set({tabsData:t})}}(),void 0===e||t[e]||(t[e]={}),t}async function c(e){t=e,await browser.storage.local.set({tabsData:e})}setTimeout(()=>s().then(e=>t=e),0);const l="-",u="__Default_Settings__",d="__Disabled_Settings__",f="regexp:",h="profile_",m=!/Safari/.test(navigator.userAgent)||/Chrome/.test(navigator.userAgent)||/Vivaldi/.test(navigator.userAgent)||/OPR/.test(navigator.userAgent),w=/Mobile.*Firefox/.test(navigator.userAgent),p=!(w||/Safari/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/Vivaldi/.test(navigator.userAgent)&&!/OPR/.test(navigator.userAgent)),b=!w,g=m,y=m,v=m,k=m,A=m,x=m,T=m,I=m,S=m,P=m,C=navigator.canShare&&navigator.canShare({files:[new File([new Blob([""],{type:"text/html"})],"test.html")]}),E=["~","+","\\\\","?","%","*",":","|",'"',"<",">","\0-",""],R=["~","+","?","%","*",":","|",'"',"<",">","\\\\","\0-",""],U=["~","+","?","%","*",":","|",""","<",">","\"],D={removeHiddenElements:!0,removedElementsSelector:"",removeUnusedStyles:!0,removeUnusedFonts:!0,removeFrames:!1,compressHTML:!0,compressCSS:!1,loadDeferredImages:!0,loadDeferredImagesMaxIdleTime:1500,loadDeferredImagesBlockCookies:!1,loadDeferredImagesBlockStorage:!1,loadDeferredImagesKeepZoomLevel:!1,loadDeferredImagesDispatchScrollEvent:!1,loadDeferredImagesBeforeFrames:!1,filenameTemplate:"%if-empty<{page-title}|No title> ({date-locale} {time-locale}).{filename-extension}",infobarTemplate:"",includeInfobar:!m,openInfobar:!1,confirmInfobarContent:!1,autoClose:!1,confirmFilename:!1,filenameConflictAction:"uniquify",filenameMaxLength:192,filenameMaxLengthUnit:"bytes",filenameReplacedCharacters:R,filenameReplacementCharacter:"_",filenameReplacementCharacters:U,replaceEmojisInFilename:!1,saveFilenameTemplateData:!1,contextMenuEnabled:!0,tabMenuEnabled:!0,browserActionMenuEnabled:!0,shadowEnabled:!0,logsEnabled:!0,progressBarEnabled:!0,maxResourceSizeEnabled:!1,maxResourceSize:10,displayInfobar:!0,displayStats:!1,backgroundSave:p,defaultEditorMode:"normal",applySystemTheme:!0,contentWidth:70,autoSaveDelay:1,autoSaveLoad:!1,autoSaveUnload:!1,autoSaveLoadOrUnload:!0,autoSaveDiscard:!1,autoSaveRemove:!1,autoSaveRepeat:!1,autoSaveRepeatDelay:10,removeAlternativeFonts:!0,removeAlternativeMedias:!0,removeAlternativeImages:!0,groupDuplicateImages:!0,maxSizeDuplicateImages:524288,saveRawPage:!1,saveToClipboard:!1,addProof:!1,saveToGDrive:!1,saveToDropbox:!1,saveWithWebDAV:!1,webDAVURL:"",webDAVUser:"",webDAVPassword:"",saveWithMCP:!1,mcpServerUrl:"",mcpAuthToken:"",saveToGitHub:!1,saveToRestFormApi:!1,saveToS3:!1,githubToken:"",githubUser:"",githubRepository:"SingleFile-Archives",githubBranch:"main",saveWithCompanion:!1,sharePage:!1,forceWebAuthFlow:!1,resolveFragmentIdentifierURLs:!1,userScriptEnabled:!1,openEditor:!1,openSavedPage:!1,autoOpenEditor:!1,saveCreatedBookmarks:!1,allowedBookmarkFolders:[],ignoredBookmarkFolders:[],replaceBookmarkURL:!0,saveFavicon:!0,includeBOM:!1,warnUnsavedPage:!0,displayInfobarInEditor:!1,compressContent:!1,createRootDirectory:!1,selfExtractingArchive:!0,extractDataFromPage:!0,preventAppendedData:!1,insertEmbeddedImage:!1,insertEmbeddedScreenshotImage:!1,insertTextBody:!1,autoSaveExternalSave:!1,insertMetaNoIndex:!1,insertMetaCSP:!0,passReferrerOnError:!1,password:"",insertSingleFileComment:!0,removeSavedDate:!1,blockMixedContent:!1,saveOriginalURLs:!1,acceptHeaders:{font:"application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8",image:"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",stylesheet:"text/css,*/*;q=0.1",script:"*/*",document:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",video:"video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5",audio:"audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5"},moveStylesInHead:!1,networkTimeout:0,woleetKey:"",blockImages:!1,blockAlternativeImages:!0,blockStylesheets:!1,blockFonts:!1,blockScripts:!0,blockVideos:!0,blockAudios:!0,delayBeforeProcessing:0,delayAfterProcessing:0,_migratedTemplateFormat:!0,saveToRestFormApiUrl:"",saveToRestFormApiFileFieldName:"",saveToRestFormApiUrlFieldName:"",saveToRestFormApiToken:"",S3Domain:"s3.amazonaws.com",S3Region:"",S3Bucket:"",S3AccessKey:"",S3SecretKey:"",resolveLinks:!0,groupDuplicateStylesheets:!1,infobarPositionAbsolute:!1,infobarPositionTop:"16px",infobarPositionRight:"16px",infobarPositionBottom:"",infobarPositionLeft:"",removeNoScriptTags:!0,customShortcut:null,imageReductionFactor:1},W=[{url:"file:",profile:"__Default_Settings__",autoSaveProfile:"__Disabled_Settings__"}],O={"page-title":"No title","page-heading":"No heading","page-language":"No language","page-description":"No description","page-author":"No author","page-creator":"No creator","page-publisher":"No publisher","url-hash":"No hash","url-host":"No host","url-hostname":"No hostname","url-href":"No href","url-href-digest-sha-1":"No hash","url-href-flat":"No href","url-referrer":"No referrer","url-referrer-flat":"No referrer","url-password":"No password","url-pathname":"No pathname","url-pathname-flat":"No pathname","url-port":"No port","url-protocol":"No protocol","url-search":"No search","url-username":"No username","tab-id":"No tab id","tab-index":"No tab index","url-last-segment":"No last segment"};let F,_=L();async function L(){const{sync:e}=await browser.storage.local.get();F=e?browser.storage.sync:browser.storage.local;const t=await F.get();if(t[h+u])t.profiles&&await F.remove(["profiles"]);else if(t.profiles){const e=Object.keys(t.profiles);for(const a of e)await J(a,t.profiles[a])}else await J(u,D);t.rules||await F.set({rules:W}),t.maxParallelWorkers||await F.set({maxParallelWorkers:navigator.hardwareConcurrency||4}),t.processInForeground||await F.set({processInForeground:!1});(await $()).map(async e=>{const t=await G(e);t._migratedTemplateFormat||(t.filenameTemplate=function(e){try{return Object.keys(O).forEach(t=>{const a=O[t];e=e.replaceAll(`{${t}}`,`%if-empty<{${t}}|${a}>`)}),e}catch(e){}}(t.filenameTemplate),t._migratedTemplateFormat=!0);for(const e of Object.keys(D))void 0===t[e]&&(t[e]=D[e]);re(t.filenameReplacedCharacters,E)&&re(t.filenameReplacementCharacters,U)&&(t.filenameReplacedCharacters=R),await J(e,t)})}async function B(e,t){const{rules:a}=await F.get(["rules"]),n=a.filter(e=>j(e));let r=n.sort(N).find(t=>e&&e.match(new RegExp(t.url.split(f)[1])));if(!r){const n=a.filter(e=>!j(e));r=n.sort(N).find(a=>!t&&"*"==a.url||e&&e.includes(a.url))}return r}async function M(){await _;const{maxParallelWorkers:e,processInForeground:t}=await F.get(["maxParallelWorkers","processInForeground"]),a=await K();return{profiles:await z(),rules:a,maxParallelWorkers:e,processInForeground:t}}function N(e,t){return t.url.length-e.url.length}function j(e){return e.url.toLowerCase().startsWith(f)}async function q(t){if(t.method.endsWith(".get"))return await M();if(t.method.endsWith(".set")){const{config:e}=t,a=e.profiles,n=e.rules,r=e.maxParallelWorkers,o=e.processInForeground,i=await V();await F.remove([...i,"rules","maxParallelWorkers","processInForeground"]),await F.set({rules:n,maxParallelWorkers:r,processInForeground:o}),Object.keys(a).forEach(e=>J(e,a[e]))}if(t.method.endsWith(".deleteRules")&&await async function(e){const t=await K();await F.set({rules:e?t.filter(t=>t.autoSaveProfile!=e&&t.profile!=e):[]})}(t.profileName),t.method.endsWith(".deleteRule")&&await async function(e){if(!e)throw new Error("URL is empty");const t=await K();await F.set({rules:t.filter(t=>t.url!=e)})}(t.url),t.method.endsWith(".addRule")&&await Y(t.url,t.profileName,t.autoSaveProfileName),t.method.endsWith(".createProfile")&&await async function(e,t){if((await $()).includes(e))throw new Error("Duplicate profile name");const a=await G(t),n=JSON.parse(JSON.stringify(a));n.customShortcut=null,await J(e,n)}(t.profileName,t.fromProfileName||u),t.method.endsWith(".renameProfile")&&await async function(e,t){const a=await $(),n=await s(),r=await K();if(!a.includes(e))throw new Error("Profile not found");if(a.includes(t))throw new Error("Duplicate profile name");if(e==u)throw new Error("Default settings cannot be renamed");n.profileName==e&&(n.profileName=t,await c(n));r.forEach(a=>{a.profile==e&&(a.profile=t),a.autoSaveProfile==e&&(a.autoSaveProfile=t)});const o=await G(e);await F.remove([h+e]),await F.set({[h+t]:o,rules:r})}(t.profileName,t.newProfileName),t.method.endsWith(".deleteProfile")&&await async function(e){const t=await $(),a=await s(),n=await K();if(!t.includes(e))throw new Error("Profile not found");if(e==u)throw new Error("Default settings cannot be deleted");a.profileName==e&&(delete a.profileName,await c(a));n.forEach(t=>{t.profile==e&&(t.profile=u),t.autoSaveProfile==e&&(t.autoSaveProfile=u)}),F.remove([h+e]),await F.set({rules:n})}(t.profileName),t.method.endsWith(".resetProfiles")&&await async function(){await _;const e=await s();delete e.profileName,await c(e);let t=await V();await F.remove([...t,"rules","maxParallelWorkers","processInForeground"]),await L()}(),t.method.endsWith(".resetProfile")&&await async function(e){if(!(await $()).includes(e))throw new Error("Profile not found");await J(e,D)}(t.profileName),t.method.endsWith(".importConfig")&&await async function(e){const t=await $(),a=await V(),n=await s();t.includes(n.profileName)&&(delete n.profileName,await c(n));await F.remove([...a,"rules","maxParallelWorkers","processInForeground"]);const r={rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground};Object.keys(e.profiles).forEach(t=>r[h+t]=e.profiles[t]),await F.set(r),await L()}(t.config),t.method.endsWith(".updateProfile")&&await async function(e,t){if(!(await $()).includes(e))throw new Error("Profile not found");const a=await G(e);Object.keys(a).forEach(e=>{t[e]=void 0===t[e]?a[e]:t[e]}),await J(e,t)}(t.profileName,t.profile),t.method.endsWith(".updateRule")&&await Z(t.url,t.newUrl,t.profileName,t.autoSaveProfileName),t.method.endsWith(".getConstants"))return{DISABLED_PROFILE_NAME:d,DEFAULT_PROFILE_NAME:u,CURRENT_PROFILE_NAME:l,BACKGROUND_SAVE_SUPPORTED:p,AUTOCLOSE_SUPPORTED:b,BADGE_COLOR_SUPPORTED:g,AUTO_SAVE_SUPPORTED:y,SELECTABLE_TABS_SUPPORTED:v,AUTO_OPEN_EDITOR_SUPPORTED:k,INFOBAR_SUPPORTED:A,BOOKMARKS_API_SUPPORTED:x,IDENTITY_API_SUPPORTED:T,CLIPBOARD_API_SUPPORTED:I,NATIVE_API_API_SUPPORTED:S,WEB_BLOCKING_API_SUPPORTED:P,SHARE_API_SUPPORTED:C};if(t.method.endsWith(".getRules"))return K();if(t.method.endsWith(".getProfiles"))return z();if(t.method.endsWith(".exportConfig"))return async function(){const t=await M(),a=JSON.stringify({profiles:t.profiles,rules:t.rules,maxParallelWorkers:t.maxParallelWorkers,processInForeground:t.processInForeground},null,2),n=`singlefile-settings-${(new Date).toISOString().replace(/:/g,"_")}.json`;if(p){const t=URL.createObjectURL(new Blob([a],{type:"text/json"}));try{await e({url:t,filename:n,saveAs:!0},"_")}finally{URL.revokeObjectURL(t)}return{}}return{filename:n,textContent:a}}();if(t.method.endsWith(".enableSync")){await browser.storage.local.set({sync:!0});const e=await browser.storage.sync.get();if(!e||!e.rules){const e=await V(),t=await browser.storage.local.get(["rules","maxParallelWorkers","processInForeground",...e]);await browser.storage.sync.set(t)}return F=browser.storage.sync,await L(),{}}if(t.method.endsWith(".disableSync")){await browser.storage.local.set({sync:!1});const e=await browser.storage.sync.get(),t=await browser.storage.local.get();if(e&&e.rules&&(!t||!t.rules)){await browser.storage.local.set({rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground});const t={};await browser.storage.local.set(t)}return F=browser.storage.local,await L(),{}}return t.method.endsWith(".isSync")?{sync:(await browser.storage.local.get()).sync}:{}}async function z(){await _;const e=await V(),t=await F.get(e),a={};return Object.keys(t).forEach(e=>a[e.substring(8)]=t[e]),a}async function H(e,t){await _;const[a,n]=await Promise.all([B(e),s()]),r=n.profileName||u;let o;if(a){const e=a[t?"autoSaveProfile":"profile"];o=e==l?r:e}else o=r;const i=await G(o);return Object.assign({profileName:o},i)}async function K(){return(await F.get(["rules"])).rules}async function $(){return Object.keys(await F.get()).filter(e=>e.startsWith(h)).map(e=>e.substring(8))}async function V(){return Object.keys(await F.get()).filter(e=>e.startsWith(h))}async function G(e){const t=h+e;return(await F.get([t]))[t]}async function J(e,t){const a=h+e;await F.set({[a]:t})}async function Y(e,t,a){if(!e)throw new Error("URL is empty");const n=await K();if(n.find(t=>t.url==e))throw new Error("URL already exists");n.push({url:e,profile:t,autoSaveProfile:a}),await F.set({rules:n})}async function Z(e,t,a,n){if(!e||!t)throw new Error("URL is empty");const r=await K(),o=r.find(t=>t.url==e);if(!o)throw new Error("URL not found");if(r.find(a=>a.url==t&&a.url!=e))throw new Error("New URL already exists");o.url=t,o.profile=a,o.autoSaveProfile=n,await F.set({rules:r})}async function X(){return(await F.get()).authInfo}async function Q(){return(await F.get()).dropboxAuthInfo}async function ee(e){await F.set({authInfo:e})}async function te(e){await F.set({dropboxAuthInfo:e})}async function ae(){let e=X();e.revokableAccessToken?ee({revokableAccessToken:e.revokableAccessToken}):await F.remove(["authInfo"])}async function ne(){let e=Q();e.revokableAccessToken?te({revokableAccessToken:e.revokableAccessToken}):await F.remove(["dropboxAuthInfo"])}function re(e,t){return e.length==t.length&&e.every((e,a)=>e==t[a])}async function oe(e){if(e){const[t,a]=await Promise.all([s(),B(e.url)]);return Boolean(t.autoSaveAll||t.autoSaveUnpinned&&!e.pinned||t[e.id]&&t[e.id].autoSave)&&(!a||a.autoSaveProfile!=d)}}const ie=33554432,se="/src/ui/pages/editor.html",ce=new Map,le=new Map,ue=browser.runtime.getURL(se);async function de({tabIndex:e,content:t,filename:a,compressContent:n,selfExtractingArchive:r,extractDataFromPage:o,insertTextBody:i,insertMetaCSP:s,embeddedImage:c,url:l}){const u={active:!0,url:se};null!=e&&(u.index=e);const d=await browser.tabs.create(u);ce.set(d.id,{url:l,content:t,filename:a,compressContent:n,selfExtractingArchive:r,extractDataFromPage:o,insertTextBody:i,insertMetaCSP:s,embeddedImage:c})}function fe(e){return e.url==ue}const he=new Map,me="x-single-file-request-id",we=8388608;async function pe(e,t,a){for(let n=0;n*we<=a.array.length;n++){const r={method:"singlefile.fetchResponse",requestId:t,headers:a.headers,status:a.status,error:a.error};r.truncated=a.array.length>we,r.truncated?(r.finished=(n+1)*we>a.array.length,r.array=a.array.slice(n*we,(n+1)*we)):r.array=a.array,await browser.tabs.sendMessage(e,r)}return{}}function be(e,t={},a){return new Promise((n,r)=>{const o=new XMLHttpRequest;if(o.withCredentials=!0,o.responseType="arraybuffer",o.onerror=e=>r(new Error(e.detail)),o.onreadystatechange=()=>{o.readyState==XMLHttpRequest.DONE&&(o.status||o.response.byteLength?401!=o.status&&403!=o.status&&404!=o.status||a?n({arrayBuffer:o.response,array:Array.from(new Uint8Array(o.response)),headers:{"content-type":o.getResponseHeader("Content-Type")},status:o.status}):be(e,t,!0).then(n).catch(r):r(new Error("Empty response")))},o.open("GET",e,!0),t.headers)for(const e of Object.entries(t.headers))o.setRequestHeader(e[0],e[1]);if(a){const e=String(Math.random()).substring(2);!function(e,t){he.set(e,t)}(e,t.referrer),o.setRequestHeader(me,e)}o.send()})}browser.runtime.onMessage.addListener((e,t)=>{if(e.method&&e.method.startsWith("singlefile.fetch"))return new Promise(a=>{(async function(e,t){if("singlefile.fetch"==e.method)try{const a=await be(e.url,{referrer:e.referrer,headers:e.headers});return pe(t.tab.id,e.requestId,a)}catch(a){return pe(t.tab.id,e.requestId,{error:a.message,array:[]})}else if("singlefile.fetchFrame"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(a).catch(e=>a({error:e&&(e.message||e.toString())}))})});let ge=!1;function ye(e){return e.method.endsWith(".enableReferrerOnError")?(ke(),{}):e.method.endsWith(".disableReferrerOnError")?(function(){try{browser.webRequest.onBeforeSendHeaders.removeListener(ve)}catch(e){}ge=!1}(),{}):void 0}function ve(e){if(ge){let t=e.requestHeaders.find(e=>e.name===me);if(t){e.requestHeaders=e.requestHeaders.filter(e=>e.name!==me);const a=he.get(t.value);if(a){he.delete(t.value);if(!e.requestHeaders.find(e=>"referer"===e.name.toLowerCase()))return e.requestHeaders.push({name:"Referer",value:a}),{requestHeaders:e.requestHeaders}}}}}function ke(){if(!ge){try{browser.webRequest.onBeforeSendHeaders.addListener(ve,{urls:["<all_urls>"]},["blocking","requestHeaders","extraHeaders"])}catch(e){browser.webRequest.onBeforeSendHeaders.addListener(ve,{urls:["<all_urls>"]},["blocking","requestHeaders"])}ge=!0}}async function Ae(e){return(await browser.tabs.query(e)).sort((e,t)=>e.index-t.index)}function xe(e){return new Promise((t,a)=>{browser.tabs.onUpdated.addListener(function n(r,o){if(o&&o.url&&o.url.startsWith(e)){browser.tabs.onUpdated.removeListener(n);const e=new URLSearchParams(new URL(o.url).search).get("code");e?(browser.tabs.remove(r),t(e)):a()}})})}async function Te(e){const t=await browser.tabs.create({url:e.url,active:!0});return new Promise((e,a)=>{browser.tabs.onRemoved.addListener(function e(n){n==t.id&&(browser.tabs.onRemoved.removeListener(e),a(new Error("code_required")))})})}const Ie="/src/ui/resources/icon_128.png",Se="/src/ui/resources/icon_128_wait",Pe=browser.i18n.getMessage("buttonDefaultTooltip"),Ce=browser.i18n.getMessage("buttonBlockedTooltip"),Ee=browser.i18n.getMessage("buttonInitializingBadge"),Re=browser.i18n.getMessage("buttonInitializingTooltip"),Ue=browser.i18n.getMessage("buttonErrorBadge"),De=browser.i18n.getMessage("buttonBlockedBadge"),We=browser.i18n.getMessage("buttonOKBadge"),Oe=browser.i18n.getMessage("buttonSaveProgressTooltip"),Fe=browser.i18n.getMessage("buttonUploadProgressTooltip"),_e=browser.i18n.getMessage("buttonAutoSaveActiveBadge"),Le=browser.i18n.getMessage("buttonAutoSaveActiveTooltip"),Be=[2,147,20,192],Me=[4,229,36,192],Ne={default:{setBadgeBackgroundColor:{color:Be},setBadgeText:{text:""},setTitle:{title:Pe},setIcon:{path:Ie}},inject:{setBadgeBackgroundColor:{color:Be},setBadgeText:{text:Ee},setTitle:{title:Re}},execute:{setBadgeBackgroundColor:{color:Me},setBadgeText:{text:Ee}},progress:{setBadgeBackgroundColor:{color:Me},setBadgeText:{text:""}},edit:{setBadgeBackgroundColor:{color:Be},setBadgeText:{text:""},setTitle:{title:Pe},setIcon:{path:Ie}},end:{setBadgeBackgroundColor:{color:Me},setBadgeText:{text:We},setTitle:{title:Pe},setIcon:{path:Ie}},error:{setBadgeBackgroundColor:{color:[229,4,12,192]},setBadgeText:{text:Ue},setTitle:{title:""},setIcon:{path:Ie}},forbidden:{setBadgeBackgroundColor:{color:[255,255,255,1]},setBadgeText:{text:De},setTitle:{title:Ce},setIcon:{path:Ie}},autosave:{inject:{setBadgeBackgroundColor:{color:[64,64,64,192]},setBadgeText:{text:_e},setTitle:{title:Le},setIcon:{path:Ie}},default:{setBadgeBackgroundColor:{color:[208,208,208,192]},setBadgeText:{text:_e},setTitle:{title:Le},setIcon:{path:Ie}}}};let je;function qe(e,t){if(e.method.endsWith(".processInit")){delete i(t.tab.id)[t.tab.id].button,Ve(t.tab)}var a,n,r;return e.method.endsWith(".processProgress")&&e.maxIndex&&(a=t.tab.id,n=e.index,r=e.maxIndex,$e(a,n,r,Oe)),e.method.endsWith(".processEnd")&&He(t.tab.id),e.method.endsWith(".processError")&&(e.error&&console.error("Initialization error",e.error),ze(t.tab.id)),e.method.endsWith(".processCancelled")&&Ke(t.tab),Promise.resolve({})}function ze(e){Ge(e,Ye("error"))}function He(e,t){Ge(e,t?Ye("default",!0):Ye("end"))}function Ke(e){Ve(e)}function $e(e,t,a,n){const r=Math.max(Math.min(20,Math.floor(t/a*20)),0),o=Math.min(Math.floor(t/a*8),8),i=Se+o+".png",s=Ye("progress");s.setTitle={title:n+5*r+"%"},s.setIcon={path:i},Ge(e,s)}async function Ve(e){const t=Ye("default",await oe(e));await Ge(e.id,t)}async function Ge(e,t){try{const a=i(e);if(t){a[e].button||(a[e].button={lastState:null});const n=a[e].button.lastState||{},r={};Object.keys(t).forEach(e=>{void 0!==t[e]&&JSON.stringify(n[e])!=JSON.stringify(t[e])&&(r[e]=t[e])}),Object.keys(r).length&&(a[e].button.lastState=t,await async function(e,t){for(const a of Object.keys(t))await Je(e,a,t[a])}(e,r))}}catch(e){}}async function Je(e,t,a){const n="setBadgeBackgroundColor"!=t||g;if(browser.browserAction[t]&&n){const n=JSON.parse(JSON.stringify(a));n.tabId=e,await browser.browserAction[t](n)}}function Ye(e,t){return JSON.parse(JSON.stringify(t?Ne.autosave[e]:Ne[e]))}browser.browserAction.onClicked.addListener(async e=>{const t=await Ae({currentWindow:!0,highlighted:!0});t.length<=1?function(e){je.isSavingTab(e)?je.cancelTab(e.id):je.saveTabs([e])}(e):je.saveTabs(t)});const Ze=browser.menus,Xe=Ze&&Ze.onClicked&&Ze.create&&Ze.update&&Ze.removeAll,Qe="save-page",et="edit-and-save-page",tt="save-with-profile",at="save-selected-links",nt="view-pendings",rt="select-profile",ot="wasve-with-profile-",it="select-profile-",st="associate-with-profile",ct="associate-with-profile-",lt="save-selected",ut="save-frame",dt="save-tabs",ft="save-selected-tabs",ht="save-unpinned-tabs",mt="save-all-tabs",wt="batch-save-urls",pt="button-"+ft,bt="button-"+ht,gt="button-"+mt,yt="auto-save",vt="auto-save-disabled",kt="auto-save-tab",At="auto-save-unpinned",xt="auto-save-all",Tt=browser.i18n.getMessage("menuCreateDomainRule"),It=browser.i18n.getMessage("menuUpdateRule"),St=browser.i18n.getMessage("menuSavePage"),Pt=browser.i18n.getMessage("menuSaveWithProfile"),Ct=browser.i18n.getMessage("menuSaveSelectedLinks"),Et=browser.i18n.getMessage("menuEditPage"),Rt=browser.i18n.getMessage("menuEditAndSavePage"),Ut=browser.i18n.getMessage("menuViewPendingSaves"),Dt=browser.i18n.getMessage("menuSaveSelection"),Wt=browser.i18n.getMessage("menuSaveFrame"),Ot=browser.i18n.getMessage("menuSaveTabs"),Ft=browser.i18n.getMessage("menuSaveSelectedTabs"),_t=browser.i18n.getMessage("menuSaveUnpinnedTabs"),Lt=browser.i18n.getMessage("menuSaveAllTabs"),Bt=browser.i18n.getMessage("menuBatchSaveUrls"),Mt=browser.i18n.getMessage("menuSelectProfile"),Nt=browser.i18n.getMessage("profileDefaultSettings"),jt=browser.i18n.getMessage("menuAutoSave"),qt=browser.i18n.getMessage("menuAutoSaveDisabled"),zt=browser.i18n.getMessage("menuAutoSaveTab"),Ht=browser.i18n.getMessage("menuAutoSaveUnpinnedTabs"),Kt=browser.i18n.getMessage("menuAutoSaveAllTabs"),$t=[et,at,lt,ut,yt,st],Vt=new Map,Gt=new Map;let Jt,Yt,Zt,Xt=!0,Qt=!0,ea=new Map;async function ta(e){const[t,a]=await Promise.all([z(),s()]);let n=await H(e&&e.url);if(Xe&&n){const r=["page","frame","image","link","video","audio","selection"],o=[];if(n.profileName==d&&(n=await H(),n.profileName=d),n.browserActionMenuEnabled&&o.push("browser_action"),n.tabMenuEnabled)try{await Ze.create({id:"temporary-id",contexts:["tab"],title:"title"}),o.push("tab")}catch(e){n.tabMenuEnabled=!1}await Ze.removeAll();const i=o.concat(...r),s=n.contextMenuEnabled?i:o;if(Ze.create({id:Qe,contexts:s,title:St}),Ze.create({id:et,contexts:s,title:Rt}),Ze.create({id:at,contexts:n.contextMenuEnabled?o.concat(["selection"]):o,title:Ct}),Object.keys(t).length>1&&Ze.create({id:tt,contexts:s,title:Pt}),n.contextMenuEnabled&&Ze.create({id:"separator-1",contexts:r,type:"separator"}),Ze.create({id:lt,contexts:s,title:Dt}),n.contextMenuEnabled&&Ze.create({id:ut,contexts:["frame"],title:Wt}),Ze.create({id:dt,contexts:o,title:Ot}),Ze.create({id:pt,contexts:o,title:Ft,parentId:dt}),Ze.create({id:bt,contexts:o,title:_t,parentId:dt}),Ze.create({id:gt,contexts:o,title:Lt,parentId:dt}),n.contextMenuEnabled&&(v&&Ze.create({id:ft,contexts:r,title:Ft}),Ze.create({id:ht,contexts:r,title:_t}),Ze.create({id:mt,contexts:r,title:Lt}),Ze.create({id:"separator-2",contexts:r,type:"separator"})),Object.keys(t).length>1){Ze.create({id:rt,title:Mt,contexts:s}),Ze.create({id:ot+"default",contexts:s,title:Nt,parentId:tt});const o=it+"default",i=!a.profileName||a.profileName==u;let c;Ze.create({id:o,type:"radio",contexts:s,title:Nt,checked:i,parentId:rt}),Vt.set(o,i),Ze.create({id:st,title:Tt,contexts:s}),Gt.set(st,Tt),e&&e.url&&(c=await B(e.url,!0));const d=ct+"current",f=!c||c.profile==l;Ze.create({id:d,type:"radio",contexts:s,title:l,checked:f,parentId:st}),Vt.set(d,f);const h=ct+"default",m=Boolean(c)&&c.profile==u;Ze.create({id:h,type:"radio",contexts:s,title:Nt,checked:m,parentId:st}),Vt.set(h,m),ea=new Map,Object.keys(t).forEach((e,t)=>{if(e!=u){let n=ot+t;Ze.create({id:n,contexts:s,title:e,parentId:tt}),n=it+t;let r=a.profileName==e;Ze.create({id:n,type:"radio",contexts:s,title:e,checked:r,parentId:rt}),Vt.set(n,r),n=ct+t,r=Boolean(c)&&c.profile==e,Ze.create({id:n,type:"radio",contexts:s,title:e,checked:r,parentId:st}),Vt.set(n,r),ea.set(e,t)}}),n.contextMenuEnabled&&Ze.create({id:"separator-3",contexts:r,type:"separator"})}y&&(Ze.create({id:yt,contexts:s,title:jt}),Ze.create({id:vt,type:"radio",title:qt,contexts:s,checked:!0,parentId:yt}),Vt.set(vt,!0),Ze.create({id:kt,type:"radio",title:zt,contexts:s,checked:!1,parentId:yt}),Vt.set(kt,!1),Ze.create({id:At,type:"radio",title:Ht,contexts:s,checked:!1,parentId:yt}),Vt.set(At,!1),Ze.create({id:xt,type:"radio",title:Kt,contexts:s,checked:!1,parentId:yt}),Vt.set(xt,!1),Ze.create({id:"separator-4",contexts:s,type:"separator"})),Ze.create({id:wt,contexts:s,title:Bt}),Ze.create({id:nt,contexts:s,title:Ut})}Jt=!0,Yt&&(Yt=!1,(await browser.tabs.query({})).forEach(async e=>await na(e)))}async function aa(e){const t=await s(e.id);await async function(){const e=await browser.tabs.query({});return Promise.all(e.map(async e=>{const[t,a]=await Promise.all([H(e.url,!0),oe(e)]);try{await browser.tabs.sendMessage(e.id,{method:"content.init",autoSaveEnabled:a,options:t})}catch(e){}}))}(),await Ve(e);try{await browser.runtime.sendMessage({method:"options.refresh",profileName:t.profileName})}catch(e){}}async function na(e){if(Xe&&Jt){const t=[],a=await s(e.id);if(a[e.id].editorDetected)ra(!1);else if(ra(!0),y&&(t.push(ia(vt,!a[e.id].autoSave)),t.push(ia(kt,a[e.id].autoSave)),t.push(ia(At,Boolean(a.autoSaveUnpinned))),t.push(ia(xt,Boolean(a.autoSaveAll)))),e&&e.url){const n=await H(e.url);t.push(async function(e,t){const a=Xt;Xt=t,(void 0===a||a!=t)&&await ta(e)}(e,n.contextMenuEnabled)),t.push(oa(et,a[e.id].savedPageDetected?Et:Rt)),v&&t.push(Ze.update(lt,{visible:!n.saveRawPage})),t.push(Ze.update(et,{visible:!n.openEditor||a[e.id].savedPageDetected}));let r=ct+"default",o=Tt;const[i,s]=await Promise.all([z(),B(e.url)]);if(s){const e=ea.get(s.profile);e&&(r=ct+e,o=It)}Object.keys(i).length>1&&(Object.keys(i).forEach((e,a)=>{e==u?t.push(ia(ct+"default",r==ct+"default")):t.push(ia(ct+a,r==ct+a))}),t.push(oa(st,o)))}await Promise.all(t)}}async function ra(e){const t=Qt;if(Qt=e,void 0===t||t!=e){const t=[];try{$t.forEach(a=>t.push(Ze.update(a,{visible:e}))),await Promise.all(t)}catch(e){}}}async function oa(e,t){const a=Gt.get(e);try{(void 0===a||a!=t)&&await Ze.update(e,{title:t}),Gt.set(e,t)}catch(e){}}async function ia(e,t){t=Boolean(t);try{await Ze.update(e,{checked:t}),Vt.set(e,t)}catch(e){}}Promise.resolve().then(async function(){Xe&&(ta(),Ze.onClicked.addListener(async(e,t)=>{if(e.menuItemId==Qe&&(e.linkUrl?Zt.saveUrls([e.linkUrl]):Zt.saveTabs([t])),e.menuItemId==et){(await s(t.id))[t.id].savedPageDetected?Zt.openEditor(t):e.linkUrl?Zt.saveUrls([e.linkUrl],{openEditor:!0}):Zt.saveTabs([t],{openEditor:!0})}if(e.menuItemId==at&&Zt.saveSelectedLinks(t),e.menuItemId==nt&&await browser.tabs.create({active:!0,url:"/src/ui/pages/pendings.html"}),e.menuItemId==lt&&Zt.saveTabs([t],{selected:!0}),e.menuItemId==ut&&Zt.saveTabs([t],{frameId:e.frameId}),e.menuItemId==ft||e.menuItemId==pt){const e=await Ae({currentWindow:!0,highlighted:!0});Zt.saveTabs(e)}if(e.menuItemId==ht||e.menuItemId==bt){const e=await Ae({currentWindow:!0,pinned:!1});Zt.saveTabs(e)}if(e.menuItemId==mt||e.menuItemId==gt){const e=await Ae({currentWindow:!0});Zt.saveTabs(e)}if(e.menuItemId==wt&&Zt.batchSaveUrls(),e.menuItemId==kt){const e=await s(t.id);e[t.id].autoSave=!0,await c(e),aa(t)}if(e.menuItemId==vt){const e=await s();Object.keys(e).forEach(t=>{"object"==typeof e[t]&&e[t].autoSave&&(e[t].autoSave=!1)}),e.autoSaveUnpinned=e.autoSaveAll=!1,await c(e),aa(t)}if(e.menuItemId==xt){const a=await s();a.autoSaveAll=e.checked,await c(a),aa(t)}if(e.menuItemId==At){const a=await s();a.autoSaveUnpinned=e.checked,await c(a),aa(t)}if(e.menuItemId.startsWith(ot)){const a=await z(),n=e.menuItemId.split(ot)[1];let r;if("default"==n)r=u;else{const e=Number(n);r=Object.keys(a)[e]}a[r].profileName=r,Zt.saveTabs([t],a[r])}if(e.menuItemId.startsWith(it)){const[a,n]=await Promise.all([z(),s()]),r=e.menuItemId.split(it)[1];if("default"==r)n.profileName=u;else{const e=Number(r);n.profileName=Object.keys(a)[e]}await c(n),aa(t)}if(e.menuItemId.startsWith(ct)){const[a,n]=await Promise.all([z(),B(t.url,!0)]),r=e.menuItemId.split(ct)[1];let o;if("default"==r)o=u;else if("current"==r)o=l;else{const e=Number(r);o=Object.keys(a)[e]}n?await Z(n.url,n.url,o,o):(await oa(st,It),await Y(new URL(t.url).hostname,o,o))}}),Jt?Yt=!0:(await browser.tabs.query({})).forEach(async e=>await na(e)))});const sa=browser.commands;let ca,la,ua;function da(e,t){return e.method.endsWith(".refreshMenu")?function(e){if(e.method.endsWith("refreshMenu"))return ta(),Promise.resolve({})}(e):qe(e,t)}function fa(e){!function(e){Ge(e.id,Ye("forbidden"))}(e)}function ha(e,t,a){!function(e,t,a){let n;a?n=Ye("inject",!0):(n=Ye(1==t?"inject":"execute"),n.setTitle={title:Re+" ("+t+"/2)"},n.setIcon={path:Se+"0.png"}),Ge(e,n)}(e,t,a)}async function ma(e,t,a){ze(e);try{t&&await browser.tabs.sendMessage(e,{method:"content.error",error:t.toString(),link:a})}catch(e){}}function wa(e){!function(e){Ge(e,Ye("edit"))}(e)}function pa(e,t){He(e,t)}function ba(e,t,a){!function(e,t,a){$e(e,t,a,Fe)}(e,t,a)}function ga(e){na(e)}sa&&sa.onCommand&&sa.onCommand.addListener&&sa.onCommand.addListener(async e=>{if("save-selected-tabs"==e){const e=await Ae({currentWindow:!0,highlighted:!0});ca.saveTabs(e,{optionallySelected:!0})}else if("save-all-tabs"==e){const e=await Ae({currentWindow:!0});ca.saveTabs(e)}else if(e.startsWith("custom-command-")){const t=await z();let a;if(Object.keys(t).some(n=>t[n].customShortcut==e&&(a=n,!0)),a){const e=await Ae({currentWindow:!0,highlighted:!0});ca.saveTabs(e,t[a])}}});const ya=["lib/web-stream.js","lib/chrome-browser-polyfill.js","lib/single-file.js"],va=["lib/chrome-browser-polyfill.js","lib/single-file-frames.js"];async function ka(e,t){let a;if(await async function(e){const t=e.extensionScriptFiles||[];la||ua||([la,ua]=await Promise.all([Aa(ya.concat(t)),Aa(va)]))}(t),!t.removeFrames)try{await browser.tabs.executeScript(e,{code:ua,allFrames:!0,matchAboutBlank:!0,runAt:"document_start"})}catch(e){}try{await browser.tabs.executeScript(e,{code:la,allFrames:!1,runAt:"document_idle"}),a=!0}catch(e){}return a&&t.frameId&&await browser.tabs.executeScript(e,{code:"document.documentElement.dataset.requestedFrameId = true",frameId:t.frameId,matchAboutBlank:!0,runAt:"document_start"}),a}async function Aa(e){const t=e.map(async e=>{if("function"==typeof e)return"("+e.toString()+")();";{const t=await fetch(browser.runtime.getURL("../../../"+e));return(new TextDecoder).decode(await t.arrayBuffer())}});let a="";for(const e of t)a+=await e;return a}const xa="single-file-response-fetch",Ta="Host fetch error (SingleFile)",Ia=Boolean(window.wrappedJSObject),Sa=window.fetch.bind(window);let Pa,Ca=0,Ea=new Map;async function Ra(e,t={},a=!0){try{const n={cache:t.cache||"force-cache",headers:t.headers,referrerPolicy:t.referrerPolicy||"strict-origin-when-cross-origin"};let r;try{r=t.referrer&&!Ia||!a?await Sa(e,n):await async function(e,t){if(void 0===Pa&&(Pa=!1,document.addEventListener("single-file-response-fetch-supported",()=>Pa=!0,!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch-supported"))),Pa)return new Promise((a,n)=>{document.dispatchEvent(new CustomEvent("single-file-request-fetch",{detail:JSON.stringify({url:e,options:t})})),document.addEventListener(xa,function t(r){r.detail?r.detail.url==e&&(document.removeEventListener(xa,t,!1),r.detail.response?a({status:r.detail.status,headers:new Map(r.detail.headers),arrayBuffer:async()=>r.detail.response}):n(r.detail.error)):n()},!1)});throw new Error(Ta)}(e,n),401!=r.status&&403!=r.status&&404!=r.status||"no-referrer"==n.referrerPolicy||t.referrer||(r=await Ra(e,{...n,referrerPolicy:"no-referrer"},a))}catch(o){if(o&&o.message==Ta)r=await Ra(e,{...n},!1);else{if("no-referrer"==n.referrerPolicy||t.referrer)throw o;r=await Ra(e,{...n,referrerPolicy:"no-referrer"},a)}}return r}catch(a){Ca++;const n=new Promise((e,t)=>Ea.set(Ca,{resolve:e,reject:t}));return await Da({method:"singlefile.fetch",url:e,requestId:Ca,referrer:t.referrer,headers:t.headers}),n}}async function Ua(e,t){const a=await Da({method:"singlefile.fetchFrame",url:e,frameId:t.frameId,referrer:t.referrer,headers:t.headers});return{status:a.status,headers:new Map(a.headers),arrayBuffer:async()=>new Uint8Array(a.array).buffer}}async function Da(e){const t=await browser.runtime.sendMessage(e);if(!t||t.error)throw new Error(t&&t.error&&t.error.toString());return t}function Wa(e,t){return ka(e,t)}browser.runtime.onMessage.addListener(e=>"singlefile.fetchFrame"==e.method&&window.frameId&&window.frameId==e.frameId?async function(e){try{const t=await Sa(e.url,{cache:"force-cache",headers:e.headers,referrerPolicy:"strict-origin-when-cross-origin"});return{status:t.status,headers:[...t.headers],array:Array.from(new Uint8Array(await t.arrayBuffer()))}}catch(e){return{error:e&&(e.message||e.toString())}}}(e):"singlefile.fetchResponse"==e.method?async function(e){const t=Ea.get(e.requestId);t&&(e.error?(t.reject(new Error(e.error)),Ea.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,Ea.set(e.requestId,t)),e.finished&&(e.array=t.array)),e.truncated&&!e.finished||(t.resolve({status:e.status,headers:{get:t=>e.headers&&e.headers[t]},arrayBuffer:async()=>new Uint8Array(e.array).buffer}),Ea.delete(e.requestId))));return{}}(e):void 0);const Oa="Could not establish connection. Receiving end does not exist.",Fa="The message port closed before a response was received.",_a="Message manager disconnected",La="Cannot access contents of url ",Ba="A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received",Ma="pending",Na="processing",ja=["lib/single-file-extension.js"],qa=[];let za,Ha,Ka=0;var $a;async function Va(e){const t={extensionScriptFiles:ja,tabId:e.id,tabIndex:e.index};let a;try{a=await Wa(e.id,t)}catch(e){}if(a){const t=await browser.tabs.sendMessage(e.id,{method:"content.getSelectedLinks"});if(t.urls&&t.urls.length){const e=await Ga(),a=(n,r)=>{"complete"==r.status&&n==e.id&&(browser.tabs.onUpdated.removeListener(a),browser.tabs.sendMessage(e.id,{method:"newUrls.addURLs",urls:t.urls}))};browser.tabs.onUpdated.addListener(a)}}else fa(e)}async function Ga(){return browser.tabs.create({active:!0,url:"/src/ui/pages/batch-save-urls.html"})}async function Ja(e,t={}){await Xa(),await Promise.all(e.map(async e=>{const a=await H(e);a.profileName!=d&&(Object.keys(t).forEach(e=>a[e]=t[e]),a.autoClose=!0,a.originalUrl=e,a.extensionScriptFiles=ja,a.passReferrerOnError&&ke(),Za({tab:{url:e},status:Ma,options:a,method:"content.save"}))})),Qa()}async function Ya(e,t={}){await Xa(),await Promise.all(e.map(async e=>{const a=e.id,n=await H(e.url);if(n.profileName!=d){Object.keys(t).forEach(e=>n[e]=t[e]),n.tabId=a,n.tabIndex=e.index,n.extensionScriptFiles=ja,n.passReferrerOnError&&ke();const r={id:e.id,index:e.index,url:e.url,title:e.title};if(t.autoSave){if(oe(e)){en(Za({status:Na,tab:r,options:n,method:"content.autosave"}))}}else{let t;ha(a,1);try{t=await Wa(a,n)}catch(e){}t||fe(e)?(ha(a,2),Za({status:Ma,tab:r,options:n,method:"content.save"})):fa(e)}}else fa(e)})),Qa()}function Za(e){const t={id:Ka,status:e.status,tab:e.tab,options:e.options,method:e.method,done:function(e=!0){const t=qa.findIndex(e=>e.id==this.id);t>-1&&(qa.splice(t,1),e&&Qa())}};return qa.push(t),Ka++,t}async function Xa(){if(!za){const e=await M();Ha=e.processInForeground,za=Ha?1:e.maxParallelWorkers}}function Qa(){const e=qa.filter(e=>e.status==Na).length;for(let t=0;t<Math.min(qa.length-e,za-e);t++){const e=qa.find(e=>e.status==Ma);e&&en(e)}}async function en(e){const t=e.id;if(e.status=Na,!e.tab.id){let t;try{const a=await async function(e){const t=await browser.tabs.create(e);return new Promise((e,a)=>{function n(a,o){a==t.id&&"complete"==o.status&&(e(t),browser.tabs.onUpdated.removeListener(n),browser.tabs.onRemoved.removeListener(r))}function r(e){e==t.id&&(a(e),browser.tabs.onRemoved.removeListener(r))}browser.tabs.onUpdated.addListener(n),browser.tabs.onRemoved.addListener(r)})}({url:e.tab.url,active:!1});e.tab.id=e.options.tabId=a.id,e.tab.index=e.options.tabIndex=a.index,ha(e.tab.id,1);try{t=await Wa(e.tab.id,e.options)}catch(e){}}catch(t){e.tab.id=t}if(!t)return void e.done();ha(e.tab.id,2)}e.options.taskId=t;try{Ha&&await browser.tabs.update(e.tab.id,{active:!0}),await browser.tabs.sendMessage(e.tab.id,{method:e.method,options:e.options})}catch(t){!t||t.message&&function(e){return e.message==Fa||e.message==Oa||e.message==_a||e.message==Ba||e.message.startsWith(La+JSON.stringify(ue))}(t)||(console.log(t.message?t.message:t),ma(e.tab.id,t.message,t.link),e.done())}}function tn(e){const t=qa.find(t=>t.id==e);t&&(t.options.autoClose&&!t.cancelled&&browser.tabs.remove(t.tab.id),t.done())}function an(e,t){const a=qa.find(t=>t.id==e);a&&(a.cancel=t)}function nn(e,t=!0){Array.from(qa).filter(a=>a.tab.id==e&&!a.options.autoSave&&(t||a.status!=Na)).forEach(sn)}function rn(e){const t=qa.find(t=>t.id==e);t&&sn(t)}function on(e){return qa.find(t=>t.id==e)}function sn(e,t){const a=e.tab.id;e.cancelled=!0,a&&(browser.tabs.sendMessage(a,{method:"content.cancelSave",options:{loadDeferredImages:e.options.loadDeferredImages,loadDeferredImagesKeepZoomLevel:e.options.loadDeferredImagesKeepZoomLevel}}).catch(()=>{}),"content.autosave"==e.method&&pa(a,!0),function(e){Ke(e)}(e.tab)),e.cancel&&e.cancel(),e.done(t)}function cn(e){return{id:e.id,tabId:e.tab.id,index:e.tab.index,url:e.tab.url,title:e.tab.title,cancelled:e.cancelled,status:e.status}}(function(e){Zt=e})($a={isSavingTab:function(e){return Boolean(qa.find(t=>t.tab.id==e.id))},saveTabs:Ya,saveUrls:Ja,cancelTab:nn,openEditor:function(e){browser.tabs.sendMessage(e.id,{method:"content.openEditor"})},saveSelectedLinks:Va,batchSaveUrls:Ga}),function(e){je=e}($a),function(e){ca=e}($a);async function ln(e){let t;try{t=await browser.runtime.sendNativeMessage("singlefile_companion",{method:"save",pageData:e})}catch(e){if(!e.message||!e.message.includes("Native host has exited"))throw e}if(t&&t.error)throw new Error(t.error+" (Companion)")}const un=new Set;async function dn(e){return e.method.endsWith(".saveCreatedBookmarks")?(fn(),{}):e.method.endsWith(".disable")?(async function(){let e;const t=await z();Object.keys(t).forEach(a=>e=e||!t[a].saveCreatedBookmarks),e&&(browser.bookmarks.onCreated.removeListener(mn),browser.bookmarks.onMoved.removeListener(wn))}(),{}):void 0}async function fn(){try{browser.bookmarks.onCreated.removeListener(mn),browser.bookmarks.onMoved.removeListener(wn)}catch(e){}let e;const t=await z();Object.keys(t).forEach(a=>{t[a].saveCreatedBookmarks&&(e=!0)}),e&&(browser.bookmarks.onCreated.addListener(mn),browser.bookmarks.onMoved.addListener(wn))}async function hn(e,t){try{await browser.bookmarks.update(e,t)}catch(e){}}async function mn(e,t){un.add(e),await pn(e,t.url,t)}async function wn(e,t){if(un.has(e)){const a=await browser.bookmarks.get(e);a[0]&&await pn(e,a[0].url,t)}}async function pn(e,t,a){const n=await browser.tabs.query({lastFocusedWindow:!0,active:!0}),r=await H(t);if(r.saveCreatedBookmarks){const i=await async function e(t,a=[]){if(t){const n=(await browser.bookmarks.get(t))[0];n&&n.title&&(a.unshift(n.title),await e(n.parentId,a))}return a}(a.parentId),s=r.allowedBookmarkFolders.toString(),c=i.find(e=>r.allowedBookmarkFolders.includes(e)),l=r.ignoredBookmarkFolders.toString(),u=i.find(e=>r.ignoredBookmarkFolders.includes(e));if((s&&c||!s)&&(l&&!u||!l))if(n.length&&n[0].url==t)un.delete(e),Ya(n,{bookmarkId:e,bookmarkFolders:i});else{const a=await browser.tabs.query({});if(a.length){const n=a.find(e=>e.url==t);n?(un.delete(e),Ya([n],{bookmarkId:e,bookmarkFolders:i})):t&&("about:blank"==t?browser.bookmarks.onChanged.addListener(function t(a,n){a==e&&n.url&&(browser.bookmarks.onChanged.removeListener(t),o(n.url))}):o(t))}}}function o(t){un.delete(e),Ja([t],{bookmarkId:e})}}Promise.resolve().then(fn);async function bn(e,t){let a=t||"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhYzZmZTMzMi0wODNjLTRjZmMtYmYxNC0xNWU5MTJmMWY4OWIiLCJpYXQiOjE1NzYxNzQzNDV9.n31j9ctJj7R1Vjwyc5yd1d6Cmg0NDnpwSaLWsqtZJQA";const n=await fetch("https://api.woleet.io/v1/anchor",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:"Bearer "+a},body:JSON.stringify({name:e,hash:e,public:!0})});if(401==n.status){const e=new Error("Your access token on Woleet is invalid. Go to __DOC_LINK__ to create your account.");throw e.link="https://app.woleet.io/",e}if(402==n.status){const e=new Error("You have no more credits on Woleet. Go to __DOC_LINK__ to recharge them.");throw e.link="https://app.woleet.io/",e}if(n.status>=400)throw new Error((n.statusText||"Error "+n.status)+" (Woleet)");return n.json()}const gn="https://oauth2.googleapis.com/token",yn="https://www.googleapis.com/drive/v3/files",vn="uniquify";let kn=class{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||"application/octet-stream",this.metadata={name:e.filename,mimeType:this.contentType,parents:e.parents||["root"]},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||524288,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(e=1){let t,a="POST";const n=Cn(await fetch(yn+`?q=name = '${this.metadata.name}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}})),r=await n.json();if(r.files.length)if("overwrite"==this.filenameConflictAction)a="PATCH",t=r.files[0].id,this.metadata.parents=null;else if(this.filenameConflictAction==vn){let t=this.metadata.name,a="";const n=this.metadata.name.lastIndexOf(".");n>-1&&(t=this.metadata.name.substring(0,n),a=this.metadata.name.substring(n+1));const r=t+" ("+e+")."+a,o=Cn(await fetch(yn+`?q=name = '${r}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}}));if((await o.json()).files.length)return this.upload(e+1);this.metadata.name=r}else{if("prompt"==this.filenameConflictAction){if(this.prompt){const t=await this.prompt(this.metadata.name);return t?(this.metadata.name=t,this.upload(e)):r}return this.filenameConflictAction=vn,this.upload(e)}if("skip"==this.filenameConflictAction)return r}const o=Cn(await fetch("https://www.googleapis.com/upload/drive/v3/files"+(t?"/"+t:"")+"?uploadType=resumable",{method:a,headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json","X-Upload-Content-Length":this.file.size,"X-Upload-Content-Type":this.contentType},body:JSON.stringify(this.metadata)})).headers.get("Location");if(this.url=o,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),Sn(this)}};async function An(e,t){const a=await fetch(gn,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+e.clientId+"&client_secret="+e.clientKey+"&grant_type=authorization_code&code="+t.code+"&redirect_uri="+browser.identity.getRedirectURL()}),n=await Pn(a);return e.accessToken=n.access_token,e.refreshToken=n.refresh_token,e.expirationDate=Date.now()+1e3*n.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function xn(e={}){return Boolean(browser.identity&&browser.identity.getAuthToken)&&!e.forceWebAuthFlow}async function Tn(e,t,a=!0){const n=t.split("/");n.pop();const r=e.folderIds.get(n.join("/"));if(r)return r;let o="root";if(n.length){let r="";for(const i of n){r&&(r+="/"),r+=i;const n=e.folderIds.get(r);if(n)o=n;else try{o=await In(e,i,o),e.folderIds.set(r,o)}catch(n){if("path_not_found"==n.message&&a)return e.folderIds.clear(),Tn(e,t,!1);throw n}}}return o}async function In(e,t,a){const n=await async function(e,t,a){const n=await fetch(yn+"?q=mimeType = 'application/vnd.google-apps.folder' and name = '"+t+"' and trashed != true and '"+a+"' in parents",{headers:{Authorization:"Bearer "+e.accessToken}});return Pn(n)}(e,t,a);if(n.files.length)return n.files[0].id;{const n=await async function(e,t,a){const n=await fetch(yn,{method:"POST",headers:{Authorization:"Bearer "+e.accessToken,"Content-Type":"application/json"},body:JSON.stringify({name:t,parents:[a],mimeType:"application/vnd.google-apps.folder"})});return Pn(n)}(e,t,a);return n.id}}async function Sn(e){let t=e.file,a=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(a=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,a));const n=await fetch(e.url,{method:"PUT",headers:{Authorization:"Bearer "+e.token,"Content-Type":e.contentType,"Content-Range":"bytes "+e.offset+"-"+(a-1)+"/"+e.file.size,"X-Upload-Content-Type":e.contentType},body:t});if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==n.status||201==n.status)return n.json();if(308==n.status){const t=n.headers.get("Range");if(t&&(e.offset=parseInt(t.match(/\d+/g).pop(),10)+1),e.cancelled)throw new Error("upload_cancelled");return Sn(e)}Cn(n)}async function Pn(e){e=Cn(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function Cn(e){if(200==e.status)return e;throw 404==e.status?new Error("path_not_found"):401==e.status?new Error("invalid_token"):new Error("unknown_error ("+e.status+")")}const En="https://api.dropboxapi.com/oauth2/token",Rn="uniquify",Un="prompt",Dn=/[\u007f-\uffff]/g;class Wn{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||"application/octet-stream",this.metadata={name:e.filename,mimeType:this.contentType},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||8388608,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(){const e=Ln(await fetch("https://api.dropboxapi.com/2/files/search_v2",{method:"POST",headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"},body:Bn({query:this.metadata.name,options:{filename:!0}})})),t=await _n(e);if(t.matches.length)if(this.filenameConflictAction==Un)if(this.prompt){const e=await this.prompt(this.metadata.name);if(!e)return t;this.metadata.name=e}else this.filenameConflictAction=Rn;else if("skip"==this.filenameConflictAction)return t;const a=Ln(await fetch("https://content.dropboxapi.com/2/files/upload_session/start",{method:"POST",headers:{Authorization:"Bearer "+this.token,"Dropbox-API-Arg":Bn({close:!1}),"Content-Type":"application/octet-stream"}})),n=(await _n(a)).session_id;if(this.sessionId=n,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),Fn(this)}}async function On(e,t){const a=await fetch(En,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+e.clientId+"&client_secret="+e.clientKey+"&grant_type=authorization_code&code="+t.code+"&redirect_uri="+browser.identity.getRedirectURL()}),n=await _n(a);return e.accessToken=n.access_token,e.refreshToken=n.refresh_token,e.expirationDate=Date.now()+1e3*n.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}async function Fn(e){let t=e.file,a=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(a=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,a));const n=Ln(await fetch("https://content.dropboxapi.com/2/files/upload_session/append_v2",{method:"POST",headers:{Authorization:"Bearer "+e.token,"Content-Type":"application/octet-stream","Dropbox-API-Arg":Bn({cursor:{session_id:e.sessionId,offset:e.offset},close:a==e.file.size})},body:t}));if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==n.status&&(e.offset=a,e.offset<e.file.size))return Fn(e);let r=e.metadata.name;r.startsWith("/")||(r="/"+r);const o=await fetch("https://content.dropboxapi.com/2/files/upload_session/finish",{method:"POST",headers:{Authorization:"Bearer "+e.token,"Content-Type":"application/octet-stream","Dropbox-API-Arg":Bn({cursor:{session_id:e.sessionId,offset:e.offset},commit:{path:r,mode:"overwrite"==e.filenameConflictAction?"overwrite":"add",autorename:e.filenameConflictAction==Rn}})}});if(200==o.status)return _n(o);if(409==o.status&&e.filenameConflictAction==Un)return e.offset=0,e.upload();throw new Error("unknown_error ("+o.status+")")}async function _n(e){e=Ln(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function Ln(e){if(200==e.status)return e;throw 401==e.status?new Error("invalid_token"):new Error("unknown_error ("+e.status+")")}function Bn(e){return JSON.stringify(e).replace(Dn,function(e){return"\\u"+("000"+e.charCodeAt(0).toString(16)).slice(-4)})}const Mn="",Nn="prompt",jn="Authorization",qn="/",zn=".",Hn="Error ",Kn=/\s\((\d+)\)$/,$n="PROPFIND",Vn="MKCOL",Gn=400;class Jn{constructor(e,t,a){e.endsWith(qn)||(e+=qn),this.url=e,this.authorization="Basic "+btoa(t+":"+a)}upload(e,t,a){return this.controller=new AbortController,a.signal=this.controller.signal,a.authorization=this.authorization,a.url=this.url,Yn(e,t,a)}abort(){this.controller&&this.controller.abort()}}async function Yn(e,t,a){const{authorization:n,filenameConflictAction:r,prompt:o,signal:i,preventRetry:s}=a;let{url:c}=a;try{if("overwrite"==r){let n=await l(e,"PUT",t);if(201==n.status)return n;if(n.status>=Gn){if(n=await l(e,"DELETE"),n.status>=Gn)throw new Error(Hn+n.status);return await Yn(e,t,a)}}else{let n=await l(e,"HEAD");if(200==n.status){if("uniquify"==r||r==Nn&&!o){const{filenameWithoutExtension:n,extension:r,indexFilename:o}=function(e){let t=e,a=Mn;const n=e.lastIndexOf(".");n>-1&&(t=e.substring(0,n),a=e.substring(n+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(Kn);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(Kn,Mn))}return{filenameWithoutExtension:e,indexFilename:a}}(t)),{filenameWithoutExtension:t,extension:a,indexFilename:r}}(e);return a.indexFilename=o+1,await Yn(function(e,t){return e+" ("+a.indexFilename+")"+(t?zn+t:Mn)}(n,r),t,a)}if(r==Nn)return(e=await o(e))?Yn(e,t,a):n;if("skip"==r)return n}else{if(404==n.status){if(n=await l(e,"PUT",t),n.status>=Gn&&!s){if(e.includes(qn))return await async function(){const t=e.split(qn);t.pop();let a=Mn;for(const e of t)if(e){a+=e;if(404==(await l(a,$n)).status){const e=await l(a,Vn);if(e.status>=Gn)throw new Error(Hn+e.status)}a+=qn}}(),a.preventRetry=!0,await Yn(e,t,a);throw new Error(Hn+n.status)}return n}if(n.status>=Gn)throw new Error(Hn+n.status)}}}catch(e){if("AbortError"!=e.name)throw e}function l(e,t,a){const r={[jn]:n};return a&&(r["Content-Type"]="text/html"),fetch(c+e,{method:t,headers:r,signal:i,body:a,credentials:"omit"})}}const Zn="",Xn="skip",Qn="uniquify",er="overwrite",tr="prompt",ar=".",nr=/\s\((\d+)\)$/,rr="AbortError",or="https://github.com",ir="https://api.github.com",sr="blob",cr="repos",lr="contents";let ur;class dr{constructor(e,t,a,n){this.headers=new Map([["Authorization","Bearer "+e],["Accept","application/vnd.github+json"],["X-GitHub-Api-Version","2022-11-28"]]),this.userName=t,this.repositoryName=a,this.branch=n}async upload(e,t,a){this.controller=new AbortController,a.signal=this.controller.signal,a.headers=this.headers;const n=t instanceof Blob?await(r=t,new Promise((e,t)=>{const a=new FileReader;a.onloadend=()=>e(a.result.match(/^data:[^,]+,(.*)$/)[1]),a.onerror=e=>t(e.detail),a.readAsDataURL(r)})):btoa(unescape(encodeURIComponent(t)));var r;return async function(e,t,a,n,r,o){const{filenameConflictAction:i,prompt:s,signal:c,headers:l}=o;for(;ur;)await ur;try{ur=await u({path:n,content:r})}finally{ur=null}return{url:`${or}/${e}/${t}/${sr}/${a}/${n}`};async function u({path:n,content:r,message:f="",sha:m}){try{const e=await w("PUT",JSON.stringify({content:r,message:f,branch:a,sha:m})),t=await e.json();if(422==e.status){if(i==er){const e=await w("GET"),t=(await e.json()).sha;return await u({path:n,content:r,message:f,sha:t})}if(i==Qn){const{filenameWithoutExtension:e,extension:t,indexFilename:a}=d(n);return o.indexFilename=a+1,n=h(e,t),await u({path:n,content:r,message:f})}if(i==Xn)return t;if(i==tr)return s?(n=await s(n))?await u({path:n,content:r,message:f}):t:(o.filenameConflictAction=Qn,await u({path:n,content:r,message:f}))}if(e.status<400)return t;throw new Error(t.message)}catch(e){if(e.name!=rr)throw e}function w(a,r){return fetch(`${ir}/${cr}/${e}/${t}/${lr}/${n}`,{method:a,headers:l,body:r,signal:c})}}function d(e){let t=e,a=Zn;const n=e.lastIndexOf(ar);let r;return n>-1&&(t=e.substring(0,n),a=e.substring(n+1)),({filenameWithoutExtension:t,indexFilename:r}=f(t)),{filenameWithoutExtension:t,extension:a,indexFilename:r}}function f(e){const t=e.match(nr);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(nr,Zn))}return{filenameWithoutExtension:e,indexFilename:a}}function h(e,t){return e+" ("+o.indexFilename+")"+(t?ar+t:Zn)}}(this.userName,this.repositoryName,this.branch,e,n,a)}abort(){this.controller&&this.controller.abort()}}const fr="",hr="uniquify",mr=".",wr=/\s\((\d+)\)$/;class pr{constructor(e,t,a,n,r="s3.amazonaws.com"){this.api=new kr({domain:r,region:e,bucket:t,accessKey:a,secretKey:n}),this.headObjectSupported=!0,this.listObjectsSupported=!0}async upload(e,t,a){const{filenameConflictAction:n,prompt:r}=a;this.controller=new AbortController,a.signal=this.controller.signal;try{if("overwrite"==n)return this.api.putObject({path:e},{body:await br(t)});{let o;if(this.headObjectSupported&&(o=await this.api.headObject({path:e},a)),this.headObjectSupported&&403!=o.status||(this.headObjectSupported=!1,this.listObjectsSupported&&(o=await this.api.listObjects({path:e},a)),this.listObjectsSupported&&403!=o.status||(this.listObjectsSupported=!1,o=await this.api.getObject({path:e},a))),200!=o.status){if(404==o.status)return t=new Uint8Array(await t.arrayBuffer()),this.api.putObject({path:e},{body:await br(t)});throw new Error(o.statusText||"Error "+o.status)}if("prompt"==n)return r?(e=await r(e))?this.upload(e,t,a):o:(a.filenameConflictAction=hr,this.upload(e,t,a));if(n==hr){const{filenameWithoutExtension:n,extension:r,indexFilename:o}=function(e){let t=e,a="";const n=e.lastIndexOf(".");n>-1&&(t=e.substring(0,n),a=e.substring(n+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(wr);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(wr,""))}return{filenameWithoutExtension:e,indexFilename:a}}(t)),{filenameWithoutExtension:t,extension:a,indexFilename:r}}(e);return a.indexFilename=o+1,e=function(e,t,a){return e+" ("+t+")"+(a?mr+a:fr)}(n,a.indexFilename,r),this.upload(e,t,a)}}}catch(e){if("AbortError"!=e.name)throw e}}abort(){this.controller&&this.controller.abort()}}async function br(e){return new Uint8Array(await new Response(e).arrayBuffer())}const gr="AWS4",yr=gr+"-HMAC-SHA256",vr="aws4_request";class kr{constructor({domain:e,region:t,bucket:a,accessKey:n,secretKey:r}){this.domain=e,this.region=t,this.bucket=a,this.accessKey=n,this.secretKey=r}async putObject({path:e},{headers:t={},body:a}){return Ar(this,{path:e},{method:"PUT",headers:t,body:a})}async getObject({path:e},{headers:t={}}={}){return Ar(this,{path:e},{method:"GET",headers:t})}async headObject({path:e},{headers:t={}}={}){return Ar(this,{path:e},{method:"HEAD",headers:t})}async listObjects({path:e},{headers:t={},continuationToken:a,delimiter:n,encodingType:r,prefix:o,maxKeys:i}={}){const s=new URLSearchParams;return s.set("list-type","2"),a&&s.set("continuation-token",a),n&&s.set("delimiter",n),r&&s.set("encoding-type",r),o&&s.set("prefix",o),i&&s.set("max-keys",i),Ar(this,{path:e,searchParams:s},{method:"GET",headers:t})}}async function Ar({region:e,bucket:t,accessKey:a,secretKey:n,domain:r},{path:o="/",searchParams:i=new URLSearchParams},{method:s,headers:c={},body:l}){const u=function(e){const t=new Date(e);return t.toISOString().replace(/[:-]|\.\d{3}/g,"")}(new Date);o.startsWith("/")||(o="/"+o),c.host=t+"."+r,l&&(c["content-length"]=l.byteLength),c["x-amz-content-sha256"]=await Ir(l),c["x-amz-date"]=u,c.authorization=yr+" Credential="+a+"/"+Sr(u,e,"s3")+",SignedHeaders="+Tr(c)+",Signature="+await async function({region:e,secretKey:t,service:a},{path:n,searchParams:r},{method:o,headers:i,body:s,isoDate:c}){const l=await async function(e,t,a,n,r,o,i,s){const c=await async function(e,t,a,n,r=new Uint8Array(0)){return n+"\n"+function(e){return decodeURIComponent(e).replace(/[^A-Za-z0-9-._~/]/g,xr)}(e)+"\n"+function(e){if(e){let t="";e.sort();for(const[a,n]of e)t+=encodeURIComponent(a)+"="+encodeURIComponent(n)+"&";return t.slice(0,-1)}return""}(t)+"\n"+function(e){let t="";const a=Object.keys(e).sort();for(const n of a)t+=n+":"+e[n]+"\n";return t}(a)+"\n"+Tr(a)+"\n"+await Ir(r)}(e,t,a,i,n);return yr+"\n"+r+"\n"+Sr(r,o,s)+"\n"+Rr(await Pr(Er(c)))}(n,r,i,s,c,e,o,a),u=await async function(e,t,a,n){const r=await Cr(Er(gr+e),Er(t.substring(0,8))),o=await Cr(r,Er(a)),i=await Cr(o,Er(n));return Cr(i,Er(vr))}(t,c,e,a);return Rr(await Cr(u,Er(l)))}({region:e,secretKey:n,service:"s3"},{path:o,searchParams:i},{method:s,headers:c,body:l,isoDate:u});const d="https://"+t+"."+r+o+(i.size?"?"+i:""),f={method:s,headers:c};return l&&(f.body=l),fetch(d,f)}function xr(e){let t=encodeURIComponent(e);return t=t.startsWith("%")?t.toUpperCase():"%"+t.charCodeAt(0).toString(16).toUpperCase(),t}function Tr(e){return Object.keys(e).map(e=>e.toLowerCase()).sort().join(";")}async function Ir(e=new Uint8Array(0)){return Rr(await Pr(e))}function Sr(e,t,a){return e.substring(0,8)+"/"+t+"/"+a+"/"+vr}async function Pr(e){return crypto.subtle.digest("SHA-256",e)}async function Cr(e,t){const a={name:"HMAC",hash:{name:"SHA-256"}},n=await crypto.subtle.importKey("raw",e,a,!1,["sign"]);return crypto.subtle.sign(a,n,t)}function Er(e){return(new TextEncoder).encode(e)}function Rr(e){return Array.from(new Uint8Array(e)).map(e=>e.toString(16).padStart(2,"0")).join("")}const Ur="",Dr="uniquify",Wr=".",Or=/\s\((\d+)\)$/,Fr="Content-Type",_r="application/json",Lr="2.0";class Br{constructor(e,t){this.serverUrl=e,this.authToken=t,this.requestId=0}async upload(e,t,a){let n;return this.controller=new AbortController,a.signal=this.controller.signal,a.serverUrl=this.serverUrl,a.authToken=this.authToken,a.getRequestId=()=>++this.requestId,n=t instanceof Blob?await t.text():t,Mr(e,n,a)}abort(){this.controller&&this.controller.abort()}}async function Mr(e,t,a){const{filenameConflictAction:n,prompt:r,signal:o,serverUrl:i,authToken:s,getRequestId:c}=a;try{const l=await async function(e,t,a,n,r){const o={jsonrpc:Lr,id:r(),method:"tools/call",params:{name:"get_file_info",arguments:{path:a}}},i={[Fr]:_r,Accept:"application/json, text/event-stream"};t&&(i.Authorization=`Bearer ${t}`);const s=await fetch(e,{method:"POST",headers:i,body:JSON.stringify(o),signal:n});if(!s.ok)throw new Error(`MCP server error: ${s.status} ${s.statusText}`);const c=await s.json();if(c.error)return{exists:!1};if(c.result&&c.result.isError)return{exists:!1};if(c.result)return{exists:!0};return{exists:!1}}(i,s,e,o,c);if(l.exists){if("skip"==n)return{url:e,skipped:!0};if("overwrite"==n);else{if(n==Dr){const{filenameWithoutExtension:n,extension:r,indexFilename:o}=function(e){let t=e,a="";const n=e.lastIndexOf(".");n>-1&&(t=e.substring(0,n),a=e.substring(n+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(Or);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(Or,""))}return{filenameWithoutExtension:e,indexFilename:a}}(t)),{filenameWithoutExtension:t,extension:a,indexFilename:r}}(e);return a.indexFilename=o+1,e=function(e,t,a){return e+" ("+a+")"+(t?Wr+t:Ur)}(n,r,a.indexFilename),await Mr(e,t,a)}if("prompt"==n)return r?(e=await r(e))?await Mr(e,t,a):{url:e,skipped:!0}:(a.filenameConflictAction=Dr,await Mr(e,t,a))}}const u=await async function(e,t,a,n,r,o){const i={jsonrpc:Lr,id:o(),method:"tools/call",params:{name:"write_file",arguments:{path:a,content:n}}},s={[Fr]:_r,Accept:"application/json, text/event-stream"};t&&(s.Authorization=`Bearer ${t}`);const c=await fetch(e,{method:"POST",headers:s,body:JSON.stringify(i),signal:r});if(!c.ok)throw new Error(`MCP server error: ${c.status} ${c.statusText}`);const l=await c.json();if(l.error)throw new Error(l.error.message);return{success:!0}}(i,s,e,t,o,c);if(u.success)return{url:e};throw new Error(u.error||"Failed to write file via MCP")}catch(e){if("AbortError"!=e.name)throw e}}const Nr=[0],jr=Symbol(),qr=new TextEncoder,zr=new TextDecoder,Hr=new Array(256);let Kr=0;function $r(e,t,a,n){if(void 0===n){if(Kr++,!(Hr.length-Kr>=Nr.length))throw new Error("Reached maximum number of custom types");Hr[Hr.length-Kr]={serialize:e,parse:t,test:a}}else Hr[n]={serialize:e,parse:t,test:a}}$r(async function(e,t){const a=e.objects.indexOf(t);await Yr(e,a)},async function(e){const t=await io(e);return new ao(t,e)},fo,0),$r(null,function(){return{}},mo),$r(Zr,so,wo),$r(Xr,co,function(e){return"string"==typeof e}),$r(Qr,async function(e){const t=await io(e),a=await e.consume(8*t);return new Float64Array(a.buffer)},function(e){return"Float64Array"==e.constructor.name}),$r(Qr,async function(e){const t=await io(e),a=await e.consume(4*t);return new Float32Array(a.buffer)},function(e){return"Float32Array"==e.constructor.name}),$r(Qr,async function(e){const t=await io(e),a=await e.consume(4*t);return new Uint32Array(a.buffer)},function(e){return"Uint32Array"==e.constructor.name}),$r(Qr,async function(e){const t=await io(e),a=await e.consume(4*t);return new Int32Array(a.buffer)},function(e){return"Int32Array"==e.constructor.name}),$r(Qr,async function(e){const t=await io(e),a=await e.consume(2*t);return new Uint16Array(a.buffer)},function(e){return"Uint16Array"==e.constructor.name}),$r(Qr,async function(e){const t=await io(e),a=await e.consume(2*t);return new Int16Array(a.buffer)},function(e){return"Int16Array"==e.constructor.name}),$r(Qr,async function(e){const t=await io(e),a=await e.consume(t);return new Uint8ClampedArray(a.buffer)},function(e){return"Uint8ClampedArray"==e.constructor.name}),$r(Qr,async function(e){const t=await io(e);return await e.consume(t)},function(e){return"Uint8Array"==e.constructor.name}),$r(Qr,async function(e){const t=await io(e),a=await e.consume(t);return new Int8Array(a.buffer)},function(e){return"Int8Array"==e.constructor.name}),$r(async function(e,t){await Yr(e,t.byteLength),await e.append(new Uint8Array(t))},async function(e){const t=await io(e);return(await e.consume(t)).buffer},function(e){return"ArrayBuffer"==e.constructor.name}),$r(eo,lo,bo),$r(async function(e,t){const a=new Uint8Array(new Uint32Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(4);return new Uint32Array(t.buffer)[0]},function(e){return go(e)&&e>=0&&e<=4294967295}),$r(async function(e,t){const a=new Uint8Array(new Int32Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(4);return new Int32Array(t.buffer)[0]},function(e){return go(e)&&e>=-2147483648&&e<=2147483647}),$r(async function(e,t){const a=new Uint8Array(new Uint16Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(2);return new Uint16Array(t.buffer)[0]},function(e){return go(e)&&e>=0&&e<=65535}),$r(async function(e,t){const a=new Uint8Array(new Int16Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(2);return new Int16Array(t.buffer)[0]},function(e){return go(e)&&e>=-32768&&e<=32767}),$r(async function(e,t){const a=new Uint8Array([t]);await e.append(a)},async function(e){const t=await e.consume(1);return new Uint8Array(t.buffer)[0]},function(e){return go(e)&&e>=0&&e<=255}),$r(async function(e,t){const a=new Uint8Array(new Int8Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(1);return new Int8Array(t.buffer)[0]},function(e){return go(e)&&e>=-128&&e<=127}),$r(null,function(){return},function(e){return void 0===e}),$r(null,function(){return null},function(e){return null===e}),$r(null,function(){return NaN},function(e){return Number.isNaN(e)}),$r(to,uo,function(e){return"boolean"==typeof e}),$r(async function(e,t){await Xr(e,t.description)},async function(e){const t=await co(e);return Symbol(t)},yo),$r(null,function(){return jr},po),$r(async function(e,t){const a=t.entries();await Yr(e,t.size);for(const[t,n]of a)await Yr(e,t),await Yr(e,n)},async function(e){const t=await io(e),a=new Map;t&&await async function n(r=0){const o=await io(e),i=await io(e);e.setObject([o,i],(e,t)=>a.set(e,t)),r<t-1&&await n(r+1)}();return a},function(e){return e instanceof Map}),$r(async function(e,t){await Yr(e,t.size);for(const a of t)await Yr(e,a)},async function(e){const t=await io(e),a=new Set;t&&await async function n(r=0){const o=await io(e);e.setObject([o],e=>a.add(e)),r<t-1&&await n(r+1)}();return a},function(e){return e instanceof Set}),$r(async function(e,t){await eo(e,t.getTime())},async function(e){const t=await lo(e);return new Date(t)},function(e){return e instanceof Date}),$r(async function(e,t){await Xr(e,t.message),await Xr(e,t.stack)},async function(e){const t=await co(e),a=await co(e),n=new Error(t);return n.stack=a,n},function(e){return e instanceof Error}),$r(async function(e,t){await Xr(e,t.source),await Xr(e,t.flags)},async function(e){const t=await co(e),a=await co(e);return new RegExp(t,a)},function(e){return e instanceof RegExp}),$r(async function(e,t){await Xr(e,t.valueOf())},async function(e){return new String(await co(e))},function(e){return e instanceof String}),$r(async function(e,t){await eo(e,t.valueOf())},async function(e){return new Number(await lo(e))},function(e){return e instanceof Number}),$r(async function(e,t){await to(e,t.valueOf())},async function(e){return new Boolean(await uo(e))},function(e){return e instanceof Boolean});class Vr{constructor(e,t){this.stream=new Gr(e,t),this.objects=[]}append(e){return this.stream.append(e)}flush(){return this.stream.flush()}addObject(e){this.objects.push(vo(e)&&!fo(e,this)?e:void 0)}}class Gr{constructor(e,t){this.offset=0,this.appendData=e,this.value=new Uint8Array(t)}async append(e){if(this.offset+e.length>this.value.length){const t=this.value.length-this.offset;await this.append(new Uint8Array(e).subarray(0,t)),await this.appendData({value:this.value}),this.offset=0,await this.append(new Uint8Array(e).subarray(t))}else this.value.set(e,this.offset),this.offset+=e.length}async flush(){this.offset&&await this.appendData({value:new Uint8Array(this.value).subarray(0,this.offset),done:!0})}}function Jr(e,{chunkSize:t=8388608}={}){let a,n,r,o,i,s;return{[Symbol.asyncIterator]:()=>({next:()=>o?{done:o}:async function(){s?s():c().catch(()=>{});i=new Promise(e=>s=e);const e=await async function(){const{value:e,done:t}=await n;o=t,t||l();return e}();return{value:e}}(),return:()=>({done:!0})})};async function c(){l(),a=new Vr(u,t),await Yr(a,e),await a.flush()}function l(){n=new Promise(e=>r=e)}async function u(e){r(e),await i}}async function Yr(e,t){const a=Hr.findIndex(({test:a}={})=>a&&a(t,e));e.addObject(t),await e.append(new Uint8Array([a]));const n=Hr[a].serialize;n&&await n(e,t),0!=a&&mo(t)&&(await async function(e,t){const a=Object.getOwnPropertySymbols(t),n=a.map(e=>[e,t[e]]);await Zr(e,n)}(e,t),await async function(e,t){if(ArrayBuffer.isView(t))await Yr(e,0);else{let a=Object.entries(t);wo(t)&&(a=a.filter(([e])=>!go(Number(e)))),await Yr(e,a.length);for(const[t,n]of a)await Xr(e,t),await Yr(e,n)}}(e,t))}async function Zr(e,t){await Yr(e,t.length);const a=Object.keys(t).filter(e=>go(Number(e))).map(e=>Number(e));let n=0,r=a[n];for(const[o,i]of t.entries())r==o?(r=a[++n],await Yr(e,i)):await Yr(e,jr)}async function Xr(e,t){const a=qr.encode(t);await Yr(e,a.length),await e.append(a)}async function Qr(e,t){await Yr(e,t.length),await e.append("Uint8Array"==t.constructor.name?t:new Uint8Array(t.buffer))}async function eo(e,t){const a=new Uint8Array(new Float64Array([t]).buffer);await e.append(a)}async function to(e,t){const a=new Uint8Array([Number(t)]);await e.append(a)}class ao{constructor(e,t){this.index=e,this.data=t}getObject(){return this.data.objects[this.index]}}class no{constructor(e){this.stream=new ro(e),this.objects=[],this.setters=[]}consume(e){return this.stream.consume(e)}getObjectId(){const e=this.objects.length;return this.objects.push(void 0),e}resolveObject(e,t){vo(t)&&!ho(t)&&(this.objects[e]=t)}setObject(e,t){this.setters.push({functionArguments:e,setterFunction:t})}executeSetters(){this.setters.forEach(({functionArguments:e,setterFunction:t})=>{t(...e.map(e=>ho(e)?e.getObject():e))})}}class ro{constructor(e){this.offset=0,this.value=new Uint8Array(0),this.consumeData=e}async consume(e){if(this.offset+e>this.value.length){const t=new Uint8Array(this.value).subarray(this.offset,this.value.length),a=await this.consumeData();return t.length+a.length!=this.value.length&&(this.value=new Uint8Array(t.length+a.length)),this.value.set(t),this.value.set(a,t.length),this.offset=0,this.consume(e)}{const t=this.value.slice(this.offset,this.offset+e);return this.offset+=t.length,t}}}function oo(){let e,t,a,n,r,o;return{next:async t=>t?async function(t){r?await r:async function(){let t;n=new Promise(e=>t=e),e=new no(s),i();const a=await io(e);e.executeSetters(),t(a)}().catch(()=>{});return function(){r=new Promise(e=>o=e)}(),a(t),{done:!1}}(t):{value:await n,done:!0},return:()=>({done:!0})};function i(){t=new Promise(e=>a=e)}async function s(){const e=await t;return i(),o&&o(),e}}async function io(e){const t=(await e.consume(1))[0],a=Hr[t].parse,n=e.getObjectId(),r=await a(e);return 0!=t&&mo(r)&&(await async function(e,t){const a=await so(e);e.setObject([a],e=>e.forEach(([e,a])=>t[e]=a))}(e,r),await async function(e,t){const a=await io(e);a&&await n();async function n(r=0){const o=await co(e),i=await io(e);e.setObject([i],e=>t[o]=e),r<a-1&&await n(r+1)}}(e,r)),e.resolveObject(n,r),r}async function so(e){const t=await io(e),a=new Array(t);return t&&await async function n(r=0){const o=await io(e);po(o)||e.setObject([o],e=>a[r]=e);r<t-1&&await n(r+1)}(),a}async function co(e){const t=await io(e),a=await e.consume(t);return zr.decode(a)}async function lo(e){const t=await e.consume(8);return new Float64Array(t.buffer)[0]}async function uo(e){const t=await e.consume(1);return Boolean(t[0])}function fo(e,t){return mo(e)&&t.objects.includes(e)}function ho(e){return e instanceof ao}function mo(e){return e===Object(e)}function wo(e){return"number"==typeof e.length}function po(e){return e===jr}function bo(e){return"number"==typeof e}function go(e){return bo(e)&&Number.isInteger(e)}function yo(e){return"symbol"==typeof e}function vo(e){return mo(e)||yo(e)}class ko{constructor(e,t,a,n){this.headers=new Map([["Authorization","Bearer "+e],["Accept","application/json"]]),this.restApiUrl=t,this.fileFieldName=a,this.urlFieldName=n}async upload(e,t,a){this.controller=new AbortController;const n=t instanceof Blob?t:new Blob([t],{type:"text/html"});let r=new FormData;this.fileFieldName&&r.append(this.fileFieldName,n,e),this.urlFieldName&&r.append(this.urlFieldName,a);const o=await fetch(this.restApiUrl,{method:"POST",body:r,headers:this.headers,signal:this.controller.signal});if([200,201].includes(o.status))return o.json();throw new Error(await o.text())}abort(){this.controller&&this.controller.abort()}}const Ao=new Map,xo=new Map,To=/([{}()^$&.*?/+|[\\\\]|\]|-)/g;let Io="207618107333-h1220p1oasj3050kr5r416661adm091a.apps.googleusercontent.com",So="VQJ8Gq8Vxx72QyxPyeLtWvUt";const Po=browser.runtime.getManifest().oauth2;Po&&(Io=Po.client_id,So=Po.client_secret);const Co=new class{constructor(e,t,a){this.clientId=e,this.clientKey=t,this.scopes=a,this.folderIds=new Map,setInterval(()=>this.folderIds.clear(),6e4)}async auth(e={interactive:!0}){return xn(e)?(this.accessToken=await browser.identity.getAuthToken({interactive:e.interactive}),{revokableAccessToken:this.accessToken}):(this.authURL="https://accounts.google.com/o/oauth2/v2/auth?client_id="+this.clientId+"&response_type=code&access_type=offline&redirect_uri="+browser.identity.getRedirectURL()+"&scope="+this.scopes.join(" "),e.code?An(this,e):async function(e,t){let a;try{if(browser.identity&&browser.identity.launchWebAuthFlow&&!t.forceWebAuthFlow){const a=await browser.identity.launchWebAuthFlow({interactive:t.interactive,url:e.authURL});return t.code=new URLSearchParams(new URL(a).search).get("code"),await An(e,t)}if(t.launchWebAuthFlow)return t.extractAuthCode(browser.identity.getRedirectURL()).then(e=>a=e).catch(()=>{}),await t.launchWebAuthFlow({url:e.authURL});throw new Error("auth_not_supported")}catch(n){if(n.message&&("code_required"==n.message||n.message.includes("access"))){if(a)return t.code=a,await An(e,t);throw new Error("code_required")}throw n}}(this,e))}setAuthInfo(e,t){xn(t)||(e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate))}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(gn,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token&client_secret="+this.clientKey});if(400==e.status)throw new Error("unknown_token");const t=await Pn(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}try{return browser.identity&&browser.identity.removeCachedAuthToken&&this.accessToken&&await browser.identity.removeCachedAuthToken({token:this.accessToken}),this.accessToken=await browser.identity.getAuthToken({interactive:!1}),{revokableAccessToken:this.accessToken}}catch(e){delete this.accessToken}}async revokeAuthToken(e){if(e){if(browser.identity&&browser.identity.removeCachedAuthToken)try{await browser.identity.removeCachedAuthToken({token:e})}catch(e){}const t=await fetch("https://accounts.google.com/o/oauth2/revoke",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"token="+e});try{await Pn(t)}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,a,n,r=!0){const o=await Tn(this,e),i=e.split("/").pop(),s=new kn({token:this.accessToken,file:t,parents:[o],filename:i,onProgress:a.onProgress,filenameConflictAction:a.filenameConflictAction,prompt:a.prompt});try{n&&n(()=>s.cancelled=!0),await s.upload()}catch(o){if("path_not_found"==o.message&&r)return this.folderIds.clear(),this.upload(e,t,a,n);throw o}}}(Io,So,["https://www.googleapis.com/auth/drive.file"]),Eo=new class{constructor(e,t){this.clientId=e,this.clientKey=t}async auth(e={interactive:!0}){return this.authURL="https://www.dropbox.com/oauth2/authorize?client_id="+this.clientId+"&response_type=code&token_access_type=offline&redirect_uri="+browser.identity.getRedirectURL(),e.code?On(this,e):async function(e,t){let a;try{return t.extractAuthCode(browser.identity.getRedirectURL()).then(e=>a=e).catch(()=>{}),await t.launchWebAuthFlow({url:e.authURL})}catch(n){if(n.message&&("code_required"==n.message||n.message.includes("access"))){if(a)return t.code=a,await On(e,t);throw new Error("code_required")}throw n}}(this,e)}setAuthInfo(e){e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate)}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(En,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token&client_secret="+this.clientKey});if(400==e.status)throw new Error("unknown_token");const t=await _n(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}delete this.accessToken}async revokeAuthToken(e){if(e){const t=await fetch("https://api.dropboxapi.com/2/auth/token/revoke",{method:"POST",headers:{Authorization:"Bearer "+e}});try{await t.text()}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,a,n){const r=new Wn({token:this.accessToken,file:t,filename:e,onProgress:a.onProgress,filenameConflictAction:a.filenameConflictAction,prompt:a.prompt});n&&n(()=>r.cancelled=!0),await r.upload()}}("s50p6litdvuzrtb","i1vzwllesr14fzd");async function Ro(e,t){if(e.method.endsWith(".download"))return async function(e,t){const a=t.id;let n;if(e.blobURL)try{e.compressContent?(e.pageData=await async function(e){const t=oo();return await t.next(e),(await t.next()).value}(new Uint8Array(await(await fetch(e.blobURL)).arrayBuffer())),await Do(e,t)):(e.content=await(await fetch(e.blobURL)).text(),await Uo([e.content],t,t.incognito,e))}catch(e){return{error:!0}}else if(e.compressContent){let n=xo.get(a);if(n||(n=oo(),xo.set(a,n)),e.data)await n.next(new Uint8Array(e.data));else{xo.delete(a);const e=(await n.next()).value;await Do(e,t)}}else e.truncated?(n=Ao.get(a),n||(n=[],Ao.set(a,n)),n.push(e.content),e.finished&&Ao.delete(a)):e.content&&(n=[e.content]),e.truncated&&!e.finished||await Uo(n,t,t.incognito,e);return{}}(e,t.tab);if(e.method.endsWith(".disableGDrive")){const e=await X();return ae(),await Co.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".disableDropbox")){const e=await Q();return ne(),await Eo.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".end")){if(e.hash)try{await bn(e.hash,e.woleetKey)}catch(e){ma(t.tab.id,e.message,e.link)}return tn(e.taskId),{}}return e.method.endsWith(".getInfo")?qa.map(cn):e.method.endsWith(".cancel")?(e.taskId?rn(e.taskId):nn(t.tab.id),{}):e.method.endsWith(".cancelAll")?(Array.from(qa).forEach(e=>sn(e,!1)),{}):e.method.endsWith(".saveUrls")?(Ja(e.urls),{}):void 0}async function Uo(e,t,a,n){const r=t.id;try{let o;if(n.backgroundSave&&!n.saveToGDrive&&!n.saveToDropbox&&!n.saveWithWebDAV&&!n.saveToGitHub&&!n.saveToRestFormApi&&!n.saveToS3){const e=await qo(n.filename,n);n.filenameConflictAction=e.filenameConflictAction,o=e.skipped}if(o)pa(r);else{const o=e=>zo(r,e);let i;if(n.openEditor)wa(r),await de({tabIndex:t.index+1,filename:n.filename,content:e.join(""),url:n.originalUrl});else if(n.saveToClipboard)n.content=e.join(""),function(e){const t="copy";function a(t){t.clipboardData.setData(e.mimeType,e.content),t.clipboardData.setData("text/plain",e.content),t.preventDefault()}document.addEventListener(t,a),document.execCommand(t),document.removeEventListener(t,a)}(n);else if(n.saveWithWebDAV)i=await Bo(n.taskId,Wo(n.filename),e.join(""),n.webDAVURL,n.webDAVUser,n.webDAVPassword,{filenameConflictAction:n.filenameConflictAction,prompt:o});else if(n.saveWithMCP)i=await Mo(n.taskId,Wo(n.filename),e.join(""),n.mcpServerUrl,n.mcpAuthToken,{filenameConflictAction:n.filenameConflictAction,prompt:o});else if(n.saveToGDrive)await No(n.taskId,Wo(n.filename),new Blob(e,{type:n.mimeType}),{forceWebAuthFlow:n.forceWebAuthFlow},{onProgress:(e,t)=>ba(r,e,t),filenameConflictAction:n.filenameConflictAction,prompt:o});else if(n.saveToDropbox)await jo(n.taskId,Wo(n.filename),new Blob(e,{type:n.mimeType}),{onProgress:(e,t)=>ba(r,e,t),filenameConflictAction:n.filenameConflictAction,prompt:o});else if(n.saveToGitHub)i=await _o(n.taskId,Wo(n.filename),e.join(""),n.githubToken,n.githubUser,n.githubRepository,n.githubBranch,{filenameConflictAction:n.filenameConflictAction,prompt:o}),await i.pushPromise;else if(n.saveWithCompanion)await ln({filename:n.filename,content:n.content,title:n.title,url:n.originalUrl,filenameConflictAction:n.filenameConflictAction});else if(n.saveToRestFormApi)i=await Ko(n.taskId,n.filename,e.join(""),t.url,n.saveToRestFormApiToken,n.saveToRestFormApiUrl,n.saveToRestFormApiFileFieldName,n.saveToRestFormApiUrlFieldName);else if(n.saveToS3)i=await Lo(n.taskId,Wo(n.filename),new Blob(e,{type:n.mimeType}),n.S3Domain,n.S3Region,n.S3Bucket,n.S3AccessKey,n.S3SecretKey,{filenameConflictAction:n.filenameConflictAction,prompt:o});else if(n.url=URL.createObjectURL(new Blob(e,{type:n.mimeType})),i=await Ho(n,{confirmFilename:n.confirmFilename,incognito:a,filenameConflictAction:n.filenameConflictAction,filenameReplacementCharacter:n.filenameReplacementCharacter,bookmarkId:n.bookmarkId,replaceBookmarkURL:n.replaceBookmarkURL,includeInfobar:n.includeInfobar,openInfobar:n.openInfobar,infobarPositionAbsolute:n.infobarPositionAbsolute,infobarPositionTop:n.infobarPositionTop,infobarPositionBottom:n.infobarPositionBottom,infobarPositionLeft:n.infobarPositionLeft,infobarPositionRight:n.infobarPositionRight}),!i)throw new Error("upload_cancelled");if(n.bookmarkId&&n.replaceBookmarkURL&&i&&i.url&&await hn(n.bookmarkId,{url:i.url}),pa(r),n.openSavedPage&&!n.openEditor){const a={active:!0,url:"/src/ui/pages/viewer.html?blobURI="+URL.createObjectURL(new Blob(e,{type:n.mimeType})),windowId:t.windowId};null!=t.index&&(a.index=t.index+1),browser.tabs.create(a)}}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),ma(r,e.message,e.link))}finally{n.url&&URL.revokeObjectURL(n.url)}}async function Do(e,t){const a=t.id;try{let n;if(e.backgroundSave&&!e.saveToGDrive&&!e.saveToDropbox&&!e.saveWithWebDAV&&!e.saveWithMCP&&!e.saveToGitHub&&!e.saveToRestFormApi&&!e.sharePage){const t=await qo(e.filename,e);e.filenameConflictAction=t.filenameConflictAction,n=t.skipped}if(n)pa(a);else{const n=e.pageData,r=e=>zo(a,e),o=await singlefile.processors.compression.process(n,{insertTextBody:e.insertTextBody,url:n.url||t.url,createRootDirectory:e.createRootDirectory,tabId:a,selfExtractingArchive:e.selfExtractingArchive,extractDataFromPage:e.extractDataFromPage,preventAppendedData:e.preventAppendedData,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,insertMetaCSP:e.insertMetaCSP,password:e.password,embeddedImage:e.embeddedImage});let i;if(e.openEditor)wa(a),await de({tabIndex:t.index+1,filename:e.filename,content:Array.from(new Uint8Array(await o.arrayBuffer())),compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,extractDataFromPage:e.extractDataFromPage,insertTextBody:e.insertTextBody,insertMetaCSP:e.insertMetaCSP,embeddedImage:e.embeddedImage,url:e.originalUrl});else if(e.foregroundSave||!e.backgroundSave||e.sharePage){const t=await async function(e,t,a,n,r,{foregroundSave:o,sharePage:i}={}){const s=Jr({filename:t,taskId:e,foregroundSave:o,sharePage:i,content:await a.arrayBuffer(),mimeType:n});for await(const e of s)await browser.tabs.sendMessage(r,{method:"content.download",data:Array.from(e)});return browser.tabs.sendMessage(r,{method:"content.download"})}(e.taskId,e.filename,o,n.mimeType,a,{foregroundSave:!0,sharePage:e.sharePage});if(t.error)throw new Error(t.error)}else e.saveWithWebDAV?i=await Bo(e.taskId,Wo(e.filename),o,e.webDAVURL,e.webDAVUser,e.webDAVPassword,{filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveWithMCP?i=await Mo(e.taskId,Wo(e.filename),o,e.mcpServerUrl,e.mcpAuthToken,{filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToGDrive?await No(e.taskId,Wo(e.filename),o,{forceWebAuthFlow:e.forceWebAuthFlow},{onProgress:(e,t)=>ba(a,e,t),filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToDropbox?await jo(e.taskId,Wo(e.filename),o,{onProgress:(e,t)=>ba(a,e,t),filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToGitHub?(i=await _o(e.taskId,Wo(e.filename),o,e.githubToken,e.githubUser,e.githubRepository,e.githubBranch,{filenameConflictAction:e.filenameConflictAction,prompt:r}),await i.pushPromise):e.saveToRestFormApi?i=await Ko(e.taskId,e.filename,o,t.url,e.saveToRestFormApiToken,e.saveToRestFormApiUrl,e.saveToRestFormApiFileFieldName,e.saveToRestFormApiUrlFieldName):e.saveToS3?i=await Lo(e.taskId,Wo(e.filename),o,e.S3Domain,e.S3Region,e.S3Bucket,e.S3AccessKey,e.S3SecretKey,{filenameConflictAction:e.filenameConflictAction,prompt:r}):(e.url=URL.createObjectURL(o),i=await Ho(e,{confirmFilename:e.confirmFilename,incognito:t.incognito,filenameConflictAction:e.filenameConflictAction,filenameReplacementCharacter:e.filenameReplacementCharacter,bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,includeInfobar:e.includeInfobar,openInfobar:e.openInfobar,infobarPositionAbsolute:e.infobarPositionAbsolute,infobarPositionTop:e.infobarPositionTop,infobarPositionBottom:e.infobarPositionBottom,infobarPositionLeft:e.infobarPositionLeft,infobarPositionRight:e.infobarPositionRight}));if(e.bookmarkId&&e.replaceBookmarkURL&&i&&i.url&&await hn(e.bookmarkId,{url:i.url}),pa(a),e.openSavedPage&&!e.openEditor){const e={active:!0,url:"/src/ui/pages/viewer.html?compressed&blobURI="+URL.createObjectURL(o),windowId:t.windowId};null!=t.index&&(e.index=t.index+1),browser.tabs.create(e)}}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),ma(a,e.message,e.link))}finally{e.url&&URL.revokeObjectURL(e.url)}}function Wo(e){return e.replace(/#/g,"%23")}async function Oo(e,t){let a=await X();const n={interactive:!0,forceWebAuthFlow:e.forceWebAuthFlow,launchWebAuthFlow:e=>Te(e),extractAuthCode:e=>xe(e)};return Co.setAuthInfo(a,n),a&&a.accessToken&&!t||(a=await Co.auth(n),a?await ee(a):await ae()),a}async function Fo(e){let t=await Q();const a={launchWebAuthFlow:e=>Te(e),extractAuthCode:e=>xe(e)};return Eo.setAuthInfo(t),t&&t.accessToken&&!e||(t=await Eo.auth(a),t?await te(t):await ne()),t}async function _o(e,t,a,n,r,o,i,{filenameConflictAction:s,prompt:c}){try{const l=on(e);if(!l||!l.cancelled){const l=new dr(n,r,o,i);return an(e,()=>l.abort()),await l.upload(t,a,{filenameConflictAction:s,prompt:c})}}catch(e){throw new Error(e.message+" (GitHub)")}}async function Lo(e,t,a,n,r,o,i,s,{filenameConflictAction:c,prompt:l}){try{const u=on(e);if(!u||!u.cancelled){const u=new pr(r,o,i,s,n);return an(e,()=>u.abort()),await u.upload(t,a,{filenameConflictAction:c,prompt:l})}}catch(e){throw new Error(e.message+" (S3)")}}async function Bo(e,t,a,n,r,o,{filenameConflictAction:i,prompt:s}){try{const c=on(e);if(!c||!c.cancelled){const c=new Jn(n,r,o);return an(e,()=>c.abort()),await c.upload(t,a,{filenameConflictAction:i,prompt:s})}}catch(e){throw new Error(e.message+" (WebDAV)")}}async function Mo(e,t,a,n,r,{filenameConflictAction:o,prompt:i}){try{const s=on(e);if(!s||!s.cancelled){const s=new Br(n,r);return an(e,()=>s.abort()),await s.upload(t,a,{filenameConflictAction:o,prompt:i})}}catch(e){throw new Error(e.message+" (MCP)")}}async function No(e,t,a,n,r){try{await Oo(n);const o=on(e);if(!o||!o.cancelled)return await Co.upload(t,a,r,t=>an(e,t))}catch(o){if("invalid_token"==o.message){let o;try{o=await Co.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Google Drive)");o=await Oo(n,!0)}return o?await ee(o):await ae(),await No(e,t,a,n,r)}throw new Error(o.message+" (Google Drive)")}}async function jo(e,t,a,n){try{await Fo();const r=on(e);if(!r||!r.cancelled)return await Eo.upload(t,a,n,t=>an(e,t))}catch(r){if("invalid_token"==r.message){let r;try{r=await Eo.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Dropbox)");r=await Fo(!0)}return r?await te(r):await ne(),await jo(e,t,a,n)}throw new Error(r.message+" (Dropbox)")}}async function qo(e,t){let a,n=t.filenameConflictAction;if("skip"==n){(await browser.downloads.search({filenameRegex:"(\\\\|/)"+(r=e,r.replace(To,"\\$1")+"$"),exists:!0})).length?a=!0:n="uniquify"}var r;return{skipped:a,filenameConflictAction:n}}function zo(e,t){return browser.tabs.sendMessage(e,{method:"content.prompt",message:"Filename conflict, please enter a new filename",value:t})}async function Ho(t,a){const n={url:t.url,saveAs:a.confirmFilename,filename:t.filename,conflictAction:a.filenameConflictAction};a.incognito&&(n.incognito=!0);const r=await e(n,a.filenameReplacementCharacter);if(r.filename){let e=r.filename;return e.startsWith("file:")||(e.startsWith("/")&&(e=e.substring(1)),e="file:///"+Wo(e)),{url:e}}r.cancelled&&rn(t.taskId)}async function Ko(e,t,a,n,r,o,i,s){try{const c=on(e);if(!c||!c.cancelled){const c=new ko(r,o,i,s);return an(e,()=>c.abort()),await c.upload(t,a,n)}}catch(e){throw new Error(e.message+" (RestFormApi)")}}const $o={},Vo={};async function Go(e,t){if("enableAutoSave"==e.method){const a=await s(t.id);a[t.id].autoSave=e.enabled,await c(a),async function(e){Promise.all([ta(e),Ve(e)])}(t)}if("isAutoSaveEnabled"==e.method)return oe(t)}async function Jo(e,t){const a=t.id,n=await H(t.url,!0);if(n){let r;ha(a,1,!0),n.content=e.content,n.url=e.url,n.frames=e.frames,n.canvases=e.canvases,n.fonts=e.fonts,n.stylesheets=e.stylesheets,n.images=e.images,n.posters=e.posters,n.videos=e.videos,n.usedFonts=e.usedFonts,n.shadowRoots=e.shadowRoots,n.referrer=e.referrer,n.worklets=e.worklets,n.adoptedStyleSheets=e.adoptedStyleSheets,n.visitDate=new Date(e.visitDate),n.backgroundTab=!0,n.autoSave=!0,n.incognito=t.incognito,n.tabId=a,n.tabIndex=t.index;try{if(n.autoSaveExternalSave)await async function(e){let t;e.autoSaveExternalSave=!1;try{t=await browser.runtime.sendNativeMessage("singlefile_companion",{method:"externalSave",pageData:e})}catch(e){if(!e.message||!e.message.includes("Native host has exited"))throw e}if(t&&t.error)throw new Error(t.error+" (Companion)")}(n);else{let o;if(n.passReferrerOnError&&ke(),n.tabId=a,r=await function(e,t={fetch:Ra,frameFetch:Ua},a,n){return globalThis.singlefile.getPageData(e,t,a,n)}(n,{fetch:Yo},null,null),!(n.saveToGDrive||n.saveWithWebDAV||n.saveWithMCP||n.saveToGitHub||n.saveToDropbox||n.saveWithCompanion||n.saveToRestFormApi||n.saveToS3)){const e=await qo(r.filename,n);o=e.skipped,n.filenameConflictAction=e.filenameConflictAction}if(!o){let{content:o,mimeType:i}=r;if(n.compressContent&&(o=new Blob([new Uint8Array(o)],{type:i})),n.saveToGDrive&&(o instanceof Blob||(o=new Blob([o],{type:i})),await No(e.taskId,Wo(r.filename),o,n,{forceWebAuthFlow:n.forceWebAuthFlow},n.filenameConflictAction)),n.saveToDropbox?(o instanceof Blob||(o=new Blob([o],{type:i})),await jo(e.taskId,Wo(r.filename),o,{filenameConflictAction:n.filenameConflictAction})):n.saveWithWebDAV?await Bo(e.taskId,Wo(r.filename),o,n.webDAVURL,n.webDAVUser,n.webDAVPassword,{filenameConflictAction:n.filenameConflictAction}):n.saveWithMCP?await Mo(e.taskId,Wo(r.filename),o,n.mcpServerUrl,n.mcpAuthToken,{filenameConflictAction:n.filenameConflictAction}):n.saveToGitHub?await(await _o(e.taskId,Wo(r.filename),o,n.githubToken,n.githubUser,n.githubRepository,n.githubBranch,{filenameConflictAction:n.filenameConflictAction})).pushPromise:n.saveWithCompanion&&!n.compressContent?await ln({filename:r.filename,content:r.content,title:r.title,url:n.url,filenameConflictAction:n.filenameConflictAction}):n.saveToRestFormApi?await Ko(e.taskId,r.filename,o,n.url,n.saveToRestFormApiToken,n.saveToRestFormApiUrl,n.saveToRestFormApiFileFieldName,n.saveToRestFormApiUrlFieldName):n.saveToS3?(o instanceof Blob||(o=new Blob([o],{type:i})),await Lo(e.taskId,r.filename,o,n.S3Domain,n.S3Region,n.S3Bucket,n.S3AccessKey,n.S3SecretKey,{filenameConflictAction:n.filenameConflictAction})):(o instanceof Blob||(o=new Blob([o],{type:i})),r.url=URL.createObjectURL(o),await Ho(r,n)),n.openSavedPage){const e={active:!0,url:"/src/ui/pages/viewer.html?compressed=true&blobURI="+URL.createObjectURL(o),windowId:t.windowId},n=t.index;try{await browser.tabs.get(a),e.index=n+1}catch(t){e.index=n}browser.tabs.create(e)}r.hash&&await bn(r.hash,n.woleetKey)}}}finally{e.taskId?tn(e.taskId):n.autoClose&&(browser.tabs.remove(Vo[a]||a),delete Vo[a]),r&&r.url&&URL.revokeObjectURL(r.url),pa(a,!0)}}}async function Yo(e,t={}){const a=await be(e,t);return{status:a.status,headers:{get:e=>a.headers[e]},arrayBuffer:()=>a.arrayBuffer}}async function Zo(e,t){return e.method.endsWith(".init")&&(await async function(e,t){await o(e.id);const a=await s(e.id);a[e.id].savedPageDetected=t.savedPageDetected,await c(a)}(t.tab,e),na(t.tab),function(e){nn(e.id,!1)}(t.tab),async function(e){const[t,a]=await Promise.all([H(e.url,!0),oe(e)]);t&&(t.autoSaveLoad||t.autoSaveLoadOrUnload)&&a&&Ya([e],{autoSave:!0})}(t.tab)),e.method.endsWith(".getOptions")?H(e.url):(e.method.endsWith(".activate")&&await browser.tabs.update(e.tabId,{active:!0}),e.method.endsWith(".getScreenshot")?Xo(t.tab.id,e):void 0)}async function Xo(e,t){const{width:a,height:n,scale:r=1}=t,o=Math.floor(a*r),i=Math.floor(n*r);let s,c,l,u=0,d=0;browser.tabs.captureTab?c=4096:(c=t.innerHeight,l=(await browser.tabs.query({active:!0,currentWindow:!0}))[0].id);const f=Math.floor(c*r);await browser.tabs.sendMessage(e,{method:"content.beginScrollTo"});try{s=new OffscreenCanvas(o,i);const t=s.getContext("2d");for(;u<n;){let r;browser.tabs.captureTab?r=await browser.tabs.captureTab(e,{format:"png",rect:{x:0,y:u,width:a,height:Math.min(n-u,c)}}):(await browser.tabs.sendMessage(e,{method:"content.scrollTo",y:u}),await browser.tabs.update(e,{active:!0}),r=await browser.tabs.captureVisibleTab(null,{format:"png"}));const s=new Image;await new Promise((e,t)=>{s.onload=e,s.onerror=e=>t(new Error(e.detail)),s.src=r});const l=Math.min(i-d,f);t.drawImage(s,0,d,o,l),u+=c,d+=f}browser.tabs.captureTab||await browser.tabs.update(l,{active:!0})}catch(a){if(r>.1)return t.scale=.75*r,Xo(e,t);throw a}finally{await browser.tabs.sendMessage(e,{method:"content.endScrollTo"})}if(s)return URL.createObjectURL(await s.convertToBlob({type:"image/png"}))}browser.tabs.onCreated.addListener(e=>function(e){!function(e){na(e)}(e)}(e)),browser.tabs.onActivated.addListener(e=>async function(e){const t=await browser.tabs.get(e.tabId);ga(t)}(e)),browser.tabs.onRemoved.addListener(e=>function(e){nn(e),o(e),function(e){ce.delete(e)}(e),async function(e){const t=$o[e];t?t.autoSaveRemove&&(delete $o[e],await Jo(t,t.tab)):$o[e]={removed:!0}}(e)}(e)),browser.tabs.onUpdated.addListener((e,t)=>async function(e,t){if("complete"==t.status){setTimeout(async()=>{try{await browser.tabs.sendMessage(e,{method:"content.maybeInit"})}catch(e){}},1500),function(e){delete $o[e]}(e);const t=await browser.tabs.get(e);if(fe(t)){const e=await s(t.id);e[t.id].editorDetected=!0,await c(e),ga(t)}}t.discarded&&async function(e){const t=$o[e];t?(delete $o[e],await Jo(t,t.tab)):$o[e]={discarded:!0}}(e)}(e,t)),browser.tabs.onReplaced.addListener((e,t)=>function(e,t){(async function(e,t){let n=await s();await r(n,e,t),c(n),await r(a,e,t)})(e,t),async function(e,t){$o[t]&&!$o[e]&&($o[e]=$o[t],delete $o[t],Vo[t]=e)}(e,t),function(e,t){qa.forEach(a=>{a.tab.id==t&&(a.tab.id=e)})}(e,t)}(e,t)),browser.runtime.onMessage.addListener((e,t)=>{if("singlefile.frameTree.initResponse"==e.method||"singlefile.frameTree.ackInitRequest"==e.method)return browser.tabs.sendMessage(t.tab.id,e,{frameId:0}),Promise.resolve({})});const Qo=new Map;function ei(e,t){e.delete(t)}browser.runtime.onMessage.addListener((e,t)=>{if("singlefile.lazyTimeout.setTimeout"==e.method){let a,n=Qo.get(t.tab.id);if(n)if(a=n.get(t.frameId),a){const t=a.get(e.type);t&&clearTimeout(t)}else a=new Map;const r=setTimeout(async()=>{try{const a=Qo.get(t.tab.id),n=a.get(t.frameId);a&&n&&ei(n,e.type),await browser.tabs.sendMessage(t.tab.id,{method:"singlefile.lazyTimeout.onTimeout",type:e.type})}catch(e){}},e.delay);return n||(n=new Map,a=new Map,n.set(t.frameId,a),Qo.set(t.tab.id,n)),a.set(e.type,r),Promise.resolve({})}if("singlefile.lazyTimeout.clearTimeout"==e.method){let a=Qo.get(t.tab.id);if(a){const n=a.get(t.frameId);if(n){const t=n.get(e.type);t&&clearTimeout(t),ei(n,e.type)}}return Promise.resolve({})}}),browser.tabs.onRemoved.addListener(e=>Qo.delete(e));async function ti(e){return(await browser.tabs.query(e)).sort((e,t)=>e.index-t.index)}browser.runtime.onMessage.addListener((e,t)=>e.method.startsWith("tabs.")?Zo(e,t):e.method.startsWith("downloads.")?Ro(e,t):e.method.startsWith("autosave.")?async function(e,t){if(e.method.endsWith(".save"))return e.autoSaveDiscard||e.autoSaveRemove?(t.tab?(e.tab=t.tab,$o[t.tab.id]=e):$o[e.tabId]&&($o[e.tabId].removed&&e.autoSaveRemove||$o[e.tabId].discarded&&e.autoSaveDiscard)&&(delete $o[e.tabId],await Jo(e,{id:e.tabId,index:e.tabIndex,url:t.url})),e.autoSaveUnload&&(delete $o[e.tabId],await Jo(e,t.tab))):(delete $o[e.tabId],await Jo(e,t.tab)),{}}(e,t):e.method.startsWith("ui.")?da(e,t):e.method.startsWith("config.")?q(e):e.method.startsWith("tabsData.")?function(e){return e.method.endsWith(".get")?s():e.method.endsWith(".set")?c(e.tabsData):void 0}(e):e.method.startsWith("editor.")?async function(e,t){if(e.method.endsWith(".getTabData")){const e=t.tab,a=ce.get(e.id);if(a){const t=await H(a.url),n=JSON.stringify(a);for(let r=0;r*ie<n.length;r++){const o={method:"editor.setTabData",compressContent:a.compressContent};o.truncated=n.length>ie,o.truncated?(o.finished=(r+1)*ie>n.length,o.content=n.substring(r*ie,(r+1)*ie),o.finished&&(o.options=t)):(o.content=n,t.embeddedImage=a.embeddedImage,o.options=t),await browser.tabs.sendMessage(e.id,o)}}return{}}if(e.method.endsWith(".open")){let a;const n=t.tab;if(e.truncated?(a=le.get(n.id),a||(a=[],le.set(n.id,a)),a.push(e.content),e.finished&&le.delete(n.id)):e.content&&(a=[e.content]),!e.truncated||e.finished){const t={url:se};await browser.tabs.update(n.id,t);const r=e.compressContent?a.flat():a.join("");ce.set(n.id,{url:n.url,content:r,filename:e.filename,compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,extractDataFromPageTags:e.extractDataFromPageTags,insertTextBody:e.insertTextBody,insertMetaCSP:e.insertMetaCSP,embeddedImage:e.embeddedImage})}return{}}}(e,t):e.method.startsWith("bookmarks.")?dn(e):e.method.startsWith("companion.")?async function(e){if(e.method.endsWith(".state"))return{enabled:!0}}(e):e.method.startsWith("requests.")?ye(e):e.method.startsWith("bootstrap.")?async function(e,t){if(e.method.endsWith(".init")){const[e,a,n]=await Promise.all([H(t.tab.url,!0),H(t.tab.url),oe(t.tab)]);return{optionsAutoSave:e,options:a,autoSaveEnabled:n,tabId:t.tab.id,tabIndex:t.tab.index}}}(e,t):"ping"==e.method?Promise.resolve({}):void 0),browser.runtime.onMessageExternal&&browser.runtime.onMessageExternal.addListener(async function(e,t){if("save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await Ya(e)}else if("edit-and-save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await Ya(e,{openEditor:!0})}else if("save-selected-links"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await Va(e[0])}else if("save-selected-content"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await Ya(e,{selected:!0})}else if("save-selected-tabs"==e){const e=await ti({currentWindow:!0,highlighted:!0});await Ya(e)}else if("save-unpinned-tabs"==e){const e=await ti({currentWindow:!0,pinned:!1});await Ya(e)}else if("save-all-tabs"==e){const e=await ti({currentWindow:!0});await Ya(e)}else if(e.method){const t=(await browser.tabs.query({currentWindow:!0,active:!0}))[0];return!!t&&Go(e,t)}})}();
|