| 1 |
- !function(){"use strict";const e="complete",t="interrupted",a="USER_CANCELED",n="canceled",r="conflictaction prompt not yet implemented",o="'incognito'",s='"incognito"',i="illegal characters",c="invalid filename";async function l(d,u){let f;try{f=await browser.downloads.download(d)}catch(e){if(e.message){const t=e.message.toLowerCase(),a=t.includes(i)||t.includes(c);if(a&&d.filename.startsWith("."))return d.filename=u+d.filename,l(d,u);if(a&&d.filename.includes(","))return d.filename=d.filename.replace(/,/g,u),l(d,u);if(a&&d.filename.match(/\u200C|\u200D|\u200E|\u200F/))return d.filename=d.filename.replace(/\u200C|\u200D|\u200E|\u200F/g,u),l(d,u);if(a&&!d.filename.match(/^[\x00-\x7F]+$/))return d.filename=d.filename.replace(/[^\x00-\x7F]+/g,u),l(d,u);if((t.includes(o)||t.includes(s))&&d.incognito)return delete d.incognito,l(d,u);if(t==r&&d.conflictAction)return delete d.conflictAction,l(d,u);if(t.includes(n))return{};throw e}throw e}return new Promise(((n,r)=>{browser.downloads.onChanged.addListener((function o(s){s.id==f&&s.state&&(s.state.current==e&&(browser.downloads.search({id:f}).then((e=>n({filename:e[0]&&e[0].filename}))).catch((()=>n({}))),browser.downloads.onChanged.removeListener(o)),s.state.current==t&&(s.error&&s.error.current==a?n({}):r(new Error(s.state.current)),browser.downloads.onChanged.removeListener(o)))}))}))}let d,u,f;async function w(e,t,a){e[a]&&!e[t]&&(e[t]=e[a],delete e[a])}async function h(e){u&&delete u[e];const t=await b();if(t[e]){const a=t[e].autoSave;t[e]={autoSave:a},await g(t)}}function m(e){return u||(u={}),void 0===e||u[e]||(u[e]={}),u}async function b(e){if(!d){const e=await browser.storage.local.get();d=e.tabsData||{}}return async function(){if(!f){f=!0;const e=await browser.tabs.query({currentWindow:!0,highlighted:!0});Object.keys(d).filter((t=>{if("autoSaveAll"!=t&&"autoSaveUnpinned"!=t&&"profileName"!=t)return!e.find((e=>e.id==t))})).forEach((e=>delete d[e])),await browser.storage.local.set({tabsData:d})}}(),void 0===e||d[e]||(d[e]={}),d}async function g(e){d=e,await browser.storage.local.set({tabsData:e})}setTimeout((()=>b().then((e=>d=e))),0);const p="-",y="__Default_Settings__",v="__Disabled_Settings__",k="regexp:",I="profile_",S=!/Safari/.test(navigator.userAgent)||/Chrome/.test(navigator.userAgent)||/Vivaldi/.test(navigator.userAgent)||/OPR/.test(navigator.userAgent),T=!(/Mobile.*Firefox/.test(navigator.userAgent)||/Safari/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/Vivaldi/.test(navigator.userAgent)&&!/OPR/.test(navigator.userAgent)),x=S,E=S,P=S,A=S,W=S,R=S,L=S,D=S,M=S,_=S,C=S,U={removeHiddenElements:!0,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:"{page-title} ({date-locale} {time-locale}).html",infobarTemplate:"",includeInfobar:!1,confirmInfobarContent:!1,autoClose:!1,confirmFilename:!1,filenameConflictAction:"uniquify",filenameMaxLength:192,filenameMaxLengthUnit:"bytes",filenameReplacedCharacters:["~","+","\\\\","?","%","*",":","|",'"',"<",">","\0-",""],filenameReplacementCharacter:"_",replaceEmojisInFilename:!1,contextMenuEnabled:!0,tabMenuEnabled:!0,browserActionMenuEnabled:!0,shadowEnabled:!0,logsEnabled:!0,progressBarEnabled:!0,maxResourceSizeEnabled:!1,maxResourceSize:10,displayInfobar:!0,displayStats:!1,backgroundSave:T,defaultEditorMode:"normal",applySystemTheme:!0,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,saveWithWebDAV:!1,webDAVURL:"",webDAVUser:"",webDAVPassword:"",saveToGitHub:!1,githubToken:"",githubUser:"",githubRepository:"SingleFile-Archives",githubBranch:"main",saveWithCompanion:!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,autoSaveExternalSave:!1,insertMetaNoIndex:!1,insertMetaCSP:!0,passReferrerOnError:!1,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,blockStylesheets:!1,blockFonts:!1,blockScripts:!0,blockVideos:!0,blockAudios:!0},O=[{url:"file:",profile:"__Default_Settings__",autoSaveProfile:"__Disabled_Settings__"}];let B,N=j();async function j(e){const{sync:t}=await browser.storage.local.get();B=t?browser.storage.sync:browser.storage.local;const a=await B.get();if(!a[I+y])if(a.profiles&&!e){const e=Object.keys(a.profiles);for(const t of e)await X(t,a.profiles[t])}else await X(y,U);a.rules||await B.set({rules:O}),a.maxParallelWorkers||await B.set({maxParallelWorkers:navigator.hardwareConcurrency||4})}async function q(e,t){const{rules:a}=await B.get(["rules"]),n=a.filter((e=>V(e)));let r=n.sort(z).find((t=>e&&e.match(new RegExp(t.url.split(k)[1]))));if(!r){const n=a.filter((e=>!V(e)));r=n.sort(z).find((a=>!t&&"*"==a.url||e&&e.includes(a.url)))}return r}async function F(){await N;const{maxParallelWorkers:e}=await B.get(["maxParallelWorkers"]),t=await K();return{profiles:await J(),rules:t,maxParallelWorkers:e}}function z(e,t){return t.url.length-e.url.length}function V(e){return e.url.toLowerCase().startsWith(k)}async function H(e){if(e.method.endsWith(".deleteRules")&&await async function(e){const t=await K();await B.set({rules:e?t.filter((t=>t.autoSaveProfile!=e&&t.profile!=e)):[]})}(e.profileName),e.method.endsWith(".deleteRule")&&await async function(e){if(!e)throw new Error("URL is empty");const t=await K();await B.set({rules:t.filter((t=>t.url!=e))})}(e.url),e.method.endsWith(".addRule")&&await Q(e.url,e.profileName,e.autoSaveProfileName),e.method.endsWith(".createProfile")&&await async function(e,t){if((await Y()).includes(e))throw new Error("Duplicate profile name");const a=await Z(t),n=JSON.parse(JSON.stringify(a));await X(e,n)}(e.profileName,e.fromProfileName||y),e.method.endsWith(".renameProfile")&&await async function(e,t){const a=await Y(),n=await b(),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==y)throw new Error("Default settings cannot be renamed");n.profileName==e&&(n.profileName=t,await g(n));r.forEach((a=>{a.profile==e&&(a.profile=t),a.autoSaveProfile==e&&(a.autoSaveProfile=t)}));const o=await Z(e);await B.remove([I+e]),await B.set({[I+t]:o,rules:r})}(e.profileName,e.newProfileName),e.method.endsWith(".deleteProfile")&&await async function(e){const t=await Y(),a=await b(),n=await K();if(!t.includes(e))throw new Error("Profile not found");if(e==y)throw new Error("Default settings cannot be deleted");a.profileName==e&&(delete a.profileName,await g(a));n.forEach((t=>{t.profile==e&&(t.profile=y),t.autoSaveProfile==e&&(t.autoSaveProfile=y)})),B.remove([I+e]),await B.set({rules:n})}(e.profileName),e.method.endsWith(".resetProfiles")&&await async function(){await N;const e=await b();delete e.profileName,await g(e);let t=await $();await B.remove([...t,"rules","maxParallelWorkers"]),await j(!0)}(),e.method.endsWith(".resetProfile")&&await async function(e){if(!(await Y()).includes(e))throw new Error("Profile not found");await X(e,U)}(e.profileName),e.method.endsWith(".importConfig")&&await async function(e){const t=await Y(),a=await $(),n=await b();t.includes(n.profileName)&&(delete n.profileName,await g(n));await B.remove([...a,"rules","maxParallelWorkers"]);const r={rules:e.rules,maxParallelWorkers:e.maxParallelWorkers};Object.keys(e.profiles).forEach((t=>r[I+t]=e.profiles[t])),await B.set(r),await j()}(e.config),e.method.endsWith(".updateProfile")&&await async function(e,t){if(!(await Y()).includes(e))throw new Error("Profile not found");const a=await Z(e);Object.keys(a).forEach((e=>{t[e]=void 0===t[e]?a[e]:t[e]})),await X(e,t)}(e.profileName,e.profile),e.method.endsWith(".updateRule")&&await ee(e.url,e.newUrl,e.profileName,e.autoSaveProfileName),e.method.endsWith(".getConstants"))return{DISABLED_PROFILE_NAME:v,DEFAULT_PROFILE_NAME:y,CURRENT_PROFILE_NAME:p,BACKGROUND_SAVE_SUPPORTED:T,BADGE_COLOR_SUPPORTED:x,AUTO_SAVE_SUPPORTED:E,SELECTABLE_TABS_SUPPORTED:P,OPEN_SAVED_PAGE_SUPPORTED:W,AUTO_OPEN_EDITOR_SUPPORTED:A,INFOBAR_SUPPORTED:R,BOOKMARKS_API_SUPPORTED:L,IDENTITY_API_SUPPORTED:D,CLIPBOARD_API_SUPPORTED:M,NATIVE_API_API_SUPPORTED:_,WEB_BLOCKING_API_SUPPORTED:C};if(e.method.endsWith(".getRules"))return K();if(e.method.endsWith(".getProfiles"))return J();if(e.method.endsWith(".exportConfig"))return async function(){const e=await F(),t=JSON.stringify({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers},null,2),a=`singlefile-settings-${(new Date).toISOString().replace(/:/g,"_")}.json`;if(S){const e=URL.createObjectURL(new Blob([t],{type:"text/json"}));try{await l({url:e,filename:a,saveAs:!0},"_")}finally{URL.revokeObjectURL(e)}return{}}return{filename:a,textContent:t}}();if(e.method.endsWith(".enableSync")){await browser.storage.local.set({sync:!0});const e=await browser.storage.sync.get();if(!e||!e.rules){const e=await $(),t=await browser.storage.local.get(["rules","maxParallelWorkers",...e]);await browser.storage.sync.set(t)}return B=browser.storage.sync,await j(),{}}if(e.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});const t={};await browser.storage.local.set(t)}return B=browser.storage.local,await j(),{}}return e.method.endsWith(".isSync")?{sync:(await browser.storage.local.get()).sync}:{}}async function J(){await N;const e=await $(),t=await B.get(e),a={};return Object.keys(t).forEach((e=>a[e.substring(I.length)]=t[e])),a}async function G(e,t){await N;const[a,n]=await Promise.all([q(e),b()]),r=n.profileName||y;let o;if(a){const e=a[t?"autoSaveProfile":"profile"];o=e==p?r:e}else o=r;const s=await Z(o);return Object.assign({profileName:o},s)}async function K(){return(await B.get(["rules"])).rules}async function Y(){return Object.keys(await B.get()).filter((e=>e.startsWith(I))).map((e=>e.substring(I.length)))}async function $(){return Object.keys(await B.get()).filter((e=>e.startsWith(I)))}async function Z(e){const t=I+e;return(await B.get([t]))[t]}async function X(e,t){const a=I+e;await B.set({[a]:t})}async function Q(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 B.set({rules:n})}async function ee(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 B.set({rules:r})}async function te(){return(await B.get()).authInfo}async function ae(e){await B.set({authInfo:e})}async function ne(){let e=te();e.revokableAccessToken?ae({revokableAccessToken:e.revokableAccessToken}):await B.remove(["authInfo"])}async function re(e){if(e){const[t,a]=await Promise.all([b(),q(e.url)]);return Boolean(t.autoSaveAll||t.autoSaveUnpinned&&!e.pinned||t[e.id]&&t[e.id].autoSave)&&(!a||a.autoSaveProfile!=v)}}const oe=33554432,se="/src/ui/pages/editor.html",ie=new Map,ce=new Map,le=browser.runtime.getURL(se);function de(e){return e.url==le}const ue=new Map,fe="x-single-file-request-id",we=8388608;async function he(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 me(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}):me(e,t,!0).then(n).catch(r):r())},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){ue.set(e,t)}(e,t.referrer),o.setRequestHeader(fe,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 me(e.url,{referrer:e.referrer,headers:e.headers});return he(t.tab.id,e.requestId,a)}catch(a){return he(t.tab.id,e.requestId,{error:a.message,arrray:[]})}else if("singlefile.fetchFrame"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(a).catch((e=>a({error:e&&e.toString()})))}))}));let be=!1;function ge(e){return e.method.endsWith(".enableReferrerOnError")?(ye(),{}):e.method.endsWith(".disableReferrerOnError")?(function(){try{browser.webRequest.onBeforeSendHeaders.removeListener(pe)}catch(e){}be=!1}(),{}):void 0}function pe(e){if(be){let t=e.requestHeaders.find((e=>e.name===fe));if(t){e.requestHeaders=e.requestHeaders.filter((e=>e.name!==fe));const a=ue.get(t.value);if(a){ue.delete(t.value);if(!e.requestHeaders.find((e=>"referer"===e.name.toLowerCase())))return e.requestHeaders.push({name:"Referer",value:a}),{requestHeaders:e.requestHeaders}}}}}function ye(){if(!be){try{browser.webRequest.onBeforeSendHeaders.addListener(pe,{urls:["<all_urls>"]},["blocking","requestHeaders","extraHeaders"])}catch(e){browser.webRequest.onBeforeSendHeaders.addListener(pe,{urls:["<all_urls>"]},["blocking","requestHeaders"])}be=!0}}async function ve(e){return(await browser.tabs.query(e)).sort(((e,t)=>e.index-t.index))}const ke="/src/ui/resources/icon_128.png",Ie="/src/ui/resources/icon_128_wait",Se=browser.i18n.getMessage("buttonDefaultTooltip"),Te=browser.i18n.getMessage("buttonBlockedTooltip"),xe=browser.i18n.getMessage("buttonInitializingBadge"),Ee=browser.i18n.getMessage("buttonInitializingTooltip"),Pe=browser.i18n.getMessage("buttonErrorBadge"),Ae=browser.i18n.getMessage("buttonBlockedBadge"),We=browser.i18n.getMessage("buttonOKBadge"),Re=browser.i18n.getMessage("buttonSaveProgressTooltip"),Le=browser.i18n.getMessage("buttonUploadProgressTooltip"),De=browser.i18n.getMessage("buttonAutoSaveActiveBadge"),Me=browser.i18n.getMessage("buttonAutoSaveActiveTooltip"),_e=[2,147,20,192],Ce=[4,229,36,192],Ue=1,Oe={default:{setBadgeBackgroundColor:{color:_e},setBadgeText:{text:""},setTitle:{title:Se},setIcon:{path:ke}},inject:{setBadgeBackgroundColor:{color:_e},setBadgeText:{text:xe},setTitle:{title:Ee}},execute:{setBadgeBackgroundColor:{color:Ce},setBadgeText:{text:xe}},progress:{setBadgeBackgroundColor:{color:Ce},setBadgeText:{text:""}},edit:{setBadgeBackgroundColor:{color:_e},setBadgeText:{text:""},setTitle:{title:Se},setIcon:{path:ke}},end:{setBadgeBackgroundColor:{color:Ce},setBadgeText:{text:We},setTitle:{title:Se},setIcon:{path:ke}},error:{setBadgeBackgroundColor:{color:[229,4,12,192]},setBadgeText:{text:Pe},setTitle:{title:""},setIcon:{path:ke}},forbidden:{setBadgeBackgroundColor:{color:[255,255,255,1]},setBadgeText:{text:Ae},setTitle:{title:Te},setIcon:{path:ke}},autosave:{inject:{setBadgeBackgroundColor:{color:[64,64,64,192]},setBadgeText:{text:De},setTitle:{title:Me},setIcon:{path:ke}},default:{setBadgeBackgroundColor:{color:[208,208,208,192]},setBadgeText:{text:De},setTitle:{title:Me},setIcon:{path:ke}}}};let Be;function Ne(e,t){if(e.method.endsWith(".processInit")){delete m(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,ze(a,n,r,Re)),e.method.endsWith(".processEnd")&&qe(t.tab.id),e.method.endsWith(".processError")&&(e.error&&console.error("Initialization error",e.error),je(t.tab.id)),e.method.endsWith(".processCancelled")&&Fe(t.tab),Promise.resolve({})}function je(e){He(e,Ge("error"))}function qe(e,t){He(e,t?Ge("default",!0):Ge("end"))}function Fe(e){Ve(e)}function ze(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),s=Ie+o+".png",i=Ge("progress");i.setTitle={title:n+5*r+"%"},i.setIcon={path:s},He(e,i)}async function Ve(e){const t=Ge("default",await re(e));await He(e.id,t)}async function He(e,t){try{const a=m(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||x;if(browser.browserAction[t]&&n){const n=JSON.parse(JSON.stringify(a));n.tabId=e,await browser.browserAction[t](n)}}function Ge(e,t){return JSON.parse(JSON.stringify(t?Oe.autosave[e]:Oe[e]))}browser.browserAction.onClicked.addListener((async e=>{const t=await ve({currentWindow:!0,highlighted:!0});t.length<=1?function(e){Be.isSavingTab(e)?Be.cancelTab(e.id):Be.saveTabs([e])}(e):Be.saveTabs(t)}));const Ke=browser.menus,Ye=Ke&&Ke.onClicked&&Ke.create&&Ke.update&&Ke.removeAll,$e="save-page",Ze="edit-and-save-page",Xe="save-with-profile",Qe="save-selected-links",et="view-pendings",tt="select-profile",at="wasve-with-profile-",nt="select-profile-",rt="associate-with-profile",ot="associate-with-profile-",st="save-selected",it="save-frame",ct="save-tabs",lt="save-selected-tabs",dt="save-unpinned-tabs",ut="save-all-tabs",ft="batch-save-urls",wt="button-"+lt,ht="button-"+dt,mt="button-"+ut,bt="auto-save",gt="auto-save-disabled",pt="auto-save-tab",yt="auto-save-unpinned",vt="auto-save-all",kt=browser.i18n.getMessage("menuCreateDomainRule"),It=browser.i18n.getMessage("menuUpdateRule"),St=browser.i18n.getMessage("menuSavePage"),Tt=browser.i18n.getMessage("menuSaveWithProfile"),xt=browser.i18n.getMessage("menuSaveSelectedLinks"),Et=browser.i18n.getMessage("menuEditPage"),Pt=browser.i18n.getMessage("menuEditAndSavePage"),At=browser.i18n.getMessage("menuViewPendingSaves"),Wt=browser.i18n.getMessage("menuSaveSelection"),Rt=browser.i18n.getMessage("menuSaveFrame"),Lt=browser.i18n.getMessage("menuSaveTabs"),Dt=browser.i18n.getMessage("menuSaveSelectedTabs"),Mt=browser.i18n.getMessage("menuSaveUnpinnedTabs"),_t=browser.i18n.getMessage("menuSaveAllTabs"),Ct=browser.i18n.getMessage("menuBatchSaveUrls"),Ut=browser.i18n.getMessage("menuSelectProfile"),Ot=browser.i18n.getMessage("profileDefaultSettings"),Bt=browser.i18n.getMessage("menuAutoSave"),Nt=browser.i18n.getMessage("menuAutoSaveDisabled"),jt=browser.i18n.getMessage("menuAutoSaveTab"),qt=browser.i18n.getMessage("menuAutoSaveUnpinnedTabs"),Ft=browser.i18n.getMessage("menuAutoSaveAllTabs"),zt=[Ze,Qe,st,it,bt,rt],Vt=new Map,Ht=new Map;let Jt,Gt,Kt,Yt=!0,$t=!0,Zt=new Map;async function Xt(e){const[t,a]=await Promise.all([J(),b()]),n=await G(e&&e.url);if(Ye&&n){const r=["page","frame","image","link","video","audio","selection"],o=[];if(n.browserActionMenuEnabled&&o.push("browser_action"),n.tabMenuEnabled)try{await Ke.create({id:"temporary-id",contexts:["tab"],title:"title"}),o.push("tab")}catch(e){n.tabMenuEnabled=!1}await Ke.removeAll();const s=o.concat(...r),i=n.contextMenuEnabled?s:o;if(Ke.create({id:$e,contexts:i,title:St}),Ke.create({id:Ze,contexts:i,title:Pt}),Ke.create({id:Qe,contexts:n.contextMenuEnabled?o.concat(["selection"]):o,title:xt}),Object.keys(t).length>1&&Ke.create({id:Xe,contexts:i,title:Tt}),n.contextMenuEnabled&&Ke.create({id:"separator-1",contexts:r,type:"separator"}),Ke.create({id:st,contexts:i,title:Wt}),n.contextMenuEnabled&&Ke.create({id:it,contexts:["frame"],title:Rt}),Ke.create({id:ct,contexts:o,title:Lt}),Ke.create({id:wt,contexts:o,title:Dt,parentId:ct}),Ke.create({id:ht,contexts:o,title:Mt,parentId:ct}),Ke.create({id:mt,contexts:o,title:_t,parentId:ct}),n.contextMenuEnabled&&(P&&Ke.create({id:lt,contexts:r,title:Dt}),Ke.create({id:dt,contexts:r,title:Mt}),Ke.create({id:ut,contexts:r,title:_t}),Ke.create({id:"separator-2",contexts:r,type:"separator"})),Object.keys(t).length>1){Ke.create({id:tt,title:Ut,contexts:i}),Ke.create({id:at+"default",contexts:i,title:Ot,parentId:Xe});const o=nt+"default",s=!a.profileName||a.profileName==y;let c;Ke.create({id:o,type:"radio",contexts:i,title:Ot,checked:s,parentId:tt}),Vt.set(o,s),Ke.create({id:rt,title:kt,contexts:i}),Ht.set(rt,kt),e&&e.url&&(c=await q(e.url,!0));const l=ot+"current",d=!c||c.profile==p;Ke.create({id:l,type:"radio",contexts:i,title:p,checked:d,parentId:rt}),Vt.set(l,d);const u=ot+"default",f=Boolean(c)&&c.profile==y;Ke.create({id:u,type:"radio",contexts:i,title:Ot,checked:f,parentId:rt}),Vt.set(u,f),Zt=new Map,Object.keys(t).forEach(((e,t)=>{if(e!=y){let n=at+t;Ke.create({id:n,contexts:i,title:e,parentId:Xe}),n=nt+t;let r=a.profileName==e;Ke.create({id:n,type:"radio",contexts:i,title:e,checked:r,parentId:tt}),Vt.set(n,r),n=ot+t,r=Boolean(c)&&c.profile==e,Ke.create({id:n,type:"radio",contexts:i,title:e,checked:r,parentId:rt}),Vt.set(n,r),Zt.set(e,t)}})),n.contextMenuEnabled&&Ke.create({id:"separator-3",contexts:r,type:"separator"})}E&&(Ke.create({id:bt,contexts:i,title:Bt}),Ke.create({id:gt,type:"radio",title:Nt,contexts:i,checked:!0,parentId:bt}),Vt.set(gt,!0),Ke.create({id:pt,type:"radio",title:jt,contexts:i,checked:!1,parentId:bt}),Vt.set(pt,!1),Ke.create({id:yt,type:"radio",title:qt,contexts:i,checked:!1,parentId:bt}),Vt.set(yt,!1),Ke.create({id:vt,type:"radio",title:Ft,contexts:i,checked:!1,parentId:bt}),Vt.set(vt,!1),Ke.create({id:"separator-4",contexts:i,type:"separator"})),Ke.create({id:ft,contexts:i,title:Ct}),Ke.create({id:et,contexts:i,title:At})}Jt=!0,Gt&&(Gt=!1,(await browser.tabs.query({})).forEach((async e=>await ea(e))))}async function Qt(e){const t=await b(e.id);await async function(){const e=await browser.tabs.query({});return Promise.all(e.map((async e=>{const[t,a]=await Promise.all([G(e.url,!0),re(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 ea(e){if(Ye&&Jt){const t=[],a=await b(e.id);if(a[e.id].editorDetected)ta(!1);else if(ta(!0),E&&(t.push(na(gt,!a[e.id].autoSave)),t.push(na(pt,a[e.id].autoSave)),t.push(na(yt,Boolean(a.autoSaveUnpinned))),t.push(na(vt,Boolean(a.autoSaveAll)))),e&&e.url){const n=await G(e.url);t.push(async function(e,t){const a=Yt;Yt=t,(void 0===a||a!=t)&&await Xt(e)}(e,n.contextMenuEnabled)),t.push(aa(Ze,a[e.id].savedPageDetected?Et:Pt)),P&&t.push(Ke.update(st,{visible:!n.saveRawPage})),t.push(Ke.update(Ze,{visible:!n.openEditor||a[e.id].savedPageDetected}));let r=ot+"default",o=kt;const[s,i]=await Promise.all([J(),q(e.url)]);if(i){const e=Zt.get(i.profile);e&&(r=ot+e,o=It)}Object.keys(s).length>1&&(Object.keys(s).forEach(((e,a)=>{e==y?t.push(na(ot+"default",r==ot+"default")):t.push(na(ot+a,r==ot+a))})),t.push(aa(rt,o)))}await Promise.all(t)}}async function ta(e){const t=$t;if($t=e,void 0===t||t!=e){const t=[];try{zt.forEach((a=>t.push(Ke.update(a,{visible:e})))),await Promise.all(t)}catch(e){}}}function aa(e,t){const a=Ht.get(e);return Ht.set(e,t),void 0===a||a!=t?Ke.update(e,{title:t}):void 0}async function na(e,t){t=Boolean(t),Vt.set(e,t),await Ke.update(e,{checked:t})}Promise.resolve().then((async function(){Ye&&(Xt(),Ke.onClicked.addListener((async(e,t)=>{if(e.menuItemId==$e&&(e.linkUrl?Kt.saveUrls([e.linkUrl]):Kt.saveTabs([t])),e.menuItemId==Ze){(await b(t.id))[t.id].savedPageDetected?Kt.openEditor(t):e.linkUrl?Kt.saveUrls([e.linkUrl],{openEditor:!0}):Kt.saveTabs([t],{openEditor:!0})}if(e.menuItemId==Qe&&Kt.saveSelectedLinks(t),e.menuItemId==et&&await browser.tabs.create({active:!0,url:"/src/ui/pages/pendings.html"}),e.menuItemId==st&&Kt.saveTabs([t],{selected:!0}),e.menuItemId==it&&Kt.saveTabs([t],{frameId:e.frameId}),e.menuItemId==lt||e.menuItemId==wt){const e=await ve({currentWindow:!0,highlighted:!0});Kt.saveTabs(e)}if(e.menuItemId==dt||e.menuItemId==ht){const e=await ve({currentWindow:!0,pinned:!1});Kt.saveTabs(e)}if(e.menuItemId==ut||e.menuItemId==mt){const e=await ve({currentWindow:!0});Kt.saveTabs(e)}if(e.menuItemId==ft&&Kt.batchSaveUrls(),e.menuItemId==pt){const e=await b(t.id);e[t.id].autoSave=!0,await g(e),Qt(t)}if(e.menuItemId==gt){const e=await b();Object.keys(e).forEach((t=>{"object"==typeof e[t]&&e[t].autoSave&&(e[t].autoSave=!1)})),e.autoSaveUnpinned=e.autoSaveAll=!1,await g(e),Qt(t)}if(e.menuItemId==vt){const a=await b();a.autoSaveAll=e.checked,await g(a),Qt(t)}if(e.menuItemId==yt){const a=await b();a.autoSaveUnpinned=e.checked,await g(a),Qt(t)}if(e.menuItemId.startsWith(at)){const a=await J(),n=e.menuItemId.split(at)[1];let r;if("default"==n)r=y;else{const e=Number(n);r=Object.keys(a)[e]}a[r].profileName=r,Kt.saveTabs([t],a[r])}if(e.menuItemId.startsWith(nt)){const[a,n]=await Promise.all([J(),b()]),r=e.menuItemId.split(nt)[1];if("default"==r)n.profileName=y;else{const e=Number(r);n.profileName=Object.keys(a)[e]}await g(n),Qt(t)}if(e.menuItemId.startsWith(ot)){const[a,n]=await Promise.all([J(),q(t.url,!0)]),r=e.menuItemId.split(ot)[1];let o;if("default"==r)o=y;else if("current"==r)o=p;else{const e=Number(r);o=Object.keys(a)[e]}n?await ee(n.url,n.url,o,o):(await aa(rt,It),await Q(new URL(t.url).hostname,o,o))}})),Jt?Gt=!0:(await browser.tabs.query({})).forEach((async e=>await ea(e))))}));const ra=browser.commands;let oa,sa,ia;function ca(e,t){return e.method.endsWith(".refreshMenu")?function(e){if(e.method.endsWith("refreshMenu"))return Xt(),Promise.resolve({})}(e):Ne(e,t)}function la(e){!function(e){He(e.id,Ge("forbidden"))}(e)}function da(e,t,a){!function(e,t,a){let n;a?n=Ge("inject",!0):(n=Ge(t==Ue?"inject":"execute"),n.setTitle={title:Ee+" ("+t+"/2)"},n.setIcon={path:Ie+"0.png"}),He(e,n)}(e,t,a)}async function ua(e,t,a){je(e);try{t&&await browser.tabs.sendMessage(e,{method:"content.error",error:t.toString(),link:a})}catch(e){}}function fa(e){!function(e){He(e,Ge("edit"))}(e)}function wa(e,t){qe(e,t)}function ha(e,t,a){!function(e,t,a){ze(e,t,a,Le)}(e,t,a)}function ma(e){e&&ea(e)}ra&&ra.onCommand&&ra.onCommand.addListener&&ra.onCommand.addListener((async e=>{if("save-selected-tabs"==e){const e=await ve({currentWindow:!0,highlighted:!0});oa.saveTabs(e,{optionallySelected:!0})}if("save-all-tabs"==e){const e=await ve({currentWindow:!0});oa.saveTabs(e)}}));const ba=["lib/chrome-browser-polyfill.js","lib/single-file.js"],ga=["lib/chrome-browser-polyfill.js","lib/single-file-frames.js"],pa="../../../";async function ya(e,t){let a;if(await async function(e){const t=e.extensionScriptFiles||[];sa||ia||([sa,ia]=await Promise.all([va(ba.concat(t)),va(ga)]))}(t),!t.removeFrames)try{await browser.tabs.executeScript(e,{code:ia,allFrames:!0,matchAboutBlank:!0,runAt:"document_start"})}catch(e){}try{await browser.tabs.executeScript(e,{code:sa,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 va(e){const t=e.map((async e=>{if("function"==typeof e)return"("+e.toString()+")();";{const t=await fetch(browser.runtime.getURL(pa+e));return(new TextDecoder).decode(await t.arrayBuffer())}}));let a="";for(const e of t)a+=await e;return a}const ka="single-file-request-fetch",Ia="single-file-ack-fetch",Sa="single-file-response-fetch",Ta="Host fetch error (SingleFile)",xa=2500,Ea=Boolean(window.wrappedJSObject),Pa=(e,t,a)=>window.addEventListener(e,t,a),Aa=e=>window.dispatchEvent(e),Wa=(e,t,a)=>window.removeEventListener(e,t,a),Ra=(e,t)=>window.fetch(e,t);let La=0,Da=new Map;async function Ma(e,t={}){try{const a={cache:"force-cache",headers:t.headers};return await(t.referrer&&Ea?async function(e,t){const a=new Promise(((a,n)=>{Aa(new CustomEvent(ka,{detail:JSON.stringify({url:e,options:t})})),Pa(Ia,s,!1),Pa(Sa,o,!1);const r=setTimeout((()=>{i(),n(new Error(Ta))}),xa);function o(t){t.detail?t.detail.url==e&&(i(),t.detail.response?a({status:t.detail.status,headers:new Map(t.detail.headers),arrayBuffer:async()=>t.detail.response}):n(t.detail.error)):n()}function s(){clearTimeout(r)}function i(){Wa(Sa,o,!1),Wa(Ia,s,!1)}}));try{return await a}catch(a){if(a&&a.message==Ta)return Ra(e,t);throw a}}(e,a):Ra(e,a))}catch(a){La++;const n=new Promise(((e,t)=>Da.set(La,{resolve:e,reject:t})));return await Ca({method:"singlefile.fetch",url:e,requestId:La,referrer:t.referrer,headers:t.headers}),n}}async function _a(e,t){const a=await Ca({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 Ca(e){const t=await browser.runtime.sendMessage(e);if(!t||t.error)throw new Error(t&&t.error&&t.error.toString());return t}function Ua(e,t){return ya(e,t)}browser.runtime.onMessage.addListener((e=>"singlefile.fetchFrame"==e.method&&window.frameId&&window.frameId==e.frameId?async function(e){try{const t=await Ra(e.url,{cache:"force-cache",headers:e.headers});return{status:t.status,headers:[...t.headers],array:Array.from(new Uint8Array(await t.arrayBuffer()))}}catch(e){return{error:e&&e.toString()}}}(e):"singlefile.fetchResponse"==e.method?async function(e){const t=Da.get(e.requestId);t&&(e.error?(t.reject(new Error(e.error)),Da.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,Da.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}),Da.delete(e.requestId))));return{}}(e):void 0));const Oa="Could not establish connection. Receiving end does not exist.",Ba="The message port closed before a response was received.",Na="Message manager disconnected",ja="Cannot access contents of url ",qa=1,Fa=2,za="pending",Va="processing",Ha=["lib/single-file-extension.js"],Ja=[];let Ga,Ka=0;var Ya;async function $a(e){const t={extensionScriptFiles:Ha,tabId:e.id,tabIndex:e.index};if(await Ua(e.id,t)){const t=await browser.tabs.sendMessage(e.id,{method:"content.getSelectedLinks"});if(t.urls&&t.urls.length){const e=await Za(),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 la(e)}async function Za(){return browser.tabs.create({active:!0,url:"/src/ui/pages/batch-save-urls.html"})}async function Xa(e,t={}){await tn(),await Promise.all(e.map((async e=>{const a=await G(e);Object.keys(t).forEach((e=>a[e]=t[e])),a.autoClose=!0,a.extensionScriptFiles=Ha,a.passReferrerOnError&&await ye(),en({tab:{url:e},status:za,options:a,method:"content.save"})}))),an()}async function Qa(e,t={}){await tn(),await Promise.all(e.map((async e=>{const a=e.id,n=await G(e.url);Object.keys(t).forEach((e=>n[e]=t[e])),n.tabId=a,n.tabIndex=e.index,n.extensionScriptFiles=Ha,n.passReferrerOnError&&await ye();const r={id:e.id,index:e.index,url:e.url,title:e.title};if(t.autoSave){if(re(e)){nn(en({status:Va,tab:r,options:n,method:"content.autosave"}))}}else{da(a,qa);await Ua(a,n)||de(e)?(da(a,Fa),en({status:za,tab:r,options:n,method:"content.save"})):la(e)}}))),an()}function en(e){const t={id:Ka,status:e.status,tab:e.tab,options:e.options,method:e.method,done:function(){Ja.splice(Ja.findIndex((e=>e.id==this.id)),1),an()}};return Ja.push(t),Ka++,t}async function tn(){Ga||(Ga=(await F()).maxParallelWorkers)}function an(){const e=Ja.filter((e=>e.status==Va)).length;for(let t=0;t<Math.min(Ja.length-e,Ga-e);t++){const e=Ja.find((e=>e.status==za));e&&nn(e)}}async function nn(e){const t=e.id;if(e.status=Va,!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,da(e.tab.id,qa),t=await Ua(e.tab.id,e.options)}catch(t){e.tab.id=t}if(!t)return void e.done();da(e.tab.id,Fa)}e.options.taskId=t;try{await browser.tabs.sendMessage(e.tab.id,{method:e.method,options:e.options})}catch(t){!t||t.message&&function(e){return e.message==Ba||e.message==Oa||e.message==Na||e.message.startsWith(ja+JSON.stringify(le))}(t)||(console.log(t.message?t.message:t),ua(e.tab.id,t.message,t.link),e.done())}}function rn(e){const t=Ja.find((t=>t.id==e));t&&(t.options.autoClose&&!t.cancelled&&browser.tabs.remove(t.tab.id),t.done())}function on(e,t){const a=Ja.find((t=>t.id==e));a&&(a.cancel=t)}function sn(e){Array.from(Ja).filter((t=>t.tab.id==e&&!t.options.autoSave)).forEach(ln)}function cn(e){return Ja.find((t=>t.id==e))}function ln(e){const t=e.tab.id;e.cancelled=!0,browser.tabs.sendMessage(t,{method:"content.cancelSave",options:{loadDeferredImages:e.options.loadDeferredImages,loadDeferredImagesKeepZoomLevel:e.options.loadDeferredImagesKeepZoomLevel}}),e.cancel&&e.cancel(),"content.autosave"==e.method&&wa(t,!0),function(e){Fe(e)}(e.tab),e.done()}function dn(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){Kt=e})(Ya={isSavingTab:function(e){return Boolean(Ja.find((t=>t.tab.id==e.id)))},saveTabs:Qa,saveUrls:Xa,cancelTab:sn,openEditor:function(e){browser.tabs.sendMessage(e.id,{method:"content.openEditor"})},saveSelectedLinks:$a,batchSaveUrls:Za}),function(e){Be=e}(Ya),function(e){oa=e}(Ya);async function un(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 fn=new Set;async function wn(e){return e.method.endsWith(".saveCreatedBookmarks")?(hn(),{}):e.method.endsWith(".disable")?(async function(){let e;const t=await J();Object.keys(t).forEach((a=>e=e||!t[a].saveCreatedBookmarks)),e&&(browser.bookmarks.onCreated.removeListener(mn),browser.bookmarks.onMoved.removeListener(bn))}(),{}):void 0}async function hn(){try{browser.bookmarks.onCreated.removeListener(mn),browser.bookmarks.onMoved.removeListener(bn)}catch(e){}let e;const t=await J();Object.keys(t).forEach((a=>{t[a].saveCreatedBookmarks&&(e=!0)})),e&&(browser.bookmarks.onCreated.addListener(mn),browser.bookmarks.onMoved.addListener(bn))}async function mn(e,t){fn.add(e),await gn(e,t.url,t)}async function bn(e,t){if(fn.has(e)){const a=await browser.bookmarks.get(e);a[0]&&await gn(e,a[0].url,t)}}async function gn(e,t,a){const n=await browser.tabs.query({lastFocusedWindow:!0,active:!0}),r=await G(t);if(r.saveCreatedBookmarks){const s=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),i=r.allowedBookmarkFolders.toString(),c=s.find((e=>r.allowedBookmarkFolders.includes(e))),l=r.ignoredBookmarkFolders.toString(),d=s.find((e=>r.ignoredBookmarkFolders.includes(e)));if((i&&c||!i)&&(l&&!d||!l))if(n.length&&n[0].url==t)fn.delete(e),Qa(n,{bookmarkId:e,bookmarkFolders:s});else{const a=await browser.tabs.query({});if(a.length){const n=a.find((e=>e.url==t));n?(fn.delete(e),Qa([n],{bookmarkId:e,bookmarkFolders:s})):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){fn.delete(e),Xa([t],{bookmarkId:e})}}Promise.resolve().then(hn);const pn="https://api.woleet.io/v1/anchor",yn="eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhYzZmZTMzMi0wODNjLTRjZmMtYmYxNC0xNWU5MTJmMWY4OWIiLCJpYXQiOjE1NzYxNzQzNDV9.n31j9ctJj7R1Vjwyc5yd1d6Cmg0NDnpwSaLWsqtZJQA";async function vn(e,t){let a=t||yn;const n=await fetch(pn,{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 kn="https://oauth2.googleapis.com/token",In="https://www.googleapis.com/drive/v3/files";class Sn{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}async upload(){const e=Rn(await fetch("https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",{method:"POST",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=e,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),An(this)}}async function Tn(e,t){const a=await fetch(kn,{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 Wn(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 En(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 s of n){r&&(r+="/"),r+=s;const n=e.folderIds.get(r);if(n)o=n;else try{o=await Pn(e,s,o),e.folderIds.set(r,o)}catch(n){if("path_not_found"==n.message&&a)return e.folderIds.clear(),En(e,t,!1);throw n}}}return o}async function Pn(e,t,a){const n=await async function(e,t,a){const n=await fetch(In+"?q=mimeType = 'application/vnd.google-apps.folder' and name = '"+t+"' and trashed != true and '"+a+"' in parents",{headers:{Authorization:"Bearer "+e.accessToken}});return Wn(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(In,{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 Wn(n)}(e,t,a);return n.id}}async function An(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 An(e)}Rn(n)}async function Wn(e){e=Rn(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function Rn(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+")")}let Ln;async function Dn(e,t,a,n,r,o){for(;Ln;)await Ln;const s=new AbortController;return Ln=(async()=>{try{await async function({path:r,content:o,message:s=""},i){try{const c=await fetch(`https://api.github.com/repos/${t}/${a}/contents/${r}`,{method:"PUT",headers:new Map([["Authorization",`token ${e}`],["Accept","application/vnd.github.v3+json"]]),body:JSON.stringify({content:btoa(unescape(encodeURIComponent(o))),message:s,branch:n}),signal:i}),l=await c.json();if(c.status<400)return l;throw new Error(l.message)}catch(e){if("AbortError"!=e.name)throw e}}({path:r,content:o},s.signal)}finally{Ln=null}})(),{cancelPush:()=>s.abort(),pushPromise:Ln}}const Mn=new Map,_n="text/html",Cn="skip",Un="uniquify",On=/([{}()^$&.*?/+|[\\\\]|\]|-)/g,Bn=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?Tn(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 Tn(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 Tn(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(kn,{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 Wn(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 Wn(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 En(this,e),s=e.split("/").pop(),i=new Sn({token:this.accessToken,file:t,parents:[o],filename:s,onProgress:a.onProgress});try{n&&n((()=>i.cancelled=!0)),await i.upload()}catch(o){if("path_not_found"==o.message&&r)return this.folderIds.clear(),this.upload(e,t,a,n);throw o}}}("207618107333-h1220p1oasj3050kr5r416661adm091a.apps.googleusercontent.com","VQJ8Gq8Vxx72QyxPyeLtWvUt",["https://www.googleapis.com/auth/drive.file"]);async function Nn(e,t){if(e.method.endsWith(".download"))return async function(e,t){let a;e.truncated?(a=Mn.get(t.id),a||(a=[],Mn.set(t.id,a)),a.push(e.content),e.finished&&Mn.delete(t.id)):e.content&&(a=[e.content]);e.truncated&&!e.finished||(e.openEditor?(fa(t.id),await async function({tabIndex:e,content:t,filename:a}){const n={active:!0,url:se};null!=e&&(n.index=e);const r=await browser.tabs.create(n);ie.set(r.id,{content:t,filename:a})}({tabIndex:t.index+1,filename:e.filename,content:a.join("")})):e.saveToClipboard?(e.content=a.join(""),function(e){const t="copy";function a(t){t.clipboardData.setData(_n,e.content),t.clipboardData.setData("text/plain",e.content),t.preventDefault()}document.addEventListener(t,a),document.execCommand(t),document.removeEventListener(t,a)}(e),wa(t.id)):await async function(e,t,a,n){try{if(n.saveWithWebDAV?await zn(n.taskId,jn(n.filename),e.join(""),n.webDAVURL,n.webDAVUser,n.webDAVPassword):n.saveToGDrive?await Vn(n.taskId,jn(n.filename),new Blob(e,{type:_n}),{forceWebAuthFlow:n.forceWebAuthFlow},{onProgress:(e,a)=>ha(t.id,e,a)}):n.saveToGitHub?await(await Fn(n.taskId,jn(n.filename),e.join(""),n.githubToken,n.githubUser,n.githubRepository,n.githubBranch)).pushPromise:n.saveWithCompanion?await un({filename:n.filename,content:n.content,filenameConflictAction:n.filenameConflictAction}):(n.url=URL.createObjectURL(new Blob(e,{type:_n})),await Hn(n,{confirmFilename:n.confirmFilename,incognito:a,filenameConflictAction:n.filenameConflictAction,filenameReplacementCharacter:n.filenameReplacementCharacter,includeInfobar:n.includeInfobar})),wa(t.id),n.openSavedPage){const a={active:!0,url:URL.createObjectURL(new Blob(e,{type:_n}))};null!=t.index&&(a.index=t.index+1),browser.tabs.create(a)}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),ua(t.id,e.message,e.link))}finally{n.url&&URL.revokeObjectURL(n.url)}}(a,t,t.incognito,e));return{}}(e,t.tab);if(e.method.endsWith(".disableGDrive")){const e=await te();return ne(),await Bn.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".end")){if(e.hash)try{await vn(e.hash,e.woleetKey)}catch(e){ua(t.tab.id,e.message,e.link)}return rn(e.taskId),{}}return e.method.endsWith(".getInfo")?Ja.map(dn):e.method.endsWith(".cancel")?(a=e.taskId,ln(Ja.find((e=>e.id==a))),{}):e.method.endsWith(".cancelAll")?(Array.from(Ja).forEach(ln),{}):e.method.endsWith(".saveUrls")?(Xa(e.urls),{}):void 0;var a}function jn(e){return e.replace(/#/g,"%23")}async function qn(e,t){let a=await te();const n={interactive:!0,forceWebAuthFlow:e.forceWebAuthFlow,launchWebAuthFlow:e=>async function(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")))}))}))}(e),extractAuthCode:e=>function(e){return new Promise(((t,a)=>{browser.tabs.onUpdated.addListener((function n(r,o){if(o&&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()}}))}))}(e)};return Bn.setAuthInfo(a,n),a&&a.accessToken&&!t||(a=await Bn.auth(n),a?await ae(a):await ne()),a}async function Fn(e,t,a,n,r,o,s){const i=cn(e);if(!i||!i.cancelled){const i=Dn(n,r,o,s,t,a);on(e,i.cancelPush);try{return await(await i).pushPromise,i}catch(e){throw new Error(e.message+" (GitHub)")}}}async function zn(e,t,a,n,r,o,s=!0){const i=cn(e),c=new AbortController,{signal:l}=c,d="Basic "+btoa(r+":"+o);if(n.endsWith("/")||(n+="/"),!i||!i.cancelled){on(e,(()=>c.abort()));try{const i=await u(n+t,"PUT",a);if(404==i.status&&t.includes("/")){const i=t.split(/\/+/);i.pop();let c="";for(const e of i)if(e){c+=e;if(404==(await u(n+c,"PROPFIND")).status){const e=await u(n+c,"MKCOL");if(e.status>=400)throw new Error("Error "+e.status+" (WebDAV)")}c+="/"}if(s)return zn(e,t,a,n,r,o,!1);throw new Error("Error 404 (WebDAV)")}if(i.status>=400)throw new Error("Error "+i.status+" (WebDAV)");return i}catch(e){if("AbortError"!=e.name)throw new Error(e.message+" (WebDAV)")}}function u(e,t,a){const n={Authorization:d};return a&&(n["Content-Type"]="text/html"),fetch(e,{method:t,headers:n,signal:l,body:a,credentials:"omit"})}}async function Vn(e,t,a,n,r){try{await qn(n);const o=cn(e);if(!o||!o.cancelled)return Bn.upload(t,a,r,(t=>on(e,t)))}catch(o){if("invalid_token"==o.message){let o;try{o=await Bn.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Google Drive)");o=await qn(n,!0)}return o?await ae(o):await ne(),await Vn(e,t,a,n,r)}throw new Error(o.message+" (Google Drive)")}}async function Hn(e,t){let a;if(t.filenameConflictAction==Cn){(await browser.downloads.search({filenameRegex:"(\\\\|/)"+(n=e.filename,n.replace(On,"\\$1")+"$"),exists:!0})).length?a=!0:t.filenameConflictAction=Un}var n;if(!a){const a={url:e.url,saveAs:t.confirmFilename,filename:e.filename,conflictAction:t.filenameConflictAction};t.incognito&&(a.incognito=!0);const n=await l(a,t.filenameReplacementCharacter);n.filename&&e.bookmarkId&&e.replaceBookmarkURL&&(n.filename.startsWith("file:")||(n.filename.startsWith("/")&&(n.filename=n.filename.substring(1)),n.filename="file:///"+jn(n.filename)),await async function(e,t){try{await browser.bookmarks.update(e,t)}catch(e){}}(e.bookmarkId,{url:n.filename}))}}const Jn={},Gn={};async function Kn(e,t){if("enableAutoSave"==e.method){const a=await b(t.id);a[t.id].autoSave=e.enabled,await g(a),async function(e){Promise.all([Xt(e),Ve(e)])}(t)}if("isAutoSaveEnabled"==e.method)return re(t)}async function Yn(e,t){const a=t.id,n=await G(t.url,!0);if(n){let r;da(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.updatedResources=e.updatedResources,n.visitDate=new Date(e.visitDate),n.backgroundTab=!0,n.autoSave=!0,n.incognito=t.incognito,n.tabId=a,n.tabIndex=t.index,n.keepFilename=n.saveToGDrive||n.saveToGitHub||n.saveWithWebDAV;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{if(n.passReferrerOnError&&ye(),r=await function(e,t,a,n={fetch:Ma,frameFetch:_a}){return globalThis.singlefile.getPageData(e,n,t,a)}(n,null,null,{fetch:$n}),n.saveToGDrive){const t=new Blob([r.content],{type:"text/html"});await Vn(e.taskId,jn(r.filename),t,n,{forceWebAuthFlow:n.forceWebAuthFlow})}else if(n.saveWithWebDAV)await zn(e.taskId,jn(r.filename),r.content,n.webDAVURL,n.webDAVUser,n.webDAVPassword);else if(n.saveToGitHub)await(await Fn(e.taskId,jn(r.filename),r.content,n.githubToken,n.githubUser,n.githubRepository,n.githubBranch)).pushPromise;else if(n.saveWithCompanion)await un({filename:r.filename,content:r.content,filenameConflictAction:r.filenameConflictAction});else{const e=new Blob([r.content],{type:"text/html"});if(r.url=URL.createObjectURL(e),await Hn(r,n),n.openSavedPage){const n={active:!0,url:URL.createObjectURL(e),windowId:t.windowId},r=t.index;try{await browser.tabs.get(a),n.index=r+1}catch(e){n.index=r}browser.tabs.create(n)}}r.hash&&await vn(r.hash,n.woleetKey)}}finally{e.taskId?rn(e.taskId):n.autoClose&&(browser.tabs.remove(Gn[a]||a),delete Gn[a]),r&&r.url&&URL.revokeObjectURL(r.url),wa(a,!0)}}}async function $n(e,t={}){const a=await me(e,t);return{status:a.status,headers:{get:e=>a.headers.get(e)},arrayBuffer:()=>a.arrayBuffer}}async function Zn(e,t){if(e.method.endsWith(".init")&&(await async function(e,t){await h(e.id);const a=await b(e.id);a[e.id].savedPageDetected=t.savedPageDetected,await g(a)}(t.tab,e),ea(t.tab),function(e){sn(e.id)}(t.tab),async function(e){const[t,a]=await Promise.all([G(e.url,!0),re(e)]);t&&(t.autoSaveLoad||t.autoSaveLoadOrUnload)&&a&&Qa([e],{autoSave:!0})}(t.tab)),e.method.endsWith(".getOptions"))return G(e.url);e.method.endsWith(".activate")&&await browser.tabs.update(e.tabId,{active:!0})}browser.tabs.onCreated.addListener((e=>function(e){!function(e){ea(e)}(e)}(e))),browser.tabs.onActivated.addListener((e=>async function(e){const t=await browser.tabs.get(e.tabId);ma(t)}(e))),browser.tabs.onRemoved.addListener((e=>function(e){h(e),function(e){ie.delete(e)}(e),sn(e),async function(e){const t=Jn[e];t?t.autoSaveRemove&&(delete Jn[e],await Yn(t,t.tab)):Jn[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 Jn[e]}(e);const t=await browser.tabs.get(e);if(de(t)){const e=await b(t.id);e[t.id].editorDetected=!0,await g(e),ma(t)}}t.discarded&&async function(e){const t=Jn[e];t?(delete Jn[e],await Yn(t,t.tab)):Jn[e]={discarded:!0}}(e)}(e,t))),browser.tabs.onReplaced.addListener(((e,t)=>function(e,t){(async function(e,t){let a=await b();await w(a,e,t),g(a),await w(u,e,t)})(e,t),async function(e,t){Jn[t]&&!Jn[e]&&(Jn[e]=Jn[t],delete Jn[t],Gn[t]=e)}(e,t),function(e,t){Ja.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 Xn=new Map;function Qn(e,t){e.delete(t)}browser.runtime.onMessage.addListener(((e,t)=>{if("singlefile.lazyTimeout.setTimeout"==e.method){let a,n=Xn.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=Xn.get(t.tab.id),n=a.get(t.frameId);a&&n&&Qn(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),Xn.set(t.tab.id,n)),a.set(e.type,r),Promise.resolve({})}if("singlefile.lazyTimeout.clearTimeout"==e.method){let a=Xn.get(t.tab.id);if(a){const n=a.get(t.frameId);if(n){const t=n.get(e.type);t&&clearTimeout(t),Qn(n,e.type)}}return Promise.resolve({})}})),browser.tabs.onRemoved.addListener((e=>Xn.delete(e)));async function er(e){return(await browser.tabs.query(e)).sort(((e,t)=>e.index-t.index))}browser.runtime.onMessage.addListener(((e,t)=>e.method.startsWith("tabs.")?Zn(e,t):e.method.startsWith("downloads.")?Nn(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,Jn[t.tab.id]=e):Jn[e.tabId]&&(Jn[e.tabId].removed&&e.autoSaveRemove||Jn[e.tabId].discarded&&e.autoSaveDiscard)&&(delete Jn[e.tabId],await Yn(e,{id:e.tabId,index:e.tabIndex,url:t.url})),e.autoSaveUnload&&(delete Jn[e.tabId],await Yn(e,t.tab))):(delete Jn[e.tabId],await Yn(e,t.tab)),{}}(e,t):e.method.startsWith("ui.")?ca(e,t):e.method.startsWith("config.")?H(e):e.method.startsWith("tabsData.")?function(e){return e.method.endsWith(".get")?b():e.method.endsWith(".set")?g(e.tabsData):void 0}(e):e.method.startsWith("devtools.")?async function(e){e.method.endsWith(".resourceCommitted")&&e.tabId&&e.url&&("stylesheet"==e.type||"script"==e.type)&&await browser.tabs.sendMessage(e.tabId,e)}(e):e.method.startsWith("editor.")?async function(e,t){if(e.method.endsWith(".getTabData")){const e=t.tab,a=ie.get(e.id);if(a){const t=await G(a.url),n=JSON.stringify(a);for(let a=0;a*oe<n.length;a++){const r={method:"editor.setTabData"};r.truncated=n.length>oe,r.truncated?(r.finished=(a+1)*oe>n.length,r.content=n.substring(a*oe,(a+1)*oe),r.finished&&(r.options=t)):(r.content=n,r.options=t),await browser.tabs.sendMessage(e.id,r)}}return{}}if(e.method.endsWith(".open")){let a;const n=t.tab;if(e.truncated?(a=ce.get(n.id),a||(a=[],ce.set(n.id,a)),a.push(e.content),e.finished&&ce.delete(n.id)):e.content&&(a=[e.content]),!e.truncated||e.finished){const t={url:se};await browser.tabs.update(n.id,t),ie.set(n.id,{url:n.url,content:a.join(""),filename:e.filename})}return{}}if(e.method.endsWith(".ping"))return{}}(e,t):e.method.startsWith("bookmarks.")?wn(e):e.method.startsWith("companion.")?async function(e){if(e.method.endsWith(".state"))return{enabled:!0}}(e):e.method.startsWith("requests.")?ge(e):e.method.startsWith("bootstrap.")?async function(e,t){if(e.method.endsWith(".init")){const[e,a,n]=await Promise.all([G(t.tab.url,!0),G(t.tab.url),re(t.tab)]);return{optionsAutoSave:e,options:a,autoSaveEnabled:n,tabId:t.tab.id,tabIndex:t.tab.index}}}(e,t):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,Qa(e)}else if("edit-and-save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,Qa(e,{openEditor:!0})}else if("save-selected-links"==e)$a((await browser.tabs.query({currentWindow:!0,active:!0}))[0]);else if("save-selected-content"==e)Qa(await browser.tabs.query({currentWindow:!0,active:!0}),{selected:!0});else if("save-selected-tabs"==e)Qa(await er({currentWindow:!0,highlighted:!0}));else if("save-unpinned-tabs"==e)Qa(await er({currentWindow:!0,pinned:!1}));else if("save-all-tabs"==e)Qa(await er({currentWindow:!0}));else if(e.method){const t=(await browser.tabs.query({currentWindow:!0,active:!0}))[0];return!!t&&Kn(e,t)}}))}();
|