From 441df76ebfadc8ae130b7c368807c581d8789e6c Mon Sep 17 00:00:00 2001 From: Gildas Date: Wed, 1 Jun 2022 19:36:07 +0200 Subject: [PATCH] remove useless "extension" folder --- build-extension.sh | 28 +++---- lib/single-file-extension-background.js | 2 +- manifest.json | 38 ++++----- rollup.config.dev.js | 22 ++--- rollup.config.js | 22 ++--- src/{extension => }/core/bg/autosave-util.js | 0 src/{extension => }/core/bg/autosave.js | 0 src/{extension => }/core/bg/background.html | 0 src/{extension => }/core/bg/bookmarks.js | 0 src/{extension => }/core/bg/bootstrap.js | 0 src/{extension => }/core/bg/business.js | 2 +- src/{extension => }/core/bg/config.js | 0 src/{extension => }/core/bg/devtools.js | 0 src/{extension => }/core/bg/download-util.js | 0 src/{extension => }/core/bg/downloads.js | 0 src/{extension => }/core/bg/editor.js | 2 +- src/{extension => }/core/bg/index.js | 0 src/{extension => }/core/bg/requests.js | 0 src/{extension => }/core/bg/tabs-data.js | 0 src/{extension => }/core/bg/tabs-util.js | 0 src/{extension => }/core/bg/tabs.js | 0 src/{extension => }/core/common/download.js | 0 .../core/content/content-bootstrap.js | 0 .../core/content/content-frames.js | 0 .../core/content/content-infobar.js | 0 src/{extension => }/core/content/content.js | 0 .../core/devtools/devtools.html | 0 src/{extension => }/core/devtools/devtools.js | 0 src/extension/ui/pages/editor.html | 79 ------------------ src/{extension => }/index.js | 0 src/{extension => }/lib/gdrive/gdrive.js | 0 src/{extension => }/lib/github/github.js | 0 .../lib/readability/Readability-readerable.js | 0 .../lib/readability/Readability.js | 0 .../lib/single-file/background.js | 0 .../chrome-browser-polyfill.js | 0 .../lib/single-file/core/bg/scripts.js | 0 .../lib/single-file/fetch/bg/fetch.js | 0 .../fetch/content/content-fetch.js | 0 .../single-file/frame-tree/bg/frame-tree.js | 0 .../lib/single-file/lazy/bg/lazy-timeout.js | 0 src/{extension => }/lib/yabson/yabson.js | 0 src/{extension => }/ui/bg/index.js | 0 .../ui/bg/ui-batch-save-urls.js | 0 src/{extension => }/ui/bg/ui-button.js | 4 +- src/{extension => }/ui/bg/ui-commands.js | 0 src/{extension => }/ui/bg/ui-editor.js | 12 +-- src/{extension => }/ui/bg/ui-menus.js | 2 +- src/{extension => }/ui/bg/ui-options.js | 2 +- src/{extension => }/ui/bg/ui-panel.js | 0 src/{extension => }/ui/bg/ui-pendings.js | 0 .../ui/common/content-error.js | 0 .../content/content-ui-editor-helper-web.js | 0 .../ui/content/content-ui-editor-init-web.js | 0 .../ui/content/content-ui-editor-web.js | 0 src/{extension => }/ui/content/content-ui.js | 0 .../ui/pages/batch-save-urls.css | 0 .../ui/pages/batch-save-urls.html | 2 +- .../ui/pages/editor-frame-web.css | 0 .../ui/pages/editor-mask-web.css | 0 .../ui/pages/editor-note-web.css | 0 src/{extension => }/ui/pages/editor.css | 0 src/ui/pages/editor.html | 79 ++++++++++++++++++ src/{extension => }/ui/pages/help.css | 0 src/{extension => }/ui/pages/help.html | 2 +- src/{extension => }/ui/pages/options.css | 0 src/{extension => }/ui/pages/options.html | 2 +- src/{extension => }/ui/pages/panel.css | 0 src/{extension => }/ui/pages/panel.html | 2 +- src/{extension => }/ui/pages/pendings.css | 0 src/{extension => }/ui/pages/pendings.html | 2 +- .../ui/resources/button_cut_inner.png | Bin .../ui/resources/button_cut_outer.png | Bin .../ui/resources/button_delete.png | Bin .../ui/resources/button_delete_all.png | Bin .../ui/resources/button_download.png | Bin .../ui/resources/button_edit.png | Bin .../ui/resources/button_highlighter_blue.png | Bin .../resources/button_highlighter_delete.png | Bin .../ui/resources/button_highlighter_green.png | Bin .../resources/button_highlighter_hidden.png | Bin .../ui/resources/button_highlighter_pink.png | Bin .../resources/button_highlighter_visible.png | Bin .../resources/button_highlighter_yellow.png | Bin .../ui/resources/button_new.png | Bin .../ui/resources/button_note_blue.png | Bin .../ui/resources/button_note_edit.png | Bin .../ui/resources/button_note_format.png | Bin .../ui/resources/button_note_green.png | Bin .../ui/resources/button_note_hidden.png | Bin .../ui/resources/button_note_pink.png | Bin .../ui/resources/button_note_visible.png | Bin .../ui/resources/button_note_yellow.png | Bin .../ui/resources/button_ok.png | Bin .../ui/resources/button_print.png | Bin .../ui/resources/button_redo_cut.png | Bin .../ui/resources/button_undo_all_cut.png | Bin .../ui/resources/button_undo_cut.png | Bin src/{extension => }/ui/resources/icon_128.png | Bin .../ui/resources/icon_128_wait0.png | Bin .../ui/resources/icon_128_wait1.png | Bin .../ui/resources/icon_128_wait2.png | Bin .../ui/resources/icon_128_wait3.png | Bin .../ui/resources/icon_128_wait4.png | Bin .../ui/resources/icon_128_wait5.png | Bin .../ui/resources/icon_128_wait6.png | Bin .../ui/resources/icon_128_wait7.png | Bin .../ui/resources/icon_128_wait8.png | Bin src/{extension => }/ui/resources/icon_16.png | Bin src/{extension => }/ui/resources/icon_48.png | Bin src/{extension => }/ui/resources/icon_64.png | Bin 111 files changed, 152 insertions(+), 152 deletions(-) rename src/{extension => }/core/bg/autosave-util.js (100%) rename src/{extension => }/core/bg/autosave.js (100%) rename src/{extension => }/core/bg/background.html (100%) rename src/{extension => }/core/bg/bookmarks.js (100%) rename src/{extension => }/core/bg/bootstrap.js (100%) rename src/{extension => }/core/bg/business.js (98%) rename src/{extension => }/core/bg/config.js (100%) rename src/{extension => }/core/bg/devtools.js (100%) rename src/{extension => }/core/bg/download-util.js (100%) rename src/{extension => }/core/bg/downloads.js (100%) rename src/{extension => }/core/bg/editor.js (97%) rename src/{extension => }/core/bg/index.js (100%) rename src/{extension => }/core/bg/requests.js (100%) rename src/{extension => }/core/bg/tabs-data.js (100%) rename src/{extension => }/core/bg/tabs-util.js (100%) rename src/{extension => }/core/bg/tabs.js (100%) rename src/{extension => }/core/common/download.js (100%) rename src/{extension => }/core/content/content-bootstrap.js (100%) rename src/{extension => }/core/content/content-frames.js (100%) rename src/{extension => }/core/content/content-infobar.js (100%) rename src/{extension => }/core/content/content.js (100%) rename src/{extension => }/core/devtools/devtools.html (100%) rename src/{extension => }/core/devtools/devtools.js (100%) delete mode 100644 src/extension/ui/pages/editor.html rename src/{extension => }/index.js (100%) rename src/{extension => }/lib/gdrive/gdrive.js (100%) rename src/{extension => }/lib/github/github.js (100%) rename src/{extension => }/lib/readability/Readability-readerable.js (100%) rename src/{extension => }/lib/readability/Readability.js (100%) rename src/{extension => }/lib/single-file/background.js (100%) rename src/{extension => }/lib/single-file/browser-polyfill/chrome-browser-polyfill.js (100%) rename src/{extension => }/lib/single-file/core/bg/scripts.js (100%) rename src/{extension => }/lib/single-file/fetch/bg/fetch.js (100%) rename src/{extension => }/lib/single-file/fetch/content/content-fetch.js (100%) rename src/{extension => }/lib/single-file/frame-tree/bg/frame-tree.js (100%) rename src/{extension => }/lib/single-file/lazy/bg/lazy-timeout.js (100%) rename src/{extension => }/lib/yabson/yabson.js (100%) rename src/{extension => }/ui/bg/index.js (100%) rename src/{extension => }/ui/bg/ui-batch-save-urls.js (100%) rename src/{extension => }/ui/bg/ui-button.js (98%) rename src/{extension => }/ui/bg/ui-commands.js (100%) rename src/{extension => }/ui/bg/ui-editor.js (97%) rename src/{extension => }/ui/bg/ui-menus.js (99%) rename src/{extension => }/ui/bg/ui-options.js (99%) rename src/{extension => }/ui/bg/ui-panel.js (100%) rename src/{extension => }/ui/bg/ui-pendings.js (100%) rename src/{extension => }/ui/common/content-error.js (100%) rename src/{extension => }/ui/content/content-ui-editor-helper-web.js (100%) rename src/{extension => }/ui/content/content-ui-editor-init-web.js (100%) rename src/{extension => }/ui/content/content-ui-editor-web.js (100%) rename src/{extension => }/ui/content/content-ui.js (100%) rename src/{extension => }/ui/pages/batch-save-urls.css (100%) rename src/{extension => }/ui/pages/batch-save-urls.html (95%) rename src/{extension => }/ui/pages/editor-frame-web.css (100%) rename src/{extension => }/ui/pages/editor-mask-web.css (100%) rename src/{extension => }/ui/pages/editor-note-web.css (100%) rename src/{extension => }/ui/pages/editor.css (100%) create mode 100644 src/ui/pages/editor.html rename src/{extension => }/ui/pages/help.css (100%) rename src/{extension => }/ui/pages/help.html (99%) rename src/{extension => }/ui/pages/options.css (100%) rename src/{extension => }/ui/pages/options.html (99%) rename src/{extension => }/ui/pages/panel.css (100%) rename src/{extension => }/ui/pages/panel.html (90%) rename src/{extension => }/ui/pages/pendings.css (100%) rename src/{extension => }/ui/pages/pendings.html (93%) rename src/{extension => }/ui/resources/button_cut_inner.png (100%) rename src/{extension => }/ui/resources/button_cut_outer.png (100%) rename src/{extension => }/ui/resources/button_delete.png (100%) rename src/{extension => }/ui/resources/button_delete_all.png (100%) rename src/{extension => }/ui/resources/button_download.png (100%) rename src/{extension => }/ui/resources/button_edit.png (100%) rename src/{extension => }/ui/resources/button_highlighter_blue.png (100%) rename src/{extension => }/ui/resources/button_highlighter_delete.png (100%) rename src/{extension => }/ui/resources/button_highlighter_green.png (100%) rename src/{extension => }/ui/resources/button_highlighter_hidden.png (100%) rename src/{extension => }/ui/resources/button_highlighter_pink.png (100%) rename src/{extension => }/ui/resources/button_highlighter_visible.png (100%) rename src/{extension => }/ui/resources/button_highlighter_yellow.png (100%) rename src/{extension => }/ui/resources/button_new.png (100%) rename src/{extension => }/ui/resources/button_note_blue.png (100%) rename src/{extension => }/ui/resources/button_note_edit.png (100%) rename src/{extension => }/ui/resources/button_note_format.png (100%) rename src/{extension => }/ui/resources/button_note_green.png (100%) rename src/{extension => }/ui/resources/button_note_hidden.png (100%) rename src/{extension => }/ui/resources/button_note_pink.png (100%) rename src/{extension => }/ui/resources/button_note_visible.png (100%) rename src/{extension => }/ui/resources/button_note_yellow.png (100%) rename src/{extension => }/ui/resources/button_ok.png (100%) rename src/{extension => }/ui/resources/button_print.png (100%) rename src/{extension => }/ui/resources/button_redo_cut.png (100%) rename src/{extension => }/ui/resources/button_undo_all_cut.png (100%) rename src/{extension => }/ui/resources/button_undo_cut.png (100%) rename src/{extension => }/ui/resources/icon_128.png (100%) rename src/{extension => }/ui/resources/icon_128_wait0.png (100%) rename src/{extension => }/ui/resources/icon_128_wait1.png (100%) rename src/{extension => }/ui/resources/icon_128_wait2.png (100%) rename src/{extension => }/ui/resources/icon_128_wait3.png (100%) rename src/{extension => }/ui/resources/icon_128_wait4.png (100%) rename src/{extension => }/ui/resources/icon_128_wait5.png (100%) rename src/{extension => }/ui/resources/icon_128_wait6.png (100%) rename src/{extension => }/ui/resources/icon_128_wait7.png (100%) rename src/{extension => }/ui/resources/icon_128_wait8.png (100%) rename src/{extension => }/ui/resources/icon_16.png (100%) rename src/{extension => }/ui/resources/icon_48.png (100%) rename src/{extension => }/ui/resources/icon_64.png (100%) diff --git a/build-extension.sh b/build-extension.sh index 22bff6553..3806ab005 100644 --- a/build-extension.sh +++ b/build-extension.sh @@ -5,34 +5,34 @@ zip -r singlefilez-extension-source.zip manifest.json package.json _locales src rm singlefilez-extension-firefox.zip singlefilez-extension-chromium.zip singlefilez-extension-edge.zip cp manifest.json manifest.copy.json -cp src/extension/core/bg/downloads.js downloads.copy.js -sed -i 's/7544745492-ig6uqhua0ads4jei52lervm1pqsi6hot/207618107333-h1220p1oasj3050kr5r416661adm091a/g' src/extension/core/bg/downloads.js -sed -i 's/000000000000000000000000/VQJ8Gq8Vxx72QyxPyeLtWvUt/g' src/extension/core/bg/downloads.js +cp src/core/bg/downloads.js downloads.copy.js +sed -i 's/7544745492-ig6uqhua0ads4jei52lervm1pqsi6hot/207618107333-h1220p1oasj3050kr5r416661adm091a/g' src/core/bg/downloads.js +sed -i 's/000000000000000000000000/VQJ8Gq8Vxx72QyxPyeLtWvUt/g' src/core/bg/downloads.js -cp src/extension/core/bg/config.js config.copy.js +cp src/core/bg/config.js config.copy.js jq "del(.options_page,.background.persistent,.optional_permissions[0],.oauth2)" manifest.copy.json >manifest.json sed -i 's/7544745492-ig6uqhua0ads4jei52lervm1pqsi6hot/7544745492-oe3q2jjvdluks2st2smslmrofcdederh/g' manifest.json -sed -i 's/forceWebAuthFlow: false/forceWebAuthFlow: true/g' src/extension/core/bg/config.js -zip -r singlefilez-extension-firefox.zip manifest.json lib _locales src/extension -mv config.copy.js src/extension/core/bg/config.js +sed -i 's/forceWebAuthFlow: false/forceWebAuthFlow: true/g' src/core/bg/config.js +zip -r singlefilez-extension-firefox.zip manifest.json lib _locales src +mv config.copy.js src/core/bg/config.js jq "del(.browser_specific_settings,.permissions[0],.permissions[1],.options_ui.browser_style)" manifest.copy.json >manifest.json sed -i 's/7544745492-ig6uqhua0ads4jei52lervm1pqsi6hot/7544745492-oe3q2jjvdluks2st2smslmrofcdederh/g' manifest.json -zip -r singlefilez-extension-chromium.zip manifest.json lib _locales src/extension +zip -r singlefilez-extension-chromium.zip manifest.json lib _locales src -cp src/extension/core/bg/config.js config.copy.js +cp src/core/bg/config.js config.copy.js jq "del(.browser_specific_settings,.permissions[0],.permissions[1],.options_ui.browser_style)" manifest.copy.json >manifest.json -sed -i 's/forceWebAuthFlow: false/forceWebAuthFlow: true/g' src/extension/core/bg/config.js -sed -i 's/image\/avif,//g' src/extension/core/bg/config.js +sed -i 's/forceWebAuthFlow: false/forceWebAuthFlow: true/g' src/core/bg/config.js +sed -i 's/image\/avif,//g' src/core/bg/config.js mkdir _locales.copy cp -R _locales/* _locales.copy rm -rf _locales/* cp -R _locales.copy/en _locales -zip -r singlefilez-extension-edge.zip manifest.json lib _locales src/extension +zip -r singlefilez-extension-edge.zip manifest.json lib _locales src rm -rf _locales/* mv _locales.copy/* _locales rmdir _locales.copy -mv config.copy.js src/extension/core/bg/config.js +mv config.copy.js src/core/bg/config.js mv manifest.copy.json manifest.json -mv downloads.copy.js src/extension/core/bg/downloads.js \ No newline at end of file +mv downloads.copy.js src/core/bg/downloads.js \ No newline at end of file diff --git a/lib/single-file-extension-background.js b/lib/single-file-extension-background.js index afda39fd4..f569b93dc 100644 --- a/lib/single-file-extension-background.js +++ b/lib/single-file-extension-background.js @@ -1 +1 @@ -!function(){"use strict";async function e(t,n){let a;try{a=await browser.downloads.download(t)}catch(a){if(a.message){const r=a.message.toLowerCase(),o=r.includes("illegal characters")||r.includes("invalid filename");if(o&&t.filename.startsWith("."))return t.filename=n+t.filename,e(t,n);if(o&&t.filename.includes(","))return t.filename=t.filename.replace(/,/g,n),e(t,n);if(o&&!t.filename.match(/^[\x00-\x7F]+$/))return t.filename=t.filename.replace(/[^\x00-\x7F]+/g,n),e(t,n);if((r.includes("'incognito'")||r.includes('"incognito"'))&&t.incognito)return delete t.incognito,e(t,n);if("conflictaction prompt not yet implemented"==r&&t.conflictAction)return delete t.conflictAction,e(t,n);if(r.includes("canceled"))return{};throw a}throw a}return new Promise(((e,t)=>{browser.downloads.onChanged.addListener((function n(r){r.id==a&&r.state&&("complete"==r.state.current&&(browser.downloads.search({id:a}).then((t=>e({filename:t[0]&&t[0].filename}))).catch((()=>e({}))),browser.downloads.onChanged.removeListener(n)),"interrupted"==r.state.current&&(r.error&&"USER_CANCELED"==r.error.current?e({}):t(new Error(r.state.current)),browser.downloads.onChanged.removeListener(n)))}))}))}let t,n,a;async function r(e,t,n){e[n]&&!e[t]&&(e[t]=e[n],delete e[n])}async function o(e){n&&delete n[e];const t=await i();if(t[e]){const n=t[e].autoSave;t[e]={autoSave:n},await c(t)}}function s(e){return n||(n={}),void 0===e||n[e]||(n[e]={}),n}async function i(e){if(!t){const e=await browser.storage.local.get();t=e.tabsData||{}}return async function(){if(!a){a=!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((()=>i().then((e=>t=e))),0);const l="-",d="__Default_Settings__",u="__Disabled_Settings__",f="regexp:",h={removeHiddenElements:!0,removeUnusedStyles:!0,removeUnusedFonts:!0,removeFrames:!1,removeImports:!0,compressHTML:!0,compressCSS:!1,loadDeferredImages:!0,loadDeferredImagesMaxIdleTime:1500,loadDeferredImagesBlockCookies:!1,loadDeferredImagesBlockStorage:!1,loadDeferredImagesKeepZoomLevel:!1,loadDeferredImagesDispatchScrollEvent:!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:"_",contextMenuEnabled:!0,tabMenuEnabled:!0,browserActionMenuEnabled:!0,shadowEnabled:!0,logsEnabled:!0,progressBarEnabled:!0,maxResourceSizeEnabled:!1,maxResourceSize:10,displayInfobar:!0,displayStats:!1,backgroundSave:!/Mobile.*Firefox/.test(navigator.userAgent),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,saveRawPage:!1,saveToGDrive:!1,saveToGitHub:!1,githubToken:"",githubUser:"",githubRepository:"SingleFileZ-Archives",githubBranch:"main",forceWebAuthFlow:!1,insertTextBody:!0,resolveFragmentIdentifierURLs:!1,userScriptEnabled:!1,openEditor:!1,openSavedPage:!1,autoOpenEditor:!1,saveCreatedBookmarks:!1,allowedBookmarkFolders:[],ignoredBookmarkFolders:[],replaceBookmarkURL:!0,saveFavicon:!0,includeBOM:!1,warnUnsavedPage:!0,createRootDirectory:!1,selfExtractingArchive:!0,insertMetaNoIndex:!1,insertMetaCSP:!0,passReferrerOnError:!1,password:"",insertSingleFileComment:!0,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,blockImages:!1,blockStylesheets:!1,blockFont:!1,blockScripts:!0,blockVideos:!0,blockAudios:!0},m=[{url:"file:",profile:"__Default_Settings__",autoSaveProfile:"__Disabled_Settings__"}];let w,b=p();async function p(){const{sync:e}=await browser.storage.local.get();w=e?browser.storage.sync:browser.storage.local;const t=await w.get();if(t.profiles)t.rules||(t.rules=m),Object.keys(t.profiles).forEach((e=>y(t.profiles[e]))),await w.remove(["profiles","rules"]),await w.set({profiles:t.profiles,rules:t.rules});else{const e=t;delete e.tabsData,y(e);const n={profiles:{},rules:m};n.profiles.__Default_Settings__=e,w.remove(Object.keys(h)),await w.set(n)}t.maxParallelWorkers||await w.set({maxParallelWorkers:navigator.hardwareConcurrency||4})}function y(e){g(e,"blockScripts","removeScripts"),g(e,"blockVideos","removeVideoSrc"),g(e,"blockAudios","removeAudioSrc"),Object.keys(h).forEach((t=>function(e,t){void 0===e[t]&&(e[t]=h[t])}(e,t)))}function g(e,t,n){void 0===e[t]&&void 0!==e[n]&&(e[t]=e[n],delete e[n])}async function v(e,t){const n=await k(),a=n.rules.filter((e=>x(e)));let r=a.sort(I).find((t=>e&&e.match(new RegExp(t.url.split(f)[1]))));if(!r){const a=n.rules.filter((e=>!x(e)));r=a.sort(I).find((n=>!t&&"*"==n.url||e&&e.includes(n.url)))}return r}async function k(){return await b,w.get(["profiles","rules","maxParallelWorkers"])}function I(e,t){return t.url.length-e.url.length}function x(e){return e.url.toLowerCase().startsWith(f)}async function S(t){if(t.method.endsWith(".deleteRules")&&await async function(e){const t=await k();t.rules=t.rules=e?t.rules.filter((t=>t.autoSaveProfile!=e&&t.profile!=e)):[],await w.set({rules:t.rules})}(t.profileName),t.method.endsWith(".deleteRule")&&await async function(e){if(!e)throw new Error("URL is empty");const t=await k();t.rules=t.rules.filter((t=>t.url!=e)),await w.set({rules:t.rules})}(t.url),t.method.endsWith(".addRule")&&await E(t.url,t.profileName,t.autoSaveProfileName),t.method.endsWith(".createProfile")&&await async function(e,t){const n=await k();if(Object.keys(n.profiles).includes(e))throw new Error("Duplicate profile name");n.profiles[e]=JSON.parse(JSON.stringify(n.profiles[t])),await w.set({profiles:n.profiles})}(t.profileName,t.fromProfileName||d),t.method.endsWith(".renameProfile")&&await async function(e,t){const[n,a]=await Promise.all([k(),i()]);if(!Object.keys(n.profiles).includes(e))throw new Error("Profile not found");if(Object.keys(n.profiles).includes(t))throw new Error("Duplicate profile name");if(e==d)throw new Error("Default settings cannot be renamed");a.profileName==e&&(a.profileName=t,await c(a));n.profiles[t]=n.profiles[e],n.rules.forEach((n=>{n.profile==e&&(n.profile=t),n.autoSaveProfile==e&&(n.autoSaveProfile=t)})),delete n.profiles[e],await w.set({profiles:n.profiles,rules:n.rules})}(t.profileName,t.newProfileName),t.method.endsWith(".deleteProfile")&&await async function(e){const[t,n]=await Promise.all([k(),i()]);if(!Object.keys(t.profiles).includes(e))throw new Error("Profile not found");if(e==d)throw new Error("Default settings cannot be deleted");n.profileName==e&&(delete n.profileName,await c(n));t.rules.forEach((t=>{t.profile==e&&(t.profile=d),t.autoSaveProfile==e&&(t.autoSaveProfile=d)})),delete t.profiles[e],await w.set({profiles:t.profiles,rules:t.rules})}(t.profileName),t.method.endsWith(".resetProfiles")&&await async function(){await b;const e=await i();delete e.profileName,await c(e),await w.remove(["profiles","rules","maxParallelWorkers"]),await browser.storage.local.set({sync:!1}),w=browser.storage.local,await p()}(),t.method.endsWith(".resetProfile")&&await async function(e){const t=await k();if(!Object.keys(t.profiles).includes(e))throw new Error("Profile not found");t.profiles[e]=h,await w.set({profiles:t.profiles})}(t.profileName),t.method.endsWith(".importConfig")&&await async function(e){await w.remove(["profiles","rules","maxParallelWorkers"]),await w.set({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers}),await p()}(t.config),t.method.endsWith(".updateProfile")&&await async function(e,t){const n=await k();if(!Object.keys(n.profiles).includes(e))throw new Error("Profile not found");Object.keys(t).forEach((a=>n.profiles[e][a]=t[a])),await w.set({profiles:n.profiles})}(t.profileName,t.profile),t.method.endsWith(".updateRule")&&await P(t.url,t.newUrl,t.profileName,t.autoSaveProfileName),t.method.endsWith(".getConstants"))return{DISABLED_PROFILE_NAME:u,DEFAULT_PROFILE_NAME:d,CURRENT_PROFILE_NAME:l};if(t.method.endsWith(".getRules"))return async function(){return(await k()).rules}();if(t.method.endsWith(".getProfiles"))return T();if(t.method.endsWith(".exportConfig"))return async function(){const t=await k(),n=URL.createObjectURL(new Blob([JSON.stringify({profiles:t.profiles,rules:t.rules,maxParallelWorkers:t.maxParallelWorkers},null,2)],{type:"text/json"})),a={url:n,filename:`singlefilez-settings-${(new Date).toISOString().replace(/:/g,"_")}.json`,saveAs:!0};try{await e(a,"_")}finally{URL.revokeObjectURL(n)}}();if(t.method.endsWith(".enableSync")){await browser.storage.local.set({sync:!0});const e=await browser.storage.sync.get();if(!e||!e.profiles){const e=await browser.storage.local.get();await browser.storage.sync.set({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers})}return w=browser.storage.sync,{}}if(t.method.endsWith(".disableSync")){await browser.storage.local.set({sync:!1});const e=await browser.storage.sync.get();e&&e.profiles&&await browser.storage.local.set({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers}),w=browser.storage.local}return t.method.endsWith(".isSync")?{sync:(await browser.storage.local.get()).sync}:{}}async function T(){return(await k()).profiles}async function A(e,t){const[n,a,r]=await Promise.all([k(),v(e),i()]),o=r.profileName||d;let s;if(a){const e=a[t?"autoSaveProfile":"profile"];s=e==l?o:e}else s=o;return Object.assign({profileName:s},n.profiles[s])}async function E(e,t,n){if(!e)throw new Error("URL is empty");const a=await k();if(a.rules.find((t=>t.url==e)))throw new Error("URL already exists");a.rules.push({url:e,profile:t,autoSaveProfile:n}),await w.set({rules:a.rules})}async function P(e,t,n,a){if(!e||!t)throw new Error("URL is empty");const r=await k(),o=r.rules.find((t=>t.url==e));if(!o)throw new Error("URL not found");if(r.rules.find((n=>n.url==t&&n.url!=e)))throw new Error("New URL already exists");o.url=t,o.profile=n,o.autoSaveProfile=a,await w.set({rules:r.rules})}async function M(){return(await w.get()).authInfo}async function R(e){await w.set({authInfo:e})}async function U(){let e=M();e.revokableAccessToken?R({revokableAccessToken:e.revokableAccessToken}):await w.remove(["authInfo"])}async function L(e){if(e){const[t,n]=await Promise.all([i(),v(e.url)]);return Boolean(t.autoSaveAll||t.autoSaveUnpinned&&!e.pinned||t[e.id]&&t[e.id].autoSave)&&(!n||n.autoSaveProfile!=u)}}const W=[0],B=Symbol(),C=new TextEncoder,O=new TextDecoder,j=new Array(256);let D=0;function _(e,t,n,a){if(void 0===a){if(D++,!(j.length-D>=W.length))throw new Error("Reached maximum number of custom types");j[j.length-D]={serialize:e,parse:t,test:n}}else j[a]={serialize:e,parse:t,test:n}}_((function*(e,t){const n=e.objects.indexOf(t);yield*z(e,n)}),(function*(e){const t=yield*Y(e);return new K(t,e)}),re,0),_(null,(function*(){return{}}),se),_(H,ee,ie),_(G,te,(function(e){return"string"==typeof e})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(8*t);return new Float64Array(n.buffer)}),(function(e){return e instanceof Float64Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(4*t);return new Float32Array(n.buffer)}),(function(e){return e instanceof Float32Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(4*t);return new Uint32Array(n.buffer)}),(function(e){return e instanceof Uint32Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(4*t);return new Int32Array(n.buffer)}),(function(e){return e instanceof Int32Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(2*t);return new Uint16Array(n.buffer)}),(function(e){return e instanceof Uint16Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(2*t);return new Int16Array(n.buffer)}),(function(e){return e instanceof Int16Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(t);return new Uint8ClampedArray(n.buffer)}),(function(e){return e instanceof Uint8ClampedArray})),_(J,(function*(e){const t=yield*Y(e);return yield*e.consume(t)}),(function(e){return e instanceof Uint8Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(t);return new Int8Array(n.buffer)}),(function(e){return e instanceof Int8Array})),_((function*(e,t){yield*z(e,t.byteLength),yield*e.append(new Uint8Array(t))}),(function*(e){const t=yield*Y(e);return(yield*e.consume(t)).buffer}),(function(e){return e instanceof ArrayBuffer})),_($,ne,le),_((function*(e,t){const n=new Uint8Array(new Uint32Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(4);return new Uint32Array(t.buffer)[0]}),(function(e){return de(e)&&e>=0&&e<=4294967295})),_((function*(e,t){const n=new Uint8Array(new Int32Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(4);return new Int32Array(t.buffer)[0]}),(function(e){return de(e)&&e>=-2147483648&&e<=2147483647})),_((function*(e,t){const n=new Uint8Array(new Uint16Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(2);return new Uint16Array(t.buffer)[0]}),(function(e){return de(e)&&e>=0&&e<=65535})),_((function*(e,t){const n=new Uint8Array(new Int16Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(2);return new Int16Array(t.buffer)[0]}),(function(e){return de(e)&&e>=-32768&&e<=32767})),_((function*(e,t){const n=new Uint8Array([t]);yield*e.append(n)}),(function*(e){const t=yield*e.consume(1);return new Uint8Array(t.buffer)[0]}),(function(e){return de(e)&&e>=0&&e<=255})),_((function*(e,t){const n=new Uint8Array(new Int8Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(1);return new Int8Array(t.buffer)[0]}),(function(e){return de(e)&&e>=-128&&e<=127})),_(null,(function*(){return}),(function(e){return void 0===e})),_(null,(function*(){return null}),(function(e){return null===e})),_(null,(function*(){return NaN}),(function(e){return Number.isNaN(e)})),_(X,ae,(function(e){return"boolean"==typeof e})),_((function*(e,t){yield*G(e,t.description)}),(function*(e){const t=yield*te(e);return Symbol(t)}),ue),_(null,(function*(){return B}),ce),_((function*(e,t){const n=t.entries();yield*z(e,t.size);for(const[t,a]of n)yield*z(e,t),yield*z(e,a)}),(function*(e){const t=yield*Y(e),n=new Map;for(let a=0;an.set(e,t)))}return n}),(function(e){return e instanceof Map})),_((function*(e,t){yield*z(e,t.size);for(const n of t)yield*z(e,n)}),(function*(e){const t=yield*Y(e),n=new Set;for(let a=0;an.add(e)))}return n}),(function(e){return e instanceof Set})),_((function*(e,t){yield*$(e,t.getTime())}),(function*(e){const t=yield*ne(e);return new Date(t)}),(function(e){return e instanceof Date})),_((function*(e,t){yield*G(e,t.message),yield*G(e,t.stack)}),(function*(e){const t=yield*te(e),n=yield*te(e),a=new Error(t);return a.stack=n,a}),(function(e){return e instanceof Error})),_((function*(e,t){yield*G(e,t.source),yield*G(e,t.flags)}),(function*(e){const t=yield*te(e),n=yield*te(e);return new RegExp(t,n)}),(function(e){return e instanceof RegExp})),_((function*(e,t){yield*G(e,t.valueOf())}),(function*(e){return new String(yield*te(e))}),(function(e){return e instanceof String})),_((function*(e,t){yield*$(e,t.valueOf())}),(function*(e){return new Number(yield*ne(e))}),(function(e){return e instanceof Number})),_((function*(e,t){yield*X(e,t.valueOf())}),(function*(e){return new Boolean(yield*ae(e))}),(function(e){return e instanceof Boolean}));class N{constructor(e){this.stream=new F(e),this.objects=[]}append(e){return this.stream.append(e)}flush(){return this.stream.flush()}addObject(e){this.objects.push(fe(e)&&!re(e,this)?e:void 0)}}class F{constructor(e){this.offset=0,this.value=new Uint8Array(e)}*append(e){if(this.offset+e.length>this.value.length){const t=this.value.length-this.offset;yield*this.append(e.subarray(0,t)),yield this.value,this.offset=0,yield*this.append(e.subarray(t))}else this.value.set(e,this.offset),this.offset+=e.length}*flush(){this.offset&&(yield this.value.subarray(0,this.offset))}}function*q(e,{chunkSize:t=8388608}={}){const n=new N(t);yield*z(n,e),yield*n.flush()}function*z(e,t){const n=j.findIndex((({test:n}={})=>n&&n(t,e)));e.addObject(t),yield*e.append(new Uint8Array([n]));const a=j[n].serialize;a&&(yield*a(e,t)),0!=n&&se(t)&&(yield*function*(e,t){const n=Object.getOwnPropertySymbols(t).map((e=>[e,t[e]]));yield*H(e,n)}(e,t),yield*function*(e,t){let n=Object.entries(t);ie(t)&&(n=n.filter((([e])=>!de(Number(e)))));yield*function*(e,t){yield*z(e,t.length);for(const[n,a]of t)yield*G(e,n),yield*z(e,a)}(e,n)}(e,t))}function*H(e,t){yield*z(e,t.length);const n=Object.keys(t).filter((e=>de(Number(e)))).map((e=>Number(e)));let a=0,r=n[a];for(const[o,s]of t.entries())r==o?(r=n[++a],yield*z(e,s)):yield*z(e,B)}function*G(e,t){const n=C.encode(t);yield*z(e,n.length),yield*e.append(n)}function*J(e,t){yield*z(e,t.length),yield*e.append(new Uint8Array(t.buffer))}function*$(e,t){const n=new Uint8Array(new Float64Array([t]).buffer);yield*e.append(n)}function*X(e,t){const n=new Uint8Array([Number(t)]);yield*e.append(n)}class K{constructor(e,t){this.index=e,this.data=t}getObject(){return this.data.objects[this.index]}}class V{constructor(){this.stream=new Z,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){fe(t)&&!oe(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=>oe(e)?e.getObject():e)))}))}}class Z{constructor(){this.offset=0,this.value=new Uint8Array(0)}*consume(e){if(this.offset+e>this.value.length){const t=this.value.subarray(this.offset,this.value.length),n=yield;return t.length+n.length!=this.value.length&&(this.value=new Uint8Array(t.length+n.length)),this.value.set(t),this.value.set(n,t.length),this.offset=0,yield*this.consume(e)}{const t=this.value.slice(this.offset,this.offset+e);return this.offset+=t.length,t}}}function Q(){const e=function*(){const e=new V,t=yield*Y(e);return e.executeSetters(),t}();return e.next(),e}function*Y(e){const t=(yield*e.consume(1))[0],n=j[t].parse,a=e.getObjectId(),r=yield*n(e);return 0!=t&&se(r)&&(yield*function*(e,t){const n=yield*ee(e);e.setObject([n],(e=>e.forEach((([e,n])=>t[e]=n))))}(e,r),yield*function*(e,t){yield*function*(e,t){const n=yield*Y(e);for(let a=0;at[n]=e))}}(e,t)}(e,r)),e.resolveObject(a,r),r}function*ee(e){const t=yield*Y(e),n=new Array(t);for(let a=0;an[a]=e))}return n}function*te(e){const t=yield*Y(e),n=yield*e.consume(t);return O.decode(n)}function*ne(e){const t=yield*e.consume(8);return new Float64Array(t.buffer)[0]}function*ae(e){const t=yield*e.consume(1);return Boolean(t[0])}function re(e,t){return se(e)&&t.objects.includes(e)}function oe(e){return e instanceof K}function se(e){return e===Object(e)}function ie(e){return"number"==typeof e.length}function ce(e){return e===B}function le(e){return"number"==typeof e}function de(e){return le(e)&&Number.isInteger(e)}function ue(e){return"symbol"==typeof e}function fe(e){return se(e)||ue(e)}const he="/src/extension/ui/pages/editor.html",me=new Map,we=new Map,be=browser.runtime.getURL(he);function pe(e){return e.url==be}const ye=new Map,ge="x-single-file-request-id";async function ve(e,t,n){const a=q({headers:n.headers,status:n.status,error:n.error,array:n.array});for(const n of a){const a={method:"singlefile.fetchResponse",requestId:t,data:Array.from(n)};await browser.tabs.sendMessage(e,a)}return{}}function ke(e,t={},n){return new Promise(((a,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||n?a({array:new Uint8Array(o.response),headers:{"content-type":o.getResponseHeader("Content-Type")},status:o.status}):ke(e,t,!0).then(a).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(n){const e=String(Math.random()).substring(2);!function(e,t){ye.set(e,t)}(e,t.referrer),o.setRequestHeader(ge,e)}o.send()}))}browser.runtime.onMessage.addListener(((e,t)=>{if(e.method&&e.method.startsWith("singlefile.fetch"))return new Promise((n=>{(async function(e,t){if("singlefile.fetch"==e.method)try{const n=await ke(e.url,{referrer:e.referrer,headers:e.headers});return ve(t.tab.id,e.requestId,n)}catch(n){return ve(t.tab.id,e.requestId,{error:n.message,arrray:[]})}else if("singlefile.fetchFrame"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(n).catch((e=>n({error:e&&e.toString()})))}))}));let Ie=!1;function xe(e){return e.method.endsWith(".enableReferrerOnError")?(Te(),{}):e.method.endsWith(".disableReferrerOnError")?(function(){try{browser.webRequest.onBeforeSendHeaders.removeListener(Se)}catch(e){}Ie=!1}(),{}):void 0}function Se(e){if(Ie){let t=e.requestHeaders.find((e=>e.name===ge));if(t){e.requestHeaders=e.requestHeaders.filter((e=>e.name!==ge));const n=ye.get(t.value);if(n){ye.delete(t.value);if(!e.requestHeaders.find((e=>"referer"===e.name.toLowerCase())))return e.requestHeaders.push({name:"Referer",value:n}),{requestHeaders:e.requestHeaders}}}}}function Te(){if(!Ie){try{browser.webRequest.onBeforeSendHeaders.addListener(Se,{urls:[""]},["blocking","requestHeaders","extraHeaders"])}catch(e){browser.webRequest.onBeforeSendHeaders.addListener(Se,{urls:[""]},["blocking","requestHeaders"])}Ie=!0}}async function Ae(e){return(await browser.tabs.query(e)).sort(((e,t)=>e.index-t.index))}const Ee="/src/extension/ui/resources/icon_128.png",Pe="/src/extension/ui/resources/icon_128_wait",Me=browser.i18n.getMessage("buttonDefaultTooltip"),Re=browser.i18n.getMessage("buttonBlockedTooltip"),Ue=browser.i18n.getMessage("buttonInitializingBadge"),Le=browser.i18n.getMessage("buttonInitializingTooltip"),We=browser.i18n.getMessage("buttonErrorBadge"),Be=browser.i18n.getMessage("buttonBlockedBadge"),Ce=browser.i18n.getMessage("buttonOKBadge"),Oe=browser.i18n.getMessage("buttonSaveProgressTooltip"),je=browser.i18n.getMessage("buttonUploadProgressTooltip"),De=browser.i18n.getMessage("buttonAutoSaveActiveBadge"),_e=browser.i18n.getMessage("buttonAutoSaveActiveTooltip"),Ne=[2,147,20,192],Fe=[4,229,36,192],qe={default:{setBadgeBackgroundColor:{color:Ne},setBadgeText:{text:""},setTitle:{title:Me},setIcon:{path:Ee}},inject:{setBadgeBackgroundColor:{color:Ne},setBadgeText:{text:Ue},setTitle:{title:Le}},execute:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:Ue}},progress:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:""}},edit:{setBadgeBackgroundColor:{color:Ne},setBadgeText:{text:""},setTitle:{title:Me},setIcon:{path:Ee}},end:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:Ce},setTitle:{title:Me},setIcon:{path:Ee}},error:{setBadgeBackgroundColor:{color:[229,4,12,192]},setBadgeText:{text:We},setTitle:{title:""},setIcon:{path:Ee}},forbidden:{setBadgeBackgroundColor:{color:[255,255,255,1]},setBadgeText:{text:Be},setTitle:{title:Re},setIcon:{path:Ee}},autosave:{inject:{setBadgeBackgroundColor:{color:[64,64,64,192]},setBadgeText:{text:De},setTitle:{title:_e},setIcon:{path:Ee}},default:{setBadgeBackgroundColor:{color:[208,208,208,192]},setBadgeText:{text:De},setTitle:{title:_e},setIcon:{path:Ee}}}};let ze;function He(e,t){if(e.method.endsWith(".processInit")){delete s(t.tab.id)[t.tab.id].button,Xe(t.tab)}var n,a,r;return e.method.endsWith(".processProgress")&&e.maxIndex&&(n=t.tab.id,a=e.index,r=e.maxIndex,$e(n,a,r,Oe)),e.method.endsWith(".processError")&&(e.error&&console.error("Initialization error",e.error),Ge(t.tab.id)),e.method.endsWith(".processCancelled")&&Je(t.tab),Promise.resolve({})}function Ge(e){Ke(e,Ze("error"))}function Je(e){Xe(e)}function $e(e,t,n,a){const r=Math.max(Math.min(20,Math.floor(t/n*20)),0),o=Math.min(Math.floor(t/n*8),8),s=Pe+o+".png",i=Ze("progress");i.setTitle={title:a+5*r+"%"},i.setIcon={path:s},Ke(e,i)}async function Xe(e){const t=Ze("default",await L(e));await Ke(e.id,t)}async function Ke(e,t){try{const n=s(e);if(t){n[e].button||(n[e].button={lastState:null});const a=n[e].button.lastState||{},r={};Object.keys(t).forEach((e=>{void 0!==t[e]&&JSON.stringify(a[e])!=JSON.stringify(t[e])&&(r[e]=t[e])})),Object.keys(r).length&&(n[e].button.lastState=t,await async function(e,t){for(const n of Object.keys(t))await Ve(e,n,t[n])}(e,r))}}catch(e){}}async function Ve(e,t,n){if(browser.browserAction[t]){const a=JSON.parse(JSON.stringify(n));a.tabId=e,await browser.browserAction[t](a)}}function Ze(e,t){return JSON.parse(JSON.stringify(t?qe.autosave[e]:qe[e]))}browser.browserAction.onClicked.addListener((async e=>{const t=await Ae({currentWindow:!0,highlighted:!0});t.length<=1?function(e){ze.isSavingTab(e)?ze.cancelTab(e.id):ze.saveTabs([e])}(e):ze.saveTabs(t)}));const Qe=browser.menus,Ye=Qe&&Qe.onClicked&&Qe.create&&Qe.update&&Qe.removeAll,et="save-page",tt="edit-and-save-page",nt="save-with-profile",at="save-selected-links",rt="view-pendings",ot="select-profile",st="wasve-with-profile-",it="select-profile-",ct="associate-with-profile",lt="associate-with-profile-",dt="save-selected",ut="save-frame",ft="save-tabs",ht="save-selected-tabs",mt="save-unpinned-tabs",wt="save-all-tabs",bt="batch-save-urls",pt="button-save-selected-tabs",yt="button-save-unpinned-tabs",gt="button-save-all-tabs",vt="auto-save",kt="auto-save-disabled",It="auto-save-tab",xt="auto-save-unpinned",St="auto-save-all",Tt=browser.i18n.getMessage("menuCreateDomainRule"),At=browser.i18n.getMessage("menuUpdateRule"),Et=browser.i18n.getMessage("menuSavePage"),Pt=browser.i18n.getMessage("menuSaveWithProfile"),Mt=browser.i18n.getMessage("menuSaveSelectedLinks"),Rt=browser.i18n.getMessage("menuEditPage"),Ut=browser.i18n.getMessage("menuEditAndSavePage"),Lt=browser.i18n.getMessage("menuViewPendingSaves"),Wt=browser.i18n.getMessage("menuSaveSelection"),Bt=browser.i18n.getMessage("menuSaveFrame"),Ct=browser.i18n.getMessage("menuSaveTabs"),Ot=browser.i18n.getMessage("menuSaveSelectedTabs"),jt=browser.i18n.getMessage("menuSaveUnpinnedTabs"),Dt=browser.i18n.getMessage("menuSaveAllTabs"),_t=browser.i18n.getMessage("menuBatchSaveUrls"),Nt=browser.i18n.getMessage("menuSelectProfile"),Ft=browser.i18n.getMessage("profileDefaultSettings"),qt=browser.i18n.getMessage("menuAutoSave"),zt=browser.i18n.getMessage("menuAutoSaveDisabled"),Ht=browser.i18n.getMessage("menuAutoSaveTab"),Gt=browser.i18n.getMessage("menuAutoSaveUnpinnedTabs"),Jt=browser.i18n.getMessage("menuAutoSaveAllTabs"),$t=[tt,at,dt,ut,vt,ct],Xt=new Map,Kt=new Map;let Vt,Zt,Qt,Yt=!0,en=!0,tn=new Map;async function nn(e){const[t,n]=await Promise.all([T(),i()]),a=await A(e&&e.url);if(Ye&&a){const r=["page","frame","image","link","video","audio","selection"],o=[];if(a.browserActionMenuEnabled&&o.push("browser_action"),a.tabMenuEnabled)try{Qe.create({id:"temporary-id",contexts:["tab"],title:"title"}),o.push("tab")}catch(e){a.tabMenuEnabled=!1}await Qe.removeAll();const s=o.concat(...r),i=a.contextMenuEnabled?s:o;if(Qe.create({id:et,contexts:i,title:Et}),Qe.create({id:tt,contexts:i,title:Ut}),Qe.create({id:at,contexts:a.contextMenuEnabled?o.concat(["selection"]):o,title:Mt}),Object.keys(t).length>1&&Qe.create({id:nt,contexts:i,title:Pt}),a.contextMenuEnabled&&Qe.create({id:"separator-1",contexts:r,type:"separator"}),Qe.create({id:dt,contexts:i,title:Wt}),a.contextMenuEnabled&&Qe.create({id:ut,contexts:["frame"],title:Bt}),Qe.create({id:ft,contexts:o,title:Ct}),Qe.create({id:pt,contexts:o,title:Ot,parentId:ft}),Qe.create({id:yt,contexts:o,title:jt,parentId:ft}),Qe.create({id:gt,contexts:o,title:Dt,parentId:ft}),a.contextMenuEnabled&&(Qe.create({id:ht,contexts:r,title:Ot}),Qe.create({id:mt,contexts:r,title:jt}),Qe.create({id:wt,contexts:r,title:Dt}),Qe.create({id:"separator-2",contexts:r,type:"separator"})),Object.keys(t).length>1){Qe.create({id:ot,title:Nt,contexts:i}),Qe.create({id:"wasve-with-profile-default",contexts:i,title:Ft,parentId:nt});const o="select-profile-default",s=!n.profileName||n.profileName==d;let c;Qe.create({id:o,type:"radio",contexts:i,title:Ft,checked:s,parentId:ot}),Xt.set(o,s),Qe.create({id:ct,title:Tt,contexts:i}),Kt.set(ct,Tt),e&&e.url&&(c=await v(e.url,!0));const u="associate-with-profile-current",f=!c||c.profile==l;Qe.create({id:u,type:"radio",contexts:i,title:l,checked:f,parentId:ct}),Xt.set(u,f);const h="associate-with-profile-default",m=Boolean(c)&&c.profile==d;Qe.create({id:h,type:"radio",contexts:i,title:Ft,checked:m,parentId:ct}),Xt.set(h,m),tn=new Map,Object.keys(t).forEach(((e,t)=>{if(e!=d){let a=st+t;Qe.create({id:a,contexts:i,title:e,parentId:nt}),a=it+t;let r=n.profileName==e;Qe.create({id:a,type:"radio",contexts:i,title:e,checked:r,parentId:ot}),Xt.set(a,r),a=lt+t,r=Boolean(c)&&c.profile==e,Qe.create({id:a,type:"radio",contexts:i,title:e,checked:r,parentId:ct}),Xt.set(a,r),tn.set(e,t)}})),a.contextMenuEnabled&&Qe.create({id:"separator-3",contexts:r,type:"separator"})}Qe.create({id:vt,contexts:i,title:qt}),Qe.create({id:kt,type:"radio",title:zt,contexts:i,checked:!0,parentId:vt}),Xt.set(kt,!0),Qe.create({id:It,type:"radio",title:Ht,contexts:i,checked:!1,parentId:vt}),Xt.set(It,!1),Qe.create({id:xt,type:"radio",title:Gt,contexts:i,checked:!1,parentId:vt}),Xt.set(xt,!1),Qe.create({id:St,type:"radio",title:Jt,contexts:i,checked:!1,parentId:vt}),Xt.set(St,!1),Qe.create({id:"separator-4",contexts:i,type:"separator"}),Qe.create({id:bt,contexts:i,title:_t}),Qe.create({id:rt,contexts:i,title:Lt})}Vt=!0,Zt&&(Zt=!1,(await browser.tabs.query({})).forEach((async e=>await rn(e))))}async function an(e){const t=await i(e.id);await async function(){const e=await browser.tabs.query({});return Promise.all(e.map((async e=>{const[t,n]=await Promise.all([A(e.url,!0),L(e)]);try{await browser.tabs.sendMessage(e.id,{method:"content.init",autoSaveEnabled:n,options:t})}catch(e){}})))}(),await Xe(e);try{await browser.runtime.sendMessage({method:"options.refresh",profileName:t.profileName})}catch(e){}}async function rn(e){if(Ye&&Vt){const t=[],n=await i(e.id);if(n[e.id].editorDetected)on(!1);else if(on(!0),t.push(cn(kt,!n[e.id].autoSave)),t.push(cn(It,n[e.id].autoSave)),t.push(cn(xt,Boolean(n.autoSaveUnpinned))),t.push(cn(St,Boolean(n.autoSaveAll))),e&&e.url){const a=await A(e.url);t.push(async function(e,t){const n=Yt;Yt=t,(void 0===n||n!=t)&&await nn(e)}(e,a.contextMenuEnabled)),t.push(sn(tt,n[e.id].savedPageDetected?Rt:Ut)),t.push(Qe.update(dt,{visible:!a.saveRawPage})),t.push(Qe.update(tt,{visible:!a.openEditor||n[e.id].savedPageDetected}));let r="associate-with-profile-default",o=Tt;const[s,i]=await Promise.all([T(),v(e.url)]);if(i){const e=tn.get(i.profile);e&&(r=lt+e,o=At)}Object.keys(s).length>1&&(Object.keys(s).forEach(((e,n)=>{e==d?t.push(cn("associate-with-profile-default","associate-with-profile-default"==r)):t.push(cn(lt+n,r==lt+n))})),t.push(sn(ct,o)))}await Promise.all(t)}}async function on(e){const t=en;if(en=e,void 0===t||t!=e){const t=[];try{$t.forEach((n=>t.push(Qe.update(n,{visible:e})))),await Promise.all(t)}catch(e){}}}function sn(e,t){const n=Kt.get(e);return Kt.set(e,t),void 0===n||n!=t?Qe.update(e,{title:t}):void 0}async function cn(e,t){t=Boolean(t),Xt.set(e,t),await Qe.update(e,{checked:t})}Promise.resolve().then((async function(){Ye&&(nn(),Qe.onClicked.addListener((async(e,t)=>{if(e.menuItemId==et&&(e.linkUrl?Qt.saveUrls([e.linkUrl]):Qt.saveTabs([t])),e.menuItemId==tt){(await i(t.id))[t.id].savedPageDetected?Qt.openEditor(t):e.linkUrl?Qt.saveUrls([e.linkUrl],{openEditor:!0}):Qt.saveTabs([t],{openEditor:!0})}if(e.menuItemId==at&&Qt.saveSelectedLinks(t),e.menuItemId==rt&&await browser.tabs.create({active:!0,url:"/src/extension/ui/pages/pendings.html"}),e.menuItemId==dt&&Qt.saveTabs([t],{selected:!0}),e.menuItemId==ut&&Qt.saveTabs([t],{frameId:e.frameId}),e.menuItemId==ht||e.menuItemId==pt){const e=await Ae({currentWindow:!0,highlighted:!0});Qt.saveTabs(e)}if(e.menuItemId==mt||e.menuItemId==yt){const e=await Ae({currentWindow:!0,pinned:!1});Qt.saveTabs(e)}if(e.menuItemId==wt||e.menuItemId==gt){const e=await Ae({currentWindow:!0});Qt.saveTabs(e)}if(e.menuItemId==bt&&Qt.batchSaveUrls(),e.menuItemId==It){const e=await i(t.id);e[t.id].autoSave=!0,await c(e),an(t)}if(e.menuItemId==kt){const e=await i();Object.keys(e).forEach((t=>{"object"==typeof e[t]&&e[t].autoSave&&(e[t].autoSave=!1)})),e.autoSaveUnpinned=e.autoSaveAll=!1,await c(e),an(t)}if(e.menuItemId==St){const n=await i();n.autoSaveAll=e.checked,await c(n),an(t)}if(e.menuItemId==xt){const n=await i();n.autoSaveUnpinned=e.checked,await c(n),an(t)}if(e.menuItemId.startsWith(st)){const n=await T(),a=e.menuItemId.split(st)[1];let r;if("default"==a)r=d;else{const e=Number(a);r=Object.keys(n)[e]}n[r].profileName=r,Qt.saveTabs([t],n[r])}if(e.menuItemId.startsWith(it)){const[n,a]=await Promise.all([T(),i()]),r=e.menuItemId.split(it)[1];if("default"==r)a.profileName=d;else{const e=Number(r);a.profileName=Object.keys(n)[e]}await c(a),an(t)}if(e.menuItemId.startsWith(lt)){const[n,a]=await Promise.all([T(),v(t.url,!0)]),r=e.menuItemId.split(lt)[1];let o;if("default"==r)o=d;else if("current"==r)o=l;else{const e=Number(r);o=Object.keys(n)[e]}a?await P(a.url,a.url,o,o):(await sn(ct,At),await E(new URL(t.url).hostname,o,o))}})),Vt?Zt=!0:(await browser.tabs.query({})).forEach((async e=>await rn(e))))}));const ln=browser.commands;let dn,un,fn;function hn(e,t){return e.method.endsWith(".refreshMenu")?function(e){if(e.method.endsWith("refreshMenu"))return nn(),Promise.resolve({})}(e):He(e,t)}function mn(e){!function(e){Ke(e.id,Ze("forbidden"))}(e)}function wn(e,t,n){!function(e,t,n){let a;n?a=Ze("inject",!0):(a=Ze(1==t?"inject":"execute"),a.setTitle={title:Le+" ("+t+"/2)"},a.setIcon={path:Pe+"0.png"}),Ke(e,a)}(e,t,n)}async function bn(e,t){Ge(e);try{t&&await browser.tabs.sendMessage(e,{method:"content.error",error:t.toString()})}catch(e){}}function pn(e){!function(e){Ke(e,Ze("edit"))}(e)}function yn(e,t){!function(e,t){Ke(e,t?Ze("default",!0):Ze("end"))}(e,t)}function gn(e,t,n){!function(e,t,n){$e(e,t,n,je)}(e,t,n)}function vn(e){rn(e)}ln&&ln.onCommand&&ln.onCommand.addListener&&ln.onCommand.addListener((async e=>{if("save-selected-tabs"==e){const e=await Ae({currentWindow:!0,highlighted:!0});dn.saveTabs(e,{optionallySelected:!0})}if("save-all-tabs"==e){const e=await Ae({currentWindow:!0});dn.saveTabs(e)}}));const kn=["lib/chrome-browser-polyfill.js","lib/single-file.js"],In=["lib/chrome-browser-polyfill.js","lib/single-file-frames.js"];async function xn(e,t){let n;if(await async function(e){const t=e.extensionScriptFiles||[];un||fn||([un,fn]=await Promise.all([Sn(kn.concat(t)),Sn(In)]))}(t),!t.removeFrames)try{await browser.tabs.executeScript(e,{code:fn,allFrames:!0,matchAboutBlank:!0,runAt:"document_start"})}catch(e){}try{await browser.tabs.executeScript(e,{code:un,allFrames:!1,runAt:"document_idle"}),n=!0}catch(e){}return n&&t.frameId&&await browser.tabs.executeScript(e,{code:"document.documentElement.dataset.requestedFrameId = true",frameId:t.frameId,matchAboutBlank:!0,runAt:"document_start"}),n}async function Sn(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 n="";for(const e of t)n+=await e;return n}const Tn="single-filez-response-fetch",An=(e,t)=>window.fetch(e,t);let En=0,Pn=new Map;async function Mn(e,t={}){try{let n=await An(e,{cache:"force-cache",headers:t.headers});return 401!=n.status&&403!=n.status&&404!=n.status||(n=await Ln(e)),n}catch(n){En++;const a=new Promise(((e,t)=>Pn.set(En,{resolve:e,reject:t,parser:Q()})));return await Un({method:"singlefile.fetch",url:e,requestId:En,referrer:t.referrer,headers:t.headers}),a}}async function Rn(e,t){const n=await Un({method:"singlefile.fetchFrame",url:e,frameId:t.frameId,referrer:t.referrer,headers:t.headers});return{status:n.status,headers:new Map(n.headers),arrayBuffer:async()=>new Uint8Array(n.array).buffer}}async function Un(e){const t=await browser.runtime.sendMessage(e);if(!t||t.error)throw new Error(t&&t.error&&t.error.toString());return t}function Ln(e){return new Promise(((t,n)=>{var a,r,o,s;a=new CustomEvent("single-filez-request-fetch",{detail:e}),window.dispatchEvent(a),r=Tn,o=function a(r){var o,s,i;r.detail?r.detail.url==e&&(o=Tn,s=a,i=!1,window.removeEventListener(o,s,i),r.detail.response?t({status:r.detail.status,headers:new Map(r.detail.headers),arrayBuffer:async()=>r.detail.response}):n(r.detail.error)):n()},s=!1,window.addEventListener(r,o,s)}))}function Wn(e,t){return xn(e,t)}browser.runtime.onMessage.addListener((e=>"singlefile.fetchFrame"==e.method&&window.frameId&&window.frameId==e.frameId?async function(e){try{let t=await An(e.url,{cache:"force-cache",headers:e.headers});return 401!=t.status&&403!=t.status&&404!=t.status||(t=await Promise.race([Ln(e.url),new Promise(((e,t)=>setTimeout((()=>t()),5e3)))])),{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){let t=Pn.get(e.requestId);if(t){const n=t.parser.next(e.data);if(n.done){Pn.delete(e.requestId);const a=n.value;a.error?t.reject(new Error(a.error)):t.resolve({status:a.status,headers:{get:e=>a.headers&&a.headers[e]},arrayBuffer:async()=>a.array.buffer})}}return{}}(e):void 0));const Bn="Could not establish connection. Receiving end does not exist.",Cn="The message port closed before a response was received.",On="Message manager disconnected",jn="Cannot access contents of url ",Dn="pending",_n="processing",Nn=["lib/single-file-extension-infobar.js","lib/single-file-extension.js"],Fn=[];let qn,zn=0;var Hn;async function Gn(){return browser.tabs.create({active:!0,url:"/src/extension/ui/pages/batch-save-urls.html"})}async function Jn(e,t={}){await Kn(),await Promise.all(e.map((async e=>{const n=await A(e);Object.keys(t).forEach((e=>n[e]=t[e])),n.autoClose=!0,n.extensionScriptFiles=Nn,n.passReferrerOnError&&await Te(),Xn({tab:{url:e},status:Dn,options:n,method:"content.save"})}))),Vn()}async function $n(e,t={}){await Kn(),await Promise.all(e.map((async e=>{const n=e.id,a=await A(e.url);Object.keys(t).forEach((e=>a[e]=t[e])),a.tabId=n,a.tabIndex=e.index,a.extensionScriptFiles=Nn,a.passReferrerOnError&&await Te();const r={id:e.id,index:e.index,url:e.url,title:e.title};if(t.autoSave){if(L(e)){Zn(Xn({status:_n,tab:r,options:a,method:"content.autosave"}))}}else{wn(n,1);await Wn(n,a)||pe(e)?(wn(n,2),Xn({status:Dn,tab:r,options:a,method:"content.save"})):mn(e)}}))),Vn()}function Xn(e){const t={id:zn,status:e.status,tab:e.tab,options:e.options,method:e.method,done:function(){Fn.splice(Fn.findIndex((e=>e.id==this.id)),1),Vn()}};return Fn.push(t),zn++,t}async function Kn(){qn||(qn=(await k()).maxParallelWorkers)}function Vn(){const e=Fn.filter((e=>e.status==_n)).length;for(let t=0;te.status==Dn));e&&Zn(e)}}async function Zn(e){const t=e.id;if(e.status=_n,!e.tab.id){let t;try{const n=await async function(e){const t=await browser.tabs.create(e);return new Promise(((e,n)=>{function a(n,o){n==t.id&&"complete"==o.status&&(e(t),browser.tabs.onUpdated.removeListener(a),browser.tabs.onRemoved.removeListener(r))}function r(e){e==t.id&&(n(e),browser.tabs.onRemoved.removeListener(r))}browser.tabs.onUpdated.addListener(a),browser.tabs.onRemoved.addListener(r)}))}({url:e.tab.url,active:!1});e.tab.id=e.options.tabId=n.id,e.tab.index=e.options.tabIndex=n.index,wn(e.tab.id,1),t=await Wn(e.tab.id,e.options)}catch(t){e.tab.id=t}if(!t)return void e.done();wn(e.tab.id,2)}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==Cn||e.message==Bn||e.message==On||e.message.startsWith(jn+JSON.stringify(be))}(t)||(console.log(t.message?t.message:t),bn(e.tab.id,t.message),e.done())}}function Qn(e){const t=Fn.find((t=>t.id==e));t&&(t.options.autoClose&&!t.cancelled&&browser.tabs.remove(t.tab.id),t.done())}function Yn(e,t){const n=Fn.find((t=>t.id==e));n&&(n.cancel=t)}function ea(e){Array.from(Fn).filter((t=>t.tab.id==e&&!t.options.autoSave)).forEach(na)}function ta(e){return Fn.find((t=>t.id==e))}function na(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&&yn(t,!0),function(e){Je(e)}(e.tab),e.done()}function aa(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}}Hn={isSavingTab:function(e){return Boolean(Fn.find((t=>t.tab.id==e.id)))},saveTabs:$n,saveUrls:Jn,cancelTab:ea,openEditor:function(e){browser.tabs.sendMessage(e.id,{method:"content.openEditor"})},saveSelectedLinks:async function(e){const t={extensionScriptFiles:Nn,tabId:e.id,tabIndex:e.index};if(await Wn(e.id,t)){const t=await browser.tabs.sendMessage(e.id,{method:"content.getSelectedLinks"});if(t.urls&&t.urls.length){const e=await Gn(),n=(a,r)=>{"complete"==r.status&&a==e.id&&(browser.tabs.onUpdated.removeListener(n),browser.tabs.sendMessage(e.id,{method:"newUrls.addURLs",urls:t.urls}))};browser.tabs.onUpdated.addListener(n)}}else mn(e)},batchSaveUrls:Gn},function(e){Qt=e}(Hn),function(e){ze=e}(Hn),function(e){dn=e}(Hn);const ra=new Set;async function oa(e){return e.method.endsWith(".saveCreatedBookmarks")?(sa(),{}):e.method.endsWith(".disable")?(async function(){let e;const t=await T();Object.keys(t).forEach((n=>e=e||!t[n].saveCreatedBookmarks)),e&&(browser.bookmarks.onCreated.removeListener(ia),browser.bookmarks.onMoved.removeListener(ca))}(),{}):void 0}async function sa(){try{browser.bookmarks.onCreated.removeListener(ia),browser.bookmarks.onMoved.removeListener(ca)}catch(e){}let e;const t=await T();Object.keys(t).forEach((n=>{t[n].saveCreatedBookmarks&&(e=!0)})),e&&(browser.bookmarks.onCreated.addListener(ia),browser.bookmarks.onMoved.addListener(ca))}async function ia(e,t){ra.add(e),await la(e,t.url,t)}async function ca(e,t){if(ra.has(e)){const n=await browser.bookmarks.get(e);n[0]&&await la(e,n[0].url,t)}}async function la(e,t,n){const a=await browser.tabs.query({lastFocusedWindow:!0,active:!0}),r=await A(t);if(r.saveCreatedBookmarks){const s=await async function e(t,n=[]){if(t){const a=(await browser.bookmarks.get(t))[0];a&&a.title&&(n.unshift(a.title),await e(a.parentId,n))}return n}(n.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(a.length&&a[0].url==t)ra.delete(e),$n(a,{bookmarkId:e,bookmarkFolders:s});else{const n=await browser.tabs.query({});if(n.length){const a=n.find((e=>e.url==t));a?(ra.delete(e),$n([a],{bookmarkId:e,bookmarkFolders:s})):t&&("about:blank"==t?browser.bookmarks.onChanged.addListener((function t(n,a){n==e&&a.url&&(browser.bookmarks.onChanged.removeListener(t),o(a.url))})):o(t))}}}function o(t){ra.delete(e),Jn([t],{bookmarkId:e})}}Promise.resolve().then(sa);const da="https://oauth2.googleapis.com/token",ua="https://www.googleapis.com/drive/v3/files";let fa,ha=!0;class ma{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=ka(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),ga(this)}}async function wa(e,t){const n=await fetch(da,{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()}),a=await va(n);return e.accessToken=a.access_token,e.refreshToken=a.refresh_token,e.expirationDate=Date.now()+1e3*a.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function ba(e={}){return Boolean(browser.identity&&browser.identity.getAuthToken)&&!e.forceWebAuthFlow}async function pa(e,t,n=!0){const a=t.split("/");a.pop();const r=e.folderIds.get(a.join("/"));if(r)return r;let o="root";if(a.length){let r="";for(const s of a){r&&(r+="/"),r+=s;const a=e.folderIds.get(r);if(a)o=a;else try{o=await ya(e,s,o),e.folderIds.set(r,o)}catch(a){if("path_not_found"==a.message&&n)return e.folderIds.clear(),pa(e,t,!1);throw a}}}return o}async function ya(e,t,n){const a=await async function(e,t,n){return va(await fetch(ua+"?q=mimeType = 'application/vnd.google-apps.folder' and name = '"+t+"' and trashed != true and '"+n+"' in parents",{headers:{Authorization:"Bearer "+e.accessToken}}))}(e,t,n);if(a.files.length)return a.files[0].id;{const a=await async function(e,t,n){return va(await fetch(ua,{method:"POST",headers:{Authorization:"Bearer "+e.accessToken,"Content-Type":"application/json"},body:JSON.stringify({name:t,parents:[n],mimeType:"application/vnd.google-apps.folder"})}))}(e,t,n);return a.id}}async function ga(e){let t=e.file,n=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(n=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,n));const a=await fetch(e.url,{method:"PUT",headers:{Authorization:"Bearer "+e.token,"Content-Type":e.contentType,"Content-Range":"bytes "+e.offset+"-"+(n-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==a.status||201==a.status)return a.json();if(308==a.status){const t=a.headers.get("Range");if(t&&(e.offset=parseInt(t.match(/\d+/g).pop(),10)+1),e.cancelled)throw new Error("upload_cancelled");return ga(e)}ka(a)}async function va(e){e=ka(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function ka(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+")")}async function Ia(e,t,n,a,r,o){for(;fa;)await fa;const s=new AbortController;return fa=(async()=>{try{await async function({path:r,blob:o,message:s=""},i){try{const c=await function(e){return new Promise(((t,n)=>{const a=new FileReader;a.onloadend=()=>t(a.result.match(/^data:[^,]+,(.*)$/)[1]),a.onerror=e=>n(e.detail),a.readAsDataURL(e)}))}(o),l=await fetch(`https://api.github.com/repos/${t}/${n}/contents/${r.replace(/#/g,"%23")}`,{method:"PUT",headers:new Map([["Authorization",`token ${e}`],["Accept","application/vnd.github.v3+json"]]),body:JSON.stringify({content:c,message:s,branch:a}),signal:i}),d=await l.json();if(l.status<400)return d;throw new Error(d.message)}catch(e){if("AbortError"!=e.name)throw e}}({path:r,blob:o},s.signal)}finally{fa=null}})(),{cancelPush:()=>s.abort(),pushPromise:fa}}const xa=new Map,Sa=/([{}()^$&.*?/+|[\\\\]|\]|-)/g,Ta=browser.runtime.getManifest(),Aa=Ta.optional_permissions&&Ta.optional_permissions.includes("identity"),Ea=new class{constructor(e,t,n){this.clientId=e,this.clientKey=t,this.scopes=n,this.folderIds=new Map,setInterval((()=>this.folderIds.clear()),6e4)}async auth(e={interactive:!0}){if(e.requestPermissionIdentity&&ha)try{await browser.permissions.request({permissions:["identity"]}),ha=!1}catch(e){}return ba(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?wa(this,e):async function(e,t){let n;try{if(browser.identity&&browser.identity.launchWebAuthFlow&&!t.forceWebAuthFlow){const n=await browser.identity.launchWebAuthFlow({interactive:t.interactive,url:e.authURL});return t.code=new URLSearchParams(new URL(n).search).get("code"),await wa(e,t)}if(t.launchWebAuthFlow)return t.extractAuthCode(browser.identity.getRedirectURL()).then((e=>n=e)).catch((()=>{})),await t.launchWebAuthFlow({url:e.authURL});throw new Error("auth_not_supported")}catch(a){if(a.message&&("code_required"==a.message||a.message.includes("access"))){if(n)return t.code=n,await wa(e,t);throw new Error("code_required")}throw a}}(this,e))}setAuthInfo(e,t){ba(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(da,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token"});if(400==e.status)throw new Error("unknown_token");const t=await va(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}}}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 va(t)}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,n,a=!0){const r=await pa(this,e),o=e.split("/").pop(),s=new ma({token:this.accessToken,file:t,parents:[r],filename:o,onProgress:n.onProgress});try{return{cancelUpload:()=>s.cancelled=!0,uploadPromise:s.upload()}}catch(r){if("path_not_found"==r.message&&a)return this.folderIds.clear(),this.upload(e,t,n,!1);throw r}}}("207618107333-h1220p1oasj3050kr5r416661adm091a.apps.googleusercontent.com","VQJ8Gq8Vxx72QyxPyeLtWvUt",["https://www.googleapis.com/auth/drive.file"]);async function Pa(e,t){if(e.method.endsWith(".download"))return async function(e,t){const n=t.id;let a=xa.get(n);a||(a=Q(),xa.set(n,a));let r=a.next(e.data);if(r.done){let e;const a=r.value;if(xa.delete(n),a.backgroundSave&&!a.saveToGDrive){const t=await La(a.filename,a);a.filenameConflictAction=t.filenameConflictAction,e=t.skipped}if(e)yn(n);else{const e=a.pageData,r=await singlefile.processors.compression.process(e,{insertTextBody:a.insertTextBody,url:e.url||t.url,createRootDirectory:a.createRootDirectory,tabId:n,selfExtractingArchive:a.selfExtractingArchive,insertCanonicalLink:a.insertCanonicalLink,insertMetaNoIndex:a.insertMetaNoIndex,password:a.password});a.openEditor?(pn(t.id),await async function({tabIndex:e,content:t,filename:n}){const a={active:!0,url:he};null!=e&&(a.index=e);const r=await browser.tabs.create(a);me.set(r.id,{content:t,filename:n})}({tabIndex:t.index+1,filename:a.filename,content:new Uint8Array(await r.arrayBuffer())})):await async function(e,t,n,a){try{a.saveToGDrive?await(await Ua(a.taskId,a.filename,e,{forceWebAuthFlow:a.forceWebAuthFlow},{onProgress:(e,n)=>gn(t,e,n)})).uploadPromise:a.saveToGitHub?await(await Ra(a.taskId,a.filename,e,a.githubToken,a.githubUser,a.githubRepository,a.githubBranch)).pushPromise:a.backgroundSave?(a.url=URL.createObjectURL(e),await Wa(a,{confirmFilename:a.confirmFilename,incognito:n,filenameConflictAction:a.filenameConflictAction,filenameReplacementCharacter:a.filenameReplacementCharacter,bookmarkId:a.bookmarkId,replaceBookmarkURL:a.replaceBookmarkURL})):await async function(e,t,n,a){const r=q({filename:t,taskId:e,content:await n.arrayBuffer()});for(const e of r){const t={method:"content.download",data:Array.from(e)};await browser.tabs.sendMessage(a,t)}}(a.taskId,a.filename,e,t),yn(t)}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),bn(t,e.message))}finally{a.url&&URL.revokeObjectURL(a.url)}}(r,n,t.incognito,a)}}return{}}(e,t.tab);if(e.method.endsWith(".disableGDrive")){const e=await M();return U(),await Ea.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}return e.method.endsWith(".end")?(Qn(e.taskId),{}):e.method.endsWith(".getInfo")?Fn.map(aa):e.method.endsWith(".cancel")?(n=e.taskId,na(Fn.find((e=>e.id==n))),{}):e.method.endsWith(".cancelAll")?(Array.from(Fn).forEach(na),{}):e.method.endsWith(".saveUrls")?(Jn(e.urls),{}):void 0;var n}async function Ma(e,t){let n=await M();const a={interactive:!0,forceWebAuthFlow:e.forceWebAuthFlow,requestPermissionIdentity:Aa,launchWebAuthFlow:e=>async function(e){const t=await browser.tabs.create({url:e.url,active:!0});return new Promise(((e,n)=>{browser.tabs.onRemoved.addListener((function e(a){a==t.id&&(browser.tabs.onRemoved.removeListener(e),n(new Error("code_required")))}))}))}(e),extractAuthCode:e=>function(e){return new Promise(((t,n)=>{browser.tabs.onUpdated.addListener((function a(r,o){if(o&&o.url.startsWith(e)){browser.tabs.onUpdated.removeListener(a);const e=new URLSearchParams(new URL(o.url).search).get("code");e?(browser.tabs.remove(r),t(e)):n()}}))}))}(e)};return Ea.setAuthInfo(n,a),n&&n.accessToken&&!t||(n=await Ea.auth(a),n?await R(n):await U()),n}async function Ra(e,t,n,a,r,o,s){const i=ta(e);if(!i||!i.cancelled){const i=Ia(a,r,o,s,t,n);Yn(e,i.cancelPush);try{return await(await i).pushPromise,i}catch(e){throw new Error(e.message+" (GitHub)")}}}async function Ua(e,t,n,a,r){try{await Ma(a);const o=ta(e);if(!o||!o.cancelled){const a=await Ea.upload(t,n,r);return Yn(e,a.cancelUpload),a}}catch(o){if("invalid_token"!=o.message)throw new Error(o.message+" (Google Drive)");{let o;try{o=await Ea.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Google Drive)");o=await Ma(a,!0)}o?await R(o):await U(),await Ua(e,t,n,a,r)}}}async function La(e,t){let n,a=t.filenameConflictAction;if("skip"==a){(await browser.downloads.search({filenameRegex:"(\\\\|/)"+(r=e,r.replace(Sa,"\\$1")+"$"),exists:!0})).length?n=!0:a="uniquify"}var r;return{skipped:n,filenameConflictAction:a}}async function Wa(t,n){const a={url:t.url,saveAs:n.confirmFilename,filename:t.filename,conflictAction:n.filenameConflictAction};n.incognito&&(a.incognito=!0);const r=await e(a,n.filenameReplacementCharacter);r.filename&&t.bookmarkId&&t.replaceBookmarkURL&&(r.filename.startsWith("file:")||(r.filename.startsWith("/")&&(r.filename=r.filename.substring(1)),r.filename="file:///"+r.filename.replace(/#/g,"%23")),await async function(e,t){try{await browser.bookmarks.update(e,t)}catch(e){}}(t.bookmarkId,{url:r.filename}))}const Ba={},Ca={};async function Oa(e,t){if("enableAutoSave"==e.method){const n=await i(t.id);n[t.id].autoSave=e.enabled,await c(n),async function(e){Promise.all([nn(e),Xe(e)])}(t)}if("isAutoSaveEnabled"==e.method)return L(t)}async function ja(e,t){const n=t.id,a=await A(t.url,!0);if(a){let r;wn(n,1,!0),a.content=e.content,a.url=e.url,a.frames=e.frames,a.canvases=e.canvases,a.fonts=e.fonts,a.stylesheets=e.stylesheets,a.images=e.images,a.posters=e.posters,a.videos=e.videos,a.usedFonts=e.usedFonts,a.shadowRoots=e.shadowRoots,a.imports=e.imports,a.referrer=e.referrer,a.updatedResources=e.updatedResources,a.visitDate=new Date(e.visitDate),a.backgroundTab=!0,a.autoSave=!0,a.incognito=t.incognito,a.tabId=n,a.tabIndex=t.index;try{let o;if(r=await function(e,t,n,a={fetch:Mn,frameFetch:Rn}){return globalThis.singlefile.getPageData(e,a,t,n)}(a,null,null,{fetch:Da}),!a.saveToGDrive){const e=await La(r.filename,a);o=e.skipped,a.filenameConflictAction=e.filenameConflictAction}if(!o){a.includeInfobar&&(r.content+=await infobar.getScript());const o=await singlefile.processors.compression.process(r,{insertTextBody:a.insertTextBody,url:t.url,createRootDirectory:a.createRootDirectory,tabId:n,selfExtractingArchive:a.selfExtractingArchive,insertCanonicalLink:a.insertCanonicalLink,insertMetaNoIndex:a.insertMetaNoIndex,password:a.password});a.saveToGDrive?await(await Ua(e.taskId,r.filename,o,a,{})).uploadPromise:a.saveToGitHub?await(await Ra(e.taskId,r.filename,o,a.githubToken,a.githubUser,a.githubRepository,a.githubBranch)).pushPromise:(r.url=URL.createObjectURL(o),await Wa(r,a))}}finally{e.taskId?Qn(e.taskId):a.autoClose&&(browser.tabs.remove(Ca[n]||n),delete Ca[n]),r&&r.url&&URL.revokeObjectURL(r.url),yn(n,!0)}}}function Da(e,t={}){return new Promise(((n,a)=>{const r=new XMLHttpRequest;if(r.withCredentials=!0,r.responseType="arraybuffer",r.onerror=e=>a(new Error(e.detail)),r.onreadystatechange=()=>{r.readyState==XMLHttpRequest.DONE&&n({status:r.status,headers:{get:e=>r.getResponseHeader(e)},arrayBuffer:async()=>r.response})},r.open("GET",e,!0),t.headers)for(const e of Object.entries(t.headers))r.setRequestHeader(e[0],e[1]);r.send()}))}async function _a(e,t){if(e.method.endsWith(".init")&&(await async function(e,t){await o(e.id);const n=await i(e.id);n[e.id].savedPageDetected=t.savedPageDetected,await c(n)}(t.tab,e),rn(t.tab),function(e){ea(e.id)}(t.tab),async function(e){const[t,n]=await Promise.all([A(e.url,!0),L(e)]);t&&(t.autoSaveLoad||t.autoSaveLoadOrUnload)&&n&&$n([e],{autoSave:!0})}(t.tab)),e.method.endsWith(".getOptions"))return A(e.url);e.method.endsWith(".activate")&&await browser.tabs.update(e.tabId,{active:!0})}browser.tabs.onCreated.addListener((e=>function(e){!function(e){rn(e)}(e)}(e))),browser.tabs.onActivated.addListener((e=>async function(e){vn(await browser.tabs.get(e.tabId))}(e))),browser.tabs.onRemoved.addListener((e=>function(e){o(e),function(e){me.delete(e)}(e),ea(e),async function(e){const t=Ba[e];t?t.autoSaveRemove&&(delete Ba[e],await ja(t,t.tab)):Ba[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 Ba[e]}(e);const t=await browser.tabs.get(e);if(pe(t)){const e=await i(t.id);e[t.id].editorDetected=!0,await c(e),vn(t)}}t.discarded&&async function(e){const t=Ba[e];t?(delete Ba[e],await ja(t,t.tab)):Ba[e]={discarded:!0}}(e)}(e,t))),browser.tabs.onReplaced.addListener(((e,t)=>function(e,t){(async function(e,t){let a=await i();await r(a,e,t),c(a),await r(n,e,t)})(e,t),async function(e,t){Ba[t]&&!Ba[e]&&(Ba[e]=Ba[t],delete Ba[t],Ca[t]=e)}(e,t),function(e,t){Fn.forEach((n=>{n.tab.id==t&&(n.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 Na=new Map;function Fa(e,t){e.delete(t)}browser.runtime.onMessage.addListener(((e,t)=>{if("singlefile.lazyTimeout.setTimeout"==e.method){let n,a=Na.get(t.tab.id);if(a)if(n=a.get(t.frameId),n){const t=n.get(e.type);t&&clearTimeout(t)}else n=new Map;const r=setTimeout((async()=>{try{const n=Na.get(t.tab.id),a=n.get(t.frameId);n&&a&&Fa(a,e.type),await browser.tabs.sendMessage(t.tab.id,{method:"singlefile.lazyTimeout.onTimeout",type:e.type})}catch(e){}}),e.delay);return a||(a=new Map,n=new Map,a.set(t.frameId,n),Na.set(t.tab.id,a)),n.set(e.type,r),Promise.resolve({})}if("singlefile.lazyTimeout.clearTimeout"==e.method){let n=Na.get(t.tab.id);if(n){const a=n.get(t.frameId);if(a){const t=a.get(e.type);t&&clearTimeout(t),Fa(a,e.type)}}return Promise.resolve({})}})),browser.tabs.onRemoved.addListener((e=>Na.delete(e))),browser.runtime.onMessage.addListener(((e,t)=>e.method.startsWith("tabs.")?_a(e,t):e.method.startsWith("downloads.")?Pa(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,Ba[t.tab.id]=e):Ba[e.tabId]&&(Ba[e.tabId].removed&&e.autoSaveRemove||Ba[e.tabId].discarded&&e.autoSaveDiscard)&&(delete Ba[e.tabId],await ja(e,{id:e.tabId,index:e.tabIndex,url:t.url})),e.autoSaveUnload&&(delete Ba[e.tabId],await ja(e,t.tab))):(delete Ba[e.tabId],await ja(e,t.tab)),{}}(e,t):e.method.startsWith("ui.")?hn(e,t):e.method.startsWith("config.")?S(e):e.method.startsWith("tabsData.")?function(e){return e.method.endsWith(".get")?i():e.method.endsWith(".set")?c(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,n=me.get(e.id);if(n){const t=q({tabData:n,options:await A(n.url)});for(const n of t)await browser.tabs.sendMessage(e.id,{method:"editor.setTabData",data:Array.from(n)})}return{}}if(e.method.endsWith(".open")){const n=t.tab;let a=we.get(n.id);a||(a=Q(),we.set(n.id,a));const r=a.next(e.data);if(r.done){const e={url:he};await browser.tabs.update(n.id,e),me.set(n.id,{url:n.url,content:r.value.content,filename:r.value.filename})}return{}}}(e,t):e.method.startsWith("bookmarks.")?oa(e):e.method.startsWith("requests.")?xe(e):e.method.startsWith("bootstrap.")?async function(e,t){if(e.method.endsWith(".init")){const[e,n,a]=await Promise.all([A(t.tab.url,!0),A(t.tab.url),L(t.tab)]);return{optionsAutoSave:e,options:n,autoSaveEnabled:a,tabId:t.tab.id,tabIndex:t.tab.index}}}(e,t):void 0)),browser.runtime.onMessageExternal&&browser.runtime.onMessageExternal.addListener((async(e,t)=>{const n=(await browser.tabs.query({currentWindow:!0,active:!0}))[0];return!!n&&Oa(e,n)}))}(); +!function(){"use strict";async function e(t,n){let a;try{a=await browser.downloads.download(t)}catch(a){if(a.message){const r=a.message.toLowerCase(),o=r.includes("illegal characters")||r.includes("invalid filename");if(o&&t.filename.startsWith("."))return t.filename=n+t.filename,e(t,n);if(o&&t.filename.includes(","))return t.filename=t.filename.replace(/,/g,n),e(t,n);if(o&&!t.filename.match(/^[\x00-\x7F]+$/))return t.filename=t.filename.replace(/[^\x00-\x7F]+/g,n),e(t,n);if((r.includes("'incognito'")||r.includes('"incognito"'))&&t.incognito)return delete t.incognito,e(t,n);if("conflictaction prompt not yet implemented"==r&&t.conflictAction)return delete t.conflictAction,e(t,n);if(r.includes("canceled"))return{};throw a}throw a}return new Promise(((e,t)=>{browser.downloads.onChanged.addListener((function n(r){r.id==a&&r.state&&("complete"==r.state.current&&(browser.downloads.search({id:a}).then((t=>e({filename:t[0]&&t[0].filename}))).catch((()=>e({}))),browser.downloads.onChanged.removeListener(n)),"interrupted"==r.state.current&&(r.error&&"USER_CANCELED"==r.error.current?e({}):t(new Error(r.state.current)),browser.downloads.onChanged.removeListener(n)))}))}))}let t,n,a;async function r(e,t,n){e[n]&&!e[t]&&(e[t]=e[n],delete e[n])}async function o(e){n&&delete n[e];const t=await i();if(t[e]){const n=t[e].autoSave;t[e]={autoSave:n},await c(t)}}function s(e){return n||(n={}),void 0===e||n[e]||(n[e]={}),n}async function i(e){if(!t){const e=await browser.storage.local.get();t=e.tabsData||{}}return async function(){if(!a){a=!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((()=>i().then((e=>t=e))),0);const l="-",d="__Default_Settings__",u="__Disabled_Settings__",f="regexp:",h={removeHiddenElements:!0,removeUnusedStyles:!0,removeUnusedFonts:!0,removeFrames:!1,removeImports:!0,compressHTML:!0,compressCSS:!1,loadDeferredImages:!0,loadDeferredImagesMaxIdleTime:1500,loadDeferredImagesBlockCookies:!1,loadDeferredImagesBlockStorage:!1,loadDeferredImagesKeepZoomLevel:!1,loadDeferredImagesDispatchScrollEvent:!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:"_",contextMenuEnabled:!0,tabMenuEnabled:!0,browserActionMenuEnabled:!0,shadowEnabled:!0,logsEnabled:!0,progressBarEnabled:!0,maxResourceSizeEnabled:!1,maxResourceSize:10,displayInfobar:!0,displayStats:!1,backgroundSave:!/Mobile.*Firefox/.test(navigator.userAgent),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,saveRawPage:!1,saveToGDrive:!1,saveToGitHub:!1,githubToken:"",githubUser:"",githubRepository:"SingleFileZ-Archives",githubBranch:"main",forceWebAuthFlow:!1,insertTextBody:!0,resolveFragmentIdentifierURLs:!1,userScriptEnabled:!1,openEditor:!1,openSavedPage:!1,autoOpenEditor:!1,saveCreatedBookmarks:!1,allowedBookmarkFolders:[],ignoredBookmarkFolders:[],replaceBookmarkURL:!0,saveFavicon:!0,includeBOM:!1,warnUnsavedPage:!0,createRootDirectory:!1,selfExtractingArchive:!0,insertMetaNoIndex:!1,insertMetaCSP:!0,passReferrerOnError:!1,password:"",insertSingleFileComment:!0,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,blockImages:!1,blockStylesheets:!1,blockFont:!1,blockScripts:!0,blockVideos:!0,blockAudios:!0},m=[{url:"file:",profile:"__Default_Settings__",autoSaveProfile:"__Disabled_Settings__"}];let w,b=p();async function p(){const{sync:e}=await browser.storage.local.get();w=e?browser.storage.sync:browser.storage.local;const t=await w.get();if(t.profiles)t.rules||(t.rules=m),Object.keys(t.profiles).forEach((e=>y(t.profiles[e]))),await w.remove(["profiles","rules"]),await w.set({profiles:t.profiles,rules:t.rules});else{const e=t;delete e.tabsData,y(e);const n={profiles:{},rules:m};n.profiles.__Default_Settings__=e,w.remove(Object.keys(h)),await w.set(n)}t.maxParallelWorkers||await w.set({maxParallelWorkers:navigator.hardwareConcurrency||4})}function y(e){g(e,"blockScripts","removeScripts"),g(e,"blockVideos","removeVideoSrc"),g(e,"blockAudios","removeAudioSrc"),Object.keys(h).forEach((t=>function(e,t){void 0===e[t]&&(e[t]=h[t])}(e,t)))}function g(e,t,n){void 0===e[t]&&void 0!==e[n]&&(e[t]=e[n],delete e[n])}async function v(e,t){const n=await k(),a=n.rules.filter((e=>x(e)));let r=a.sort(I).find((t=>e&&e.match(new RegExp(t.url.split(f)[1]))));if(!r){const a=n.rules.filter((e=>!x(e)));r=a.sort(I).find((n=>!t&&"*"==n.url||e&&e.includes(n.url)))}return r}async function k(){return await b,w.get(["profiles","rules","maxParallelWorkers"])}function I(e,t){return t.url.length-e.url.length}function x(e){return e.url.toLowerCase().startsWith(f)}async function S(t){if(t.method.endsWith(".deleteRules")&&await async function(e){const t=await k();t.rules=t.rules=e?t.rules.filter((t=>t.autoSaveProfile!=e&&t.profile!=e)):[],await w.set({rules:t.rules})}(t.profileName),t.method.endsWith(".deleteRule")&&await async function(e){if(!e)throw new Error("URL is empty");const t=await k();t.rules=t.rules.filter((t=>t.url!=e)),await w.set({rules:t.rules})}(t.url),t.method.endsWith(".addRule")&&await E(t.url,t.profileName,t.autoSaveProfileName),t.method.endsWith(".createProfile")&&await async function(e,t){const n=await k();if(Object.keys(n.profiles).includes(e))throw new Error("Duplicate profile name");n.profiles[e]=JSON.parse(JSON.stringify(n.profiles[t])),await w.set({profiles:n.profiles})}(t.profileName,t.fromProfileName||d),t.method.endsWith(".renameProfile")&&await async function(e,t){const[n,a]=await Promise.all([k(),i()]);if(!Object.keys(n.profiles).includes(e))throw new Error("Profile not found");if(Object.keys(n.profiles).includes(t))throw new Error("Duplicate profile name");if(e==d)throw new Error("Default settings cannot be renamed");a.profileName==e&&(a.profileName=t,await c(a));n.profiles[t]=n.profiles[e],n.rules.forEach((n=>{n.profile==e&&(n.profile=t),n.autoSaveProfile==e&&(n.autoSaveProfile=t)})),delete n.profiles[e],await w.set({profiles:n.profiles,rules:n.rules})}(t.profileName,t.newProfileName),t.method.endsWith(".deleteProfile")&&await async function(e){const[t,n]=await Promise.all([k(),i()]);if(!Object.keys(t.profiles).includes(e))throw new Error("Profile not found");if(e==d)throw new Error("Default settings cannot be deleted");n.profileName==e&&(delete n.profileName,await c(n));t.rules.forEach((t=>{t.profile==e&&(t.profile=d),t.autoSaveProfile==e&&(t.autoSaveProfile=d)})),delete t.profiles[e],await w.set({profiles:t.profiles,rules:t.rules})}(t.profileName),t.method.endsWith(".resetProfiles")&&await async function(){await b;const e=await i();delete e.profileName,await c(e),await w.remove(["profiles","rules","maxParallelWorkers"]),await browser.storage.local.set({sync:!1}),w=browser.storage.local,await p()}(),t.method.endsWith(".resetProfile")&&await async function(e){const t=await k();if(!Object.keys(t.profiles).includes(e))throw new Error("Profile not found");t.profiles[e]=h,await w.set({profiles:t.profiles})}(t.profileName),t.method.endsWith(".importConfig")&&await async function(e){await w.remove(["profiles","rules","maxParallelWorkers"]),await w.set({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers}),await p()}(t.config),t.method.endsWith(".updateProfile")&&await async function(e,t){const n=await k();if(!Object.keys(n.profiles).includes(e))throw new Error("Profile not found");Object.keys(t).forEach((a=>n.profiles[e][a]=t[a])),await w.set({profiles:n.profiles})}(t.profileName,t.profile),t.method.endsWith(".updateRule")&&await P(t.url,t.newUrl,t.profileName,t.autoSaveProfileName),t.method.endsWith(".getConstants"))return{DISABLED_PROFILE_NAME:u,DEFAULT_PROFILE_NAME:d,CURRENT_PROFILE_NAME:l};if(t.method.endsWith(".getRules"))return async function(){return(await k()).rules}();if(t.method.endsWith(".getProfiles"))return T();if(t.method.endsWith(".exportConfig"))return async function(){const t=await k(),n=URL.createObjectURL(new Blob([JSON.stringify({profiles:t.profiles,rules:t.rules,maxParallelWorkers:t.maxParallelWorkers},null,2)],{type:"text/json"})),a={url:n,filename:`singlefilez-settings-${(new Date).toISOString().replace(/:/g,"_")}.json`,saveAs:!0};try{await e(a,"_")}finally{URL.revokeObjectURL(n)}}();if(t.method.endsWith(".enableSync")){await browser.storage.local.set({sync:!0});const e=await browser.storage.sync.get();if(!e||!e.profiles){const e=await browser.storage.local.get();await browser.storage.sync.set({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers})}return w=browser.storage.sync,{}}if(t.method.endsWith(".disableSync")){await browser.storage.local.set({sync:!1});const e=await browser.storage.sync.get();e&&e.profiles&&await browser.storage.local.set({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers}),w=browser.storage.local}return t.method.endsWith(".isSync")?{sync:(await browser.storage.local.get()).sync}:{}}async function T(){return(await k()).profiles}async function A(e,t){const[n,a,r]=await Promise.all([k(),v(e),i()]),o=r.profileName||d;let s;if(a){const e=a[t?"autoSaveProfile":"profile"];s=e==l?o:e}else s=o;return Object.assign({profileName:s},n.profiles[s])}async function E(e,t,n){if(!e)throw new Error("URL is empty");const a=await k();if(a.rules.find((t=>t.url==e)))throw new Error("URL already exists");a.rules.push({url:e,profile:t,autoSaveProfile:n}),await w.set({rules:a.rules})}async function P(e,t,n,a){if(!e||!t)throw new Error("URL is empty");const r=await k(),o=r.rules.find((t=>t.url==e));if(!o)throw new Error("URL not found");if(r.rules.find((n=>n.url==t&&n.url!=e)))throw new Error("New URL already exists");o.url=t,o.profile=n,o.autoSaveProfile=a,await w.set({rules:r.rules})}async function M(){return(await w.get()).authInfo}async function R(e){await w.set({authInfo:e})}async function U(){let e=M();e.revokableAccessToken?R({revokableAccessToken:e.revokableAccessToken}):await w.remove(["authInfo"])}async function L(e){if(e){const[t,n]=await Promise.all([i(),v(e.url)]);return Boolean(t.autoSaveAll||t.autoSaveUnpinned&&!e.pinned||t[e.id]&&t[e.id].autoSave)&&(!n||n.autoSaveProfile!=u)}}const W=[0],B=Symbol(),C=new TextEncoder,O=new TextDecoder,j=new Array(256);let D=0;function _(e,t,n,a){if(void 0===a){if(D++,!(j.length-D>=W.length))throw new Error("Reached maximum number of custom types");j[j.length-D]={serialize:e,parse:t,test:n}}else j[a]={serialize:e,parse:t,test:n}}_((function*(e,t){const n=e.objects.indexOf(t);yield*z(e,n)}),(function*(e){const t=yield*Y(e);return new K(t,e)}),re,0),_(null,(function*(){return{}}),se),_(H,ee,ie),_(G,te,(function(e){return"string"==typeof e})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(8*t);return new Float64Array(n.buffer)}),(function(e){return e instanceof Float64Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(4*t);return new Float32Array(n.buffer)}),(function(e){return e instanceof Float32Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(4*t);return new Uint32Array(n.buffer)}),(function(e){return e instanceof Uint32Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(4*t);return new Int32Array(n.buffer)}),(function(e){return e instanceof Int32Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(2*t);return new Uint16Array(n.buffer)}),(function(e){return e instanceof Uint16Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(2*t);return new Int16Array(n.buffer)}),(function(e){return e instanceof Int16Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(t);return new Uint8ClampedArray(n.buffer)}),(function(e){return e instanceof Uint8ClampedArray})),_(J,(function*(e){const t=yield*Y(e);return yield*e.consume(t)}),(function(e){return e instanceof Uint8Array})),_(J,(function*(e){const t=yield*Y(e),n=yield*e.consume(t);return new Int8Array(n.buffer)}),(function(e){return e instanceof Int8Array})),_((function*(e,t){yield*z(e,t.byteLength),yield*e.append(new Uint8Array(t))}),(function*(e){const t=yield*Y(e);return(yield*e.consume(t)).buffer}),(function(e){return e instanceof ArrayBuffer})),_($,ne,le),_((function*(e,t){const n=new Uint8Array(new Uint32Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(4);return new Uint32Array(t.buffer)[0]}),(function(e){return de(e)&&e>=0&&e<=4294967295})),_((function*(e,t){const n=new Uint8Array(new Int32Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(4);return new Int32Array(t.buffer)[0]}),(function(e){return de(e)&&e>=-2147483648&&e<=2147483647})),_((function*(e,t){const n=new Uint8Array(new Uint16Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(2);return new Uint16Array(t.buffer)[0]}),(function(e){return de(e)&&e>=0&&e<=65535})),_((function*(e,t){const n=new Uint8Array(new Int16Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(2);return new Int16Array(t.buffer)[0]}),(function(e){return de(e)&&e>=-32768&&e<=32767})),_((function*(e,t){const n=new Uint8Array([t]);yield*e.append(n)}),(function*(e){const t=yield*e.consume(1);return new Uint8Array(t.buffer)[0]}),(function(e){return de(e)&&e>=0&&e<=255})),_((function*(e,t){const n=new Uint8Array(new Int8Array([t]).buffer);yield*e.append(n)}),(function*(e){const t=yield*e.consume(1);return new Int8Array(t.buffer)[0]}),(function(e){return de(e)&&e>=-128&&e<=127})),_(null,(function*(){return}),(function(e){return void 0===e})),_(null,(function*(){return null}),(function(e){return null===e})),_(null,(function*(){return NaN}),(function(e){return Number.isNaN(e)})),_(X,ae,(function(e){return"boolean"==typeof e})),_((function*(e,t){yield*G(e,t.description)}),(function*(e){const t=yield*te(e);return Symbol(t)}),ue),_(null,(function*(){return B}),ce),_((function*(e,t){const n=t.entries();yield*z(e,t.size);for(const[t,a]of n)yield*z(e,t),yield*z(e,a)}),(function*(e){const t=yield*Y(e),n=new Map;for(let a=0;an.set(e,t)))}return n}),(function(e){return e instanceof Map})),_((function*(e,t){yield*z(e,t.size);for(const n of t)yield*z(e,n)}),(function*(e){const t=yield*Y(e),n=new Set;for(let a=0;an.add(e)))}return n}),(function(e){return e instanceof Set})),_((function*(e,t){yield*$(e,t.getTime())}),(function*(e){const t=yield*ne(e);return new Date(t)}),(function(e){return e instanceof Date})),_((function*(e,t){yield*G(e,t.message),yield*G(e,t.stack)}),(function*(e){const t=yield*te(e),n=yield*te(e),a=new Error(t);return a.stack=n,a}),(function(e){return e instanceof Error})),_((function*(e,t){yield*G(e,t.source),yield*G(e,t.flags)}),(function*(e){const t=yield*te(e),n=yield*te(e);return new RegExp(t,n)}),(function(e){return e instanceof RegExp})),_((function*(e,t){yield*G(e,t.valueOf())}),(function*(e){return new String(yield*te(e))}),(function(e){return e instanceof String})),_((function*(e,t){yield*$(e,t.valueOf())}),(function*(e){return new Number(yield*ne(e))}),(function(e){return e instanceof Number})),_((function*(e,t){yield*X(e,t.valueOf())}),(function*(e){return new Boolean(yield*ae(e))}),(function(e){return e instanceof Boolean}));class N{constructor(e){this.stream=new F(e),this.objects=[]}append(e){return this.stream.append(e)}flush(){return this.stream.flush()}addObject(e){this.objects.push(fe(e)&&!re(e,this)?e:void 0)}}class F{constructor(e){this.offset=0,this.value=new Uint8Array(e)}*append(e){if(this.offset+e.length>this.value.length){const t=this.value.length-this.offset;yield*this.append(e.subarray(0,t)),yield this.value,this.offset=0,yield*this.append(e.subarray(t))}else this.value.set(e,this.offset),this.offset+=e.length}*flush(){this.offset&&(yield this.value.subarray(0,this.offset))}}function*q(e,{chunkSize:t=8388608}={}){const n=new N(t);yield*z(n,e),yield*n.flush()}function*z(e,t){const n=j.findIndex((({test:n}={})=>n&&n(t,e)));e.addObject(t),yield*e.append(new Uint8Array([n]));const a=j[n].serialize;a&&(yield*a(e,t)),0!=n&&se(t)&&(yield*function*(e,t){const n=Object.getOwnPropertySymbols(t).map((e=>[e,t[e]]));yield*H(e,n)}(e,t),yield*function*(e,t){let n=Object.entries(t);ie(t)&&(n=n.filter((([e])=>!de(Number(e)))));yield*function*(e,t){yield*z(e,t.length);for(const[n,a]of t)yield*G(e,n),yield*z(e,a)}(e,n)}(e,t))}function*H(e,t){yield*z(e,t.length);const n=Object.keys(t).filter((e=>de(Number(e)))).map((e=>Number(e)));let a=0,r=n[a];for(const[o,s]of t.entries())r==o?(r=n[++a],yield*z(e,s)):yield*z(e,B)}function*G(e,t){const n=C.encode(t);yield*z(e,n.length),yield*e.append(n)}function*J(e,t){yield*z(e,t.length),yield*e.append(new Uint8Array(t.buffer))}function*$(e,t){const n=new Uint8Array(new Float64Array([t]).buffer);yield*e.append(n)}function*X(e,t){const n=new Uint8Array([Number(t)]);yield*e.append(n)}class K{constructor(e,t){this.index=e,this.data=t}getObject(){return this.data.objects[this.index]}}class V{constructor(){this.stream=new Z,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){fe(t)&&!oe(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=>oe(e)?e.getObject():e)))}))}}class Z{constructor(){this.offset=0,this.value=new Uint8Array(0)}*consume(e){if(this.offset+e>this.value.length){const t=this.value.subarray(this.offset,this.value.length),n=yield;return t.length+n.length!=this.value.length&&(this.value=new Uint8Array(t.length+n.length)),this.value.set(t),this.value.set(n,t.length),this.offset=0,yield*this.consume(e)}{const t=this.value.slice(this.offset,this.offset+e);return this.offset+=t.length,t}}}function Q(){const e=function*(){const e=new V,t=yield*Y(e);return e.executeSetters(),t}();return e.next(),e}function*Y(e){const t=(yield*e.consume(1))[0],n=j[t].parse,a=e.getObjectId(),r=yield*n(e);return 0!=t&&se(r)&&(yield*function*(e,t){const n=yield*ee(e);e.setObject([n],(e=>e.forEach((([e,n])=>t[e]=n))))}(e,r),yield*function*(e,t){yield*function*(e,t){const n=yield*Y(e);for(let a=0;at[n]=e))}}(e,t)}(e,r)),e.resolveObject(a,r),r}function*ee(e){const t=yield*Y(e),n=new Array(t);for(let a=0;an[a]=e))}return n}function*te(e){const t=yield*Y(e),n=yield*e.consume(t);return O.decode(n)}function*ne(e){const t=yield*e.consume(8);return new Float64Array(t.buffer)[0]}function*ae(e){const t=yield*e.consume(1);return Boolean(t[0])}function re(e,t){return se(e)&&t.objects.includes(e)}function oe(e){return e instanceof K}function se(e){return e===Object(e)}function ie(e){return"number"==typeof e.length}function ce(e){return e===B}function le(e){return"number"==typeof e}function de(e){return le(e)&&Number.isInteger(e)}function ue(e){return"symbol"==typeof e}function fe(e){return se(e)||ue(e)}const he="/src/ui/pages/editor.html",me=new Map,we=new Map,be=browser.runtime.getURL(he);function pe(e){return e.url==be}const ye=new Map,ge="x-single-file-request-id";async function ve(e,t,n){const a=q({headers:n.headers,status:n.status,error:n.error,array:n.array});for(const n of a){const a={method:"singlefile.fetchResponse",requestId:t,data:Array.from(n)};await browser.tabs.sendMessage(e,a)}return{}}function ke(e,t={},n){return new Promise(((a,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||n?a({array:new Uint8Array(o.response),headers:{"content-type":o.getResponseHeader("Content-Type")},status:o.status}):ke(e,t,!0).then(a).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(n){const e=String(Math.random()).substring(2);!function(e,t){ye.set(e,t)}(e,t.referrer),o.setRequestHeader(ge,e)}o.send()}))}browser.runtime.onMessage.addListener(((e,t)=>{if(e.method&&e.method.startsWith("singlefile.fetch"))return new Promise((n=>{(async function(e,t){if("singlefile.fetch"==e.method)try{const n=await ke(e.url,{referrer:e.referrer,headers:e.headers});return ve(t.tab.id,e.requestId,n)}catch(n){return ve(t.tab.id,e.requestId,{error:n.message,arrray:[]})}else if("singlefile.fetchFrame"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(n).catch((e=>n({error:e&&e.toString()})))}))}));let Ie=!1;function xe(e){return e.method.endsWith(".enableReferrerOnError")?(Te(),{}):e.method.endsWith(".disableReferrerOnError")?(function(){try{browser.webRequest.onBeforeSendHeaders.removeListener(Se)}catch(e){}Ie=!1}(),{}):void 0}function Se(e){if(Ie){let t=e.requestHeaders.find((e=>e.name===ge));if(t){e.requestHeaders=e.requestHeaders.filter((e=>e.name!==ge));const n=ye.get(t.value);if(n){ye.delete(t.value);if(!e.requestHeaders.find((e=>"referer"===e.name.toLowerCase())))return e.requestHeaders.push({name:"Referer",value:n}),{requestHeaders:e.requestHeaders}}}}}function Te(){if(!Ie){try{browser.webRequest.onBeforeSendHeaders.addListener(Se,{urls:[""]},["blocking","requestHeaders","extraHeaders"])}catch(e){browser.webRequest.onBeforeSendHeaders.addListener(Se,{urls:[""]},["blocking","requestHeaders"])}Ie=!0}}async function Ae(e){return(await browser.tabs.query(e)).sort(((e,t)=>e.index-t.index))}const Ee="/src/ui/resources/icon_128.png",Pe="/src/ui/resources/icon_128_wait",Me=browser.i18n.getMessage("buttonDefaultTooltip"),Re=browser.i18n.getMessage("buttonBlockedTooltip"),Ue=browser.i18n.getMessage("buttonInitializingBadge"),Le=browser.i18n.getMessage("buttonInitializingTooltip"),We=browser.i18n.getMessage("buttonErrorBadge"),Be=browser.i18n.getMessage("buttonBlockedBadge"),Ce=browser.i18n.getMessage("buttonOKBadge"),Oe=browser.i18n.getMessage("buttonSaveProgressTooltip"),je=browser.i18n.getMessage("buttonUploadProgressTooltip"),De=browser.i18n.getMessage("buttonAutoSaveActiveBadge"),_e=browser.i18n.getMessage("buttonAutoSaveActiveTooltip"),Ne=[2,147,20,192],Fe=[4,229,36,192],qe={default:{setBadgeBackgroundColor:{color:Ne},setBadgeText:{text:""},setTitle:{title:Me},setIcon:{path:Ee}},inject:{setBadgeBackgroundColor:{color:Ne},setBadgeText:{text:Ue},setTitle:{title:Le}},execute:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:Ue}},progress:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:""}},edit:{setBadgeBackgroundColor:{color:Ne},setBadgeText:{text:""},setTitle:{title:Me},setIcon:{path:Ee}},end:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:Ce},setTitle:{title:Me},setIcon:{path:Ee}},error:{setBadgeBackgroundColor:{color:[229,4,12,192]},setBadgeText:{text:We},setTitle:{title:""},setIcon:{path:Ee}},forbidden:{setBadgeBackgroundColor:{color:[255,255,255,1]},setBadgeText:{text:Be},setTitle:{title:Re},setIcon:{path:Ee}},autosave:{inject:{setBadgeBackgroundColor:{color:[64,64,64,192]},setBadgeText:{text:De},setTitle:{title:_e},setIcon:{path:Ee}},default:{setBadgeBackgroundColor:{color:[208,208,208,192]},setBadgeText:{text:De},setTitle:{title:_e},setIcon:{path:Ee}}}};let ze;function He(e,t){if(e.method.endsWith(".processInit")){delete s(t.tab.id)[t.tab.id].button,Xe(t.tab)}var n,a,r;return e.method.endsWith(".processProgress")&&e.maxIndex&&(n=t.tab.id,a=e.index,r=e.maxIndex,$e(n,a,r,Oe)),e.method.endsWith(".processError")&&(e.error&&console.error("Initialization error",e.error),Ge(t.tab.id)),e.method.endsWith(".processCancelled")&&Je(t.tab),Promise.resolve({})}function Ge(e){Ke(e,Ze("error"))}function Je(e){Xe(e)}function $e(e,t,n,a){const r=Math.max(Math.min(20,Math.floor(t/n*20)),0),o=Math.min(Math.floor(t/n*8),8),s=Pe+o+".png",i=Ze("progress");i.setTitle={title:a+5*r+"%"},i.setIcon={path:s},Ke(e,i)}async function Xe(e){const t=Ze("default",await L(e));await Ke(e.id,t)}async function Ke(e,t){try{const n=s(e);if(t){n[e].button||(n[e].button={lastState:null});const a=n[e].button.lastState||{},r={};Object.keys(t).forEach((e=>{void 0!==t[e]&&JSON.stringify(a[e])!=JSON.stringify(t[e])&&(r[e]=t[e])})),Object.keys(r).length&&(n[e].button.lastState=t,await async function(e,t){for(const n of Object.keys(t))await Ve(e,n,t[n])}(e,r))}}catch(e){}}async function Ve(e,t,n){if(browser.browserAction[t]){const a=JSON.parse(JSON.stringify(n));a.tabId=e,await browser.browserAction[t](a)}}function Ze(e,t){return JSON.parse(JSON.stringify(t?qe.autosave[e]:qe[e]))}browser.browserAction.onClicked.addListener((async e=>{const t=await Ae({currentWindow:!0,highlighted:!0});t.length<=1?function(e){ze.isSavingTab(e)?ze.cancelTab(e.id):ze.saveTabs([e])}(e):ze.saveTabs(t)}));const Qe=browser.menus,Ye=Qe&&Qe.onClicked&&Qe.create&&Qe.update&&Qe.removeAll,et="save-page",tt="edit-and-save-page",nt="save-with-profile",at="save-selected-links",rt="view-pendings",ot="select-profile",st="wasve-with-profile-",it="select-profile-",ct="associate-with-profile",lt="associate-with-profile-",dt="save-selected",ut="save-frame",ft="save-tabs",ht="save-selected-tabs",mt="save-unpinned-tabs",wt="save-all-tabs",bt="batch-save-urls",pt="button-save-selected-tabs",yt="button-save-unpinned-tabs",gt="button-save-all-tabs",vt="auto-save",kt="auto-save-disabled",It="auto-save-tab",xt="auto-save-unpinned",St="auto-save-all",Tt=browser.i18n.getMessage("menuCreateDomainRule"),At=browser.i18n.getMessage("menuUpdateRule"),Et=browser.i18n.getMessage("menuSavePage"),Pt=browser.i18n.getMessage("menuSaveWithProfile"),Mt=browser.i18n.getMessage("menuSaveSelectedLinks"),Rt=browser.i18n.getMessage("menuEditPage"),Ut=browser.i18n.getMessage("menuEditAndSavePage"),Lt=browser.i18n.getMessage("menuViewPendingSaves"),Wt=browser.i18n.getMessage("menuSaveSelection"),Bt=browser.i18n.getMessage("menuSaveFrame"),Ct=browser.i18n.getMessage("menuSaveTabs"),Ot=browser.i18n.getMessage("menuSaveSelectedTabs"),jt=browser.i18n.getMessage("menuSaveUnpinnedTabs"),Dt=browser.i18n.getMessage("menuSaveAllTabs"),_t=browser.i18n.getMessage("menuBatchSaveUrls"),Nt=browser.i18n.getMessage("menuSelectProfile"),Ft=browser.i18n.getMessage("profileDefaultSettings"),qt=browser.i18n.getMessage("menuAutoSave"),zt=browser.i18n.getMessage("menuAutoSaveDisabled"),Ht=browser.i18n.getMessage("menuAutoSaveTab"),Gt=browser.i18n.getMessage("menuAutoSaveUnpinnedTabs"),Jt=browser.i18n.getMessage("menuAutoSaveAllTabs"),$t=[tt,at,dt,ut,vt,ct],Xt=new Map,Kt=new Map;let Vt,Zt,Qt,Yt=!0,en=!0,tn=new Map;async function nn(e){const[t,n]=await Promise.all([T(),i()]),a=await A(e&&e.url);if(Ye&&a){const r=["page","frame","image","link","video","audio","selection"],o=[];if(a.browserActionMenuEnabled&&o.push("browser_action"),a.tabMenuEnabled)try{Qe.create({id:"temporary-id",contexts:["tab"],title:"title"}),o.push("tab")}catch(e){a.tabMenuEnabled=!1}await Qe.removeAll();const s=o.concat(...r),i=a.contextMenuEnabled?s:o;if(Qe.create({id:et,contexts:i,title:Et}),Qe.create({id:tt,contexts:i,title:Ut}),Qe.create({id:at,contexts:a.contextMenuEnabled?o.concat(["selection"]):o,title:Mt}),Object.keys(t).length>1&&Qe.create({id:nt,contexts:i,title:Pt}),a.contextMenuEnabled&&Qe.create({id:"separator-1",contexts:r,type:"separator"}),Qe.create({id:dt,contexts:i,title:Wt}),a.contextMenuEnabled&&Qe.create({id:ut,contexts:["frame"],title:Bt}),Qe.create({id:ft,contexts:o,title:Ct}),Qe.create({id:pt,contexts:o,title:Ot,parentId:ft}),Qe.create({id:yt,contexts:o,title:jt,parentId:ft}),Qe.create({id:gt,contexts:o,title:Dt,parentId:ft}),a.contextMenuEnabled&&(Qe.create({id:ht,contexts:r,title:Ot}),Qe.create({id:mt,contexts:r,title:jt}),Qe.create({id:wt,contexts:r,title:Dt}),Qe.create({id:"separator-2",contexts:r,type:"separator"})),Object.keys(t).length>1){Qe.create({id:ot,title:Nt,contexts:i}),Qe.create({id:"wasve-with-profile-default",contexts:i,title:Ft,parentId:nt});const o="select-profile-default",s=!n.profileName||n.profileName==d;let c;Qe.create({id:o,type:"radio",contexts:i,title:Ft,checked:s,parentId:ot}),Xt.set(o,s),Qe.create({id:ct,title:Tt,contexts:i}),Kt.set(ct,Tt),e&&e.url&&(c=await v(e.url,!0));const u="associate-with-profile-current",f=!c||c.profile==l;Qe.create({id:u,type:"radio",contexts:i,title:l,checked:f,parentId:ct}),Xt.set(u,f);const h="associate-with-profile-default",m=Boolean(c)&&c.profile==d;Qe.create({id:h,type:"radio",contexts:i,title:Ft,checked:m,parentId:ct}),Xt.set(h,m),tn=new Map,Object.keys(t).forEach(((e,t)=>{if(e!=d){let a=st+t;Qe.create({id:a,contexts:i,title:e,parentId:nt}),a=it+t;let r=n.profileName==e;Qe.create({id:a,type:"radio",contexts:i,title:e,checked:r,parentId:ot}),Xt.set(a,r),a=lt+t,r=Boolean(c)&&c.profile==e,Qe.create({id:a,type:"radio",contexts:i,title:e,checked:r,parentId:ct}),Xt.set(a,r),tn.set(e,t)}})),a.contextMenuEnabled&&Qe.create({id:"separator-3",contexts:r,type:"separator"})}Qe.create({id:vt,contexts:i,title:qt}),Qe.create({id:kt,type:"radio",title:zt,contexts:i,checked:!0,parentId:vt}),Xt.set(kt,!0),Qe.create({id:It,type:"radio",title:Ht,contexts:i,checked:!1,parentId:vt}),Xt.set(It,!1),Qe.create({id:xt,type:"radio",title:Gt,contexts:i,checked:!1,parentId:vt}),Xt.set(xt,!1),Qe.create({id:St,type:"radio",title:Jt,contexts:i,checked:!1,parentId:vt}),Xt.set(St,!1),Qe.create({id:"separator-4",contexts:i,type:"separator"}),Qe.create({id:bt,contexts:i,title:_t}),Qe.create({id:rt,contexts:i,title:Lt})}Vt=!0,Zt&&(Zt=!1,(await browser.tabs.query({})).forEach((async e=>await rn(e))))}async function an(e){const t=await i(e.id);await async function(){const e=await browser.tabs.query({});return Promise.all(e.map((async e=>{const[t,n]=await Promise.all([A(e.url,!0),L(e)]);try{await browser.tabs.sendMessage(e.id,{method:"content.init",autoSaveEnabled:n,options:t})}catch(e){}})))}(),await Xe(e);try{await browser.runtime.sendMessage({method:"options.refresh",profileName:t.profileName})}catch(e){}}async function rn(e){if(Ye&&Vt){const t=[],n=await i(e.id);if(n[e.id].editorDetected)on(!1);else if(on(!0),t.push(cn(kt,!n[e.id].autoSave)),t.push(cn(It,n[e.id].autoSave)),t.push(cn(xt,Boolean(n.autoSaveUnpinned))),t.push(cn(St,Boolean(n.autoSaveAll))),e&&e.url){const a=await A(e.url);t.push(async function(e,t){const n=Yt;Yt=t,(void 0===n||n!=t)&&await nn(e)}(e,a.contextMenuEnabled)),t.push(sn(tt,n[e.id].savedPageDetected?Rt:Ut)),t.push(Qe.update(dt,{visible:!a.saveRawPage})),t.push(Qe.update(tt,{visible:!a.openEditor||n[e.id].savedPageDetected}));let r="associate-with-profile-default",o=Tt;const[s,i]=await Promise.all([T(),v(e.url)]);if(i){const e=tn.get(i.profile);e&&(r=lt+e,o=At)}Object.keys(s).length>1&&(Object.keys(s).forEach(((e,n)=>{e==d?t.push(cn("associate-with-profile-default","associate-with-profile-default"==r)):t.push(cn(lt+n,r==lt+n))})),t.push(sn(ct,o)))}await Promise.all(t)}}async function on(e){const t=en;if(en=e,void 0===t||t!=e){const t=[];try{$t.forEach((n=>t.push(Qe.update(n,{visible:e})))),await Promise.all(t)}catch(e){}}}function sn(e,t){const n=Kt.get(e);return Kt.set(e,t),void 0===n||n!=t?Qe.update(e,{title:t}):void 0}async function cn(e,t){t=Boolean(t),Xt.set(e,t),await Qe.update(e,{checked:t})}Promise.resolve().then((async function(){Ye&&(nn(),Qe.onClicked.addListener((async(e,t)=>{if(e.menuItemId==et&&(e.linkUrl?Qt.saveUrls([e.linkUrl]):Qt.saveTabs([t])),e.menuItemId==tt){(await i(t.id))[t.id].savedPageDetected?Qt.openEditor(t):e.linkUrl?Qt.saveUrls([e.linkUrl],{openEditor:!0}):Qt.saveTabs([t],{openEditor:!0})}if(e.menuItemId==at&&Qt.saveSelectedLinks(t),e.menuItemId==rt&&await browser.tabs.create({active:!0,url:"/src/ui/pages/pendings.html"}),e.menuItemId==dt&&Qt.saveTabs([t],{selected:!0}),e.menuItemId==ut&&Qt.saveTabs([t],{frameId:e.frameId}),e.menuItemId==ht||e.menuItemId==pt){const e=await Ae({currentWindow:!0,highlighted:!0});Qt.saveTabs(e)}if(e.menuItemId==mt||e.menuItemId==yt){const e=await Ae({currentWindow:!0,pinned:!1});Qt.saveTabs(e)}if(e.menuItemId==wt||e.menuItemId==gt){const e=await Ae({currentWindow:!0});Qt.saveTabs(e)}if(e.menuItemId==bt&&Qt.batchSaveUrls(),e.menuItemId==It){const e=await i(t.id);e[t.id].autoSave=!0,await c(e),an(t)}if(e.menuItemId==kt){const e=await i();Object.keys(e).forEach((t=>{"object"==typeof e[t]&&e[t].autoSave&&(e[t].autoSave=!1)})),e.autoSaveUnpinned=e.autoSaveAll=!1,await c(e),an(t)}if(e.menuItemId==St){const n=await i();n.autoSaveAll=e.checked,await c(n),an(t)}if(e.menuItemId==xt){const n=await i();n.autoSaveUnpinned=e.checked,await c(n),an(t)}if(e.menuItemId.startsWith(st)){const n=await T(),a=e.menuItemId.split(st)[1];let r;if("default"==a)r=d;else{const e=Number(a);r=Object.keys(n)[e]}n[r].profileName=r,Qt.saveTabs([t],n[r])}if(e.menuItemId.startsWith(it)){const[n,a]=await Promise.all([T(),i()]),r=e.menuItemId.split(it)[1];if("default"==r)a.profileName=d;else{const e=Number(r);a.profileName=Object.keys(n)[e]}await c(a),an(t)}if(e.menuItemId.startsWith(lt)){const[n,a]=await Promise.all([T(),v(t.url,!0)]),r=e.menuItemId.split(lt)[1];let o;if("default"==r)o=d;else if("current"==r)o=l;else{const e=Number(r);o=Object.keys(n)[e]}a?await P(a.url,a.url,o,o):(await sn(ct,At),await E(new URL(t.url).hostname,o,o))}})),Vt?Zt=!0:(await browser.tabs.query({})).forEach((async e=>await rn(e))))}));const ln=browser.commands;let dn,un,fn;function hn(e,t){return e.method.endsWith(".refreshMenu")?function(e){if(e.method.endsWith("refreshMenu"))return nn(),Promise.resolve({})}(e):He(e,t)}function mn(e){!function(e){Ke(e.id,Ze("forbidden"))}(e)}function wn(e,t,n){!function(e,t,n){let a;n?a=Ze("inject",!0):(a=Ze(1==t?"inject":"execute"),a.setTitle={title:Le+" ("+t+"/2)"},a.setIcon={path:Pe+"0.png"}),Ke(e,a)}(e,t,n)}async function bn(e,t){Ge(e);try{t&&await browser.tabs.sendMessage(e,{method:"content.error",error:t.toString()})}catch(e){}}function pn(e){!function(e){Ke(e,Ze("edit"))}(e)}function yn(e,t){!function(e,t){Ke(e,t?Ze("default",!0):Ze("end"))}(e,t)}function gn(e,t,n){!function(e,t,n){$e(e,t,n,je)}(e,t,n)}function vn(e){rn(e)}ln&&ln.onCommand&&ln.onCommand.addListener&&ln.onCommand.addListener((async e=>{if("save-selected-tabs"==e){const e=await Ae({currentWindow:!0,highlighted:!0});dn.saveTabs(e,{optionallySelected:!0})}if("save-all-tabs"==e){const e=await Ae({currentWindow:!0});dn.saveTabs(e)}}));const kn=["lib/chrome-browser-polyfill.js","lib/single-file.js"],In=["lib/chrome-browser-polyfill.js","lib/single-file-frames.js"];async function xn(e,t){let n;if(await async function(e){const t=e.extensionScriptFiles||[];un||fn||([un,fn]=await Promise.all([Sn(kn.concat(t)),Sn(In)]))}(t),!t.removeFrames)try{await browser.tabs.executeScript(e,{code:fn,allFrames:!0,matchAboutBlank:!0,runAt:"document_start"})}catch(e){}try{await browser.tabs.executeScript(e,{code:un,allFrames:!1,runAt:"document_idle"}),n=!0}catch(e){}return n&&t.frameId&&await browser.tabs.executeScript(e,{code:"document.documentElement.dataset.requestedFrameId = true",frameId:t.frameId,matchAboutBlank:!0,runAt:"document_start"}),n}async function Sn(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 n="";for(const e of t)n+=await e;return n}const Tn="single-filez-response-fetch",An=(e,t)=>window.fetch(e,t);let En=0,Pn=new Map;async function Mn(e,t={}){try{let n=await An(e,{cache:"force-cache",headers:t.headers});return 401!=n.status&&403!=n.status&&404!=n.status||(n=await Ln(e)),n}catch(n){En++;const a=new Promise(((e,t)=>Pn.set(En,{resolve:e,reject:t,parser:Q()})));return await Un({method:"singlefile.fetch",url:e,requestId:En,referrer:t.referrer,headers:t.headers}),a}}async function Rn(e,t){const n=await Un({method:"singlefile.fetchFrame",url:e,frameId:t.frameId,referrer:t.referrer,headers:t.headers});return{status:n.status,headers:new Map(n.headers),arrayBuffer:async()=>new Uint8Array(n.array).buffer}}async function Un(e){const t=await browser.runtime.sendMessage(e);if(!t||t.error)throw new Error(t&&t.error&&t.error.toString());return t}function Ln(e){return new Promise(((t,n)=>{var a,r,o,s;a=new CustomEvent("single-filez-request-fetch",{detail:e}),window.dispatchEvent(a),r=Tn,o=function a(r){var o,s,i;r.detail?r.detail.url==e&&(o=Tn,s=a,i=!1,window.removeEventListener(o,s,i),r.detail.response?t({status:r.detail.status,headers:new Map(r.detail.headers),arrayBuffer:async()=>r.detail.response}):n(r.detail.error)):n()},s=!1,window.addEventListener(r,o,s)}))}function Wn(e,t){return xn(e,t)}browser.runtime.onMessage.addListener((e=>"singlefile.fetchFrame"==e.method&&window.frameId&&window.frameId==e.frameId?async function(e){try{let t=await An(e.url,{cache:"force-cache",headers:e.headers});return 401!=t.status&&403!=t.status&&404!=t.status||(t=await Promise.race([Ln(e.url),new Promise(((e,t)=>setTimeout((()=>t()),5e3)))])),{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){let t=Pn.get(e.requestId);if(t){const n=t.parser.next(e.data);if(n.done){Pn.delete(e.requestId);const a=n.value;a.error?t.reject(new Error(a.error)):t.resolve({status:a.status,headers:{get:e=>a.headers&&a.headers[e]},arrayBuffer:async()=>a.array.buffer})}}return{}}(e):void 0));const Bn="Could not establish connection. Receiving end does not exist.",Cn="The message port closed before a response was received.",On="Message manager disconnected",jn="Cannot access contents of url ",Dn="pending",_n="processing",Nn=["lib/single-file-extension-infobar.js","lib/single-file-extension.js"],Fn=[];let qn,zn=0;var Hn;async function Gn(){return browser.tabs.create({active:!0,url:"/src/ui/pages/batch-save-urls.html"})}async function Jn(e,t={}){await Kn(),await Promise.all(e.map((async e=>{const n=await A(e);Object.keys(t).forEach((e=>n[e]=t[e])),n.autoClose=!0,n.extensionScriptFiles=Nn,n.passReferrerOnError&&await Te(),Xn({tab:{url:e},status:Dn,options:n,method:"content.save"})}))),Vn()}async function $n(e,t={}){await Kn(),await Promise.all(e.map((async e=>{const n=e.id,a=await A(e.url);Object.keys(t).forEach((e=>a[e]=t[e])),a.tabId=n,a.tabIndex=e.index,a.extensionScriptFiles=Nn,a.passReferrerOnError&&await Te();const r={id:e.id,index:e.index,url:e.url,title:e.title};if(t.autoSave){if(L(e)){Zn(Xn({status:_n,tab:r,options:a,method:"content.autosave"}))}}else{wn(n,1);await Wn(n,a)||pe(e)?(wn(n,2),Xn({status:Dn,tab:r,options:a,method:"content.save"})):mn(e)}}))),Vn()}function Xn(e){const t={id:zn,status:e.status,tab:e.tab,options:e.options,method:e.method,done:function(){Fn.splice(Fn.findIndex((e=>e.id==this.id)),1),Vn()}};return Fn.push(t),zn++,t}async function Kn(){qn||(qn=(await k()).maxParallelWorkers)}function Vn(){const e=Fn.filter((e=>e.status==_n)).length;for(let t=0;te.status==Dn));e&&Zn(e)}}async function Zn(e){const t=e.id;if(e.status=_n,!e.tab.id){let t;try{const n=await async function(e){const t=await browser.tabs.create(e);return new Promise(((e,n)=>{function a(n,o){n==t.id&&"complete"==o.status&&(e(t),browser.tabs.onUpdated.removeListener(a),browser.tabs.onRemoved.removeListener(r))}function r(e){e==t.id&&(n(e),browser.tabs.onRemoved.removeListener(r))}browser.tabs.onUpdated.addListener(a),browser.tabs.onRemoved.addListener(r)}))}({url:e.tab.url,active:!1});e.tab.id=e.options.tabId=n.id,e.tab.index=e.options.tabIndex=n.index,wn(e.tab.id,1),t=await Wn(e.tab.id,e.options)}catch(t){e.tab.id=t}if(!t)return void e.done();wn(e.tab.id,2)}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==Cn||e.message==Bn||e.message==On||e.message.startsWith(jn+JSON.stringify(be))}(t)||(console.log(t.message?t.message:t),bn(e.tab.id,t.message),e.done())}}function Qn(e){const t=Fn.find((t=>t.id==e));t&&(t.options.autoClose&&!t.cancelled&&browser.tabs.remove(t.tab.id),t.done())}function Yn(e,t){const n=Fn.find((t=>t.id==e));n&&(n.cancel=t)}function ea(e){Array.from(Fn).filter((t=>t.tab.id==e&&!t.options.autoSave)).forEach(na)}function ta(e){return Fn.find((t=>t.id==e))}function na(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&&yn(t,!0),function(e){Je(e)}(e.tab),e.done()}function aa(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}}Hn={isSavingTab:function(e){return Boolean(Fn.find((t=>t.tab.id==e.id)))},saveTabs:$n,saveUrls:Jn,cancelTab:ea,openEditor:function(e){browser.tabs.sendMessage(e.id,{method:"content.openEditor"})},saveSelectedLinks:async function(e){const t={extensionScriptFiles:Nn,tabId:e.id,tabIndex:e.index};if(await Wn(e.id,t)){const t=await browser.tabs.sendMessage(e.id,{method:"content.getSelectedLinks"});if(t.urls&&t.urls.length){const e=await Gn(),n=(a,r)=>{"complete"==r.status&&a==e.id&&(browser.tabs.onUpdated.removeListener(n),browser.tabs.sendMessage(e.id,{method:"newUrls.addURLs",urls:t.urls}))};browser.tabs.onUpdated.addListener(n)}}else mn(e)},batchSaveUrls:Gn},function(e){Qt=e}(Hn),function(e){ze=e}(Hn),function(e){dn=e}(Hn);const ra=new Set;async function oa(e){return e.method.endsWith(".saveCreatedBookmarks")?(sa(),{}):e.method.endsWith(".disable")?(async function(){let e;const t=await T();Object.keys(t).forEach((n=>e=e||!t[n].saveCreatedBookmarks)),e&&(browser.bookmarks.onCreated.removeListener(ia),browser.bookmarks.onMoved.removeListener(ca))}(),{}):void 0}async function sa(){try{browser.bookmarks.onCreated.removeListener(ia),browser.bookmarks.onMoved.removeListener(ca)}catch(e){}let e;const t=await T();Object.keys(t).forEach((n=>{t[n].saveCreatedBookmarks&&(e=!0)})),e&&(browser.bookmarks.onCreated.addListener(ia),browser.bookmarks.onMoved.addListener(ca))}async function ia(e,t){ra.add(e),await la(e,t.url,t)}async function ca(e,t){if(ra.has(e)){const n=await browser.bookmarks.get(e);n[0]&&await la(e,n[0].url,t)}}async function la(e,t,n){const a=await browser.tabs.query({lastFocusedWindow:!0,active:!0}),r=await A(t);if(r.saveCreatedBookmarks){const s=await async function e(t,n=[]){if(t){const a=(await browser.bookmarks.get(t))[0];a&&a.title&&(n.unshift(a.title),await e(a.parentId,n))}return n}(n.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(a.length&&a[0].url==t)ra.delete(e),$n(a,{bookmarkId:e,bookmarkFolders:s});else{const n=await browser.tabs.query({});if(n.length){const a=n.find((e=>e.url==t));a?(ra.delete(e),$n([a],{bookmarkId:e,bookmarkFolders:s})):t&&("about:blank"==t?browser.bookmarks.onChanged.addListener((function t(n,a){n==e&&a.url&&(browser.bookmarks.onChanged.removeListener(t),o(a.url))})):o(t))}}}function o(t){ra.delete(e),Jn([t],{bookmarkId:e})}}Promise.resolve().then(sa);const da="https://oauth2.googleapis.com/token",ua="https://www.googleapis.com/drive/v3/files";let fa,ha=!0;class ma{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=ka(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),ga(this)}}async function wa(e,t){const n=await fetch(da,{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()}),a=await va(n);return e.accessToken=a.access_token,e.refreshToken=a.refresh_token,e.expirationDate=Date.now()+1e3*a.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function ba(e={}){return Boolean(browser.identity&&browser.identity.getAuthToken)&&!e.forceWebAuthFlow}async function pa(e,t,n=!0){const a=t.split("/");a.pop();const r=e.folderIds.get(a.join("/"));if(r)return r;let o="root";if(a.length){let r="";for(const s of a){r&&(r+="/"),r+=s;const a=e.folderIds.get(r);if(a)o=a;else try{o=await ya(e,s,o),e.folderIds.set(r,o)}catch(a){if("path_not_found"==a.message&&n)return e.folderIds.clear(),pa(e,t,!1);throw a}}}return o}async function ya(e,t,n){const a=await async function(e,t,n){return va(await fetch(ua+"?q=mimeType = 'application/vnd.google-apps.folder' and name = '"+t+"' and trashed != true and '"+n+"' in parents",{headers:{Authorization:"Bearer "+e.accessToken}}))}(e,t,n);if(a.files.length)return a.files[0].id;{const a=await async function(e,t,n){return va(await fetch(ua,{method:"POST",headers:{Authorization:"Bearer "+e.accessToken,"Content-Type":"application/json"},body:JSON.stringify({name:t,parents:[n],mimeType:"application/vnd.google-apps.folder"})}))}(e,t,n);return a.id}}async function ga(e){let t=e.file,n=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(n=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,n));const a=await fetch(e.url,{method:"PUT",headers:{Authorization:"Bearer "+e.token,"Content-Type":e.contentType,"Content-Range":"bytes "+e.offset+"-"+(n-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==a.status||201==a.status)return a.json();if(308==a.status){const t=a.headers.get("Range");if(t&&(e.offset=parseInt(t.match(/\d+/g).pop(),10)+1),e.cancelled)throw new Error("upload_cancelled");return ga(e)}ka(a)}async function va(e){e=ka(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function ka(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+")")}async function Ia(e,t,n,a,r,o){for(;fa;)await fa;const s=new AbortController;return fa=(async()=>{try{await async function({path:r,blob:o,message:s=""},i){try{const c=await function(e){return new Promise(((t,n)=>{const a=new FileReader;a.onloadend=()=>t(a.result.match(/^data:[^,]+,(.*)$/)[1]),a.onerror=e=>n(e.detail),a.readAsDataURL(e)}))}(o),l=await fetch(`https://api.github.com/repos/${t}/${n}/contents/${r.replace(/#/g,"%23")}`,{method:"PUT",headers:new Map([["Authorization",`token ${e}`],["Accept","application/vnd.github.v3+json"]]),body:JSON.stringify({content:c,message:s,branch:a}),signal:i}),d=await l.json();if(l.status<400)return d;throw new Error(d.message)}catch(e){if("AbortError"!=e.name)throw e}}({path:r,blob:o},s.signal)}finally{fa=null}})(),{cancelPush:()=>s.abort(),pushPromise:fa}}const xa=new Map,Sa=/([{}()^$&.*?/+|[\\\\]|\]|-)/g,Ta=browser.runtime.getManifest(),Aa=Ta.optional_permissions&&Ta.optional_permissions.includes("identity"),Ea=new class{constructor(e,t,n){this.clientId=e,this.clientKey=t,this.scopes=n,this.folderIds=new Map,setInterval((()=>this.folderIds.clear()),6e4)}async auth(e={interactive:!0}){if(e.requestPermissionIdentity&&ha)try{await browser.permissions.request({permissions:["identity"]}),ha=!1}catch(e){}return ba(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?wa(this,e):async function(e,t){let n;try{if(browser.identity&&browser.identity.launchWebAuthFlow&&!t.forceWebAuthFlow){const n=await browser.identity.launchWebAuthFlow({interactive:t.interactive,url:e.authURL});return t.code=new URLSearchParams(new URL(n).search).get("code"),await wa(e,t)}if(t.launchWebAuthFlow)return t.extractAuthCode(browser.identity.getRedirectURL()).then((e=>n=e)).catch((()=>{})),await t.launchWebAuthFlow({url:e.authURL});throw new Error("auth_not_supported")}catch(a){if(a.message&&("code_required"==a.message||a.message.includes("access"))){if(n)return t.code=n,await wa(e,t);throw new Error("code_required")}throw a}}(this,e))}setAuthInfo(e,t){ba(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(da,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token"});if(400==e.status)throw new Error("unknown_token");const t=await va(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}}}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 va(t)}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,n,a=!0){const r=await pa(this,e),o=e.split("/").pop(),s=new ma({token:this.accessToken,file:t,parents:[r],filename:o,onProgress:n.onProgress});try{return{cancelUpload:()=>s.cancelled=!0,uploadPromise:s.upload()}}catch(r){if("path_not_found"==r.message&&a)return this.folderIds.clear(),this.upload(e,t,n,!1);throw r}}}("207618107333-h1220p1oasj3050kr5r416661adm091a.apps.googleusercontent.com","VQJ8Gq8Vxx72QyxPyeLtWvUt",["https://www.googleapis.com/auth/drive.file"]);async function Pa(e,t){if(e.method.endsWith(".download"))return async function(e,t){const n=t.id;let a=xa.get(n);a||(a=Q(),xa.set(n,a));let r=a.next(e.data);if(r.done){let e;const a=r.value;if(xa.delete(n),a.backgroundSave&&!a.saveToGDrive){const t=await La(a.filename,a);a.filenameConflictAction=t.filenameConflictAction,e=t.skipped}if(e)yn(n);else{const e=a.pageData,r=await singlefile.processors.compression.process(e,{insertTextBody:a.insertTextBody,url:e.url||t.url,createRootDirectory:a.createRootDirectory,tabId:n,selfExtractingArchive:a.selfExtractingArchive,insertCanonicalLink:a.insertCanonicalLink,insertMetaNoIndex:a.insertMetaNoIndex,password:a.password});a.openEditor?(pn(t.id),await async function({tabIndex:e,content:t,filename:n}){const a={active:!0,url:he};null!=e&&(a.index=e);const r=await browser.tabs.create(a);me.set(r.id,{content:t,filename:n})}({tabIndex:t.index+1,filename:a.filename,content:new Uint8Array(await r.arrayBuffer())})):await async function(e,t,n,a){try{a.saveToGDrive?await(await Ua(a.taskId,a.filename,e,{forceWebAuthFlow:a.forceWebAuthFlow},{onProgress:(e,n)=>gn(t,e,n)})).uploadPromise:a.saveToGitHub?await(await Ra(a.taskId,a.filename,e,a.githubToken,a.githubUser,a.githubRepository,a.githubBranch)).pushPromise:a.backgroundSave?(a.url=URL.createObjectURL(e),await Wa(a,{confirmFilename:a.confirmFilename,incognito:n,filenameConflictAction:a.filenameConflictAction,filenameReplacementCharacter:a.filenameReplacementCharacter,bookmarkId:a.bookmarkId,replaceBookmarkURL:a.replaceBookmarkURL})):await async function(e,t,n,a){const r=q({filename:t,taskId:e,content:await n.arrayBuffer()});for(const e of r){const t={method:"content.download",data:Array.from(e)};await browser.tabs.sendMessage(a,t)}}(a.taskId,a.filename,e,t),yn(t)}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),bn(t,e.message))}finally{a.url&&URL.revokeObjectURL(a.url)}}(r,n,t.incognito,a)}}return{}}(e,t.tab);if(e.method.endsWith(".disableGDrive")){const e=await M();return U(),await Ea.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}return e.method.endsWith(".end")?(Qn(e.taskId),{}):e.method.endsWith(".getInfo")?Fn.map(aa):e.method.endsWith(".cancel")?(n=e.taskId,na(Fn.find((e=>e.id==n))),{}):e.method.endsWith(".cancelAll")?(Array.from(Fn).forEach(na),{}):e.method.endsWith(".saveUrls")?(Jn(e.urls),{}):void 0;var n}async function Ma(e,t){let n=await M();const a={interactive:!0,forceWebAuthFlow:e.forceWebAuthFlow,requestPermissionIdentity:Aa,launchWebAuthFlow:e=>async function(e){const t=await browser.tabs.create({url:e.url,active:!0});return new Promise(((e,n)=>{browser.tabs.onRemoved.addListener((function e(a){a==t.id&&(browser.tabs.onRemoved.removeListener(e),n(new Error("code_required")))}))}))}(e),extractAuthCode:e=>function(e){return new Promise(((t,n)=>{browser.tabs.onUpdated.addListener((function a(r,o){if(o&&o.url.startsWith(e)){browser.tabs.onUpdated.removeListener(a);const e=new URLSearchParams(new URL(o.url).search).get("code");e?(browser.tabs.remove(r),t(e)):n()}}))}))}(e)};return Ea.setAuthInfo(n,a),n&&n.accessToken&&!t||(n=await Ea.auth(a),n?await R(n):await U()),n}async function Ra(e,t,n,a,r,o,s){const i=ta(e);if(!i||!i.cancelled){const i=Ia(a,r,o,s,t,n);Yn(e,i.cancelPush);try{return await(await i).pushPromise,i}catch(e){throw new Error(e.message+" (GitHub)")}}}async function Ua(e,t,n,a,r){try{await Ma(a);const o=ta(e);if(!o||!o.cancelled){const a=await Ea.upload(t,n,r);return Yn(e,a.cancelUpload),a}}catch(o){if("invalid_token"!=o.message)throw new Error(o.message+" (Google Drive)");{let o;try{o=await Ea.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Google Drive)");o=await Ma(a,!0)}o?await R(o):await U(),await Ua(e,t,n,a,r)}}}async function La(e,t){let n,a=t.filenameConflictAction;if("skip"==a){(await browser.downloads.search({filenameRegex:"(\\\\|/)"+(r=e,r.replace(Sa,"\\$1")+"$"),exists:!0})).length?n=!0:a="uniquify"}var r;return{skipped:n,filenameConflictAction:a}}async function Wa(t,n){const a={url:t.url,saveAs:n.confirmFilename,filename:t.filename,conflictAction:n.filenameConflictAction};n.incognito&&(a.incognito=!0);const r=await e(a,n.filenameReplacementCharacter);r.filename&&t.bookmarkId&&t.replaceBookmarkURL&&(r.filename.startsWith("file:")||(r.filename.startsWith("/")&&(r.filename=r.filename.substring(1)),r.filename="file:///"+r.filename.replace(/#/g,"%23")),await async function(e,t){try{await browser.bookmarks.update(e,t)}catch(e){}}(t.bookmarkId,{url:r.filename}))}const Ba={},Ca={};async function Oa(e,t){if("enableAutoSave"==e.method){const n=await i(t.id);n[t.id].autoSave=e.enabled,await c(n),async function(e){Promise.all([nn(e),Xe(e)])}(t)}if("isAutoSaveEnabled"==e.method)return L(t)}async function ja(e,t){const n=t.id,a=await A(t.url,!0);if(a){let r;wn(n,1,!0),a.content=e.content,a.url=e.url,a.frames=e.frames,a.canvases=e.canvases,a.fonts=e.fonts,a.stylesheets=e.stylesheets,a.images=e.images,a.posters=e.posters,a.videos=e.videos,a.usedFonts=e.usedFonts,a.shadowRoots=e.shadowRoots,a.imports=e.imports,a.referrer=e.referrer,a.updatedResources=e.updatedResources,a.visitDate=new Date(e.visitDate),a.backgroundTab=!0,a.autoSave=!0,a.incognito=t.incognito,a.tabId=n,a.tabIndex=t.index;try{let o;if(r=await function(e,t,n,a={fetch:Mn,frameFetch:Rn}){return globalThis.singlefile.getPageData(e,a,t,n)}(a,null,null,{fetch:Da}),!a.saveToGDrive){const e=await La(r.filename,a);o=e.skipped,a.filenameConflictAction=e.filenameConflictAction}if(!o){a.includeInfobar&&(r.content+=await infobar.getScript());const o=await singlefile.processors.compression.process(r,{insertTextBody:a.insertTextBody,url:t.url,createRootDirectory:a.createRootDirectory,tabId:n,selfExtractingArchive:a.selfExtractingArchive,insertCanonicalLink:a.insertCanonicalLink,insertMetaNoIndex:a.insertMetaNoIndex,password:a.password});a.saveToGDrive?await(await Ua(e.taskId,r.filename,o,a,{})).uploadPromise:a.saveToGitHub?await(await Ra(e.taskId,r.filename,o,a.githubToken,a.githubUser,a.githubRepository,a.githubBranch)).pushPromise:(r.url=URL.createObjectURL(o),await Wa(r,a))}}finally{e.taskId?Qn(e.taskId):a.autoClose&&(browser.tabs.remove(Ca[n]||n),delete Ca[n]),r&&r.url&&URL.revokeObjectURL(r.url),yn(n,!0)}}}function Da(e,t={}){return new Promise(((n,a)=>{const r=new XMLHttpRequest;if(r.withCredentials=!0,r.responseType="arraybuffer",r.onerror=e=>a(new Error(e.detail)),r.onreadystatechange=()=>{r.readyState==XMLHttpRequest.DONE&&n({status:r.status,headers:{get:e=>r.getResponseHeader(e)},arrayBuffer:async()=>r.response})},r.open("GET",e,!0),t.headers)for(const e of Object.entries(t.headers))r.setRequestHeader(e[0],e[1]);r.send()}))}async function _a(e,t){if(e.method.endsWith(".init")&&(await async function(e,t){await o(e.id);const n=await i(e.id);n[e.id].savedPageDetected=t.savedPageDetected,await c(n)}(t.tab,e),rn(t.tab),function(e){ea(e.id)}(t.tab),async function(e){const[t,n]=await Promise.all([A(e.url,!0),L(e)]);t&&(t.autoSaveLoad||t.autoSaveLoadOrUnload)&&n&&$n([e],{autoSave:!0})}(t.tab)),e.method.endsWith(".getOptions"))return A(e.url);e.method.endsWith(".activate")&&await browser.tabs.update(e.tabId,{active:!0})}browser.tabs.onCreated.addListener((e=>function(e){!function(e){rn(e)}(e)}(e))),browser.tabs.onActivated.addListener((e=>async function(e){vn(await browser.tabs.get(e.tabId))}(e))),browser.tabs.onRemoved.addListener((e=>function(e){o(e),function(e){me.delete(e)}(e),ea(e),async function(e){const t=Ba[e];t?t.autoSaveRemove&&(delete Ba[e],await ja(t,t.tab)):Ba[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 Ba[e]}(e);const t=await browser.tabs.get(e);if(pe(t)){const e=await i(t.id);e[t.id].editorDetected=!0,await c(e),vn(t)}}t.discarded&&async function(e){const t=Ba[e];t?(delete Ba[e],await ja(t,t.tab)):Ba[e]={discarded:!0}}(e)}(e,t))),browser.tabs.onReplaced.addListener(((e,t)=>function(e,t){(async function(e,t){let a=await i();await r(a,e,t),c(a),await r(n,e,t)})(e,t),async function(e,t){Ba[t]&&!Ba[e]&&(Ba[e]=Ba[t],delete Ba[t],Ca[t]=e)}(e,t),function(e,t){Fn.forEach((n=>{n.tab.id==t&&(n.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 Na=new Map;function Fa(e,t){e.delete(t)}browser.runtime.onMessage.addListener(((e,t)=>{if("singlefile.lazyTimeout.setTimeout"==e.method){let n,a=Na.get(t.tab.id);if(a)if(n=a.get(t.frameId),n){const t=n.get(e.type);t&&clearTimeout(t)}else n=new Map;const r=setTimeout((async()=>{try{const n=Na.get(t.tab.id),a=n.get(t.frameId);n&&a&&Fa(a,e.type),await browser.tabs.sendMessage(t.tab.id,{method:"singlefile.lazyTimeout.onTimeout",type:e.type})}catch(e){}}),e.delay);return a||(a=new Map,n=new Map,a.set(t.frameId,n),Na.set(t.tab.id,a)),n.set(e.type,r),Promise.resolve({})}if("singlefile.lazyTimeout.clearTimeout"==e.method){let n=Na.get(t.tab.id);if(n){const a=n.get(t.frameId);if(a){const t=a.get(e.type);t&&clearTimeout(t),Fa(a,e.type)}}return Promise.resolve({})}})),browser.tabs.onRemoved.addListener((e=>Na.delete(e))),browser.runtime.onMessage.addListener(((e,t)=>e.method.startsWith("tabs.")?_a(e,t):e.method.startsWith("downloads.")?Pa(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,Ba[t.tab.id]=e):Ba[e.tabId]&&(Ba[e.tabId].removed&&e.autoSaveRemove||Ba[e.tabId].discarded&&e.autoSaveDiscard)&&(delete Ba[e.tabId],await ja(e,{id:e.tabId,index:e.tabIndex,url:t.url})),e.autoSaveUnload&&(delete Ba[e.tabId],await ja(e,t.tab))):(delete Ba[e.tabId],await ja(e,t.tab)),{}}(e,t):e.method.startsWith("ui.")?hn(e,t):e.method.startsWith("config.")?S(e):e.method.startsWith("tabsData.")?function(e){return e.method.endsWith(".get")?i():e.method.endsWith(".set")?c(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,n=me.get(e.id);if(n){const t=q({tabData:n,options:await A(n.url)});for(const n of t)await browser.tabs.sendMessage(e.id,{method:"editor.setTabData",data:Array.from(n)})}return{}}if(e.method.endsWith(".open")){const n=t.tab;let a=we.get(n.id);a||(a=Q(),we.set(n.id,a));const r=a.next(e.data);if(r.done){const e={url:he};await browser.tabs.update(n.id,e),me.set(n.id,{url:n.url,content:r.value.content,filename:r.value.filename})}return{}}}(e,t):e.method.startsWith("bookmarks.")?oa(e):e.method.startsWith("requests.")?xe(e):e.method.startsWith("bootstrap.")?async function(e,t){if(e.method.endsWith(".init")){const[e,n,a]=await Promise.all([A(t.tab.url,!0),A(t.tab.url),L(t.tab)]);return{optionsAutoSave:e,options:n,autoSaveEnabled:a,tabId:t.tab.id,tabIndex:t.tab.index}}}(e,t):void 0)),browser.runtime.onMessageExternal&&browser.runtime.onMessageExternal.addListener((async(e,t)=>{const n=(await browser.tabs.query({currentWindow:!0,active:!0}))[0];return!!n&&Oa(e,n)}))}(); diff --git a/manifest.json b/manifest.json index b235c44a9..771b23ea1 100644 --- a/manifest.json +++ b/manifest.json @@ -3,10 +3,10 @@ "author": "Gildas Lormeau", "homepage_url": "https://github.com/gildas-lormeau/SingleFileZ", "icons": { - "16": "src/extension/ui/resources/icon_16.png", - "48": "src/extension/ui/resources/icon_48.png", - "64": "src/extension/ui/resources/icon_64.png", - "128": "src/extension/ui/resources/icon_128.png" + "16": "src/ui/resources/icon_16.png", + "48": "src/ui/resources/icon_48.png", + "64": "src/ui/resources/icon_64.png", + "128": "src/ui/resources/icon_128.png" }, "version": "1.3.10", "description": "__MSG_extensionDescription__", @@ -38,28 +38,28 @@ } ], "background": { - "page": "src/extension/core/bg/background.html", + "page": "src/core/bg/background.html", "persistent": false }, - "options_page": "src/extension/ui/pages/options.html", + "options_page": "src/ui/pages/options.html", "sidebar_action": { "browser_style": true, "default_title": "SingleFileZ", - "default_panel": "src/extension/ui/pages/panel.html", - "default_icon": "src/extension/ui/resources/icon_128.png", + "default_panel": "src/ui/pages/panel.html", + "default_icon": "src/ui/resources/icon_128.png", "open_at_install": false }, "options_ui": { "browser_style": true, - "page": "src/extension/ui/pages/options.html", + "page": "src/ui/pages/options.html", "open_in_tab": false }, "browser_action": { "default_icon": { - "16": "src/extension/ui/resources/icon_16.png", - "48": "src/extension/ui/resources/icon_48.png", - "64": "src/extension/ui/resources/icon_64.png", - "128": "src/extension/ui/resources/icon_128.png" + "16": "src/ui/resources/icon_16.png", + "48": "src/ui/resources/icon_48.png", + "64": "src/ui/resources/icon_64.png", + "128": "src/ui/resources/icon_128.png" }, "default_title": "__MSG_buttonDefaultTooltip__" }, @@ -86,11 +86,11 @@ "lib/single-file-extension-editor-helper.js", "lib/single-file-zip.min.js", "lib/single-file-z-worker.js", - "src/extension/lib/readability/Readability.js", - "src/extension/lib/readability/Readability-readerable.js", - "src/extension/ui/pages/editor-note-web.css", - "src/extension/ui/pages/editor-mask-web.css", - "src/extension/ui/pages/editor-frame-web.css" + "src/lib/readability/Readability.js", + "src/lib/readability/Readability-readerable.js", + "src/ui/pages/editor-note-web.css", + "src/ui/pages/editor-mask-web.css", + "src/ui/pages/editor-frame-web.css" ], "oauth2": { "client_id": "7544745492-ig6uqhua0ads4jei52lervm1pqsi6hot.apps.googleusercontent.com", @@ -118,7 +118,7 @@ "id": "{e4db92bc-3213-493d-bd9e-5ff2afc72da6}" } }, - "devtools_page": "src/extension/core/devtools/devtools.html", + "devtools_page": "src/core/devtools/devtools.html", "incognito": "spanning", "manifest_version": 2, "default_locale": "en" diff --git a/rollup.config.dev.js b/rollup.config.dev.js index 407e4aad5..5a4181dc0 100644 --- a/rollup.config.dev.js +++ b/rollup.config.dev.js @@ -91,7 +91,7 @@ export default [{ plugins: PLUGINS, external: EXTERNAL }, { - input: ["src/extension/core/content/content-infobar.js"], + input: ["src/core/content/content-infobar.js"], output: [{ file: "lib/single-file-extension-infobar.js", format: "umd", @@ -99,21 +99,21 @@ export default [{ plugins: [] }] }, { - input: ["src/extension/core/content/content-bootstrap.js"], + input: ["src/core/content/content-bootstrap.js"], output: [{ file: "lib/single-file-extension-bootstrap.js", format: "iife", plugins: [] }] }, { - input: ["src/extension/core/content/content-frames.js"], + input: ["src/core/content/content-frames.js"], output: [{ file: "lib/single-file-extension-frames.js", format: "iife", plugins: [] }] }, { - input: ["src/extension/index.js"], + input: ["src/index.js"], output: [{ file: "lib/single-file-extension-core.js", format: "umd", @@ -121,14 +121,14 @@ export default [{ plugins: [] }] }, { - input: ["src/extension/core/content/content.js"], + input: ["src/core/content/content.js"], output: [{ file: "lib/single-file-extension.js", format: "iife", plugins: [] }] }, { - input: ["src/extension/ui/content/content-ui-editor-init-web.js"], + input: ["src/ui/content/content-ui-editor-init-web.js"], output: [{ file: "lib/single-file-extension-editor-init.js", format: "iife", @@ -137,7 +137,7 @@ export default [{ plugins: PLUGINS, external: EXTERNAL }, { - input: ["src/extension/ui/content/content-ui-editor-web.js"], + input: ["src/ui/content/content-ui-editor-web.js"], output: [{ file: "lib/single-file-extension-editor.js", format: "iife", @@ -146,7 +146,7 @@ export default [{ plugins: PLUGINS, external: EXTERNAL }, { - input: ["src/extension/ui/content/content-ui-editor-helper-web"], + input: ["src/ui/content/content-ui-editor-helper-web"], output: [{ file: "lib/single-file-extension-editor-helper.js", format: "umd", @@ -156,21 +156,21 @@ export default [{ plugins: PLUGINS, external: EXTERNAL }, { - input: ["src/extension/lib/single-file/browser-polyfill/chrome-browser-polyfill.js"], + input: ["src/lib/single-file/browser-polyfill/chrome-browser-polyfill.js"], output: [{ file: "lib/chrome-browser-polyfill.js", format: "iife", plugins: [] }] }, { - input: ["src/extension/core/bg/index.js"], + input: ["src/core/bg/index.js"], output: [{ file: "lib/single-file-extension-background.js", format: "iife", plugins: [] }] }, { - input: ["src/extension/lib/single-file/background.js"], + input: ["src/lib/single-file/background.js"], output: [{ file: "lib/single-file-background.js", format: "iife", diff --git a/rollup.config.js b/rollup.config.js index 46753a191..c777f2588 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -91,7 +91,7 @@ export default [{ plugins: PLUGINS, external: EXTERNAL }, { - input: ["src/extension/core/content/content-infobar.js"], + input: ["src/core/content/content-infobar.js"], output: [{ file: "lib/single-file-extension-infobar.js", format: "umd", @@ -99,21 +99,21 @@ export default [{ plugins: [terser()] }] }, { - input: ["src/extension/core/content/content-bootstrap.js"], + input: ["src/core/content/content-bootstrap.js"], output: [{ file: "lib/single-file-extension-bootstrap.js", format: "iife", plugins: [terser()] }] }, { - input: ["src/extension/core/content/content-frames.js"], + input: ["src/core/content/content-frames.js"], output: [{ file: "lib/single-file-extension-frames.js", format: "iife", plugins: [terser()] }] }, { - input: ["src/extension/index.js"], + input: ["src/index.js"], output: [{ file: "lib/single-file-extension-core.js", format: "umd", @@ -121,14 +121,14 @@ export default [{ plugins: [terser()] }] }, { - input: ["src/extension/core/content/content.js"], + input: ["src/core/content/content.js"], output: [{ file: "lib/single-file-extension.js", format: "iife", plugins: [terser()] }] }, { - input: ["src/extension/ui/content/content-ui-editor-init-web.js"], + input: ["src/ui/content/content-ui-editor-init-web.js"], output: [{ file: "lib/single-file-extension-editor-init.js", format: "iife", @@ -137,7 +137,7 @@ export default [{ plugins: PLUGINS, external: EXTERNAL }, { - input: ["src/extension/ui/content/content-ui-editor-web.js"], + input: ["src/ui/content/content-ui-editor-web.js"], output: [{ file: "lib/single-file-extension-editor.js", format: "iife", @@ -146,7 +146,7 @@ export default [{ plugins: PLUGINS, external: EXTERNAL }, { - input: ["src/extension/ui/content/content-ui-editor-helper-web"], + input: ["src/ui/content/content-ui-editor-helper-web"], output: [{ file: "lib/single-file-extension-editor-helper.js", format: "umd", @@ -156,21 +156,21 @@ export default [{ plugins: PLUGINS, external: EXTERNAL }, { - input: ["src/extension/lib/single-file/browser-polyfill/chrome-browser-polyfill.js"], + input: ["src/lib/single-file/browser-polyfill/chrome-browser-polyfill.js"], output: [{ file: "lib/chrome-browser-polyfill.js", format: "iife", plugins: [terser()] }] }, { - input: ["src/extension/core/bg/index.js"], + input: ["src/core/bg/index.js"], output: [{ file: "lib/single-file-extension-background.js", format: "iife", plugins: [terser()] }] }, { - input: ["src/extension/lib/single-file/background.js"], + input: ["src/lib/single-file/background.js"], output: [{ file: "lib/single-file-background.js", format: "iife", diff --git a/src/extension/core/bg/autosave-util.js b/src/core/bg/autosave-util.js similarity index 100% rename from src/extension/core/bg/autosave-util.js rename to src/core/bg/autosave-util.js diff --git a/src/extension/core/bg/autosave.js b/src/core/bg/autosave.js similarity index 100% rename from src/extension/core/bg/autosave.js rename to src/core/bg/autosave.js diff --git a/src/extension/core/bg/background.html b/src/core/bg/background.html similarity index 100% rename from src/extension/core/bg/background.html rename to src/core/bg/background.html diff --git a/src/extension/core/bg/bookmarks.js b/src/core/bg/bookmarks.js similarity index 100% rename from src/extension/core/bg/bookmarks.js rename to src/core/bg/bookmarks.js diff --git a/src/extension/core/bg/bootstrap.js b/src/core/bg/bootstrap.js similarity index 100% rename from src/extension/core/bg/bootstrap.js rename to src/core/bg/bootstrap.js diff --git a/src/extension/core/bg/business.js b/src/core/bg/business.js similarity index 98% rename from src/extension/core/bg/business.js rename to src/core/bg/business.js index 8d2794316..628abc7d8 100644 --- a/src/extension/core/bg/business.js +++ b/src/core/bg/business.js @@ -83,7 +83,7 @@ async function saveSelectedLinks(tab) { } async function batchSaveUrls() { - return browser.tabs.create({ active: true, url: "/src/extension/ui/pages/batch-save-urls.html" }); + return browser.tabs.create({ active: true, url: "/src/ui/pages/batch-save-urls.html" }); } async function saveUrls(urls, options = {}) { diff --git a/src/extension/core/bg/config.js b/src/core/bg/config.js similarity index 100% rename from src/extension/core/bg/config.js rename to src/core/bg/config.js diff --git a/src/extension/core/bg/devtools.js b/src/core/bg/devtools.js similarity index 100% rename from src/extension/core/bg/devtools.js rename to src/core/bg/devtools.js diff --git a/src/extension/core/bg/download-util.js b/src/core/bg/download-util.js similarity index 100% rename from src/extension/core/bg/download-util.js rename to src/core/bg/download-util.js diff --git a/src/extension/core/bg/downloads.js b/src/core/bg/downloads.js similarity index 100% rename from src/extension/core/bg/downloads.js rename to src/core/bg/downloads.js diff --git a/src/extension/core/bg/editor.js b/src/core/bg/editor.js similarity index 97% rename from src/extension/core/bg/editor.js rename to src/core/bg/editor.js index 142f71a6f..1242ac4cb 100644 --- a/src/extension/core/bg/editor.js +++ b/src/core/bg/editor.js @@ -26,7 +26,7 @@ import * as config from "./config.js"; import * as yabson from "./../../lib/yabson/yabson.js"; -const EDITOR_PAGE_URL = "/src/extension/ui/pages/editor.html"; +const EDITOR_PAGE_URL = "/src/ui/pages/editor.html"; const tabsData = new Map(); const tabDataParsers = new Map(); const EDITOR_URL = browser.runtime.getURL(EDITOR_PAGE_URL); diff --git a/src/extension/core/bg/index.js b/src/core/bg/index.js similarity index 100% rename from src/extension/core/bg/index.js rename to src/core/bg/index.js diff --git a/src/extension/core/bg/requests.js b/src/core/bg/requests.js similarity index 100% rename from src/extension/core/bg/requests.js rename to src/core/bg/requests.js diff --git a/src/extension/core/bg/tabs-data.js b/src/core/bg/tabs-data.js similarity index 100% rename from src/extension/core/bg/tabs-data.js rename to src/core/bg/tabs-data.js diff --git a/src/extension/core/bg/tabs-util.js b/src/core/bg/tabs-util.js similarity index 100% rename from src/extension/core/bg/tabs-util.js rename to src/core/bg/tabs-util.js diff --git a/src/extension/core/bg/tabs.js b/src/core/bg/tabs.js similarity index 100% rename from src/extension/core/bg/tabs.js rename to src/core/bg/tabs.js diff --git a/src/extension/core/common/download.js b/src/core/common/download.js similarity index 100% rename from src/extension/core/common/download.js rename to src/core/common/download.js diff --git a/src/extension/core/content/content-bootstrap.js b/src/core/content/content-bootstrap.js similarity index 100% rename from src/extension/core/content/content-bootstrap.js rename to src/core/content/content-bootstrap.js diff --git a/src/extension/core/content/content-frames.js b/src/core/content/content-frames.js similarity index 100% rename from src/extension/core/content/content-frames.js rename to src/core/content/content-frames.js diff --git a/src/extension/core/content/content-infobar.js b/src/core/content/content-infobar.js similarity index 100% rename from src/extension/core/content/content-infobar.js rename to src/core/content/content-infobar.js diff --git a/src/extension/core/content/content.js b/src/core/content/content.js similarity index 100% rename from src/extension/core/content/content.js rename to src/core/content/content.js diff --git a/src/extension/core/devtools/devtools.html b/src/core/devtools/devtools.html similarity index 100% rename from src/extension/core/devtools/devtools.html rename to src/core/devtools/devtools.html diff --git a/src/extension/core/devtools/devtools.js b/src/core/devtools/devtools.js similarity index 100% rename from src/extension/core/devtools/devtools.js rename to src/core/devtools/devtools.js diff --git a/src/extension/ui/pages/editor.html b/src/extension/ui/pages/editor.html deleted file mode 100644 index ca4d73097..000000000 --- a/src/extension/ui/pages/editor.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - Please wait... - - - -
-
- - - - - -
-
-
- - - - - - -
-
-
- - -
-
-
- - - - - -
-
-
- - -
-
- - - - - - - - \ No newline at end of file diff --git a/src/extension/index.js b/src/index.js similarity index 100% rename from src/extension/index.js rename to src/index.js diff --git a/src/extension/lib/gdrive/gdrive.js b/src/lib/gdrive/gdrive.js similarity index 100% rename from src/extension/lib/gdrive/gdrive.js rename to src/lib/gdrive/gdrive.js diff --git a/src/extension/lib/github/github.js b/src/lib/github/github.js similarity index 100% rename from src/extension/lib/github/github.js rename to src/lib/github/github.js diff --git a/src/extension/lib/readability/Readability-readerable.js b/src/lib/readability/Readability-readerable.js similarity index 100% rename from src/extension/lib/readability/Readability-readerable.js rename to src/lib/readability/Readability-readerable.js diff --git a/src/extension/lib/readability/Readability.js b/src/lib/readability/Readability.js similarity index 100% rename from src/extension/lib/readability/Readability.js rename to src/lib/readability/Readability.js diff --git a/src/extension/lib/single-file/background.js b/src/lib/single-file/background.js similarity index 100% rename from src/extension/lib/single-file/background.js rename to src/lib/single-file/background.js diff --git a/src/extension/lib/single-file/browser-polyfill/chrome-browser-polyfill.js b/src/lib/single-file/browser-polyfill/chrome-browser-polyfill.js similarity index 100% rename from src/extension/lib/single-file/browser-polyfill/chrome-browser-polyfill.js rename to src/lib/single-file/browser-polyfill/chrome-browser-polyfill.js diff --git a/src/extension/lib/single-file/core/bg/scripts.js b/src/lib/single-file/core/bg/scripts.js similarity index 100% rename from src/extension/lib/single-file/core/bg/scripts.js rename to src/lib/single-file/core/bg/scripts.js diff --git a/src/extension/lib/single-file/fetch/bg/fetch.js b/src/lib/single-file/fetch/bg/fetch.js similarity index 100% rename from src/extension/lib/single-file/fetch/bg/fetch.js rename to src/lib/single-file/fetch/bg/fetch.js diff --git a/src/extension/lib/single-file/fetch/content/content-fetch.js b/src/lib/single-file/fetch/content/content-fetch.js similarity index 100% rename from src/extension/lib/single-file/fetch/content/content-fetch.js rename to src/lib/single-file/fetch/content/content-fetch.js diff --git a/src/extension/lib/single-file/frame-tree/bg/frame-tree.js b/src/lib/single-file/frame-tree/bg/frame-tree.js similarity index 100% rename from src/extension/lib/single-file/frame-tree/bg/frame-tree.js rename to src/lib/single-file/frame-tree/bg/frame-tree.js diff --git a/src/extension/lib/single-file/lazy/bg/lazy-timeout.js b/src/lib/single-file/lazy/bg/lazy-timeout.js similarity index 100% rename from src/extension/lib/single-file/lazy/bg/lazy-timeout.js rename to src/lib/single-file/lazy/bg/lazy-timeout.js diff --git a/src/extension/lib/yabson/yabson.js b/src/lib/yabson/yabson.js similarity index 100% rename from src/extension/lib/yabson/yabson.js rename to src/lib/yabson/yabson.js diff --git a/src/extension/ui/bg/index.js b/src/ui/bg/index.js similarity index 100% rename from src/extension/ui/bg/index.js rename to src/ui/bg/index.js diff --git a/src/extension/ui/bg/ui-batch-save-urls.js b/src/ui/bg/ui-batch-save-urls.js similarity index 100% rename from src/extension/ui/bg/ui-batch-save-urls.js rename to src/ui/bg/ui-batch-save-urls.js diff --git a/src/extension/ui/bg/ui-button.js b/src/ui/bg/ui-button.js similarity index 98% rename from src/extension/ui/bg/ui-button.js rename to src/ui/bg/ui-button.js index 35b4710a4..edd060fef 100644 --- a/src/extension/ui/bg/ui-button.js +++ b/src/ui/bg/ui-button.js @@ -27,8 +27,8 @@ import { queryTabs } from "./../../core/bg/tabs-util.js"; import * as tabsData from "./../../core/bg/tabs-data.js"; import { autoSaveIsEnabled } from "../../core/bg/autosave-util.js"; -const DEFAULT_ICON_PATH = "/src/extension/ui/resources/icon_128.png"; -const WAIT_ICON_PATH_PREFIX = "/src/extension/ui/resources/icon_128_wait"; +const DEFAULT_ICON_PATH = "/src/ui/resources/icon_128.png"; +const WAIT_ICON_PATH_PREFIX = "/src/ui/resources/icon_128_wait"; const BUTTON_DEFAULT_TOOLTIP_MESSAGE = browser.i18n.getMessage("buttonDefaultTooltip"); const BUTTON_BLOCKED_TOOLTIP_MESSAGE = browser.i18n.getMessage("buttonBlockedTooltip"); const BUTTON_DEFAULT_BADGE_MESSAGE = ""; diff --git a/src/extension/ui/bg/ui-commands.js b/src/ui/bg/ui-commands.js similarity index 100% rename from src/extension/ui/bg/ui-commands.js rename to src/ui/bg/ui-commands.js diff --git a/src/extension/ui/bg/ui-editor.js b/src/ui/bg/ui-editor.js similarity index 97% rename from src/extension/ui/bg/ui-editor.js rename to src/ui/bg/ui-editor.js index 0e5f45c76..ede048d37 100644 --- a/src/extension/ui/bg/ui-editor.js +++ b/src/ui/bg/ui-editor.js @@ -107,17 +107,17 @@ highlightButtons.forEach(highlightButton => { }; }); toggleNotesButton.onmouseup = () => { - if (toggleNotesButton.getAttribute("src") == "/src/extension/ui/resources/button_note_visible.png") { - toggleNotesButton.src = "/src/extension/ui/resources/button_note_hidden.png"; + if (toggleNotesButton.getAttribute("src") == "/src/ui/resources/button_note_visible.png") { + toggleNotesButton.src = "/src/ui/resources/button_note_hidden.png"; editorElement.contentWindow.postMessage(JSON.stringify({ method: "hideNotes" }), "*"); } else { - toggleNotesButton.src = "/src/extension/ui/resources/button_note_visible.png"; + toggleNotesButton.src = "/src/ui/resources/button_note_visible.png"; editorElement.contentWindow.postMessage(JSON.stringify({ method: "displayNotes" }), "*"); } }; toggleHighlightsButton.onmouseup = () => { - if (toggleHighlightsButton.getAttribute("src") == "/src/extension/ui/resources/button_highlighter_visible.png") { - toggleHighlightsButton.src = "/src/extension/ui/resources/button_highlighter_hidden.png"; + if (toggleHighlightsButton.getAttribute("src") == "/src/ui/resources/button_highlighter_visible.png") { + toggleHighlightsButton.src = "/src/ui/resources/button_highlighter_hidden.png"; editorElement.contentWindow.postMessage(JSON.stringify({ method: "hideHighlights" }), "*"); } else { displayHighlights(); @@ -411,7 +411,7 @@ function disableRemoveHighlights() { } function displayHighlights() { - toggleHighlightsButton.src = "/src/extension/ui/resources/button_highlighter_visible.png"; + toggleHighlightsButton.src = "/src/ui/resources/button_highlighter_visible.png"; editorElement.contentWindow.postMessage(JSON.stringify({ method: "displayHighlights" }), "*"); } diff --git a/src/extension/ui/bg/ui-menus.js b/src/ui/bg/ui-menus.js similarity index 99% rename from src/extension/ui/bg/ui-menus.js rename to src/ui/bg/ui-menus.js index f68e1b9ec..fdd96fab7 100644 --- a/src/extension/ui/bg/ui-menus.js +++ b/src/ui/bg/ui-menus.js @@ -415,7 +415,7 @@ async function initialize() { business.saveSelectedLinks(tab); } if (event.menuItemId == MENU_ID_VIEW_PENDINGS) { - await browser.tabs.create({ active: true, url: "/src/extension/ui/pages/pendings.html" }); + await browser.tabs.create({ active: true, url: "/src/ui/pages/pendings.html" }); } if (event.menuItemId == MENU_ID_SAVE_SELECTED) { business.saveTabs([tab], { selected: true }); diff --git a/src/extension/ui/bg/ui-options.js b/src/ui/bg/ui-options.js similarity index 99% rename from src/extension/ui/bg/ui-options.js rename to src/ui/bg/ui-options.js index 70695ed00..6ebef5045 100644 --- a/src/extension/ui/bg/ui-options.js +++ b/src/ui/bg/ui-options.js @@ -24,7 +24,7 @@ /* global browser, window, document, localStorage, FileReader, location, fetch, TextDecoder, DOMParser, HTMLElement */ const HELP_ICON_URL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABIUlEQVQ4y+2TsarCMBSGvxTBRdqiUZAWOrhJB9EXcPKFfCvfQYfulUKHDqXg4CYUJSioYO4mSDX3ttzt3n87fMlHTpIjlsulxpDZbEYYhgghSNOUOI5Ny2mZYBAELBYLer0eAJ7ncTweKYri4x7LJJRS0u12n7XrukgpjSc0CpVSXK/XZ32/31FKNW85z3PW6zXT6RSAJEnIsqy5UGvNZrNhu90CcDqd+C6tT6J+v//2Th+PB2VZ1hN2Oh3G4zGTyQTbtl/YbrdjtVpxu91+Ljyfz0RRhG3bzOfzF+Y4TvNXvlwuaK2pE4tfzr/wzwsty0IIURlL0998KxRCMBqN8H2/wlzXJQxD2u12vVkeDoeUZUkURRU+GAw4HA7s9/sK+wK6CWHasQ/S/wAAAABJRU5ErkJggg=="; -const HELP_PAGE_PATH = "/src/extension/ui/pages/help.html"; +const HELP_PAGE_PATH = "/src/ui/pages/help.html"; let DEFAULT_PROFILE_NAME, DISABLED_PROFILE_NAME, CURRENT_PROFILE_NAME; browser.runtime.sendMessage({ method: "config.getConstants" }).then(data => ({ DEFAULT_PROFILE_NAME, DISABLED_PROFILE_NAME, CURRENT_PROFILE_NAME } = data)); const removeHiddenElementsLabel = document.getElementById("removeHiddenElementsLabel"); diff --git a/src/extension/ui/bg/ui-panel.js b/src/ui/bg/ui-panel.js similarity index 100% rename from src/extension/ui/bg/ui-panel.js rename to src/ui/bg/ui-panel.js diff --git a/src/extension/ui/bg/ui-pendings.js b/src/ui/bg/ui-pendings.js similarity index 100% rename from src/extension/ui/bg/ui-pendings.js rename to src/ui/bg/ui-pendings.js diff --git a/src/extension/ui/common/content-error.js b/src/ui/common/content-error.js similarity index 100% rename from src/extension/ui/common/content-error.js rename to src/ui/common/content-error.js diff --git a/src/extension/ui/content/content-ui-editor-helper-web.js b/src/ui/content/content-ui-editor-helper-web.js similarity index 100% rename from src/extension/ui/content/content-ui-editor-helper-web.js rename to src/ui/content/content-ui-editor-helper-web.js diff --git a/src/extension/ui/content/content-ui-editor-init-web.js b/src/ui/content/content-ui-editor-init-web.js similarity index 100% rename from src/extension/ui/content/content-ui-editor-init-web.js rename to src/ui/content/content-ui-editor-init-web.js diff --git a/src/extension/ui/content/content-ui-editor-web.js b/src/ui/content/content-ui-editor-web.js similarity index 100% rename from src/extension/ui/content/content-ui-editor-web.js rename to src/ui/content/content-ui-editor-web.js diff --git a/src/extension/ui/content/content-ui.js b/src/ui/content/content-ui.js similarity index 100% rename from src/extension/ui/content/content-ui.js rename to src/ui/content/content-ui.js diff --git a/src/extension/ui/pages/batch-save-urls.css b/src/ui/pages/batch-save-urls.css similarity index 100% rename from src/extension/ui/pages/batch-save-urls.css rename to src/ui/pages/batch-save-urls.css diff --git a/src/extension/ui/pages/batch-save-urls.html b/src/ui/pages/batch-save-urls.html similarity index 95% rename from src/extension/ui/pages/batch-save-urls.html rename to src/ui/pages/batch-save-urls.html index 49881519e..c59191041 100644 --- a/src/extension/ui/pages/batch-save-urls.html +++ b/src/ui/pages/batch-save-urls.html @@ -7,7 +7,7 @@ - + diff --git a/src/extension/ui/pages/editor-frame-web.css b/src/ui/pages/editor-frame-web.css similarity index 100% rename from src/extension/ui/pages/editor-frame-web.css rename to src/ui/pages/editor-frame-web.css diff --git a/src/extension/ui/pages/editor-mask-web.css b/src/ui/pages/editor-mask-web.css similarity index 100% rename from src/extension/ui/pages/editor-mask-web.css rename to src/ui/pages/editor-mask-web.css diff --git a/src/extension/ui/pages/editor-note-web.css b/src/ui/pages/editor-note-web.css similarity index 100% rename from src/extension/ui/pages/editor-note-web.css rename to src/ui/pages/editor-note-web.css diff --git a/src/extension/ui/pages/editor.css b/src/ui/pages/editor.css similarity index 100% rename from src/extension/ui/pages/editor.css rename to src/ui/pages/editor.css diff --git a/src/ui/pages/editor.html b/src/ui/pages/editor.html new file mode 100644 index 000000000..9cbf07ddb --- /dev/null +++ b/src/ui/pages/editor.html @@ -0,0 +1,79 @@ + + + + + + + + + + Please wait... + + + +
+
+ + + + + +
+
+
+ + + + + + +
+
+
+ + +
+
+
+ + + + + +
+
+
+ + +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/extension/ui/pages/help.css b/src/ui/pages/help.css similarity index 100% rename from src/extension/ui/pages/help.css rename to src/ui/pages/help.css diff --git a/src/extension/ui/pages/help.html b/src/ui/pages/help.html similarity index 99% rename from src/extension/ui/pages/help.html rename to src/ui/pages/help.html index 510d2701d..533c2510e 100644 --- a/src/extension/ui/pages/help.html +++ b/src/ui/pages/help.html @@ -7,7 +7,7 @@ - + diff --git a/src/extension/ui/pages/options.css b/src/ui/pages/options.css similarity index 100% rename from src/extension/ui/pages/options.css rename to src/ui/pages/options.css diff --git a/src/extension/ui/pages/options.html b/src/ui/pages/options.html similarity index 99% rename from src/extension/ui/pages/options.html rename to src/ui/pages/options.html index ff112f7fa..689433993 100644 --- a/src/extension/ui/pages/options.html +++ b/src/ui/pages/options.html @@ -7,7 +7,7 @@ - + diff --git a/src/extension/ui/pages/panel.css b/src/ui/pages/panel.css similarity index 100% rename from src/extension/ui/pages/panel.css rename to src/ui/pages/panel.css diff --git a/src/extension/ui/pages/panel.html b/src/ui/pages/panel.html similarity index 90% rename from src/extension/ui/pages/panel.html rename to src/ui/pages/panel.html index 2c06b4f91..522ee5a9a 100644 --- a/src/extension/ui/pages/panel.html +++ b/src/ui/pages/panel.html @@ -7,7 +7,7 @@ - + diff --git a/src/extension/ui/pages/pendings.css b/src/ui/pages/pendings.css similarity index 100% rename from src/extension/ui/pages/pendings.css rename to src/ui/pages/pendings.css diff --git a/src/extension/ui/pages/pendings.html b/src/ui/pages/pendings.html similarity index 93% rename from src/extension/ui/pages/pendings.html rename to src/ui/pages/pendings.html index 11d61374d..95bd6e5ad 100644 --- a/src/extension/ui/pages/pendings.html +++ b/src/ui/pages/pendings.html @@ -7,7 +7,7 @@ - + diff --git a/src/extension/ui/resources/button_cut_inner.png b/src/ui/resources/button_cut_inner.png similarity index 100% rename from src/extension/ui/resources/button_cut_inner.png rename to src/ui/resources/button_cut_inner.png diff --git a/src/extension/ui/resources/button_cut_outer.png b/src/ui/resources/button_cut_outer.png similarity index 100% rename from src/extension/ui/resources/button_cut_outer.png rename to src/ui/resources/button_cut_outer.png diff --git a/src/extension/ui/resources/button_delete.png b/src/ui/resources/button_delete.png similarity index 100% rename from src/extension/ui/resources/button_delete.png rename to src/ui/resources/button_delete.png diff --git a/src/extension/ui/resources/button_delete_all.png b/src/ui/resources/button_delete_all.png similarity index 100% rename from src/extension/ui/resources/button_delete_all.png rename to src/ui/resources/button_delete_all.png diff --git a/src/extension/ui/resources/button_download.png b/src/ui/resources/button_download.png similarity index 100% rename from src/extension/ui/resources/button_download.png rename to src/ui/resources/button_download.png diff --git a/src/extension/ui/resources/button_edit.png b/src/ui/resources/button_edit.png similarity index 100% rename from src/extension/ui/resources/button_edit.png rename to src/ui/resources/button_edit.png diff --git a/src/extension/ui/resources/button_highlighter_blue.png b/src/ui/resources/button_highlighter_blue.png similarity index 100% rename from src/extension/ui/resources/button_highlighter_blue.png rename to src/ui/resources/button_highlighter_blue.png diff --git a/src/extension/ui/resources/button_highlighter_delete.png b/src/ui/resources/button_highlighter_delete.png similarity index 100% rename from src/extension/ui/resources/button_highlighter_delete.png rename to src/ui/resources/button_highlighter_delete.png diff --git a/src/extension/ui/resources/button_highlighter_green.png b/src/ui/resources/button_highlighter_green.png similarity index 100% rename from src/extension/ui/resources/button_highlighter_green.png rename to src/ui/resources/button_highlighter_green.png diff --git a/src/extension/ui/resources/button_highlighter_hidden.png b/src/ui/resources/button_highlighter_hidden.png similarity index 100% rename from src/extension/ui/resources/button_highlighter_hidden.png rename to src/ui/resources/button_highlighter_hidden.png diff --git a/src/extension/ui/resources/button_highlighter_pink.png b/src/ui/resources/button_highlighter_pink.png similarity index 100% rename from src/extension/ui/resources/button_highlighter_pink.png rename to src/ui/resources/button_highlighter_pink.png diff --git a/src/extension/ui/resources/button_highlighter_visible.png b/src/ui/resources/button_highlighter_visible.png similarity index 100% rename from src/extension/ui/resources/button_highlighter_visible.png rename to src/ui/resources/button_highlighter_visible.png diff --git a/src/extension/ui/resources/button_highlighter_yellow.png b/src/ui/resources/button_highlighter_yellow.png similarity index 100% rename from src/extension/ui/resources/button_highlighter_yellow.png rename to src/ui/resources/button_highlighter_yellow.png diff --git a/src/extension/ui/resources/button_new.png b/src/ui/resources/button_new.png similarity index 100% rename from src/extension/ui/resources/button_new.png rename to src/ui/resources/button_new.png diff --git a/src/extension/ui/resources/button_note_blue.png b/src/ui/resources/button_note_blue.png similarity index 100% rename from src/extension/ui/resources/button_note_blue.png rename to src/ui/resources/button_note_blue.png diff --git a/src/extension/ui/resources/button_note_edit.png b/src/ui/resources/button_note_edit.png similarity index 100% rename from src/extension/ui/resources/button_note_edit.png rename to src/ui/resources/button_note_edit.png diff --git a/src/extension/ui/resources/button_note_format.png b/src/ui/resources/button_note_format.png similarity index 100% rename from src/extension/ui/resources/button_note_format.png rename to src/ui/resources/button_note_format.png diff --git a/src/extension/ui/resources/button_note_green.png b/src/ui/resources/button_note_green.png similarity index 100% rename from src/extension/ui/resources/button_note_green.png rename to src/ui/resources/button_note_green.png diff --git a/src/extension/ui/resources/button_note_hidden.png b/src/ui/resources/button_note_hidden.png similarity index 100% rename from src/extension/ui/resources/button_note_hidden.png rename to src/ui/resources/button_note_hidden.png diff --git a/src/extension/ui/resources/button_note_pink.png b/src/ui/resources/button_note_pink.png similarity index 100% rename from src/extension/ui/resources/button_note_pink.png rename to src/ui/resources/button_note_pink.png diff --git a/src/extension/ui/resources/button_note_visible.png b/src/ui/resources/button_note_visible.png similarity index 100% rename from src/extension/ui/resources/button_note_visible.png rename to src/ui/resources/button_note_visible.png diff --git a/src/extension/ui/resources/button_note_yellow.png b/src/ui/resources/button_note_yellow.png similarity index 100% rename from src/extension/ui/resources/button_note_yellow.png rename to src/ui/resources/button_note_yellow.png diff --git a/src/extension/ui/resources/button_ok.png b/src/ui/resources/button_ok.png similarity index 100% rename from src/extension/ui/resources/button_ok.png rename to src/ui/resources/button_ok.png diff --git a/src/extension/ui/resources/button_print.png b/src/ui/resources/button_print.png similarity index 100% rename from src/extension/ui/resources/button_print.png rename to src/ui/resources/button_print.png diff --git a/src/extension/ui/resources/button_redo_cut.png b/src/ui/resources/button_redo_cut.png similarity index 100% rename from src/extension/ui/resources/button_redo_cut.png rename to src/ui/resources/button_redo_cut.png diff --git a/src/extension/ui/resources/button_undo_all_cut.png b/src/ui/resources/button_undo_all_cut.png similarity index 100% rename from src/extension/ui/resources/button_undo_all_cut.png rename to src/ui/resources/button_undo_all_cut.png diff --git a/src/extension/ui/resources/button_undo_cut.png b/src/ui/resources/button_undo_cut.png similarity index 100% rename from src/extension/ui/resources/button_undo_cut.png rename to src/ui/resources/button_undo_cut.png diff --git a/src/extension/ui/resources/icon_128.png b/src/ui/resources/icon_128.png similarity index 100% rename from src/extension/ui/resources/icon_128.png rename to src/ui/resources/icon_128.png diff --git a/src/extension/ui/resources/icon_128_wait0.png b/src/ui/resources/icon_128_wait0.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait0.png rename to src/ui/resources/icon_128_wait0.png diff --git a/src/extension/ui/resources/icon_128_wait1.png b/src/ui/resources/icon_128_wait1.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait1.png rename to src/ui/resources/icon_128_wait1.png diff --git a/src/extension/ui/resources/icon_128_wait2.png b/src/ui/resources/icon_128_wait2.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait2.png rename to src/ui/resources/icon_128_wait2.png diff --git a/src/extension/ui/resources/icon_128_wait3.png b/src/ui/resources/icon_128_wait3.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait3.png rename to src/ui/resources/icon_128_wait3.png diff --git a/src/extension/ui/resources/icon_128_wait4.png b/src/ui/resources/icon_128_wait4.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait4.png rename to src/ui/resources/icon_128_wait4.png diff --git a/src/extension/ui/resources/icon_128_wait5.png b/src/ui/resources/icon_128_wait5.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait5.png rename to src/ui/resources/icon_128_wait5.png diff --git a/src/extension/ui/resources/icon_128_wait6.png b/src/ui/resources/icon_128_wait6.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait6.png rename to src/ui/resources/icon_128_wait6.png diff --git a/src/extension/ui/resources/icon_128_wait7.png b/src/ui/resources/icon_128_wait7.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait7.png rename to src/ui/resources/icon_128_wait7.png diff --git a/src/extension/ui/resources/icon_128_wait8.png b/src/ui/resources/icon_128_wait8.png similarity index 100% rename from src/extension/ui/resources/icon_128_wait8.png rename to src/ui/resources/icon_128_wait8.png diff --git a/src/extension/ui/resources/icon_16.png b/src/ui/resources/icon_16.png similarity index 100% rename from src/extension/ui/resources/icon_16.png rename to src/ui/resources/icon_16.png diff --git a/src/extension/ui/resources/icon_48.png b/src/ui/resources/icon_48.png similarity index 100% rename from src/extension/ui/resources/icon_48.png rename to src/ui/resources/icon_48.png diff --git a/src/extension/ui/resources/icon_64.png b/src/ui/resources/icon_64.png similarity index 100% rename from src/extension/ui/resources/icon_64.png rename to src/ui/resources/icon_64.png