gnuzilla

default description
git clone https://git.awy.one/gnuzilla.git
Log | Files | Refs | README | LICENSE

commit a76a7880a6898f68dd0cdf55a2187e34ff0a7aba
parent 088df2474435bba0498ad8133b0e77a917ce2ed4
Author: awy <awy@awy.one>
Date:   Mon, 22 Sep 2025 22:55:40 +0300

new extensions (sponsorblock, libredirect, librejs)

Diffstat:
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/cose.manifest | 712+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/cose.sig | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/manifest.mf | 722+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/mozilla.rsa | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/mozilla.sf | 4++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ar/messages.json | 161+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/bn/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/bs/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/cs/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/de/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/delete.py | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/en/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/eo/messages.json | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/es/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fa/messages.json | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fi/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fil/messages.json | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/filter.py | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fr/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/gl/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hi/messages.json | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hr/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hu/messages.json | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/id/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/it/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ja/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/jv/messages.json | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ko/messages.json | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/nb_NO/messages.json | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/nl/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pl/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pt/messages.json | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pt_BR/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ro/messages.json | 157+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ru/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/sr/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ta/messages.json | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/tr/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/uk/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/vi/messages.json | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/zh_Hans/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/zh_Hant/messages.json | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/about-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/about-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/baiduTieba-icon.svg | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bandcamp-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bilibili-icon-light.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bilibili-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bluesky-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chatGpt-icon-light.svg | 10++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chatGpt-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chefkoch-icon.svg | 43+++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/coub-icon.svg | 44++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/deviantArt-icon.svg | 474+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/fandom-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/geeksForGeeks-icon.svg | 39+++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/general-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/general-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/genius-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/github-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/github-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/gitlab-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/goodreads-icon-light.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/goodreads-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/ifunny-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/imdb-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/imgur-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/instagram-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/instructables-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/knowyourmeme-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-128.png | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-16.png | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-32.png | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-48.png | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-64.png | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-96.png | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect.png | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/maps-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/maps-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/medium-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/meet-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/meet-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/mozhi-icon.svg | 154+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/office-icon-light.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/office-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pastebin-icon-light.svg | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pastebin-icon.svg | 3+++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/peertube-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pinterest-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pixiv-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/quora-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/reddit-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/reuters-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/search-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/search-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/sendFiles-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/sendFiles-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/snopes-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/soundcloud-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/stackOverflow-icon-light.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/stackOverflow-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tekstowo-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tenor-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/textStorage-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/textStorage-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/threads-icon-light.svg | 21+++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/threads-icon.svg | 18++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tiktok-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/translate-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/translate-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tumblr-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/twitch-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/twitter-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/ultimateGuitar-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/urbanDictionary-icon.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/waybackMachine-icon-light.svg | 1+
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/waybackMachine-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/wikipedia-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/wolframAlpha-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/youtube-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/youtubeMusic-icon.svg | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/javascripts/services.js | 1099+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/javascripts/utils.js | 297+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/config.json | 1498+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/manifest.json | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/background/background.html | 7+++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/background/background.js | 361+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/Inter-VariableFont_slnt,wght.ttf | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/Vazirmatn-VariableFont_wght.ttf | 0
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/styles.css | 14++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.css | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.js | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.js.map | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/index.html | 14++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/App.svelte | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/main.js | 7+++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/stores.js | 5+++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.css | 17+++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.js | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.js.map | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/index.html | 18++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.css | 6++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.js | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.js.map | 2++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/index.html | 18++++++++++++++++++
Adata/extensions/7esoorv3@alefvanoon.anonaddy.me/updates/updates.xml | 6++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/cose.manifest | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/cose.sig | 0
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/manifest.mf | 147+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/mozilla.rsa | 0
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/mozilla.sf | 4++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/bundle.js | 9046+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/common/Storage.js | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/common/Test.js | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/common/checks.js | 448+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/common/debug.js | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/common/fname_data.json | 832+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/common/license_definitions.json | 449+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/common/pattern_utils.js | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/content/contactFinder.js | 259+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/content/dialog.css | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/content/overlay.css | 28++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/README | 22++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/background-panel.png | 0
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/common.css | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/display-panel.html | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/main_panel.js | 231+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/panel-styles.css | 182+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/fastclick.js | 841+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/fastclick.js.LICENSE.txt | 22++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/librejs-title.png | 0
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/mobile.js | 8++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/pref.js | 315+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/preferences_panel.html | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/prefs.css | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/icons/librejs.png | 0
Adata/extensions/jid1-KtlZuoiikVfFew@jetpack/manifest.json | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/META-INF/cose.manifest | 717+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/META-INF/cose.sig | 0
Adata/extensions/sponsorBlocker@ajay.app/META-INF/manifest.mf | 727+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/META-INF/mozilla.rsa | 0
Adata/extensions/sponsorBlocker@ajay.app/META-INF/mozilla.sf | 4++++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ar/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/bg/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/bn/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ca/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/cs/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/da/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/de/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/el/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/en/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/es/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/et/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/fa/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/fi/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/fil/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/fr/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/he/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/hi/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/hr/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/hu/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/id/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/it/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ja/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/kn/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ko/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/lt/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/lv/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ml/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ms/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/nl/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/no/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/pl/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/pt_BR/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/pt_PT/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ro/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ru/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/sk/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/sr/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/sv/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/ta/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/te/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/th/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/tr/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/uk/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/vi/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/zh_CN/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/_locales/zh_TW/messages.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/content.css | 977+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/help/images/popup.png | 0
Adata/extensions/sponsorBlocker@ajay.app/help/images/submission menu.png | 0
Adata/extensions/sponsorBlocker@ajay.app/help/images/votebuttons.gif | 0
Adata/extensions/sponsorBlocker@ajay.app/help/images/voting on notice.gif | 0
Adata/extensions/sponsorBlocker@ajay.app/help/index.html | 148+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/help/styles.css | 449+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker1024px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker128px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker16px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker256px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker32px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker512px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker64px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker1024px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker128px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker256px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker512px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker64px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/PlayerCancelSegmentIconSponsorBlocker.svg | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/PlayerDeleteIconSponsorBlocker.svg | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/PlayerInfoIconSponsorBlocker.svg | 6++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/PlayerStartIconSponsorBlocker.svg | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/PlayerStopIconSponsorBlocker.svg | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/PlayerUploadFailedIconSponsorBlocker.svg | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/PlayerUploadIconSponsorBlocker.svg | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker128px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker16px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker32px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker64px.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/beep.oga | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/bolt.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/campaign.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/check-smaller.svg | 38++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/check.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/icons/clipboard.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/icons/close-smaller.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/close.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/dearrow.svg | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/downvote.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/export.svg | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/heart.svg | 43+++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/help.svg | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/import.svg | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/lightbulb.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/loop.svg | 4++++
Adata/extensions/sponsorBlocker@ajay.app/icons/looped.svg | 5+++++
Adata/extensions/sponsorBlocker@ajay.app/icons/money.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/music-note.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/newprofilepic.jpg | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/not_visible.svg | 39+++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/pause.svg | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/pencil.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/icons/refresh.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/icons/report.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/right-arrow.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/segway.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/settings.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/icons/skip.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/icons/skipIcon.svg | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/sort.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/icons/star.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/stop.svg | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/stopwatch.svg | 37+++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/thumb.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/icons/thumbs_down.svg | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/thumbs_down_locked.svg | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/thumbs_up.svg | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/upvote.png | 0
Adata/extensions/sponsorBlocker@ajay.app/icons/upvote.svg | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/icons/visible.svg | 2++
Adata/extensions/sponsorBlocker@ajay.app/js/background.js | 2++
Adata/extensions/sponsorBlocker@ajay.app/js/content.js | 3+++
Adata/extensions/sponsorBlocker@ajay.app/js/content.js.LICENSE.txt | 29+++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/js/document.js | 2++
Adata/extensions/sponsorBlocker@ajay.app/js/help.js | 2++
Adata/extensions/sponsorBlocker@ajay.app/js/options.js | 3+++
Adata/extensions/sponsorBlocker@ajay.app/js/options.js.LICENSE.txt | 29+++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/js/permissions.js | 2++
Adata/extensions/sponsorBlocker@ajay.app/js/popup.js | 3+++
Adata/extensions/sponsorBlocker@ajay.app/js/popup.js.LICENSE.txt | 29+++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 | 0
Adata/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 | 0
Adata/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 | 0
Adata/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 | 0
Adata/extensions/sponsorBlocker@ajay.app/libs/Source+Sans+Pro.css | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/manifest.json | 171+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/mozilla-recommendation.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/options/options.css | 748+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/options/options.html | 728+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/oss-attribution/attribution.txt | 206+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/permissions/index.html | 33+++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/permissions/styles.css | 361+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/popup.css | 631+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/popup.html | 14++++++++++++++
Adata/extensions/sponsorBlocker@ajay.app/res/countries.json | 2++
Adata/extensions/sponsorBlocker@ajay.app/shared.css | 233+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdata/patches/allow-ubo-private-mode.patch | 33+++++++++++++++++++++++++++++++++
328 files changed, 33569 insertions(+), 0 deletions(-)

diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/cose.manifest b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/cose.manifest @@ -0,0 +1,712 @@ +Manifest-Version: 1.0 + +Name: config.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: UsvV4TMPctbz9JQ83h7wJythH0o= +SHA256-Digest: 48O4Un3CzBeI4fyRqCQPFSz85rWPNPBP3zZprRh9LDg= + +Name: manifest.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: D+44bpOQs2D6iUyD2bNObvmYHmA= +SHA256-Digest: 1k5HH6l2rSeelo5gbDauxiF5RYVbw4YqFTL68i+U/2w= + +Name: assets/javascripts/utils.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q/moYrSUtalUaHn0AW34gpI7oCs= +SHA256-Digest: kem+uK+An39t2oWNTfGNGUSmkxkvayqlzUKXJmOPH2s= + +Name: assets/javascripts/services.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fhBwV9oAApKzIlxXX2IhxU77r60= +SHA256-Digest: mlvzcPFnFr7l8bFNjgFE4fnW+pWNOn5ADAWxe3qW2fo= + +Name: assets/images/stackOverflow-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mE4jl0xAIryG15tepmZVuuwtMg4= +SHA256-Digest: em+2DXksyaHOMOAc3q0BwPkpFgVMiQMT+R07vdT96DY= + +Name: assets/images/imdb-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4gGhG7GbSe01ldqZlGZ3IgcdDA4= +SHA256-Digest: 4/jHs23ACO5SfAq9JtUF4F1vNSNYexfBUIY/8wJcGnY= + +Name: assets/images/bandcamp-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: DVq5REzY+e09n/UAKDx+9aiWm8A= +SHA256-Digest: G/xyZ8ZtkF7DfVqdFtOyxq2WyGBKa+vFL/iYR7w1BSM= + +Name: assets/images/about-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jIjfhMh+2U34/FtCuXVAvKlsW5w= +SHA256-Digest: KAqmtauj+sBAp/0z0PknhcpsnTY+TNTAsz8R1s7MVno= + +Name: assets/images/chefkoch-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8s1VvaRDs+tlU22kT47jE7KCIU4= +SHA256-Digest: vpxb+l1IR+M5r85kdur8mkrUnmlscToFW2kMRQ4VvOA= + +Name: assets/images/pixiv-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sHKx2cHhX2jHC//trKrvnNtlLpc= +SHA256-Digest: J+31b6NquW4RH5/woPaT2RCZgVEIesKGdqzttLhV57w= + +Name: assets/images/libredirect.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: GZAkNOyHM/lMecOG6dfDupcaudE= +SHA256-Digest: 9wd9+mlmKemmL2ranVarTeeD/4CHSWH1WJKtZfni6Os= + +Name: assets/images/threads-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fWRvaFKtjuBtnzCuhep5yr6gByM= +SHA256-Digest: 55NEwAD85Wsg5l7Y9kRt2Jg0NO/wkRJMd/RJAKLUC8A= + +Name: assets/images/goodreads-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wd81ZtkJNMcFeqb74My0qtgACV8= +SHA256-Digest: yrk2HyngjDLgr5aN4hAYYXTRnNEzM2Qt64FZBnny9O8= + +Name: assets/images/tiktok-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fDLLVbrpLzYUy2JId63+iG/KKN0= +SHA256-Digest: y61cXd4ZWIVwfjG1j+VcF1/9YWcVUoVvemA+3JOdq90= + +Name: assets/images/general-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 7/OIaUokzOJfIQhryWL9oyi4MG4= +SHA256-Digest: dtFKJnVYUelfP0jeBnwC4kWDzwf2vfKt6snn2zGPYKw= + +Name: assets/images/chatGpt-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Qdd5h+308P9N6u876Z/+xo8WKvw= +SHA256-Digest: omU80n8gpOdk7fUbdA+Q5GqGqvCBm2CiMCflBb0QB0A= + +Name: assets/images/imgur-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gghpWtsurccQ138Q6rpoR6rnkaQ= +SHA256-Digest: zwI/izY8XpsTdk7va/c26dx/0h8zMQYWvOb0nUaZVdk= + +Name: assets/images/threads-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: qYrnMDCKQhbH8N0Ai6HBLoXwafk= +SHA256-Digest: HzF4dkBv7znk5ygmz9M5BiPo7A0B2JuReE8NQ/PDCus= + +Name: assets/images/knowyourmeme-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 5Z5zqwVft5v6xtjyJ9rYjt7B6Gk= +SHA256-Digest: /9qvibKdO14rKU7WutOZ9onaUYq+S21CTXuGAiUThoI= + +Name: assets/images/wolframAlpha-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 0hpA3r0SMTA96m0dv1SjEoglzko= +SHA256-Digest: bVcJKswijmMrdx47G15ZpChMP/5HtebS2MNEPF2vwaA= + +Name: assets/images/sendFiles-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: D2Ve8L+AHeFr0XB89YosucDqdBY= +SHA256-Digest: Mp1pKA6VinBGHuOqCoA5cXfG4poRysjQ1yAJpommkmA= + +Name: assets/images/sendFiles-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: otabZkqvZ80bQJE6JawoZY3pchk= +SHA256-Digest: j4DtNuUDceOzHL1GRwCOoKTZklGu3YhJEuZ8zyurbsw= + +Name: assets/images/pastebin-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: P9RptuiZ/g3ZX51WUCofeO2V2BE= +SHA256-Digest: wb4KtN8UQuP3X5xXCWvBJaDKM2XDydf6hgUNJ/1/UZQ= + +Name: assets/images/libredirect-64.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RRaHeEeL4KfHpgKPtp/rIsUJIik= +SHA256-Digest: Pstd17hVOBVflbFE1BbuO7iJ98AyHqXM2XGDoZqs2Q4= + +Name: assets/images/twitch-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4KZmO4mcpE8cnq9yfCHRVwTwK8Q= +SHA256-Digest: zwX71qkKukuQbzxhFicar0TF2KMiRiVWX1dnYFOa3gY= + +Name: assets/images/about-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: FvYHZI0AOF4iUkUnSJtjJFuRMoE= +SHA256-Digest: E/Zd5vzL6GqhQkZQvagGOnSdxIZkYJzzHx23BEZ2lbk= + +Name: assets/images/youtube-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: lzlWbLBGAFMHxrf6m1J3PwlmCO4= +SHA256-Digest: vperspuztpE1kngy1Kr3PMKXWC8KLdylvtDKR535DZU= + +Name: assets/images/libredirect-96.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: LaruOlsvD2AQDkjOesZQE7GgyQ8= +SHA256-Digest: d7S5jXsWWiPlKCAJDtqx16LfCW84ErcSq2QuyTcUsHU= + +Name: assets/images/wikipedia-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: nCql5+EccO/HLoj/DP8CqzaWQsQ= +SHA256-Digest: GPD5LtN5hS0RziFqRFOc5Z/TPyYD4oDrIEVBzYtYj4w= + +Name: assets/images/reuters-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 51MGeGTnpalOaS2piUG1IjUACSk= +SHA256-Digest: G9zLKVrZpJ1fSCz9L+VDjaE6zFg7NeL+KvqQUjdBEpw= + +Name: assets/images/genius-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Y72Hg60ZaTkHPPyQ7+/4jp1jbOI= +SHA256-Digest: n2aJgY6EK7dBmgT0rsGTy3l99/FfAF74vVdlwrlpS4s= + +Name: assets/images/snopes-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 2l7DATmLCieAZerE8hhYzVHp2Ws= +SHA256-Digest: NhaFd5xi5Z+E8ukfV1Ah5P/RvGRDcgKLjAYNj/zfT+U= + +Name: assets/images/coub-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: phDCVqfEXAYy92qPTXBr1Zmh7us= +SHA256-Digest: /Qw6Q9t7zVSM+B3+dA7/6UwONQI0gX6Ac6d0syhjOdg= + +Name: assets/images/general-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Uvz5f4+dwrx08aFqSARGXqsM1fQ= +SHA256-Digest: ICMa52bUXB8yL7vXfr8jfXTByvTIzkyP2vugQu0jaSI= + +Name: assets/images/office-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: XmZHsKAA240lF86d4wxq+F8ztcA= +SHA256-Digest: DZBv6kJU7+isQD2os0FYFRdu30v4cRYJtNyeoqBbA68= + +Name: assets/images/meet-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8vo3ZKxWIbcjssj6eTTmZa53ggQ= +SHA256-Digest: vQwWt1Tu+xAyaQRsR4Gg02Mpj7t/TwU97hFek2Zey/s= + +Name: assets/images/peertube-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: C8m8H2X4ArMJY1tmApRaX9k2JVY= +SHA256-Digest: GI3E+GILotChsnz/UIDeF/pUT2N+j0StBWRJQ81qh9s= + +Name: assets/images/goodreads-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Y3QU1EMiQ5+uNHnA9F3u/FuM+sk= +SHA256-Digest: eZQBe4WnNkRv28JJlfNOTBF+AXz905gJsd3xjHZlm9U= + +Name: assets/images/pinterest-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bLdcu0kZ4Tf5zZWla4GdWfK0YJ0= +SHA256-Digest: Kg9a/oA1Uu/aNMHzEroBDt0Ssb/ytRboAzi+keGqcdU= + +Name: assets/images/gitlab-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: QpeT0PKU9NRadluIsm1HlrPpPZw= +SHA256-Digest: oozyeGoxoC/O3gqNOq9oJfYOM2iUhDL/ofaGpecbzAk= + +Name: assets/images/geeksForGeeks-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TW3t6MtvGqmFyM6dwahuIdPzguA= +SHA256-Digest: px2ZJo6NG/IPvinjJ883S1FtF6ccjv0FABFEHyRPDnA= + +Name: assets/images/bluesky-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TesfwiW/FmuuNoZp5SKIoikOus4= +SHA256-Digest: zZ3UTs3qK93P5jkCQwsy+sasRu0N4pmhq/eD3HkIoCU= + +Name: assets/images/fandom-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: aXfE5IPKS25fwLATCu04MCEWsO8= +SHA256-Digest: qQUN5pCcMd33HyRXssZPDXWv/FNr2FavHAMmFdBvOB8= + +Name: assets/images/search-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vQW7/zKdr4VUnRc2daWJyOkspg4= +SHA256-Digest: 3RKjQrMXXB69TeDauwAqXGa1ETqicOPdnEBmXxa3RfQ= + +Name: assets/images/maps-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TGZ9nThiz7tUl6NOFkLpuYtew3w= +SHA256-Digest: ZYALNmKVoc1ZTgPfE5wMLVE7fdvW1y+QrznH34o6sGw= + +Name: assets/images/ultimateGuitar-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PPywAvB7MX4a1r3QfxhXKFM0Sek= +SHA256-Digest: 0ltkqCeibPKJ2mcw01XiL9+/nwVAfun4y2wR5UgLNXk= + +Name: assets/images/textStorage-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gs9Oa/9SZEuNn/t8a3MrXyuW/U8= +SHA256-Digest: eS2BBiFlOEDHJjaxFEEmuMZJzi7jIjmeMAtH3ybZd6Q= + +Name: assets/images/libredirect-128.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 33BiOlaifWzCfQCQucKMHMnfVUY= +SHA256-Digest: Gw20HuGqfXokTKizRVGxXHzJFKfzBJUiLFW4uMRGmJY= + +Name: assets/images/libredirect-32.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: GGAIAvHKrngMNEd66jZMCSh3ImQ= +SHA256-Digest: PcqDqD2hDPPM4SDy1yIIKYoRiCGbZqIyelCb/1Oahzk= + +Name: assets/images/chatGpt-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: NEzItB4W7t3r0rmDYGEYJXSDgyA= +SHA256-Digest: hEOkd7qCKFXDEjils1+OI31BUexqC0FrvG80ABQbwkU= + +Name: assets/images/bilibili-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +ipC89BLF6ixyBYVsRXDTdbnQ5A= +SHA256-Digest: PKSgz9b3vfRhycOq5MHDk6yTv3eczgA/kZBQMcihtLg= + +Name: assets/images/baiduTieba-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: j0ASOxqLDm7/amHZVlxdCCpSBKA= +SHA256-Digest: xEzmMoopBD2H2qFO3REE2n036UXkk2sWBtnun4ksDiI= + +Name: assets/images/github-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: V7Q0tNTf6L+JCUzg4FbIf17JfMk= +SHA256-Digest: e8Susu08xDxMBbB2r4ugVPmeAC1nj4Gwv+pJb3cc1mM= + +Name: assets/images/quora-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: tZhcnsx9/mur9nknGtsUYzqd4Hs= +SHA256-Digest: 5LOKz06p8YYkydrAKHWHZyD585Sbyu7OsMTods8ytXU= + +Name: assets/images/mozhi-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: lDyzuzUa0m2Ilk9hk2XG4Bf1XMo= +SHA256-Digest: 7kLOc1N7WwbTAnQbPk9q3fxvKWqReulFVWe5Dtx7DpE= + +Name: assets/images/reddit-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: R4RaSLToJ5xlHWJ2GsA5hEibZPQ= +SHA256-Digest: NH9zBI9FH7v1hYZAIgxZBxj3tOLq6H6tyivOvQ39kVs= + +Name: assets/images/tumblr-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: AepuNY54Nnms+UrpVYQSGjvQYY4= +SHA256-Digest: tcw0vopBzhiPJ/4KV+9CIroEr3khhersCvzVEOsBm0c= + +Name: assets/images/instructables-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 6n2wq7/eVJAHyvttkJ6sUvfHvmk= +SHA256-Digest: xmD/ZqmQE0riGttsj4nG63ZRPzUyLLc7q3vkhHMBQnI= + +Name: assets/images/libredirect.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mx4rCt8wmYdgvvZGm8p1DKWSNec= +SHA256-Digest: FJ5N5/xIQ2rjvFK1nuX0CwXDi1A6tEWhNxNLp9qEZjI= + +Name: assets/images/maps-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: szOP/i035TUO4mYiWostHJ3CxW8= +SHA256-Digest: avVTr2JXfQ1GLVgFpfVg/ax0+tnGofMwSo6Ynqy4pn8= + +Name: assets/images/deviantArt-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jJ1VDOBwpLAfEuk3g7S5/Ea+A24= +SHA256-Digest: AKHnJThM9Na9O4joYQVYwTmJAl7JXmY3IN7BvA9/bIk= + +Name: assets/images/textStorage-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: YdSrxeCY1vqzvvHBuwdU7rGAKnI= +SHA256-Digest: pR28GymBk556rT8mF6DMi0xtmPQrSb8Jz+StjU1bOmY= + +Name: assets/images/translate-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: aHVieyOZaNZgw9f2H7OSfE9mSvU= +SHA256-Digest: guV9Tja+9oLDBtsp5Oxqp6ZTPEoOm9bf1meWzqx14ik= + +Name: assets/images/meet-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gD9UjJ55MutIHYxEieOhQbiFy2Q= +SHA256-Digest: bq1y2rha9QM7KS1LOiHQXUnrphuQRnUIksZC3KLBYJA= + +Name: assets/images/waybackMachine-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oFGndAZXKEgbhmHTkDbkhIbtLtY= +SHA256-Digest: aONIXU74DKPWoa+6OTAUP+2z8ekQ4UjLcOAkl0Phmr4= + +Name: assets/images/libredirect-48.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TK8b+PO4NSd7sindWWBgXgEIhzY= +SHA256-Digest: 6nGXVO3Elm6vCjkACNeWGKsxrPW9+MTaLifbV3LpUtw= + +Name: assets/images/pastebin-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8xtqPtyp6Zy4nQ69IWXjyfRniHY= +SHA256-Digest: KdjlL/4nyw1sgVFpfWflODLFJhuf+8TPgsR17R2K6a0= + +Name: assets/images/tekstowo-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: rRHgWKeBnkXC+/2wlws7w+NV5iw= +SHA256-Digest: 2bflmYiMQDIF2WHd6lbarLd93AM/lVZyj6Sz9PJ7s0g= + +Name: assets/images/urbanDictionary-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: hVUpstxpvVv23cvm/GIGTDW72+8= +SHA256-Digest: PK+mjX+EtjBfyK+boMNShRuewL9ri7ZbI6TsRi6GGnE= + +Name: assets/images/soundcloud-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JfM7GXletsPSInPF1+Ifz+O+5S0= +SHA256-Digest: Hkdu5rzYatr1KSUFWbPIo+igHEcqkNdLOdEa/78QX0E= + +Name: assets/images/waybackMachine-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: kEhBPRTObUi/H4dUwItTnA4zY8o= +SHA256-Digest: jIbqVbhRquT+1jL4vTuoO9EiMdIblcbgcga2m5gUnxQ= + +Name: assets/images/ifunny-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s0YG6mG6rVG1OdO+0tRcj2jCUuQ= +SHA256-Digest: niQaXhxxeBDwL7O+VxI4oyNhVRef+mgkyZlXpkx0tQo= + +Name: assets/images/instagram-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: AUZ8+SKmnNzu7T0K3DBIVto6ebA= +SHA256-Digest: c4qO15GOxjUKQ6thpM/NRnfb+x50EyDwGXKs4CT7ScE= + +Name: assets/images/medium-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 2h8hDP73JM8E1YBo7f1RGJTYbl8= +SHA256-Digest: KHDt7jIpKjnVGBMthw3yaxO2TVcWKTR2Vv2zmu0Y9aY= + +Name: assets/images/search-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: e8fwImU4K6U9aA5ugLfer9NEGik= +SHA256-Digest: P/NFmmNNB84NHCXh1kGKwVyw41aUF1gWusfB6918EY4= + +Name: assets/images/translate-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mcDzfpR3ZmDxajpOGNMid2nYtGw= +SHA256-Digest: B5X8Jreh5Vl5J7Jfv49sWHyA+bmvWMwYI/MHvS7PQWQ= + +Name: assets/images/stackOverflow-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ubcKXXK6J6Zc72IDi84lZFBWVgc= +SHA256-Digest: l14neVWmhbufarD8URyv+tjSeVBSS4JkaimhCCqywVQ= + +Name: assets/images/youtubeMusic-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 6l0WNmEScAysJzYy4rFqk2QR+PI= +SHA256-Digest: hlDfvdRDicWbUE8QUqCajP62e/wBgsI4bPu5tn2co+M= + +Name: assets/images/office-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 0m8BBK1Dp63FP7Yadr6i4ITG0g4= +SHA256-Digest: G6coBTZVSfy4IruBi9W/2qGYuF/x7wMk0FUi7GmTK48= + +Name: assets/images/twitter-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RSiCGQ5fsoVs7bgO+yqdY2ANjaY= +SHA256-Digest: ZqbislNlcuZq39UQA/kR91mZoAxUycDI8aYRKSCb5VE= + +Name: assets/images/tenor-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bhG8HHP1kPglYKZWIajoHyC9dUs= +SHA256-Digest: xxhZUOw2RpiAjHmslbL9ZN4xTwnlXsmtYaSW0yGAwlc= + +Name: assets/images/bilibili-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JvpNJm4BG87gZdWSZRX4BMx4EFs= +SHA256-Digest: V/dwstjF4pZO/yypURBxl/y4oUAwDBywKJrAWsgaYlQ= + +Name: assets/images/libredirect-16.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: rWTThkGxheJTDjI8oOdMsRFccwY= +SHA256-Digest: ulsjPmuF1ybqydv7f34ES8Xn1dyFxDVG1xJWlKC9OiA= + +Name: assets/images/github-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ShPyn5094QgC5R+E8PhEQQC64as= +SHA256-Digest: OBVF9m98zHUgNFogExoWK3QU9ewUorMwuy768ElpzIs= + +Name: updates/updates.xml +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: XQpiHuzR20zTr71/TuVYzhNUAnk= +SHA256-Digest: 0PX+Cby5zDo54ACZXDoSHLht1dK7R3/LTWdnV5JhTDI= + +Name: pages/background/background.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bo8froMEHMMiKCEmyvJiEXxtUXc= +SHA256-Digest: b0CKUs7m+pvb4MJA4WoK8igYDpvtBsVuQSj81sEv2hQ= + +Name: pages/background/background.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: H2Zdux1Z0lRrAuXkDx59mg3Xl8k= +SHA256-Digest: SYJjnTcxaXDVLL+PxCeypHkBL939/R4YL0M48HND2J8= + +Name: pages/options/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q9ub6o7xVxRgVTgVCD48MwdNVnI= +SHA256-Digest: GpLTVHmAmr0wZ/EeFJHwlsHgvHnRswUcYpyhegZDnWs= + +Name: pages/options/build/bundle.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sl0r4s5GMt/fDHarVrLCLTVIkec= +SHA256-Digest: H0JvpQ8PkZtSfoyObQk4L38gdJVGCMkT5Mi1oGs+ewU= + +Name: pages/options/build/bundle.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ismPRDtH9TZR3puDU8zl5NyE5T4= +SHA256-Digest: zu7Oh/DihvxiIGx55faPF6qXYgoPIpz2j3MWktcpVlI= + +Name: pages/options/build/bundle.js.map +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vSM8YY2yi9A8fnoVVLcYkWAyz8c= +SHA256-Digest: sbi9n6xGrTrcmHzgSzbCH6yBwHRwq1ilwucB2YZUFCk= + +Name: pages/messages_src/main.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ZXVk+DOp50C/zpvH8814SkPBuYE= +SHA256-Digest: tu0JEDYsxUzZdMFrAOrGpOZK5Esrc63f/ZMn1ndSegQ= + +Name: pages/messages_src/stores.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ZGA3muJBpvazwOIF8DkM19BpY2o= +SHA256-Digest: vhli+5h4U4jwyvF8u7s1ghWQ5B4WtwGa9y/kEjsnZc4= + +Name: pages/messages_src/App.svelte +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: A7KyZSPFiJqFxdeSLy7bqfVQsk8= +SHA256-Digest: dKSM+5T9GkKCZaPmZ3s4dwv4bKOtRf8KnKl/ARASick= + +Name: pages/fonts/Vazirmatn-VariableFont_wght.ttf +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Op+FiH8pagF9uhV/kiB9GH2bGZY= +SHA256-Digest: lnt4dzglo5cYCj8wrRKnrd7DPjNMHxHzl8kQP71XfMI= + +Name: pages/fonts/styles.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: m1Jn31jU2Nr1s4+KTcbROnsQs8k= +SHA256-Digest: +7wBb7whlJtcEnTks+Y2MHEjhzCTnCTjFFp9hPFJ5J4= + +Name: pages/fonts/Inter-VariableFont_slnt,wght.ttf +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wsPIKOuEj/cU+oMz6sQQyiakhAY= +SHA256-Digest: ZrRjkh60muuYHjE49nlAc0XsGb7OxWsyNra93iDpdbU= + +Name: pages/messages/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 0YlUnGlJaKZlbwYZfULYZeiTPAQ= +SHA256-Digest: uKJo5sv+uZbT1yjfifX/fi4x/C1wMC29YTJaKdYOr+M= + +Name: pages/messages/build/bundle.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: S/cpThiPpJPtBWk0Sz3Bi6q/Qy8= +SHA256-Digest: AObNgH09C2P7hm2POwugv3CTHpuHS6dDTqzxPqdFtaA= + +Name: pages/messages/build/bundle.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fzsqrB3lrTuKb53tPTp8fCcw7CE= +SHA256-Digest: OIZH4i8hsFBKfN2BXEWsegOT12f+8uuuuXSyA6RBnMY= + +Name: pages/messages/build/bundle.js.map +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: C5eXPJ0f4fN+t3uLhYweojlMJGI= +SHA256-Digest: oLVDHK/MNVN+6pkCDNqbc51wJ90GCJ8ABqB4jy6foWY= + +Name: pages/popup/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q9ub6o7xVxRgVTgVCD48MwdNVnI= +SHA256-Digest: GpLTVHmAmr0wZ/EeFJHwlsHgvHnRswUcYpyhegZDnWs= + +Name: pages/popup/build/bundle.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: hyVZrR0w8Aa8/Y/+NJ7sRFIDfD8= +SHA256-Digest: a4aJ1oQKTSrU/XXpoGYOXGlqpFHpL2pVWDQJ01sCNnc= + +Name: pages/popup/build/bundle.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: QWJa8qY264951774rjtsLnjqw/c= +SHA256-Digest: KAr5StQGOyepgDTHVdCQo5NKeLn3Gh3i+FK++zEo0uE= + +Name: pages/popup/build/bundle.js.map +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: MK53BwZzCsGCr8U0HfEHTJCehL4= +SHA256-Digest: ztZobOjSwywZ6LB7T91JpSXUpDvlmFqjfMDne+Sof4s= + +Name: _locales/filter.py +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: SubTaob2T7uohPjbtbwsN18Wmws= +SHA256-Digest: UNfN7M/mf7CHTWNQQ93XZ01yZIQlAtylGGREGrS1PQU= + +Name: _locales/delete.py +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 79Wgj55I5dVyD2e8QJmSifOn6ew= +SHA256-Digest: mztP1ALYBcOKNppt0EYMg5fvWLSbJ1mulxzccgEin0Y= + +Name: _locales/fa/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: P7JM9aYT9B8oaftDYZWHmmw2rAo= +SHA256-Digest: 3g8S6tEegQdEtgf1/1J2ahQ4RncZ2UlnS56jog4NFAY= + +Name: _locales/tr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 3AZL9qHj378IKiyONjvo5xSTYBA= +SHA256-Digest: tNRu3ErmaXepfN9wD+y0GohYewhvUUdvsg8seZPzHcU= + +Name: _locales/en/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: WQDJU6Vqyy9EuteuXaihWHdH7kQ= +SHA256-Digest: w37+eoQHd+wLaWXoAVjV7/abjrj/M+w2RBByTcCb0Dk= + +Name: _locales/eo/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Pv1eUhhvsRyuI/s2iGSrZMDoNLY= +SHA256-Digest: zXZ6D3dDV/V6McZDCGeVV2gfc6iZ6gNktfJLhF7ZMMQ= + +Name: _locales/hu/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wKcHT5M6ww5Am4BmHLsK5hOFoe0= +SHA256-Digest: HdOeaCreP8l3i2olc+uOWibYLeCdBN4nCWmcle321Xw= + +Name: _locales/zh_Hant/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: /jeI8UPj5q16lw2diHh3KA+O4RQ= +SHA256-Digest: Ind9ziZ9g+bDvtGhrlw8b03GNSBFeOtCPqOGhI1iLdo= + +Name: _locales/gl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sXkekZ2AwBQ/0riq6oERxxeXc3w= +SHA256-Digest: TlUXhbQRyVdTtoIaSLOXHrF1RKuhCuaYv7m/3iuvIe4= + +Name: _locales/uk/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: B9ussdC+CtbqhUEUk7/X7mPIBlc= +SHA256-Digest: +6+9DTvgp9k7g85seZSm6V7GEkshUKJ5CaHJ//J3fU8= + +Name: _locales/es/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 7cg+BmQKbyBINLXtdJLYTmcxUI0= +SHA256-Digest: 1v5TteS7jqM3vmyTe5whZrjU3v3gYFJtjGHqotIzG20= + +Name: _locales/ko/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RADbkyW9reSTuqWJ2TcsCBhLeS0= +SHA256-Digest: dYcldI6c0hU2xfkuzF3aTPe6s4SWUmPNcjYW0mtPNF0= + +Name: _locales/ta/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: VPZKHba/kF0QelgsbNqD5zDII4U= +SHA256-Digest: bpAl63l26IIW7/b4JqoB45hdZ6u9lBJYDAdal3V1EyE= + +Name: _locales/sr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wdgkrnL7tGKlec8MACqBgq/KfBY= +SHA256-Digest: fnuiODrdKqy5FZYMAP1dM0SAIMuJ6xm8TeVxfXPw+5k= + +Name: _locales/nl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Jnk8nZY8GaJp4QShRDWBfSpvyfI= +SHA256-Digest: 32VfOZNeKa+/hjr7xOvwc6m5l2DrWAZKHtc/NyZIXt0= + +Name: _locales/hi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Xzay6ikGRe402UMiChS1TuXqW+U= +SHA256-Digest: yj0WO6sFU4GCciYUBWjzvvfqrBh869doeOC2Pp5EI1Y= + +Name: _locales/ro/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: /KOAnqxjgjExa4aPPkxhrUCNQz4= +SHA256-Digest: yWgrulXT2gtz/14DI2dvaXqeNoff2Gk5G+JYgaC0XTw= + +Name: _locales/pt_BR/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: F/QaCwNqPVVonZ8pAIoffac5x84= +SHA256-Digest: fqjSngbqgRIorH1eT2nvXPTJ6FUsnYgQCDtCKvNO/pU= + +Name: _locales/id/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ZE08yt2QaecCX5Wzrh3JzBgYxpg= +SHA256-Digest: gh0ooQZIxknxx4Mf5P0iNyKRimxyX5gzxdtaowkTAzc= + +Name: _locales/zh_Hans/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vAvcQBjyR3ePhuBrCWxeZkLUc7w= +SHA256-Digest: 4r14sZMDy/0jlQkkQpA+F9W0m/qzT3UIFhmN0ByR1Nc= + +Name: _locales/fr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HmB7PATfXf1mC7GtqgERGWeJjhA= +SHA256-Digest: IUQ5HCum9bMsVxwFtJGYTlEs3NcrvOSkJ4rTSHgTX/8= + +Name: _locales/cs/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 2fx2Cu0vrqZnxsOeyVdSXiQv7Ks= +SHA256-Digest: YxvGyNp8i1nqPMAvTvURQDiQjEqC1LmlPohp4Ekk9gA= + +Name: _locales/ru/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: I1KDUuZ4qQY9h9gyy8tLJe6B2eY= +SHA256-Digest: vgoVFZqGQSiSNSB64rXczI3bT+P/j2LXGMrDUNULvoA= + +Name: _locales/it/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 5EN0msz6PtaeIW2aabGEGHxMQI8= +SHA256-Digest: zpnDyTIu//DsGEzEvN09Wsvl9wsWNYSVqfhbO7DlWyA= + +Name: _locales/de/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 27Du+ajFlROt6n6+KT0O6iz336k= +SHA256-Digest: lwGQkTsPe/uekKwaBGPr5rDDKdaLNQHWkMtu+AECBy0= + +Name: _locales/nb_NO/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: H1lNqeczimdkrAAxe9IQyQ3LQIk= +SHA256-Digest: nat39ZyR/xXU6MPHWLQV1Skrmwz66mryfAF7nC1fkLg= + +Name: _locales/vi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: I09vLHaHz+F3X2sofY+3g4vSGFM= +SHA256-Digest: G07sE3+UMEFvkoMzjAExDscW95DLe5HXhw5rjcZcK9c= + +Name: _locales/bs/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: itaiwek7EQTWJh+42lh7spBLikY= +SHA256-Digest: zvzZAPqFiE3td3b+Ukk1XkR/j2STT0DMbnkfthCrjdU= + +Name: _locales/fil/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: BK8sOqeGJZCqSBS7tFm9Et3RaVk= +SHA256-Digest: nY6JOQIY/i1aIISbgPWv1ZVcv31yHrLEPuZqU4rhIfk= + +Name: _locales/pl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: E4hVx4HhuVzXB39yabq2v/bOe34= +SHA256-Digest: grZFv0EzHNPzi9MGTVG/E+LrN6J2hZV1c5wy98+gLZg= + +Name: _locales/ja/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Mc4zRwWqlVjXHNdudRX35EQAS3E= +SHA256-Digest: Tsc1cToaXIqvRI74JThnAsxzL5xC21VbHS/UcyJvEbQ= + +Name: _locales/fi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 44D3XBEmIvB3rLqt7ebaSOwtdOY= +SHA256-Digest: KCTNWHr1mcnuMgy1B/zafKe4h8Cx1upKW9owSmRsprE= + +Name: _locales/ar/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: F/FXsC0yzIoZcQhJaP8UA5mOg38= +SHA256-Digest: gYdf3kNBgX9ksPakp6LfCuJi8jNuPWwzGrAfEcTfmII= + +Name: _locales/pt/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: CqiX89s0iAHZLcYDV0xaxRlH2ik= +SHA256-Digest: uYli4t7/GiahNWXTuS8zXfB54VIvyI10d0kM8rtB2xU= + +Name: _locales/hr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: doT3RtWKUOjihVmpvFuGNRRGOco= +SHA256-Digest: 1j0nqLUfgMxU9R21f0AOpCL1AJ5uVKtn42RK16SdKWM= + +Name: _locales/jv/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: lf1Ep9m0dasyUxXu9UzibVHfH7c= +SHA256-Digest: FehmKKnauKbVwUXTP4bIGR3I9oNMh1Q7BIwRzXm0ZTc= + +Name: _locales/bn/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: LiBI+z8Sak32tRsKALOOaE55Ocw= +SHA256-Digest: QMC2NvOofzvZ5c27titZUDoWQGnBeu47uNFF9Q9ky10= + diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/cose.sig b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/cose.sig Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/manifest.mf b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/manifest.mf @@ -0,0 +1,722 @@ +Manifest-Version: 1.0 + +Name: config.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: UsvV4TMPctbz9JQ83h7wJythH0o= +SHA256-Digest: 48O4Un3CzBeI4fyRqCQPFSz85rWPNPBP3zZprRh9LDg= + +Name: manifest.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: D+44bpOQs2D6iUyD2bNObvmYHmA= +SHA256-Digest: 1k5HH6l2rSeelo5gbDauxiF5RYVbw4YqFTL68i+U/2w= + +Name: assets/javascripts/utils.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q/moYrSUtalUaHn0AW34gpI7oCs= +SHA256-Digest: kem+uK+An39t2oWNTfGNGUSmkxkvayqlzUKXJmOPH2s= + +Name: assets/javascripts/services.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fhBwV9oAApKzIlxXX2IhxU77r60= +SHA256-Digest: mlvzcPFnFr7l8bFNjgFE4fnW+pWNOn5ADAWxe3qW2fo= + +Name: assets/images/stackOverflow-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mE4jl0xAIryG15tepmZVuuwtMg4= +SHA256-Digest: em+2DXksyaHOMOAc3q0BwPkpFgVMiQMT+R07vdT96DY= + +Name: assets/images/imdb-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4gGhG7GbSe01ldqZlGZ3IgcdDA4= +SHA256-Digest: 4/jHs23ACO5SfAq9JtUF4F1vNSNYexfBUIY/8wJcGnY= + +Name: assets/images/bandcamp-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: DVq5REzY+e09n/UAKDx+9aiWm8A= +SHA256-Digest: G/xyZ8ZtkF7DfVqdFtOyxq2WyGBKa+vFL/iYR7w1BSM= + +Name: assets/images/about-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jIjfhMh+2U34/FtCuXVAvKlsW5w= +SHA256-Digest: KAqmtauj+sBAp/0z0PknhcpsnTY+TNTAsz8R1s7MVno= + +Name: assets/images/chefkoch-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8s1VvaRDs+tlU22kT47jE7KCIU4= +SHA256-Digest: vpxb+l1IR+M5r85kdur8mkrUnmlscToFW2kMRQ4VvOA= + +Name: assets/images/pixiv-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sHKx2cHhX2jHC//trKrvnNtlLpc= +SHA256-Digest: J+31b6NquW4RH5/woPaT2RCZgVEIesKGdqzttLhV57w= + +Name: assets/images/libredirect.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: GZAkNOyHM/lMecOG6dfDupcaudE= +SHA256-Digest: 9wd9+mlmKemmL2ranVarTeeD/4CHSWH1WJKtZfni6Os= + +Name: assets/images/threads-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fWRvaFKtjuBtnzCuhep5yr6gByM= +SHA256-Digest: 55NEwAD85Wsg5l7Y9kRt2Jg0NO/wkRJMd/RJAKLUC8A= + +Name: assets/images/goodreads-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wd81ZtkJNMcFeqb74My0qtgACV8= +SHA256-Digest: yrk2HyngjDLgr5aN4hAYYXTRnNEzM2Qt64FZBnny9O8= + +Name: assets/images/tiktok-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fDLLVbrpLzYUy2JId63+iG/KKN0= +SHA256-Digest: y61cXd4ZWIVwfjG1j+VcF1/9YWcVUoVvemA+3JOdq90= + +Name: assets/images/general-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 7/OIaUokzOJfIQhryWL9oyi4MG4= +SHA256-Digest: dtFKJnVYUelfP0jeBnwC4kWDzwf2vfKt6snn2zGPYKw= + +Name: assets/images/chatGpt-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Qdd5h+308P9N6u876Z/+xo8WKvw= +SHA256-Digest: omU80n8gpOdk7fUbdA+Q5GqGqvCBm2CiMCflBb0QB0A= + +Name: assets/images/imgur-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gghpWtsurccQ138Q6rpoR6rnkaQ= +SHA256-Digest: zwI/izY8XpsTdk7va/c26dx/0h8zMQYWvOb0nUaZVdk= + +Name: assets/images/threads-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: qYrnMDCKQhbH8N0Ai6HBLoXwafk= +SHA256-Digest: HzF4dkBv7znk5ygmz9M5BiPo7A0B2JuReE8NQ/PDCus= + +Name: assets/images/knowyourmeme-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 5Z5zqwVft5v6xtjyJ9rYjt7B6Gk= +SHA256-Digest: /9qvibKdO14rKU7WutOZ9onaUYq+S21CTXuGAiUThoI= + +Name: assets/images/wolframAlpha-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 0hpA3r0SMTA96m0dv1SjEoglzko= +SHA256-Digest: bVcJKswijmMrdx47G15ZpChMP/5HtebS2MNEPF2vwaA= + +Name: assets/images/sendFiles-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: D2Ve8L+AHeFr0XB89YosucDqdBY= +SHA256-Digest: Mp1pKA6VinBGHuOqCoA5cXfG4poRysjQ1yAJpommkmA= + +Name: assets/images/sendFiles-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: otabZkqvZ80bQJE6JawoZY3pchk= +SHA256-Digest: j4DtNuUDceOzHL1GRwCOoKTZklGu3YhJEuZ8zyurbsw= + +Name: assets/images/pastebin-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: P9RptuiZ/g3ZX51WUCofeO2V2BE= +SHA256-Digest: wb4KtN8UQuP3X5xXCWvBJaDKM2XDydf6hgUNJ/1/UZQ= + +Name: assets/images/libredirect-64.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RRaHeEeL4KfHpgKPtp/rIsUJIik= +SHA256-Digest: Pstd17hVOBVflbFE1BbuO7iJ98AyHqXM2XGDoZqs2Q4= + +Name: assets/images/twitch-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4KZmO4mcpE8cnq9yfCHRVwTwK8Q= +SHA256-Digest: zwX71qkKukuQbzxhFicar0TF2KMiRiVWX1dnYFOa3gY= + +Name: assets/images/about-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: FvYHZI0AOF4iUkUnSJtjJFuRMoE= +SHA256-Digest: E/Zd5vzL6GqhQkZQvagGOnSdxIZkYJzzHx23BEZ2lbk= + +Name: assets/images/youtube-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: lzlWbLBGAFMHxrf6m1J3PwlmCO4= +SHA256-Digest: vperspuztpE1kngy1Kr3PMKXWC8KLdylvtDKR535DZU= + +Name: assets/images/libredirect-96.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: LaruOlsvD2AQDkjOesZQE7GgyQ8= +SHA256-Digest: d7S5jXsWWiPlKCAJDtqx16LfCW84ErcSq2QuyTcUsHU= + +Name: assets/images/wikipedia-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: nCql5+EccO/HLoj/DP8CqzaWQsQ= +SHA256-Digest: GPD5LtN5hS0RziFqRFOc5Z/TPyYD4oDrIEVBzYtYj4w= + +Name: assets/images/reuters-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 51MGeGTnpalOaS2piUG1IjUACSk= +SHA256-Digest: G9zLKVrZpJ1fSCz9L+VDjaE6zFg7NeL+KvqQUjdBEpw= + +Name: assets/images/genius-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Y72Hg60ZaTkHPPyQ7+/4jp1jbOI= +SHA256-Digest: n2aJgY6EK7dBmgT0rsGTy3l99/FfAF74vVdlwrlpS4s= + +Name: assets/images/snopes-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 2l7DATmLCieAZerE8hhYzVHp2Ws= +SHA256-Digest: NhaFd5xi5Z+E8ukfV1Ah5P/RvGRDcgKLjAYNj/zfT+U= + +Name: assets/images/coub-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: phDCVqfEXAYy92qPTXBr1Zmh7us= +SHA256-Digest: /Qw6Q9t7zVSM+B3+dA7/6UwONQI0gX6Ac6d0syhjOdg= + +Name: assets/images/general-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Uvz5f4+dwrx08aFqSARGXqsM1fQ= +SHA256-Digest: ICMa52bUXB8yL7vXfr8jfXTByvTIzkyP2vugQu0jaSI= + +Name: assets/images/office-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: XmZHsKAA240lF86d4wxq+F8ztcA= +SHA256-Digest: DZBv6kJU7+isQD2os0FYFRdu30v4cRYJtNyeoqBbA68= + +Name: assets/images/meet-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8vo3ZKxWIbcjssj6eTTmZa53ggQ= +SHA256-Digest: vQwWt1Tu+xAyaQRsR4Gg02Mpj7t/TwU97hFek2Zey/s= + +Name: assets/images/peertube-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: C8m8H2X4ArMJY1tmApRaX9k2JVY= +SHA256-Digest: GI3E+GILotChsnz/UIDeF/pUT2N+j0StBWRJQ81qh9s= + +Name: assets/images/goodreads-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Y3QU1EMiQ5+uNHnA9F3u/FuM+sk= +SHA256-Digest: eZQBe4WnNkRv28JJlfNOTBF+AXz905gJsd3xjHZlm9U= + +Name: assets/images/pinterest-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bLdcu0kZ4Tf5zZWla4GdWfK0YJ0= +SHA256-Digest: Kg9a/oA1Uu/aNMHzEroBDt0Ssb/ytRboAzi+keGqcdU= + +Name: assets/images/gitlab-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: QpeT0PKU9NRadluIsm1HlrPpPZw= +SHA256-Digest: oozyeGoxoC/O3gqNOq9oJfYOM2iUhDL/ofaGpecbzAk= + +Name: assets/images/geeksForGeeks-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TW3t6MtvGqmFyM6dwahuIdPzguA= +SHA256-Digest: px2ZJo6NG/IPvinjJ883S1FtF6ccjv0FABFEHyRPDnA= + +Name: assets/images/bluesky-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TesfwiW/FmuuNoZp5SKIoikOus4= +SHA256-Digest: zZ3UTs3qK93P5jkCQwsy+sasRu0N4pmhq/eD3HkIoCU= + +Name: assets/images/fandom-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: aXfE5IPKS25fwLATCu04MCEWsO8= +SHA256-Digest: qQUN5pCcMd33HyRXssZPDXWv/FNr2FavHAMmFdBvOB8= + +Name: assets/images/search-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vQW7/zKdr4VUnRc2daWJyOkspg4= +SHA256-Digest: 3RKjQrMXXB69TeDauwAqXGa1ETqicOPdnEBmXxa3RfQ= + +Name: assets/images/maps-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TGZ9nThiz7tUl6NOFkLpuYtew3w= +SHA256-Digest: ZYALNmKVoc1ZTgPfE5wMLVE7fdvW1y+QrznH34o6sGw= + +Name: assets/images/ultimateGuitar-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PPywAvB7MX4a1r3QfxhXKFM0Sek= +SHA256-Digest: 0ltkqCeibPKJ2mcw01XiL9+/nwVAfun4y2wR5UgLNXk= + +Name: assets/images/textStorage-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gs9Oa/9SZEuNn/t8a3MrXyuW/U8= +SHA256-Digest: eS2BBiFlOEDHJjaxFEEmuMZJzi7jIjmeMAtH3ybZd6Q= + +Name: assets/images/libredirect-128.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 33BiOlaifWzCfQCQucKMHMnfVUY= +SHA256-Digest: Gw20HuGqfXokTKizRVGxXHzJFKfzBJUiLFW4uMRGmJY= + +Name: assets/images/libredirect-32.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: GGAIAvHKrngMNEd66jZMCSh3ImQ= +SHA256-Digest: PcqDqD2hDPPM4SDy1yIIKYoRiCGbZqIyelCb/1Oahzk= + +Name: assets/images/chatGpt-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: NEzItB4W7t3r0rmDYGEYJXSDgyA= +SHA256-Digest: hEOkd7qCKFXDEjils1+OI31BUexqC0FrvG80ABQbwkU= + +Name: assets/images/bilibili-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +ipC89BLF6ixyBYVsRXDTdbnQ5A= +SHA256-Digest: PKSgz9b3vfRhycOq5MHDk6yTv3eczgA/kZBQMcihtLg= + +Name: assets/images/baiduTieba-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: j0ASOxqLDm7/amHZVlxdCCpSBKA= +SHA256-Digest: xEzmMoopBD2H2qFO3REE2n036UXkk2sWBtnun4ksDiI= + +Name: assets/images/github-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: V7Q0tNTf6L+JCUzg4FbIf17JfMk= +SHA256-Digest: e8Susu08xDxMBbB2r4ugVPmeAC1nj4Gwv+pJb3cc1mM= + +Name: assets/images/quora-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: tZhcnsx9/mur9nknGtsUYzqd4Hs= +SHA256-Digest: 5LOKz06p8YYkydrAKHWHZyD585Sbyu7OsMTods8ytXU= + +Name: assets/images/mozhi-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: lDyzuzUa0m2Ilk9hk2XG4Bf1XMo= +SHA256-Digest: 7kLOc1N7WwbTAnQbPk9q3fxvKWqReulFVWe5Dtx7DpE= + +Name: assets/images/reddit-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: R4RaSLToJ5xlHWJ2GsA5hEibZPQ= +SHA256-Digest: NH9zBI9FH7v1hYZAIgxZBxj3tOLq6H6tyivOvQ39kVs= + +Name: assets/images/tumblr-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: AepuNY54Nnms+UrpVYQSGjvQYY4= +SHA256-Digest: tcw0vopBzhiPJ/4KV+9CIroEr3khhersCvzVEOsBm0c= + +Name: assets/images/instructables-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 6n2wq7/eVJAHyvttkJ6sUvfHvmk= +SHA256-Digest: xmD/ZqmQE0riGttsj4nG63ZRPzUyLLc7q3vkhHMBQnI= + +Name: assets/images/libredirect.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mx4rCt8wmYdgvvZGm8p1DKWSNec= +SHA256-Digest: FJ5N5/xIQ2rjvFK1nuX0CwXDi1A6tEWhNxNLp9qEZjI= + +Name: assets/images/maps-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: szOP/i035TUO4mYiWostHJ3CxW8= +SHA256-Digest: avVTr2JXfQ1GLVgFpfVg/ax0+tnGofMwSo6Ynqy4pn8= + +Name: assets/images/deviantArt-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jJ1VDOBwpLAfEuk3g7S5/Ea+A24= +SHA256-Digest: AKHnJThM9Na9O4joYQVYwTmJAl7JXmY3IN7BvA9/bIk= + +Name: assets/images/textStorage-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: YdSrxeCY1vqzvvHBuwdU7rGAKnI= +SHA256-Digest: pR28GymBk556rT8mF6DMi0xtmPQrSb8Jz+StjU1bOmY= + +Name: assets/images/translate-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: aHVieyOZaNZgw9f2H7OSfE9mSvU= +SHA256-Digest: guV9Tja+9oLDBtsp5Oxqp6ZTPEoOm9bf1meWzqx14ik= + +Name: assets/images/meet-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gD9UjJ55MutIHYxEieOhQbiFy2Q= +SHA256-Digest: bq1y2rha9QM7KS1LOiHQXUnrphuQRnUIksZC3KLBYJA= + +Name: assets/images/waybackMachine-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oFGndAZXKEgbhmHTkDbkhIbtLtY= +SHA256-Digest: aONIXU74DKPWoa+6OTAUP+2z8ekQ4UjLcOAkl0Phmr4= + +Name: assets/images/libredirect-48.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TK8b+PO4NSd7sindWWBgXgEIhzY= +SHA256-Digest: 6nGXVO3Elm6vCjkACNeWGKsxrPW9+MTaLifbV3LpUtw= + +Name: assets/images/pastebin-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8xtqPtyp6Zy4nQ69IWXjyfRniHY= +SHA256-Digest: KdjlL/4nyw1sgVFpfWflODLFJhuf+8TPgsR17R2K6a0= + +Name: assets/images/tekstowo-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: rRHgWKeBnkXC+/2wlws7w+NV5iw= +SHA256-Digest: 2bflmYiMQDIF2WHd6lbarLd93AM/lVZyj6Sz9PJ7s0g= + +Name: assets/images/urbanDictionary-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: hVUpstxpvVv23cvm/GIGTDW72+8= +SHA256-Digest: PK+mjX+EtjBfyK+boMNShRuewL9ri7ZbI6TsRi6GGnE= + +Name: assets/images/soundcloud-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JfM7GXletsPSInPF1+Ifz+O+5S0= +SHA256-Digest: Hkdu5rzYatr1KSUFWbPIo+igHEcqkNdLOdEa/78QX0E= + +Name: assets/images/waybackMachine-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: kEhBPRTObUi/H4dUwItTnA4zY8o= +SHA256-Digest: jIbqVbhRquT+1jL4vTuoO9EiMdIblcbgcga2m5gUnxQ= + +Name: assets/images/ifunny-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s0YG6mG6rVG1OdO+0tRcj2jCUuQ= +SHA256-Digest: niQaXhxxeBDwL7O+VxI4oyNhVRef+mgkyZlXpkx0tQo= + +Name: assets/images/instagram-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: AUZ8+SKmnNzu7T0K3DBIVto6ebA= +SHA256-Digest: c4qO15GOxjUKQ6thpM/NRnfb+x50EyDwGXKs4CT7ScE= + +Name: assets/images/medium-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 2h8hDP73JM8E1YBo7f1RGJTYbl8= +SHA256-Digest: KHDt7jIpKjnVGBMthw3yaxO2TVcWKTR2Vv2zmu0Y9aY= + +Name: assets/images/search-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: e8fwImU4K6U9aA5ugLfer9NEGik= +SHA256-Digest: P/NFmmNNB84NHCXh1kGKwVyw41aUF1gWusfB6918EY4= + +Name: assets/images/translate-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mcDzfpR3ZmDxajpOGNMid2nYtGw= +SHA256-Digest: B5X8Jreh5Vl5J7Jfv49sWHyA+bmvWMwYI/MHvS7PQWQ= + +Name: assets/images/stackOverflow-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ubcKXXK6J6Zc72IDi84lZFBWVgc= +SHA256-Digest: l14neVWmhbufarD8URyv+tjSeVBSS4JkaimhCCqywVQ= + +Name: assets/images/youtubeMusic-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 6l0WNmEScAysJzYy4rFqk2QR+PI= +SHA256-Digest: hlDfvdRDicWbUE8QUqCajP62e/wBgsI4bPu5tn2co+M= + +Name: assets/images/office-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 0m8BBK1Dp63FP7Yadr6i4ITG0g4= +SHA256-Digest: G6coBTZVSfy4IruBi9W/2qGYuF/x7wMk0FUi7GmTK48= + +Name: assets/images/twitter-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RSiCGQ5fsoVs7bgO+yqdY2ANjaY= +SHA256-Digest: ZqbislNlcuZq39UQA/kR91mZoAxUycDI8aYRKSCb5VE= + +Name: assets/images/tenor-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bhG8HHP1kPglYKZWIajoHyC9dUs= +SHA256-Digest: xxhZUOw2RpiAjHmslbL9ZN4xTwnlXsmtYaSW0yGAwlc= + +Name: assets/images/bilibili-icon-light.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JvpNJm4BG87gZdWSZRX4BMx4EFs= +SHA256-Digest: V/dwstjF4pZO/yypURBxl/y4oUAwDBywKJrAWsgaYlQ= + +Name: assets/images/libredirect-16.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: rWTThkGxheJTDjI8oOdMsRFccwY= +SHA256-Digest: ulsjPmuF1ybqydv7f34ES8Xn1dyFxDVG1xJWlKC9OiA= + +Name: assets/images/github-icon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ShPyn5094QgC5R+E8PhEQQC64as= +SHA256-Digest: OBVF9m98zHUgNFogExoWK3QU9ewUorMwuy768ElpzIs= + +Name: updates/updates.xml +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: XQpiHuzR20zTr71/TuVYzhNUAnk= +SHA256-Digest: 0PX+Cby5zDo54ACZXDoSHLht1dK7R3/LTWdnV5JhTDI= + +Name: pages/background/background.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bo8froMEHMMiKCEmyvJiEXxtUXc= +SHA256-Digest: b0CKUs7m+pvb4MJA4WoK8igYDpvtBsVuQSj81sEv2hQ= + +Name: pages/background/background.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: H2Zdux1Z0lRrAuXkDx59mg3Xl8k= +SHA256-Digest: SYJjnTcxaXDVLL+PxCeypHkBL939/R4YL0M48HND2J8= + +Name: pages/options/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q9ub6o7xVxRgVTgVCD48MwdNVnI= +SHA256-Digest: GpLTVHmAmr0wZ/EeFJHwlsHgvHnRswUcYpyhegZDnWs= + +Name: pages/options/build/bundle.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sl0r4s5GMt/fDHarVrLCLTVIkec= +SHA256-Digest: H0JvpQ8PkZtSfoyObQk4L38gdJVGCMkT5Mi1oGs+ewU= + +Name: pages/options/build/bundle.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ismPRDtH9TZR3puDU8zl5NyE5T4= +SHA256-Digest: zu7Oh/DihvxiIGx55faPF6qXYgoPIpz2j3MWktcpVlI= + +Name: pages/options/build/bundle.js.map +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vSM8YY2yi9A8fnoVVLcYkWAyz8c= +SHA256-Digest: sbi9n6xGrTrcmHzgSzbCH6yBwHRwq1ilwucB2YZUFCk= + +Name: pages/messages_src/main.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ZXVk+DOp50C/zpvH8814SkPBuYE= +SHA256-Digest: tu0JEDYsxUzZdMFrAOrGpOZK5Esrc63f/ZMn1ndSegQ= + +Name: pages/messages_src/stores.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ZGA3muJBpvazwOIF8DkM19BpY2o= +SHA256-Digest: vhli+5h4U4jwyvF8u7s1ghWQ5B4WtwGa9y/kEjsnZc4= + +Name: pages/messages_src/App.svelte +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: A7KyZSPFiJqFxdeSLy7bqfVQsk8= +SHA256-Digest: dKSM+5T9GkKCZaPmZ3s4dwv4bKOtRf8KnKl/ARASick= + +Name: pages/fonts/Vazirmatn-VariableFont_wght.ttf +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Op+FiH8pagF9uhV/kiB9GH2bGZY= +SHA256-Digest: lnt4dzglo5cYCj8wrRKnrd7DPjNMHxHzl8kQP71XfMI= + +Name: pages/fonts/styles.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: m1Jn31jU2Nr1s4+KTcbROnsQs8k= +SHA256-Digest: +7wBb7whlJtcEnTks+Y2MHEjhzCTnCTjFFp9hPFJ5J4= + +Name: pages/fonts/Inter-VariableFont_slnt,wght.ttf +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wsPIKOuEj/cU+oMz6sQQyiakhAY= +SHA256-Digest: ZrRjkh60muuYHjE49nlAc0XsGb7OxWsyNra93iDpdbU= + +Name: pages/messages/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 0YlUnGlJaKZlbwYZfULYZeiTPAQ= +SHA256-Digest: uKJo5sv+uZbT1yjfifX/fi4x/C1wMC29YTJaKdYOr+M= + +Name: pages/messages/build/bundle.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: S/cpThiPpJPtBWk0Sz3Bi6q/Qy8= +SHA256-Digest: AObNgH09C2P7hm2POwugv3CTHpuHS6dDTqzxPqdFtaA= + +Name: pages/messages/build/bundle.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fzsqrB3lrTuKb53tPTp8fCcw7CE= +SHA256-Digest: OIZH4i8hsFBKfN2BXEWsegOT12f+8uuuuXSyA6RBnMY= + +Name: pages/messages/build/bundle.js.map +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: C5eXPJ0f4fN+t3uLhYweojlMJGI= +SHA256-Digest: oLVDHK/MNVN+6pkCDNqbc51wJ90GCJ8ABqB4jy6foWY= + +Name: pages/popup/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q9ub6o7xVxRgVTgVCD48MwdNVnI= +SHA256-Digest: GpLTVHmAmr0wZ/EeFJHwlsHgvHnRswUcYpyhegZDnWs= + +Name: pages/popup/build/bundle.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: hyVZrR0w8Aa8/Y/+NJ7sRFIDfD8= +SHA256-Digest: a4aJ1oQKTSrU/XXpoGYOXGlqpFHpL2pVWDQJ01sCNnc= + +Name: pages/popup/build/bundle.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: QWJa8qY264951774rjtsLnjqw/c= +SHA256-Digest: KAr5StQGOyepgDTHVdCQo5NKeLn3Gh3i+FK++zEo0uE= + +Name: pages/popup/build/bundle.js.map +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: MK53BwZzCsGCr8U0HfEHTJCehL4= +SHA256-Digest: ztZobOjSwywZ6LB7T91JpSXUpDvlmFqjfMDne+Sof4s= + +Name: _locales/filter.py +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: SubTaob2T7uohPjbtbwsN18Wmws= +SHA256-Digest: UNfN7M/mf7CHTWNQQ93XZ01yZIQlAtylGGREGrS1PQU= + +Name: _locales/delete.py +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 79Wgj55I5dVyD2e8QJmSifOn6ew= +SHA256-Digest: mztP1ALYBcOKNppt0EYMg5fvWLSbJ1mulxzccgEin0Y= + +Name: _locales/fa/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: P7JM9aYT9B8oaftDYZWHmmw2rAo= +SHA256-Digest: 3g8S6tEegQdEtgf1/1J2ahQ4RncZ2UlnS56jog4NFAY= + +Name: _locales/tr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 3AZL9qHj378IKiyONjvo5xSTYBA= +SHA256-Digest: tNRu3ErmaXepfN9wD+y0GohYewhvUUdvsg8seZPzHcU= + +Name: _locales/en/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: WQDJU6Vqyy9EuteuXaihWHdH7kQ= +SHA256-Digest: w37+eoQHd+wLaWXoAVjV7/abjrj/M+w2RBByTcCb0Dk= + +Name: _locales/eo/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Pv1eUhhvsRyuI/s2iGSrZMDoNLY= +SHA256-Digest: zXZ6D3dDV/V6McZDCGeVV2gfc6iZ6gNktfJLhF7ZMMQ= + +Name: _locales/hu/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wKcHT5M6ww5Am4BmHLsK5hOFoe0= +SHA256-Digest: HdOeaCreP8l3i2olc+uOWibYLeCdBN4nCWmcle321Xw= + +Name: _locales/zh_Hant/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: /jeI8UPj5q16lw2diHh3KA+O4RQ= +SHA256-Digest: Ind9ziZ9g+bDvtGhrlw8b03GNSBFeOtCPqOGhI1iLdo= + +Name: _locales/gl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sXkekZ2AwBQ/0riq6oERxxeXc3w= +SHA256-Digest: TlUXhbQRyVdTtoIaSLOXHrF1RKuhCuaYv7m/3iuvIe4= + +Name: _locales/uk/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: B9ussdC+CtbqhUEUk7/X7mPIBlc= +SHA256-Digest: +6+9DTvgp9k7g85seZSm6V7GEkshUKJ5CaHJ//J3fU8= + +Name: _locales/es/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 7cg+BmQKbyBINLXtdJLYTmcxUI0= +SHA256-Digest: 1v5TteS7jqM3vmyTe5whZrjU3v3gYFJtjGHqotIzG20= + +Name: _locales/ko/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RADbkyW9reSTuqWJ2TcsCBhLeS0= +SHA256-Digest: dYcldI6c0hU2xfkuzF3aTPe6s4SWUmPNcjYW0mtPNF0= + +Name: _locales/ta/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: VPZKHba/kF0QelgsbNqD5zDII4U= +SHA256-Digest: bpAl63l26IIW7/b4JqoB45hdZ6u9lBJYDAdal3V1EyE= + +Name: _locales/sr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wdgkrnL7tGKlec8MACqBgq/KfBY= +SHA256-Digest: fnuiODrdKqy5FZYMAP1dM0SAIMuJ6xm8TeVxfXPw+5k= + +Name: _locales/nl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Jnk8nZY8GaJp4QShRDWBfSpvyfI= +SHA256-Digest: 32VfOZNeKa+/hjr7xOvwc6m5l2DrWAZKHtc/NyZIXt0= + +Name: _locales/hi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Xzay6ikGRe402UMiChS1TuXqW+U= +SHA256-Digest: yj0WO6sFU4GCciYUBWjzvvfqrBh869doeOC2Pp5EI1Y= + +Name: _locales/ro/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: /KOAnqxjgjExa4aPPkxhrUCNQz4= +SHA256-Digest: yWgrulXT2gtz/14DI2dvaXqeNoff2Gk5G+JYgaC0XTw= + +Name: _locales/pt_BR/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: F/QaCwNqPVVonZ8pAIoffac5x84= +SHA256-Digest: fqjSngbqgRIorH1eT2nvXPTJ6FUsnYgQCDtCKvNO/pU= + +Name: _locales/id/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ZE08yt2QaecCX5Wzrh3JzBgYxpg= +SHA256-Digest: gh0ooQZIxknxx4Mf5P0iNyKRimxyX5gzxdtaowkTAzc= + +Name: _locales/zh_Hans/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vAvcQBjyR3ePhuBrCWxeZkLUc7w= +SHA256-Digest: 4r14sZMDy/0jlQkkQpA+F9W0m/qzT3UIFhmN0ByR1Nc= + +Name: _locales/fr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HmB7PATfXf1mC7GtqgERGWeJjhA= +SHA256-Digest: IUQ5HCum9bMsVxwFtJGYTlEs3NcrvOSkJ4rTSHgTX/8= + +Name: _locales/cs/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 2fx2Cu0vrqZnxsOeyVdSXiQv7Ks= +SHA256-Digest: YxvGyNp8i1nqPMAvTvURQDiQjEqC1LmlPohp4Ekk9gA= + +Name: _locales/ru/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: I1KDUuZ4qQY9h9gyy8tLJe6B2eY= +SHA256-Digest: vgoVFZqGQSiSNSB64rXczI3bT+P/j2LXGMrDUNULvoA= + +Name: _locales/it/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 5EN0msz6PtaeIW2aabGEGHxMQI8= +SHA256-Digest: zpnDyTIu//DsGEzEvN09Wsvl9wsWNYSVqfhbO7DlWyA= + +Name: _locales/de/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 27Du+ajFlROt6n6+KT0O6iz336k= +SHA256-Digest: lwGQkTsPe/uekKwaBGPr5rDDKdaLNQHWkMtu+AECBy0= + +Name: _locales/nb_NO/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: H1lNqeczimdkrAAxe9IQyQ3LQIk= +SHA256-Digest: nat39ZyR/xXU6MPHWLQV1Skrmwz66mryfAF7nC1fkLg= + +Name: _locales/vi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: I09vLHaHz+F3X2sofY+3g4vSGFM= +SHA256-Digest: G07sE3+UMEFvkoMzjAExDscW95DLe5HXhw5rjcZcK9c= + +Name: _locales/bs/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: itaiwek7EQTWJh+42lh7spBLikY= +SHA256-Digest: zvzZAPqFiE3td3b+Ukk1XkR/j2STT0DMbnkfthCrjdU= + +Name: _locales/fil/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: BK8sOqeGJZCqSBS7tFm9Et3RaVk= +SHA256-Digest: nY6JOQIY/i1aIISbgPWv1ZVcv31yHrLEPuZqU4rhIfk= + +Name: _locales/pl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: E4hVx4HhuVzXB39yabq2v/bOe34= +SHA256-Digest: grZFv0EzHNPzi9MGTVG/E+LrN6J2hZV1c5wy98+gLZg= + +Name: _locales/ja/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Mc4zRwWqlVjXHNdudRX35EQAS3E= +SHA256-Digest: Tsc1cToaXIqvRI74JThnAsxzL5xC21VbHS/UcyJvEbQ= + +Name: _locales/fi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 44D3XBEmIvB3rLqt7ebaSOwtdOY= +SHA256-Digest: KCTNWHr1mcnuMgy1B/zafKe4h8Cx1upKW9owSmRsprE= + +Name: _locales/ar/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: F/FXsC0yzIoZcQhJaP8UA5mOg38= +SHA256-Digest: gYdf3kNBgX9ksPakp6LfCuJi8jNuPWwzGrAfEcTfmII= + +Name: _locales/pt/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: CqiX89s0iAHZLcYDV0xaxRlH2ik= +SHA256-Digest: uYli4t7/GiahNWXTuS8zXfB54VIvyI10d0kM8rtB2xU= + +Name: _locales/hr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: doT3RtWKUOjihVmpvFuGNRRGOco= +SHA256-Digest: 1j0nqLUfgMxU9R21f0AOpCL1AJ5uVKtn42RK16SdKWM= + +Name: _locales/jv/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: lf1Ep9m0dasyUxXu9UzibVHfH7c= +SHA256-Digest: FehmKKnauKbVwUXTP4bIGR3I9oNMh1Q7BIwRzXm0ZTc= + +Name: _locales/bn/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: LiBI+z8Sak32tRsKALOOaE55Ocw= +SHA256-Digest: QMC2NvOofzvZ5c27titZUDoWQGnBeu47uNFF9Q9ky10= + +Name: META-INF/cose.manifest +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oFjKseUiwa/L/+d13Nh92C3Zq1U= +SHA256-Digest: Ay539dCGEL+jAfWec+ju1RtVJ6rcXw5P9iVj9NMGlAY= + +Name: META-INF/cose.sig +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Prd8DbnPl2Eh0Aco59lzDkAvYys= +SHA256-Digest: sgve65VGe0rLUZ11pdDrKJNZopNLMEe8k/aARqL7s/E= + diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/mozilla.rsa b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/mozilla.rsa Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/mozilla.sf b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/META-INF/mozilla.sf @@ -0,0 +1,4 @@ +Signature-Version: 1.0 +SHA1-Digest-Manifest: nq5fYMuXaQZ++THDqH2SjvfnoNM= +SHA256-Digest-Manifest: JJWBAfbcwXSomg/CLBpL9KiOaBOZvlrINpW8+06hpc0= + diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ar/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ar/messages.json @@ -0,0 +1,161 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "extension name" + }, + "extensionDescription": { + "message": "إضافة متصفح تعيد توجيه مواقع مشهورة إلى واجهات أمامية تحترم الخصوصية", + "description": "extension description" + }, + "switchInstance": { + "message": "بدّل النُسخة", + "description": "used in the popup" + }, + "settings": { + "message": "الإعدادات", + "description": "used in the popup" + }, + "general": { + "message": "العامة", + "description": "used in the settings page" + }, + "theme": { + "message": "السمة", + "description": "used in the settings page" + }, + "light": { + "message": "فاتح", + "description": "used in the settings page" + }, + "dark": { + "message": "داكن", + "description": "used in the settings page" + }, + "auto": { + "message": "تلقائي", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "استبعاد من التوجيه", + "description": "used in the settings page" + }, + "importSettings": { + "message": "استيراد الإعدادات", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "تصدير الإعدادات", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "إعادة تعيين الإعدادات", + "description": "used in the settings page" + }, + "enable": { + "message": "تفعيل", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "الإظهار في المنبثقة", + "description": "used in the settings page" + }, + "frontend": { + "message": "الواجهة الأمامية", + "description": "used in the settings page" + }, + "redirectType": { + "message": "نوع التوجيه", + "description": "used in the settings page" + }, + "both": { + "message": "الإثنين", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "فقط المضمنة", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "فقط الغير مضمنة", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "أضِف نُسخك المُفضلة", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "انسخ الأصل" + }, + "copied": { + "message": "نُسِخ", + "description": "used in the popup" + }, + "redirectToOriginal": { + "message": "إعادة التوجيه إلى الأصلي", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "محاولة إعادة توجيه", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "عن" + }, + "unsupportedIframesHandling": { + "message": "معالجة التضمينات غير مدعومة" + }, + "fetchPublicInstances": { + "message": "اجلب النُسخ العامة" + }, + "disable": { + "message": "عطِّل" + }, + "pingInstances": { + "message": "بينج النُسخ" + }, + "exportSettingsToSync": { + "message": "صدّر الإعدادات للمزامنة" + }, + "importSettingsFromSync": { + "message": "استورد الإعدادات من المزامنة" + }, + "services": { + "message": "الخدمات" + }, + "service": { + "message": "الخدمة" + }, + "bookmarksMenu": { + "message": "قائمة العلامات" + }, + "redirectOnlyInIncognito": { + "message": "أعد التوجيه في وضع التصفح المتخفي فقط" + }, + "bypass": { + "message": "تجاوز" + }, + "block": { + "message": "احجب" + }, + "searchHint": { + "message": "اجعل LibRedirect محرك البحث الافتراضي. لمعرفة كيفية القيام بذلك في متصفحات كروميوم، انقر <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>هنا</a>." + }, + "redirect": { + "message": "أعد التوجيه" + }, + "autoPickInstance": { + "message": "اختر النُسخ تلقائيًا" + }, + "redirectGoogle": { + "message": "إعادة توجيه جوجل" + }, + "search_frontend": { + "message": "واجهة البحث" + }, + "searchService": { + "message": "خدمة البحث" + }, + "embedFrontend": { + "message": "واجهة التضمين (Embed)" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/bn/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/bn/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "লিবরিডাইরেক্ট", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "একটি ওয়েব এক্সটেনশন যা জনপ্রিয় সাইটগুলোকে বিকল্প গোপনীয়তা-বান্ধব ফ্রন্টএন্ড এবং ব্যাকএন্ডে পুনর্নির্দেশ করে", + "description": "description of the extension" + }, + "switchInstance": { + "message": "ইন্সট্যান্স পাল্টাও", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "পছন্দসমূহ", + "description": "used in the popup" + }, + "general": { + "message": "সাধারণ", + "description": "used in the settings page" + }, + "theme": { + "message": "রঙ", + "description": "used in the settings page" + }, + "light": { + "message": "সাদা", + "description": "used in the settings page" + }, + "dark": { + "message": "অন্ধকার", + "description": "used in the settings page" + }, + "auto": { + "message": "স্বয়ংক্রিয়", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "পুনঃনির্দেশ থেকে বাদ দেওয়া", + "description": "used in the settings page" + }, + "importSettings": { + "message": "পছন্দসমূহ আমদানি করো", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "পছন্দসমূহ রপ্তানি করো", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "পছন্দসমূহ সহজাত অবস্থায় ফিরত নাও", + "description": "used in the settings page" + }, + "enable": { + "message": "সক্রিয়", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "পপআপে দেখাও", + "description": "used in the settings page" + }, + "frontend": { + "message": "সামনের অংশ", + "description": "used in the settings page" + }, + "redirectType": { + "message": "পুনঃনির্দেশ ধরণ", + "description": "used in the settings page" + }, + "both": { + "message": "উভয়", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "শুধু এমবেডকৃত", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "এমবেডকৃত নয়", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "পছন্দের ইন্সট্যান্স যোগ করো", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "মূলটা অনুলিপি করো" + }, + "copied": { + "message": "অনুলিপিত" + }, + "redirectToOriginal": { + "message": "আসলটায় পুনঃনির্দেশ করো", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "পুনঃনির্দেশ করার চেষ্টা করো", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "আমাদের সম্পর্কে" + }, + "unsupportedIframesHandling": { + "message": "এমবেড স্থাপন অসমর্থিত" + }, + "fetchPublicInstances": { + "message": "প্রকাশিত সম্মুখাংশ আনো" + }, + "disable": { + "message": "নিষ্করিয়" + }, + "pingInstances": { + "message": "সার্ভার পিং করো" + }, + "exportSettingsToSync": { + "message": "পছন্দসমূহ সিঙ্কে রপ্তানি করো" + }, + "importSettingsFromSync": { + "message": "পছন্দসমূহ সিঙ্ক থেকে আমদানি করো" + }, + "services": { + "message": "সেবাসমূহ" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "বুকমার্ক তালিকা" + }, + "redirectOnlyInIncognito": { + "message": "শুধু ইনকগনিটোতে পুনর্নির্দেশ করো" + }, + "bypass": { + "message": "উপেক্ষা করো" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "লিবরিডাইরেক্টকে সহজাত অনুসন্ধান যন্ত্র হিসেবে রাখো। ক্রোমিয়াম ব্রাউজারে এটা করার জন্য <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>এখানে টিপ দাও</a>।" + }, + "redirect": { + "message": "পুনর্নির্দেশ" + }, + "autoPickInstance": { + "message": "স্বয়ংক্রিয়ভাবে নির্বাচন করো" + }, + "redirectGoogle": { + "message": "গুগল পুনর্নির্দেশ করো" + }, + "search_frontend": { + "message": "অনুসন্ধান সম্মূখাংশ" + }, + "searchService": { + "message": "অনুসন্ধান সেবা" + }, + "embedFrontend": { + "message": "সম্মূখাংশ স্থাপন করো" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/bs/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/bs/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Web proširnica koja preusmjerava poznate web stranice na prema alternativnim sučeljima i pozadinama prilagođenim privatnosti", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Prebaci instancu", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Podešavanja", + "description": "used in the popup" + }, + "general": { + "message": "Općenito", + "description": "used in the settings page" + }, + "theme": { + "message": "Tema", + "description": "used in the settings page" + }, + "light": { + "message": "Svjetla", + "description": "used in the settings page" + }, + "dark": { + "message": "Mračna", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Isključeno iz preusmjeravanja", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Uvozne Postavke", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Izvozne Postavke", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Obnovite Postavke", + "description": "used in the settings page" + }, + "enable": { + "message": "Omogući", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Prikaži u skočnom prozoru", + "description": "used in the settings page" + }, + "frontend": { + "message": "Sučelje", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Vrsta Preusmjeravanja", + "description": "used in the settings page" + }, + "both": { + "message": "oba", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "samo ugrađeno", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "samo neugrađeno", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Dodajte vaše omiljene instance", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Kopirajte original" + }, + "copied": { + "message": "Kopirano" + }, + "redirectToOriginal": { + "message": "Preusmjerite prema originalnoj", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Pokušajte preusmjeriti", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "O" + }, + "unsupportedIframesHandling": { + "message": "Nepodržano rukovanje iframeovima" + }, + "fetchPublicInstances": { + "message": "Dohvatite javne instance" + }, + "disable": { + "message": "Isključite" + }, + "pingInstances": { + "message": "Testirajte instance" + }, + "exportSettingsToSync": { + "message": "Izvezite postavke za sinkronizaciju" + }, + "importSettingsFromSync": { + "message": "Uvezite postavke iz sinkronizacije" + }, + "services": { + "message": "Usluge" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Izbornik obilježaka" + }, + "redirectOnlyInIncognito": { + "message": "Preusmjerite samo u inkognito" + }, + "bypass": { + "message": "Zaobiđite" + }, + "block": { + "message": "Blokirajte" + }, + "searchHint": { + "message": "Postavite LibRedirect kao standardni tražionik. <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>Ovdje</a> pogledajte kako se to radi u Kromijum mrežnom pregledniku." + }, + "redirect": { + "message": "Preusmjerite" + }, + "autoPickInstance": { + "message": "Odaberite automatski instancu" + }, + "redirectGoogle": { + "message": "Preusmjerite Google" + }, + "search_frontend": { + "message": "Tražite sučelje" + }, + "embedFrontend": { + "message": "Ugradite sučelje" + }, + "searchService": { + "message": "Tražite uslužnik" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/cs/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/cs/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Webové rozšíření, které přesměrovává oblíbené weby na alternativní ‘frontends‘ a ‘backends‘ respektující soukromí", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Přepnout instanci", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Nastavení", + "description": "used in the popup" + }, + "general": { + "message": "Obecné", + "description": "used in the settings page" + }, + "theme": { + "message": "Téma", + "description": "used in the settings page" + }, + "light": { + "message": "Světlé", + "description": "used in the settings page" + }, + "dark": { + "message": "Tmavé", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Vyloučeno z přesměrování", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importovat nastavení", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Exportovat nastavení", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Obnovit nastavení", + "description": "used in the settings page" + }, + "enable": { + "message": "Povolit", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Zobrazit ve vyskakovacím okně", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Typ přesměrování", + "description": "used in the settings page" + }, + "both": { + "message": "oba", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "pouze vložené", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "pouze nevložené", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Přidejte své oblíbené instance", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Kopírovat originál" + }, + "copied": { + "message": "Zkopírováno" + }, + "redirectToOriginal": { + "message": "Přesměrovat na originál", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Pokusit se přesměrovat", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "O rozšíření" + }, + "unsupportedIframesHandling": { + "message": "Nepodporovaná manipulace s iframe" + }, + "fetchPublicInstances": { + "message": "Načíst veřejné instance" + }, + "disable": { + "message": "Zakázat" + }, + "pingInstances": { + "message": "Otestovat odezvu instancí" + }, + "exportSettingsToSync": { + "message": "Exportovat nastavení do synchronizace" + }, + "importSettingsFromSync": { + "message": "Importovat nastavení ze synchronizace" + }, + "services": { + "message": "Služby" + }, + "service": { + "message": "Služba" + }, + "bookmarksMenu": { + "message": "Nabídka záložek" + }, + "redirectOnlyInIncognito": { + "message": "Přesměrovat pouze v anonymním okně" + }, + "bypass": { + "message": "Obejít" + }, + "block": { + "message": "Blokovat" + }, + "searchHint": { + "message": "Nastavte LibRedirect jako výchozí vyhledávač. Návod pro Chromium prohlížeče naleznete <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>zde</a>." + }, + "redirect": { + "message": "Přesměrovat" + }, + "autoPickInstance": { + "message": "Automaticky zvolit instanci" + }, + "searchService": { + "message": "Služba vyhledávání" + }, + "redirectGoogle": { + "message": "Přesměrovat Google" + }, + "search_frontend": { + "message": "Hledat frontend" + }, + "embedFrontend": { + "message": "Vložený frontend" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/de/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/de/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Eine Erweiterung, die beliebte Websites auf alternative, datenschutzfreundliche Frontends und Backends umleitet", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Instanz wechseln", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Einstellungen", + "description": "used in the popup" + }, + "general": { + "message": "Allgemein", + "description": "used in the settings page" + }, + "theme": { + "message": "Farbschema", + "description": "used in the settings page" + }, + "light": { + "message": "Hell", + "description": "used in the settings page" + }, + "dark": { + "message": "Dunkel", + "description": "used in the settings page" + }, + "auto": { + "message": "System", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Vom Umleiten ausschließen", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Einstellungen importieren", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Einstellungen exportieren", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Einstellungen zurücksetzen", + "description": "used in the settings page" + }, + "enable": { + "message": "Aktivieren", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Im Pop-up-Fenster anzeigen", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Art der Umleitung", + "description": "used in the settings page" + }, + "both": { + "message": "beides", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "nur eingebettet", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "nur nicht eingebettet", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Eigene Instanz hinzufügen", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Original kopieren" + }, + "copied": { + "message": "Kopiert" + }, + "redirectToOriginal": { + "message": "Zur Originalseite umleiten", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Versuchen umzuleiten", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Über" + }, + "unsupportedIframesHandling": { + "message": "Nicht unterstützte Einbettungenbehandlung" + }, + "fetchPublicInstances": { + "message": "Abrufen öffentlicher Instanzen" + }, + "disable": { + "message": "Deaktivieren" + }, + "pingInstances": { + "message": "Instanzen anpingen" + }, + "exportSettingsToSync": { + "message": "Einstellungen zur Synchronisierung exportieren" + }, + "importSettingsFromSync": { + "message": "Einstellungen aus Sync importieren" + }, + "services": { + "message": "Dienstleistungen" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Lesezeichen-Menü" + }, + "redirectOnlyInIncognito": { + "message": "Nur in Inkognito umleiten" + }, + "bypass": { + "message": "Umgehen" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Legen Sie LibRedirect als Standard-Suchmaschine fest. Wie man das in Chromium-Browsern macht, erfahren Sie <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>hier</a>." + }, + "redirect": { + "message": "Umleiten" + }, + "autoPickInstance": { + "message": "Automatisch auswählen Instanz" + }, + "redirectGoogle": { + "message": "Google umleiten" + }, + "search_frontend": { + "message": "Suche Frontend" + }, + "searchService": { + "message": "Suche Dienst" + }, + "embedFrontend": { + "message": "Frontend einbetten" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/delete.py b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/delete.py @@ -0,0 +1,75 @@ +import json + + +# langs = ['bs', 'cs', 'de', 'es', 'fr', 'gl', 'hr', 'id', 'it', 'ja', 'ko', +# 'nb_NO', 'nl', 'pl', 'pt', 'pt_BR', 'ro', 'ru', 'sr', 'tr', 'uk', 'vi', 'zh_Hans'] +en_json = {} + +with open('./en/messages.json') as data: + en_json = json.load(data) + +keys = ['extensionName', + 'extensionDescription', + 'general', + 'services', + 'service', + 'theme', + 'auto', + 'light', + 'dark', + 'excludeFromRedirecting', + 'fetchPublicInstances', + 'importSettings', + 'exportSettings', + 'exportSettingsToSync', + 'importSettingsFromSync', + 'resetSettings', + 'enable', + 'disable', + 'showInPopup', + 'frontend', + 'redirectType', + 'both', + 'onlyEmbedded', + 'onlyNotEmbedded', + 'addYourFavoriteInstances', + 'switchInstance', + 'copyOriginal', + 'copied', + 'settings', + 'about', + 'redirectToOriginal', + 'redirectLink', + 'redirectOnlyInIncognito', + 'bookmarksMenu', + 'showInPopup', + 'unsupportedIframesHandling', + 'bypass', + 'block', + 'searchHint', + 'excludeFromRedirecting', + 'pingInstances', + 'redirect', + 'autoPickInstance', + 'redirectGoogle', + 'search_frontend', + 'searchService', + 'embedFrontend', + ] + +tmp = {} + +for key in en_json: + if key in keys: + tmp[key] = en_json[key] + +en_json = tmp + +with open('en/messages.json', 'w') as outfile: + outfile.write( + json.dumps( + en_json, + ensure_ascii=False, + indent=4 + ) + ) diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/en/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/en/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "A web extension that redirects popular sites to alternative privacy-friendly frontends and backends", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Switch Instance", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Settings", + "description": "used in the popup" + }, + "general": { + "message": "General", + "description": "used in the settings page" + }, + "theme": { + "message": "Theme", + "description": "used in the settings page" + }, + "light": { + "message": "Light", + "description": "used in the settings page" + }, + "dark": { + "message": "Dark", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluded from redirecting", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Import Settings", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Export Settings", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Reset Settings", + "description": "used in the settings page" + }, + "enable": { + "message": "Enable", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Show in popup", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Redirect Type", + "description": "used in the settings page" + }, + "both": { + "message": "both", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "only embedded", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "only not embedded", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Add your favorite instances", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copy Original" + }, + "copied": { + "message": "Copied" + }, + "redirectToOriginal": { + "message": "Redirect to original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Attempt to redirect", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "About" + }, + "unsupportedIframesHandling": { + "message": "Unsupported embeds handling" + }, + "fetchPublicInstances": { + "message": "Fetch public instances" + }, + "disable": { + "message": "Disable" + }, + "pingInstances": { + "message": "Ping Instances" + }, + "exportSettingsToSync": { + "message": "Export Settings to Sync" + }, + "importSettingsFromSync": { + "message": "Import Settings from Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Bookmarks menu" + }, + "redirectOnlyInIncognito": { + "message": "Redirect Only in Incognito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Redirect" + }, + "autoPickInstance": { + "message": "Auto-pick Instance" + }, + "redirectGoogle": { + "message": "Redirect Google" + }, + "search_frontend": { + "message": "Search Frontend" + }, + "searchService": { + "message": "Search Service" + }, + "embedFrontend": { + "message": "Embed Frontend" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/eo/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/eo/messages.json @@ -0,0 +1,145 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "A web extension that redirects popular sites to alternative privacy-friendly frontends and backends", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Switch Instance", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Settings", + "description": "used in the popup" + }, + "general": { + "message": "General", + "description": "used in the settings page" + }, + "theme": { + "message": "Theme", + "description": "used in the settings page" + }, + "light": { + "message": "Light", + "description": "used in the settings page" + }, + "dark": { + "message": "Dark", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluded from redirecting", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Import Settings", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Export Settings", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Reset Settings", + "description": "used in the settings page" + }, + "enable": { + "message": "Enable", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Show in popup", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Redirect Type", + "description": "used in the settings page" + }, + "both": { + "message": "both", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "only embedded", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "only not embedded", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Add your favorite instances", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copy Original" + }, + "copied": { + "message": "Copied" + }, + "redirectToOriginal": { + "message": "Redirect to original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Attempt to redirect", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "About" + }, + "unsupportedIframesHandling": { + "message": "Unsupported embeds handling" + }, + "fetchPublicInstances": { + "message": "Fetch public instances" + }, + "disable": { + "message": "Disable" + }, + "pingInstances": { + "message": "Ping Instances" + }, + "exportSettingsToSync": { + "message": "Export Settings to Sync" + }, + "importSettingsFromSync": { + "message": "Import Settings from Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Bookmarks menu" + }, + "redirectOnlyInIncognito": { + "message": "Redirect Only in Incognito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Redirect" + } +} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/es/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/es/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Una extensión web que redirige sitios populares a frontends y backends alternativos que respetan la privacidad", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Cambiar instancia", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Ajustes", + "description": "used in the popup" + }, + "general": { + "message": "General", + "description": "used in the settings page" + }, + "theme": { + "message": "Tema", + "description": "used in the settings page" + }, + "light": { + "message": "Claro", + "description": "used in the settings page" + }, + "dark": { + "message": "Oscuro", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluidos del redireccionamiento", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importar Ajustes", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Exportar Ajustes", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Restablecer Ajustes", + "description": "used in the settings page" + }, + "enable": { + "message": "Activar", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Mostrar en ventanas emergentes", + "description": "used in the settings page" + }, + "frontend": { + "message": "Interfaz", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Tipo de Redirección", + "description": "used in the settings page" + }, + "both": { + "message": "ambos", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "solo incrustados", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "solo los no incrustados", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Añade tus instancias preferidas", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copiar original" + }, + "copied": { + "message": "Copiado" + }, + "redirectToOriginal": { + "message": "Redirigir al original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Intento de redirección", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Acerca de" + }, + "unsupportedIframesHandling": { + "message": "Manejo de incrustaciones de código no soportado" + }, + "fetchPublicInstances": { + "message": "Recuperar las instancias públicas" + }, + "disable": { + "message": "Desactivar" + }, + "pingInstances": { + "message": "Prueba de velocidad de las instancias" + }, + "exportSettingsToSync": { + "message": "Exportar configuraciones para sincronizar" + }, + "importSettingsFromSync": { + "message": "Importar configuraciones para sincronizar" + }, + "services": { + "message": "Servicios" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Menú de marcadores" + }, + "redirectOnlyInIncognito": { + "message": "Redirigir solo en modo incógnito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Bloquear" + }, + "searchHint": { + "message": "Establece LibRedirect como motor de búsqueda predeterminado. Para saber cómo hacerlo en los navegadores Chromium, haz clic <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>aquí</a>." + }, + "redirect": { + "message": "Redirigir" + }, + "search_frontend": { + "message": "Interfaz de búsqueda" + }, + "searchService": { + "message": "Servicio de búsqueda" + }, + "embedFrontend": { + "message": "Integrar Frontend" + }, + "autoPickInstance": { + "message": "Selección automática de instancias" + }, + "redirectGoogle": { + "message": "Redirigir a Google" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fa/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fa/messages.json @@ -0,0 +1,137 @@ +{ + "both": { + "message": "هر دو" + }, + "exportSettings": { + "message": "خروجی گرفتن از تنظیمات" + }, + "extensionName": { + "message": "LibRedirect" + }, + "settings": { + "message": "تنظیمات" + }, + "switchInstance": { + "message": "جایگزینی نمونه" + }, + "general": { + "message": "عمومی" + }, + "theme": { + "message": "پوسته" + }, + "auto": { + "message": "خودکار" + }, + "excludeFromRedirecting": { + "message": "چشم‌پوشی از هدایت کردن" + }, + "importSettings": { + "message": "واردکردن تنظیمات" + }, + "resetSettings": { + "message": "بازنشانی تنظیمات" + }, + "enable": { + "message": "فعال‌کردن" + }, + "frontend": { + "message": "پیشگاه" + }, + "redirectType": { + "message": "نوع هدایت" + }, + "onlyEmbedded": { + "message": "تنها جاسازی شده" + }, + "onlyNotEmbedded": { + "message": "تنها جاسازی نشده" + }, + "addYourFavoriteInstances": { + "message": "افزودن نمونه‌های مورد پسند شما" + }, + "light": { + "message": "روشن" + }, + "dark": { + "message": "تیره" + }, + "showInPopup": { + "message": "نمایش در بازشونده" + }, + "copyOriginal": { + "message": "رونویسی اصلی" + }, + "copied": { + "message": "رونویسی شد" + }, + "redirectToOriginal": { + "message": "هدایت به اصلی" + }, + "about": { + "message": "درباره" + }, + "unsupportedIframesHandling": { + "message": "مدیریت جاسازی‌های پشتیبانی نشده" + }, + "disable": { + "message": "غیر‌فعال کردن" + }, + "pingInstances": { + "message": "پینگ گرفتن از نمونه‌ها" + }, + "exportSettingsToSync": { + "message": "خروجی گرفتن از تنظیمات برای همگام‌سازی" + }, + "importSettingsFromSync": { + "message": "واردکردن تنظیمات برای همگام‌سازی" + }, + "services": { + "message": "سامانه‌ها" + }, + "service": { + "message": "سامانه" + }, + "redirectOnlyInIncognito": { + "message": "تنها هدایت کردن در حالت خصوصی" + }, + "bypass": { + "message": "دور زدن" + }, + "block": { + "message": "مسدود کردن" + }, + "redirect": { + "message": "هدایت کردن" + }, + "autoPickInstance": { + "message": "گزینش خودکار نمونه" + }, + "redirectGoogle": { + "message": "هدایت کردن گوگل" + }, + "search_frontend": { + "message": "جستجو پیشگاه" + }, + "searchService": { + "message": "جستجو سامانه" + }, + "embedFrontend": { + "message": "پیشگاه جاسازی‌شده" + }, + "extensionDescription": { + "message": "یک افزونه مرورگر که وبگاه های محبوب را به نمونه‌های دوست‌دار حریم خصوصی هدایت میکند" + }, + "bookmarksMenu": { + "message": "فهرست نشان شده‌ها" + }, + "redirectLink": { + "message": "تلاش برای هدایت" + }, + "fetchPublicInstances": { + "message": "دریافت نمونه‌های عمومی" + }, + "searchHint": { + "message": "LIBREDIRECT را به عنوان موتور جستجوی پیش‌فرض تنظیم کنید. برای نحوه انجام در مرورگرهای کروم ، روی <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>اینجا</a> ضربه بزنید." + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fi/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fi/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Selainlaajennus joka uudelleenohjaa suositut sivustot vaihtoehtoisiin yksityisyysystävällisiin käyttöliittymiin", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Vaihda instanssi", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Asetukset", + "description": "used in the popup" + }, + "general": { + "message": "Yleiset", + "description": "used in the settings page" + }, + "theme": { + "message": "Teema", + "description": "used in the settings page" + }, + "light": { + "message": "Vaalea", + "description": "used in the settings page" + }, + "dark": { + "message": "Tumma", + "description": "used in the settings page" + }, + "auto": { + "message": "Automaattinen", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Poissuljettu uudelleenohjaukselta", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Tuo asetukset", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Vie asetukset", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Nollaa asetukset", + "description": "used in the settings page" + }, + "enable": { + "message": "Ota käyttöön", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Näytä ponnahdusvalikossa", + "description": "used in the settings page" + }, + "frontend": { + "message": "Käyttöliittymä", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Uudelleenohjauksen tyyppi", + "description": "used in the settings page" + }, + "both": { + "message": "molemmat", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "vain upotetut", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "vain muut kuin upotetut", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Lisää suosikki-instanssisi", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Kopioi alkuperäinen" + }, + "copied": { + "message": "Kopioitu" + }, + "redirectToOriginal": { + "message": "Uudelleenohjaa alkuperäiseen", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Yritä uudelleenohjata", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Tietoja" + }, + "unsupportedIframesHandling": { + "message": "Tukemattomien upotusten käsittely" + }, + "fetchPublicInstances": { + "message": "Hae julkiset instanssit" + }, + "disable": { + "message": "Poista käytöstä" + }, + "pingInstances": { + "message": "Kokeile yhteyttä instanssiin" + }, + "exportSettingsToSync": { + "message": "Vie asetukset Sync:iin" + }, + "importSettingsFromSync": { + "message": "Tuo asetukset Sync:istä" + }, + "services": { + "message": "Palvelut" + }, + "service": { + "message": "Palvelu" + }, + "bookmarksMenu": { + "message": "Kirjanmerkkipalkki" + }, + "redirectOnlyInIncognito": { + "message": "Uudelleenohjaa vain yksityisikkunassa" + }, + "bypass": { + "message": "Ohita" + }, + "block": { + "message": "Estä" + }, + "searchHint": { + "message": "Aseta LibRedirect oletushakukoneeksi. Ohjeita varten chromium-selaimissa, paina <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>tästä</a>." + }, + "redirect": { + "message": "Uudelleenohjaa" + }, + "autoPickInstance": { + "message": "Automaattisesti valitse instanssi" + }, + "redirectGoogle": { + "message": "Uudelleenohjaa Googleen" + }, + "search_frontend": { + "message": "Hae käyttöliittymää" + }, + "searchService": { + "message": "Hae palveluja" + }, + "embedFrontend": { + "message": "Upota käyttöliittymä" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fil/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fil/messages.json @@ -0,0 +1,137 @@ +{ + "resetSettings": { + "message": "I-reset ang mga setting" + }, + "fetchPublicInstances": { + "message": "Kunin ang mga publikong instansya" + }, + "searchHint": { + "message": "Itakda ang LibRedirect bilang Default na Search Engine. Para sa kung paano gawin sa mga Chromium browser, mag-click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>dito</a>." + }, + "unsupportedIframesHandling": { + "message": "Pag-handle sa mga hindi sinusuportahang embed" + }, + "extensionDescription": { + "message": "Isang web extension na nagre-redirect ng mga popular na site sa mga alternatibong privacy-friendly na frontend at backend" + }, + "service": { + "message": "Serbisyo" + }, + "extensionName": { + "message": "LibRedirect" + }, + "light": { + "message": "Maliwanag" + }, + "switchInstance": { + "message": "Palitan ang Instansya" + }, + "settings": { + "message": "Mga Setting" + }, + "general": { + "message": "General" + }, + "theme": { + "message": "Tema" + }, + "dark": { + "message": "Madilim" + }, + "auto": { + "message": "Awto" + }, + "excludeFromRedirecting": { + "message": "Hindi kasama mula sa pag-redirect" + }, + "importSettings": { + "message": "I-import ang mga setting" + }, + "exportSettings": { + "message": "I-export ang mga setting" + }, + "enable": { + "message": "I-enable" + }, + "frontend": { + "message": "Frontend" + }, + "redirectType": { + "message": "Uri ng Redirect" + }, + "both": { + "message": "pareho" + }, + "onlyEmbedded": { + "message": "embedded lamang" + }, + "onlyNotEmbedded": { + "message": "mga hindi embedded lamang" + }, + "addYourFavoriteInstances": { + "message": "Idagdag ang iyong mga paboritong instansya" + }, + "copyOriginal": { + "message": "Kopyahin ang Orihinal" + }, + "copied": { + "message": "Kinopya" + }, + "redirectToOriginal": { + "message": "Mag-redirect sa orihinal" + }, + "about": { + "message": "Tungkol sa" + }, + "disable": { + "message": "I-disable" + }, + "pingInstances": { + "message": "I-ping ang Mga Instansya" + }, + "exportSettingsToSync": { + "message": "I-export ang Mga Setting para Mag-sync" + }, + "importSettingsFromSync": { + "message": "I-import ang Mga Setting mula sa Sync" + }, + "services": { + "message": "Mga Serbisyo" + }, + "bookmarksMenu": { + "message": "Menu ng mga bookmark" + }, + "redirectOnlyInIncognito": { + "message": "Mag-redirect lamang sa Incognito" + }, + "bypass": { + "message": "I-bypass" + }, + "block": { + "message": "I-block" + }, + "redirect": { + "message": "I-redirect" + }, + "autoPickInstance": { + "message": "Awtomatikong piliin ang Instansya" + }, + "redirectGoogle": { + "message": "I-redirect ang Google" + }, + "search_frontend": { + "message": "Frontend ng Paghahanap" + }, + "searchService": { + "message": "Serbisyo ng Paghahanap" + }, + "embedFrontend": { + "message": "Frontend ng Embed" + }, + "showInPopup": { + "message": "Ipakita sa popup" + }, + "redirectLink": { + "message": "Subukang mag-redirect" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/filter.py b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/filter.py @@ -0,0 +1,60 @@ +import json + + +langs = [ + 'ar', + 'bn', + 'bs', + 'cs', + 'de', + 'eo', + 'es', + 'fi', + 'fr', + 'gl', + 'hi', + 'hr', + 'id', + 'it', + 'ja', + 'jv', + 'ko', + 'nb_NO', + 'nl', + 'pl', + 'pt', + 'pt_BR', + 'ro', + 'ru', + 'sr', + 'tr', + 'uk', + 'vi', + 'zh_Hans', + 'zh_Hant', +] +en_json = {} + +with open('src/_locales/en/messages.json') as data: + en_json = json.load(data) + + + +for lang in langs: + lang_json = {} + with open('src/_locales/'+lang+'/messages.json') as data: + lang_json = json.load(data) + lang_json_new = {} + for key in en_json: + if key in lang_json: + lang_json_new[key] = lang_json[key] + else: + lang_json_new[key] = en_json[key] + with open('src/_locales/'+lang+'/messages.json', 'w') as outfile: + outfile.write( + json.dumps( + lang_json_new, + ensure_ascii=False, + indent=4 + ) + ) diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fr/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/fr/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Une extension web qui redirige les sites populaires vers des interfaces et des serveurs alternatifs respectueux de la vie privée", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Changer d'instance", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Paramètres", + "description": "used in the popup" + }, + "general": { + "message": "Général", + "description": "used in the settings page" + }, + "theme": { + "message": "Thème", + "description": "used in the settings page" + }, + "light": { + "message": "Clair", + "description": "used in the settings page" + }, + "dark": { + "message": "Sombre", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Exclus de la redirection", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importer les paramètres", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Exporter les paramètres", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Réinitialiser les paramètres", + "description": "used in the settings page" + }, + "enable": { + "message": "Activer", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Afficher dans la fenêtre contextuelle de l'extension", + "description": "used in the settings page" + }, + "frontend": { + "message": "Interface", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Type de redirection", + "description": "used in the settings page" + }, + "both": { + "message": "les deux", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "éléments embarqués seulement", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "tout sauf éléments embarqués", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Ajoutez vos instances favorites", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copier l'original" + }, + "copied": { + "message": "Copié" + }, + "redirectToOriginal": { + "message": "Rediriger vers l'original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Essayer de rediriger", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "À propos" + }, + "unsupportedIframesHandling": { + "message": "Gestion des éléments embarqués non-pris-en-charge" + }, + "fetchPublicInstances": { + "message": "Récupérer des instances publiques" + }, + "disable": { + "message": "Désactiver" + }, + "pingInstances": { + "message": "Envoyer un ping aux instances" + }, + "exportSettingsToSync": { + "message": "Exporter les paramètres vers Sync" + }, + "importSettingsFromSync": { + "message": "Importer les paramètres depuis Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Menu des marque-pages" + }, + "redirectOnlyInIncognito": { + "message": "Rediriger seulement en Mode Incognito" + }, + "bypass": { + "message": "Laisser tel quel" + }, + "block": { + "message": "Bloquer" + }, + "searchHint": { + "message": "Paramétrez LibRedirect pour être votre moteur de recherche par défaut. Pour savoir comment faire sur un navigateur chromium, cliquez <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>ici</a>." + }, + "redirect": { + "message": "Rediriger" + }, + "autoPickInstance": { + "message": "Choix d'instance automatique" + }, + "redirectGoogle": { + "message": "Rediriger Google" + }, + "search_frontend": { + "message": "Chercher une interface" + }, + "searchService": { + "message": "Chercher un service" + }, + "embedFrontend": { + "message": "Interface des éléments embarqués" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/gl/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/gl/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Un complemento do navegador que redirixe o tráfico cara alternativas amigables e respetuosas", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Cambiar de Instancia", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Axustes", + "description": "used in the popup" + }, + "general": { + "message": "Xeral", + "description": "used in the settings page" + }, + "theme": { + "message": "Decorado", + "description": "used in the settings page" + }, + "light": { + "message": "Claro", + "description": "used in the settings page" + }, + "dark": { + "message": "Escuro", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluído da redirección", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importar Axustes", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Exportar Axustes", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Restablecer Axustes", + "description": "used in the settings page" + }, + "enable": { + "message": "Activar", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Mostrar nunha xanela emerxente", + "description": "used in the settings page" + }, + "frontend": { + "message": "Interface", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Tipo de Redirección", + "description": "used in the settings page" + }, + "both": { + "message": "ambos", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "só incrustados", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "só non incrustados", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Engade as túas instancias favoritas", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copiar Orixinal" + }, + "copied": { + "message": "Copiouse" + }, + "redirectToOriginal": { + "message": "Ir ao orixinal", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Tenta redirixir", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Sobre" + }, + "unsupportedIframesHandling": { + "message": "Xestión de incrustacións sen soporte" + }, + "fetchPublicInstances": { + "message": "Obter instancias públicas" + }, + "disable": { + "message": "Desactivar" + }, + "pingInstances": { + "message": "Comprobar Instancias" + }, + "exportSettingsToSync": { + "message": "Exportar Axustes a Sincr." + }, + "importSettingsFromSync": { + "message": "Importar Axustes de Sincr" + }, + "services": { + "message": "Servizos" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Menú dos marcadores" + }, + "redirectOnlyInIncognito": { + "message": "Redirect só en Incógnito" + }, + "bypass": { + "message": "Omitir" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Establece a LibRedirect como Motor de Busca predeterminado. Para facelo nos navegadores chromium, preme <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>aquí</a>." + }, + "redirect": { + "message": "Redirect" + }, + "autoPickInstance": { + "message": "Selecc. automática instancia" + }, + "redirectGoogle": { + "message": "Redirect a Google" + }, + "search_frontend": { + "message": "Buscar Interface Alt." + }, + "searchService": { + "message": "Buscar Servizo" + }, + "embedFrontend": { + "message": "Incrustar Interface" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hi/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hi/messages.json @@ -0,0 +1 @@ +{} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hr/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hr/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Web proširenje koje preusmjerava popularne web stranice na alternativna sučelja i pozadinske sustave prilagođene privatnosti", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Zamijeni instancu", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Postavke", + "description": "used in the popup" + }, + "general": { + "message": "Opće", + "description": "used in the settings page" + }, + "theme": { + "message": "Tema", + "description": "used in the settings page" + }, + "light": { + "message": "Svijetla", + "description": "used in the settings page" + }, + "dark": { + "message": "Tamna", + "description": "used in the settings page" + }, + "auto": { + "message": "Automatski", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Isključeno iz preusmjeravanja", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Uvezi postavke", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Izvezi postavke", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Obnovi postavke", + "description": "used in the settings page" + }, + "enable": { + "message": "Aktiviraj", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Pokaži u skočnom prozoru", + "description": "used in the settings page" + }, + "frontend": { + "message": "Sučelje", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Vrsta preusmjeravanja", + "description": "used in the settings page" + }, + "both": { + "message": "oboje", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "samo ugrađena", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "samo neugrađena", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Dodaj svoje omiljene instance", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Kopiraj original" + }, + "copied": { + "message": "Kopirano" + }, + "redirectToOriginal": { + "message": "Preusmjeri na original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Pokušaj preusmjeriti", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "O" + }, + "unsupportedIframesHandling": { + "message": "Nepodržano rukovanje iframeovima" + }, + "fetchPublicInstances": { + "message": "Dohvati javne instance" + }, + "disable": { + "message": "Deaktiviraj" + }, + "pingInstances": { + "message": "Testiraj instance" + }, + "exportSettingsToSync": { + "message": "Izvezi postavke za sinkronizaciju" + }, + "importSettingsFromSync": { + "message": "Uvezi postavke iz sinkronizacije" + }, + "services": { + "message": "Usluge" + }, + "service": { + "message": "Usluga" + }, + "bookmarksMenu": { + "message": "Izbornik zabilješki" + }, + "redirectOnlyInIncognito": { + "message": "Preusmjeri samo u inkognito modusu" + }, + "bypass": { + "message": "Zaobiđi" + }, + "block": { + "message": "Blokiraj" + }, + "searchHint": { + "message": "Postavi LibRedirect kao standardnu tražilicu. <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>Ovdje</a> pogledaj kako se to radi u Chromium web pregledniku." + }, + "redirect": { + "message": "Preusmjeri" + }, + "autoPickInstance": { + "message": "Odaberi instancu automatski" + }, + "redirectGoogle": { + "message": "Preusmjeri na Google" + }, + "search_frontend": { + "message": "Traži sučelje" + }, + "searchService": { + "message": "Traži uslugu" + }, + "embedFrontend": { + "message": "Ugradi sučelje" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hu/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/hu/messages.json @@ -0,0 +1,137 @@ +{ + "settings": { + "message": "Beállítások" + }, + "extensionDescription": { + "message": "Egy webes kiterjesztés, amely népszerű webhelyeket irányít át alternatív, adatvédelemet tiszteletben tartó elő- és háttérprogramokra" + }, + "general": { + "message": "Általános" + }, + "theme": { + "message": "Téma" + }, + "light": { + "message": "Világos" + }, + "exportSettings": { + "message": "Beállítások exportálása" + }, + "both": { + "message": "mindkettő" + }, + "dark": { + "message": "Sötét" + }, + "auto": { + "message": "Automatikus" + }, + "excludeFromRedirecting": { + "message": "Átirányításból kizárt" + }, + "importSettings": { + "message": "Beállítások importálása" + }, + "resetSettings": { + "message": "Beállítások visszaállítása" + }, + "onlyEmbedded": { + "message": "csak beágyazott" + }, + "enable": { + "message": "Engedélyezés" + }, + "showInPopup": { + "message": "Megjelenítés felugró ablakban" + }, + "onlyNotEmbedded": { + "message": "csak nem beágyazott" + }, + "copied": { + "message": "Másolva" + }, + "redirectLink": { + "message": "Kísérlet az átirányításra" + }, + "fetchPublicInstances": { + "message": "Nyilvános példányok lekérése" + }, + "addYourFavoriteInstances": { + "message": "Adja hozzá kedvenc példányait" + }, + "copyOriginal": { + "message": "Eredeti másolása" + }, + "redirectToOriginal": { + "message": "Átirányítás az eredetire" + }, + "about": { + "message": "Névjegy" + }, + "unsupportedIframesHandling": { + "message": "Nem támogatott beágyazások kezelése" + }, + "disable": { + "message": "Tiltás" + }, + "services": { + "message": "Szolgáltatások" + }, + "pingInstances": { + "message": "Példányok pingelése" + }, + "exportSettingsToSync": { + "message": "Beállítások exportálása a szinkronizáláshoz" + }, + "importSettingsFromSync": { + "message": "Beállítások importálása a szinkronizációból" + }, + "service": { + "message": "Szolgáltatás" + }, + "bookmarksMenu": { + "message": "Könyvjelzők menü" + }, + "block": { + "message": "Letiltás" + }, + "redirectOnlyInIncognito": { + "message": "Átirányítás csak inkognitóban" + }, + "redirect": { + "message": "Átirányítás" + }, + "switchInstance": { + "message": "Példány váltása" + }, + "frontend": { + "message": "Előtétprogram" + }, + "redirectType": { + "message": "Átirányítás típusa" + }, + "autoPickInstance": { + "message": "Példány automatikus kiválasztása" + }, + "redirectGoogle": { + "message": "Google átirányítása" + }, + "search_frontend": { + "message": "Előtétprogram keresése" + }, + "extensionName": { + "message": "LibRedirect" + }, + "bypass": { + "message": "Megkerülés" + }, + "searchHint": { + "message": "LibRedirect beállítása alapértelmezett keresőmotornak. A Chromium böngészőkben történő művelethez kattintson <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>ide</a>." + }, + "searchService": { + "message": "Szolgáltatás keresése" + }, + "embedFrontend": { + "message": "Beágyazott előtétprogram" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/id/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/id/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "Libredirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Ekstensi web yang mengalihkan situs-situs terkenal ke frontend dan backend alternatif yang menghargai privasi", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Ganti Server", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Setelan", + "description": "used in the popup" + }, + "general": { + "message": "Umum", + "description": "used in the settings page" + }, + "theme": { + "message": "Tema", + "description": "used in the settings page" + }, + "light": { + "message": "Terang", + "description": "used in the settings page" + }, + "dark": { + "message": "Gelap", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Tidak disertakan dari pengalihan", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Impor Pengaturan", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Ekspor Pengaturan", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Atur Ulang Pengaturan", + "description": "used in the settings page" + }, + "enable": { + "message": "Aktifkan", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Tampilkan di sembulan", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Jenis Pengalihan", + "description": "used in the settings page" + }, + "both": { + "message": "keduanya", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "hanya tersemat", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "hanya tidak tersemat", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Tambahkan server favorit Anda", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Salin Asli" + }, + "copied": { + "message": "Disalin" + }, + "redirectToOriginal": { + "message": "Alihkan ke asli", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Coba alihkan", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Tentang" + }, + "unsupportedIframesHandling": { + "message": "Penanganan sematan tidak didukung" + }, + "fetchPublicInstances": { + "message": "Dapatkan server publik" + }, + "disable": { + "message": "Nonaktifkan" + }, + "pingInstances": { + "message": "Ping Server" + }, + "exportSettingsToSync": { + "message": "Pengaturan Ekspor ke Sinkronisasi" + }, + "importSettingsFromSync": { + "message": "Mengimpor Pengaturan dari Sinkronisasi" + }, + "services": { + "message": "Layanan" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Menu penanda" + }, + "redirectOnlyInIncognito": { + "message": "Alihkan Hanya dalam Penyamaran" + }, + "bypass": { + "message": "Mengakali" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Tetapkan LibRedirect sebagai Mesin Pencari Default. Untuk cara melakukannya di browser kromium, klik<a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Pengalihan" + }, + "autoPickInstance": { + "message": "Pilih Server Otomatis" + }, + "redirectGoogle": { + "message": "Alihkan Google" + }, + "search_frontend": { + "message": "Frontend Pencarian" + }, + "searchService": { + "message": "Layanan Pencarian" + }, + "embedFrontend": { + "message": "Frontend Sematan" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/it/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/it/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Un'estensione per il browser che reindirizza i siti più popolari verso frontend e backend alternativi rispettosi della privacy", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Cambia istanza", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Impostazioni", + "description": "used in the popup" + }, + "general": { + "message": "Generali", + "description": "used in the settings page" + }, + "theme": { + "message": "Tema", + "description": "used in the settings page" + }, + "light": { + "message": "Chiaro", + "description": "used in the settings page" + }, + "dark": { + "message": "Scuro", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Escluso dal reindirizzamento", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importa impostazioni", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Esporta impostazioni", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Ripristina impostazioni", + "description": "used in the settings page" + }, + "enable": { + "message": "Attiva", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Mostra nel popup", + "description": "used in the settings page" + }, + "frontend": { + "message": "Interfaccia", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Tipo di reindirizzamento", + "description": "used in the settings page" + }, + "both": { + "message": "entrambi", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "solo incorporati", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "solo non incorporati", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Aggiungi le tue istanze preferite", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copia originale" + }, + "copied": { + "message": "Copiato" + }, + "redirectToOriginal": { + "message": "Reindirizza all'originale", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Prova a reindirizzare", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Informazioni" + }, + "unsupportedIframesHandling": { + "message": "Gestione degli elementi incorporati non supportata" + }, + "fetchPublicInstances": { + "message": "Recupera istanze pubbliche" + }, + "disable": { + "message": "Disattiva" + }, + "pingInstances": { + "message": "Ping istanze" + }, + "exportSettingsToSync": { + "message": "Esporta impostazioni in Sync" + }, + "importSettingsFromSync": { + "message": "Importa impostazioni da Sync" + }, + "services": { + "message": "Servizi" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Menu Segnalibri" + }, + "redirectOnlyInIncognito": { + "message": "Reindirizza solo in Incognito" + }, + "bypass": { + "message": "Ignora" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Impostare LibRedirect come motore di ricerca predefinito. Per i browser Chromium, premere <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>qui</a>." + }, + "redirect": { + "message": "Reindirizza" + }, + "autoPickInstance": { + "message": "Scegli istanza automaticamente" + }, + "redirectGoogle": { + "message": "Reindirizza Google" + }, + "search_frontend": { + "message": "Cerca frontend" + }, + "searchService": { + "message": "Cerca servizio" + }, + "embedFrontend": { + "message": "Incorpora frontend" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ja/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ja/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "人気サイトを個人情報に配慮した代替のフロントエンド/バックエンドに転送するウェブ拡張機能", + "description": "description of the extension" + }, + "switchInstance": { + "message": "インスタンスを変更", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "設定", + "description": "used in the popup" + }, + "general": { + "message": "一般", + "description": "used in the settings page" + }, + "theme": { + "message": "テーマ", + "description": "used in the settings page" + }, + "light": { + "message": "ライト", + "description": "used in the settings page" + }, + "dark": { + "message": "ダーク", + "description": "used in the settings page" + }, + "auto": { + "message": "自動", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "転送から除外", + "description": "used in the settings page" + }, + "importSettings": { + "message": "設定のインポート", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "設定のエクスポート", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "設定を初期化", + "description": "used in the settings page" + }, + "enable": { + "message": "有効化", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "ポップアップ内に表示", + "description": "used in the settings page" + }, + "frontend": { + "message": "フロントエンド", + "description": "used in the settings page" + }, + "redirectType": { + "message": "転送の種類", + "description": "used in the settings page" + }, + "both": { + "message": "両方", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "埋め込み型のみ", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "非埋め込み型のみ", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "独自のインスタンスを追加", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "元のサービスのURIをコピー" + }, + "copied": { + "message": "コピーしました" + }, + "redirectToOriginal": { + "message": "元のサービスに転送", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "転送する", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "公式サイト" + }, + "unsupportedIframesHandling": { + "message": "未対応の埋め込み動画の処理" + }, + "fetchPublicInstances": { + "message": "公開インスタンスの一覧を取得" + }, + "disable": { + "message": "無効" + }, + "pingInstances": { + "message": "インスタンスの応答時間を確認" + }, + "exportSettingsToSync": { + "message": "設定を同期にエクスポート" + }, + "importSettingsFromSync": { + "message": "設定を同期からインポート" + }, + "services": { + "message": "サービス" + }, + "service": { + "message": "サービス" + }, + "bookmarksMenu": { + "message": "ブークマークのメニューに追加" + }, + "redirectOnlyInIncognito": { + "message": "シークレットモードでのみ転送" + }, + "bypass": { + "message": "転送なし" + }, + "block": { + "message": "表示しない" + }, + "searchHint": { + "message": "LibRedirect を標準の検索エンジンに設定します。chromium ブラウザーでのやり方は、<a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>こちらをクリック</a>。" + }, + "redirect": { + "message": "転送する" + }, + "search_frontend": { + "message": "検索フロントエンド" + }, + "embedFrontend": { + "message": "埋め込みフロントエンド" + }, + "redirectGoogle": { + "message": "Googleを転送する" + }, + "autoPickInstance": { + "message": "インスタンスを自動で取得" + }, + "searchService": { + "message": "検索サービス" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/jv/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/jv/messages.json @@ -0,0 +1,145 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "A web extension that redirects popular sites to alternative privacy-friendly frontends and backends", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Switch Instance", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Settings", + "description": "used in the popup" + }, + "general": { + "message": "General", + "description": "used in the settings page" + }, + "theme": { + "message": "Téma", + "description": "used in the settings page" + }, + "light": { + "message": "Terang", + "description": "used in the settings page" + }, + "dark": { + "message": "Peteng", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluded from redirecting", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Import Settings", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Export Settings", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Reset Settings", + "description": "used in the settings page" + }, + "enable": { + "message": "Enable", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Show in popup", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Redirect Type", + "description": "used in the settings page" + }, + "both": { + "message": "both", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "only embedded", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "only not embedded", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Add your favorite instances", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copy Original" + }, + "copied": { + "message": "Copied" + }, + "redirectToOriginal": { + "message": "Redirect to original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Attempt to redirect", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "About" + }, + "unsupportedIframesHandling": { + "message": "Unsupported embeds handling" + }, + "fetchPublicInstances": { + "message": "Fetch public instances" + }, + "disable": { + "message": "Disable" + }, + "pingInstances": { + "message": "Ping Instances" + }, + "exportSettingsToSync": { + "message": "Export Settings to Sync" + }, + "importSettingsFromSync": { + "message": "Import Settings from Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Bookmarks menu" + }, + "redirectOnlyInIncognito": { + "message": "Redirect Only in Incognito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Redirect" + } +} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ko/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ko/messages.json @@ -0,0 +1,145 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "A web extension that redirects popular sites to alternative privacy-friendly frontends and backends", + "description": "description of the extension" + }, + "switchInstance": { + "message": "인스턴스 바꾸기", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "설정", + "description": "used in the popup" + }, + "general": { + "message": "일반", + "description": "used in the settings page" + }, + "theme": { + "message": "테마", + "description": "used in the settings page" + }, + "light": { + "message": "밝음", + "description": "used in the settings page" + }, + "dark": { + "message": "어두움", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluded from redirecting", + "description": "used in the settings page" + }, + "importSettings": { + "message": "설정 불러오기", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "설정 내보내기", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "설정 초기화", + "description": "used in the settings page" + }, + "enable": { + "message": "활성화", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Show in popup", + "description": "used in the settings page" + }, + "frontend": { + "message": "프론트엔드", + "description": "used in the settings page" + }, + "redirectType": { + "message": "리다이렉트 종류", + "description": "used in the settings page" + }, + "both": { + "message": "둘 다", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "임베디드 된 것만", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "임베디드 안된 것만", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Add your favorite instances", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copy Original" + }, + "copied": { + "message": "복사됨" + }, + "redirectToOriginal": { + "message": "Redirect to original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Attempt to redirect this hyperlink", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "About" + }, + "unsupportedIframesHandling": { + "message": "Unsupported iframes handling" + }, + "fetchPublicInstances": { + "message": "Fetch public instances" + }, + "disable": { + "message": "Disable" + }, + "pingInstances": { + "message": "Ping Instances" + }, + "exportSettingsToSync": { + "message": "Export Settings to Sync" + }, + "importSettingsFromSync": { + "message": "Import Settings from Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Bookmarks menu" + }, + "redirectOnlyInIncognito": { + "message": "Redirect Only in Incognito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Redirect" + } +} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/nb_NO/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/nb_NO/messages.json @@ -0,0 +1,145 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "En vev-utvidelse som videresender populære sider til alternative personvernsrespekterende grenseflater og bakender", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Bytt instans", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Innstillinger", + "description": "used in the popup" + }, + "general": { + "message": "Generelt", + "description": "used in the settings page" + }, + "theme": { + "message": "Drakt", + "description": "used in the settings page" + }, + "light": { + "message": "Lys", + "description": "used in the settings page" + }, + "dark": { + "message": "Mørk", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluded from redirecting", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importer innstillinger", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Eksporter innstillinger", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Tilbakestill innstillinger", + "description": "used in the settings page" + }, + "enable": { + "message": "Skru på", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Show in popup", + "description": "used in the settings page" + }, + "frontend": { + "message": "Grenseflate", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Videresendingstype", + "description": "used in the settings page" + }, + "both": { + "message": "begge", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "kun innebygde", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "kun ikke-innebygde", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Add your favorite instances", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copy Original" + }, + "copied": { + "message": "Kopiert" + }, + "redirectToOriginal": { + "message": "Redirect to original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Attempt to redirect this hyperlink", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "About" + }, + "unsupportedIframesHandling": { + "message": "Unsupported iframes handling" + }, + "fetchPublicInstances": { + "message": "Fetch public instances" + }, + "disable": { + "message": "Disable" + }, + "pingInstances": { + "message": "Ping Instances" + }, + "exportSettingsToSync": { + "message": "Export Settings to Sync" + }, + "importSettingsFromSync": { + "message": "Import Settings from Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Bookmarks menu" + }, + "redirectOnlyInIncognito": { + "message": "Redirect Only in Incognito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Redirect" + } +} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/nl/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/nl/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Een webextensie die populaire sites doorverwijst naar alternatieve privacy-vriendelijke frontends en backends", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Schakelen tussen instanties", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Instellingen", + "description": "used in the popup" + }, + "general": { + "message": "Algemeen", + "description": "used in the settings page" + }, + "theme": { + "message": "Thema", + "description": "used in the settings page" + }, + "light": { + "message": "Licht", + "description": "used in the settings page" + }, + "dark": { + "message": "Donker", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Uitgesloten van doorverwijzen", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Instellingen importeren", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Instellingen exporteren", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Standaardwaarden", + "description": "used in the settings page" + }, + "enable": { + "message": "Inschakelen", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Tonen in uitrolmenu", + "description": "used in the settings page" + }, + "frontend": { + "message": "Front-end", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Omleidingstype", + "description": "used in the settings page" + }, + "both": { + "message": "beide", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "alleen ingesloten", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "alleen niet-ingesloten", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Toevoegen aan favoriete instanties", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Origineel kopiëren" + }, + "copied": { + "message": "Gekopieerd" + }, + "redirectToOriginal": { + "message": "Doorverwijzen naar origineel", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Doorverwijzing proberen", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Over" + }, + "unsupportedIframesHandling": { + "message": "Niet-ondersteunde insluitafhandeling" + }, + "fetchPublicInstances": { + "message": "Openbare instanties ophalen" + }, + "disable": { + "message": "Uitschakelen" + }, + "pingInstances": { + "message": "Instanties pingen" + }, + "exportSettingsToSync": { + "message": "Instellingen synchroniseren" + }, + "importSettingsFromSync": { + "message": "Instellingen ophalen uit synchronisatie" + }, + "services": { + "message": "Diensten" + }, + "service": { + "message": "Dienst" + }, + "bookmarksMenu": { + "message": "Bladwijzermenu" + }, + "redirectOnlyInIncognito": { + "message": "Alleen doorverwijzen in privévensters" + }, + "bypass": { + "message": "Omzeilen" + }, + "block": { + "message": "Blokkeren" + }, + "searchHint": { + "message": "Stel LibRedirect in als de standaard zoekmachine. Hoe je dit doet in op Chromium gebaseerde browsers, lees je <a href='' target='_blank' rel='noopener noreferrer'>hier</a>." + }, + "redirect": { + "message": "Doorverwijzen" + }, + "autoPickInstance": { + "message": "Automatisch instantie kiezen" + }, + "redirectGoogle": { + "message": "Google doorverwijzen" + }, + "searchService": { + "message": "Zoeken naar dienst" + }, + "search_frontend": { + "message": "Zoeken naar front-end" + }, + "embedFrontend": { + "message": "Front-end insluiten" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pl/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pl/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Rozszerzenie, które przekierowuje popularne witryny do alternatywnych, szanujących prywatność frontendów i backendów", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Przełącz instancję", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Ustawienia", + "description": "used in the popup" + }, + "general": { + "message": "Ogólne", + "description": "used in the settings page" + }, + "theme": { + "message": "Motyw", + "description": "used in the settings page" + }, + "light": { + "message": "Jasny", + "description": "used in the settings page" + }, + "dark": { + "message": "Ciemny", + "description": "used in the settings page" + }, + "auto": { + "message": "Automatyczny", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Wykluczone z przekierowania", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importuj ustawienia", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Eksportuj ustawienia", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Zresetuj ustawienia", + "description": "used in the settings page" + }, + "enable": { + "message": "Włącz", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Pokaż w wyskakującym okienku", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Typ przekierowania", + "description": "used in the settings page" + }, + "both": { + "message": "oba", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "tylko osadzone", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "tylko nieosadzone", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Dodaj ulubione instancje", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Kopiuj oryginał" + }, + "copied": { + "message": "Skopiowano" + }, + "redirectToOriginal": { + "message": "Przekieruj do oryginału", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Spróbuj przekierować", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Informacje" + }, + "unsupportedIframesHandling": { + "message": "Brak obsługi osadzania" + }, + "fetchPublicInstances": { + "message": "Pobierz instancje publiczne" + }, + "disable": { + "message": "Wyłącz" + }, + "pingInstances": { + "message": "Pinguj instancje" + }, + "exportSettingsToSync": { + "message": "Eksportuj ustawienia do synchronizacji" + }, + "importSettingsFromSync": { + "message": "Importuj ustawienia do synchronizacji" + }, + "services": { + "message": "Usługi" + }, + "service": { + "message": "Usługa" + }, + "bookmarksMenu": { + "message": "Menu zakładek" + }, + "redirectOnlyInIncognito": { + "message": "Przekieruj tylko w trybie incognito" + }, + "bypass": { + "message": "Omiń" + }, + "block": { + "message": "Zablokuj" + }, + "searchHint": { + "message": "Ustaw LibRedirect jako domyślną wyszukiwarkę. Aby dowiedzieć się, jak to zrobić w przeglądarkach Chromium, kliknij <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>tutaj</a>." + }, + "redirect": { + "message": "Przekieruj" + }, + "autoPickInstance": { + "message": "Automatyczny wybór instancji" + }, + "redirectGoogle": { + "message": "Przekieruj Google" + }, + "embedFrontend": { + "message": "Frontend osadzania" + }, + "search_frontend": { + "message": "Frontend wyszukiwania" + }, + "searchService": { + "message": "Usługa wyszukiwania" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pt/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pt/messages.json @@ -0,0 +1,145 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Uma extensão para os navegadores de Internet que redireciona sites populares para interfaces gráficas e interfaces de textos alternativas e amigáveis que respeitam a privacidade", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Trocar de instância", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Configurações", + "description": "used in the popup" + }, + "general": { + "message": "Geral", + "description": "used in the settings page" + }, + "theme": { + "message": "Tema", + "description": "used in the settings page" + }, + "light": { + "message": "Claro", + "description": "used in the settings page" + }, + "dark": { + "message": "Escuro", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluído do redirecionamento", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importar configurações", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Exportar configurações", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Repor configurações", + "description": "used in the settings page" + }, + "enable": { + "message": "Ativar", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Mostrar no pop-up", + "description": "used in the settings page" + }, + "frontend": { + "message": "Interface", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Tipo de redirecionamento", + "description": "used in the settings page" + }, + "both": { + "message": "ambos", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "só embutidos", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "apenas os não embutidos", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Adicionar a sua instância favorita", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copy Original" + }, + "copied": { + "message": "Copiado" + }, + "redirectToOriginal": { + "message": "Redirecionar para o original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Tentar redirecionar", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Sobre" + }, + "unsupportedIframesHandling": { + "message": "Unsupported iframes handling" + }, + "fetchPublicInstances": { + "message": "Fetch public instances" + }, + "disable": { + "message": "Disable" + }, + "pingInstances": { + "message": "Ping Instances" + }, + "exportSettingsToSync": { + "message": "Export Settings to Sync" + }, + "importSettingsFromSync": { + "message": "Import Settings from Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Bookmarks menu" + }, + "redirectOnlyInIncognito": { + "message": "Redirect Only in Incognito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Redirect" + } +} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pt_BR/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/pt_BR/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "Nome da Extensão" + }, + "extensionDescription": { + "message": "Uma extensão para os navegadores de internet que redireciona os sítios/sites populares para interfaces gráficas e interfaces de textos alternativas e amigáveis que respeitam sua privacidade", + "description": "Descrição da Extensão" + }, + "switchInstance": { + "message": "Trocar a instância", + "description": "Utilizado no arquivo manifest.json como descrição do atalho" + }, + "settings": { + "message": "Configurações", + "description": "Utilizado na janela da caixa de diálogo" + }, + "general": { + "message": "Geral", + "description": "Utilizado na página de configurações" + }, + "theme": { + "message": "Tema", + "description": "Utilizado na página de configurações" + }, + "light": { + "message": "Claro", + "description": "Utilizado na página de configurações" + }, + "dark": { + "message": "Escuro", + "description": "Utilizado na página de configurações" + }, + "auto": { + "message": "Automático", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluído do redirecionamento", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Importar as configurações", + "description": "Utilizado na página de configurações" + }, + "exportSettings": { + "message": "Exportar as configurações", + "description": "Utilizado na página de configurações" + }, + "resetSettings": { + "message": "Redefinir as configurações", + "description": "Utilizado na página de configurações" + }, + "enable": { + "message": "Ativar", + "description": "Utilizado na página de configurações" + }, + "showInPopup": { + "message": "Mostrar em pop-up", + "description": "used in the settings page" + }, + "frontend": { + "message": "Interface gráfica", + "description": "Utilizado na página de configurações" + }, + "redirectType": { + "message": "Tipo de redirecionamento", + "description": "Utilizado na página de configurações" + }, + "both": { + "message": "ambos", + "description": "Utilizado na página de configurações" + }, + "onlyEmbedded": { + "message": "apenas os incorporados", + "description": "Utilizado na página de configurações" + }, + "onlyNotEmbedded": { + "message": "apenas os não incorporados", + "description": "Utilizado na página de configurações" + }, + "addYourFavoriteInstances": { + "message": "Adicione sua instância favorita", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copiar Original" + }, + "copied": { + "message": "Copiado" + }, + "redirectToOriginal": { + "message": "Redirecionar para original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Tentar redirecionar", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Sobre" + }, + "unsupportedIframesHandling": { + "message": "Unsupported iframes handling" + }, + "fetchPublicInstances": { + "message": "Buscando instâncias públicas" + }, + "disable": { + "message": "Desativar" + }, + "pingInstances": { + "message": "Fazer Ping nas Instâncias" + }, + "exportSettingsToSync": { + "message": "Exportar Configurações para a Sincronização" + }, + "importSettingsFromSync": { + "message": "Importar Configurações da Sincronização" + }, + "services": { + "message": "Serviços" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Menu de favoritos" + }, + "redirectOnlyInIncognito": { + "message": "Redirecionar Somente em Anônimo" + }, + "bypass": { + "message": "Ultrapassar" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Configure LibRedirect como Motor de Pesquisa Padrão. Para como fazer em navegadores Chromium, clique <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>aqui</a>." + }, + "redirect": { + "message": "Redirecionar" + }, + "redirectGoogle": { + "message": "Redirecionar o Google" + }, + "search_frontend": { + "message": "Pesquise front -end" + }, + "searchService": { + "message": "Serviço de pesquisa" + }, + "embedFrontend": { + "message": "Incorporar front -end" + }, + "autoPickInstance": { + "message": "Instância automática" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ro/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ro/messages.json @@ -0,0 +1,157 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "O extensie web care redirecționează site-urile populare către frontend-uri și backend-uri alternative prietenoase cu confidențialitatea", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Comutare Instanță", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Setări", + "description": "used in the popup" + }, + "general": { + "message": "General", + "description": "used in the settings page" + }, + "theme": { + "message": "Temă", + "description": "used in the settings page" + }, + "light": { + "message": "Luminat", + "description": "used in the settings page" + }, + "dark": { + "message": "Întunecat", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Excluded from redirecting", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Import setări", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Exportul setărilor", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Resetează setarile", + "description": "used in the settings page" + }, + "enable": { + "message": "Activează", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Show in popup", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Tip redirecționare", + "description": "used in the settings page" + }, + "both": { + "message": "ambele", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "numai încorporat", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "numai încorporat", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Add your favorite instances", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copy Original" + }, + "copied": { + "message": "Copiat" + }, + "redirectToOriginal": { + "message": "Redirect to original", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Încercați să redirecționați", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "About" + }, + "unsupportedIframesHandling": { + "message": "Manipulare embeds neacceptată" + }, + "fetchPublicInstances": { + "message": "Obține instanțe publice" + }, + "disable": { + "message": "Dezactivează" + }, + "pingInstances": { + "message": "Ping Instances" + }, + "exportSettingsToSync": { + "message": "Export Settings to Sync" + }, + "importSettingsFromSync": { + "message": "Import Settings from Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Bookmarks menu" + }, + "redirectOnlyInIncognito": { + "message": "Redirect Only in Incognito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Redirect" + }, + "redirectGoogle": { + "message": "Redirectare Google" + }, + "search_frontend": { + "message": "Căutare Frontend" + }, + "searchService": { + "message": "Servicii Căutare" + }, + "embedFrontend": { + "message": "Embed Frontend" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ru/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ru/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Расширение для браузера, перенаправляющее популярные сайты на обеспечивающие конфиденциальность альтернативны", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Сменить сервер", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Настройки", + "description": "used in the popup" + }, + "general": { + "message": "Общее", + "description": "used in the settings page" + }, + "theme": { + "message": "Тема", + "description": "used in the settings page" + }, + "light": { + "message": "Светлая", + "description": "used in the settings page" + }, + "dark": { + "message": "Тёмная", + "description": "used in the settings page" + }, + "auto": { + "message": "Автоопределение", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Исключения", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Импортировать настройки", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Экспортировать настройки", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Сброс настроек", + "description": "used in the settings page" + }, + "enable": { + "message": "Включить", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Показывать во всплывающем окне", + "description": "used in the settings page" + }, + "frontend": { + "message": "Интерфейс", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Тип перенаправления", + "description": "used in the settings page" + }, + "both": { + "message": "оба", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "только встроенные", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "только не встроенные", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Добавить в избранное", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Копировать исходную" + }, + "copied": { + "message": "Скопировано" + }, + "redirectToOriginal": { + "message": "Обратно на исходный сайт", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Попытаться перенаправить", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "О расширении" + }, + "unsupportedIframesHandling": { + "message": "Обработка неподдерживаемых встроенных сайтов" + }, + "fetchPublicInstances": { + "message": "Получить общедоступные серверы" + }, + "disable": { + "message": "Выключить" + }, + "pingInstances": { + "message": "Опросить серверы" + }, + "exportSettingsToSync": { + "message": "Экспортировать настройки в службу синхронизации" + }, + "importSettingsFromSync": { + "message": "Импортировать настройки из службы синхронизации" + }, + "services": { + "message": "Службы" + }, + "service": { + "message": "Служба" + }, + "bookmarksMenu": { + "message": "Меню закладок" + }, + "redirectOnlyInIncognito": { + "message": "Перенаправлять только в приватных окнах" + }, + "bypass": { + "message": "Обход" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Установить LibRedirect в качестве поисковой системы по умолчанию. Подробности о том, как это сделать в браузерах на Chromium, доступны <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>здесь</a>." + }, + "redirect": { + "message": "Перенаправить" + }, + "redirectGoogle": { + "message": "Перенаправление Google" + }, + "autoPickInstance": { + "message": "Выбрать сервер автоматически" + }, + "searchService": { + "message": "Служба поиска" + }, + "search_frontend": { + "message": "Поисковый интерфейс" + }, + "embedFrontend": { + "message": "Встроить интерфейс" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/sr/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/sr/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Веб проширница која преусмерава познате сајтове на према алтернативним сучељима и позадинским страницама прилагођенима приватности", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Пребаци инстанцу", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Подешавања", + "description": "used in the popup" + }, + "general": { + "message": "Општенито", + "description": "used in the settings page" + }, + "theme": { + "message": "Тема", + "description": "used in the settings page" + }, + "light": { + "message": "Светла", + "description": "used in the settings page" + }, + "dark": { + "message": "Мрачна", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Искључено из преусмеравања", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Увозна Подешавања", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Извозна Подешавања", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Обновите Подешавања", + "description": "used in the settings page" + }, + "enable": { + "message": "Омогући", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Прикажи у искачућем прозору", + "description": "used in the settings page" + }, + "frontend": { + "message": "Сучеље", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Тип Преусмеравања", + "description": "used in the settings page" + }, + "both": { + "message": "оба", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "само уграђено", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "само неуграђено", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Додајте своје омиљене инстанце", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Копирајте оригинал" + }, + "copied": { + "message": "Копирано" + }, + "redirectToOriginal": { + "message": "Преусмерите према оригиналној", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Покушајте да преусмерите", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "О" + }, + "unsupportedIframesHandling": { + "message": "Неподржано руковање и-фрамеовима" + }, + "fetchPublicInstances": { + "message": "Дохватите јавне инстанце" + }, + "disable": { + "message": "Искључите" + }, + "pingInstances": { + "message": "Тестирајте инстанце" + }, + "exportSettingsToSync": { + "message": "Извезите подешавања за синкронизацију" + }, + "importSettingsFromSync": { + "message": "Увезите подешавања из синкронизације" + }, + "services": { + "message": "Услуге" + }, + "service": { + "message": "Услуга" + }, + "bookmarksMenu": { + "message": "Изборник обиљежака" + }, + "redirectOnlyInIncognito": { + "message": "Преусмерите само у инкогнитоа" + }, + "bypass": { + "message": "Заобиђите" + }, + "block": { + "message": "Блокирајте" + }, + "searchHint": { + "message": "Поставите ЛибРедирецт као стандардни тражионик. <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>Овде</a> погледајте како се то ради у Кромијум мрежном прегледнику." + }, + "redirect": { + "message": "Преусмерите" + }, + "autoPickInstance": { + "message": "Одаберите аутоматски инстанцу" + }, + "redirectGoogle": { + "message": "Преусмерите Google" + }, + "search_frontend": { + "message": "Тражите сучеље" + }, + "embedFrontend": { + "message": "Уградите сучеље" + }, + "searchService": { + "message": "Тражите услужник" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ta/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/ta/messages.json @@ -0,0 +1,137 @@ +{ + "extensionName": { + "message": "லிப்ரெடிரிடர்" + }, + "switchInstance": { + "message": "சான்று" + }, + "copyOriginal": { + "message": "அசல் நகலெடுக்கவும்" + }, + "autoPickInstance": { + "message": "ஆட்டோ-பிக் நிகழ்வு" + }, + "extensionDescription": { + "message": "பிரபலமான தளங்களை மாற்று தனியுரிமை நட்பு முன்பக்கங்கள் மற்றும் பின்தளத்தில் திருப்பி விடும் ஒரு வலை நீட்டிப்பு" + }, + "settings": { + "message": "அமைப்புகள்" + }, + "general": { + "message": "பொது" + }, + "theme": { + "message": "கருப்பொருள்" + }, + "light": { + "message": "ஒளி" + }, + "dark": { + "message": "இருண்ட" + }, + "auto": { + "message": "தானி" + }, + "excludeFromRedirecting": { + "message": "திருப்பிவிடுவதிலிருந்து விலக்கப்பட்டது" + }, + "importSettings": { + "message": "அமைப்புகளை இறக்குமதி செய்யுங்கள்" + }, + "exportSettings": { + "message": "ஏற்றுமதி அமைப்புகள்" + }, + "resetSettings": { + "message": "அமைப்புகளை மீட்டமைக்கவும்" + }, + "enable": { + "message": "இயக்கு" + }, + "showInPopup": { + "message": "பாப்அப்பில் காட்டு" + }, + "frontend": { + "message": "ஃபிரான்ட்" + }, + "redirectType": { + "message": "திருப்பி வகை" + }, + "both": { + "message": "இரண்டும்" + }, + "onlyEmbedded": { + "message": "உட்பொதிக்கப்பட்டது" + }, + "onlyNotEmbedded": { + "message": "உட்பொதிக்கப்படவில்லை" + }, + "addYourFavoriteInstances": { + "message": "உங்களுக்கு பிடித்த நிகழ்வுகளைச் சேர்க்கவும்" + }, + "copied": { + "message": "நகலெடுக்கப்பட்டது" + }, + "redirectToOriginal": { + "message": "அசலுக்கு திருப்பி விடுங்கள்" + }, + "redirectLink": { + "message": "திருப்பிவிட முயற்சி" + }, + "about": { + "message": "பற்றி" + }, + "unsupportedIframesHandling": { + "message": "ஆதரிக்கப்படாத உட்பொதிகள் கையாளுதல்" + }, + "fetchPublicInstances": { + "message": "பொது நிகழ்வுகளைப் பெறுங்கள்" + }, + "disable": { + "message": "முடக்கு" + }, + "pingInstances": { + "message": "பிங் நிகழ்வுகள்" + }, + "exportSettingsToSync": { + "message": "ஒத்திசைக்க அமைப்புகளை ஏற்றுமதி செய்யுங்கள்" + }, + "importSettingsFromSync": { + "message": "ஒத்திசைவிலிருந்து அமைப்புகளை இறக்குமதி செய்யுங்கள்" + }, + "services": { + "message": "சேவைகள்" + }, + "service": { + "message": "பணி" + }, + "bookmarksMenu": { + "message": "புக்மார்க்ச் பட்டியல்" + }, + "redirectOnlyInIncognito": { + "message": "மறைமுகத்தில் மட்டுமே திருப்பி விடுங்கள்" + }, + "bypass": { + "message": "பைபாச்" + }, + "block": { + "message": "தொகுதி" + }, + "searchHint": { + "message": "இயல்புநிலை தேடுபொறியாக Lirbredirect ஐ அமைக்கவும். குரோமியம் உலாவிகளில் எவ்வாறு செய்வது என்பதற்கு, <a href = 'https: //libredirect.github.io/docs.html#search_engine_chromium' target = '_ வெற்று' rel = 'noopener norferrer'> இங்கே </a>." + }, + "redirect": { + "message": "திருப்பி விடுங்கள்" + }, + "redirectGoogle": { + "message": "Google ஐ திருப்பி விடுங்கள்" + }, + "search_frontend": { + "message": "முன்பக்கத்தைத் தேடுங்கள்" + }, + "searchService": { + "message": "தேடல் பணி" + }, + "embedFrontend": { + "message": "ஃபிரான்டெண்ட் உட்பொதிக்கவும்" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/tr/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/tr/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Popüler siteleri alternatif gizlilik dostu ön uçlara ve arka uçlara yönlendiren bir web uzantısı", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Örneği Değiştir", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Ayarlar", + "description": "used in the popup" + }, + "general": { + "message": "Genel", + "description": "used in the settings page" + }, + "theme": { + "message": "Tema", + "description": "used in the settings page" + }, + "light": { + "message": "Açık", + "description": "used in the settings page" + }, + "dark": { + "message": "Koyu", + "description": "used in the settings page" + }, + "auto": { + "message": "Otomatik", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Yönlendirme dışında bırakılanlar", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Ayarları İçe Aktar", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Ayarları Dışa Aktar", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Ayarları Sıfırla", + "description": "used in the settings page" + }, + "enable": { + "message": "Etkinleştir", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Açılır pencerede göster", + "description": "used in the settings page" + }, + "frontend": { + "message": "Ön Uç", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Yönlendirme Türü", + "description": "used in the settings page" + }, + "both": { + "message": "her ikisi de", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "yalnızca gömülü", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "yalnızca gömülü olmayan", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Sevdiğiniz örnekleri ekleyin", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Aslını Kopyala" + }, + "copied": { + "message": "Kopyalandı" + }, + "redirectToOriginal": { + "message": "Aslına yönlendir", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Yeniden yönlendirmeyi dene", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Hakkında" + }, + "unsupportedIframesHandling": { + "message": "Desteklenmeyen gömülü kullanımı" + }, + "fetchPublicInstances": { + "message": "Herkese açık örnekleri getir" + }, + "disable": { + "message": "Devre dışı bırak" + }, + "pingInstances": { + "message": "Örneklere Ping At" + }, + "exportSettingsToSync": { + "message": "Ayarlayı Eşzamanlamaya Aktar" + }, + "importSettingsFromSync": { + "message": "Ayarları Eşzamanlamadan İçe Aktar" + }, + "services": { + "message": "Hizmetler" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Yer imleri menüsü" + }, + "redirectOnlyInIncognito": { + "message": "Yalnızca Gizli Modda Yönlendir" + }, + "bypass": { + "message": "Atla" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "LibRedirect'i öntanımlı arama moturu olarak ayarlayın. Chromium tabanlı tarayıcılarda nasıl yapılacağını öğrenmek için <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>buraya</a> tıklayın." + }, + "redirect": { + "message": "Yönlendir" + }, + "redirectGoogle": { + "message": "Yönlendir (Google)" + }, + "search_frontend": { + "message": "Arama Ön Ucu" + }, + "embedFrontend": { + "message": "Ön Ucu Göm" + }, + "autoPickInstance": { + "message": "Örneği Otomatik Seç" + }, + "searchService": { + "message": "Arama Hizmeti" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/uk/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/uk/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Веброзширення, що переспрямовує популярні сайти на альтернативні дружні до приватності фронтенди та бекенди", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Інший сервер", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Налаштування", + "description": "used in the popup" + }, + "general": { + "message": "Загальні", + "description": "used in the settings page" + }, + "theme": { + "message": "Тема", + "description": "used in the settings page" + }, + "light": { + "message": "Світла", + "description": "used in the settings page" + }, + "dark": { + "message": "Темна", + "description": "used in the settings page" + }, + "auto": { + "message": "Auto", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Виключено з перенаправлення", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Імпортувати налаштування", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Експортувати налаштування", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Скинути налаштування", + "description": "used in the settings page" + }, + "enable": { + "message": "Увімкнути", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Показувати у спливному вікні", + "description": "used in the settings page" + }, + "frontend": { + "message": "Фронтенд", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Що переспрямовувати", + "description": "used in the settings page" + }, + "both": { + "message": "обоє", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "лише вбудовані", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "лише не вбудований", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Додати свої улюблені сервери", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Скопіювати оригінал" + }, + "copied": { + "message": "Скопійовано" + }, + "redirectToOriginal": { + "message": "Перенаправити на оригінал", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Спроба перенаправлення", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Про застосунок" + }, + "unsupportedIframesHandling": { + "message": "Обробка непідтримуваних вбудовувань" + }, + "fetchPublicInstances": { + "message": "Отримати загальнодоступні сервери" + }, + "disable": { + "message": "Вимкнути" + }, + "pingInstances": { + "message": "Опитати сервери" + }, + "exportSettingsToSync": { + "message": "Експорт налаштувань до служби синхронізації" + }, + "importSettingsFromSync": { + "message": "Імпорт налаштувань зі служби синхронізації" + }, + "services": { + "message": "Служби" + }, + "service": { + "message": "Служба" + }, + "bookmarksMenu": { + "message": "Меню закладок" + }, + "redirectOnlyInIncognito": { + "message": "Переспрямовувати лише в режимі інкогніто" + }, + "bypass": { + "message": "Обхід" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Установити LibRedirect усталеним засобом пошуку. Як це зробити у браузерах на основі chromium, читайте <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>тут</a>." + }, + "redirect": { + "message": "Переспрямувати" + }, + "autoPickInstance": { + "message": "Автопідбір сервера" + }, + "redirectGoogle": { + "message": "Переспрямування Google" + }, + "searchService": { + "message": "Служба пошуку" + }, + "search_frontend": { + "message": "Пошуковий інтерфейс" + }, + "embedFrontend": { + "message": "Вбудований інтерфейс" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/vi/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/vi/messages.json @@ -0,0 +1,145 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "Một tiện ích mở rộng chuyển hướng một số trang web phổ biến đến các frontend và backend khác thân thiện với quyền riêng tư", + "description": "description of the extension" + }, + "switchInstance": { + "message": "Đổi Instance", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "Cài Đặt", + "description": "used in the popup" + }, + "general": { + "message": "Cài đặt chung", + "description": "used in the settings page" + }, + "theme": { + "message": "Giao diện", + "description": "used in the settings page" + }, + "light": { + "message": "Sáng", + "description": "used in the settings page" + }, + "dark": { + "message": "Tối", + "description": "used in the settings page" + }, + "auto": { + "message": "Tự động", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "Không được chuyển hướng", + "description": "used in the settings page" + }, + "importSettings": { + "message": "Nhập vào cài đặt", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "Xuất ra cài đặt", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "Đặt lại cài đặt", + "description": "used in the settings page" + }, + "enable": { + "message": "Bật", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "Hiển thị trong cửa sổ bật lên", + "description": "used in the settings page" + }, + "frontend": { + "message": "Frontend", + "description": "used in the settings page" + }, + "redirectType": { + "message": "Loại chuyển hướng", + "description": "used in the settings page" + }, + "both": { + "message": "cả hai", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "chỉ các mã nhúng", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "chỉ những cái không phải là mã nhúng", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "Thêm những instance bạn yêu thích", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "Copy Original" + }, + "copied": { + "message": "Đã Sao Chép" + }, + "redirectToOriginal": { + "message": "Chuyển hướng tới trang web gốc", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "Chuyển hướng liên kết này", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "Về tiện ích" + }, + "unsupportedIframesHandling": { + "message": "Cách xử lý các iframe không được hỗ trợ" + }, + "fetchPublicInstances": { + "message": "Tìm các instance công cộng" + }, + "disable": { + "message": "Tắt" + }, + "pingInstances": { + "message": "Ping Instances" + }, + "exportSettingsToSync": { + "message": "Export Settings to Sync" + }, + "importSettingsFromSync": { + "message": "Import Settings from Sync" + }, + "services": { + "message": "Services" + }, + "service": { + "message": "Service" + }, + "bookmarksMenu": { + "message": "Bookmarks menu" + }, + "redirectOnlyInIncognito": { + "message": "Redirect Only in Incognito" + }, + "bypass": { + "message": "Bypass" + }, + "block": { + "message": "Block" + }, + "searchHint": { + "message": "Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click <a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>here</a>." + }, + "redirect": { + "message": "Redirect" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/zh_Hans/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/zh_Hans/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "将常用网站按需重定向到隐私友好的替代前端/后端的 Web 扩展程序", + "description": "description of the extension" + }, + "switchInstance": { + "message": "切换实例", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "设置", + "description": "used in the popup" + }, + "general": { + "message": "通用", + "description": "used in the settings page" + }, + "theme": { + "message": "主题", + "description": "used in the settings page" + }, + "light": { + "message": "浅色", + "description": "used in the settings page" + }, + "dark": { + "message": "深色", + "description": "used in the settings page" + }, + "auto": { + "message": "自动", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "排除于重定向", + "description": "used in the settings page" + }, + "importSettings": { + "message": "导入设置", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "导出设置", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "重置设置", + "description": "used in the settings page" + }, + "enable": { + "message": "启用", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "显示在弹窗中", + "description": "used in the settings page" + }, + "frontend": { + "message": "前端", + "description": "used in the settings page" + }, + "redirectType": { + "message": "重定向类型", + "description": "used in the settings page" + }, + "both": { + "message": "所有页面", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "仅嵌入页面", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "仅常规页面", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "添加您喜欢的实例", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "复制原始链接" + }, + "copied": { + "message": "已复制" + }, + "redirectToOriginal": { + "message": "重定向至原网址", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "尝试进行重定向", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "关于" + }, + "unsupportedIframesHandling": { + "message": "处理未支持的嵌入页面的方式" + }, + "fetchPublicInstances": { + "message": "获取公共实例" + }, + "disable": { + "message": "禁用" + }, + "pingInstances": { + "message": "对实例进行测速" + }, + "exportSettingsToSync": { + "message": "导出设置到同步服务" + }, + "importSettingsFromSync": { + "message": "从同步服务导入设置" + }, + "services": { + "message": "服务" + }, + "service": { + "message": "服务" + }, + "bookmarksMenu": { + "message": "书签菜单" + }, + "redirectOnlyInIncognito": { + "message": "仅在隐私模式下重定向" + }, + "bypass": { + "message": "绕过" + }, + "block": { + "message": "屏蔽" + }, + "searchHint": { + "message": "请将 LibRedirect 设为默认搜索引擎。对于 Chromium 的操作方法,点击<a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>此处</a>了解。" + }, + "redirect": { + "message": "重定向" + }, + "embedFrontend": { + "message": "嵌入页面前端" + }, + "autoPickInstance": { + "message": "自动挑选实例" + }, + "redirectGoogle": { + "message": "重定向 Google" + }, + "search_frontend": { + "message": "搜索前端" + }, + "searchService": { + "message": "搜索服务" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/zh_Hant/messages.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/_locales/zh_Hant/messages.json @@ -0,0 +1,160 @@ +{ + "extensionName": { + "message": "LibRedirect", + "description": "name of the extension" + }, + "extensionDescription": { + "message": "一個網路擴充功能可以將熱門網站重新導向至隱私友好的替代服務", + "description": "description of the extension" + }, + "switchInstance": { + "message": "切換實例", + "description": "used in manifest.json as shortcut description" + }, + "settings": { + "message": "設定", + "description": "used in the popup" + }, + "general": { + "message": "一般", + "description": "used in the settings page" + }, + "theme": { + "message": "主題", + "description": "used in the settings page" + }, + "light": { + "message": "淺色", + "description": "used in the settings page" + }, + "dark": { + "message": "深色", + "description": "used in the settings page" + }, + "auto": { + "message": "自動", + "description": "used in the settings page" + }, + "excludeFromRedirecting": { + "message": "排除重新導向", + "description": "used in the settings page" + }, + "importSettings": { + "message": "匯入設定", + "description": "used in the settings page" + }, + "exportSettings": { + "message": "匯出設定", + "description": "used in the settings page" + }, + "resetSettings": { + "message": "重設設定", + "description": "used in the settings page" + }, + "enable": { + "message": "啟用", + "description": "used in the settings page" + }, + "showInPopup": { + "message": "在快顯視窗顯示", + "description": "used in the settings page" + }, + "frontend": { + "message": "前端", + "description": "used in the settings page" + }, + "redirectType": { + "message": "重新導向類型", + "description": "used in the settings page" + }, + "both": { + "message": "兩者", + "description": "used in the settings page" + }, + "onlyEmbedded": { + "message": "僅已內嵌", + "description": "used in the settings page" + }, + "onlyNotEmbedded": { + "message": "僅非已內嵌", + "description": "used in the settings page" + }, + "addYourFavoriteInstances": { + "message": "新增你喜歡的實例", + "description": "used in the settings page" + }, + "copyOriginal": { + "message": "複製原始的" + }, + "copied": { + "message": "已複製" + }, + "redirectToOriginal": { + "message": "重新導向至原始網址", + "description": "Used in context menus when right clicking on a page/tab" + }, + "redirectLink": { + "message": "嘗試重新導向", + "description": "Used in context menus when right clicking on a hyperlink" + }, + "about": { + "message": "關於" + }, + "unsupportedIframesHandling": { + "message": "不支援的嵌入處理" + }, + "fetchPublicInstances": { + "message": "取得公共實例" + }, + "disable": { + "message": "停用" + }, + "pingInstances": { + "message": "Ping 實例" + }, + "exportSettingsToSync": { + "message": "匯出設定以同步" + }, + "importSettingsFromSync": { + "message": "從同步匯入設定" + }, + "services": { + "message": "服務" + }, + "service": { + "message": "服務" + }, + "bookmarksMenu": { + "message": "書籤選單" + }, + "redirectOnlyInIncognito": { + "message": "僅在隱身模式下重新導向" + }, + "bypass": { + "message": "繞行" + }, + "block": { + "message": "封鎖" + }, + "searchHint": { + "message": "設定 LibRedirect 為預設搜尋引擎。如要了解如何在 Chromium 瀏覽器中執行操作,請點擊<a href='https://libredirect.github.io/docs.html#search_engine_chromium' target='_blank' rel='noopener noreferrer'>此處</a>。" + }, + "redirect": { + "message": "重新導向" + }, + "autoPickInstance": { + "message": "自動選擇實例" + }, + "embedFrontend": { + "message": "嵌入前端" + }, + "redirectGoogle": { + "message": "重新導向 Google" + }, + "search_frontend": { + "message": "搜尋前端" + }, + "searchService": { + "message": "搜尋服務" + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/about-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/about-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#fff" d="M11 17h2v-6h-2Zm1-8a.97.97 0 0 0 .713-.288A.97.97 0 0 0 13 8a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 7a.97.97 0 0 0-.712.287A.97.97 0 0 0 11 8q0 .424.288.712A.97.97 0 0 0 12 9"/><path fill="#fff" d="M12 2a9.7 9.7 0 0 0-3.9.787 10.1 10.1 0 0 0-3.174 2.139Q3.576 6.276 2.787 8.1A9.7 9.7 0 0 0 2 12q0 2.075.787 3.9a10.1 10.1 0 0 0 2.139 3.174q1.35 1.35 3.174 2.139A9.7 9.7 0 0 0 12 22a9.7 9.7 0 0 0 3.9-.787 10.1 10.1 0 0 0 3.174-2.139q1.35-1.35 2.139-3.174A9.7 9.7 0 0 0 22 12a9.7 9.7 0 0 0-.787-3.9 10.1 10.1 0 0 0-2.139-3.174q-1.35-1.35-3.174-2.139A9.7 9.7 0 0 0 12 2m0 2q3.35 0 5.676 2.324Q20 8.65 20 12t-2.324 5.676Q15.35 20 12 20t-5.676-2.324Q4 15.35 4 12t2.324-5.676Q8.65 4 12 4"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/about-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/about-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11 17h2v-6h-2Zm1-8a.97.97 0 0 0 .713-.288A.97.97 0 0 0 13 8a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 7a.97.97 0 0 0-.712.287A.97.97 0 0 0 11 8q0 .424.288.712A.97.97 0 0 0 12 9"/><path d="M12 2a9.7 9.7 0 0 0-3.9.787 10.1 10.1 0 0 0-3.174 2.139Q3.576 6.276 2.787 8.1A9.7 9.7 0 0 0 2 12q0 2.075.787 3.9a10.1 10.1 0 0 0 2.139 3.174q1.35 1.35 3.174 2.139A9.7 9.7 0 0 0 12 22a9.7 9.7 0 0 0 3.9-.787 10.1 10.1 0 0 0 3.174-2.139q1.35-1.35 2.139-3.174A9.7 9.7 0 0 0 22 12a9.7 9.7 0 0 0-.787-3.9 10.1 10.1 0 0 0-2.139-3.174q-1.35-1.35-3.174-2.139A9.7 9.7 0 0 0 12 2m0 2q3.35 0 5.676 2.324Q20 8.65 20 12t-2.324 5.676Q15.35 20 12 20t-5.676-2.324Q4 15.35 4 12t2.324-5.676Q8.65 4 12 4"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/baiduTieba-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/baiduTieba-icon.svg @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Layer_1" + sodipodi:docname="Baidu.svg" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)" + sodipodi:version="0.32" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + x="0px" + y="0px" + width="65.453781" + height="71.304939" + viewBox="0 0 65.45378 71.304939" + enable-background="new 0 0 231 79" + xml:space="preserve" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs1" /> +<sodipodi:namedview + id="base" + inkscape:current-layer="Layer_1" + inkscape:window-y="138" + inkscape:window-x="138" + inkscape:window-width="1323" + inkscape:window-height="708" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:cy="46.733757" + inkscape:cx="56.521653" + inkscape:zoom="3.6269286" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + objecttolerance="10.0" + gridtolerance="10.0" + guidetolerance="10.0" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:window-maximized="0"> + </sodipodi:namedview> + +<g + id="g2225" + transform="matrix(0.91912224,0,0,0.91912224,-70.269186,-6.5035036)" + style="stroke-width:1.08799"> + <path + id="path2227" + fill="#2319dc" + d="m 89.241,47.789 c 7.75,-1.665 6.692,-10.937 6.465,-12.963 -0.382,-3.125 -4.055,-8.582 -9.039,-8.146 -6.275,0.559 -7.191,9.623 -7.191,9.623 -0.85,4.197 2.028,13.155 9.765,11.486 m 14.392,-15.543 c 4.278,0 7.736,-4.93 7.736,-11.02 0,-6.091 -3.458,-11.013 -7.736,-11.013 -4.28,0 -7.747,4.922 -7.747,11.013 0,6.09 3.466,11.02 7.747,11.02 m 18.444,0.725 c 5.727,0.75 9.396,-5.359 10.13,-9.988 0.75,-4.623 -2.95,-10 -6.995,-10.923 -4.063,-0.934 -9.135,5.57 -9.592,9.813 -0.557,5.19 0.736,10.365 6.457,11.098 m 22.679,7.777 c 0,-2.214 -1.833,-8.888 -8.659,-8.888 -6.84,0 -7.744,6.298 -7.744,10.748 0,4.247 0.354,10.171 8.848,9.987 8.485,-0.188 7.555,-9.618 7.555,-11.847 m -8.659,19.436 c 0,0 -8.853,-6.848 -14.02,-14.252 -7.016,-10.917 -16.97,-6.471 -20.298,-0.927 -3.318,5.558 -8.476,9.068 -9.214,10 -0.745,0.913 -10.692,6.288 -8.485,16.103 2.212,9.807 9.969,9.621 9.969,9.621 0,0 5.717,0.559 12.347,-0.924 6.644,-1.479 12.36,0.363 12.36,0.363 0,0 15.498,5.197 19.733,-4.803 4.24,-9.992 -2.392,-15.181 -2.392,-15.181" + style="stroke-width:1.08799" /> + <path + id="path2229" + fill="#ffffff" + d="m 105.008,50.637 v 6.588 H 99.64 c 0,0 -5.365,0.445 -7.243,6.526 -0.655,4.06 0.578,6.451 0.793,6.962 0.217,0.51 1.951,3.48 6.305,4.352 h 10.073 V 50.709 Z m -0.081,20.43 h -4.058 c 0,0 -2.827,-0.147 -3.688,-3.402 -0.444,-1.442 0.066,-3.108 0.29,-3.763 0.205,-0.656 1.154,-2.172 3.111,-2.756 h 4.344 z" + style="stroke-width:1.08799" /> + <path + id="path2231" + fill="#ffffff" + d="M 112.037,57.816 V 70.64 c 0,0 0.21,3.191 4.71,4.354 h 11.592 v -17.18 h -5.003 v 12.897 h -4.774 c 0,0 -1.526,-0.222 -1.813,-1.448 V 57.74 Z" + style="stroke-width:1.08799" /> + + + + + +</g> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bandcamp-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bandcamp-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 682.667 682.667"><defs><clipPath id="a" clipPathUnits="userSpaceOnUse"><path d="M2560 0c1413.85 0 2560 1146.15 2560 2560S3973.85 5120 2560 5120 0 3973.85 0 2560 1146.15 0 2560 0" clip-rule="evenodd"/></clipPath><clipPath id="b" clipPathUnits="userSpaceOnUse"><path d="M0 0h5120v5120H0Z"/></clipPath><clipPath id="c" clipPathUnits="userSpaceOnUse"><path d="M3248.57 2735.96c-183.49 0-277.25-144.42-277.25-362 0-205.66 101.38-360.04 277.25-360.04 198.89 0 273.45 182.02 273.45 360.04-.14 185.9-93.84 362-273.51 362M2761 3275.92h217.97v-522.15h3.85c59.28 98.87 183.55 160.21 294.46 160.21 311.63 0 462.74-245.35 462.74-544.05 0-274.84-133.84-533.97-426.43-533.97-133.85 0-277.25 33.54-342.29 168.09h-3.78v-140.51h-206.53v1412.35z" clip-rule="evenodd"/></clipPath><clipPath id="d" clipPathUnits="userSpaceOnUse"><path d="M0 0h5120v5120H0Z"/></clipPath><clipPath id="e" clipPathUnits="userSpaceOnUse"><path d="M4543.89 2544.02c-17.22 124.62-105.15 191.92-225.61 191.92-112.87 0-271.54-61.35-271.54-371.91 0-170.13 72.64-350.15 261.97-350.15 126.18 0 214.11 87.14 235.18 233.51h217.97c-40.16-265.06-198.84-411.43-453.15-411.43-309.78 0-479.95 227.42-479.95 528.07 0 308.56 162.53 549.89 487.6 549.89 229.44 0 424.54-118.68 445.5-369.91h-217.61z" clip-rule="evenodd"/></clipPath><clipPath id="f" clipPathUnits="userSpaceOnUse"><path d="M0 0h5120v5120H0Z"/></clipPath><clipPath id="g" clipPathUnits="userSpaceOnUse"><path d="M1998.95 1866.62H364.078l763.462 1409.3h1634.88z" clip-rule="evenodd"/></clipPath><clipPath id="h" clipPathUnits="userSpaceOnUse"><path d="M0 0h5120v5120H0Z"/></clipPath></defs><g clip-path="url(#a)" transform="matrix(.13333 0 0 -.13333 0 682.667)"><g clip-path="url(#b)"><path d="M-50-50h5220v5220H-50Z" style="fill:#17a0c4;fill-opacity:1;fill-rule:nonzero;stroke:none"/></g></g><g clip-path="url(#c)" transform="matrix(.13333 0 0 -.13333 0 682.667)"><g clip-path="url(#d)"><path d="M2710.99 1785.96h1079.03v1539.96H2710.99Z" style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none"/></g></g><g clip-path="url(#e)" transform="matrix(.13333 0 0 -.13333 0 682.667)"><g clip-path="url(#f)"><path d="M3778.76 1785.96h1033.1v1177.96h-1033.1z" style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none"/></g></g><g clip-path="url(#g)" transform="matrix(.13333 0 0 -.13333 0 682.667)"><g clip-path="url(#h)"><path d="M314.078 1816.62h2498.34v1509.3H314.078Z" style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none"/></g></g></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bilibili-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bilibili-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18"><path d="M4.3 3.353a.876.876 0 1 1 1.217-1.261L7.41 3.917q.08.079.137.17h2.862a1 1 0 0 1 .137-.17l1.892-1.825a.876.876 0 0 1 1.216 1.26l-.76.735h.567a3.57 3.57 0 0 1 3.568 3.569v4.911a3.57 3.57 0 0 1-3.568 3.569H4.539a3.57 3.57 0 0 1-3.568-3.569V7.656a3.57 3.57 0 0 1 3.568-3.569h.523zm.24 2.455c-.986 0-1.785.8-1.785 1.785v5.037c0 .986.799 1.785 1.784 1.785h8.922c.985 0 1.784-.8 1.784-1.785V7.593c0-.986-.799-1.785-1.784-1.785zm.891 3.474a.892.892 0 0 1 1.785 0v.798a.892.892 0 1 1-1.785 0zm6.245-.892c-.492 0-.892.4-.892.892v.798a.892.892 0 1 0 1.785 0v-.798c0-.492-.4-.892-.893-.892" style="stroke-width:.892141;fill:#fff"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bilibili-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bilibili-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18"><path d="M4.3 3.353a.876.876 0 1 1 1.217-1.261L7.41 3.917q.08.079.137.17h2.862a1 1 0 0 1 .137-.17l1.892-1.825a.876.876 0 0 1 1.216 1.26l-.76.735h.567a3.57 3.57 0 0 1 3.568 3.569v4.911a3.57 3.57 0 0 1-3.568 3.569H4.539a3.57 3.57 0 0 1-3.568-3.569V7.656a3.57 3.57 0 0 1 3.568-3.569h.523zm.24 2.455c-.986 0-1.785.8-1.785 1.785v5.037c0 .986.799 1.785 1.784 1.785h8.922c.985 0 1.784-.8 1.784-1.785V7.593c0-.986-.799-1.785-1.784-1.785zm.891 3.474a.892.892 0 0 1 1.785 0v.798a.892.892 0 1 1-1.785 0zm6.245-.892c-.492 0-.892.4-.892.892v.798a.892.892 0 1 0 1.785 0v-.798c0-.492-.4-.892-.893-.892" style="stroke-width:.892141"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bluesky-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/bluesky-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 320"><path fill="#fff" d="M254.896 184.158a131 131 0 0 1-6.225-.843q3.154.388 6.225.843"/><path fill="#295ef6" d="M180 141.964c-16.301-31.702-60.692-90.782-101.965-119.92C38.497-5.868 23.414-1.032 13.526 3.436 2.081 8.608 0 26.179 0 36.516s5.667 84.756 9.364 97.178c12.215 41.044 55.696 54.913 95.74 50.462q3.071-.455 6.225-.844-3.094.495-6.225.844c-58.684 8.691-110.8 30.077-42.446 106.174 75.19 77.85 103.047-16.693 117.342-64.628 14.295 47.935 30.76 139.069 115.995 64.628 64.005-64.628 17.585-97.48-41.099-106.172a131 131 0 0 1-6.225-.843q3.154.388 6.225.843c40.044 4.452 83.525-9.418 95.74-50.461 3.697-12.422 9.364-86.84 9.364-97.178s-2.081-27.909-13.526-33.08c-9.888-4.468-24.971-9.305-64.509 18.608C240.692 51.184 196.301 110.262 180 141.964"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chatGpt-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chatGpt-icon-light.svg @@ -0,0 +1,10 @@ +<svg width="320" height="320" viewBox="0 0 320 320" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_10145_290560)"> +<path d="M297.06 130.97C304.32 109.18 301.82 85.31 290.21 65.49C272.75 35.09 237.65 19.45 203.37 26.81C188.12 9.63002 166.21 -0.139981 143.24 1.93887e-05C108.2 -0.0799806 77.11 22.48 66.33 55.82C43.82 60.43 24.39 74.52 13.02 94.49C-4.57001 124.81 -0.560007 163.03 22.94 189.03C15.68 210.82 18.18 234.69 29.79 254.51C47.25 284.91 82.35 300.55 116.63 293.19C131.87 310.37 153.79 320.14 176.76 319.99C211.82 320.08 242.92 297.5 253.7 264.13C276.21 259.52 295.64 245.43 307.01 225.46C324.58 195.14 320.56 156.95 297.07 130.95L297.06 130.97ZM176.78 299.08C162.75 299.1 149.16 294.19 138.39 285.2C138.88 284.94 139.73 284.47 140.28 284.13L204 247.33C207.26 245.48 209.26 242.01 209.24 238.26V148.43L236.17 163.98C236.46 164.12 236.65 164.4 236.69 164.72V239.11C236.65 272.19 209.86 299.01 176.78 299.08ZM47.94 244.05C40.91 231.91 38.38 217.68 40.79 203.87C41.26 204.15 42.09 204.66 42.68 205L106.4 241.8C109.63 243.69 113.63 243.69 116.87 241.8L194.66 196.88V227.98C194.68 228.3 194.53 228.61 194.28 228.81L129.87 266C101.18 282.52 64.54 272.7 47.95 244.05H47.94ZM31.17 104.96C38.17 92.8 49.22 83.5 62.38 78.67C62.38 79.22 62.35 80.19 62.35 80.87V154.48C62.33 158.22 64.33 161.69 67.58 163.54L145.37 208.45L118.44 224C118.17 224.18 117.83 224.21 117.53 224.08L53.11 186.86C24.48 170.28 14.66 133.65 31.16 104.97L31.17 104.96ZM252.43 156.45L174.64 111.53L201.57 95.99C201.84 95.81 202.18 95.78 202.48 95.91L266.9 133.1C295.58 149.67 305.41 186.36 288.84 215.04C281.83 227.18 270.79 236.48 257.64 241.32V165.51C257.67 161.77 255.68 158.31 252.44 156.45H252.43ZM279.23 116.11C278.76 115.82 277.93 115.32 277.34 114.98L213.62 78.18C210.39 76.29 206.39 76.29 203.15 78.18L125.36 123.1V92C125.34 91.68 125.49 91.37 125.74 91.17L190.15 54.01C218.84 37.46 255.52 47.31 272.06 76.01C279.05 88.13 281.58 102.32 279.21 116.11H279.23ZM110.72 171.54L83.78 155.99C83.49 155.85 83.3 155.57 83.26 155.25V80.86C83.28 47.74 110.15 20.9 143.27 20.92C157.28 20.92 170.84 25.84 181.61 34.8C181.12 35.06 180.28 35.53 179.72 35.87L116 72.67C112.74 74.52 110.74 77.98 110.76 81.73L110.72 171.52V171.54ZM125.35 140L160 119.99L194.65 139.99V180L160 200L125.35 180V140Z" fill="white"/> +</g> +<defs> +<clipPath id="clip0_10145_290560"> +<rect width="320" height="320" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chatGpt-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chatGpt-icon.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 320 320" xmlns="http://www.w3.org/2000/svg"><path d="m297.06 130.97c7.26-21.79 4.76-45.66-6.85-65.48-17.46-30.4-52.56-46.04-86.84-38.68-15.25-17.18-37.16-26.95-60.13-26.81-35.04-.08-66.13 22.48-76.91 55.82-22.51 4.61-41.94 18.7-53.31 38.67-17.59 30.32-13.58 68.54 9.92 94.54-7.26 21.79-4.76 45.66 6.85 65.48 17.46 30.4 52.56 46.04 86.84 38.68 15.24 17.18 37.16 26.95 60.13 26.8 35.06.09 66.16-22.49 76.94-55.86 22.51-4.61 41.94-18.7 53.31-38.67 17.57-30.32 13.55-68.51-9.94-94.51zm-120.28 168.11c-14.03.02-27.62-4.89-38.39-13.88.49-.26 1.34-.73 1.89-1.07l63.72-36.8c3.26-1.85 5.26-5.32 5.24-9.07v-89.83l26.93 15.55c.29.14.48.42.52.74v74.39c-.04 33.08-26.83 59.9-59.91 59.97zm-128.84-55.03c-7.03-12.14-9.56-26.37-7.15-40.18.47.28 1.3.79 1.89 1.13l63.72 36.8c3.23 1.89 7.23 1.89 10.47 0l77.79-44.92v31.1c.02.32-.13.63-.38.83l-64.41 37.19c-28.69 16.52-65.33 6.7-81.92-21.95zm-16.77-139.09c7-12.16 18.05-21.46 31.21-26.29 0 .55-.03 1.52-.03 2.2v73.61c-.02 3.74 1.98 7.21 5.23 9.06l77.79 44.91-26.93 15.55c-.27.18-.61.21-.91.08l-64.42-37.22c-28.63-16.58-38.45-53.21-21.95-81.89zm221.26 51.49-77.79-44.92 26.93-15.54c.27-.18.61-.21.91-.08l64.42 37.19c28.68 16.57 38.51 53.26 21.94 81.94-7.01 12.14-18.05 21.44-31.2 26.28v-75.81c.03-3.74-1.96-7.2-5.2-9.06zm26.8-40.34c-.47-.29-1.3-.79-1.89-1.13l-63.72-36.8c-3.23-1.89-7.23-1.89-10.47 0l-77.79 44.92v-31.1c-.02-.32.13-.63.38-.83l64.41-37.16c28.69-16.55 65.37-6.7 81.91 22 6.99 12.12 9.52 26.31 7.15 40.1zm-168.51 55.43-26.94-15.55c-.29-.14-.48-.42-.52-.74v-74.39c.02-33.12 26.89-59.96 60.01-59.94 14.01 0 27.57 4.92 38.34 13.88-.49.26-1.33.73-1.89 1.07l-63.72 36.8c-3.26 1.85-5.26 5.31-5.24 9.06l-.04 89.79zm14.63-31.54 34.65-20.01 34.65 20v40.01l-34.65 20-34.65-20z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chefkoch-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/chefkoch-icon.svg @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + class="w-logo" + width="35.532116" + height="35.532116" + viewBox="0 0 35.532115 35.532115" + fill="none" + data-v-73c3726b="" + version="1.1" + id="svg9" + sodipodi:docname="logo.svg" + inkscape:version="1.4 (e7c3feb100, 2024-10-09)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs9" /> + <sodipodi:namedview + id="namedview9" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="5.6568542" + inkscape:cx="10.69499" + inkscape:cy="32.880465" + inkscape:window-width="1888" + inkscape:window-height="1052" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg9" /> + <path + class="w-logo__hat" + data-testid="logo-hat" + d="m 28.25197,6.8567782 -1.5339,15.1350798 -0.3608,3.3157 c -0.0677,0.3158 -0.2707,0.609 -0.8572,0.7669 -0.1579,0.0451 -0.3158,0.0902 -0.4962,0.1128 -0.3158,0.0677 -0.6316,-0.1805 -0.5865,-0.5188 l 1.3308,-17.3680898 c 0.0452,-0.47368 -0.3157,-0.87969 -0.7894,-0.90224 h -0.0902 c -0.4737,-0.04511 -0.8797,0.31578 -0.9023,0.78946 l -1.3533,17.7740698 c -0.0226,0.3835 -0.3158,0.6767 -0.6993,0.7218 -0.2255,0.0226 -0.4737,0.0451 -0.6992,0.0677 -0.3383,0.0225 -0.6316,-0.2481 -0.6316,-0.5865 l 0.3609,-18.4958598 c 0.0226,-0.47368 -0.3609,-0.85713 -0.812,-0.87968 h -0.0902 c -0.4737,-0.02256 -0.8571,0.36089 -0.8797,0.81201 l -0.3609,18.6312298 c -0.0226,0.3609 -0.3158,0.6541 -0.6541,0.6541 -0.2481,0 -0.4963,0 -0.7444,0 -0.3609,0 -0.6541,-0.2932 -0.6766,-0.6541 L 16.29727,8.9093782 c -0.0226,-0.47368 -0.406,-0.83457 -0.8797,-0.81202 h -0.09022 c -0.47368,0.02256 -0.834569,0.40601 -0.812009,0.87969 L 14.9439,26.164658 c 0,0.3384 -0.270669,0.609 -0.631569,0.5865 -0.22556,-0.0226 -0.45112,-0.0451 -0.67668,-0.0677 -0.38345,-0.0451 -0.67668,-0.3383 -0.69923,-0.7218 L 11.628171,8.3905882 c -0.04511,-0.47367 -0.45112,-0.81201 -0.90224,-0.78946 h -0.09022 c -0.47368,0.04511 -0.8120199,0.45112 -0.7894599,0.90224 L 11.131941,25.668458 c 0.02256,0.3383 -0.27067,0.5865 -0.58646,0.5188 -0.18044,-0.0451 -0.36089,-0.0902 -0.54134,-0.1353 -0.6090098,-0.1805 -0.7894598,-0.4737 -0.8571298,-0.8121 -0.04511,-0.4736 -0.31578,-3.1578 -0.33833,-3.248 -0.33834,-3.2932 -1.51125,-14.8418498 -1.51125,-14.8418498 -0.02256,-1.10524 -0.04512,-1.57892 1.08268,-2.14282 3.0450598,-1.51125 6.9246888,-0.06766 6.9246888,-0.06766 l 2.00747,-0.76691 c 2.6842,-0.9699 6.5638,-0.87968 9.4058,0.76691 0.5414,0.31578 1.6241,0.83457 1.5339,1.91725 z m -2.0752,21.7439798 c 0,0 0,0.7669 -0.0226,1.1503 -0.0225,0.4737 -0.0225,1.0376 -0.9473,1.2632 -4.8721,1.2857 -9.9923,1.2405 -14.886949,0 -0.9473498,-0.2481 -0.9247898,-0.7444 -0.9473498,-1.1955 -0.02255,-0.3834 -0.02255,-1.218 -0.02255,-1.2406 -0.02256,-0.4737 0.3383399,-0.7443 0.8120098,-0.6541 5.007429,0.9925 10.172739,0.9925 15.180139,0 0.4737,-0.0902 0.8572,0.203 0.8346,0.6767 z m 3.5864,-23.7063398 c -0.5865,-0.81202 -2.5037,-1.80448 -3.8571,-2.345826 -3.4961,-1.263135 -7.466,-0.924796 -10.57872,0.496226 l -0.40601,-0.11278 c -2.639039,-0.857123 -5.7743288,-0.406003 -7.5787988,0.5639 -1.127802,0.60901 -1.6465891,1.10525 -1.8270361,1.89471 -0.1127804,0.31578 -0.1804486,0.87968 -0.090225,1.8947 0,0.04511 -4e-7,0.06767 0.022556,0.11278 0.2706721,3.2029498 2.0300352,18.9921298 2.0525952,19.0147298 0.29323,3.1352 -0.15789,4.3984 0.47367,5.2329 0.04512,0.0677 0.09023,0.1128 0.13534,0.1579 0.27067,0.2707 0.65412,0.4963 1.26313,0.7218 0.11278,0.0451 0.24812,0.0902 0.3608998,0.1354 0.4962299,0.1804 1.0375699,0.3383 1.6014699,0.4736 2.12026,0.4963 4.375829,0.6316 6.428429,0.6316 2.0526,0 4.3308,-0.1353 6.4285,-0.6316 0.5639,-0.1353 1.1278,-0.2932 1.6015,-0.4736 0.1127,-0.0452 0.2481,-0.0903 0.3608,-0.1354 0.6091,-0.2481 1.0151,-0.4737 1.2632,-0.7218 0.0451,-0.0451 0.0902,-0.0902 0.1353,-0.1579 0.6316,-0.8345 0.203,-2.0977 0.4737,-5.2329 0,-0.0226 1.7819,-15.81178 2.0526,-19.0147298 0,-0.04511 0,-0.09023 0.0225,-0.11278 0.1579,-1.6917 -0.1127,-2.0526 -0.3383,-2.39093 z" + fill="#3b8047" + id="path1" /> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/coub-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/coub-icon.svg @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="46" + height="46" + fill="none" + version="1.1" + id="svg1" + sodipodi:docname="coub-icon.svg" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1" /> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="13.03536" + inkscape:cx="22.400609" + inkscape:cy="29.228192" + inkscape:window-width="1888" + inkscape:window-height="1052" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg1" /> + <path + id="path3" + style="fill:#ffffff;stroke-width:1.5697" + d="M 26.113281 0.21679688 C 26.210748 0.22999623 26.309175 0.23948989 26.40625 0.25390625 A 23 23 0 0 0 26.113281 0.21679688 z M 19.765625 0.23242188 A 23 23 0 0 0 19.703125 0.24023438 C 19.723861 0.23725622 19.744871 0.23534468 19.765625 0.23242188 z M 10.628906 3.6152344 A 23 23 0 0 0 10.509766 3.6914062 C 10.549312 3.6657711 10.589193 3.6406327 10.628906 3.6152344 z M 8.0117188 5.5605469 A 23 23 0 0 0 7.8710938 5.6835938 C 7.9180075 5.6425732 7.9644699 5.6011912 8.0117188 5.5605469 z M 17.990234 6.140625 C 17.080235 6.2576249 16.298937 7.2892356 16.210938 8.4902344 L 15.535156 14.746094 C 15.488156 15.380093 15.503578 16.266095 15.517578 17.121094 L 15.517578 17.125 C 15.528578 17.757999 15.538437 18.356844 15.523438 18.839844 L 15.464844 20.835938 C 15.444844 21.508937 15.229171 21.988578 14.826172 22.267578 C 14.603172 22.423578 13.856874 22.962798 13.046875 23.716797 C 12.967875 23.790797 12.886594 23.860688 12.808594 23.929688 L 12.779297 23.955078 C 12.182297 24.485078 11.667187 24.942939 11.617188 26.460938 C 11.591188 27.173937 11.623563 27.897892 11.726562 28.962891 C 11.833562 30.07989 12.164625 30.781438 12.515625 31.523438 C 12.571625 31.643437 12.634219 31.769344 12.699219 31.902344 C 13.214218 32.940343 13.918984 34.359798 13.333984 35.966797 L 10.935547 42.552734 A 23 23 0 0 0 21.210938 45.871094 L 23.451172 39.714844 C 23.825172 38.687845 25.069923 37.314608 26.169922 36.099609 L 26.177734 36.091797 C 26.808734 35.397798 27.351594 34.796359 27.558594 34.443359 C 28.485593 32.865361 31.171797 28.358343 31.591797 27.652344 L 31.646484 27.560547 C 32.274484 26.660548 33.283297 25.120233 33.904297 24.115234 L 37.296875 18.603516 C 37.917874 17.596517 37.96339 16.332109 37.400391 15.787109 A 0.97 0.97 0 0 0 37.056641 15.572266 C 36.434641 15.345266 35.607999 15.711376 35 16.484375 L 31.589844 21.240234 C 31.194844 21.740234 30.753171 22.152782 30.326172 22.550781 A 13.43 13.43 0 0 0 29.277344 23.607422 L 28.927734 24.013672 A 0.24 0.24 0 0 1 28.761719 24.097656 A 0.44 0.44 0 0 1 28.582031 24.072266 C 28.460031 24.028266 28.263406 23.890031 28.316406 23.457031 L 28.316406 23.451172 C 28.346406 23.322172 28.899795 20.884562 27.341797 20.226562 L 27.271484 20.199219 C 26.416485 19.887219 25.734515 20.423267 24.978516 21.322266 C 24.864516 21.458265 24.633625 21.470734 24.515625 21.427734 A 0.447 0.447 0 0 1 24.234375 20.888672 C 24.504375 19.680673 24.00678 18.550125 23.050781 18.203125 L 22.976562 18.179688 C 22.145563 17.912688 21.141062 18.254673 20.539062 19.013672 A 0.24 0.24 0 0 1 20.462891 19.078125 C 20.342891 19.192125 20.137062 19.350531 19.914062 19.269531 C 19.674063 19.182531 19.617703 18.891687 19.595703 18.679688 L 19.568359 18.417969 C 19.542359 18.157969 19.509656 17.857156 19.472656 17.535156 L 19.470703 17.525391 C 19.350703 16.473392 19.202563 15.16878 19.226562 14.300781 L 19.59375 8.1113281 C 19.61875 7.207329 19.204546 6.4371248 18.560547 6.203125 A 1.206 1.206 0 0 0 17.990234 6.140625 z M 5.6835938 7.8710938 A 23 23 0 0 0 5.5605469 8.0117188 C 5.6011912 7.9644699 5.6425732 7.9180075 5.6835938 7.8710938 z M 3.6914062 10.509766 A 23 23 0 0 0 3.6152344 10.628906 C 3.6406327 10.589193 3.6657711 10.549312 3.6914062 10.509766 z M 45.746094 19.59375 C 45.76051 19.690825 45.770004 19.789252 45.783203 19.886719 A 23 23 0 0 0 45.746094 19.59375 z M 0.24023438 19.703125 A 23 23 0 0 0 0.23242188 19.765625 C 0.23534468 19.744871 0.23725622 19.723861 0.24023438 19.703125 z M 0.23242188 26.232422 A 23 23 0 0 0 0.25 26.347656 C 0.24436597 26.309056 0.23786388 26.271084 0.23242188 26.232422 z M 45.767578 26.234375 C 45.764655 26.255129 45.762744 26.276139 45.759766 26.296875 A 23 23 0 0 0 45.767578 26.234375 z M 0.91796875 29.419922 A 23 23 0 0 0 0.95898438 29.554688 C 0.94559095 29.509599 0.93109267 29.465125 0.91796875 29.419922 z M 2.046875 32.472656 A 23 23 0 0 0 2.1152344 32.621094 C 2.0924183 32.571652 2.0693497 32.522287 2.046875 32.472656 z M 3.609375 35.359375 A 23 23 0 0 0 3.6796875 35.474609 C 3.6552741 35.436877 3.633573 35.397259 3.609375 35.359375 z M 42.384766 35.371094 C 42.359367 35.410807 42.334229 35.450688 42.308594 35.490234 A 23 23 0 0 0 42.384766 35.371094 z M 40.439453 37.988281 C 40.398809 38.03553 40.357427 38.081993 40.316406 38.128906 A 23 23 0 0 0 40.439453 37.988281 z M 5.5820312 38.015625 A 23 23 0 0 0 5.6992188 38.144531 C 5.6609425 38.100838 5.619981 38.05961 5.5820312 38.015625 z M 7.828125 40.273438 A 23 23 0 0 0 8.078125 40.488281 C 7.9946046 40.416944 7.9106056 40.345944 7.828125 40.273438 z M 38.128906 40.316406 C 38.081993 40.357427 38.03553 40.398809 37.988281 40.439453 A 23 23 0 0 0 38.128906 40.316406 z M 10.462891 42.273438 A 23 23 0 0 0 10.640625 42.390625 C 10.580779 42.352394 10.522357 42.312206 10.462891 42.273438 z M 35.490234 42.308594 C 35.450688 42.334229 35.410807 42.359367 35.371094 42.384766 A 23 23 0 0 0 35.490234 42.308594 z M 26.296875 45.759766 C 26.276139 45.762744 26.255129 45.764655 26.234375 45.767578 A 23 23 0 0 0 26.296875 45.759766 z " /> + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="m 46,23 c 0,12.703 -10.297,23 -23,23 -0.61,0 -1.214,-0.024 -1.811,-0.07 l 2.262,-6.216 c 0.374,-1.027 1.619,-2.4 2.719,-3.615 l 0.007,-0.008 c 0.631,-0.694 1.175,-1.295 1.382,-1.648 0.927,-1.578 3.613,-6.084 4.033,-6.79 l 0.055,-0.092 c 0.628,-0.9 1.636,-2.44 2.257,-3.445 l 3.392,-5.512 c 0.621,-1.007 0.668,-2.272 0.105,-2.817 A 0.97,0.97 0 0 0 37.057,15.572 C 36.435,15.345 35.608,15.712 35,16.485 l -3.41,4.756 c -0.395,0.5 -0.836,0.912 -1.263,1.31 a 13.43,13.43 0 0 0 -1.05,1.056 l -0.35,0.407 a 0.24,0.24 0 0 1 -0.165,0.083 0.44,0.44 0 0 1 -0.18,-0.024 C 28.46,24.029 28.264,23.89 28.317,23.457 v -0.005 c 0.03,-0.129 0.583,-2.568 -0.975,-3.226 L 27.272,20.2 c -0.855,-0.312 -1.537,0.224 -2.293,1.123 -0.114,0.136 -0.346,0.148 -0.464,0.105 a 0.447,0.447 0 0 1 -0.28,-0.54 c 0.27,-1.208 -0.228,-2.337 -1.184,-2.684 l -0.074,-0.025 c -0.831,-0.267 -1.835,0.075 -2.437,0.834 a 0.24,0.24 0 0 1 -0.078,0.065 c -0.12,0.114 -0.325,0.272 -0.548,0.191 -0.24,-0.087 -0.296,-0.378 -0.318,-0.59 l -0.027,-0.262 c -0.026,-0.26 -0.06,-0.56 -0.097,-0.882 L 19.471,17.526 C 19.351,16.474 19.203,15.168 19.227,14.3 L 19.594,8.111 C 19.619,7.207 19.204,6.437 18.56,6.203 A 1.206,1.206 0 0 0 17.991,6.141 c -0.91,0.117 -1.692,1.149 -1.78,2.35 l -0.676,6.256 c -0.047,0.634 -0.032,1.519 -0.018,2.374 v 0.004 c 0.011,0.633 0.022,1.232 0.007,1.715 l -0.06,1.995 c -0.02,0.673 -0.235,1.154 -0.638,1.433 -0.223,0.156 -0.97,0.694 -1.78,1.448 -0.079,0.074 -0.159,0.145 -0.237,0.214 l -0.03,0.026 c -0.597,0.53 -1.112,0.987 -1.162,2.505 -0.026,0.713 0.007,1.437 0.11,2.502 0.107,1.117 0.437,1.818 0.788,2.56 0.056,0.12 0.12,0.247 0.185,0.38 0.515,1.038 1.219,2.456 0.634,4.063 L 10.926,42.58 C 4.37,38.528 0,31.274 0,23 0,10.297 10.297,0 23,0 35.703,0 46,10.297 46,23 Z" + fill="#0043ff" + id="path1" /> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/deviantArt-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/deviantArt-icon.svg @@ -0,0 +1,474 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="svg2" + x="0px" + y="0px" + viewBox="0 0 256 256" + xml:space="preserve" + sodipodi:docname="DeviantArt_Logo.svg" + width="256" + height="256" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:ns="http://ns.adobe.com/SaveForWeb/1.0/"><defs + id="defs1" /> +<style + type="text/css" + id="style1"> + .st0{fill:#24E39D;} + .st1{display:none;} + .st2{display:inline;fill:none;stroke:#868686;stroke-width:0.4;stroke-miterlimit:10;stroke-dasharray:2;} + .st3{display:inline;fill:none;stroke:#9C9B9B;stroke-width:0.25;stroke-miterlimit:10;stroke-dasharray:2;} + .st4{display:inline;fill:none;stroke:#868686;stroke-width:0.2;stroke-miterlimit:10;stroke-dasharray:2;} + .st5{display:inline;} + .st6{fill:#6F6F6E;} + .st7{fill:none;stroke:#6F6F6E;stroke-width:0.5;stroke-miterlimit:10;} + .st8{display:inline;fill:#D9D9D9;} +</style> +<metadata + id="metadata174"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + + </cc:Work> + </rdf:RDF> + <ns:sfw> + <ns:slices /> + <ns:sliceSourceBounds + bottomLeftOrigin="true" + height="372.2" + width="962.9" + x="-7.3" + y="0" /> + </ns:sfw> +</metadata> +<sodipodi:namedview + bordercolor="#666666" + borderopacity="1" + gridtolerance="10" + guidetolerance="10" + id="namedview170" + inkscape:current-layer="svg2" + inkscape:cx="167" + inkscape:cy="53" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-height="1056" + inkscape:window-maximized="1" + inkscape:window-width="1888" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:zoom="1" + objecttolerance="10" + pagecolor="#ffffff" + showgrid="false" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1"> + </sodipodi:namedview> +<polygon + id="polygon8" + class="st0" + points="37.1,204.3 40.9,200.6 58.4,167.2 63.9,163.5 126.5,163.5 126.5,112.4 92.1,112.4 89,108.7 126.5,37.2 126.5,0 126.4,0 89.3,0 85.6,3.7 68.1,37.2 62.6,40.9 0,40.9 0,91.9 34.4,91.9 37.5,95.6 0,167.2 0,204.3 " + transform="translate(64.75,25.85)" /> + + +<g + id="Construction" + transform="translate(0,-191.65601)" + class="st1"> + <line + id="line35" + class="st2" + x1="225.10001" + y1="340.39999" + x2="372.89999" + y2="58.299999" /> + <line + id="line37" + class="st2" + x1="453.29999" + y1="340.39999" + x2="601.09998" + y2="58.299999" /> + <line + id="line39" + class="st2" + x1="539.59998" + y1="340.39999" + x2="687.29999" + y2="58.599998" /> + <line + id="line41" + class="st2" + x1="776.90002" + y1="340.39999" + x2="924.70001" + y2="58.299999" /> + <line + id="line43" + class="st2" + x1="110.9" + y1="342.5" + x2="259.79999" + y2="58.299999" /> + <line + id="line45" + class="st2" + x1="52.599998" + y1="342.5" + x2="201.39999" + y2="58.299999" /> + <line + id="line47" + class="st3" + x1="67.099998" + y1="188.8" + x2="921.70001" + y2="188.8" /> + <line + id="line49" + class="st3" + x1="67.099998" + y1="96.900002" + x2="921.70001" + y2="96.900002" /> + <line + id="line51" + class="st3" + x1="67.099998" + y1="301.20001" + x2="921.70001" + y2="301.20001" /> + <line + id="line53" + class="st3" + x1="67.099998" + y1="209.3" + x2="921.70001" + y2="209.3" /> + <line + id="line55" + class="st4" + x1="354.5" + y1="340.39999" + x2="287.10001" + y2="58.299999" /> + <line + id="line57" + class="st4" + x1="539.59998" + y1="340.39999" + x2="472.70001" + y2="60.099998" /> + <line + id="line59" + class="st4" + x1="754.5" + y1="340.39999" + x2="687.20001" + y2="58.299999" /> +</g> +<g + id="Guidelines" + transform="translate(0,-191.65601)" + class="st1"> + <line + id="line62" + class="st3" + x1="27.1" + y1="188.8" + x2="904.5" + y2="188.8" /> + <line + id="line64" + class="st3" + x1="27.1" + y1="137.8" + x2="93.699997" + y2="137.8" /> + <line + id="line66" + class="st3" + x1="220.10001" + y1="96.900002" + x2="220.10001" + y2="364.5" /> + <line + id="line68" + class="st3" + x1="245.60001" + y1="96.900002" + x2="245.60001" + y2="364.5" /> + <g + id="g70" + class="st5"> + <path + id="path72" + inkscape:connector-curvature="0" + class="st6" + d="m -0.3,163.6 3.7,5.7 H 0.2 l -2.2,-3.4 -2.2,3.4 h -3.2 l 3.7,-5.7 -3.5,-5.4 H -4 l 2,3.2 2.1,-3.2 h 3.1 c 0.1,0 -3.5,5.4 -3.5,5.4 z" /> + </g> + <g + id="g74" + class="st5"> + <g + id="g76"> + <line + id="line78" + class="st7" + x1="12.8" + y1="139" + x2="12.8" + y2="187.8" /> + <g + id="g80"> + <circle + id="circle82" + class="st6" + cx="12.8" + cy="139.10001" + r="1.3" /> + </g> + <g + id="g84"> + <circle + id="circle86" + class="st6" + cx="12.8" + cy="187.7" + r="1.3" /> + </g> + </g> + </g> + <g + id="g88" + class="st5"> + <path + id="path90" + inkscape:connector-curvature="0" + class="st6" + d="m 215.7,386 c 0,-3.4 1.9,-5.7 4.6,-5.7 2.7,0 4.6,2.3 4.6,5.7 0,3.4 -1.9,5.7 -4.6,5.7 -2.7,0 -4.6,-2.3 -4.6,-5.7 z m 2.8,0 c 0,1.7 0.5,3.2 1.8,3.2 1.3,0 1.8,-1.5 1.8,-3.2 0,-1.7 -0.5,-3.2 -1.8,-3.2 -1.3,0 -1.8,1.5 -1.8,3.2 z" /> + <path + id="path92" + inkscape:connector-curvature="0" + class="st6" + d="m 226.8,388.3 c 0.9,0 1.7,0.7 1.7,1.7 0,1 -0.7,1.7 -1.7,1.7 -0.9,0 -1.7,-0.7 -1.7,-1.7 0.1,-1 0.8,-1.7 1.7,-1.7 z" /> + <path + id="path94" + inkscape:connector-curvature="0" + class="st6" + d="m 232.1,387.1 h -2.3 v -6.6 h 6.8 v 2.5 h -4.5 v 1.7 c 0.3,-0.2 1,-0.4 1.7,-0.4 2.2,0 3.6,1.5 3.6,3.7 0,2.3 -1.6,3.8 -4,3.8 -2.5,0 -4.1,-1.5 -4.2,-3.7 h 2.8 c 0.1,0.8 0.6,1.3 1.4,1.3 0.8,0 1.3,-0.6 1.3,-1.4 0,-0.8 -0.5,-1.4 -1.3,-1.4 -0.6,-0.1 -1,0.2 -1.3,0.5 z" /> + <path + id="path96" + inkscape:connector-curvature="0" + class="st6" + d="m 248.5,385.9 3.7,5.7 H 249 l -2.2,-3.4 -2.2,3.4 h -3.2 l 3.7,-5.7 -3.5,-5.4 h 3.2 l 2,3.1 2.1,-3.1 h 3.1 z" /> + </g> + <g + id="g98" + class="st5"> + <g + id="g100"> + <line + id="line102" + class="st7" + x1="221.3" + y1="368.79999" + x2="245.10001" + y2="368.79999" /> + <g + id="g104"> + <circle + id="circle106" + class="st6" + cx="221.39999" + cy="368.79999" + r="1.3" /> + </g> + <g + id="g108"> + <circle + id="circle110" + class="st6" + cx="245.10001" + cy="368.79999" + r="1.3" /> + </g> + </g> + </g> + <g + id="g112" + class="st5"> + <g + id="g114"> + <line + id="line116" + class="st7" + x1="38.099998" + y1="47" + x2="38.099998" + y2="95.800003" /> + <g + id="g118"> + <circle + id="circle120" + class="st6" + cx="38.099998" + cy="47.099998" + r="1.3" /> + </g> + <g + id="g122"> + <circle + id="circle124" + class="st6" + cx="38.099998" + cy="95.699997" + r="1.3" /> + </g> + </g> + </g> + <g + id="g126" + class="st5"> + <path + id="path128" + inkscape:connector-curvature="0" + class="st6" + d="m 70.1,29.2 3.7,5.7 h -3.2 l -2.2,-3.4 -2.2,3.4 H 63 l 3.7,-5.7 -3.5,-5.4 h 3.2 l 2,3.2 2.1,-3.2 h 3.1 c 0,0 -3.5,5.4 -3.5,5.4 z" /> + </g> + <g + id="g130" + class="st5"> + <path + id="path132" + inkscape:connector-curvature="0" + class="st6" + d="M 26.6,70.3 30.3,76 H 27.1 L 24.9,72.6 22.7,76 h -3.2 l 3.7,-5.7 -3.5,-5.4 h 3.2 l 2,3.2 2.1,-3.2 h 3.1 z" /> + </g> + <g + id="g134" + class="st5"> + <g + id="g136"> + <line + id="line138" + class="st7" + x1="92.5" + y1="41.5" + x2="43.799999" + y2="41.5" /> + <g + id="g140"> + <circle + id="circle142" + class="st6" + cx="92.5" + cy="41.5" + r="1.3" /> + </g> + <g + id="g144"> + <circle + id="circle146" + class="st6" + cx="43.900002" + cy="41.5" + r="1.3" /> + </g> + </g> + </g> + <rect + id="rect148" + x="16.799999" + y="137.89999" + class="st8" + width="8.1000004" + height="51" /> + <rect + id="rect150" + x="93.699997" + y="45.900002" + class="st8" + width="8.1000004" + height="51" /> + <rect + id="rect152" + x="896.29999" + y="45.900002" + class="st8" + width="8.1000004" + height="51" /> + <rect + id="rect154" + x="93.699997" + y="301.20001" + class="st8" + width="8.1000004" + height="51" /> + <rect + id="rect156" + x="896.29999" + y="301.20001" + class="st8" + width="8.1000004" + height="51" /> + <rect + id="rect158" + x="42.700001" + y="96.900002" + class="st8" + width="51" + height="8.1000004" /> + <rect + id="rect160" + x="42.700001" + y="293.10001" + class="st8" + width="51" + height="8.1000004" /> + <rect + id="rect162" + x="904.5" + y="96.900002" + class="st8" + width="51" + height="8.1000004" /> + <rect + id="rect164" + x="904.5" + y="293.10001" + class="st8" + width="51" + height="8.1000004" /> + <rect + id="rect166" + x="93.699997" + y="96.900002" + class="st3" + width="810.79999" + height="204.3" /> + <rect + id="rect168" + x="42.700001" + y="45.900002" + class="st3" + width="912.79999" + height="306.39999" /> +</g> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/fandom-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/fandom-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174 242"><path fill="#FA005A" d="M166.935 118.154 50.108 1.273A4.32 4.32 0 0 0 45.405.34a4.31 4.31 0 0 0-2.662 3.99v98.276L7.365 67.22a4.31 4.31 0 0 0-4.702-.933A4.31 4.31 0 0 0 0 70.277v101.487a24.1 24.1 0 0 0 7.07 17.072l46.037 46.099a24.17 24.17 0 0 0 17.068 7.085h33.68a24.14 24.14 0 0 0 17.063-7.075l46.027-46.099A24.13 24.13 0 0 0 174 171.774v-36.533a24.15 24.15 0 0 0-1.834-9.247 24.1 24.1 0 0 0-5.231-7.84"/><path fill="#FFC500" d="M131.297 160.901a7.24 7.24 0 0 1-2.108 5.111l-37.11 37.3a7.23 7.23 0 0 1-7.914 1.582 7.25 7.25 0 0 1-2.355-1.582l-36.99-37.3a7.22 7.22 0 0 1-2.117-5.096v-14.191a7.23 7.23 0 0 1 2.128-5.116l13.317-13.328a7.225 7.225 0 0 1 10.245 0l18.624 18.645 18.596-18.65a7.22 7.22 0 0 1 5.122-2.127 7.23 7.23 0 0 1 5.121 2.127l13.318 13.328a7.22 7.22 0 0 1 2.123 5.116z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/geeksForGeeks-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/geeksForGeeks-icon.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + id="GFG" + width="70" + height="70" + viewBox="0 0 70 70.000001" + version="1.1" + sodipodi:docname="gfg-gg-logo.svg" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1" /> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="7.4688057" + inkscape:cx="17.941289" + inkscape:cy="21.020764" + inkscape:window-width="1888" + inkscape:window-height="1052" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="GFG" /> + <path + id="Path_402" + data-name="Path 402" + d="m 64.495957,33.850871 h -24.407 a 9.748,9.748 0 0 1 17.129,-5.146 l 3.55,-3.57 a 14.77,14.77 0 0 0 -25.724,8.716 h -0.085 a 14.77,14.77 0 0 0 -25.7240007,-8.716 l 3.5499997,3.57 a 9.748,9.748 0 0 1 17.129001,5.146 H 5.5059563 q -0.043,0.565 -0.044,1.141 a 14.771,14.771 0 0 0 29.1490007,3.383 h 0.778 a 14.769,14.769 0 0 0 29.149,-3.383 q 0.002,-0.576 -0.042,-1.141 z m -44.264,10.889 a 9.749,9.749 0 0 1 -9.151001,-6.385 h 18.300001 a 9.75,9.75 0 0 1 -9.149,6.385 z m 29.538,0 a 9.75,9.75 0 0 1 -9.152,-6.385 h 18.3 a 9.75,9.75 0 0 1 -9.147,6.385 z" + fill="#2f8d46" /> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/general-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/general-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#fff" d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/general-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/general-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/genius-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/genius-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 893.808 893.808"><circle cx="446.904" cy="446.904" r="446.904" style="fill:#f6f069;fill-opacity:1;fill-rule:evenodd;stroke-width:9.79459;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.411765;paint-order:stroke fill markers;stop-color:#000"/><path d="M724.877 402.725c-.25-14.318-1.748-28.47-4.08-42.54-9.073-53.111-31.384-99.98-66.098-141.021-3.58-4.246-7.326-8.325-11.239-12.32-2.414-2.498-5.494-2.748-7.908-1.083-2.331 1.582-2.997 3.996-1.998 7.409.25.832.583 1.582.832 2.33 13.32 35.548 20.146 72.26 20.396 110.221l-.999 20.729c-.999 18.897-3.996 37.461-8.741 55.693-15.234 58.69-44.704 109.138-89.158 150.345-57.941 53.695-126.787 81.333-205.706 83.581-19.896.583-39.626-1.082-59.19-4.495-19.979-3.413-39.542-8.741-58.44-16.067-4.162-1.582-7.075-.833-8.74 2.081-1.665 2.747-1 5.328 2.247 8.408a359 359 0 0 0 8.325 7.576c54.278 47.035 117.463 71.26 189.14 73.341 17.315.5 34.63-.832 51.78-3.663 61.77-9.99 115.714-36.38 160.252-80.334 61.104-60.271 90.99-133.946 89.325-220.19M249.531 483.642c2.415-1.831 2.83-4.245 1.499-8.325-.167-.416-.25-.749-.416-1.165-10.323-29.137-13.237-59.106-8.825-89.658 5.828-40.209 22.893-75.006 50.698-104.476 2.248-2.414 3.33-4.828 3.33-8.158-.083-10.406-.083-20.812-.083-31.218V209.84c0-6.66-1.998-8.741-8.658-8.741-20.562 0-41.041 0-61.603-.083-3.413 0-6.16.999-8.575 3.33-34.131 33.216-52.28 73.757-55.11 121.125-1.082 18.065 1 35.963 5.661 53.529 11.655 43.788 36.296 78.336 73.674 103.81 3.746 2.58 5.91 2.747 8.408.832"/><path d="M363.331 353.11c5.078 37.96 40.958 64.766 78.753 58.69 33.549-5.412 57.94-33.966 57.94-68.014V296.75c0-5.66 1.499-7.075 7.16-7.159 5.244-.083 10.572.084 15.817-.083 4.828-.166 6.992-3.08 6.16-7.742-.166-.832-.25-1.665-.416-2.414-6.327-26.723-17.815-50.864-34.465-72.675-3.08-3.996-6.493-5.495-11.322-5.412-13.985.167-27.97 0-42.04.084-1.498 0-3.08.083-4.578.333-3.497.582-5.079 2.247-5.578 5.744-.166 1.332-.083 2.747-.083 4.162v65.35c0 8.99-1.748 17.648-5.411 25.89-10.823 23.809-29.553 37.045-55.36 40.542-5.411.749-6.993 2.497-6.743 7.825.083.5.083 1.249.166 1.915"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/github-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/github-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 96"><path fill="#fff" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a47 47 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/github-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/github-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 96"><path fill="#24292f" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a47 47 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/gitlab-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/gitlab-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 24"><path fill="#e24329" d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.3 6.3 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.05 1.05 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.3 6.3 0 0 0 24.507 9.5"/><path fill="#fc6d26" d="m24.507 9.5-.034-.09a11.4 11.4 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.3 6.3 0 0 0 24.507 9.5"/><path fill="#fca326" d="m7.707 20.677 2.56 1.935 1.555 1.176a1.05 1.05 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584z"/><path fill="#fc6d26" d="M5.01 11.461a11.4 11.4 0 0 0-4.56-2.05L.416 9.5a6.3 6.3 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/goodreads-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/goodreads-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#fff" d="M243.868 66.58c-69.94 6.636-113.541 66.305-108.468 148.439 3.345 54.163 25.185 92.212 63.635 110.861 30.289 14.691 73.72 16.016 99.679 3.043 18.46-9.226 33.654-24.329 42.898-42.641.879-1.742 1.826-3.167 2.103-3.167.666 0 .662 33.464-.005 46.08-2.537 47.996-19.585 75.628-52.882 85.714-17.471 5.293-42.156 5.819-61.552 1.312-26.331-6.118-44.295-22.137-49.782-44.392l-1.418-5.751-16.586-.009-16.585-.01.337 3.629c4.449 47.87 51.436 78.65 117.733 77.123 65.091-1.5 101.161-30.87 111.433-90.736 2.912-16.969 2.75-8.667 2.943-151.168l.179-131.2h-33.31v23.04c0 13.738-.191 23.04-.473 23.04-.26 0-1.64-2.217-3.066-4.926-3.508-6.663-7.514-12.125-13.515-18.424-22.015-23.108-49.731-33.042-83.298-29.857m26.214 27.86c37.926 5.01 64.743 36.407 72.053 84.355 8.496 55.734-11.404 104.801-50.204 123.785-15.645 7.655-36.015 9.706-55.173 5.555-51.91-11.247-79.466-71.313-64.516-140.63 8.829-40.932 38.554-70.27 74.442-73.475 5.604-.5 18.177-.28 23.398.41"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/goodreads-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/goodreads-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M243.868 66.58c-69.94 6.636-113.541 66.305-108.468 148.439 3.345 54.163 25.185 92.212 63.635 110.861 30.289 14.691 73.72 16.016 99.679 3.043 18.46-9.226 33.654-24.329 42.898-42.641.879-1.742 1.826-3.167 2.103-3.167.666 0 .662 33.464-.005 46.08-2.537 47.996-19.585 75.628-52.882 85.714-17.471 5.293-42.156 5.819-61.552 1.312-26.331-6.118-44.295-22.137-49.782-44.392l-1.418-5.751-16.586-.009-16.585-.01.337 3.629c4.449 47.87 51.436 78.65 117.733 77.123 65.091-1.5 101.161-30.87 111.433-90.736 2.912-16.969 2.75-8.667 2.943-151.168l.179-131.2h-33.31v23.04c0 13.738-.191 23.04-.473 23.04-.26 0-1.64-2.217-3.066-4.926-3.508-6.663-7.514-12.125-13.515-18.424-22.015-23.108-49.731-33.042-83.298-29.857m26.214 27.86c37.926 5.01 64.743 36.407 72.053 84.355 8.496 55.734-11.404 104.801-50.204 123.785-15.645 7.655-36.015 9.706-55.173 5.555-51.91-11.247-79.466-71.313-64.516-140.63 8.829-40.932 38.554-70.27 74.442-73.475 5.604-.5 18.177-.28 23.398.41"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/ifunny-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/ifunny-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 31.75 31.75"><g transform="matrix(.26458 0 0 .26458 -2.646 -2.646)"><path fill="#ffd10b" d="M130 70c0-33.137-26.863-60-60-60S10 36.863 10 70s26.863 60 60 60 60-26.863 60-60"/><path d="M70 98.073c-14.444-.002-27.276-9.348-32.538-21.9l-.008.003a2.24 2.24 0 0 0-2.14-1.56c-1.235 0-2.237.99-2.237 2.212q0 .126.014.25h-.014c.016.44.105.869.245 1.211 6.11 15.052 19.149 28.632 36.678 28.634zm0 0c14.445-.002 27.277-9.348 32.539-21.9l.007.003a2.24 2.24 0 0 1 2.14-1.56c1.235 0 2.237.99 2.237 2.212q0 .126-.014.25h.014c-.015.44-.105.869-.245 1.211-6.109 15.052-19.149 28.632-36.678 28.634ZM58.133 50.535c0 5.82-2.352 10.531-6.182 10.535-3.893.003-6.182-4.716-6.182-10.535 0-5.82 2.29-10.535 6.182-10.535 3.83.003 6.182 4.719 6.182 10.535m35.963 0c0 5.82-2.352 10.531-6.182 10.535-3.893.003-6.182-4.716-6.182-10.535 0-5.82 2.29-10.535 6.182-10.535 3.83.003 6.181 4.719 6.181 10.535z"/></g></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/imdb-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/imdb-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250.423 250.423"><circle cx="125.211" cy="125.211" r="125.211" style="fill:#f5c518;fill-opacity:1;stroke-width:.529167"/><path d="M46.663 162.418V88.004h-20.67v74.414zM90.785 88.004l-4.627 34.762-2.874-18.907q-1.25-9.085-2.398-15.855H54.93v74.414h17.536l.068-49.139 7.382 49.14h12.484l7.007-50.223.052 50.222h17.484V88.004ZM125.211 162.418V88.004h32.265c7.296 0 13.21 5.87 13.21 13.133v48.149c0 7.253-5.904 13.132-13.21 13.132zm24.111-61.021c-.82-.443-2.388-.657-4.67-.657v48.827c3.013 0 4.867-.541 5.562-1.674.695-1.116 1.051-4.136 1.051-9.092v-28.853c0-3.365-.125-5.515-.356-6.467-.232-.952-.749-1.641-1.587-2.084zM209.67 106.636h1.322c7.422 0 13.438 5.812 13.438 12.973v29.836c0 7.165-6.014 12.973-13.438 12.973h-1.321c-4.541 0-8.556-2.176-10.989-5.505l-1.19 4.55h-18.537V88.003h19.779v23.898c2.555-3.185 6.494-5.266 10.937-5.266m-4.234 36.287V125.29c0-2.913-.187-4.825-.577-5.705s-1.945-1.446-3.036-1.446-2.773.46-3.1 1.234v29.846999999999998c.374.85 1.978 1.323 3.1 1.323s2.756-.458 3.099-1.323.514-2.974.514-6.297"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/imgur-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/imgur-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28"><style id="style1">.green{fill:#1bb76e}</style><g id="g4" transform="translate(-6 -6)"><path id="rect1" d="M17.12 31.506a.11.11 0 0 0-.1.064c-.13.29-.362.521-.65.65a.11.11 0 0 0 0 .2c.29.122.523.352.65.64a.11.11 0 0 0 .2 0c.12-.29.35-.52.64-.64a.11.11 0 0 0 0-.2 1.23 1.23 0 0 1-.64-.65.11.11 0 0 0-.1-.064" class="green" style="display:inline;fill:#fff;fill-opacity:1"/><path id="path12" d="M21.58 28.658a.18.18 0 0 0-.17.121 2 2 0 0 1-1.08 1.08.18.18 0 0 0 0 .33 2 2 0 0 1 1.08 1.08.18.18 0 0 0 .34 0 2.1 2.1 0 0 1 1.08-1.08.18.18 0 0 0 0-.33 2.1 2.1 0 0 1-1.08-1.08.18.18 0 0 0-.17-.12" class="green" style="display:inline;fill:#fff;fill-opacity:1"/><path id="path11" d="M22.975 25.85c-.036 0-.07.02-.084.06a1.1 1.1 0 0 1-.551.55.1.1 0 0 0 0 .17c.246.108.444.303.55.55a.09.09 0 0 0 .17 0 1 1 0 0 1 .54-.55.09.09 0 0 0 0-.17 1 1 0 0 1-.54-.55.09.09 0 0 0-.085-.06" class="green" style="display:inline;fill:#fff;fill-opacity:1"/><path id="path10" d="M9.154 25.676a.11.11 0 0 0-.093.054 1.14 1.14 0 0 1-.612.61.11.11 0 0 0 0 .19c.272.12.49.34.612.61a.1.1 0 0 0 .189 0c.121-.27.338-.49.61-.61a.11.11 0 0 0 0-.19 1.14 1.14 0 0 1-.61-.61.11.11 0 0 0-.096-.054" class="green" style="display:inline;fill:#fff;fill-opacity:1"/><path id="path9" d="M9.14 18.229a.25.25 0 0 0-.23.152 2.85 2.85 0 0 1-1.48 1.478.25.25 0 0 0 0 .461c.669.28 1.201.812 1.48 1.48a.26.26 0 0 0 .46 0 2.82 2.82 0 0 1 1.48-1.48.25.25 0 0 0 0-.46 2.9 2.9 0 0 1-1.48-1.48.245.245 0 0 0-.23-.151" class="green" style="display:inline;fill:#fff;fill-opacity:1"/><path id="path8" d="M12.475 15.826a.15.15 0 0 0-.135.084c-.17.392-.479.705-.87.88a.151.151 0 0 0 0 .27c.392.168.703.478.87.87a.15.15 0 0 0 .27 0 1.65 1.65 0 0 1 .87-.87.151.151 0 0 0 0-.27 1.7 1.7 0 0 1-.87-.88.15.15 0 0 0-.135-.084" class="green" style="display:inline;fill:#fff;fill-opacity:1"/><path id="path7" d="M12.418 31.78a1.74 1.74 0 0 1 .803-.72.15.15 0 0 0-.041-.25 1.7 1.7 0 0 1-.9-.9.15.15 0 0 0-.28 0 1.72 1.72 0 0 1-.9.9l-.01.006a14 14 0 0 0 1.328.963" class="green" style="display:inline;fill:#fff;fill-opacity:1"/><path id="path6" d="m13.36 12.2-7.348 7.349c-.005.15-.012.3-.012.451a13.96 13.96 0 0 0 5.09 10.816l.01-.005c.404-.174.726-.497.9-.9a.15.15 0 0 1 .28 0c.17.405.494.728.9.9a.15.15 0 0 1 .04.25 1.74 1.74 0 0 0-.802.718 13.96 13.96 0 0 0 8.46 2.192L28 26.84Zm-.885 3.626c.053 0 .107.028.134.084.17.392.481.705.871.88a.151.151 0 0 1 0 .27 1.65 1.65 0 0 0-.87.87.15.15 0 0 1-.27 0 1.65 1.65 0 0 0-.87-.87.151.151 0 0 1 0-.27c.391-.175.7-.488.87-.88a.15.15 0 0 1 .135-.084M9.14 18.23c.093 0 .185.05.228.152.291.66.82 1.187 1.48 1.478a.25.25 0 0 1 0 .461 2.82 2.82 0 0 0-1.48 1.48.26.26 0 0 1-.459 0 2.75 2.75 0 0 0-1.48-1.48.25.25 0 0 1 0-.46 2.85 2.85 0 0 0 1.48-1.48.25.25 0 0 1 .23-.151m.013 7.447a.11.11 0 0 1 .096.054c.116.276.334.494.61.61a.11.11 0 0 1 0 .19c-.272.12-.489.34-.61.61a.1.1 0 0 1-.19 0 1.22 1.22 0 0 0-.61-.61.11.11 0 0 1 0-.19c.275-.116.495-.334.61-.61a.11.11 0 0 1 .094-.054m13.82.174a.09.09 0 0 1 .087.06 1 1 0 0 0 .539.55.09.09 0 0 1 0 .17 1 1 0 0 0-.54.55.09.09 0 0 1-.17 0 1.06 1.06 0 0 0-.55-.55.1.1 0 0 1 0-.17c.245-.109.441-.305.55-.55a.09.09 0 0 1 .085-.06m-1.394 2.808c.071 0 .142.04.17.121a2.1 2.1 0 0 0 1.08 1.08.18.18 0 0 1 0 .33 2.1 2.1 0 0 0-1.08 1.08.18.18 0 0 1-.34 0 2 2 0 0 0-1.08-1.08.18.18 0 0 1 0-.33 2 2 0 0 0 1.08-1.08.18.18 0 0 1 .17-.12m-4.46 2.848a.11.11 0 0 1 .1.064c.123.291.35.524.64.65a.11.11 0 0 1 0 .2c-.29.12-.52.35-.64.64a.11.11 0 0 1-.2 0 1.23 1.23 0 0 0-.65-.64.11.11 0 0 1 0-.2c.288-.129.52-.36.65-.65a.11.11 0 0 1 .1-.064" class="green" style="display:inline;fill:#0a0d49;fill-opacity:1"/><path id="path5" d="M20 6A13.965 13.965 0 0 0 6.012 19.549l7.347-7.35L28 26.84l-7.121 7.132A13.966 13.966 0 0 0 34 20c0-7.756-6.244-14-14-14" class="green"/><path id="path3" fill="#fff" d="M10.3 24.91a1.75 1.75 0 0 1 .12-2.3L15.83 17l-2.46-2.42c-1.057-1.002-.5-2.78.94-3a65 65 0 0 1 10.4-.92c1.06 0 2.1 0 3.11.1a1.74 1.74 0 0 1 1.62 1.63A59.6 59.6 0 0 1 28.63 26c-.22 1.44-1.998 1.997-3 .94l-2.42-2.46-5.55 5.42a1.75 1.75 0 0 1-2.31.11l-2.197-2.219z"/><path id="path4" d="M27.7 12.58a57.8 57.8 0 0 0-13.1.8L18.29 17l-6.62 6.79a30 30 0 0 0 4.8 4.81l6.8-6.6 3.64 3.7a58 58 0 0 0 .79-13.12" class="green"/></g></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/instagram-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/instagram-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><style>.st1{fill:#fff}</style><linearGradient id="SVGID_1_" x1="146.446" x2="853.553" y1="853.553" y2="146.446" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#ffd521"/><stop offset=".055" style="stop-color:#ffd020"/><stop offset=".124" style="stop-color:#fec01e"/><stop offset=".2" style="stop-color:#fca71b"/><stop offset=".282" style="stop-color:#fa8316"/><stop offset=".368" style="stop-color:#f85510"/><stop offset=".456" style="stop-color:#f51e09"/><stop offset=".5" style="stop-color:#f30005"/><stop offset=".503" style="stop-color:#f20007"/><stop offset=".597" style="stop-color:#e1003b"/><stop offset=".688" style="stop-color:#d30067"/><stop offset=".776" style="stop-color:#c70088"/><stop offset=".859" style="stop-color:#bf00a0"/><stop offset=".936" style="stop-color:#bb00af"/><stop offset="1" style="stop-color:#b900b4"/></linearGradient><path d="M500 1000C223.9 1000 0 776.1 0 500S223.9 0 500 0s500 223.9 500 500-223.9 500-500 500" style="fill:url(#SVGID_1_)"/><path d="M500 220.2c91.1 0 101.9.3 137.9 2 33.3 1.5 51.4 7.1 63.4 11.8 15.9 6.2 27.3 13.6 39.2 25.5s19.3 23.3 25.5 39.2c4.7 12 10.2 30.1 11.8 63.4 1.6 36 2 46.8 2 137.9s-.3 101.9-2 137.9c-1.5 33.3-7.1 51.4-11.8 63.4-6.2 15.9-13.6 27.3-25.5 39.2s-23.3 19.3-39.2 25.5c-12 4.7-30.1 10.2-63.4 11.8-36 1.6-46.8 2-137.9 2s-101.9-.3-137.9-2c-33.3-1.5-51.4-7.1-63.4-11.8-15.9-6.2-27.3-13.6-39.2-25.5s-19.3-23.3-25.5-39.2c-4.7-12-10.2-30.1-11.8-63.4-1.6-36-2-46.8-2-137.9s.3-101.9 2-137.9c1.5-33.3 7.1-51.4 11.8-63.4 6.2-15.9 13.6-27.3 25.5-39.2s23.3-19.3 39.2-25.5c12-4.7 30.1-10.2 63.4-11.8 36-1.7 46.8-2 137.9-2m0-61.5c-92.7 0-104.3.4-140.7 2.1-36.3 1.7-61.1 7.4-82.9 15.9C254 185.3 234.9 197 216 216c-19 19-30.6 38-39.4 60.5-8.4 21.7-14.2 46.5-15.9 82.9s-2.1 48-2.1 140.7.4 104.3 2.1 140.7c1.7 36.3 7.4 61.1 15.9 82.9C185.3 746 197 765.1 216 784c19 19 38 30.6 60.5 39.4 21.7 8.4 46.5 14.2 82.9 15.9s48 2.1 140.7 2.1 104.3-.4 140.7-2.1c36.3-1.7 61.1-7.4 82.9-15.9C746 814.7 765.1 803 784 784c19-19 30.6-38 39.4-60.5 8.4-21.7 14.2-46.5 15.9-82.9s2.1-48 2.1-140.7-.4-104.3-2.1-140.7c-1.7-36.3-7.4-61.1-15.9-82.9C814.7 254 803 234.9 784 216c-19-19-38-30.6-60.5-39.4-21.7-8.4-46.5-14.2-82.9-15.9-36.3-1.6-47.9-2-140.6-2" class="st1"/><path d="M500 324.7c-96.8 0-175.3 78.5-175.3 175.3S403.2 675.3 500 675.3 675.3 596.8 675.3 500 596.8 324.7 500 324.7m0 289.1c-62.8 0-113.8-50.9-113.8-113.8s51-113.8 113.8-113.8S613.8 437.1 613.8 500s-51 113.8-113.8 113.8" class="st1"/><circle cx="682.2" cy="317.8" r="41" class="st1"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/instructables-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/instructables-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 142.45365 142.45364" version="1.1"><defs id="defs4"><style id="style2">.cls-1,.cls-2,.cls-3{fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round}.cls-1,.cls-3{stroke-width:1.29491px}.cls-4{fill:#fff}.cls-5{fill:#ffc432}.cls-6{fill:#ffc21a}.cls-7{fill:#b1b1b1}.cls-8{fill:#e10017}.cls-2{stroke-width:1.18701px}.cls-3{fill-rule:evenodd}</style></defs><g id="g168" transform="translate(22.807 13.235)"><g id="g42"><path id="path6" d="m84.365 66.173.043.126 8.412-1.27s-8.047-16.458-14.64-16.87c0 0-9.597-18.015-22.183-19.45l-.241-.35-.49-23.171a1.36 1.36 0 0 0-1.046-1.295C34.478-.83 31.003 1.11 31.003 1.11c-3.708.954-6.79 7.242-7.763 9.433l-.999 8.795c-.415 5.295-.56 11.343-.829 11.584 0 0-6.032 4.01-8.064 15.252l-.004.081C5.289 49.02 1.854 67.867 1.854 67.867l10.397 1.56-.001.016c-.22 7.887-.275 14.055.447 19.207 0 0 6.658 1.69 20.961 1.82.115 2.907.66 16.102 1.157 17.73.316 1.034 3.398.813 6.222.351 2.18-.357 4.206-.858 4.685-1.037 1.099-.412 3.342-.32 3.159-3.48-.16-2.765-.613-11.739-.723-13.932.568-.032 1.136-.063 1.72-.1 4.786-.3 9.11-.698 12.975-1.148 0 0-1.009 4.376-1.402 12.845 0 0 .065 1.244 2.995 1.4 2.93.157 9.486-.083 10.39-.392.904-.31 1.239-2.103 1.513-6.706.275-4.602.545-9.298.545-9.298l-.024.004c7.322-1.433 10.925-2.716 10.925-2.716s-1.1-8.517-3.43-17.818" class="cls-6"/><path id="path8" d="M1.854 67.867S.794 69.97.85 71.086s.481 1.726 1.969 1.016c0 0 .618 1.203 1.58 1.243.96.039 1.985-.9 1.985-.9s.734 1.28 1.702 1.164c.969-.115 1.79-.752 1.79-.752s.565 1 1.527.752c0 0 .412-.34.48-1.255.07-.916 0-2.701 0-2.701z" class="cls-4"/><path id="path10" d="M25.132 9.565s1.476 2.85 1.27 6.112-1.03 5.138-1.03 5.138-4.12-.4-4.257-4.245c-.138-3.846 1.442-6.318 4.017-7.005" class="cls-8"/><path id="path12" d="M55.756 21.96s2.722-.85 2.922-4.36-.618-5.696-2.198-6.677c0 0-.807-.465-.899-.442" class="cls-8"/><path id="line14" d="m8.326 14.603 12.78.895" class="cls-5"/><path id="line16" d="m69.197 16.531-10.388-.526" class="cls-5"/><path id="path18" d="M43.578 7.78c-.442-.152-2.892-.344-4.197 2.232s-.858 4.91 1.889 5.322 3.959-1.971 4.223-3.358c.172-.9-.534-3.722-1.916-4.196" class="cls-8"/><path id="path20" d="M49.51 11.294s-1.75.366-1.923 2.46c-.171 2.095 2.644 2.374 3.194 2.251.55-.122 1.93-.842 2.166-2.422.237-1.58-1.66-2.975-3.437-2.29" class="cls-8"/><path id="path22" d="M41.407 9.829c-.413.181-1.803 1.766-.103 2.815 1.7 1.05 2.696.022 2.835-.674.14-.696-.603-3.08-2.732-2.142" class="cls-6"/><path id="path24" d="M51.521 12.155s-.984-.41-1.549.486c-.565.897.102 1.908 1.104 2.222 1.002.313 2.198-1.934.445-2.708" class="cls-6"/><path id="path26" d="M50.243 115.288c-.214-3.34-2.912-6.947-6.545-7.273l-5.576 1.844c-2.915 2.123-4.22 5.56-3.307 9.77.155.71 2.15 3.862 7.192 3.084 5.043-.778 8.5-3.312 8.236-7.425m-9.213 1.794c-1.9-.138-1.763-2.135-1.763-2.135l4.578-1.802s.595-.34.824 1.602-1.74 2.472-3.64 2.335" class="cls-7"/><path id="path28" d="m72.735 102.956-6.378.191c-2.145.515-5.267 2.053-5.298 6.651-.048 7.011 5.495 6.47 9.568 6.577 4.072.106 7.18-3.202 7.412-6.352.179-2.412-1.31-6.063-5.304-7.067m-4.672 9.904c-2.332.155-3.708-1.775-3.48-3.515.06-.456.303-.826.628-1.124l4.328-1.49c2.128-.085 3.23 1.298 3.377 2.66.183 1.71-2.52 3.315-4.853 3.47" class="cls-7"/><path id="path30" d="M54.031 52.08c-.091-.602-.41-2.48-.64-2.662l-.014.003c-.128-1.865-1.19-3.085-3.197-3.128-2.145-.045-3.501 1.733-3.21 3.522.065.402.227.74.456 1.023l-.168.04s.364 2.5 1.222 2.774c.859.275 3.88.447 5.39-.726 0 0 .253-.245.161-.846" class="cls-7"/><path id="path32" d="m66.094 49.815-.097.034q.01-.135.011-.248c0-.826-.281-3.262-3.256-2.85s-3.49 2.513-3.456 3.214c.017.354.153 1.25.662 1.964h-.001s.46 2.456 1.845 2.639 3.377.137 4.086-1.19c.71-1.328.206-3.563.206-3.563" class="cls-7"/><path id="path34" d="M40.216 49.939c.065-.372.112-.952.024-1.78-.172-1.62-1.717-2.404-3.537-1.958s-2.436 1.244-2.238 2.888q.027.22.08.422h-.001s-.038 2.127.168 2.7c.206.571 2.128 2.265 4.463 1.212 0 0 .527-.274.664-.64.137-.367.452-1.764.45-2.839z" class="cls-7"/><path id="path36" d="M38.214 109.482s.91 5.265 1.508 5.448 4.077-1.19 4.123-1.785-1.453-4.673-1.453-4.673z" class="cls-4"/><path id="path38" d="M65.638 103.149s-.959 5.607 0 5.558c.96-.049 3.995-.53 3.92-1.594s-.385-4.013-.385-4.013" class="cls-4"/><path id="path40" d="M84.767 66.597s.839 4.787 1.717 4.549c.877-.238 1.32-.437 1.38-1.274 0 0 .276.811 1.13.76s1-1.203 1-1.203.627 1.254 1.374 1.013c.747-.24.815-1.339.815-1.339s.937.665 1.447.178.074-2.696 0-2.982c-.073-.286-.81-1.27-.81-1.27z" class="cls-4"/></g><g id="g166"><path id="path44" d="M25.132 9.565s1.476 2.85 1.27 6.112-1.03 5.138-1.03 5.138-4.12-.4-4.257-4.245c-.138-3.846 1.442-6.318 4.017-7.005" class="cls-1"/><path id="path46" d="M31.003 1.11s-1.098 6.258-1.785 12.282-.893 13.558-.893 13.558" class="cls-1"/><path id="path48" d="M55.756 21.96s2.722-.85 2.922-4.36-.618-5.696-2.198-6.677c0 0-.807-.465-.899-.442" class="cls-1"/><path id="path50" d="M23.24 10.543c.973-2.191 4.055-8.479 7.763-9.433 0 0 3.475-1.939 23.217 2.783a1.36 1.36 0 0 1 1.046 1.295l.49 23.17" class="cls-1"/><path id="path52" d="M21.412 30.281s.414-5.648.83-10.943" class="cls-1"/><path id="line54" d="m8.326 14.603 12.78.895" class="cls-1"/><path id="line56" d="m69.197 16.531-10.388-.526" class="cls-1"/><path id="path58" d="M37.794 6.933s5.124-.252 10.034.847 5.386 1.19 5.386 1.19" class="cls-1"/><path id="path60" d="M32.946 17.497s8.667 1.682 12.341 2.3 6.867.378 6.867.378" class="cls-1"/><path id="path62" d="M43.578 7.78c-.442-.152-2.892-.344-4.197 2.232s-.858 4.91 1.889 5.322 3.959-1.971 4.223-3.358c.172-.9-.534-3.722-1.916-4.196" class="cls-1"/><path id="path64" d="M49.51 11.294s-1.75.366-1.923 2.46c-.171 2.095 2.644 2.374 3.194 2.251.55-.122 1.498-.842 1.735-2.422s-1.23-2.975-3.006-2.29" class="cls-1"/><path id="path66" d="M41.407 10.04c-.413.181-1.803 1.766-.103 2.815 1.7 1.05 2.533-.134 2.672-.83s-.44-2.924-2.569-1.986" class="cls-2"/><path id="path68" d="M51.521 12.155s-.984-.41-1.549.486c-.565.897.102 1.908 1.104 2.222 1.002.313 2.198-1.934.445-2.708" class="cls-2"/><path id="path70" d="m12.384 69.447-10.53-1.58s3.478-19.091 11.644-21.666c0 0 2.448 4.086-1.114 23.246" class="cls-1"/><path id="path72" d="m84.408 66.3 8.412-1.271s-8.047-16.458-14.64-16.87" class="cls-1"/><path id="polygon74" d="m33.407 59.262-.756 4.691 38.264 1.373.35-5.686z" class="cls-1"/><path id="path76" d="M12.697 83.593s23.194 1.81 30.05 1.69c6.854-.12 14.506-.952 23.875-2.316 9.37-1.365 20.59-3.22 20.59-3.22" class="cls-1"/><path id="path78" d="M12.25 69.443c-.22 7.887-.275 14.055.447 19.207 0 0 11.624 2.954 37.18 1.352 25.557-1.602 37.918-6.01 37.918-6.01s-2.885-22.334-9.202-34.165c-6.318-11.832-11.606-20.023-26.302-21.73s-23.027-4.18-30.879 2.825c0 0-6.032 4.01-8.064 15.252" class="cls-1"/><path id="path80" d="M41.037 108.551c2.18-.357 4.206-.858 4.685-1.037 1.099-.412 3.342-.32 3.159-3.48-.183-3.159-.748-13.556-.748-13.556" class="cls-1"/><path id="path82" d="M33.636 90.758s.619 15.611 1.18 17.442c.315 1.034 3.397.813 6.22.351" class="cls-1"/><path id="path84" d="M62.853 88.854s-1.009 4.376-1.402 12.845c0 0 .065 1.244 2.995 1.4 2.93.157 9.486-.083 10.39-.392.904-.31 1.239-2.103 1.513-6.706.275-4.602.545-9.298.545-9.298" class="cls-1"/><path id="path86" d="M38.122 109.86c-2.916 2.122-4.22 5.56-3.307 9.769.155.71 2.15 3.862 7.192 3.084 5.043-.778 8.5-3.312 8.236-7.425-.214-3.34-2.912-6.947-6.545-7.273" class="cls-1"/><path id="path88" d="M38.214 109.482s.91 5.265 1.508 5.448 4.077-1.19 4.123-1.785-1.453-4.673-1.453-4.673z" class="cls-1"/><path id="path90" d="M65.638 103.149s-.959 5.607 0 5.558c.96-.049 3.995-.53 3.92-1.594s-.385-4.013-.385-4.013" class="cls-1"/><path id="path92" d="M39.267 114.947s-.137 1.997 1.763 2.135 3.868-.393 3.639-2.335-.824-1.602-.824-1.602" class="cls-1"/><path id="path94" d="M65.21 108.22c-.324.299-.566.669-.626 1.125-.23 1.74 1.147 3.67 3.479 3.515s5.036-1.759 4.853-3.47c-.146-1.36-1.249-2.744-3.377-2.658" class="cls-1"/><path id="path96" d="M3.306 63.422s5.896.089 9.733 1.041" class="cls-1"/><path id="path98" d="M2.361 65.611s3.808.758 9.962.876" class="cls-1"/><path id="path100" d="M83.181 61.78s5.618-.75 7.563-.434" class="cls-1"/><path id="path102" d="M91.768 63.183s-3.573.713-7.947.823" class="cls-1"/><path id="path104" d="M32.81 62.973s10.487-1.397 20.58-1.41c10.095-.013 17.733.376 17.733.376" class="cls-1"/><path id="path106" d="M66.008 49.6c0-.825-.281-3.261-3.256-2.85-2.975.413-3.49 2.514-3.456 3.215.034.7.525 3.516 3.456 2.863 2.93-.652 3.256-2.402 3.256-3.227" class="cls-1"/><path id="path108" d="M53.39 49.815s-.275 1.44-2.129 1.915c-1.853.474-4.001-.126-4.292-1.915s1.065-3.567 3.211-3.522 3.21 1.436 3.21 3.522" class="cls-1"/><path id="path110" d="M40.073 50.46s-.425.917-2.292 1.042c-1.868.125-3.119-.769-3.316-2.413-.198-1.644.418-2.442 2.238-2.888s3.365.339 3.537 1.958-.167 2.3-.167 2.3" class="cls-1"/><path id="path112" d="M47.258 50.878s.364 2.5 1.222 2.774c.859.275 3.88.447 5.39-.726 0 0 .253-.245.161-.847-.091-.601-.41-2.478-.64-2.661" class="cls-1"/><path id="path114" d="M59.957 51.93s.46 2.455 1.845 2.638 3.377.137 4.086-1.19c.71-1.328.206-3.563.206-3.563" class="cls-1"/><path id="path116" d="M34.544 49.511s-.038 2.127.168 2.7c.206.571 2.128 2.265 4.463 1.212 0 0 .527-.274.664-.64.137-.367.452-1.764.45-2.839" class="cls-1"/><path id="path118" d="M83.753 117.528s-6.401-1.089-15.156-1.094c-8.724-.005-18.578.98-18.578.98" class="cls-1"/><path id="path120" d="M66.357 103.147c-2.145.515-5.267 2.053-5.298 6.651-.048 7.011 5.495 6.47 9.568 6.577 4.072.106 7.18-3.202 7.412-6.352.179-2.412-1.31-6.063-5.304-7.067" class="cls-1"/><path id="path122" d="M31.484 86.651s-1.058-.733-1.55.69c-.493 1.422 1.423 1.298 1.727 1.12.304-.179.493-1.466-.177-1.81"/><path id="path124" d="M16.287 86.462s-.084-.684.81-.805c.893-.122.922.443.899.727-.023.285-.075.645-.624.834-.55.189-1.089-.258-1.085-.756"/><path id="path126" d="M51.777 86.755s.24-.636.978-.584c.738.051.7.655.651.978-.048.324-.226.83-.954.74-.727-.087-.725-.81-.675-1.134"/><path id="path128" d="M70.504 85.26s.242.72 1.384.482.57-1.727-.114-1.686c-.684.04-1.41.17-1.27 1.204"/><path id="path130" d="M82.931 82.714s.348.942 1.318.387.193-1.806-.517-1.636-.943 1.006-.8 1.25"/><path id="path132" d="M11.81 49.944s-1.143-.257-1.396 1.03c-.252 1.288.938 1.751 1.69 1.356.753-.394.278-2.41-.294-2.386"/><path id="path134" d="M81.458 51.206s1.312.453 1.106 1.621c-.205 1.17-2.042.504-2.057.099-.014-.405-.664-1.798.951-1.72"/><path id="path136" d="M36.513 111.356s-1.424 4.856.67 7.157c2.095 2.3 7.177.96 8.894-1.1 1.716-2.06.287-6.773-2.878-6.837" class="cls-1"/><path id="path138" d="M65.064 106.254s-2.796 3.125-.505 5.735 6.445 2.472 9.158 1.03 1.82-5.633-.137-6.765-4.041-1.132-4.041-1.132" class="cls-1"/><path id="path140" d="M1.854 67.867s-1.605 3.09-1.038 4.19c.675 1.308 2.335-.293 2.537-1.191.135-.6.34-1.632.35-2.472" class="cls-1"/><path id="path142" d="M7.024 68.828s-.4 2.088-1.028 3.563c-.164.384-.7.85-1.077.919-.934.17-1.832-.221-1.566-2.444" class="cls-1"/><path id="path144" d="M9.875 69.424s.007 3.4-.61 3.937c-.591.514-2.825.747-2.881-1.984" class="cls-1"/><path id="path146" d="M12.034 72.766s-.265.79-.96.842c-.608.046-1.41-.998-1.344-1.737" class="cls-1"/><path id="path148" d="M92.697 64.92c.828 1.1 1.35 3.31 1.217 3.915-.137.63-1.013.967-1.677-.068s-1.105-2.137-1.475-3.404" class="cls-1"/><path id="path150" d="M88.994 65.598s.625 2.461.852 3.4c.356 1.466 1.889 2.129 2.095.566.134-1.022-.492-2.294-.492-2.294" class="cls-1"/><path id="path152" d="M86.91 66.022s.292 3.298 1.226 4.205c.766.745 1.9.573 1.652-1.468" class="cls-1"/><path id="path154" d="M84.95 68.598s.626 2.81 2.02 2.528c1.005-.202.582-1.935.582-1.935" class="cls-1"/><path id="path156" d="M34.527 118.73s-5.27.458-9.207 0" class="cls-1"/><path id="path158" d="M33.848 94.494s3.292.681 6.657.615 7.87-.615 7.87-.615" class="cls-3"/><path id="path160" d="M33.897 96.955s3.243 1.354 6.701 1.354c3.459 0 7.778-.893 7.778-.893" class="cls-3"/><path id="path162" d="M62.651 93.12s8.544 1.138 13.698.249" class="cls-1"/><path id="path164" d="M61.892 95.539s1.765.898 4.61 1.081c3.985.256 9.847-.187 9.847-.187" class="cls-1"/></g></g></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/knowyourmeme-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/knowyourmeme-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3704.881 3733.965"><g transform="translate(1743.864 1673.071)"><circle cx="108.576" cy="193.904" r="1866.975" style="fill:#13133e;stroke-width:140.586;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.53144;fill-opacity:1"/><path d="M-743.183-600.259v1558.18h-191.003v361.9H-79.7v-361.9h-231.214V294.439l653.43 663.482h-180.95v361.9h989.772v-361.9h-229.21L136.434 128.567l785.692-728.826h229.211v-331.74H282.2v331.74h100.527L-310.914 58.198v-658.457H-79.7v-331.74h-854.486v331.74z" style="fill:#fff;fill-opacity:1;stroke:none;stroke-width:31.9286px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/></g></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-128.png b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-128.png Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-16.png b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-16.png Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-32.png b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-32.png Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-48.png b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-48.png Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-64.png b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-64.png Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-96.png b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect-96.png Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect.png b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect.png Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/libredirect.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 333.369 333.369"><path d="M166.684 0a13.74 13.74 0 0 0-9.748 4.051L4.051 156.935a13.76 13.76 0 0 0 0 19.5l152.885 152.883a13.757 13.757 0 0 0 19.498 0l152.884-152.884a13.76 13.76 0 0 0 0-19.499L176.434 4.051A13.75 13.75 0 0 0 166.684 0"/><path fill="#fbc118" d="M166.684 0a13.74 13.74 0 0 0-9.748 4.051L4.051 156.935a13.76 13.76 0 0 0 0 19.5l152.885 152.883a13.757 13.757 0 0 0 19.498 0l152.884-152.884a13.76 13.76 0 0 0 0-19.499L176.434 4.051A13.75 13.75 0 0 0 166.684 0m0 10.72a12.86 12.86 0 0 1 9.123 3.79L318.86 157.562a12.873 12.873 0 0 1 0 18.245L175.807 318.86a12.873 12.873 0 0 1-18.245 0L14.51 175.807a12.873 12.873 0 0 1 0-18.245L157.562 14.51a12.86 12.86 0 0 1 9.122-3.79"/><rect width="211.979" height="211.979" x="-105.99" y="129.738" fill="#fbc117" ry="11.989" transform="rotate(-45)"/><path d="M184.948 150.313c-47.943 20.638-46.951 86.743-46.951 86.743h-33.492s-.437-96.715 73.158-116.434c-6.913-13.854-10.362-19.427-5.933-21.62 5.935-2.94 68.022 11.716 70.346 20.393 2.286 8.528-46.827 53.143-53.656 53.143-5.852 0-4.229-7.023-3.472-22.225"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/maps-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/maps-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#fff" d="m20.5 3-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5M10 5.47l4 1.4v11.66l-4-1.4zm-5 .99 3-1.01v11.7l-3 1.16zm14 11.08-3 1.01V6.86l3-1.16z"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/maps-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/maps-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m20.5 3-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5M10 5.47l4 1.4v11.66l-4-1.4zm-5 .99 3-1.01v11.7l-3 1.16zm14 11.08-3 1.01V6.86l3-1.16z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/medium-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/medium-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2084.315 2084.315"><circle cx="1042.158" cy="1042.158" r="1042.158" style="fill:#000;fill-rule:evenodd;stroke-width:6.70974;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.411765;paint-order:stroke fill markers;stop-color:#000"/><circle cx="657.158" cy="1042.158" r="500" style="fill:#fff"/><ellipse cx="1453.158" cy="1043.158" rx="250" ry="475" style="fill:#fff"/><ellipse cx="1839.158" cy="1044.158" rx="88" ry="424" style="fill:#fff"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/meet-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/meet-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 96 960 960"><path fill="#fff" d="M0 816v-63q0-43 44-70t116-27q13 0 25 .5t23 2.5q-14 21-21 44t-7 48v65zm240 0v-65q0-32 17.5-58.5T307 646t76.5-30 96.5-10q53 0 97.5 10t76.5 30 49 46.5 17 58.5v65zm540 0v-65q0-26-6.5-49T754 659q11-2 22.5-2.5t23.5-.5q72 0 116 26.5t44 70.5v63zm-455-80h311q-10-20-55.5-35T480 686t-100.5 15-54.5 35M160 616q-33 0-56.5-23.5T80 536q0-34 23.5-57t56.5-23q34 0 57 23t23 57q0 33-23 56.5T160 616m640 0q-33 0-56.5-23.5T720 536q0-34 23.5-57t56.5-23q34 0 57 23t23 57q0 33-23 56.5T800 616m-320-40q-50 0-85-35t-35-85q0-51 35-85.5t85-34.5q51 0 85.5 34.5T600 456q0 50-34.5 85T480 576m0-80q17 0 28.5-11.5T520 456t-11.5-28.5T480 416t-28.5 11.5T440 456t11.5 28.5T480 496m0-40"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/meet-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/meet-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 96 960 960"><path d="M0 816v-63q0-43 44-70t116-27q13 0 25 .5t23 2.5q-14 21-21 44t-7 48v65zm240 0v-65q0-32 17.5-58.5T307 646t76.5-30 96.5-10q53 0 97.5 10t76.5 30 49 46.5 17 58.5v65zm540 0v-65q0-26-6.5-49T754 659q11-2 22.5-2.5t23.5-.5q72 0 116 26.5t44 70.5v63zm-455-80h311q-10-20-55.5-35T480 686t-100.5 15-54.5 35M160 616q-33 0-56.5-23.5T80 536q0-34 23.5-57t56.5-23q34 0 57 23t23 57q0 33-23 56.5T160 616m640 0q-33 0-56.5-23.5T720 536q0-34 23.5-57t56.5-23q34 0 57 23t23 57q0 33-23 56.5T800 616m-320-40q-50 0-85-35t-35-85q0-51 35-85.5t85-34.5q51 0 85.5 34.5T600 456q0 50-34.5 85T480 576m0-80q17 0 28.5-11.5T520 456t-11.5-28.5T480 416t-28.5 11.5T440 456t11.5 28.5T480 496m0-40"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/mozhi-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/mozhi-icon.svg @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="512" + height="512" + viewBox="0 0 512 512" + version="1.1" + id="svg1" + sodipodi:docname="mozhi.svg" + inkscape:version="1.3 (0e150ed6c4, 2023-07-21)" + inkscape:export-filename="mozhi.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#eeeeee" + borderopacity="1" + inkscape:showpageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="false" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="px" + inkscape:zoom="0.85449218" + inkscape:cx="126.39086" + inkscape:cy="247.51543" + inkscape:window-width="1888" + inkscape:window-height="1060" + inkscape:window-x="32" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer1" + showgrid="false" /> + <defs + id="defs1"> + <rect + x="447.58857" + y="274.24914" + width="82.898286" + height="70.866286" + id="rect6" /> + <rect + x="444.70632" + y="249.71617" + width="91.789733" + height="104.34795" + id="rect5" /> + <rect + x="417.77323" + y="221.92324" + width="75.620828" + height="87.946305" + id="rect4" /> + <rect + x="31.513527" + y="105.19809" + width="77.838314" + height="113.70924" + id="rect3" /> + <rect + x="444.05983" + y="63.136958" + width="55.320802" + height="148.09968" + id="rect2" /> + </defs> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <circle + style="fill:#f57c00;stroke-width:4.40315;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.53144;fill-opacity:1" + id="path1" + cx="256" + cy="256" + r="256" /> + <g + id="g11" + transform="translate(-1.6455033e-8,-8.8717685)"> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:462.93px;line-height:0;font-family:FreeSerif;-inkscape-font-specification:FreeSerif;letter-spacing:0.52px;word-spacing:1.62px;white-space:pre;inline-size:0;display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none;stroke-width:3.47197" + x="110.57372" + y="306.22528" + id="text1" + transform="translate(4.9270244,-6.9413264)" + inkscape:label="Tamil"><tspan + id="tspan1" + x="110.57372" + y="306.22528" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0;font-family:FreeSerif;-inkscape-font-specification:FreeSerif;letter-spacing:0.52px;word-spacing:1.62px;stroke-width:3.47197">ழ</tspan></text> + <text + xml:space="preserve" + id="text2" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect2);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none" + transform="matrix(2.799327,0,0,3.3785361,-962.26923,-98.905679)" + inkscape:label="O"><tspan + x="444.06055" + y="98.527344" + id="tspan6">O</tspan></text> + <text + xml:space="preserve" + id="text3" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect3);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none" + transform="matrix(2.9268206,0,0,2.9268206,53.853031,-147.27301)" + inkscape:label="M"><tspan + x="31.513672" + y="140.58789" + id="tspan7">M</tspan></text> + <text + xml:space="preserve" + id="text4" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect4);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none" + transform="matrix(3.1593397,0,0,2.8648022,-1159.7463,-343.82656)" + inkscape:label="Z"><tspan + x="417.77344" + y="257.31445" + id="tspan8">Z</tspan></text> + <text + xml:space="preserve" + id="text5" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect5);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none" + transform="matrix(2.900492,0,0,2.900492,-998.44727,-381.36539)" + inkscape:label="H"><tspan + x="444.70703" + y="285.10742" + id="tspan9">H</tspan></text> + <g + id="g10" + inkscape:label="I"> + <path + id="path10" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect6);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none" + d="m 452.34766,289.85002 c 0.22541,-0.20952 0.45142,-0.41589 0.67406,-0.63903 0.32908,-0.32981 0.65502,-0.67506 0.97635,-1.03568 0.32133,-0.36061 0.63824,-0.73678 0.94979,-1.12946 0.31155,-0.39269 0.61727,-0.80176 0.91702,-1.22778 0.29975,-0.42602 0.59324,-0.86886 0.87916,-1.32948 0.28593,-0.46063 0.56447,-0.93921 0.83453,-1.43571 0.16921,-0.31108 0.32867,-0.64231 0.491,-0.96787 h -7.06609 c -0.0345,0.0663 -0.0646,0.13695 -0.0994,0.20284 -0.32015,0.60473 -0.65585,1.19202 -1.00573,1.75663 -0.32204,0.51971 -0.65924,1.01474 -1.0046,1.49221 l 3.45395,1.58826 z" + transform="matrix(3.4567616,0,0,3.4567616,-1200.9959,-724.14164)" /> + <path + id="path9" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect6);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none" + d="m 451.63291,310.64486 h 10.2347 v -3.43981 l -3.47993,-1.60013 v -18.47997 l 3.47993,-1.60013 v -3.43981 h -3.79804 c -0.16233,0.32556 -0.32179,0.65679 -0.491,0.96787 -0.27006,0.4965 -0.5486,0.97508 -0.83453,1.43571 -0.28592,0.46062 -0.57941,0.90346 -0.87916,1.32948 -0.29975,0.42602 -0.60547,0.83509 -0.91702,1.22778 -0.31155,0.39268 -0.62846,0.76885 -0.94979,1.12946 -0.32133,0.36062 -0.64727,0.70587 -0.97635,1.03568 -0.22264,0.22314 -0.44865,0.42951 -0.67406,0.63903 v 15.18763 h 0.14634 c 0.46872,0 0.87071,0.0248 1.20969,0.0729 0.33899,0.0481 0.61522,0.11925 0.83284,0.21132 0.10881,0.046 0.20303,0.0975 0.28307,0.15368 0.08,0.0562 0.14601,0.11772 0.19832,0.18363 0.0523,0.0659 0.0908,0.13625 0.11639,0.21132 0.0256,0.0751 0.0384,0.15474 0.0384,0.23844 0,0.13392 -0.0422,0.48538 -0.15312,0.93736 -0.0554,0.22599 -0.12811,0.47691 -0.22149,0.73847 -0.0934,0.26157 -0.20712,0.53392 -0.34522,0.80176 -0.13811,0.26784 -0.30024,0.53151 -0.48987,0.77633 -0.18964,0.24482 -0.4069,0.47082 -0.65486,0.66333 -0.12398,0.0963 -0.25567,0.18392 -0.39551,0.2616 -0.13984,0.0777 -0.28812,0.14513 -0.44466,0.20058 -0.15655,0.0554 -0.32142,0.0987 -0.49552,0.12826 -0.10754,0.0183 -0.22508,0.021 -0.33958,0.0283 z" + transform="matrix(3.4567616,0,0,3.4567616,-1200.9959,-724.14164)" /> + <path + id="path8" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect6);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none" + d="m 451.63291,310.64486 c 0.1145,-0.007 0.23204,-0.01 0.33958,-0.0283 0.1741,-0.0295 0.33897,-0.0728 0.49552,-0.12826 0.15654,-0.0555 0.30482,-0.12289 0.44466,-0.20058 0.13984,-0.0777 0.27153,-0.16534 0.39551,-0.2616 0.24796,-0.19251 0.46522,-0.41851 0.65486,-0.66333 0.18963,-0.24482 0.35176,-0.50849 0.48987,-0.77633 0.1381,-0.26784 0.25184,-0.54019 0.34522,-0.80176 0.0934,-0.26156 0.16604,-0.51248 0.22149,-0.73847 0.1109,-0.45198 0.15312,-0.80344 0.15312,-0.93736 0,-0.0837 -0.0128,-0.16337 -0.0384,-0.23844 -0.0256,-0.0751 -0.0641,-0.1454 -0.11639,-0.21132 -0.0523,-0.0659 -0.11828,-0.12739 -0.19832,-0.18363 -0.08,-0.0562 -0.17426,-0.10765 -0.28307,-0.15368 -0.21762,-0.0921 -0.49385,-0.16319 -0.83284,-0.21132 -0.33898,-0.0481 -0.74097,-0.0729 -1.20969,-0.0729 h -0.14634 v 0.56727 l -3.47994,1.60013 v 3.43981 z" + transform="matrix(3.4567616,0,0,3.4567616,-1200.9959,-724.14164)" /> + </g> + </g> + </g> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/office-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/office-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e3e3e3"><path d="M320-240h320v-80H320v80Zm0-160h320v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/office-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/office-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M320-240h320v-80H320v80Zm0-160h320v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pastebin-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pastebin-icon-light.svg @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + fill="#000000" + width="800px" + height="800px" + viewBox="0 0 24 24" + role="img" + version="1.1" + id="svg1" + sodipodi:docname="pastebin-icon.svg" + inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1" /> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="1.3225" + inkscape:cx="576.55955" + inkscape:cy="353.49716" + inkscape:window-width="2560" + inkscape:window-height="1316" + inkscape:window-x="-12" + inkscape:window-y="-12" + inkscape:window-maximized="1" + inkscape:current-layer="svg1" /> + <title + id="title1">Pastebin icon</title> + <path + d="M17.02 0a2.096 2.096 0 00-.723.123L2.623 5.003A2.101 2.101 0 001.35 7.69l5.324 14.916a2.101 2.101 0 002.685 1.272l7.746-2.765c.792-.307 1.345-.534 1.464-.608.543-.314.962-.817 1.964-2.334.904-1.362 1.859-3.323 2.097-4.28.24-.97.239-1.48-.502-3.675h.001l-3.147-8.82A2.102 2.102 0 0017.02 0zm-.084.414c.72-.031 1.4.403 1.657 1.12l3.147 8.82.008-.003c.271.763.497 1.415.526 1.54.102.433-.282 1.147-.737 1.35-.2.1-.71.293-1.142.429-1.397.464-2.05.879-2.458 1.548-.363.591-.315 1.18.16 2.377.462 1.142.533 1.864.225 2.4-.113.188-.301.322-1.354.733l-.002-.005-7.746 2.765a1.68 1.68 0 01-2.157-1.022L1.74 7.55a1.68 1.68 0 011.022-2.157L16.436.513c.165-.06.334-.092.5-.099zM15.9 2.25l-.708.515-.495.37.113.314.074.205.523-.316.4 1.112.403 1.123-.359.129-.337.12c.045.145.216.642.238.664l2.166-.779-.238-.663-.244.088-.443.16-.334-.93zm-3.29 1.182l-.709.515-.494.37.113.314.073.205.524-.316.4 1.112.403 1.123-.36.129-.337.121c.046.144.216.64.238.663l2.167-.778-.238-.663-.244.087-.443.16-.334-.93zM9.084 4.786a1.532 1.532 0 00-.8.223c-.732.448-.85 1.383-.332 2.558.337.776.873 1.218 1.462 1.215 1.345-.007 1.86-1.399 1.085-2.95-.307-.66-.837-1.036-1.415-1.046zm-.191.672c.168-.009.357.085.539.279.145.155.347.51.437.787.35.998.164 1.688-.414 1.546C8.854 7.93 8.21 6 8.62 5.585a.407.407 0 01.273-.127zm-3.765.75a1.532 1.532 0 00-.8.223c-.732.448-.85 1.382-.332 2.557.337.777.873 1.218 1.462 1.215 1.344-.007 1.86-1.398 1.085-2.95-.307-.66-.838-1.036-1.415-1.045zm-.192.672c.168-.01.358.085.54.278.145.155.347.51.437.787.35.999.164 1.689-.415 1.547-.6-.141-1.243-2.072-.834-2.485a.407.407 0 01.272-.127zm13.362.655a1.533 1.533 0 00-.8.223c-.732.448-.85 1.382-.332 2.558.337.776.873 1.218 1.462 1.215 1.345-.007 1.86-1.399 1.085-2.95-.307-.66-.837-1.036-1.415-1.046zm-.191.672c.168-.009.357.085.539.278.145.155.347.51.437.787.35.999.164 1.689-.414 1.547-.601-.141-1.244-2.072-.835-2.485a.407.407 0 01.273-.127zm-3.766.75a1.532 1.532 0 00-.8.222c-.73.448-.848 1.383-.331 2.558.337.776.873 1.218 1.462 1.215 1.344-.007 1.86-1.398 1.085-2.95-.307-.66-.838-1.036-1.416-1.045zm-.19.671c.167-.009.357.085.539.279.145.155.347.51.437.787.35.998.164 1.688-.415 1.547-.6-.142-1.244-2.072-.835-2.485a.408.408 0 01.273-.128zm-3.746.743a1.533 1.533 0 00-.8.223c-.732.448-.85 1.382-.332 2.557.337.777.873 1.219 1.462 1.216 1.345-.007 1.86-1.399 1.085-2.951-.307-.66-.838-1.036-1.415-1.045zm-.192.672c.169-.01.358.085.54.278.145.155.347.51.437.787.35.999.164 1.689-.414 1.547-.601-.141-1.244-2.072-.835-2.485a.407.407 0 01.272-.127zm-3.515.616l-.708.515-.495.369.113.314.074.206.524-.316.399 1.112.403 1.122-.359.13-.337.12c.045.145.216.641.238.663l2.166-.778-.238-.663-.244.088-.443.159-.334-.93zm15.664 1.33c.034 0 .049.047.064.135.023.11-.064.545-.195.957-.469 1.436-2.052 4.224-3.079 5.397l-.408.47.051-.667c.03-.567-.016-.812-.377-1.71-.496-1.263-.533-1.73-.158-2.31.341-.514 1.028-.907 2.448-1.371.72-.238 1.175-.463 1.385-.664.132-.145.207-.22.253-.235a.05.05 0 01.015-.003zm-6.429 1.477l-.708.515-.495.37.113.314.074.205.523-.316.4 1.112.403 1.123-.359.129-.337.12c.045.145.216.642.238.664l2.166-.779-.238-.662-.244.087-.443.16-.334-.93zm-3.579 1.33a1.532 1.532 0 00-.8.223c-.731.448-.849 1.382-.332 2.558.337.776.873 1.218 1.462 1.215 1.345-.007 1.86-1.399 1.086-2.95-.307-.66-.838-1.036-1.416-1.046zm-.191.672c.168-.009.358.085.54.279.144.154.346.51.437.787.35.998.164 1.688-.415 1.546-.6-.141-1.244-2.072-.835-2.485a.407.407 0 01.273-.127zm-3.515.616l-.71.515-.494.37.113.313.074.206.524-.316.4 1.112.403 1.122-.36.13-.337.12c.045.145.216.642.238.664l2.166-.779-.238-.663-.244.088-.443.16-.334-.93z" + id="path1" /> + <path + style="fill:#ffffff;stroke-width:0.756144" + d="m 279.27013,785.23388 c -6.44477,-1.16159 -15.83952,-4.96099 -21.38867,-8.65006 -7.54802,-5.01792 -15.01204,-13.33726 -18.79768,-20.95171 C 235.28985,748.001 57.160329,248.89816 56.010178,242.67642 51.618831,218.92144 64.293703,193.51301 85.727784,183.10362 90.672621,180.70218 541.53595,19.415032 552.74102,16.039178 c 6.58236,-1.983128 20.2701,-2.141832 27.22117,-0.315618 16.15821,4.245152 30.81215,16.386799 37.45063,31.030036 0.97444,2.149416 25.07724,69.238844 53.56178,149.087614 28.48455,79.84877 53.13667,148.75236 54.78251,153.11909 1.64585,4.36673 6.12511,17.12666 9.95392,28.35539 6.84017,20.06009 6.95514,20.5149 6.59741,26.09787 -0.66628,10.39821 -7.4581,23.8563 -15.8448,31.39666 -6.53195,5.87278 -14.56019,9.41562 -44.7943,19.76753 -19.69095,6.74204 -28.83342,10.31944 -40.08144,15.68372 -23.17173,11.05078 -37.21371,23.49516 -46.21683,40.95856 -4.50301,8.73451 -5.87643,15.66767 -5.36155,27.06554 0.60359,13.36171 3.5401,24.09301 14.40459,52.64071 9.27998,24.38422 12.29606,38.17149 11.64005,53.20961 -0.40655,9.31969 -1.48776,13.83134 -4.93309,20.58475 -3.39185,6.64856 -11.58635,11.83099 -31.91502,20.18391 -11.1918,4.59864 -265.84814,95.72623 -275.61437,98.62732 -6.83669,2.03085 -18.11701,2.82027 -24.32155,1.70201 z m 40.95671,-87.34869 c 19.54632,-7.00144 35.61534,-12.76982 35.70893,-12.81861 0.0936,-0.0488 -1.66884,-5.17283 -3.91653,-11.38672 -3.20602,-8.86326 -4.35557,-11.24715 -5.3343,-11.06201 -0.68618,0.12979 -5.72903,1.88262 -11.20634,3.89516 -5.47731,2.01255 -10.18961,3.43754 -10.47176,3.16666 -0.28217,-0.27089 -8.5645,-22.94999 -18.40518,-50.39801 -9.84068,-27.44801 -18.00082,-50.0167 -18.13364,-50.15264 -0.57456,-0.58807 -40.4529,29.07041 -40.4529,30.08579 0,1.0021 5.43829,16.19041 6.04677,16.88768 0.28872,0.33085 4.32806,-1.67473 8.97633,-4.45684 4.64825,-2.78211 8.55765,-4.92426 8.68755,-4.76033 0.18579,0.23447 9.08754,24.98282 25.97292,72.20908 0.17262,0.48279 -4.41123,2.52575 -10.89315,4.85495 -6.15514,2.21177 -11.34072,4.14123 -11.52348,4.28769 -1.00508,0.80536 7.39675,23.11922 8.54552,22.69547 0.47328,-0.17457 16.85295,-6.04587 36.39926,-13.04732 z m 116.37353,-39.64356 c 15.58691,-3.98646 26.74522,-14.68689 31.9536,-30.64239 1.6441,-5.03656 2.03477,-7.88446 2.33384,-17.01323 0.56725,-17.3149 -2.54565,-30.58871 -11.46274,-48.87842 -7.49034,-15.36334 -15.85653,-24.55474 -27.8702,-30.61922 -22.05753,-11.13461 -52.35358,-1.58408 -62.81135,19.80065 -4.2477,8.68598 -5.34762,13.93554 -5.29943,25.29245 0.048,11.3098 1.19238,17.60071 5.63958,31.00189 8.59765,25.90809 22.38365,43.6418 39.02627,50.20171 4.93339,1.94457 6.1573,2.12769 15.02053,2.24731 5.40895,0.073 9.32935,-0.33178 13.4699,-1.39075 z m 125.9394,-47.40455 c 19.35549,-6.93186 35.4316,-12.80303 35.72468,-13.04707 0.54516,-0.4539 -6.56765,-21.12186 -7.64333,-22.20953 -0.3269,-0.33054 -5.43751,1.15701 -11.35691,3.30566 -6.06449,2.20132 -11.04169,3.61891 -11.40204,3.24749 -0.35173,-0.36253 -8.6208,-22.87735 -18.37572,-50.03293 -9.75492,-27.15557 -17.93726,-49.57482 -18.18298,-49.82054 -0.24572,-0.24573 -3.43395,1.70789 -7.08495,4.34135 -6.07717,4.38347 -32.71533,24.01178 -33.39393,24.6063 -0.15989,0.14009 1.15852,4.35036 2.92981,9.35617 l 3.22054,9.10146 2.36319,-1.44485 c 1.29976,-0.79468 5.25192,-3.1744 8.78258,-5.2883 l 6.41939,-3.84342 0.97344,2.82742 c 0.53541,1.55507 6.44654,18.07293 13.13586,36.70633 6.68932,18.6334 12.0393,33.98138 11.88883,34.10662 -0.15047,0.12524 -5.29248,2.01967 -11.4267,4.20985 -6.13421,2.19017 -11.15312,4.21692 -11.15312,4.50389 0,0.6566 3.8244,11.86162 6.0172,17.62965 0.90909,2.3913 2.03977,4.34782 2.51262,4.34782 0.47285,0 16.69604,-5.67151 36.05154,-12.60337 z M 255.19849,517.05779 c 19.13043,-6.8679 35.00094,-12.70737 35.26779,-12.9766 0.44578,-0.44975 -6.77905,-21.41659 -7.69039,-22.31789 -0.21994,-0.21752 -5.42979,1.42484 -11.57742,3.64971 -11.03303,3.99293 -11.18543,4.02417 -11.78883,2.4163 -0.33621,-0.89591 -8.49527,-23.56117 -18.13124,-50.36722 -9.63597,-26.80607 -17.6625,-48.88084 -17.83671,-49.05507 -0.17423,-0.17421 -2.62763,1.37789 -5.45201,3.44912 -21.12983,15.49535 -34.67748,25.44743 -34.97069,25.6894 -0.36663,0.30257 4.1551,13.79541 5.58254,16.65825 0.83374,1.67216 0.92681,1.63895 9.0056,-3.21361 4.48974,-2.69677 8.40367,-4.90322 8.69763,-4.90322 0.38023,0 21.11011,56.80686 26.37808,72.28484 0.16138,0.47414 -4.50971,2.53333 -10.90729,4.80834 -6.15425,2.1885 -11.30958,4.09038 -11.4563,4.22641 -0.29399,0.27258 1.89899,7.1433 5.37401,16.83699 1.81557,5.0646 2.49289,6.1896 3.48787,5.79323 0.67911,-0.27053 16.88692,-6.11108 36.01736,-12.97898 z M 371.57202,477.5233 c 3.21221,-0.82155 7.94528,-2.5944 10.51792,-3.93967 5.94874,-3.11066 14.50965,-11.66028 17.65231,-17.629 9.21941,-17.51006 8.65656,-41.91679 -1.54582,-67.03225 -10.22284,-25.16583 -24.07876,-38.74857 -43.51168,-42.65384 -10.57016,-2.1242 -19.44451,-0.77043 -30.94983,4.72135 -12.34188,5.89109 -20.44742,15.90694 -24.05838,29.72845 -1.72054,6.58564 -1.7031,20.85758 0.0364,29.75123 1.9929,10.18949 6.03297,21.75774 11.3958,32.63062 9.40244,19.06296 21.66662,30.8471 36.1688,34.75309 5.9442,1.60099 17.3502,1.44607 24.29451,-0.32998 z m 133.91002,-47.95687 c 28.69137,-9.07947 39.60962,-41.75464 26.78637,-80.16388 -2.90793,-8.71005 -8.64791,-20.78488 -12.83764,-27.0057 -7.0226,-10.42699 -17.57099,-18.6387 -28.31546,-22.04304 -4.27632,-1.35493 -7.03588,-1.67166 -14.36673,-1.64897 -7.9341,0.0246 -9.83256,0.29272 -15.11561,2.13507 -22.10142,7.7074 -33.13142,25.13059 -31.89936,50.38882 0.69899,14.32975 4.66313,28.70353 12.21837,44.30319 9.83922,20.31549 23.95616,32.92064 40.46768,36.13396 4.69198,0.91311 17.11687,-0.21797 23.06238,-2.09945 z m 127.64807,-46.18544 c 11.74851,-2.48935 23.44548,-10.86546 29.06068,-20.8101 4.64914,-8.23374 6.43127,-15.17626 6.82771,-26.59826 0.57479,-16.56008 -2.09991,-29.30663 -9.67056,-46.08592 -8.22569,-18.23113 -18.5176,-29.61079 -32.01172,-35.39505 -17.21714,-7.38013 -39.1577,-2.98009 -52.74892,10.57845 -10.89259,10.8664 -15.21693,26.6553 -12.5179,45.70494 2.38598,16.84015 9.71775,36.26939 18.78767,49.78751 7.2137,10.75153 19.15668,19.97658 29.44444,22.74358 5.28148,1.42051 16.3071,1.45667 22.8286,0.0748 z m -441.3577,-43.87908 c 14.61662,-2.48313 26.57241,-11.22303 32.70583,-23.90855 4.48928,-9.28502 5.66401,-14.97338 5.67971,-27.50262 0.0194,-15.486 -3.03474,-28.13586 -10.73378,-44.45782 -8.60185,-18.23591 -19.08309,-28.83796 -33.98633,-34.37807 -6.82334,-2.5365 -18.63547,-3.14823 -26.2696,-1.36047 -18.21961,4.26669 -31.90069,17.72191 -35.5549,34.96795 -1.43254,6.76089 -1.41025,19.53018 0.0488,27.92709 0.64175,3.69342 2.5254,10.78486 4.18589,15.75875 10.23213,30.64972 25.66692,48.54544 45.68699,52.97135 6.087,1.34567 10.23619,1.34166 18.23744,-0.0176 z m 133.74744,-47.62996 c 16.7879,-3.51257 28.97611,-15.12486 34.52411,-32.89274 1.56882,-5.02428 1.769,-7.13718 1.75512,-18.52552 -0.0139,-11.38891 -0.24536,-13.76484 -2.03026,-20.8396 -3.65639,-14.49273 -11.78294,-31.96741 -18.96173,-40.77374 -10.88887,-13.35757 -25.85924,-20.38565 -41.3742,-19.42379 -21.187,1.3135 -38.41258,14.83657 -43.50789,34.15622 -3.09244,11.72544 -1.90606,27.91936 3.21295,43.85633 8.50825,26.48864 20.66783,43.44597 37.08897,51.723 7.38327,3.72152 19.24273,4.82266 29.29293,2.71984 z m 125.91404,-48.76162 c 19.66492,-7.06436 35.91636,-13.00627 36.11433,-13.20423 0.61905,-0.61905 -6.96865,-21.73594 -7.95025,-22.12587 -0.51224,-0.20348 -5.74576,1.3776 -11.63005,3.51351 -5.8843,2.13591 -10.79496,3.78618 -10.91259,3.66727 -0.11763,-0.11892 -8.03916,-21.99315 -17.60342,-48.6094 -9.56426,-26.61626 -17.75305,-49.33277 -18.19732,-50.48113 l -0.80778,-2.08794 -7.76593,5.59954 c -4.27127,3.07975 -13.42184,9.80382 -20.3346,14.94238 l -12.56864,9.34284 3.11312,8.88468 c 1.71222,4.88658 3.37368,8.88469 3.69214,8.88469 0.31845,0 4.1866,-2.22993 8.59591,-4.95539 4.40929,-2.72547 8.21235,-4.75994 8.45124,-4.52105 0.5351,0.5351 26.485,72.53317 26.24668,72.8215 -0.13727,0.1661 -7.3005,2.78895 -22.10789,8.09493 -0.66235,0.23734 -0.0508,2.87272 2.14332,9.2358 3.38678,9.82205 4.96973,13.84217 5.45044,13.84217 0.1743,0 16.40638,-5.77993 36.07129,-12.8443 z M 562.00378,203.3846 c 19.44234,-6.97889 35.34972,-13.01008 35.34972,-13.40264 0,-0.39256 -1.73919,-5.59109 -3.86486,-11.55229 l -3.86487,-10.83853 -8.42247,3.04468 c -4.63236,1.67458 -9.75155,3.52597 -11.37596,4.11421 -1.62442,0.58824 -3.03155,0.98082 -3.12695,0.87241 -0.0954,-0.10841 -8.23119,-22.65458 -18.07954,-50.10259 -9.84835,-27.448016 -18.13876,-50.136311 -18.42314,-50.418435 -0.4331,-0.429652 -12.76504,8.366388 -36.22322,25.837035 l -4.55976,3.39592 3.05984,8.70238 c 1.68292,4.78631 3.16421,8.83651 3.29176,9.00043 0.12754,0.16392 4.03502,-1.97822 8.68328,-4.76033 4.64826,-2.78211 8.68965,-4.78769 8.98086,-4.45684 0.2912,0.33085 5.22021,13.70173 10.95334,29.71307 5.73314,16.01134 11.54862,32.22487 12.92331,36.03007 l 2.49942,6.91853 -9.97789,3.5744 c -5.48783,1.96592 -10.74,3.86174 -11.6715,4.21294 l -1.69361,0.63854 3.73557,10.61928 c 4.20994,11.96781 4.3848,12.3395 5.58826,11.87904 0.47778,-0.18282 16.77607,-6.04239 36.21841,-13.02128 z" + id="path2" + transform="scale(0.03)" /> + <path + style="fill:#ffffff;stroke-width:0.756144" + d="m 281.66352,785.58866 c -0.83176,-0.19161 -3.30177,-0.71032 -5.48893,-1.15282 -14.21839,-2.87637 -29.63961,-14.51697 -36.59327,-27.62224 -1.51951,-2.86374 -12.46509,-32.42797 -24.32351,-65.69829 C 203.39938,657.84499 162.90014,544.32375 125.25951,438.84588 87.618878,333.36802 56.456707,245.09192 56.010242,242.67676 c -4.391488,-23.75574 8.289567,-49.1755 29.717542,-59.57018 2.96314,-1.43742 47.410216,-17.59645 98.771266,-35.90896 51.36106,-18.31252 153.61059,-54.809771 227.22118,-81.105014 73.61058,-26.295243 136.55954,-48.653191 139.88658,-49.68433 4.88776,-1.514853 7.71863,-1.884512 14.7448,-1.925393 10.55625,-0.06142 15.72303,1.15615 25.70888,6.058406 6.07877,2.984191 8.23366,4.582822 14.01358,10.396176 5.47437,5.506025 7.46052,8.145572 10.0054,13.29694 1.74635,3.534971 26.8607,72.778825 55.80967,153.875235 28.94897,81.09641 54.34269,152.21172 56.4305,158.03403 2.0878,5.8223 6.16854,17.56143 9.06831,26.08695 5.07625,14.92454 5.259,15.71224 4.91436,21.18294 -0.65447,10.38878 -7.44548,23.85046 -15.83867,31.39666 -6.401,5.75504 -14.3612,9.34099 -41.01941,18.4786 -33.02961,11.32153 -47.52147,17.66664 -61.21603,26.80281 -17.59101,11.73564 -29.89384,27.73176 -33.37976,43.40031 -1.7309,7.78004 -1.08924,21.16743 1.51063,31.51751 2.16049,8.60091 6.28077,20.94419 11.23471,33.65623 9.51805,24.42379 12.2663,36.10112 12.27725,52.16608 0.008,12.42019 -0.5996,15.54599 -4.56576,23.47081 -3.52039,7.0341 -12.50154,12.77062 -32.85536,20.98566 -11.95346,4.82455 -272.78275,97.90186 -277.8828,99.16289 -3.98696,0.98586 -16.33633,1.72899 -18.90359,1.13754 z m 37.43156,-87.33072 c 19.6969,-7.09236 36.04565,-13.03925 36.33053,-13.21532 0.79074,-0.4887 -6.96442,-21.62046 -8.0935,-22.05374 -0.54384,-0.20868 -5.67408,1.31925 -11.40053,3.39541 -5.72645,2.07616 -10.64506,3.55614 -10.93024,3.28884 -0.28517,-0.26729 -8.57164,-22.94345 -18.41436,-50.39147 -9.84272,-27.44801 -18.00039,-50.0167 -18.12815,-50.15264 -0.55895,-0.59471 -40.44371,29.07528 -40.44371,30.08579 0,0.96674 5.42696,16.17649 6.01394,16.85485 0.27066,0.31279 4.21136,-1.64373 8.75713,-4.34783 4.54576,-2.70409 8.44106,-4.91359 8.65624,-4.90999 0.92213,0.0154 26.48165,72.86992 25.72828,73.33552 -0.43807,0.27075 -5.55192,2.16876 -11.36412,4.21782 -5.8122,2.04906 -10.56824,4.08706 -10.56896,4.52889 -0.002,1.39873 7.3608,22.25905 7.85682,22.25905 0.10344,0 16.30372,-5.80284 36.00063,-12.89518 z m 117.50529,-40.01631 c 8.15524,-2.08576 14.36529,-5.57962 20.15687,-11.34053 5.73744,-5.70707 8.8375,-10.80583 11.73555,-19.30186 1.75328,-5.13996 2.11678,-7.66439 2.41845,-16.79588 0.56062,-16.96962 -2.44758,-30.29079 -10.745,-47.58198 -8.72417,-18.1805 -18.35033,-28.16279 -32.73426,-33.94528 -21.06948,-8.47016 -49.05259,1.90057 -58.7716,21.78116 -4.16267,8.51488 -5.26425,13.82063 -5.21629,25.12421 0.0455,10.72551 1.14389,17.17485 4.95798,29.11154 9.22197,28.86141 25.06709,48.22497 43.66317,53.35864 5.51461,1.52238 17.78103,1.31739 24.53513,-0.41002 z m 122.49524,-46.23448 c 17.50686,-6.28831 33.60336,-12.09214 35.76999,-12.89739 l 3.93933,-1.46408 -3.76829,-10.7123 c -2.07256,-5.89175 -4.03926,-10.98326 -4.37045,-11.31445 -0.3312,-0.33119 -5.45336,1.14778 -11.38259,3.2866 -6.0997,2.20031 -11.06079,3.60224 -11.42615,3.22886 -0.35514,-0.36295 -8.36026,-22.09658 -17.78914,-48.29696 -9.42888,-26.20038 -17.48178,-48.57278 -17.89533,-49.71645 -0.41356,-1.14366 -0.97383,-2.07783 -1.24506,-2.07593 -0.27122,0.002 -8.82962,6.14518 -19.01866,13.65173 -10.18903,7.50655 -19.16701,14.11937 -19.95107,14.69515 -1.37754,1.01162 -1.32662,1.3314 1.51229,9.4964 1.61581,4.64725 3.31257,8.59806 3.77056,8.77959 0.45801,0.18154 4.53757,-1.89525 9.06569,-4.61508 l 8.23296,-4.94515 0.90293,2.60805 c 0.49661,1.43442 6.41158,17.94878 13.14438,36.69859 6.7328,18.7498 12.1146,34.19676 11.95955,34.32658 -0.15504,0.12983 -5.3008,2.028 -11.43502,4.21818 -6.13421,2.19017 -11.15312,4.21692 -11.15312,4.50389 0,0.6566 3.8244,11.86162 6.0172,17.62965 0.90909,2.3913 2.02109,4.34782 2.4711,4.34782 0.45002,0 15.14202,-5.14498 32.6489,-11.4333 z M 255.89965,516.76106 c 24.79996,-8.91844 34.45993,-12.71306 34.46102,-13.53692 0.002,-1.2808 -6.74978,-20.5205 -7.47672,-21.3065 -0.25536,-0.27611 -5.50722,1.29911 -11.6708,3.50047 -11.02378,3.93722 -11.21647,3.97623 -11.81673,2.39238 -0.33561,-0.88556 -8.4995,-23.55038 -18.14196,-50.36628 -9.64248,-26.81589 -17.66362,-48.88804 -17.8248,-49.0492 -0.16117,-0.16117 -6.51957,4.27289 -14.12977,9.85347 -7.61022,5.58058 -16.62276,12.17068 -20.02789,14.64467 -3.40513,2.47398 -6.213,4.83842 -6.23972,5.2543 -0.10405,1.61926 5.67719,16.46533 6.54176,16.79909 0.5039,0.19453 4.34771,-1.7193 8.54179,-4.25294 4.19407,-2.53365 7.8747,-4.60664 8.17916,-4.60664 0.39346,0 21.41575,57.58313 26.38955,72.28484 0.16024,0.47366 -4.51784,2.53561 -10.90899,4.80834 -6.15425,2.1885 -11.30988,4.09067 -11.45696,4.22707 -0.2889,0.26791 4.74976,15.73261 6.48172,19.8938 0.86116,2.06899 1.3868,2.47408 2.84795,2.19476 0.98554,-0.18841 17.29867,-5.91902 36.25139,-12.73471 z m 114.09246,-38.86211 c 14.51473,-3.07549 26.36084,-13.08622 32.04815,-27.08278 5.61784,-13.82559 5.52968,-33.79203 -0.22996,-52.07964 -6.46835,-20.53782 -17.03069,-36.88318 -28.95748,-44.8121 -6.61801,-4.39965 -10.81122,-6.1546 -18.36062,-7.6843 -19.55742,-3.96284 -42.40123,6.80315 -50.77703,23.93055 -4.06813,8.31878 -5.28817,13.96419 -5.30257,24.53631 -0.0211,15.46382 3.98747,30.70807 12.72519,48.3932 9.34441,18.91305 21.76775,30.88957 36.01709,34.7217 5.28934,1.42248 16.31196,1.45968 22.83723,0.0771 z m 133.16631,-47.65241 c 18.02863,-4.76904 29.95381,-18.62393 33.51179,-38.93462 4.54677,-25.95522 -9.26115,-65.56341 -28.34338,-81.30333 -14.55241,-12.00351 -32.1863,-14.90874 -49.34762,-8.13016 -27.18535,10.73797 -36.26764,39.12539 -24.21805,75.69542 10.16965,30.86451 26.19731,49.41288 46.52428,53.84131 4.19467,0.91385 16.48233,0.25735 21.87298,-1.16862 z M 633.1727,383.37208 c 16.43042,-3.48103 29.40081,-16.10686 34.18576,-33.27756 1.91301,-6.86481 2.29535,-23.46108 0.74942,-32.53042 -2.56808,-15.06596 -10.83849,-34.75128 -19.18973,-45.67565 -12.98472,-16.9855 -31.967,-24.21967 -51.47738,-19.6181 -1.91945,0.4527 -6.67499,2.34342 -10.56786,4.20158 -12.34372,5.89198 -20.45695,15.91881 -24.05482,29.72845 -1.73858,6.67319 -1.73109,20.93619 0.0156,29.75123 3.19026,16.10002 11.72622,36.12614 20.14643,47.26531 7.58666,10.03646 17.75906,17.51771 27.31272,20.08701 5.30194,1.42588 16.31652,1.45868 22.87982,0.0682 z M 195.46314,338.75597 c 16.72909,-4.27939 29.05684,-17.12472 33.38457,-34.78622 1.81813,-7.41987 1.79476,-24.25293 -0.0457,-32.89225 -4.24116,-19.90852 -13.76379,-39.21655 -24.54916,-49.77572 -9.65215,-9.44972 -19.19532,-13.73245 -31.85209,-14.29441 -14.47409,-0.64264 -26.77413,3.9703 -36.61746,13.73282 -14.74894,14.62786 -17.36322,37.39794 -7.65928,66.71172 7.84644,23.70264 20.73639,41.28951 35.63978,48.62643 9.33819,4.59718 20.50725,5.54062 31.69934,2.67763 z M 328.9225,291.08705 c 17.0537,-5.13259 28.58649,-18.4831 32.20276,-37.27833 1.40031,-7.27801 1.35694,-19.431 -0.0993,-27.81175 -2.62058,-15.08204 -11.43562,-35.81124 -19.74425,-46.43003 -16.06297,-20.52917 -41.49063,-26.02512 -63.77702,-13.78481 -6.6466,3.65049 -14.82326,12.03302 -17.94176,18.39348 -3.92987,8.01532 -5.05238,13.42819 -5.08495,24.52004 -0.0332,11.31299 1.17765,18.10496 5.59445,31.37996 9.65345,29.01415 24.86789,46.85558 44.27536,51.92016 4.92778,1.28595 19.01315,0.7651 24.57467,-0.90872 z m 122.51692,-47.99464 c 19.68159,-7.07422 35.94234,-13.01985 36.135,-13.21252 0.37449,-0.37448 -6.25977,-19.70092 -7.38111,-21.50209 -0.55298,-0.88823 -2.59842,-0.39816 -11.82567,2.8334 -6.13637,2.14907 -11.24059,3.8233 -11.34273,3.72051 -0.10212,-0.1028 -8.01405,-21.96385 -17.58205,-48.5801 -9.56801,-26.61626 -17.75656,-49.33346 -18.1968,-50.48267 l -0.80041,-2.08947 -8.10727,5.87019 c -4.45899,3.2286 -13.60929,9.95336 -20.334,14.94391 l -12.22674,9.07373 3.11312,8.88468 c 1.71222,4.88658 3.31343,8.88469 3.55825,8.88469 0.24482,0 4.11656,-2.22636 8.60384,-4.94745 4.4873,-2.72111 8.36211,-4.74409 8.61068,-4.4955 0.24858,0.24857 6.2851,16.68098 13.41448,36.51645 8.77455,24.41267 12.6903,36.2398 12.11995,36.60706 -0.46341,0.29841 -5.52043,2.16987 -11.23782,4.15879 -7.70241,2.67947 -10.39569,3.94006 -10.39698,4.8663 -0.003,2.069 7.04555,21.81231 7.78704,21.81231 0.16748,0 16.40762,-5.788 36.08922,-12.86222 z m 110.56436,-39.73698 c 19.44234,-7.00054 35.34972,-13.03402 35.34972,-13.40774 0,-0.37371 -1.73919,-5.55682 -3.86486,-11.51802 l -3.86487,-10.83853 -8.42247,3.04468 c -4.63236,1.67458 -9.75155,3.52597 -11.37596,4.11421 -1.62442,0.58824 -3.03389,0.98082 -3.13217,0.87241 -0.21851,-0.24105 -35.13695,-97.205788 -35.67402,-99.062894 -0.21047,-0.727788 -0.73393,-1.323251 -1.16324,-1.323251 -0.86383,0 -13.38025,8.903189 -29.75438,21.1649 l -10.67351,7.992835 2.96455,8.29448 c 1.63052,4.56196 3.21095,8.54253 3.51209,8.84571 0.30113,0.30318 4.24639,-1.67051 8.76723,-4.38596 4.52084,-2.71546 8.46464,-4.66483 8.764,-4.33195 0.29935,0.33288 4.99214,13.0249 10.4284,28.20448 5.43626,15.17959 11.24149,31.38934 12.90053,36.02168 l 3.01641,8.42241 -9.96623,3.60407 c -5.48143,1.98223 -10.72835,3.88183 -11.65985,4.22133 l -1.69361,0.61728 3.73557,10.61928 c 4.20886,11.96471 4.38427,12.33774 5.58826,11.88414 0.47778,-0.18001 16.77607,-6.055 36.21841,-13.05555 z" + id="path3" + transform="scale(0.03)" /> + <path + style="fill:#ffffff;stroke-width:0.756144" + d="m 359.91949,454.90884 c -11.5007,-3.73366 -23.00617,-22.22113 -29.49785,-47.39836 -4.17293,-16.18426 -3.8042,-28.65107 1.00956,-34.13365 6.03678,-6.8755 15.44963,-6.06046 24.30786,2.10477 13.43205,12.38123 24.92246,45.20014 22.29976,63.69256 -0.88622,6.24868 -3.56979,11.57903 -7.0174,13.93864 -2.73485,1.87178 -8.16345,2.75001 -11.10193,1.79604 z" + id="path4" + transform="scale(0.03)" /> + <path + style="fill:#ffffff;stroke-width:0.756144" + d="m 488.09074,406.73098 c -13.84707,-7.51686 -29.07037,-41.69986 -29.09547,-65.33211 -0.01,-9.0491 0.94437,-12.48051 4.4422,-15.97834 4.60111,-4.60111 9.8606,-5.1718 16.89589,-1.83334 18.88736,8.96264 35.90423,57.58797 26.72164,76.3565 -2.79378,5.71027 -5.53908,7.53127 -11.76397,7.80323 -3.46292,0.1513 -5.60751,-0.15131 -7.20029,-1.01594 z" + id="path5" + transform="scale(0.03)" /> + <path + style="fill:#ffffff;stroke-width:0.756144" + d="m 623.05749,360.35211 c -11.3586,-3.45513 -23.0153,-22.15058 -29.6606,-47.57076 -1.93144,-7.38833 -2.317,-10.33827 -2.38706,-18.26339 -0.075,-8.48638 0.0976,-9.81975 1.6904,-13.05417 5.07361,-10.30301 18.13189,-9.51498 28.28726,1.70706 7.15056,7.90163 13.49324,20.70651 17.60595,35.54371 2.66776,9.6243 3.40318,24.12771 1.54716,30.51216 -2.54534,8.75568 -9.65402,13.38521 -17.08311,11.12539 z" + id="path6" + transform="scale(0.03)" /> + <path + style="fill:#ffffff;stroke-width:0.756144" + d="m 423.65691,635.45605 c -3.55283,-1.02704 -11.04045,-8.33204 -14.91936,-14.55549 -11.18235,-17.94134 -18.46293,-45.84556 -15.57612,-59.69843 1.04028,-4.99196 4.19336,-9.19913 8.12572,-10.84217 13.79572,-5.76422 31.06667,13.674 39.40253,44.34703 1.67899,6.17808 1.9578,8.77066 1.99231,18.52552 0.0401,11.32747 0.0371,11.34752 -2.30808,15.48217 -3.66698,6.46507 -9.51486,8.82331 -16.717,6.74137 z" + id="path7" + transform="scale(0.03)" /> + <path + style="fill:#ffffff;stroke-width:0.756144" + d="m 316.8242,268.8274 c -4.23889,-0.80744 -7.11187,-2.68633 -11.4678,-7.49979 -9.28988,-10.26564 -18.36105,-31.72875 -21.11731,-49.96519 -1.2312,-8.14613 -0.59586,-17.78098 1.43066,-21.69572 3.4486,-6.66184 11.24176,-8.94188 18.7067,-5.473 10.71031,4.97698 21.48648,22.12616 27.27511,43.40554 1.7553,6.45259 2.06639,9.11383 2.1214,18.14745 0.0685,11.25199 -0.4427,13.67045 -3.87619,18.33728 -2.93117,3.98408 -7.79461,5.74879 -13.07257,4.74343 z" + id="path8" + transform="scale(0.03)" /> + <path + style="fill:#ffffff;stroke-width:0.756144" + d="m 181.09641,315.00438 c -10.36408,-4.82651 -22.45288,-26.91974 -27.59036,-50.42353 -1.90781,-8.72815 -2.27336,-19.56798 -0.83207,-24.67346 2.07935,-7.36564 8.75148,-11.3876 16.00466,-9.64758 8.55272,2.05176 16.35281,10.22826 23.42994,24.56061 11.52604,23.34212 13.7062,48.41418 5.01895,57.71838 -3.83839,4.11096 -10.34808,5.11216 -16.03112,2.46558 z" + id="path9" + transform="scale(0.03)" /> + <path + style="fill:#999999;stroke-width:0.756144" + d="m 626.19914,653.30813 c 0.35418,-5.40643 0.59323,-14.59357 0.53122,-20.41588 -0.13423,-12.60461 -1.56493,-18.95695 -8.18844,-36.35673 -15.44429,-40.57177 -17.28087,-47.06321 -17.31093,-61.1858 -0.019,-8.92055 0.16793,-10.31037 2.02064,-15.02412 3.10808,-7.90772 7.07383,-13.88968 13.35336,-20.1423 12.96737,-12.9118 31.82802,-22.39107 72.24189,-36.30841 29.48606,-10.15413 39.98771,-15.3918 49.67943,-24.77748 3.56206,-3.44958 6.2408,-5.47894 6.89885,-5.22642 4.81858,1.84907 -1.54797,29.90851 -12.72179,56.06899 -19.32918,45.25406 -53.61358,105.19374 -81.34396,142.21428 -6.30514,8.41748 -21.01016,26.21401 -24.66422,29.84952 -1.01577,1.01062 -1.06983,0.063 -0.49605,-8.69565 z" + id="path10" + transform="scale(0.03)" /> + <path + style="fill:#999999;stroke-width:0.094518" + d="" + id="path11" + transform="scale(0.03)" /> + <path + style="fill:#999999;stroke-width:0.094518" + d="" + id="path12" + transform="scale(0.03)" /> + <path + style="fill:#999999;stroke-width:0.094518" + d="" + id="path13" + transform="scale(0.03)" /> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pastebin-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pastebin-icon.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --> +<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg"><title>Pastebin icon</title><path d="M17.02 0a2.096 2.096 0 00-.723.123L2.623 5.003A2.101 2.101 0 001.35 7.69l5.324 14.916a2.101 2.101 0 002.685 1.272l7.746-2.765c.792-.307 1.345-.534 1.464-.608.543-.314.962-.817 1.964-2.334.904-1.362 1.859-3.323 2.097-4.28.24-.97.239-1.48-.502-3.675h.001l-3.147-8.82A2.102 2.102 0 0017.02 0zm-.084.414c.72-.031 1.4.403 1.657 1.12l3.147 8.82.008-.003c.271.763.497 1.415.526 1.54.102.433-.282 1.147-.737 1.35-.2.1-.71.293-1.142.429-1.397.464-2.05.879-2.458 1.548-.363.591-.315 1.18.16 2.377.462 1.142.533 1.864.225 2.4-.113.188-.301.322-1.354.733l-.002-.005-7.746 2.765a1.68 1.68 0 01-2.157-1.022L1.74 7.55a1.68 1.68 0 011.022-2.157L16.436.513c.165-.06.334-.092.5-.099zM15.9 2.25l-.708.515-.495.37.113.314.074.205.523-.316.4 1.112.403 1.123-.359.129-.337.12c.045.145.216.642.238.664l2.166-.779-.238-.663-.244.088-.443.16-.334-.93zm-3.29 1.182l-.709.515-.494.37.113.314.073.205.524-.316.4 1.112.403 1.123-.36.129-.337.121c.046.144.216.64.238.663l2.167-.778-.238-.663-.244.087-.443.16-.334-.93zM9.084 4.786a1.532 1.532 0 00-.8.223c-.732.448-.85 1.383-.332 2.558.337.776.873 1.218 1.462 1.215 1.345-.007 1.86-1.399 1.085-2.95-.307-.66-.837-1.036-1.415-1.046zm-.191.672c.168-.009.357.085.539.279.145.155.347.51.437.787.35.998.164 1.688-.414 1.546C8.854 7.93 8.21 6 8.62 5.585a.407.407 0 01.273-.127zm-3.765.75a1.532 1.532 0 00-.8.223c-.732.448-.85 1.382-.332 2.557.337.777.873 1.218 1.462 1.215 1.344-.007 1.86-1.398 1.085-2.95-.307-.66-.838-1.036-1.415-1.045zm-.192.672c.168-.01.358.085.54.278.145.155.347.51.437.787.35.999.164 1.689-.415 1.547-.6-.141-1.243-2.072-.834-2.485a.407.407 0 01.272-.127zm13.362.655a1.533 1.533 0 00-.8.223c-.732.448-.85 1.382-.332 2.558.337.776.873 1.218 1.462 1.215 1.345-.007 1.86-1.399 1.085-2.95-.307-.66-.837-1.036-1.415-1.046zm-.191.672c.168-.009.357.085.539.278.145.155.347.51.437.787.35.999.164 1.689-.414 1.547-.601-.141-1.244-2.072-.835-2.485a.407.407 0 01.273-.127zm-3.766.75a1.532 1.532 0 00-.8.222c-.73.448-.848 1.383-.331 2.558.337.776.873 1.218 1.462 1.215 1.344-.007 1.86-1.398 1.085-2.95-.307-.66-.838-1.036-1.416-1.045zm-.19.671c.167-.009.357.085.539.279.145.155.347.51.437.787.35.998.164 1.688-.415 1.547-.6-.142-1.244-2.072-.835-2.485a.408.408 0 01.273-.128zm-3.746.743a1.533 1.533 0 00-.8.223c-.732.448-.85 1.382-.332 2.557.337.777.873 1.219 1.462 1.216 1.345-.007 1.86-1.399 1.085-2.951-.307-.66-.838-1.036-1.415-1.045zm-.192.672c.169-.01.358.085.54.278.145.155.347.51.437.787.35.999.164 1.689-.414 1.547-.601-.141-1.244-2.072-.835-2.485a.407.407 0 01.272-.127zm-3.515.616l-.708.515-.495.369.113.314.074.206.524-.316.399 1.112.403 1.122-.359.13-.337.12c.045.145.216.641.238.663l2.166-.778-.238-.663-.244.088-.443.159-.334-.93zm15.664 1.33c.034 0 .049.047.064.135.023.11-.064.545-.195.957-.469 1.436-2.052 4.224-3.079 5.397l-.408.47.051-.667c.03-.567-.016-.812-.377-1.71-.496-1.263-.533-1.73-.158-2.31.341-.514 1.028-.907 2.448-1.371.72-.238 1.175-.463 1.385-.664.132-.145.207-.22.253-.235a.05.05 0 01.015-.003zm-6.429 1.477l-.708.515-.495.37.113.314.074.205.523-.316.4 1.112.403 1.123-.359.129-.337.12c.045.145.216.642.238.664l2.166-.779-.238-.662-.244.087-.443.16-.334-.93zm-3.579 1.33a1.532 1.532 0 00-.8.223c-.731.448-.849 1.382-.332 2.558.337.776.873 1.218 1.462 1.215 1.345-.007 1.86-1.399 1.086-2.95-.307-.66-.838-1.036-1.416-1.046zm-.191.672c.168-.009.358.085.54.279.144.154.346.51.437.787.35.998.164 1.688-.415 1.546-.6-.141-1.244-2.072-.835-2.485a.407.407 0 01.273-.127zm-3.515.616l-.71.515-.494.37.113.313.074.206.524-.316.4 1.112.403 1.122-.36.13-.337.12c.045.145.216.642.238.664l2.166-.779-.238-.663-.244.088-.443.16-.334-.93z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/peertube-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/peertube-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="2799 -911 128 128"><path fill="#211f20" d="M2824.446-898.407V-847L2863-872.7"/><path fill="#737373" d="M2824.446-847v51.407L2863-821.294"/><path fill="#f1680d" d="M2863-872.706v51.407L2901.554-847"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pinterest-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pinterest-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0 12c0 5.123 3.211 9.497 7.73 11.218-.11-.937-.227-2.482.025-3.566.217-.932 1.401-5.938 1.401-5.938s-.357-.715-.357-1.774c0-1.66.962-2.9 2.161-2.9 1.02 0 1.512.765 1.512 1.682 0 1.025-.653 2.557-.99 3.978-.281 1.189.597 2.159 1.769 2.159 2.123 0 3.756-2.239 3.756-5.471 0-2.861-2.056-4.86-4.991-4.86-3.398 0-5.393 2.549-5.393 5.184 0 1.027.395 2.127.889 2.726a.36.36 0 0 1 .083.343c-.091.378-.293 1.189-.332 1.355-.053.218-.173.265-.4.159-1.492-.694-2.424-2.875-2.424-4.627 0-3.769 2.737-7.229 7.892-7.229 4.144 0 7.365 2.953 7.365 6.899 0 4.117-2.595 7.431-6.199 7.431-1.211 0-2.348-.63-2.738-1.373 0 0-.599 2.282-.744 2.84-.282 1.084-1.064 2.456-1.549 3.235C9.584 23.815 10.77 24 12 24c6.627 0 12-5.373 12-12S18.627 0 12 0 0 5.373 0 12" fill="#e60023"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pixiv-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/pixiv-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.623 62.355"><g transform="translate(-38.312 -85.637)"><ellipse cx="70.623" cy="116.815" rx="32.311" ry="31.178" style="fill:#0096fa;fill-opacity:1;fill-rule:evenodd;stroke-width:1.449;stroke-linecap:round;stroke-linejoin:bevel;stop-color:#000"/><path d="M53.955 137.207q-.002-.51 1.058-.977l1.058-.467v-15.295c0-8.412-.053-15.295-.118-15.295-.438 0-3.423 2.862-4.14 3.968-.71 1.096-.86 1.57-.801 2.527.057.926-.028 1.218-.395 1.359-.27.103-.51.047-.571-.133-.057-.171-.683-1.199-1.391-2.283l-1.287-1.972 2.016-1.883c4.602-4.297 10.59-7.463 17.006-8.992 3.788-.902 8.738-.866 12.265.09 7.2 1.952 11.963 6.6 13.25 12.93.75 3.693.334 7.256-1.204 10.318-1.437 2.86-5.198 6.276-8.522 7.74-5.074 2.234-12.486 2.385-19.257.393-.962-.282-1.884-.514-2.05-.514-.212 0-.303 1.066-.303 3.554 0 3.456.017 3.56.596 3.736.773.235 1.52.9 1.52 1.35 0 .284-.884.356-4.365.356-4.134 0-4.365-.027-4.365-.51m21.897-9.584c2.152-.408 4.767-1.854 6.481-3.584 3.108-3.136 4.033-5.439 4.02-10.002-.014-4.46-1.043-7.28-3.706-10.157-1.65-1.782-3.362-2.865-5.938-3.755-2.265-.782-6.661-.843-9.37-.13-1.978.52-5.208 1.786-6.172 2.417l-.598.392v23.026l1.204.515c3.637 1.56 9.693 2.11 14.08 1.278" style="fill:#fff;fill-opacity:1;stroke-width:.264583"/></g></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/quora-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/quora-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="2608 917 120 120"><defs><style>.cls-1{fill:#b92b27}.cls-2{fill:#fff}</style></defs><g id="Group_56" data-name="Group 56" transform="translate(2383 785)"><circle id="Ellipse_45" cx="60" cy="60" r="60" class="cls-1" data-name="Ellipse 45" transform="translate(225 132)"/><g id="Group_55" data-name="Group 55" transform="translate(3.5 4.5)"><path id="Path_151" d="M34.212.5c18.619 0 33.712 14.691 33.712 32.813S52.831 66.127 34.212 66.127.5 51.436.5 33.313 15.593.5 34.212.5" class="cls-2" data-name="Path 151" transform="translate(245 150)"/><path id="Path_149" d="M18.005.9c5.942 0 11.867 2.427 14.474 7.462s3.281 12.528 3.281 18.25c0 6.027-.132 12.044-2.562 16.721-3.118 6.009-9.456 9.8-15.193 9.8-5.217 0-9.349-.629-13.575-6.563S.25 33.408.25 26.611c0-6.143.045-13.305 4.18-19.059S12.347.9 18.005.9" class="cls-1" data-name="Path 149" transform="translate(261.207 156.253)"/><path id="Path_150" d="m2337.818 160-1.618-4.135s4.225-3.146 11.417-2.967 10.7 3.956 10.7 3.956a76 76 0 0 1 6.113 7.641 29.5 29.5 0 0 1 3.326 6.563s2.877 5.3 7.462 5.3 5.034-4.765 5.034-4.765h4.945s.18 7.821-4.945 12.136-12.5 3.146-12.5 3.146a14.66 14.66 0 0 1-6.563-2.877 26.2 26.2 0 0 1-5.3-6.742s-2.248-4.562-4.5-8.271-4.225-6.473-4.225-6.473a14.2 14.2 0 0 0-4.585-2.517 10.55 10.55 0 0 0-4.761.005" class="cls-2" data-name="Path 150" transform="translate(-2067.596 38.415)"/></g></g></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/reddit-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/reddit-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><path d="M500 1000C223.9 1000 0 776.1 0 500S223.9 0 500 0s500 223.9 500 500-223.9 500-500 500" style="fill:#ff4500"/><path d="M614.6 604.2c-28.7 0-52.1-23.4-52.1-52.1s23.4-52.1 52.1-52.1 52.1 23.4 52.1 52.1-23.4 52.1-52.1 52.1m9.2 85.5C588.2 725.2 520.1 728 500.1 728s-88.2-2.8-123.7-38.3c-5.3-5.3-5.3-13.8 0-19.1s13.8-5.3 19.1 0C417.9 693 465.8 701 500.1 701c34.2 0 82.2-8 104.6-30.4 5.3-5.3 13.8-5.3 19.1 0 5.2 5.3 5.2 13.8 0 19.1M333.3 552.1c0-28.7 23.4-52.1 52.1-52.1s52.1 23.4 52.1 52.1-23.4 52.1-52.1 52.1-52.1-23.4-52.1-52.1m500-52.1c0-40.3-32.6-72.9-72.9-72.9-19.7 0-37.5 7.8-50.6 20.5-49.8-36-118.5-59.2-195-61.9L548 229.4l108.5 23.1c1.3 27.6 23.9 49.6 51.8 49.6 28.8 0 52.1-23.3 52.1-52.1s-23.3-52.1-52.1-52.1c-20.5 0-38 11.9-46.5 29.1l-121.2-25.8c-3.4-.7-6.9-.1-9.8 1.8s-4.9 4.8-5.6 8.2l-36.4 171.5c-.2 1 0 1.9 0 2.9-77.9 2-147.9 25.3-198.5 61.8-13.1-12.6-30.8-20.3-50.4-20.3-40.3 0-72.9 32.7-72.9 72.9 0 29.6 17.7 55.1 43.1 66.5-1.1 7.2-1.7 14.6-1.7 22.1 0 112.2 130.6 203.1 291.7 203.1s291.7-90.9 291.7-203.1c0-7.4-.6-14.7-1.7-21.9 25.3-11.4 43.2-36.9 43.2-66.7" style="fill:#fff"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/reuters-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/reuters-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1001"><path fill="#d64000" d="M864.394 135.44c12.71 12.685 19.677 29.665 19.677 47.72 0 18.053-6.992 35.033-19.652 47.743a67.42 67.42 0 0 1-95.263 0 67.07 67.07 0 0 1-19.677-47.744c0-18.054 6.992-35.034 19.677-47.744a67.12 67.12 0 0 1 47.694-19.826c17.354 0 34.51 6.617 47.744 19.826h-.175zM135.375 865.907a67.67 67.67 0 0 1 0-95.463 67.2 67.2 0 0 1 47.72-19.851c18.053 0 35.033 6.991 47.718 19.851a67.67 67.67 0 0 1 0 95.463 67.17 67.17 0 0 1-47.694 19.852c-18.078 0-35.058-6.992-47.744-19.852M649.222 140.61h-.525a59.3 59.3 0 0 1-31.463-31.987 58.38 58.38 0 0 1 0-45.247 59.08 59.08 0 0 1 54.511-36.457c7.492 0 15.357 1.598 22.524 4.47a59.355 59.355 0 0 1 31.962 77.234 59.18 59.18 0 0 1-77.01 31.987M328.399 856.443c7.69 0 15.207 1.598 22.523 4.47a59.355 59.355 0 0 1 31.988 77.234 58.53 58.53 0 0 1-31.963 31.988 58.36 58.36 0 0 1-45.247 0 59.355 59.355 0 0 1-31.962-77.235 59.11 59.11 0 0 1 54.486-36.457zM550.563 51.938a50.69 50.69 0 0 1-48.244 50.591h-2.322a50.665 50.665 0 0 1-50.59-50.59c-.026-27.868 22.698-50.591 50.59-50.591 27.867 0 50.566 22.873 50.566 50.765zM449.382 949.584c0-27.892 22.723-50.59 50.615-50.59 27.867 0 50.566 22.698 50.566 50.59a50.665 50.665 0 0 1-50.566 50.59 50.665 50.665 0 0 1-50.59-50.59zM344.68 125.052a41.8 41.8 0 0 1-32.188 0 41.65 41.65 0 0 1-22.873-22.873 42.2 42.2 0 1 1 77.909-32.362c4.32 10.538 4.32 21.975 0 32.362a41.1 41.1 0 0 1-22.848 22.873M655.14 876.47a43.2 43.2 0 0 1 16.23-3.222q8.316 0 16.107 3.222a42.275 42.275 0 0 1 22.873 55.235 41.1 41.1 0 0 1-22.873 22.898 42.28 42.28 0 0 1-32.362 0 41.1 41.1 0 0 1-22.873-22.898 42.275 42.275 0 0 1 22.873-55.235zM206.866 159.737c12.885 13.06 13.235 33.81.725 47.194l-.725.75c-13.234 13.209-34.659 13.209-47.693 0a33.885 33.885 0 0 1 0-47.944c6.592-6.592 15.182-9.814 23.921-9.814 8.765 0 17.355 3.222 23.972 9.814zm585.687 634.48c6.443-6.618 15.208-9.84 23.772-9.84 8.59 0 17.33 3.247 23.972 9.84 6.418 6.242 9.814 14.832 9.814 23.971a33.685 33.685 0 1 1-67.371 0c0-8.94 3.57-17.53 9.813-23.972m-722.775-426.2a42.375 42.375 0 0 1-22.874-55.235c4.295-10.538 12.336-18.603 22.874-22.873 5.368-2.148 10.737-3.246 16.28-3.246s10.888 1.098 16.082 3.246a42.525 42.525 0 0 1 22.873 55.235 41.1 41.1 0 0 1-22.873 22.873c-10.538 4.295-21.975 4.295-32.163 0zM930.192 633.68a42.3 42.3 0 0 1 22.873 55.235 42.2 42.2 0 0 1-77.934 0 42.3 42.3 0 0 1 38.955-58.431c16.455 0 10.737 1.048 16.106 3.196M1.158 501.01c0-27.866 22.698-50.59 50.59-50.59 27.868 0 50.566 22.724 50.566 50.59a50.665 50.665 0 0 1-50.565 50.616 50.665 50.665 0 0 1-50.59-50.615m896.497 0c0-27.866 22.698-50.59 50.566-50.59 27.892 0 50.59 22.724 50.59 50.59a50.665 50.665 0 0 1-50.59 50.616 50.665 50.665 0 0 1-50.566-50.59zM31.173 695.184a59.056 59.056 0 0 1 32.012-77.235 59.08 59.08 0 0 1 77.21 32.013 58.38 58.38 0 0 1 0 45.197 59.106 59.106 0 0 1-109.222 0zM859.225 351.56a57.93 57.93 0 0 1 0-45.047 59.11 59.11 0 0 1 54.511-36.457c23.223 0 45.197 13.759 54.511 36.457a59.056 59.056 0 0 1-31.987 77.235 59.106 59.106 0 0 1-77.21-32.013zM643.33 644.417a47.27 47.27 0 0 0 0 67.022 47.22 47.22 0 0 0 67.021 0 46.95 46.95 0 0 0 13.934-33.411c0-12.71-4.995-24.671-13.934-33.46a46.77 46.77 0 0 0-33.436-13.735 47.94 47.94 0 0 0-33.585 13.734zM248.343 472.045a37.456 37.456 0 0 1-26.47-45.946c2.698-9.639 8.766-17.68 17.53-22.873 5.719-3.396 12.161-4.994 18.578-4.994 6.443 0 6.443.35 9.664 1.248 9.639 2.697 17.68 8.765 22.698 17.53 4.995 8.74 6.243 18.777 3.746 28.59a37.556 37.556 0 0 1-45.946 26.645l.2-.175zm483.632 129.822a37.26 37.26 0 0 1-22.724-17.53c-4.994-8.739-6.242-18.777-3.745-28.615a37.606 37.606 0 0 1 36.282-27.893c6.442 0 5.369.2 8.066.9l1.772.549a37.556 37.556 0 0 1 8.94 68.819c-8.74 4.994-18.778 6.442-28.591 3.745zm-502.76-28.441a30.29 30.29 0 0 1 19.477-36.457l1.798-.525a30.215 30.215 0 0 1 36.807 21.275c2.147 7.866 1.074 15.907-3.046 22.873-3.92 6.992-10.538 11.986-18.229 14.134-7.866 2.122-15.732 1.048-22.873-3.047a29.24 29.24 0 0 1-13.934-18.228zm497.39-111.195-1.248-.724a30.1 30.1 0 0 1-12.685-17.504 30.09 30.09 0 1 1 36.807 21.275c-7.666 2.122-15.732.874-22.873-3.047M339.66 692.686l-.898.899c-8.74 8.74-23.223 8.74-31.963 0a22.598 22.598 0 1 1 38.605-15.907 21.23 21.23 0 0 1-5.744 14.983zm352.986-385.273c4.295 4.295 6.617 10.013 6.617 16.081a22.598 22.598 0 1 1-45.197 0 22.573 22.573 0 0 1 22.673-22.698c6.093 0 11.812 2.322 16.082 6.617zM461.018 727.744c3.945 6.942 4.994 14.983 3.046 22.874-2.147 7.84-6.991 14.283-13.933 18.228-6.992 3.92-15.033 4.994-22.898 3.047a30.165 30.165 0 0 1-21.25-36.832c2.147-7.866 6.966-14.308 13.933-18.229 6.992-3.945 15.008-5.019 22.873-3.046 7.866 2.147 14.134 7.141 18.229 14.108v-.175zm77.384-453.766c-3.92-6.967-4.994-15.008-3.021-22.874 2.147-7.865 6.966-14.308 13.933-18.228 4.645-2.697 9.839-3.946 15.008-3.946 5.193 0 5.193.375 7.865 1.074 7.866 2.148 14.309 6.992 18.229 14.134a30.015 30.015 0 0 1-33.785 44.148 29.04 29.04 0 0 1-18.229-14.109zm45.222 436.412 1.623.874c7.866 4.994 13.384 12.71 15.906 21.824a37.38 37.38 0 0 1-26.469 45.946 37.2 37.2 0 0 1-28.591-3.745c-8.74-5.02-14.833-13.06-17.504-22.899a37.3 37.3 0 0 1 3.745-28.616 37.26 37.26 0 0 1 32.537-18.753c6.417 0 12.86 1.773 18.753 4.994zM444.762 295.078a37.556 37.556 0 0 1-45.946-26.644 37.38 37.38 0 0 1 36.108-47.195c16.63 0 31.812 11.087 36.282 27.893a37.38 37.38 0 0 1-26.469 45.946zm-121.907 75.436c26.095 0 47.195-21.275 47.195-47.37a47.294 47.294 0 0 0-47.195-47.369c-26.094 0-47.194 21.275-47.194 47.37s21.1 47.37 47.194 47.37" style="stroke-width:24.9706"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/search-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/search-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#fff" d="M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/search-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/search-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/sendFiles-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/sendFiles-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#fff" d="M19.35 10.04A7.49 7.49 0 0 0 12 4C9.11 4 6.6 5.64 5.35 8.04A5.994 5.994 0 0 0 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96M14 13v4h-4v-4H7l5-5 5 5z"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/sendFiles-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/sendFiles-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19.35 10.04A7.49 7.49 0 0 0 12 4C9.11 4 6.6 5.64 5.35 8.04A5.994 5.994 0 0 0 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96M14 13v4h-4v-4H7l5-5 5 5z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/snopes-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/snopes-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 123.472 123.472"><defs><radialGradient xlink:href="#a" id="b" cx="93.969" cy="149.132" r="12.14" fx="93.969" fy="149.132" gradientUnits="userSpaceOnUse"/><linearGradient id="a"><stop offset=".869" style="stop-color:#fbfff5;stop-opacity:1"/><stop offset="1" style="stop-color:#fff;stop-opacity:0"/></linearGradient></defs><g transform="translate(-4.306 -93.635)"><circle cx="66.042" cy="155.371" r="61.736" style="fill:#fcd43f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.55348;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.411765;paint-order:stroke fill markers;stop-color:#000"/><path d="m109.743 135.955-30.194 28.032-10.805 52.852 2.152.069a61.736 61.736 0 0 0 56.882-61.536 62 62 0 0 0-.501-7.841z" style="fill:#feea89;fill-opacity:1;stroke:none;stroke-width:.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/><circle cx="93.969" cy="149.132" r="12.14" style="fill:url(#b);fill-rule:evenodd;stroke-width:1.8476;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.411765;paint-order:stroke fill markers;stop-color:#000;fill-opacity:1"/><path d="m79.448 164.544 30.339-28.575-15.522-15.984-9.525-.018-13.406-12.451-17.345 15.767s2.63 4.53 3.587 5.983c-9.442-2.25-21.15-.283-28.928 5.61-10.09 7.642-14.493 23.193-6.385 33.901 7.11 9.392 19.237 12.526 29.316 17.552 4.741 2.365 9.745 4.897 12.887 9.36 5.19 7.37 1.855 16.07-4.774 21.066v.353H70.63c1.237 0 3.29.384 4.36-.363 1.867-1.303 2.812-5.296 3.242-7.399 1.531-7.489.323-15.99-4.845-21.872-8.176-9.303-20.77-11.922-31.332-17.457-5.105-2.676-10.4-6.18-11.755-12.176-1.651-7.307 3.645-13.868 9.99-16.698 7.187-3.205 22.924 1.291 22.924 1.291l1.943 6.587z" style="fill:#060403;stroke:none;stroke-width:.352778"/></g></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/soundcloud-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/soundcloud-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 87.054 87.054"><path d="M34.898 164.033c-.329-.761-.404-21.903-.086-24.39.16-1.255.242-1.41.743-1.41.506 0 .578.145.708 1.41.079.775.272 4.83.429 9.009.244 6.501.23 8.172-.091 11.57-.207 2.186-.448 4.088-.535 4.23-.291.47-.874.262-1.168-.419m10.004.29c-.234-.235-.392-.837-.403-1.533-.01-.63-.109-2.415-.221-3.966-.25-3.453.199-21.563.546-22 .313-.395 1.03-.393 1.36.002.155.188.364 3.838.534 9.324.321 10.402.052 17.691-.673 18.25-.515.399-.678.387-1.143-.078zm13.24-.152c-.345-.49-.389-2.368-.389-16.66 0-13.468.057-16.162.343-16.449.68-.679 4.037-1.286 7.011-1.268 3.363.02 5.171.436 8.09 1.859 2.707 1.32 6.048 4.564 7.41 7.197.936 1.81 1.904 4.898 1.904 6.075 0 .61.068.674.552.519 5.043-1.618 10.092.526 12.35 5.244.967 2.02 1.108 5.089.332 7.224-1.06 2.918-3.019 4.973-5.818 6.103l-1.41.57-14.994.07-14.994.07zm-29.678-.015c-.328-.971-.586-9.477-.377-12.44.129-1.82.238-3.672.242-4.114.009-.812.571-1.316.983-.883.113.12.38 2.095.593 4.39.37 3.996.366 4.354-.108 8.457-.54 4.672-.585 4.896-.969 4.896-.143 0-.307-.138-.364-.306m3.272.245c-.019-.034-.222-2.047-.452-4.474-.383-4.028-.389-5-.07-11.153.192-3.707.392-6.879.445-7.047s.304-.307.56-.307c.526 0 .55.203 1.04 8.95.232 4.145.214 5.582-.121 9.284-.218 2.409-.456 4.476-.53 4.594-.117.191-.786.309-.872.153m6.542-.163c-.597-.966-.712-18.737-.166-25.465.14-1.716.204-1.895.705-1.966.304-.043.567-.043.585 0s.157 4.186.307 9.206c.267 8.934.073 17.387-.416 18.143-.232.358-.815.405-1.015.082m3.208.034c-.064-.104-.244-2.157-.4-4.56-.212-3.287-.212-6.684-.002-13.71.153-5.137.333-9.427.4-9.535.19-.31 1.077-.225 1.183.112.053.169.205 4.43.338 9.47.245 9.28.014 17.445-.512 18.107-.272.343-.827.407-1.007.116m6.921-.214c-.23-.278-.413-1.71-.581-4.568-.303-5.137.09-21.813.523-22.246.153-.153.539-.24.858-.195.537.076.591.223.734 1.986.617 7.596.42 24.22-.297 25.084-.378.456-.825.434-1.237-.061m3.223.043c-.617-.744-.835-8.18-.57-19.367.23-9.616.287-10.528.687-10.82.762-.557 1.293-.017 1.483 1.51.094.748.185 7.23.202 14.403.027 11.179-.021 13.147-.338 13.774-.428.848-1.01 1.047-1.464.5m3.47.045c-.145-.174-.392-2.26-.549-4.635-.343-5.185.086-26.777.544-27.328.365-.441.793-.405 1.25.106.326.366.413 1.926.589 10.602.245 12.055.244 12.553-.013 17.229-.146 2.645-.297 3.72-.56 3.983-.443.444-.916.46-1.262.043m-29.807-.143c-.073-.118-.311-2.111-.53-4.43-.364-3.875-.364-4.582-.003-8.782.367-4.257.599-5.323 1.059-4.863.101.102.363 2.19.58 4.64.35 3.938.357 4.928.058 8.501-.186 2.225-.393 4.293-.46 4.597-.122.56-.464.725-.704.337m-3.022-.521c-.128-.337-.374-2.298-.545-4.358-.251-3.026-.251-4.531 0-7.844.171-2.255.417-4.375.545-4.712.221-.579.245-.586.417-.123.1.27.328 2.345.504 4.61.264 3.387.265 4.828.003 8.09-.175 2.183-.402 4.19-.504 4.46-.175.463-.198.456-.42-.123m-3.259-.736c-.027-.067-.229-1.777-.449-3.8-.361-3.329-.364-4.016-.03-7.273.522-5.11.588-5.08 1.377.619.376 2.716.374 3.115-.02 6.128-.378 2.886-.74 4.668-.878 4.326m-3.364-5.209c-.376-3.344.286-8.583.774-6.128.597 3.005.664 3.895.407 5.434-.629 3.77-.823 3.883-1.181.694" style="fill:#f26e1e;fill-opacity:1;stroke-width:.999996" transform="translate(-12.364 -103.732)"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/stackOverflow-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/stackOverflow-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 175.838 175.838"><path d="M88 80h11v44H0V80h11v33h77z" style="fill:#fff" transform="translate(33.264 17.98)scale(1.12561)"/><path d="m19.324 78.568 60.81 12.781 2.557-12.156L21.88 66.406ZM27.37 49.45l56.332 26.235L88.95 64.42 32.617 38.184Zm15.587-27.637 47.757 39.769 7.954-9.551-47.757-39.768zM73.785-7.584 63.812-.166 100.9 49.699l9.973-7.417zM18.212 107.012H80.12V94.631H18.212Z" style="fill:#fff;stroke-width:1.12561" transform="translate(39.816 25.78)"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/stackOverflow-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/stackOverflow-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 175.838 175.838"><path d="M88 80h11v44H0V80h11v33h77z" style="fill:#000" transform="translate(33.264 17.98)scale(1.12561)"/><path fill="#f58025" d="m19.324 78.568 60.81 12.781 2.557-12.156L21.88 66.406ZM27.37 49.45l56.332 26.235L88.95 64.42 32.617 38.184Zm15.587-27.637 47.757 39.769 7.954-9.551-47.757-39.768zM73.785-7.584 63.812-.166 100.9 49.699l9.973-7.417zM18.212 107.012H80.12V94.631H18.212Z" style="fill:#000;stroke-width:1.12561" transform="translate(39.816 25.78)"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tekstowo-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tekstowo-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><g transform="translate(0 -24)"><circle cx="50" cy="74" r="50" style="fill:#f60;fill-opacity:1;stroke-width:4.40315;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.53144"/><linearGradient id="a" x1="39.888" x2="52.096" y1="92.284" y2="125.824" gradientTransform="translate(0 1.24)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#8fe132"/><stop offset=".362" stop-color="#65bd23"/><stop offset=".668" stop-color="#49a519"/><stop offset=".844" stop-color="#3e9c15"/></linearGradient><path fill="url(#a)" d="M57.783 105.823c-4.549 6.224-11.491 8.918-15.382 6.045s-3.411-10.295 1.137-16.519c4.549-6.224 11.492-8.918 15.382-6.045 3.95 2.933 3.411 10.294-1.137 16.519" style="fill:#8fe132;fill-opacity:1;stroke-width:.999999"/><linearGradient id="b" x1="-3.574" x2="82.773" y1="24.316" y2="74.169" gradientTransform="translate(0 1.24)" gradientUnits="userSpaceOnUse"><stop offset=".184" stop-color="#8fe132"/><stop offset="1" stop-color="#3e9c15"/></linearGradient><path fill="url(#b)" d="M65.563 59.858c-3.77-4.549-8.977-8.02-14.124-9.696-8.619-2.813-10.773-4.25-14.843-7.481-2.334-1.856-3.95-5.387-5.925-6.404-.958-.48-1.557-.06-1.916.299-.538.538-1.077 1.676-.419 3.112 5.207 12.39 25.856 48.539 25.856 48.539 1.795-.18 3.411.12 4.728 1.077a6.7 6.7 0 0 1 1.496 1.676L42.461 57.464s-2.155-2.993 1.616-3.591c2.693-.42 8.32.658 11.252 2.453 3.172 1.976 10.534 8.2 11.97 16.46.658 3.83 0 5.805.24 9.216.12 1.556 1.735 3.053 3.231.958.778-1.077 1.197-5.028 1.197-8.14 0-4.07-2.932-10.713-6.404-14.962" style="fill:#8fe132;fill-opacity:1;stroke-width:.999999"/></g></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tenor-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tenor-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3704.895 3733.965"><path fill="#007add" d="M1899.862 1243.433h442.598c60.892 0 110.508 19.733 142.081 74.424 52.435 91.902-1.127 202.974-105.997 218.761-16.351 2.255-33.83 2.82-50.744 2.82h-427.938v1037.987c0 67.659 10.712 132.498 56.382 187.752 37.212 45.105 87.392 64.275 142.082 72.732 81.754 12.968 162.943 6.202 242.442-18.606 75.551-24.244 149.975 9.585 175.347 80.063 25.936 71.604-10.712 142.082-80.626 175.91-94.721 46.234-193.953 66.531-298.823 72.17-271.76 13.531-515.894-183.805-557.053-453.31-5.638-34.957-7.33-71.041-7.33-106.562-.563-335.472-.563-670.943-.563-1006.415v-38.904c-12.404-.564-22.553-1.691-32.138-1.691-62.02 0-124.04 1.127-186.06-.564-101.487-2.82-166.89-78.935-151.667-174.784 10.713-67.658 72.169-118.401 149.412-120.657 60.892-1.691 122.348-.564 183.24-.564 37.213 0 37.213 0 37.213-38.903V813.238c0-95.849 69.35-169.145 161.816-170.273s165.198 72.733 165.762 169.71c.564 131.37 0 263.303 0 394.672.564 10.713.564 21.99.564 36.085"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/textStorage-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/textStorage-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#fff" d="M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2m-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1m7 18H5V4h2v3h10V4h2z"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/textStorage-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/textStorage-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2m-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1m7 18H5V4h2v3h10V4h2z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/threads-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/threads-icon-light.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 25.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 878 1000" style="enable-background:new 0 0 878 1000;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#FFFFFF;} +</style> +<g> + <path class="st0" d="M446.7,1000h-0.3c-149.2-1-263.9-50.2-341-146.2C36.9,768.3,1.5,649.4,0.3,500.4v-0.7 + c1.2-149.1,36.6-267.9,105.2-353.4C182.5,50.2,297.3,1,446.4,0h0.3h0.3c114.4,0.8,210.1,30.2,284.4,87.4 + c69.9,53.8,119.1,130.4,146.2,227.8l-85,23.7c-46-165-162.4-249.3-346-250.6c-121.2,0.9-212.9,39-272.5,113.2 + C118.4,271,89.6,371.4,88.5,500c1.1,128.6,29.9,229,85.7,298.5c59.6,74.3,151.3,112.4,272.5,113.2c109.3-0.8,181.6-26.3,241.7-85.2 + c68.6-67.2,67.4-149.7,45.4-199.9c-12.9-29.6-36.4-54.2-68.1-72.9c-8,56.3-25.9,101.9-53.5,136.3c-36.9,45.9-89.2,71-155.4,74.6 + c-50.1,2.7-98.4-9.1-135.8-33.4c-44.3-28.7-70.2-72.5-73-123.5c-2.7-49.6,17-95.2,55.4-128.4c36.7-31.7,88.3-50.3,149.3-53.8 + c44.9-2.5,87-0.5,125.8,5.9c-5.2-30.9-15.6-55.5-31.2-73.2c-21.4-24.4-54.5-36.8-98.3-37.1c-0.4,0-0.8,0-1.2,0 + c-35.2,0-83,9.7-113.4,55L261.2,327c40.8-60.6,107-94,186.6-94c0.6,0,1.2,0,1.8,0c133.1,0.8,212.4,82.3,220.3,224.5 + c4.5,1.9,9,3.9,13.4,5.9c62.1,29.2,107.5,73.4,131.4,127.9c33.2,75.9,36.3,199.6-64.5,298.3C673.1,965,579.6,999.1,447,1000 + L446.7,1000L446.7,1000z M488.5,512.9c-10.1,0-20.3,0.3-30.8,0.9c-76.5,4.3-124.2,39.4-121.5,89.3c2.8,52.3,60.5,76.6,116,73.6 + c51-2.7,117.4-22.6,128.6-154.6C552.6,516,521.7,512.9,488.5,512.9z"/> +</g> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/threads-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/threads-icon.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 25.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 878 1000" style="enable-background:new 0 0 878 1000;" xml:space="preserve"> +<g> + <path d="M446.7,1000h-0.3c-149.2-1-263.9-50.2-341-146.2C36.9,768.3,1.5,649.4,0.3,500.4v-0.7c1.2-149.1,36.6-267.9,105.2-353.4 + C182.5,50.2,297.3,1,446.4,0h0.3h0.3c114.4,0.8,210.1,30.2,284.4,87.4c69.9,53.8,119.1,130.4,146.2,227.8l-85,23.7 + c-46-165-162.4-249.3-346-250.6c-121.2,0.9-212.9,39-272.5,113.2C118.4,271,89.6,371.4,88.5,500c1.1,128.6,29.9,229,85.7,298.5 + c59.6,74.3,151.3,112.4,272.5,113.2c109.3-0.8,181.6-26.3,241.7-85.2c68.6-67.2,67.4-149.7,45.4-199.9 + c-12.9-29.6-36.4-54.2-68.1-72.9c-8,56.3-25.9,101.9-53.5,136.3c-36.9,45.9-89.2,71-155.4,74.6c-50.1,2.7-98.4-9.1-135.8-33.4 + c-44.3-28.7-70.2-72.5-73-123.5c-2.7-49.6,17-95.2,55.4-128.4c36.7-31.7,88.3-50.3,149.3-53.8c44.9-2.5,87-0.5,125.8,5.9 + c-5.2-30.9-15.6-55.5-31.2-73.2c-21.4-24.4-54.5-36.8-98.3-37.1c-0.4,0-0.8,0-1.2,0c-35.2,0-83,9.7-113.4,55L261.2,327 + c40.8-60.6,107-94,186.6-94c0.6,0,1.2,0,1.8,0c133.1,0.8,212.4,82.3,220.3,224.5c4.5,1.9,9,3.9,13.4,5.9 + c62.1,29.2,107.5,73.4,131.4,127.9c33.2,75.9,36.3,199.6-64.5,298.3C673.1,965,579.6,999.1,447,1000L446.7,1000L446.7,1000z + M488.5,512.9c-10.1,0-20.3,0.3-30.8,0.9c-76.5,4.3-124.2,39.4-121.5,89.3c2.8,52.3,60.5,76.6,116,73.6 + c51-2.7,117.4-22.6,128.6-154.6C552.6,516,521.7,512.9,488.5,512.9z"/> +</g> +</svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tiktok-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tiktok-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 398.67 398.67"><circle cx="199.34" cy="199.34" r="199.34"/><path fill="#25f4ee" d="M171.6 165.74v-10.88c-3.73-.51-7.52-.83-11.39-.83-46.6 0-84.51 37.91-84.51 84.51 0 28.59 14.29 53.89 36.08 69.19-14.07-15.1-22.7-35.33-22.7-57.54 0-45.93 36.84-83.39 82.52-84.46Z"/><path fill="#25f4ee" d="M173.59 288.8c20.79 0 37.75-16.54 38.52-37.14l.07-184.01h33.62c-.7-3.78-1.08-7.67-1.08-11.65H198.8l-.07 184.01c-.77 20.61-17.73 37.14-38.52 37.14-6.46 0-12.55-1.62-17.9-4.43 7.02 9.72 18.41 16.09 31.29 16.09ZM308.6 130.1v-10.23c-12.82 0-24.77-3.81-34.79-10.34 8.92 10.24 21.04 17.63 34.79 20.57"/><path fill="#fe2c55" d="M273.81 109.52c-9.77-11.22-15.71-25.87-15.71-41.88h-12.3c3.24 17.49 13.62 32.5 28.01 41.88M160.21 199.95c-21.28 0-38.6 17.31-38.6 38.6 0 14.82 8.41 27.7 20.69 34.16-4.58-6.34-7.31-14.11-7.31-22.51 0-21.28 17.32-38.6 38.6-38.6 3.97 0 7.78.66 11.39 1.78v-46.87c-3.73-.51-7.52-.83-11.39-.83-.67 0-1.33.04-2 .05v36c-3.6-1.13-7.42-1.78-11.39-1.78Z"/><path fill="#fe2c55" d="M308.6 130.1v35.69c-23.81 0-45.87-7.62-63.88-20.54v93.31c0 46.6-37.91 84.51-84.51 84.51-18.01 0-34.71-5.68-48.43-15.32 15.44 16.57 37.43 26.97 61.82 26.97 46.6 0 84.51-37.91 84.51-84.51V156.9c18.01 12.93 40.07 20.54 63.88 20.54v-45.92c-4.59 0-9.07-.5-13.38-1.42Z"/><path fill="#fff" d="M244.72 238.55v-93.31c18.01 12.93 40.07 20.54 63.88 20.54v-35.69c-13.75-2.94-25.87-10.33-34.79-20.57-14.39-9.38-24.77-24.39-28.01-41.88h-33.62l-.07 184.01c-.77 20.61-17.73 37.14-38.52 37.14-12.88 0-24.27-6.36-31.29-16.09-12.29-6.47-20.69-19.34-20.69-34.16 0-21.28 17.32-38.6 38.6-38.6 3.97 0 7.78.66 11.39 1.78v-36c-45.68 1.07-82.52 38.53-82.52 84.46 0 22.22 8.63 42.44 22.7 57.54 13.73 9.64 30.42 15.32 48.43 15.32 46.6 0 84.51-37.91 84.51-84.51Z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/translate-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/translate-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#fff" d="m12.87 15.07-2.54-2.51.03-.03A17.5 17.5 0 0 0 14.07 6H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2zm-2.62 7 1.62-4.33L19.12 17z"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/translate-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/translate-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.5 17.5 0 0 0 14.07 6H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2zm-2.62 7 1.62-4.33L19.12 17z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tumblr-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/tumblr-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#314358" d="M178.348 183.74c-3.767 1.796-10.971 3.36-16.344 3.494-16.219.434-19.366-11.393-19.497-19.966v-63.066h40.684V73.528h-40.543V21.922h-29.669c-.488 0-1.34.428-1.461 1.512-1.736 15.795-9.126 43.515-39.861 54.6V104.2h20.504v66.19c0 22.664 16.718 54.863 60.85 54.103 14.89-.255 31.428-6.488 35.08-11.869z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/twitch-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/twitch-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 118 138"><path fill="#FFF" d="m107.806 63.704-19.602 19.6h-19.6l-17.152 17.152V83.305h-22.05V9.8h78.404z"/><path fill="#9146FF" d="M117.605 0v68.605l-44.102 44.099H53.904l-24.503 24.503v-24.503H0V24.502L24.5 0zm-9.8 9.801H29.401v73.503h22.051v17.15l17.153-17.15h19.601l19.599-19.601zm-14.7 17.15v29.4h-9.8v-29.4zm-26.952 0v29.4h-9.8v-29.4z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/twitter-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/twitter-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><path d="M500 0c276.1 0 500 223.9 500 500s-223.9 500-500 500S0 776.1 0 500 223.9 0 500 0" style="fill:#1da1f2"/><path d="M384 754c235.8 0 364.9-195.4 364.9-364.9 0-5.5 0-11.1-.4-16.6 25.1-18.2 46.8-40.6 64-66.4-23.4 10.4-48.2 17.2-73.6 20.2 26.8-16 46.8-41.2 56.4-70.9-25.2 14.9-52.7 25.5-81.4 31.1-48.6-51.6-129.8-54.1-181.4-5.6-33.3 31.3-47.4 78-37.1 122.5-103.1-5.2-199.2-53.9-264.3-134-34 58.6-16.7 133.5 39.7 171.2-20.4-.6-40.4-6.1-58.2-16v1.6c0 61 43 113.6 102.9 125.7-18.9 5.1-38.7 5.9-57.9 2.2 16.8 52.2 64.9 88 119.8 89.1-45.4 35.7-101.5 55.1-159.2 55-10.2 0-20.4-.6-30.5-1.9C246.1 734 314.4 754 384 753.9" style="fill:#fff"/><path d="M500 0c276.1 0 500 223.9 500 500s-223.9 500-500 500S0 776.1 0 500 223.9 0 500 0" style="fill:none"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/ultimateGuitar-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/ultimateGuitar-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" ><path fill="#ffd706" d="m5 3.4 3.25 9.15C9.2 9.85 11.7 6.8 15.8 6.8c4.3 0 6.95 3.15 7.45 6.6h6.8L33.25 1 25.7 4.9c-1.8-1.5-4.15-2.35-6.7-2.35-3.45 0-6 1.4-7.7 3.3L5 3.4zM18.5 21.65 36 13.4v14.9l-3.65-1.4C30.3 33.15 25.6 37.6 18.4 37.6c-8 0-13.6-6.25-13.6-13.9 0-2.25.45-4.1 1.25-5.9h.1a13.79 13.79 0 0 0-.65 4.3c0 6.05 4.6 10.6 10.55 10.6 5.3 0 8.7-3.7 10.3-8.05l-7.85-3z"></path></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/urbanDictionary-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/urbanDictionary-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 181.729 181.818"><g transform="translate(208.04 -57.653)"><circle cx="-117.176" cy="148.562" r="90.865" style="fill:#134fe6;fill-opacity:1;fill-rule:evenodd;stroke-width:1.84677;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.411765;paint-order:stroke fill markers;stop-color:#000"/><path d="M-92.885 183.058a487 487 0 0 1 2.827-.823c.874-.25 3.203-1.137 5.177-1.97l3.59-1.515 3.422 1.937c1.882 1.065 3.556 1.938 3.72 1.94s.455-.184.646-.415c.368-.443.61-.432 4.619.206 1.78.284 1.967.26 4.384-.545 1.967-.655 2.74-1.061 3.499-1.838.905-.927.974-1.111.974-2.6 0-1.996-.351-2.349-2.551-2.566-2.074-.205-4.127-.976-6.087-2.286-2.927-1.955-2.64-1.226-3.808-9.663-.424-3.056-1.031-6.723-1.35-8.148-.566-2.524-.569-2.63-.119-4.057.441-1.4.44-1.49-.006-1.984-.449-.496-.445-.605.08-2.597.537-2.041.538-2.089.045-2.581-.492-.493-.492-.549.029-3.08l.53-2.577-.554-1.601-.554-1.602.584-4.617.584-4.618-.605-1.845-.605-1.844.473-2.33.473-2.331-.928-1.451-.928-1.451-2.44-.325c-2.188-.291-2.491-.28-2.925.113-.45.407-.82.405-5.323-.031-4.35-.422-4.933-.429-5.773-.07-.9.386-.947.475-1.28 2.456-.292 1.737-.288 2.113.023 2.424.515.515 6.818 1.71 9.17 1.737 1.883.023 1.982.057 2.856.976.894.94.904.98.797 2.93-.15 2.721.244 5.876.91 7.295.307.652.662 1.25.789 1.328.126.078-.187.97-.696 1.98-.86 1.707-.987 1.84-1.782 1.838-1.366-.002-2.741-.471-6.413-2.186-3.05-1.424-3.67-1.62-5.464-1.726-11.095-.658-20.071 10.868-20.149 25.874-.042 8.214 2.199 14.08 7.334 19.195 1.938 1.93 2.84 2.607 4.653 3.498 2.207 1.085 4.695 1.847 6.168 1.89.409.013 1.302-.142 1.984-.344zm-5.135-12.127c-5.612-5.775-7.062-8.062-7.213-11.377-.071-1.562.008-2.221.325-2.705.376-.574.379-.757.028-1.75-.594-1.684-.516-5.115.147-6.486 1.151-2.377 5.915-7.16 8.378-8.414 1.06-.539 1.811-.538 5.185.003l2.7.434 1.595 1.55c1.346 1.31 1.742 1.552 2.548 1.552.884 0 1.038.128 2.082 1.731l1.128 1.731-.483 1.596-.484 1.597.98 4.368.98 4.369-.796 1.393c-1.028 1.796-2.01 4.44-2.24 6.035-.183 1.253-.186 1.257-1.213 1.257-.975 0-1.115.11-2.604 2.067l-1.573 2.066-2.992 1.042a206 206 0 0 0-3.157 1.116c-.09.04-1.585-1.388-3.321-3.175zm-19.687 11.715a62 62 0 0 0 4.219-1.125l1.969-.623.466-1.845.612-2.43c.13-.518-.334-.87-4.109-3.123-6.01-3.585-5.812-3.505-6.938-2.809l-.921.57-.153-.864c-.085-.474-.645-4.356-1.246-8.626l-1.092-7.763.554-.388c.687-.48.687-.864.01-5.058l-.544-3.37.723-4.391.724-4.393-.597-1.471c-.533-1.312-.737-1.531-1.882-2.024-1.592-.685-1.725-.684-3.41.016l-1.366.568-2.947-1.098-2.946-1.098-3.018 1.365c-2.67 1.207-3 1.428-2.866 1.918.084.305.228 1.001.319 1.547l.166.992h9.066l1.783 1.196c1.693 1.136 1.783 1.249 1.783 2.23 0 .784-.158 1.158-.653 1.547-.624.49-.678.774-1.201 6.303-.928 9.805-2.131 16.607-3.384 19.134-.89 1.796-7.592 4.735-12.196 5.348l-2.332.31-2.961-1.014c-1.63-.557-3.027-1.12-3.107-1.249-.212-.342-1.596-8.89-1.963-12.124-.284-2.507-.261-3.044.247-5.79l.56-3.027-.561-.598-.562-.598.829-4.312c1.382-7.203 1.442-7.91.802-9.533-.302-.767-.576-1.421-.608-1.454s-1.838-.548-4.013-1.145l-3.954-1.086-3.702.16-3.702.16-1.259 1.24c-.692.681-1.259 1.37-1.259 1.528 0 .643 1.594 2.774 2.075 2.774.284 0 .816.457 1.232 1.058.848 1.223 1.12 1.266 4.26.665 1.908-.365 2.093-.36 2.565.066.89.804 1.784 2.93 2.006 4.767.213 1.764.177 2.314-.502 7.786-.317 2.555-.304 3.09.129 5.45.46 2.507.461 2.966.037 10.85l-.443 8.234.675 1.332c.371.732.815 1.331.987 1.331.171 0 .646-.32 1.054-.71.408-.392.742-.57.742-.398 0 .514 1.86 2.414 3.02 3.086.595.344 2.282.995 3.75 1.447l2.668.823 6.672-2.385 6.671-2.385 1.772.892c2.244 1.13 5.734 2.364 9.011 3.187 4.247 1.066 5.168 1.114 8.24.427z" style="fill:#fff;fill-opacity:1;stroke-width:.264583"/></g></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/waybackMachine-icon-light.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/waybackMachine-icon-light.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 423.263 478.78"><path d="M172.479 524.331h356.707v18.292H172.479zm14.07-35.179h329.268v25.329H186.549zm-2.11-288.461h327.509v35.178H184.439z" style="stroke-width:.842756;fill:#fff" transform="translate(-139.201 -101.486)"/><path d="M347.701 162.012h191.805l11.687-12.94-203.492-47.586-203.491 47.586 11.687 12.94z" style="fill:#fff" transform="translate(-84.035 -47.885)scale(.84276)"/><path d="M231.678 347.234c-.282-17.277-.73-34.554-1.406-51.819-.637-16.267-1.686-32.518-2.477-48.78-.069-1.403-.663-1.707-1.828-1.961-4.798-1.046-9.621-1.537-14.464-1.545-4.844.008-9.667.499-14.465 1.545-1.164.253-1.76.558-1.828 1.962-.79 16.261-1.84 32.512-2.476 48.78-.677 17.264-1.125 34.541-1.407 51.818-.2 12.243-.076 24.496.118 36.743.214 13.586.516 27.176 1.066 40.752.59 14.57 1.502 29.127 2.302 43.687.153 2.79.439 5.573.657 8.285 5.376 1.4 10.706 2.207 16.033 2.274 5.328-.067 10.657-.875 16.034-2.274.218-2.712.503-5.495.656-8.285.8-14.56 1.712-29.118 2.302-43.687.55-13.576.852-27.166 1.066-40.752.193-12.247.318-24.5.117-36.743m89.173 0c-.282-17.277-.73-34.554-1.407-51.819-.638-16.267-1.687-32.518-2.477-48.78-.069-1.403-.663-1.707-1.828-1.961-4.797-1.046-9.621-1.537-14.464-1.545-4.843.008-9.666.499-14.464 1.545-1.164.253-1.76.558-1.828 1.962-.79 16.261-1.84 32.512-2.477 48.78-.676 17.264-1.125 34.541-1.406 51.818-.2 12.243-.076 24.496.117 36.743.215 13.586.516 27.176 1.066 40.752.59 14.57 1.502 29.127 2.302 43.687.153 2.79.439 5.573.656 8.285 5.377 1.4 10.707 2.207 16.034 2.274 5.327-.067 10.656-.875 16.033-2.274.217-2.712.503-5.495.657-8.285.798-14.56 1.71-29.118 2.3-43.687.55-13.576.852-27.166 1.067-40.752.195-12.247.319-24.5.119-36.743m103.419 0c-.283-17.277-.73-34.554-1.408-51.819-.637-16.267-1.685-32.518-2.476-48.78-.069-1.403-.663-1.707-1.828-1.961-4.797-1.046-9.62-1.537-14.464-1.545-4.843.008-9.666.499-14.464 1.545-1.165.253-1.76.558-1.828 1.962-.79 16.261-1.84 32.512-2.476 48.78-.678 17.264-1.125 34.541-1.407 51.818-.2 12.243-.076 24.496.118 36.743.215 13.586.515 27.176 1.066 40.752.59 14.57 1.502 29.127 2.301 43.687.155 2.79.44 5.573.657 8.285 5.377 1.4 10.706 2.207 16.033 2.274 5.327-.067 10.657-.875 16.034-2.274.217-2.712.503-5.495.656-8.285.8-14.56 1.711-29.118 2.302-43.687.55-13.576.85-27.166 1.066-40.752.194-12.247.318-24.5.118-36.743m87.06 0c-.282-17.277-.73-34.554-1.406-51.819-.638-16.267-1.686-32.518-2.477-48.78-.069-1.403-.663-1.707-1.828-1.961-4.797-1.046-9.62-1.537-14.464-1.545-4.842.008-9.666.499-14.463 1.545-1.166.253-1.76.558-1.828 1.962-.792 16.261-1.84 32.512-2.477 48.78-.677 17.264-1.125 34.541-1.407 51.818-.2 12.243-.076 24.496.118 36.743.214 13.586.515 27.176 1.066 40.752.59 14.57 1.502 29.127 2.301 43.687.154 2.79.44 5.573.657 8.285 5.377 1.4 10.707 2.207 16.033 2.274 5.327-.067 10.658-.875 16.034-2.274.218-2.712.503-5.495.656-8.285.8-14.56 1.712-29.118 2.302-43.687.55-13.576.85-27.166 1.066-40.752.194-12.247.318-24.5.118-36.743" style="stroke-width:.842756;fill:#fff" transform="translate(-139.201 -101.486)"/></svg> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/waybackMachine-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/waybackMachine-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 423.263 478.78"><path d="M172.479 524.331h356.707v18.292H172.479zm14.07-35.179h329.268v25.329H186.549zm-2.11-288.461h327.509v35.178H184.439z" style="stroke-width:.842756" transform="translate(-139.201 -101.486)"/><path d="M208.992 88.651h161.645l9.85-10.905-171.495-40.103L37.5 77.746l9.85 10.905z"/><path d="M231.678 347.234c-.282-17.277-.73-34.554-1.406-51.819-.637-16.267-1.686-32.518-2.477-48.78-.069-1.403-.663-1.707-1.828-1.961-4.798-1.046-9.621-1.537-14.464-1.545-4.844.008-9.667.499-14.465 1.545-1.164.253-1.76.558-1.828 1.962-.79 16.261-1.84 32.512-2.476 48.78-.677 17.264-1.125 34.541-1.407 51.818-.2 12.243-.076 24.496.118 36.743.214 13.586.516 27.176 1.066 40.752.59 14.57 1.502 29.127 2.302 43.687.153 2.79.439 5.573.657 8.285 5.376 1.4 10.706 2.207 16.033 2.274 5.328-.067 10.657-.875 16.034-2.274.218-2.712.503-5.495.656-8.285.8-14.56 1.712-29.118 2.302-43.687.55-13.576.852-27.166 1.066-40.752.193-12.247.318-24.5.117-36.743m89.173 0c-.282-17.277-.73-34.554-1.407-51.819-.638-16.267-1.687-32.518-2.477-48.78-.069-1.403-.663-1.707-1.828-1.961-4.797-1.046-9.621-1.537-14.464-1.545-4.843.008-9.666.499-14.464 1.545-1.164.253-1.76.558-1.828 1.962-.79 16.261-1.84 32.512-2.477 48.78-.676 17.264-1.125 34.541-1.406 51.818-.2 12.243-.076 24.496.117 36.743.215 13.586.516 27.176 1.066 40.752.59 14.57 1.502 29.127 2.302 43.687.153 2.79.439 5.573.656 8.285 5.377 1.4 10.707 2.207 16.034 2.274 5.327-.067 10.656-.875 16.033-2.274.217-2.712.503-5.495.657-8.285.798-14.56 1.71-29.118 2.3-43.687.55-13.576.852-27.166 1.067-40.752.195-12.247.319-24.5.119-36.743m103.419 0c-.283-17.277-.73-34.554-1.408-51.819-.637-16.267-1.685-32.518-2.476-48.78-.069-1.403-.663-1.707-1.828-1.961-4.797-1.046-9.62-1.537-14.464-1.545-4.843.008-9.666.499-14.464 1.545-1.165.253-1.76.558-1.828 1.962-.79 16.261-1.84 32.512-2.476 48.78-.678 17.264-1.125 34.541-1.407 51.818-.2 12.243-.076 24.496.118 36.743.215 13.586.515 27.176 1.066 40.752.59 14.57 1.502 29.127 2.301 43.687.155 2.79.44 5.573.657 8.285 5.377 1.4 10.706 2.207 16.033 2.274 5.327-.067 10.657-.875 16.034-2.274.217-2.712.503-5.495.656-8.285.8-14.56 1.711-29.118 2.302-43.687.55-13.576.85-27.166 1.066-40.752.194-12.247.318-24.5.118-36.743m87.06 0c-.282-17.277-.73-34.554-1.406-51.819-.638-16.267-1.686-32.518-2.477-48.78-.069-1.403-.663-1.707-1.828-1.961-4.797-1.046-9.62-1.537-14.464-1.545-4.842.008-9.666.499-14.463 1.545-1.166.253-1.76.558-1.828 1.962-.792 16.261-1.84 32.512-2.477 48.78-.677 17.264-1.125 34.541-1.407 51.818-.2 12.243-.076 24.496.118 36.743.214 13.586.515 27.176 1.066 40.752.59 14.57 1.502 29.127 2.301 43.687.154 2.79.44 5.573.657 8.285 5.377 1.4 10.707 2.207 16.033 2.274 5.327-.067 10.658-.875 16.034-2.274.218-2.712.503-5.495.656-8.285.8-14.56 1.712-29.118 2.302-43.687.55-13.576.85-27.166 1.066-40.752.194-12.247.318-24.5.118-36.743" style="stroke-width:.842756" transform="translate(-139.201 -101.486)"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/wikipedia-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/wikipedia-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 103 94"><radialGradient id="a" cx="244.571" cy="-427.139" r="68.687" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".483" stop-color="#EAEAEB"/><stop offset=".945" stop-color="#A9ABAE"/><stop offset="1" stop-color="#999B9E"/></radialGradient><path d="M49.85 17.003c.014-.606-.392-1.27-.392-1.27l-.025-.058s-.487-.949-1.301-1.228c-.815-.278-1.478.342-1.478.342l-.428.494c-.313.364-.507.666-1.198.938-.692.271-1.379.204-1.743.033-.365-.172-.457-.537-.457-.537s-.229-.722-.313-1.049c-.086-.331-.308-1.694-.308-1.694s-.492-2.747-.535-3.304c0 0 1.475-.126 3.686-.775 2.3-.673 3.043-1.206 3.043-1.206s-.432-.156-.484-.662c-.051-.507-.089-1.19-.089-1.19s-.089-.5.483-1.139c.572-.64 1.354-.863 1.763-.953.41-.089 1.281-.17 2.092-.134.813.038 1.266.112 1.594.291.327.178.356.61.356.61l-.009 1.146s-.035.402.262.529c0 0 .505.305 2.197.133 0 0 .719-.126 1.845-.46 1.125-.335 4.129-1.229 4.554-1.341s.953-.291 1.645-.469a34 34 0 0 0 2.309-.73c.27-.104 1.811-.618 2.928-.81 1.114-.195 2.226-.186 2.813.149 0 0 .357.304.521.662.162.358.476.863.92 1.088.457.227.754.371 1.877.273 0 0 .021-.096-.396-.37-.417-.277-.991-.701-.991-.701s-.334-.245-.408-.447c-.072-.202-.043-.306-.043-.306l.877-1.406s0-.172.506-.238c.506-.067 1.074-.134 1.742-.313.67-.178.789-.312.789-.312l.578.178s3.547 2.853 4.655 3.583l.198-.239s.437.018.828.172c.393.154.979.562.979.562s1.613 1.31 2.072 2.2l.222.679-.102.161s.919 1.307 2.096 2.602c0 0 1.229 1.664 1.689 2.09 0 0-.108-.399-.203-.849l.339-.226.2-.144.617.259c3.575 4.811 6.435 10.424 8.144 16.328l-.121.484.396.501a51 51 0 0 1 1.729 13.211q-.001 1.684-.109 3.339l-.304.511.226.555C99.95 72.645 78.057 93.131 51.38 93.131c-18.502 0-34.702-9.854-43.637-24.601l-.102-.365-.205-.151A50.6 50.6 0 0 1 .841 48.91l.212-.524-.336-.482a51 51 0 0 1-.322-5.758c0-2.985.255-5.909.748-8.755l.25-.562-.087-.328A50.6 50.6 0 0 1 7.78 15.7l.684-.384.081.032s.233-.169.354-.217l.076-.023s1.179-1.971 1.625-2.601c0 0 .542-.348.745-.407 0 0 .124-.016.189.076 0 0 .496-.432 1.699-2.054l.012-.017s-.114-.076-.131-.174.108-.591.173-.717.108-.156.108-.156 1.722-2.032 3.151-3.238c0 0 .26-.202.678-.25 0 0 1.472-.613 3.264-2.184 0 0 .051-.289.478-.858.428-.57 1.456-1.163 2.222-1.337.764-.174.896-.038.896-.038l.064.065.515.766s.565-.316 1.413-.604c.847-.289.979-.262.979-.262l.823 1.336-.987 2s-.644 1.421-1.655 2.185c0 0-.472.284-1.12.127s-1.072.333-1.072.333l-.17.14s.14-.024.346-.103c0 0 .158.065.274.223.114.158.913 1.175.913 1.175s.005.837-.415 1.938c-.419 1.1-1.467 2.891-1.467 2.891s-.733 1.424-1.075 2.253-.515 1.765-.488 2.262c0 0 .187.062.707-.202.655-.332 1.083.027 1.083.027s.719.53 1.041.881c.262.289.802 1.765.209 3.224 0 0-.402 1.008-1.377 1.724 0 0-.216.332-1.529.174-.368-.043-.585-.276-1.372-.2-.785.077-1.231.815-1.231.815l.013-.024c-.692.999-1.154 2.458-1.154 2.458l-.057.165s-.241.509-.292 1.752c-.053 1.284.284 3.109.284 3.109s7.876-1.387 9.88-.055l.58.532s.046.174-.031.376c-.08.204-.375.673-.987 1.113-.611.438-1.222 1.583-.313 2.304 1.034.818 1.691.766 3.43.468 1.74-.297 2.898-1.269 2.898-1.269s.972-.72.783-1.628-1.017-1.189-1.017-1.189-.658-.423-.141-1.238c0 0 .141-.689 2.553-1.316 2.414-.626 6.812-1.52 10.557-1.989 0 0-2.539-8.223-.738-9.289 0 0 .438-.296 1.224-.408l.72-.037c.131-.027.343.005.796.045.453.038 1.001.076 1.678-.441.676-.519.697-.819.697-.819" style="fill:url(#a)"/><linearGradient id="c" x1="456.274" x2="502.776" y1="510.16" y2="582.912" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#8A8A8A"/><stop offset=".569" stop-color="#606060"/><stop offset=".591" stop-color="#FFF"/><stop offset=".612" stop-color="#585858"/><stop offset="1" stop-color="#303030"/></linearGradient><path d="m82.447 79.307.451.168q-.049.09-.101.179c-.864 1.573-.936 1.927-1.36 2.253s-.58.539-1.443.695c-.865.156-1.771 1.175-1.771 1.175s-.875.835-.48.866c.396.025 1.177-.609 1.177-.609s.497-.354.625-.255c.125.099-.539.751-.539.751s-1.161 1.176-2.479 1.982l-.396.213S78 85.333 78.895 84.33c0 0 .185-.271-.185.057-.369.325-1.332.821-1.741.821s.016-.563.016-.563.596-.768 1.812-1.758c1.22-.994 2.239-.922 2.239-.922s.227.043.253-.271c.028-.313.312-.863.312-.863s.453-1.032 1.674-2.749c1.218-1.714 1.77-2.195 1.77-2.195s1.588-1.629 2.423-3.259c0 0 .581-1.006-.364-.255-.951.753-2.211 1.7-3.44 2.014-1.233.312-1.349-.836-1.349-.836s-.271-1.884 1.049-3.344c1.188-1.316 2.492-1.273 3.684-1.415 1.188-.144 2.21-1.571 2.21-1.571s.82-.922 1.289-3.797c.218-1.337.067-2.244-.144-2.818l.021-.647-.368-.021a1 1 0 0 0-.135-.153s-.297-.299-.607-.524c-.313-.227-.692-.649-1.063-1.457 0 0-1.019-2.11-.792-5.156.227-3.047 2.762-2.762 2.762-2.762s1.475.143 1.76-.298c.283-.438.553-.993.649-2.223.101-1.233-.396-2.408-.396-2.408s-.186-.609-1.049-.708c-.863-.1-1.051.169-1.051.169s-.255.072-.723 1.09c-.471 1.021-.75 1.488-1.602 1.702-.849.211-2.023.099-2.549-.992-.515-1.072-1.757-3.693-2.351-5.772l.084-.735-.325-.471a11 11 0 0 1-.13-1.236c-.026-.992-.312-2.097-.638-3.2-.326-1.106-1.459-2.972-1.672-3.399-.324-.667-.621-.949-1.021-.893-.396.056-.339.056-.513.056-.168 0-.266.212-.311.425-.042.212-.375 1.315-1.104 1.812-.752.51-1.147.737-2.438.85 0 0-1.487.099-2.661-2.097-1.18-2.198-.879-3.598-.782-4.108.099-.51.539-1.247 1.229-1.388.693-.141 1.119-.184 1.119-.184s1.122-.01 1.603-.071c.551-.071.283-1.006.283-1.006s-.361-2.371-2.348-4.318l-.096-.487-.756-.381c-1.881-2.04-4.354-5.354-4.354-5.354s-1.105-1.048-.17-2.493c0 0 .438-.963 1.742-.792.419.081.457.123.818.199.481.099 1.008.225 1.478-.398 0 0 .438-.792-.271-1.812s-.923-1.742-1.785-1.687c0 0-.397-.055-.793.384-.395.438-1.415.716-2.011.778-.679.071-2.252-.528-3.156-2.082-.513-.874-.752-1.35-.865-1.595l.231-.34.72.08c.186.358.549 1.056.978 1.812.552.978 1.048 1.118 1.373 1.261.325.141 1.049-.071 1.431-.283.385-.213.766-.695 1.43-.738.668-.043 1.629.071 2.311.793s1.531 2.224 1.459 2.932c-.068.708-.111 1.403-1.035 1.699-.921.298-1.303.043-1.884-.084-.581-.128-.864-.072-1.104.211-.242.284-.512.892-.412 1.162.102.27.186.454.75 1.262.566.806 3.474 4.25 4.031 4.766l-.152.698.968.176c.625.724 1.358 1.668 1.687 2.263.493.907.752 2.337.779 3.002.025.666-.299.963-.299.963s-.313.524-2.012.524c-1.517 0-1.614.297-1.614.297s-.47.467-.369 1.615c.103 1.146.616 2.344 1.56 3.37.778.851 2.252-.006 2.748-.295.51-.299.822-1.264.822-1.264s.102-1.217 1.432-1.217c1.377 0 1.969 1.318 1.969 1.318s.963 1.295 1.941 4.121c.481 1.389.566 2.281.566 2.281l.126 1.668-.513.892.732.312c.135.541.348 1.24.686 2.044 0 0 1.008 2.381 1.443 3.286.44.906.896.766 1.264.808 0 0 .85.113 1.16-.282.313-.398.61-1.092.61-1.092s.663-1.812 2.138-1.657 1.84 1.092 2.096 2.168c.256 1.074.313 3.229-.479 4.545-.798 1.318-1.688 1.135-1.688 1.135s-1.813-.17-2.225.213c-.41.382-.623.724-.681 1.613-.058.894.026 2.336.751 4.08.631 1.523 1.146 1.361 1.432 1.728.284.368 1.188 1.204 1.104 3.272-.082 2.067-.791 4.149-1.586 5.439-.793 1.288-1.997 2.053-1.997 2.053s-.338.211-1.076.311c-.735.102-1.784.086-2.534.513-.75.426-.992 1.501-1.063 1.971-.069.468-.112 1.529.921 1.413 1.034-.109 2.577-1.4 2.577-1.4s1.486-1.104 1.685-.752c.199.354-.636 1.784-.636 1.784s-1.035 1.562-1.898 2.523c-.709.791-1.641 1.868-2.431 3.102z" style="opacity:.69;fill:url(#c)"/><linearGradient id="d" x1="425.286" x2="445.786" y1="502.951" y2="598.661" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#A8A9AB"/><stop offset="1" stop-color="#636668"/></linearGradient><path d="M23.441 22.732q-.01.013-.021.025.011-.012.021-.025" style="fill:url(#d)"/><linearGradient id="e" x1="421.068" x2="441.068" y1="504.37" y2="597.743" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#A8A9AB"/><stop offset="1" stop-color="#636668"/></linearGradient><path d="m38.188 89.707.163.01a3 3 0 0 0-.62-.414c-.699-.371-3.731-2.375-4.669-3.009-.936-.633-2.575-1.7-3.297-1.478-.554.172-.475.394-.804.556-.331.157-.687.052-1.504-.384-.818-.434-1.424-.725-3.02-2.239-1.245-1.185 1.595-.118 1.595-.118s.619.262.343-.385c-.277-.646-1.676-2.333-2.994-3.691a20 20 0 0 1-2.435-2.97l-.566-.661.007-.166c-.018-.024-.035-.054-.052-.078 0 0-1.874-3.377-1.676-4.617 0 0 .068-.828 1.241-1.188.817-.251.71.542 3.112.975 0 0 2.07.559 2.611-.945.539-1.505-.567-3.393-.567-3.393s-1.449-2.656-3.244-2.758c-.95-.053-.692.586-2.125.926 0 0-1.913.184-2.519-.963-.734-1.389-1.04-2.969-1.015-4.022.022-1 .054-1.079.119-1.371.045-.206.192-.582.254-1.128l-.134-.667.204-.501a13 13 0 0 0-.021-.83c-.091-1.66-.213-4.221-.437-5.71-.223-1.491-.633-3.798-1.991-3.866 0 0-.671-.051-1.634.885-.884.856-1.684-.708-1.728-1.663-.053-1.121.131-2.254.409-2.795s1.042-.567 1.186-.555c.146.013.555.171 1.043.474.488.305 1.16.305 1.557-.092.395-.394.947-.856 1.173-2.598.224-1.741.224-3.547.013-5.71l-.225-.484 1.339-.289c-.001-.017-.021-.126-.032-.193v-.005l-.007-.049-.001-.007-.009-.057-.001-.003-.009-.062v-.001l-.011-.068-.001-.008-.008-.066-.003-.017-.009-.069-.002-.014-.011-.076v-.005l-.011-.076-.003-.017-.009-.08-.002-.021q-.006-.04-.011-.081l-.002-.019a1 1 0 0 0-.013-.101l-.009-.082-.002-.016q-.003-.046-.01-.09l-.002-.021q-.005-.046-.011-.09l-.002-.022-.01-.093-.002-.019q-.004-.048-.009-.094v-.009q-.004-.048-.01-.1l-.001-.02-.007-.098-.001-.021q-.006-.05-.008-.099l-.001-.02q-.004-.051-.007-.102l-.001-.01-.006-.1-.001-.017-.005-.1-.001-.021-.003-.099-.001-.021-.004-.1v-.014l-.002-.099v-.009l-.001-.101v-.115l.001-.019.001-.095v-.015l.003-.099c.052-1.244.292-1.752.292-1.752l.057-.164s.46-1.459 1.154-2.459l-.013.024s.446-.738 1.231-.814c.785-.079 1.004.156 1.371.2l.115.013.037.004.075.006q.02.002.041.003l.064.004.041.003q.03 0 .058.003h.042l.055.002.038.002h.135l.032-.001.046-.001.03-.002.045-.002.026-.001a1 1 0 0 0 .067-.006l.044-.003.02-.002.045-.008.013-.001.052-.008q.053-.01.098-.021l.002-.002.039-.01.008-.001.028-.009q.006 0 .01-.003l.026-.009.008-.003.021-.009.009-.003q.01-.005.02-.009l.008-.004.019-.007.005-.004.016-.007.006-.004q.006-.003.012-.007.003 0 .005-.003l.012-.008.004-.003.011-.007.002-.003q.005-.003.008-.008h.002l.008-.007.001-.001.006-.006.003-.003.002-.002.003-.005q.004-.003.003-.004c.328-.241.593-.516.797-.775l.04-.05.008-.012.038-.048.007-.011q.018-.026.038-.05l.001-.001q.058-.083.109-.159l.003-.007.03-.044q.003-.006.007-.011l.024-.042q.004-.007.009-.013l.024-.042.001-.002q.025-.042.046-.079l.007-.012q.007-.015.016-.03l.012-.02.014-.024a.1.1 0 0 1 .011-.023l.012-.022.011-.021q.004-.008.01-.018c.066-.13.097-.207.097-.207.594-1.459.052-2.935-.21-3.224-.32-.354-1.041-.883-1.041-.883s-.426-.357-1.08-.025c-.521.264-.711.201-.711.201-.024-.498.149-1.432.491-2.263.341-.829 1.075-2.253 1.075-2.253s1.047-1.792 1.467-2.89c.418-1.102.415-1.94.415-1.94s-.795-1.019-.91-1.177a.7.7 0 0 0-.272-.223 2 2 0 0 1-.345.103l.169-.14s.424-.492 1.073-.334c.648.158 1.119-.126 1.119-.126 1.011-.764 1.654-2.187 1.654-2.187l.988-1.997-.826-1.337s-.131-.028-.979.259c0 0-.773 1.905-1.725 3.087 0 0-.374.552-.664.416a1.5 1.5 0 0 0-.91-.085c-.281.06-1.156.349-1.948 1.413-.79 1.064-.883 1.863-.458 2.101s1.045-.076 1.42-.407c.375-.333.638-.485.757-.47.118.02.093.315.068.41-.026.094-.154 1.364-1.625 3.913-.369.64-.845 1.589-1.069 2.046l.608.447-.999.503c-.266.758-.605 1.945-.471 2.61.204 1.011 1.158 1.011 1.158 1.011s.621.027 1.344-.348c.722-.375.892 1.242.892 1.505 0 .264-.007 1.726-1.02 2.442 0 0-.409.313-.985.313-.579 0-.954-.169-.954-.169s-.984-.272-1.59.083c-.604.358-1.326 1.098-1.897 2.17-.569 1.072-1.045 2.986-1.019 4.397.02 1.111.18 2.162.291 2.879l.667.435-.543.623c.079 1.136.168 3.363.155 4.109-.018.911-.154 2.84-1.115 3.292 0 0-.324.171-.868-.238s-1.132-.426-1.37-.435c-.238-.007-1.285.162-1.692 1.311-.408 1.145-.375 2.688-.29 3.597.086.91.876 2.458 1.872 2.458 0 0 .484.035 1.055-.553.568-.586.902-.637 1.156-.629.255.009.749.272 1.072 2.851.307 2.442.437 4.442.414 6.668l.605.392-.758.768c-.042.199-.089.417-.142.626-.169.682-.187 1.364-.024 2.569.161 1.21.811 3.72 1.754 4.375 1.252.871 2.071.856 2.916.791.842-.067 1.424-.712 1.424-.712s.331-.342.685-.237c.356.104 1.346.66 2.058 2.084.713 1.425.871 2.992-.316 3.272-1.187.272-3.231-.846-3.231-.846s-1.161-.647-2.109.064c-.951.713-.977 1.807-.502 3.15.261.738.782 1.938 1.513 3.188l.721.302-.193.551c.492.748 1.055 1.479 1.678 2.105 0 0 2.466 2.729 3.838 4.457 0 0 .08.157-.158.016-.238-.146-1.266-.621-1.82-.566-.555.054-.45.395-.45.395s.238 1.254 4.01 3.365c0 0 1.359.766 2.216.766 0 0 .277.039.619-.346.346-.381.45-.341.688-.262.237.076.553.249 1.741 1.105 1.188.857 3.496 2.176 4.325 2.731s.793.657.621 1.054c-.171.396.593.619.593.619s1.899.855 2.928.846c1.029-.016 1.464-.119 2.097.012.632.133 1.28.291 1.345.346.066.053-.315.038-.315.038s-2.362-.276-2.494-.21c-.13.066.014.184.99.436v.006q1.868.325 3.782.51c-.489-.061-2.52-.322-3.823-.713 0 0-.131-.078.173-.014.303.065 2.018.225 2.466.157.448-.065-.092-.274-.092-.274s-.897-.425-2.889-.582c0 0-.803-.055-1.503.014-.699.066-1.41-.264-1.41-.264s-1.028-.317-.78-.646a.47.47 0 0 0 .065-.502z" style="opacity:.45;fill:url(#e)"/><linearGradient id="f" x1="444.76" x2="473.842" y1="550.814" y2="550.814" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#231F20"/><stop offset="1" stop-color="#474747"/></linearGradient><path d="m62.342 86.16-.438.646c.096.655-.104.875-.254 1.119-.156.26-.59.592-.375 1.185.218.59 1.687.401 2.535.144.852-.26 1.569-.49 2.134-.693.562-.198.719.086.719.086s.246.175-.574.606c-.821.433-2.336.634-3.055.72-.724.086-.506-.043-1.586.33-1.082.377-.07.707-.07.707 2.435.635 4.188.115 4.188.115l.332-.097q.403-.118.803-.244c-2.021.456-3.326.149-3.739.095-.431-.058-.778-.145-.88-.361-.102-.215.479-.2.479-.2s1.683-.188 3.24-.69c1.557-.506 1.932-.98 1.871-1.341-.057-.358-.848-.332-1.785-.028-.937.305-2.334.75-2.662.821-.334.07-.691.06-.812-.146-.114-.203-.216-.53.146-.905.36-.376.402-.694.402-.694.055-.254.057-.523.021-.8zl.545-.118c-.298-1.124-1.052-2.218-1.279-2.577-.314-.507-.836-.793-2.393-.535-1.556.26-3.386 1.035-3.386 1.035s-1.888.997-3.298.812c-1.413-.188-1.703-1.614-1.688-2.063.015-.447.304-.835 1.039-1.123s2.465-.678 4.985-.808 3.458-1.771 3.458-1.771c.33-.478.922-1.543-.489-2.336-1.41-.791-1.441-.593-2.119-1.107-.678-.52-1.412-1.153-1.701-2.033a4 4 0 0 0-.104-.292l-.849-.558.41-.371c-.34-.67-.693-1.271-.693-1.271s-1.281-1.902-.246-3.703c1.038-1.803 2.736-2.348 2.736-2.348s1.5-.332 2.996.016c1.418.324 2.133-.219 2.133-.219s.865-.374 1.123-2.102c.264-1.729-.014-4.943-2.316-5.578-2.307-.633-3.527.563-3.527.563s-1.24 1.369-1.644 1.57-1.022.563-1.022.563-.867.519-1.453.648c-.393.086-1.791-1.771-1.933-3.201-.133-1.316-.401-2.388-.306-5.096l-.485-.63.537-.533c.101-2.999-.417-5.116-1.188-6.461-.807-1.412-2.119-2.161-2.766-2.478-.648-.318-2.147-.462-3.17-.086-1.023.374-1.239.678-1.613 1.326-.376.648-.836.605-.836.605s-1.427.043-1.888-2.133c-.646-3.049.359-4.035.359-4.035s.318-.476 1.369-.619c1.053-.144 1.73.115 2.537.315.806.202 1.41.116 2.419-.374 1.008-.491 1.442-1.297 1.238-2.739-.195-1.393-.255-1.742-1.483-5.964l-.875-.46.583-.579C44.87 23.032 44.8 20.35 44.8 20.35c-.106-.977.049-1.292.598-1.54.576-.259 1.116-.175 1.934-.123.818.053 1.425-.079 1.847-.316s1.581-.87 1.504-2.162c-.08-1.292-1.109-2.824-1.953-3.351-.843-.528-1.953-.316-2.558.131-.606.45-.845 1.029-1.214 1.214-.369.183-.895.605-1.45.474-.554-.132-.581-1.371-.818-2.77-.153-.907-.271-1.611-.338-1.989l-.678-.254c.044.557.535 3.304.535 3.304s.223 1.364.308 1.692c.086.329.314 1.05.314 1.05s.092.364.456.535c.365.172 1.052.24 1.743-.032.692-.271.886-.572 1.199-.938.315-.364.429-.493.429-.493s.663-.622 1.478-.343c.813.278 1.299 1.228 1.299 1.228l.028.06s.403.661.392 1.269v-.057s-.022.301-.697.818c-.676.519-1.226.479-1.678.442-.454-.04-.666-.072-.797-.045l-.719.038c-.786.111-1.224.408-1.224.408-1.8 1.064.736 9.288.736 9.288l-.276.613s.514 2.052.904 3.378c.388 1.326.562 2.637.62 2.91s.044.762-.317 1.051c-.359.289-1.239.534-1.425.562-.187.029-.535-.042-.996-.201-.462-.158-.922-.187-.922-.187s-1.11-.188-2.291.173c-1.182.359-2.076 1.569-2.148 3.083-.071 1.513-.057 2.278.535 3.617.59 1.34 1.657 2.104 2.463 2.118.808.014 1.469-.403 1.931-1.051.459-.65.59-.751.59-.751.548-.302 1.944-.433 2.651-.172.708.258 2.007 1.073 2.723 2.679.579 1.298.76 2.75.729 5.363l.584.448-.61.703q-.01.368-.026.761c-.143 3.876.72 5.864.72 5.864.491 1.065 1.023 1.83 1.745 2.318.719.489 1.699.156 2.018 0 .315-.158 1.194-.563 1.943-1.037.749-.477.725-.679 1.629-1.515.907-.833 2.076-.604 2.076-.604s1.107.028 1.74 1.313c.637 1.283.509 3.109.347 3.773-.158.662-.444 1.097-1.063.979a19 19 0 0 0-2.019-.231c-.375-.014-1.433-.049-2.394.203-.938.244-2.205.92-3.414 2.883-.938 1.52-.478 3.013-.262 3.603.17.462.635 1.104 1.043 1.896l.756.252-.35.656c.398.963.701 1.493 1.305 2.151.648.705 1.672 1.251 2.881 1.714 1.213.462.662 1.282.662 1.282-.69 1.497-2.75 1.557-3.354 1.628s-1.872.188-3.058.447c-1.182.261-2.291.418-2.954 1.182-.661.764-.402 1.557-.013 2.393.388.834 1.427 1.28 2.853 1.226 1.426-.058 2.35-.476 3.214-.851s2.362-.809 2.81-.937c.445-.129 1.051-.39 1.498.26.482.701.994 1.697 1.229 2.45z" style="opacity:.35;fill:url(#f)"/><path d="M101.566 51.162s.347-3.236.457-4.392q.026-.259.045-.513l-.098-.241c-.459 5.815-.938 7.727-.938 7.727s.013-.037.031-.101q.282-1.227.51-2.48zM91.268 12.579l.328.413.279.5c1.021 1.648 2.846 4.295 2.846 4.295s.739.958.905.968c.164.01-.084-.741-.084-.741s-.271-.979.517.298c.73 1.19 1.207 2.359 1.317 2.72.114.361.042.411.042.411s-.146.072-.146.33c0 .505.496 1.659.496 1.659s1.545 3.926 2.07 5.563c.526 1.641 1.133 4.368 1.133 4.368s.187.804.207 1.174c.021.371-.063.381-.229.186-.164-.196-.329-.072-.329-.072s-.175.072-.175.773c0 .7.085 2.346.217 3.615.152 1.505.616 2.133.616 2.133s.413.618.526-.577c.096-1.028.185-.228.185-.228.196 1.557.062 4.544.03 4.955-.019.218-.032.433-.049.64l.133-.221c.201-2.971.06-5.359.06-5.359s-.144-1.323-.3-1.311c-.155.01-.211.701-.211.701s-.065.467-.156.456c-.088-.011-.369.022-.566-1.412-.199-1.436-.156-2.949-.156-2.949s-.043-.155.048-.189c.09-.034.188.1.188.1s.133.189.287.033c.156-.154.19-.622-.301-3.08-.288-1.454-.711-2.896-1.006-3.832l-.294-.333-.058-.718s-.311-.913-1.033-2.737c-.723-1.824-.846-2.458-.846-2.458s-.045-.2.066-.234c.111-.032.091-.178.091-.178s-.013-.245-.278-.99c-.268-.746-.426-1.281-1.356-2.86-.869-1.468-1.124-1.558-1.124-1.558s-.426-.234-.112.591c.313.823-.075.232-.075.232-.925-1.177-2.838-4.292-2.838-4.292l-.537-.373-.508-1.261-.015.01M1.547 32.696l-.183.37c-.472 2.495-.625 5.135-.62 5.31.01.208-.036.211-.075.178-.042-.035.03-.16-.048-.16-.079 0-.108.211-.108.211L.512 38.6a42 42 0 0 0-.053.861l.016-.003c.068-.098.097-.028.097-.028s-.029.126.097.056.21-1.379.21-1.379.014-2.813.836-6.14c.819-3.327 1.281-4.259 1.281-4.259s.154-.418.138-.083c-.014.333.196.361.196.361.375-.054.821-1.125 1.267-2.493.445-1.363.668-2.589.668-2.7 0-.11-.055-.194-.152-.138-.098.056-.125.014-.125.014-.014-.208.361-1.127.361-1.127 1.253-3.202 3.104-5.694 3.104-5.694l.09-.504c-.164.254-.27.419-.421.661-.056.089-.042.297-.001.32-.201.191-.365.35-.476.456-2.707 4.473-3.059 6.556-3.059 6.556-.017.214.004.311.111.306.065-.003.251-.349.116.354-.09.468-.524 1.708-.693 2.212-.171.505-.358.85-.495.826-.135-.025-.135-.234-.135-.234s-.042-.546-.398.245-.713 1.859-1.425 4.65q-.047.187-.092.38zM4.841 62.626c-.15-.401-.264-.722-.179-.581.085.143.198.432.462.725.263.291.442-.226-.622-3.104s-1.354-3.04-1.402-3.095c-.046-.058-.215-.237-.167.167.045.404.018.656-.51-1.146-.528-1.806-.996-4.844-1.025-5.089-.027-.243-.169-1.778-.396-3.594-.226-1.814-.246-3.743-.207-4.28s-.066-.828-.123-.837c-.056-.008-.094.047-.131.284-.038.234-.01.395-.067.385-.057-.009-.076-.471-.076-.471H.391v.151l.002.519.039.402c.033.597.129.354.135.246.006-.109.03-.329.03-.329s.103-.884.084.02.236 4.563.236 4.563q.028.354.068.729l.063.092-.042.104c.265 2.425.795 5.086.795 5.086.507 2.417 1.11 3.846 1.308 4.25.198.405.236.085.17-.271s.546.688.873 1.674c.332.99.556 1.815.556 1.815s.254.781.142.828-.292-.293-.292-.293-.473-.835-.274-.228c.398 1.231 1.6 3.822 1.6 3.822l1.396 2.471c-.998-1.805-2.298-4.637-2.439-5.015M7.281 67.639q.103.188.202.359zM20.722 2.874c-.212.342-.242.514-.242.514s.112-.118.183-.237c.07-.118.059-.277.059-.277M17.216 5.572c-.417.048-.677.25-.677.25s.35-.061.677-.25M84.005 4.909s.247-.03.347.02c.101.049.066-.158.066-.158s-.287-.406-.322-.556c-.32-.089-.611-.1-.611-.1l-.028.034c-.01.075-.036.188-.012.297-.004.002.472.365.56.463M87.487 7.88l.095-.152-.223-.679q-.007-.017-.021-.036c-.007.066-.049.125-.172.115 0 0-.099-.03-.011.198.064.143.2.373.332.554" style="opacity:.1;fill:#232323"/><path d="M101.566 51.162s.347-3.236.457-4.392q.026-.259.045-.513l-.098-.241c-.459 5.815-.938 7.727-.938 7.727s.013-.037.031-.101q.282-1.227.51-2.48z" style="opacity:.1;fill:#232323"/><linearGradient id="g" x1="266.492" x2="295.964" y1="-395.278" y2="-485.035" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".009" stop-color="#FCFCFC"/><stop offset=".066" stop-color="#EEE"/><stop offset=".134" stop-color="#E5E5E5"/><stop offset=".252" stop-color="#E3E3E3"/><stop offset=".336" stop-color="#8A8A8A"/><stop offset=".442" stop-color="#B8B8B8"/><stop offset="1" stop-color="#3B3B3B"/></linearGradient><path d="M79.003 84.528s.667-.653.539-.752c-.128-.101-.623.256-.623.256s-.073.062-.185.142l.393-.252s-.038.238-.355.555c0 0-.094.094-.258.248-.957.938-2.386 1.998-2.386 1.998l.396-.211c1.32-.809 2.479-1.984 2.479-1.984" style="opacity:.5;fill:url(#g)"/><linearGradient id="h" x1="460.463" x2="509.588" y1="512.556" y2="573.306" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EFF0F0"/><stop offset=".591" stop-color="#F0F1F2"/><stop offset=".599" stop-color="#787878"/><stop offset=".646" stop-color="#EEEFF0"/><stop offset="1" stop-color="#D8D9DB"/></linearGradient><path d="m82.984 39.705.51-.891-.127-1.667s-.085-.893-.566-2.28c-.979-2.828-1.941-4.122-1.941-4.122s-.592-1.318-1.969-1.318c-1.33 0-1.431 1.219-1.431 1.219s-.312.963-.821 1.261c-.5.29-1.972 1.146-2.748.296-.941-1.026-1.461-2.225-1.56-3.372-.101-1.146.367-1.615.367-1.615s.1-.296 1.614-.296c1.703 0 2.014-.525 2.014-.525s.324-.296.297-.963-.284-2.097-.779-3.001c-.324-.596-1.058-1.537-1.684-2.261l-.967-.178.15-.699c-.56-.514-3.465-3.959-4.031-4.766-.564-.808-.65-.993-.75-1.262s.17-.877.412-1.161c.238-.283.521-.341 1.104-.212.58.127.961.381 1.886.084.919-.297.962-.992 1.033-1.699s-.78-2.209-1.458-2.932c-.684-.721-1.645-.836-2.311-.792-.664.042-1.047.523-1.433.737-.382.213-1.103.425-1.429.284s-.823-.284-1.375-1.261c-.43-.76-.794-1.459-.979-1.817l-.713-.076v.012s.633 1.654 1.633 2.811c.998 1.157 2.266.919 2.266.919s.82-.089 1.533-.772c.711-.683 1.761-.148 2.024.04.269.189.853.911 1.478 2.127.621 1.216-.355 2.058-.355 2.058s-.555.535-1.691.088c-1.14-.443-1.813.259-1.986.614-.182.357-.508.99.076 1.73.584.742 3.178 4.273 4.916 5.945 1.74 1.672 2.314 3.047 2.682 4.342.365 1.297.079 1.899-.521 2.018-.604.118-1.148.021-2.086.187-.94.17-1.349.367-1.543 1.653-.199 1.286.562 3.373 1.67 4.361 1.106.989 2.334.386 2.76.228.427-.159 1.352-.653 1.681-2.027.188-.783.851-.721.851-.721s.563-.071.854.117c.287.19.633.525 1.402 1.87.772 1.346 1.453 3.146 1.724 4.738.257 1.592.062 1.818.317 2.947.256 1.128 1.078 3.245 1.466 4.074.383.832.78 1.662.989 2.107.205.445.531.782 1.443.802.908.02 1.273-.228 1.541-.662.27-.435.612-1.088.713-1.316s.467-.911 1.146-1.02c.685-.108 1.762.01 2.106 1.198.313 1.071.76 2.622-.158 4.5-.65 1.334-1.129.859-2.451.948 0 0-1.165-.01-1.781.921-.611.93-.416 2.61-.286 3.877s.988 3.113 1.621 3.563c.636.443.86.849 1.08 1.256.216.404.534 1.205.216 3.313-.313 2.106-.979 3.74-1.867 4.521-.024.021-.05.043-.07.063a4 4 0 0 1-.219.201c-.537.521-.371.543-.889.793-.594.289-.988.207-1.958.365-.97.16-1.583.327-2.088.821-.503.495-1.243 1.409-.979 3.187.148.986 1.318.584 2.229.111-.274.125-.553.221-.798.246-1.033.113-.991-.949-.921-1.415.069-.47.313-1.544 1.063-1.97s1.799-.41 2.533-.512c.738-.101 1.076-.313 1.076-.313s1.205-.766 1.997-2.055c.793-1.289 1.502-3.371 1.587-5.438.084-2.068-.821-2.902-1.104-3.271-.283-.366-.799-.203-1.431-1.729-.724-1.74-.81-3.188-.751-4.079.057-.892.27-1.231.682-1.612.41-.383 2.223-.213 2.223-.213s.893.185 1.686-1.134c.793-1.317.738-3.471.481-4.546-.253-1.076-.623-2.013-2.097-2.168-1.471-.152-2.138 1.66-2.138 1.66s-.297.693-.608 1.092c-.312.395-1.16.285-1.16.285-.37-.044-.821.099-1.264-.81-.438-.906-1.442-3.286-1.442-3.286a14 14 0 0 1-.688-2.055z" style="opacity:.73;fill:url(#h)"/><linearGradient id="i" x1="272.872" x2="302.47" y1="-392.826" y2="-482.965" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="m82.487 79.313.801-.479c.788-1.231 1.72-2.31 2.431-3.103.863-.961 1.896-2.522 1.896-2.522s.835-1.431.638-1.784c-.13-.23-.704.02-1.687.752-3.674 2.746-3.971 1.246-3.971 1.246.422 2.438 4.729-1.633 5.108-1.375-.063.563-.457 1.172-1.25 2.25 0 0-.388.555-.78.953-.369.432-.578.641-.578.641s-.088.09-.125.125a33 33 0 0 0-1.595 2.018c-.019.021-.104.113-.125.143-.295.416-.491.73-.702 1.062-.014.022-.064.011-.076.034a.1.1 0 0 0-.025.037c-.245.39-.373.713-.508.959-.012.029-.021.065-.03.095 0 0-.319.665-.457 1.067-.14.405-.12.547-.623.625-.504.078-.276-.053-1.021.196 0 0-.403.199-.938.571q-.043.032-.082.063a15 15 0 0 0-1.534 1.436q-.076.096-.146.195s-.157.168.051.188c.206.021.633-.01 1.008-.169l.088-.057c-.186.103-.373.174-.513.162-.396-.026.479-.864.479-.864s.906-1.019 1.771-1.175c.862-.156 1.021-.371 1.444-.693.426-.327.494-.682 1.359-2.254.03-.059.064-.115.098-.176z" style="opacity:.53;fill:url(#i)"/><linearGradient id="j" x1="444.694" x2="469.725" y1="510.956" y2="592.07" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".747" stop-color="#F9F9F9"/><stop offset="1" stop-color="#D5D7D8"/></linearGradient><path d="m55.064 72.686.408-.377c-.34-.668-.693-1.269-.693-1.269s-1.282-1.901-.245-3.703c1.036-1.803 2.737-2.348 2.737-2.348s1.5-.332 2.996.017c1.418.323 2.133-.22 2.133-.22s.865-.376 1.123-2.104c.261-1.729-.014-4.94-2.317-5.576-2.306-.633-3.528.563-3.528.563s-1.242 1.369-1.644 1.57c-.404.2-1.024.562-1.024.562s-.865.52-1.453.648c-.39.087-1.788-1.771-1.931-3.2-.133-1.313-.4-2.385-.305-5.084v-.017l-.486-.629.537-.526c.102-3-.418-5.119-1.188-6.463-.805-1.414-2.118-2.163-2.766-2.479-.647-.317-2.146-.461-3.169-.086-1.022.375-1.237.677-1.613 1.325-.376.65-.835.606-.835.606s-1.427.044-1.89-2.132c-.644-3.049.36-4.036.36-4.036s.318-.475 1.369-.619c1.053-.144 1.73.115 2.536.317.807.2 1.41.114 2.42-.374 1.009-.49 1.442-1.298 1.24-2.738-.196-1.397-.249-1.727-1.484-5.966l-.874-.458.582-.579c-1.182-4.271-1.257-6.961-1.257-6.961-.105-.975.049-1.29.598-1.537.576-.261 1.117-.177 1.934-.125.819.052 1.425-.079 1.847-.316.423-.236 1.583-.87 1.503-2.163-.078-1.292-1.108-2.823-1.951-3.35-.844-.528-1.952-.317-2.56.132-.606.447-.843 1.028-1.213 1.212-.368.185-.896.607-1.45.474-.554-.132-.581-1.372-.818-2.77-.155-.915-.276-1.614-.342-1.989l-.674-.254c.043.557.535 3.304.535 3.304l.294 1.624v.02q.008.028.013.05c.019.079.049.18.082.289.114.215.37.456.942.502a2.6 2.6 0 0 0 2.025-.709c.254-.239.86-.911.86-.911s.329-.632 1.253-.494c.922.14 1.238.773 1.403 1.013.167.242 1.57 1.961.672 2.861-.039.039-.093.089-.152.146a3.5 3.5 0 0 1-.446.399c-.675.517-1.226.48-1.678.442-.453-.039-.665-.07-.795-.043l-.72.038c-.787.11-1.224.408-1.224.408-1.8 1.065.735 9.287.735 9.287s.671 2.029.973 2.979c.301.949.496 1.625.791 3.264s-.231 2.092-.525 2.251-.984.568-1.77.604c-.783.034-1.027-.368-2.371-.432-1.345-.065-2.246.345-2.661.906-.417.561-.913 1.862-.675 3.4.237 1.541.504 2.064 1.092 2.748.59.681 1.165.97 1.978.696.792-.266.764-.756 1.173-1.164.517-.519.855-.792 2.063-.821s1.979.288 2.594.784c.619.496 1.934 1.646 2.294 3.356.359 1.713.424 2.268.424 3.676s-.101 2.978-.064 4.381c.036 1.4.187 2.841.577 3.795.386.955.926 1.755 1.4 2.18.475.426.896.438 1.373.252.475-.188 1.511-.771 2.373-1.324.861-.555.797-.99 1.576-1.502a3.36 3.36 0 0 1 2.457-.486c.661.112 1.676.631 2.092 1.889.419 1.258.36 2.676.36 2.676s.035 1.186-.445 1.876c-.48.688-1.272.616-1.625.545-.354-.071-1.094-.136-1.094-.136s-1.451-.165-2.563.094c-1.105.258-2.077 1.085-2.73 1.896-.652.813-.941 1.57-.984 2.158-.043.59.027 1.595.642 2.572.612.979.712 1.432 1.409 2.827.695 1.396 2.15 2.17 2.201 2.206.05.037 1.388.523 1.89.949.505.425.555.826.411 1.208-.145.381-.438 1.094-1.604 1.604-1.166.512-2.591.523-3.496.617-.906.094-2.651.332-3.697.834-1.043.503-.97 1.454-.97 1.454s-.028 1.556 1.337 1.983c1.365.434 2.64 0 3.201-.237.562-.238 1.487-.583 1.487-.583s1.791-.631 2.752-.848c.965-.217 1.533-.323 2.188.832.652 1.158 1.014 1.886 1.078 2.625s-.209 1.148-.461 1.432c-.25.279-.217.46-.217.46-.105.873 1.182.763 1.182.763s.041-.004.11-.018c-.26.021-.499-.021-.59-.178-.116-.202-.217-.531.146-.906.359-.374.402-.693.402-.693.305-1.439-1.038-3.371-1.354-3.875-.315-.503-.836-.791-2.394-.531-1.556.26-3.386 1.037-3.386 1.037s-1.891.995-3.299.809c-1.413-.188-1.701-1.614-1.687-2.063.016-.444.304-.836 1.038-1.122.733-.289 2.464-.679 4.984-.809 2.522-.128 3.458-1.771 3.458-1.771.331-.478.923-1.543-.489-2.338-1.412-.789-1.44-.589-2.116-1.104-.68-.521-1.412-1.153-1.701-2.034a4 4 0 0 0-.108-.291z" style="opacity:.96;fill:url(#j)"/><path d="M92.002 13.363c1.021 1.649 2.844 4.295 2.844 4.295s.256.332.5.605l.01-.011c.011-.375-.051-.571-.06-.621l-.091-.274c-.021-.367.438.095.611.288-.498-.754-.659-.811-.659-.811s-.423-.234-.111.59-.075.233-.075.233c-.924-1.177-2.838-4.293-2.838-4.293l-.553-.383zM101.539 51.352q.02-.094.034-.188h-.009l.013-.089zM100.822 35.679c.088-.033.188.1.188.1s.135.189.289.033c.107-.104.155-.353.025-1.257a1.4 1.4 0 0 1-.137.59c-.139.296-.314.02-.441-.081-.129-.098-.168.07-.168.07l-.004.162c0 .7.087 2.346.217 3.617.063.605.173 1.071.287 1.408l.041.076c.089.148.188.343.307.255.116-.089.274-.582.274-.582l.128-.591c.191.113.291.529.341.962l-.004-.056s-.144-1.324-.3-1.313c-.155.01-.21.701-.21.701s-.066.468-.157.456c-.088-.011-.365.022-.564-1.412-.201-1.436-.158-2.949-.158-2.949s-.044-.155.046-.189M99.696 28.566l.298.341c.479 1.494.996 3.843 1.092 4.264l-.088-.441c-.288-1.454-.711-2.896-1.006-3.832zl-.05-.702-.006-.016s-.312-.913-1.033-2.737c-.725-1.824-.848-2.458-.848-2.458s-.043-.2.066-.234c.109-.032.09-.178.09-.178s-.013-.245-.277-.99c-.182-.503-.312-.911-.662-1.607.281.585.463 1.052.524 1.259l.028.068s.099.148.066.552c-.027.403-.146.452-.146.452l.022.14c.141.538.418 1.187.418 1.187s1.065 2.709 1.748 4.54z" style="opacity:.1;fill:#232323"/><linearGradient id="m" x1="274.534" x2="255.209" y1="-396.158" y2="-490.194" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="M42.958 91.536c.938.177 1.723.358 1.889.396-.333-.11-.952-.279-1.889-.396" style="fill:url(#m)"/><linearGradient id="n" x1="422.559" x2="427.288" y1="518.757" y2="578.177" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset=".22" stop-color="#989A9C"/><stop offset=".253" stop-color="#FFF"/></linearGradient><path d="m20.381 74.92.007-.164-.052-.08s-1.874-3.375-1.676-4.615c0 0 .069-.827 1.241-1.187.817-.25.71.538 3.112.976 0 0 2.07.557 2.611-.946.539-1.507-.566-3.394-.566-3.394s-1.45-2.656-3.244-2.756c-.95-.055-.692.583-2.125.924 0 0-1.913.185-2.519-.963-.733-1.389-1.015-2.968-1.015-4.021 0-1.058.045-1.001.126-1.405.045-.219.186-.548.248-1.09l-.134-.675.204-.499a13 13 0 0 0-.021-.83c-.092-1.661-.211-4.221-.436-5.711-.223-1.491-.633-3.799-1.991-3.865 0 0-.671-.052-1.636.885-.882.856-1.682-.708-1.726-1.663-.052-1.121.131-2.255.409-2.795.277-.541 1.042-.566 1.186-.554.146.012.555.17 1.042.474.489.304 1.161.304 1.558-.092.395-.395.948-.856 1.173-2.598s.225-3.547.013-5.71l-.224-.485 1.339-.288c-.001-.016-.021-.125-.032-.195l-.001-.002q-.002-.024-.007-.052v-.005l-.009-.057-.001-.003-.009-.062v-.001q-.005-.034-.011-.067l-.001-.007-.008-.068-.003-.015a1 1 0 0 0-.011-.083l-.012-.076v-.005l-.012-.076-.002-.018-.009-.079-.003-.021-.01-.081-.003-.02-.009-.087-.003-.013q-.004-.043-.009-.082l-.002-.017-.01-.091-.002-.02q-.005-.047-.011-.09l-.002-.022-.01-.094-.002-.018q-.004-.048-.009-.094l-.001-.009q-.003-.05-.009-.1l-.001-.02-.007-.099-.002-.021-.007-.099-.001-.02q-.004-.05-.007-.101l-.001-.009-.007-.1v-.017l-.005-.1-.001-.022-.005-.098v-.021l-.004-.101v-.013l-.002-.099v-.009l-.001-.102v-.133l.001-.096.001-.014.003-.1c.052-1.243.291-1.751.291-1.751l.058-.166s.46-1.458 1.152-2.458l-.011.024s.446-.738 1.231-.816 1.003.158 1.371.202l.152.017q.038.002.074.006l.042.003.064.004.041.002.058.002q.02.002.04.002l.055.002.039.001.051.001h.034l.05-.001.032-.001.046-.001.03-.001.045-.002.026-.001.044-.004.022-.002.044-.004.019-.002.045-.007.014-.001.052-.008.098-.021q0-.001.002-.002l.039-.01.007-.001.029-.009.01-.004.026-.008.008-.003.021-.009.009-.004q.01-.003.02-.009l.008-.003.019-.007.005-.004q.008-.005.015-.008.003-.002.008-.003l.012-.008q.002 0 .005-.002l.012-.008.004-.003q.005-.003.01-.008.002 0 .002-.002l.011-.008.001-.001.009-.007h.001l.006-.007.003-.002.002-.002.003-.005.004-.004c.328-.241.591-.516.797-.775l.04-.05.008-.012q.02-.023.038-.05.004-.004.007-.01c.012-.018.025-.032.038-.05h.001q.058-.083.109-.159 0-.005.003-.008.016-.021.03-.044l.007-.01.024-.042.009-.013q.013-.021.023-.042l.002-.002.046-.079.006-.013q.008-.016.017-.029l.012-.02.014-.024.01-.023.012-.023q.005-.01.011-.021l.01-.021c.066-.128.097-.205.097-.205.593-1.459.052-2.936-.21-3.225-.32-.353-1.041-.882-1.041-.882s-.288-.241-.751-.144c.349-.049.791.091.966.558.277.734.376 1.335.212 2.33 0 0-.26 1.387-1.384 2.233-1.125.848-1.923.096-2.885.13-.962.032-1.516.701-1.809 1.157s-1.417 2.2-1.319 5.067c.097 2.868.291 4.301.325 5.558.033 1.205.178 3.976-.635 5.278-.815 1.303-1.628.65-2.2.309-.571-.341-1.223-.245-1.744.131-.521.375-.833 1.124-.848 3.324-.016 2.364 1.532 2.606 1.532 2.606s.293.146.945-.537c0 0 .651-.685 1.253-.603.604.082.995.716 1.255 1.808.261 1.092.796 5.621.717 8.668-.034 1.271-.62 1.286-.36 3.617 0 0 .409 3.13 1.401 4.089.995.962 2.378.781 2.706.75.324-.032.7-.26.7-.26s.309-.197.537-.374c.23-.182.522-.428 1.011-.277.489.146 1.645.896 2.557 2.571.915 1.678.496 3.317-.26 3.521-.668.182-.848.229-1.971-.05-1.124-.274-1.451-.567-1.957-.766-.504-.196-1.043-.263-1.547.114-.505.373-1.345 1.057-.343 3.32.961 2.174 1.692 3.797 3.518 5.623a21 21 0 0 1-1.427-1.871z" style="fill:url(#n)"/><linearGradient id="o" x1="237.372" x2="218.847" y1="-388.36" y2="-478.502" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="m22.494 7.387-.05.025z" style="fill:url(#o)"/><linearGradient id="p" x1="259.906" x2="259.899" y1="-479.338" y2="-479.375" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="M46.028 92.85q.195.02.391.041c-.114-.016-.31-.039-.561-.074q.087.016.17.033" style="fill:url(#p)"/><path d="M24.089 5.489c-.649.36-.7-.016-1.141.017-.439.033-1.026.212-1.596 1.043s-.586 1.89.326 1.417c0 0 .436-.428.815-.579.081-.043.24-.126.406-.174l.144-.117s.424-.491 1.073-.333a1.59 1.59 0 0 0 1.119-.129c1.01-.761 1.655-2.184 1.655-2.184l.987-1.998-.826-1.336s-.698 1.489-1.383 2.53c-.682 1.046-.635 1.326-1.579 1.843" style="fill:#9fa2a3"/><path d="M19.871 16.292s-.424 1.89 1.156 1.597l.022-.007c-.062.003-.089-.006-.089-.006-.025-.497.149-1.432.49-2.261s1.075-2.254 1.075-2.254 1.047-1.791 1.467-2.89c.42-1.102.416-1.939.416-1.939s-.8-1.019-.915-1.176-.272-.223-.272-.223l-.146.051c.115-.007.221.021.283.114.213.31-.39 2.036-.39 2.036s-.522 1.238-1.548 3.03c-1.027 1.793-1.549 3.928-1.549 3.928" style="fill:#9fa2a3"/><linearGradient id="q" x1="268.903" x2="249.497" y1="-394.638" y2="-489.072" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="m38.185 89.697.166.02a3 3 0 0 0-.497-.347c.184.113.489.358.312.665-.245.424-.048.457.489.863l.061.033c-.156-.107-.253-.234-.156-.362a.47.47 0 0 0 .065-.499z" style="fill:url(#q)"/><linearGradient id="r" x1="254.456" x2="235.034" y1="-391.599" y2="-486.11" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="M24.437 82.749c-1.245-1.185 1.595-.118 1.595-.118s.619.262.343-.385c-.246-.57-1.373-1.963-2.543-3.219l.144.156s2.346 2.721 2.183 2.966-1.108-.325-1.108-.325-1.401-.539-1.206.13c.143.491 1.059 1.271 1.536 1.649a25 25 0 0 1-.944-.854" style="fill:url(#r)"/><linearGradient id="s" x1="262.651" x2="243.156" y1="-392.969" y2="-487.836" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="M26.977 84.73c.424.256.903.513 1.365.676 0 0 .831.293 1.337-.114.503-.403.503-.601 1.238-.243 0 0 1.388.696 2.382 1.444.98.735 3.557 2.336 4.396 2.791-.764-.417-3.712-2.365-4.633-2.99-.936-.633-2.574-1.698-3.297-1.476-.554.172-.474.396-.804.555-.331.158-.688.055-1.504-.383-.166-.09-.323-.172-.48-.26" style="fill:url(#s)"/><linearGradient id="t" x1="271.548" x2="251.19" y1="-390.957" y2="-490.018" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="M39.903 91.448c.37.104.672.06.787.035-.678.04-1.35-.269-1.35-.269s-.067-.021-.165-.061c.238.115.514.232.728.295" style="fill:url(#t)"/><linearGradient id="u" x1="274.658" x2="255.256" y1="-395.844" y2="-490.257" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path d="M44.293 92.169s-1.344-.163-1.939-.163c0 0-.037.064.226.158-.021-.021-.031-.049.189 0 .304.064 2.018.225 2.465.158.448-.068-.091-.278-.091-.278s-.088-.041-.267-.102c-.323.259-.583.227-.583.227" style="fill:url(#u)"/><path d="M4.662 62.045c.085.143.198.432.462.725.146.16.266.072.162-.525a5 5 0 0 1-.464-.371c-.113-.013-.263-.297-.263-.297s-.471-.835-.274-.227c.398 1.23 1.6 3.821 1.6 3.821l1.396 2.47c-.999-1.803-2.299-4.633-2.44-5.013-.15-.405-.264-.724-.179-.583M1.547 32.696l.032-.643q.041-.182.087-.36c.712-2.789 1.069-3.858 1.425-4.649.356-.792.398-.245.398-.245s0 .209.136.234c.135.023.324-.32.494-.826.17-.504.604-1.745.693-2.212.135-.704-.051-.358-.115-.354-.108.005-.126-.091-.113-.306 0 0 .382-2.122 3.064-6.563.18-.17.321-.307.47-.449-.055-.052-.033-.265.001-.32q.203-.322.422-.661l-.09.504s-1.85 2.492-3.104 5.694c0 0-.342.835-.359 1.094-.025.154-.104.739.152.582l.065-.048c-.093.484-.295 1.37-.607 2.325-.288.878-.573 1.633-.841 2.078l-.002-.004c-.08.067-.098-.016-.146-.21-.048-.198-.113-.198-.113-.198-.179 0-.324.202-.41.359-.04.056-.089.19-.089.19s-.461.934-1.281 4.26c-.822 3.328-.836 6.14-.836 6.14s-.084 1.309-.21 1.379-.097-.056-.097-.056-.045-.052-.114.045c0 0 .02-.76.044-.875 0 0 .041-.206.119-.206s.006.125.048.16c.039.032.084.03.075-.178-.005-.176.147-2.816.621-5.312zM.392 41.994v-.005s.018.217.042.356l-.003.01c.078.357.187.357.187.357.008-.096.087-.273.183-.458q.012.159-.004.375c-.037.537-.019 2.466.209 4.28.225 1.815.367 3.349.394 3.594.029.245.498 3.283 1.025 5.089.285.967.422 1.344.483 1.424l.008.049s.097.184.348.32c0 0 .111-.097.112-.412q.027.046.057.105c-.083.262-.105.426-.105.426-.042-.043-.06-.031-.046.045.067.357.027.68-.169.272-.198-.403-.8-1.832-1.307-4.251 0 0-.531-2.659-.795-5.084l.042-.105-.064-.091a25 25 0 0 1-.067-.729s-.255-3.657-.237-4.562c.019-.904-.085-.02-.085-.02s-.021.219-.028.329c-.008.109-.103.352-.136-.246.023.26-.044-.801-.044-1.068M24.672 1.974l-.53-.753-.066-.065s-.131-.136-.896.038l-.11.022s.38-.094.168.191-.56.496-1.172 1.15c-.612.655-.411.803-.01.668.401-.138 1.188-.499 2.606-1.243zM23.106 1.21l-.036.006z" style="opacity:.1;fill:#232323"/><path d="M23.637 1.811c.31-.272.429-.484.454-.641l-.015-.014s-.131-.136-.896.038l-.075.015c.09-.015.303-.032.133.198-.212.285-.56.496-1.172 1.151-.612.656-.411.803-.01.667q.159-.055.4-.157c.143-.313.59-.743 1.181-1.257M83.482 4.115l-.2.235s.136.081.208.141q.011.008.021.012l-.07-.056c-.023-.109.004-.223.014-.297zs.055.002.143.011z" style="opacity:.1;fill:#232323"/><path d="M62.559 90.319s1.686-.187 3.239-.691c1.558-.504 1.935-.981 1.874-1.341-.037-.238-.396-.305-.906-.238.271-.021.514.032.354.332-.313.582-.861.782-.861.782s-.267.19-.89.371c-.806.245-1.794.375-2.335.438-.691.082-.521-.033-1.465.291-.023.016-.047.025-.065.043-.289.237 1.071.514 1.071.514s1.302.361 3.257.23l.067-.021q.4-.118.8-.245c-2.021.457-3.324.149-3.737.095-.434-.058-.777-.144-.88-.359s.477-.201.477-.201" style="opacity:.53;fill:#fff"/><path d="m63.301 4.417.717.076c1.429-.405 2.651-.776 2.651-.776s1.265-.41 1.901-.636c.635-.227 1.09-.313 1.656-.41.563-.096 1.309-.14 1.709-.131.398.007.528.122.528.122s.166.131.245.27c.077.138.74 1.891 2.975 2.005 2.231.112 2.261-1.096 2.063-1.464-.226-.427-.896-.863-.896-.863s-.898-.575-1.09-.846.033-.358.104-.376c.066-.018 2.433-.497 2.729-.608l.021-.02-.563-.174s-.119.134-.789.312c-.67.179-1.233.246-1.742.313-.504.067-.504.239-.504.239l-.879 1.406s-.029.104.043.305c.073.202.41.448.41.448s.573.424.99.699.395.373.395.373c-1.123.095-1.418-.048-1.875-.276-.445-.223-.76-.729-.922-1.086s-.521-.663-.521-.663c-.589-.336-1.696-.343-2.813-.15-1.115.194-2.656.707-2.923.812a34 34 0 0 1-2.309.729c-.694.179-1.224.357-1.646.47-.426.11-3.431 1.005-4.557 1.339a19 19 0 0 1-1.848.461c-1.688.171-2.193-.134-2.193-.134-.297-.125-.262-.527-.262-.527l.009-1.147s-.029-.433-.356-.611c-.328-.179-.779-.252-1.593-.29-.811-.038-1.683.044-2.093.134-.408.09-1.19.313-1.764.952-.573.641-.481 1.141-.481 1.141s.035.683.088 1.19c.052.504.484.662.484.662s-.744.532-3.045 1.206c-2.209.648-3.682.774-3.682.774l.678.254s5.468-1.015 7.148-2.616c0 0 .624-.293.02-.88-.606-.585-.897-.761-.897-.761s-.41-.224.019-.771a2.7 2.7 0 0 1 1.352-.933c.429-.138 1.753-.25 2.925-.093 0 0 .491.041.459.408-.034.366-.088.872-.077 1.028.008.158.023.515.398.845.378.332 1.099.453 1.099.453s1.257.228 2.843-.217c1.584-.445 3.642-1.14 5.431-1.629z" style="opacity:.1;fill:#232323"/><path d="M48.462 6.628c.31.207.476.221.5.421.055.339-.56.64-.56.64l-.006-.011s-.431-.157-.484-.664c-.052-.505-.088-1.19-.088-1.19s.001.2.046.26c.134.172.217.294.592.544" style="fill:#616161"/><path d="m82.447 79.307.451.17c1.104-.617 1.496-.809 1.759-.963 1.183-.703 2.592-1.563 2.963-1.855 0 0 .761-.518.116.195s-.969 1.007-.969 1.007-.625.626-.471.782c0 0 .166.246 1.193-.687 1.023-.929 2.15-2.258 2.275-2.44.127-.188.146-.293.146-.293s.107-.215.273-.393c.145-.15 1.377-1.496 1.994-2.121l.006.003q.409-.543.806-1.102c-.358.379-1.724 1.829-2.483 2.684 0 0-.713.763-.938 1.056s-.225.47-.225.47-.117.196-.392.519-1.24 1.186-1.24 1.186-.577.47-.754.478c-.179.011.431-.538.431-.538s.588-.625.967-1.123c.382-.498.137-.47.137-.47s-.186-.049-.986.459-1.367.858-1.367.858-1.722.986-2.814 1.623c-1.096.636-3.6 1.908-5.021 2.492-1.43.588-2.162.715-2.035.527.127-.186.461-.459.461-.459s.399-.4.399-.803c0 0 .128-.586-1.604-.223-1.729.36-3.293 1.213-3.293 1.213s-2.571 1.182-1.965 1.887c0 0 .117.186.635.352.52.166-.92.606-.92.606-1.365.448-2.413.651-3.74.926-1.963.403-3.564.761-4.165.894-.165.035-.253.059-.253.059s-1.212.292-3.229 1.072c-2.015.783-5.972 1.43-5.972 1.43s-2.542.293-2.777.627c-.234.331.177.499.177.499s.362.224 1.671.283c0 0 .451 0 .471.036.018.039.046.068-.235.156-.286.088-.854.314-2.778.558-1.936.245-1.896-.067-1.896-.067s-.01-.076.078-.216c.087-.134.009-.369-.293-.535 0 0-.419-.272-1.829-.262-1.408.009-4.212.017-6.833-.14-2.374-.143-5.59-.551-6.099-.664 0 0-.117-.029-.206-.117-.088-.09-.646-.422-1.164-.733-.517-.313-2.073-.907-2.073-.907s-2.011-.783-1.945-.521c.015.063.13.153.268.246q.526.282 1.06.56l.002-.002s-.743-.402-.538-.402.438.109.438.109 1.213.332 1.966.686c.753.353 1.407.83 1.407.83s.929.549 2.319.732c1.346.182 3.174.389 3.777.448l.594-.272.433.354c1.106.068 2.575.146 2.575.146s2.976.111 4.605-.019c.733-.063.507.317.507.317s-.214.354.206.529c0 0 .771.439 3.343.157 2.573-.286 3.138-.862 3.138-.862s.299-.275-.351-.398c-.513-.1-.513-.051-1.175-.117-.665-.067-.998-.205-.557-.323.441-.114 1.174-.175 1.174-.175s2.249-.313 4.066-.783c0 0 1.938-.458 3.861-1.134a33 33 0 0 1 1.887-.599l.438-.644.644.372.103-.021s2.306-.539 3.274-.703c.966-.168 3.154-.637 4.087-1.086.928-.448 1.396-.805 1.505-1.075.107-.272-.393-.431-.393-.431s-.588-.138-.508-.34c.075-.205.293-.382 1.213-.793.918-.41 2.07-.859 3.227-1.144 1.154-.282.732.194.732.194s-.692.705-.783.979c-.086.273.029.285.119.333.088.05.646.028 1.022-.067.383-.099 3.464-1.271 5.341-2.347q.072-.04.139-.08z" style="opacity:.17;fill:#fff"/><linearGradient id="v" x1="221.183" x2="221.373" y1="-454.565" y2="-454.565" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="gray"/><stop offset=".087" stop-color="#7A7A7A"/><stop offset=".36" stop-color="#6B6B6B"/><stop offset=".519" stop-color="#686868"/><stop offset=".638" stop-color="#5F5F5F"/><stop offset=".743" stop-color="#4E4E4E"/><stop offset=".841" stop-color="#383838"/><stop offset=".932" stop-color="#1B1B1B"/><stop offset="1"/></linearGradient><path d="m7.432 68.01.178.131c-.105-.099-.167-.155-.167-.155s-.008.003-.024.003q.007.008.013.021" style="opacity:.68;fill:url(#v)"/><linearGradient id="w" x1="221.404" x2="316.025" y1="-449.803" y2="-449.803" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="gray"/><stop offset=".087" stop-color="#7A7A7A"/><stop offset=".382" stop-color="#828282"/><stop offset=".518" stop-color="gray"/><stop offset=".568" stop-color="#797979"/><stop offset=".603" stop-color="#6E6E6E"/><stop offset=".608" stop-color="#6B6B6B"/><stop offset="1" stop-color="#4E4E4E"/></linearGradient><path d="m90.412 59.954-.371-.021c-1.807 1.463-2.342 1.938-3.781 2.955 0 0-1.644 1.228-3.44 2.196-1.804.97-3.919.853-3.919.853s-.573-.062-.295-.477c.275-.415.634-1.425.771-1.938.141-.516.415-1.82-.633-2.235s-3.018.196-3.018.196-4.525 1.205-6.371 3.23c-1.793 1.969-.286 2.846-.286 2.846s.702.49 1.386.73c.645.229.516.436.354.555 0 0-2.021 1.287-4.408 1.974 0 0-3.268 1.001-6.441 1.206-3.154.203-4.495.283-4.495.283l-.399.379-.758-.252c-1.283.154-3.455.463-5.596.979-2.622.64-5.123 1.147-6.903 2.296 0 0-1.333.887-.566 1.746.765.862 1.565 1.23 1.565 1.23s.472.207.464.336c-.009.164-.015.309-.367.512 0 0-1.394.814-4.108.859s-3.911.021-4.707-.695c-.658-.591.165-1.844.165-1.844s.33-.612 0-1.453c-.33-.84-2.218-.854-2.218-.854l-2.615-.134c-3.095-.081-7.182-.427-9.001-.653l-.033-.006-.006.166-.721-.303c-1.139-.221-3.243-.668-4.075-1.084-.759-.38-1.167-.313-1.066-1.102.101-.769-.753-1.836-.753-1.836s-1.188-1.287-2.257-2.086c-1.069-.804-1.523-.564-1.523-.564s-.484.258-.049 1.296c.436 1.04.86 1.403.86 1.403s.208.22.089.279c-.118.06-.484-.219-.789-.478-.253-.21-1.885-1.742-2.456-2.276l.105.356c.019.028.035.062.052.086.184.291.855 1.269 2.155 2.28 1.549 1.213 1.559.729 1.559.729s.061-.399-.297-.84c-.359-.44-.934-1.373-.791-1.715.144-.339.309-.31.309-.31s.133-.051.596.299c.462.351 1.498 1.076 2.011 1.703.513.623.48 1.181.48 1.181s-.102.563.453 1.17c.553.604 1.733 1.714 5.859 2.351l.059.01.193-.551.573.663c3.598.521 5.555.563 5.555.563s4.709.162 5.982.162c1.272 0 1.035.666 1.035.666s-.072.359-.225.646c-.155.287-.524 1.365-.144 1.939 0 0 .585 1.427 4.381 1.527 0 0 3.324.268 5.643-.688 2.319-.954.226-2.275.226-2.275s-.794-.481-1.13-.739c-.308-.234-.184-.481-.121-.646.06-.162.297-.359.563-.492.266-.134 1.239-.654 5.365-1.722 4.124-1.069 6.587-1.183 6.587-1.183l.055-.004.338-.656.854.556c.732-.06 1.681-.129 2.526-.171 1.691-.082 4.341-.471 5.879-.807 1.54-.343 3.869-1.062 5.592-1.951 1.725-.895 1.809-1.519 1.809-1.519s.328-.475-.392-.995c-.719-.523-1.036-.382-1.673-1.027-.637-.646.557-1.62.557-1.62s.612-.861 4.021-2.175c3.403-1.313 3.979-.873 4.153-.729s.195.615.123.935c-.069.317-.494 1.455-.721 2.053-.227.594-.316 1.406.605 1.601.923.194 2.215-.008 3.428-.442 2.893-1.033 3.756-2.295 8.534-5.764q.017-.014.03-.021zl.689.108c1.978-1.573 3.869-3.571 3.869-3.571s1.258-1.261 1.889-2.356c.595-1.026.027.89.027.89s-.32 1.516.19 2.077c.405.445 1.563-.795 1.563-.795s.688-.789.965-2.061c.408-1.875.185-2.248.185-2.248s-.246-.389-.093-.852c.154-.459 1.158-3.047 1.98-4.01l.502-.563.002-.027-.224-.557.304-.512s-.279.322-1.404 2.177c-1.266 2.087-1.467 3.771-1.467 3.771s-.119.653-.054 1.034c.063.355.188.519.192.622.009.104-.073.959-.508 1.773-.438.814-.815 1.031-.815 1.031s-.756.545-.86.157a2.3 2.3 0 0 1-.035-.966c.035-.248.289-1.579.252-2.072-.035-.494-.479-.098-.479-.098s-.104.119-.298.366-1.288 1.637-1.705 2.125c-.988 1.157-1.886 1.989-4.292 3.93-.007.003-.015.011-.019.015z" style="opacity:.43;fill:url(#w)"/><linearGradient id="x" x1="214.593" x2="314.404" y1="-431.356" y2="-431.356" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#555"/><stop offset="1" stop-color="#231F20"/></linearGradient><path d="m1.193 48.543.104.975c.235.285.577.677 1.071 1.187 1.084 1.121 1.427.416 1.427.416s.253-.705-.054-1.985c-.307-1.286-.253-2.046.325-2.026.578.019 2.258.361 2.782 1.752 0 0 .217.649.018 1.479-.2.834-.162 1.57-.018 2.295s.759 1.407 1.464 1.971c.706.562 2.746 1.535 4.734 1.66 1.987.127 2.601.021 2.601.021l.746-.767.134.668c.812-.09 2.116-.229 3.62-.393 2.528-.271 4.227-.544 5.798-.308 1.573.235 2.079 1.462 2.079 1.462s.108.314-.253.544c-.349.224-.749.547-.948.89-.199.346-.411 1.068.16 2.035.572.963 2.142 1.592 3.478 1.432 1.335-.155 3.335-.67 4.52-.979 1.287-.337 2.424-.971 2.572-1.98.147-1.008-1.534-2.295-1.534-2.295s-.812-.609-.91-.75c-.1-.139.099-.197.099-.197s.949-.229 1.357-.414c.404-.189 1.522-.646 3.353-1.219s5.608-1.248 5.608-1.248 2.084-.332 4.685-.543l.622-.702.485.625q.615-.037 1.243-.063c3.572-.129 5.344-.554 7.242-.979 1.897-.427 4.568-1.978 4.965-2.276.396-.295 1.229-.66 1.396-1.957.168-1.295-1.364-2.157-1.364-2.157s-1.218-.644-1.475-.93-.02-.562-.02-.562.689-1.485 2.896-2.354c2.205-.872 3.689-1.107 4.618-1.208.932-.099 1.245.237 1.374.396.128.157.128.485.021.821-.102.308-.444 1.038-.645 1.395-.197.356-.523 1.216-.316 1.622.208.405.843.593 1.662.445.821-.149 2.988-.761 4.888-1.553s5.073-2.345 5.073-2.345l.022-.012.086-.729.729.295c1.02-.562 2.764-1.58 4.01-2.631 1.871-1.573 3.699-3.225 4.166-3.639.465-.417.892-.752 1.307-.732s.732.317.988 1.434c.258 1.118.308 2.038.426 2.582.117.543.285 1.175.931 1.304s1.513-.434 1.838-.713c.33-.276.92-1.176.882-2.382 0 0 .068-1.604-.761-3.127 0 0-.351-.614-.479-.782-.088-.118-.155-.238-.01-.525.148-.286.467-.821 1.062-1.156.448-.256.88-.316 1.128-.396 0 0 .275-.067.626-.261l-.126-.412.289.316c.404-.239.652.045.652.045l-.392-.501.119-.484s-.304-.163-.685-.088c-.383.078-.42.362-1.014.458-.593.096-1.275.306-1.945 1.319-.67 1.011 0 2.271 0 2.271s.359.592.533.896c.172.306 1.066 2.215.037 3.608 0 0-.552.643-1.525.86-.86.19-.642-.816-.729-1.355 0 0-.129-2.281-1.237-3.588-.976-1.146-2.746.888-3.629 1.566-.822.629-3.228 3.112-6.684 4.925l-.51.892-.324-.472c-1.658.827-5.418 2.656-7.87 3.514 0 0-1.875.762-2.64.782 0 0-.17.006-.034-.179.133-.185.276-.322.507-.737.23-.418.646-1.357.646-2.327 0-.969-1.119-1.917-2.68-1.748-1.561.167-3.052.6-4.849 1.292-1.796.692-3.343 2.159-3.55 3.375-.209 1.216 1.105 1.92 1.105 1.92s1.484.751 1.674 1.157c.188.406.049.783.049.783s-.129.406-.783.782c-.649.377-2.42 1.287-2.42 1.287s-2.207 1.217-5.562 1.512c0 0-3.058.26-4.817.348q-.034.002-.069.003l-.541.53-.587-.449c-1.64.136-3.54.359-3.54.359s-4.29.609-8.219 1.822c-3.336 1.027-3.971 1.594-3.971 1.594s-.711.596-.118 1.453c0 0 .341.539 1.03 1.08.685.541 1.237 1.057 1.159 1.317-.08.265-.29.382-.29.382s-.961.856-4.894 1.518c0 0-2.531.488-3.31-.275-.778-.766-.435-1.279-.435-1.279s.052-.173.62-.527c0 0 .951-.596.647-1.727-.303-1.135-2.129-2.545-4.101-2.533 0 0-2.303.006-8.196.762q0-.001-.027.005l-.204.501-.605-.393c-.324.039-.713.076-1.114.107-1.012.07-2.477-.057-4.3-.596-1.824-.543-2.963-1.535-3.126-2.133-.114-.412.035-.996.035-.996s.343-1.316.128-2.401c-.22-1.083-.582-1.934-1.631-2.567-1.048-.632-1.643-.522-1.643-.522s-.939-.144-.904 1.446c.037 1.59.235 2.256.235 2.256s.181.562-.108.635c-.288.072-.74-.361-.74-.361s-1.021-.924-1.619-1.688l.048.066-.214.525s.067.115.266.375z" style="opacity:.31;fill:url(#x)"/><linearGradient id="y" x1="214.897" x2="306.501" y1="-410.882" y2="-410.882" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#A0A0A0"/><stop offset=".077" stop-color="#656767"/><stop offset="1" stop-color="#717375"/></linearGradient><path d="m91.075 11.742.183.846s-.563.313-1.678.613c-1.113.3-2.188.801-2.188.801s-.89.289-.551 1.013c.338.726.838 1.076.838 1.076s.711.69.736 1.213c.021.526-.199.765-.764 1.076-.563.313-1.075.375-1.075.375s-1.338.24-2.001-.387c-.663-.626-.787-1.663-.787-1.663s-.05-.876-1.148-1.251c-1.102-.375-2.453.425-2.453.425s-1.063.563-2.2 1.3c-1.14.738-3.291 1.64-4.642 2.114l-.152.699-.758-.382c-1.422.489-3.271 1.109-3.271 1.109s-2.512.926-4.164 1.152c-1.648.224-2.016-.014-2.238-.238-.228-.224.039-1.012.039-1.012s.674-1.376.348-2.09c-.324-.714-2.451-.9-2.486-.9-.04 0-2.318-.265-4.451.932-1.895 1.062-2.143 1.642-2.143 1.642s-.604.938.113 1.867c.807 1.051 1.879 1.146 1.879 1.146s1.021.079 1.258.38c.24.299.076.626.076.626s-.336.925-2.228 1.312c0 0-3.181.933-9.113 1.776l-.582.579c-3.743.47-8.143 1.363-10.555 1.989s-2.553 1.317-2.553 1.317c-.519.813.141 1.236.141 1.236s.829.283 1.017 1.19c.19.91-.783 1.629-.783 1.629s-1.159.972-2.898 1.269-2.396.35-3.429-.47c-.91-.721-.298-1.863.312-2.301.612-.438.909-.91.988-1.112.079-.204.032-.377.032-.377l-.58-.534c-2.005-1.33-9.883.063-9.883.063s0 .002 0 0l-1.341.289-.673-.435s-2.291.604-4.876.589c-2.712-.014-1.27-2.128-1.27-2.128s.638-1.118.75-1.764c0 0 .224-1.745-1.42-1.631a2.11 2.11 0 0 0-1.968 1.546s-.112.801-.089 1.392c.021.594-.002 1.847-.742 2.56-.737.713-1.529.495-1.529.495s-1.331-.582-1.595-.718c-.274-.142-.517-.151-.751-.066a.3.3 0 0 0-.057.029l-.175.75.025-.623c-.156.176-.271.42-.271.42l.088.327-.248.565q-.004.017-.006.035l.008.003s.087-.196.222-.357l.182-.369-.052.241a.3.3 0 0 1 .172-.074c.281-.017.629.158.629.158s1.135.611 1.642.716.875-.065 1.205-.292c.527-.365 1.143-1.121 1.4-1.839.229-.646.279-2.394.279-2.394l.004.014s0-.421-.011-.518c-.012-.098-.075-.553.204-.783.278-.234.459-.347 1.144-.364.68-.017.886.38.886.38s.233.325.233.536c0 .21-.068.34-.068.34s-.371.626-.5.934c-.13.307-.636 1.323-.489 2.177.148.852 1.479 1.251 1.479 1.251s1.062.25 2.575.027l3.12-.503.543-.624.218.474a45 45 0 0 1 3.583-.511c2.326-.228 4.787-.262 5.821-.132 0 0 .484.061.405.234-.062.136-.421.415-.421.415s-.135.081-.654.667-.671 1.155-.693 1.661c-.024.505.516 1.995 2.415 2.394 1.901.397 4.077-.341 4.077-.341s1.427-.314 2.786-1.674c1.41-1.411.012-3.108.012-3.108s-.22-.304-.647-.442c0 0-.187-.05-.079-.17s.37-.647 1.37-.905c1-.257 3.977-1.198 11.065-2.135l.274-.617.874.459c2.708-.373 4.551-.694 7.827-1.454 0 0 3.04-.539 3.675-1.651.368-.65 1.032-1.539-.045-2.434 0 0-.125-.161-.791-.312s-1.179-.252-1.738-.653c-.563-.403-.551-.869-.551-.869s-.047-.445.862-.958c0 0 .851-.623 2.54-1.158 1.691-.533 3.648-.296 3.648-.296s.82.089.685.643c-.14.555-.604 1.482-.622 1.959-.021.474.012 1.027.938 1.414.931.386 2.267.266 2.267.266s1.386-.069 3.647-.801c2.265-.731 4.594-1.573 4.594-1.573l-.094-.483.971.173c.591-.22 1.406-.539 2.285-.936 1.801-.81 2.656-1.488 3.48-1.958 0 0 1.815-1.118 2.887-1.088 0 0 .25-.009.272.32s.104.814.218 1.096a3.22 3.22 0 0 0 2.729 2.048c1.993.228 2.846-1.118 2.846-1.118s.683-1.049-.493-2.296c0 0-.961-1.028-.99-1.107 0 0-.104-.155.168-.233.269-.078 3.152-.884 4.268-1.398l.036-.015-.271-.485.535.365c.202-.101.449-.246.544-.395.171-.271-.054-.797-.054-.797l.006-.007a48 48 0 0 0-.4-.546l-.606-.256-.06.033z" style="opacity:.34;fill:url(#y)"/><path d="m8.12 16.324-.291.435c.134-.023.244-.056.244-.056s.404-.066 1.112.12c.917.244 2.067-.496 2.067-.496s.872-.523 1.274-1.381l.361-1.005s.291-.972 1.105-1.281c0 0 .317-.171.831-.177.513-.005.392.354.392.354s-.056.233-.586.912c-.529.677-.671 1.196-.671 1.196s-.318.722.193.957c0 0 .24.141.939-.091.7-.233 3.02-.843 4.438-1.06l.993-.506-.602-.444c-2.388.442-4.168.995-4.775 1.226-.609.23-.62.082-.62.082-.211-.248.435-1.022.435-1.022s.655-.894.913-1.715c.259-.82-.892-.707-.892-.707-.758.121-1.303.48-1.93 1.236-.486.586-.782 1.389-.893 1.814-.071.267-.193.515-.193.515s-.091.165-.45.322c-.416.182-1.228.396-1.228.396s-.54.045-.931-.15c-.24-.118-.901.05-.901.05l.091-.504-.082-.032-.683.383q-.172.284-.341.569c-.063.146-.179.475.044.51.05.008.113.008.164.008zM13.295 9.19s.342-.271.342-.026c0 .248-.333.69-.333.69s-.107.134-.172.134c-.064-.001.018-.472.163-.798M10.595 12.501s-.388.46 0 .52l.838-.828c-.037-.037-.054-.055-.157-.112.001 0-.524.262-.681.42" style="opacity:.1;fill:#232323"/><path d="M77.807 85.745s-1.75.806-3.396 1.603c-1.647.803-2.25 1.14-2.25 1.14s-.088.049-.031.082c.056.028-.008.063-.008.063-.847.409-2.703 1.07-2.703 1.07s-.167.057-.157.02c.006-.041.199-.105.199-.105s.381-.146.283-.217-1.21.305-1.21.305-1.949.621-2.894.887c-.941.269-2.75.735-2.75.735-1.201.298-3.75.798-4.315.901-.562.104-.417.064-.417.064s.492-.189-.411-.226c-1.146-.05-2.362.112-3.612.288-1.25.18-1.178.324-1.178.324s-.04.154.708.14c.752-.019.534.046.534.046-1.396.202-4.2.238-4.2.238l.005.01q.685.02 1.376.018c.608 0 1.218-.01 1.822-.031.241-.021 1.483-.15 1.925-.244.486-.105-.093-.105-.093-.105l-.74-.023s-.776-.026-.052-.158c.729-.133 1.834-.192 2.388-.252.83-.094.541.105.541.105l-.04.023s.014.094.528.066c.515-.024 4.721-.804 7.069-1.487 2.347-.688 4.102-1.255 4.102-1.255s.157-.055.066.025c-.094.078-.463.2-.463.2s-.595.3.844-.108q.1-.03.197-.06a51 51 0 0 0 3.635-1.543c.029-.028.131-.146-.021-.101-.172.056 0-.065.187-.131.184-.066 2.267-1.162 3.363-1.608l.002.003c.394-.227.781-.455 1.17-.691z" style="opacity:.3;fill:#fff"/><linearGradient id="z" x1="217.656" x2="217.656" y1="-436.751" y2="-436.751" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".078" stop-color="#F4F4F4"/><stop offset=".381" stop-color="#CECECE"/><stop offset=".54" stop-color="#BFBFBF"/><stop offset=".836" stop-color="#7C7C7C"/><stop offset=".9" stop-color="#A8A8A8"/><stop offset=".909" stop-color="#9A9A9A"/><stop offset=".933" stop-color="#7D7D7D"/><stop offset=".956" stop-color="#686868"/><stop offset=".979" stop-color="#5B5B5B"/><stop offset="1" stop-color="#575757"/></linearGradient><path d="M3.893 50.249" style="fill:url(#z)"/><linearGradient id="A" x1="214.326" x2="322.872" y1="-436.511" y2="-424.485" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".078" stop-color="#F4F4F4"/><stop offset=".381" stop-color="#CECECE"/><stop offset=".54" stop-color="#BFBFBF"/><stop offset=".836" stop-color="#7C7C7C"/><stop offset=".9" stop-color="#A8A8A8"/><stop offset=".909" stop-color="#9A9A9A"/><stop offset=".933" stop-color="#7D7D7D"/><stop offset=".956" stop-color="#686868"/><stop offset=".979" stop-color="#5B5B5B"/><stop offset="1" stop-color="#575757"/></linearGradient><path d="m1.193 48.543.107.98c.236.285.579.675 1.067 1.181 1.084 1.121 1.428.416 1.428.416s.072-.201.092-.586c-.042.216-.209.403-.788-.056-.298-.237-.688-.627-1.076-1.049a14 14 0 0 1-1.021-1.117l.048.065-.213.526s.069.115.268.376z" style="fill:url(#A)"/><linearGradient id="B" x1="213.889" x2="336.882" y1="-436.477" y2="-422.851" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".078" stop-color="#F4F4F4"/><stop offset=".381" stop-color="#CECECE"/><stop offset=".54" stop-color="#BFBFBF"/><stop offset=".836" stop-color="#7C7C7C"/><stop offset=".9" stop-color="#A8A8A8"/><stop offset=".909" stop-color="#9A9A9A"/><stop offset=".933" stop-color="#7D7D7D"/><stop offset=".956" stop-color="#686868"/><stop offset=".979" stop-color="#5B5B5B"/><stop offset="1" stop-color="#575757"/></linearGradient><path d="m3.741 49.133-.02-.078q.02.132.043.272s.094.394.12.753a5 5 0 0 0-.143-.947" style="fill:url(#B)"/><linearGradient id="C" x1="411.254" x2="507.236" y1="557.002" y2="537.628" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".418" stop-color="#FFF"/><stop offset=".626" stop-color="#F8F9F9"/><stop offset="1" stop-color="#BFC0C2"/></linearGradient><path d="m99.696 28.566.29.316c.406-.238.654.045.654.045l-.386-.494c-.383.082-1.093.256-2.233.61 0 0-1.353.594-1.59 1.532-.016.332.049.641.116.876.753 1.429.913 1.666.913 1.666.499 1.091.422 1.993.25 2.824-.188.921-1.188 1.668-1.794 1.842-.608.171-.953 0-1.14-.483-.188-.485-.157-.845-.438-2.34-.28-1.499-.653-2.2-1.216-2.372-.563-.173-1.313.468-1.749.811-.438.344-2.417 2.152-2.417 2.152s-2.324 2.091-5.743 4.026c-3.417 1.935-7.69 3.418-7.69 3.418s-2.842 1.092-3.525.998c-.688-.093-.516-.718-.297-1.076.219-.36.516-.937.766-1.545.313-.756.201-1.654-.359-1.967-.562-.311-1.248-.468-3.523.094s-3.197 1.076-3.838 1.451c-.643.376-1.576 1.233-1.842 1.716-.266.484-.563.983.126 1.576.688.594.763.485 1.56 1.046.797.562.922.64.969 1.466.045.827-.766 1.341-.766 1.341s-3.123 2.082-6.602 2.777c-2.34.469-6.833.639-6.833.639s-1.327-.045-5.384.547c-4.056.594-6.787 1.514-7.738 1.856s-2.34.81-3.136 1.17c-.795.358-.375.89-.203 1.015.172.123 1.185 1.074 1.498 1.354.312.282 1.466 1.279.108 2.108-1.356.826-3.603 1.264-3.603 1.264s-3.121.654-4.119.234c-1.001-.422-1.2-.778-1.452-1.358-.313-.718-.016-1.263.794-1.78.77-.486.469-1.199.469-1.199-.983-1.9-3.058-2.058-4.774-1.936-2.72.198-5.358.471-7.425.734-3.059.39-4.541-.063-5.992-.516-1.452-.453-2.997-1.529-3.154-2.498a1.3 1.3 0 0 1-.042-.307c-.078-.758.074-1.146.184-1.784.108-.625-.043-1.532-.084-1.758l-.023-.085c-.507-1.304-1.725-1.903-2.668-2.058-.953-.157-.983.857-.983.857l-.006.04c.078-.208.222-.315.444-.31.577.02 2.259.361 2.781 1.754 0 0 .218.648.019 1.479s-.162 1.571-.019 2.295c.145.725.759 1.408 1.465 1.969.704.562 2.745 1.535 4.734 1.66 1.814.117 2.483.037 2.587.023l.759-.768.135.666c.81-.088 2.115-.229 3.619-.394 2.529-.271 4.227-.541 5.8-.306 1.572.232 2.078 1.463 2.078 1.463s.107.313-.253.542c-.349.226-.75.548-.947.891-.2.345-.411 1.066.159 2.033.572.965 2.142 1.595 3.478 1.435 1.336-.158 3.336-.672 4.521-.98 1.286-.336 2.424-.969 2.572-1.979.148-1.009-1.534-2.297-1.534-2.297s-.81-.611-.909-.75c-.1-.14.099-.197.099-.197s.95-.229 1.356-.416c.403-.19 1.523-.644 3.353-1.217 1.831-.572 5.609-1.248 5.609-1.248s2.09-.332 4.694-.543l.612-.705.493.627a68 68 0 0 1 1.235-.061c3.572-.129 5.343-.555 7.24-.979 1.897-.426 4.569-1.979 4.965-2.276s1.229-.662 1.395-1.958c.17-1.294-1.363-2.157-1.363-2.157s-1.218-.643-1.476-.929c-.256-.288-.019-.562-.019-.562s.689-1.485 2.896-2.355c2.207-.872 3.69-1.106 4.619-1.207.931-.099 1.247.237 1.375.395s.128.485.021.821c-.101.308-.443 1.039-.644 1.396-.199.356-.522 1.216-.317 1.622.211.405.842.592 1.662.444.822-.147 2.987-.761 4.889-1.553 1.897-.793 5.074-2.344 5.074-2.344s.01-.005.021-.013l.086-.729.729.296c1.021-.562 2.764-1.582 4.01-2.63 1.871-1.574 3.699-3.225 4.166-3.641.465-.415.89-.751 1.305-.732.416.021.734.318.99 1.434.258 1.119.306 2.038.426 2.583.117.542.285 1.176.929 1.305.644.128 1.513-.436 1.841-.713.326-.277.918-1.176.879-2.383 0 0 .068-1.605-.762-3.127 0 0-.348-.614-.477-.782-.088-.119-.155-.238-.008-.523.146-.288.465-.821 1.059-1.157.449-.256.881-.316 1.128-.396 0 0 .28-.069.636-.266z" style="fill:url(#C)"/><path d="m1.547 32.696-.05.239a.3.3 0 0 1 .17-.072c.281-.018.629.158.629.158s1.135.61 1.642.716.875-.065 1.205-.292a3.8 3.8 0 0 0 .763-.737c-.29.29-.725.548-1.365.595 0 0-.571-.049-1.419-.587-.846-.537-1.327-.231-1.729.105l-.249.564-.006.036.009.001s.087-.192.217-.352z" style="fill:#fff"/><path d="M6.387 31.961q.09-.18.155-.354c.05-.14.09-.334.125-.55-.096.44-.223.73-.223.73s-.016.066-.057.174M6.807 28.654c-.038.439-.038.987-.038 1.493.04-.509.052-.935.052-.935l.004.014s0-.421-.011-.518z" style="opacity:.73;fill:#fff"/><linearGradient id="D" x1="413.514" x2="417.999" y1="516.412" y2="516.412" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#E2E3E4"/><stop offset=".505" stop-color="#FFF"/></linearGradient><path d="m8.12 16.324-.291.435c.087-.014.089-.007.244-.056 0 0 .404-.066 1.112.12.917.244 2.067-.496 2.067-.496s.272-.164.583-.458c-.4.24-1.385.762-2.132.585-.961-.229-.994-.017-1.336-.049-.292-.028-.292-.11-.275-.314.002-.032.023-.054.03-.092.05-.261.339-.689.339-.689l-.684.383q-.171.283-.34.569c-.063.146-.179.475.044.509q.083.013.163.009z" style="fill:url(#D)"/><path d="M17.019 15.036c-1.027.278-1.972.734-2.494.604-.438-.109-.084-.76.042-.965.069-.146.167-.292.249-.406.31-.506.833-1.351.833-1.351v-.002q.025-.049.049-.102c.067-.18.12-.537-.472-.597-.799-.082-1.613.619-1.613.619s-.547.301-.838 1.417l.112-.313s.291-.973 1.105-1.281c0 0 .317-.171.831-.177.513-.005.392.354.392.354s-.056.233-.586.912c-.529.677-.671 1.195-.671 1.195s-.319.723.193.957c0 0 .238.141.939-.091.7-.233 3.02-.843 4.438-1.06l.993-.506c-.672.056-2.509.526-3.502.793" style="fill:#fff"/><path d="M90.578 74.217q.008-.006.014-.013zM90.821 73.951l.003-.004zM90.738 74.042l.011-.013z" style="opacity:.1;fill:#231f20"/><path d="m87.9 76.68-.164.174c-.646.716-.969 1.007-.969 1.007l-.242.269q-.003.01-.012.014a.2.2 0 0 0 .041.004s.229-.002.588-.219a.5.5 0 0 1-.181.07c-.177.012.431-.538.431-.538s.588-.626.967-1.125c.382-.497.138-.468.138-.468s-.087-.021-.397.125c.025.025.168.23-.2.687" style="opacity:.25;fill:#231f20"/><path d="M90.657 74.133a.04.04 0 0 1 .013-.017q-.007.009-.013.017" style="opacity:.1;fill:#231f20"/><path d="M72.945 81.21s2.215-.931 3.402-.79c0 0 .611.059-.062.711-.672.652-.892 1.168.396.752l.244-.086c-.504.143-.734.143-.658.033.127-.188.461-.461.461-.461s.399-.4.399-.801c0 0 .128-.588-1.604-.225-1.01.209-1.969.59-2.588.867z" style="opacity:.22;fill:#231f20"/><path d="m72.234 81.555-.004.002zM88.057 76.014q-.02.012-.043.021.021-.011.043-.021" style="opacity:.1;fill:#231f20"/><path d="M78.305 81.299c1.448-.521 3.93-1.854 5.023-2.492-1.096.635-3.598 1.91-5.023 2.492" style="opacity:.28;fill:#231f20"/><path d="M87.512 76.325q.04-.024.08-.049zM91.434 73.281q.016-.017.023-.027c-.006.01-.016.016-.023.027M91.521 73.188l.029-.032q-.016.015-.029.032M90.9 73.863q.004-.008.012-.016-.008.009-.012.016M71.246 82.088c-.014.008-.023.018-.036.022q.016-.009.036-.022M91.346 73.375l.021-.021q-.01.009-.021.021M91.077 73.669l.013-.015q-.004.007-.013.015M91.251 73.479q.011-.008.021-.021zM90.987 73.768l.016-.021zM91.161 73.578l.017-.02zM71.816 81.764l-.026.017q.015-.01.026-.017M72.044 81.646q-.009.005-.019.009zM71.305 82.055l-.031.021c.009-.009.02-.013.031-.021M71.969 81.684l-.021.014q.008-.009.021-.014M72.109 81.613q-.007.006-.016.01a.04.04 0 0 0 .016-.01M72.008 81.665l-.021.011zM72.206 81.566l-.007.004zM72.148 81.594l-.024.015q.015-.008.024-.015M71.928 81.707a.1.1 0 0 0-.027.016q.011-.011.027-.016M72.193 81.575l-.014.004q.008-.003.014-.004M72.172 81.585l-.015.007q.01-.005.015-.007M72.079 81.631l-.019.006zM71.866 81.739a.1.1 0 0 0-.027.013q.013-.009.027-.013M71.555 81.906a.4.4 0 0 1-.052.029c.018-.011.036-.017.052-.029M72.219 81.561l-.002.004zM71.421 81.986q-.017.007-.03.02c.007-.01.019-.014.03-.02M71.363 82.02q-.017.008-.032.021a.2.2 0 0 1 .032-.021M71.482 81.948c-.014.006-.023.015-.036.021zM91.708 72.984q.018-.021.04-.042-.02.022-.04.042M71.665 81.846l-.028.018zM71.609 81.875q-.016.011-.03.02zM92.443 72.197a1 1 0 0 0-.055.061q.026-.03.055-.061M92.359 72.287q-.031.032-.061.066zM92.501 72.135c-.011.015-.021.023-.028.033q.011-.015.028-.033M91.786 72.899l.062-.063zM92.273 72.379q-.019.022-.041.045.02-.022.041-.045M92.762 71.858l-.002.001zM92.703 71.919l-.014.017q.007-.01.014-.017M87.938 76.074c-.017.008-.027.016-.043.023zM92.648 71.98l-.029.029zM48.204 91.026l-.003.002zM48.073 91.03h-.021zM48.136 91.028l-.02.002q.01 0 .02-.002M48.005 91.032h-.012zM47.94 91.035h-.015zM87.869 76.111c-.014.006-.021.015-.039.021.018-.006.027-.015.039-.021M87.807 76.146q-.019.015-.041.021a.1.1 0 0 0 .041-.021M87.951 76.067c.02-.011.035-.021.054-.027-.019.007-.034.017-.054.027M87.719 77.52s-.082.064-.193.147c.066-.046.138-.101.193-.147M92.205 72.452q-.031.034-.064.067a1 1 0 0 0 .064-.067M28.05 87.006q-.028-.012-.056-.021.028.01.056.021M71.051 82.217c-.013.008-.021.017-.037.021q.019-.012.037-.021M45.854 89.871c-.024 0-.049-.004-.074-.004.026 0 .051.004.074.004M27.555 86.844q.057.016.119.037-.062-.02-.119-.037M27.862 86.941l-.123-.04q.06.02.123.04M91.88 72.799l.04-.043zM28.058 87.006c.04.016.079.026.116.041zM91.977 72.695l.041-.044q-.024.023-.041.044M92.057 72.612l.061-.062q-.033.03-.061.062M27.991 86.985a.4.4 0 0 0-.062-.022q.031.01.062.022M71.133 82.162c.021-.013.037-.021.055-.036q-.027.018-.055.036M46.361 89.926q-.025-.002-.053-.008.027.006.053.008M71.122 82.17q-.028.017-.049.032zM46.439 89.939l-.049-.008q.025.006.049.008M46.513 89.953q-.024-.006-.047-.011.023.005.047.011M46.096 89.891q-.047-.003-.1-.01.053.006.1.01M46.278 89.913l-.061-.006zM46.19 89.904l-.084-.012q.044.005.084.012M45.971 89.881q-.037-.006-.079-.009.041.004.079.009M27.926 86.961a.3.3 0 0 1-.058-.019q.03.015.058.019M47.395 90.975q.002.005.004.004-.002.001-.004-.004M47.375 90.969h.003zM47.465 90.996l.006.001zM47.442 90.988l.002.002zM46.589 89.967q-.029-.005-.054-.013.026.009.054.013M46.764 90.012 46.731 90q.017.008.033.012M49.049 90.953l-.032.004zM46.659 89.984l-.061-.014zM47.767 91.028h.006zM47.821 91.03h.013zM45.214 89.855h.139zM47.716 91.026q.007 0 .013.002-.004-.002-.013-.002" style="opacity:.1;fill:#231f20"/><path d="M46.772 90.014s.158.021.059.338c-.1.313.06.451.475.594l.023.006h.002c-.079-.04-.074-.08-.074-.08s-.01-.078.078-.216c.087-.136.009-.369-.293-.536.002-.002-.075-.05-.27-.106" style="opacity:.36;fill:#231f20"/><path d="M47.869 91.032h.018zM47.495 91.002h.004zM47.677 91.024h.01zM47.529 91.006h.002zM47.559 91.01q.003.002.008.002zM47.594 91.016h.008zM46.711 89.997l-.043-.011zM28.776 87.27q-.011-.004-.024-.012.014.008.024.012M28.681 87.23c-.008-.004-.021-.006-.03-.01q.015.006.03.01M45.66 89.862c.026 0 .052.005.074.005q-.035-.002-.074-.005M28.797 87.275l-.021-.008zM27.38 86.794q.056.017.112.031-.058-.016-.112-.031M28.814 87.284q-.004-.003-.012-.007.008.004.012.007M28.64 87.219l-.03-.014z" style="opacity:.1;fill:#231f20"/><path d="M27.687 87.239a.2.2 0 0 1-.03-.032c-.263-.197-.343-.418-.343-.418l.009-.011a.2.2 0 0 0 .052.014c-.291-.075-.5-.104-.479-.018.015.061.131.153.269.245q.26.141.522.279z" style="opacity:.38;fill:#231f20"/><path d="m28.716 87.245-.027-.01zM28.602 87.202l-.042-.015zM28.841 87.293q.001 0-.022-.009zM28.232 87.068c-.018-.006-.031-.014-.047-.018q.023.009.047.018M45.534 89.858l.081.002q-.04-.002-.081-.002M45.397 89.855h.089zM28.348 87.11l-.106-.039zM28.506 87.168l-.037-.015q.019.007.037.015M28.557 87.186q-.018-.008-.04-.017zM70.02 84.389h.006zM70.789 84.087q-.002.005-.004.005zM70.762 84.102l-.006.004zM70.732 84.116l-.006.004zM70.697 84.133q-.002 0-.002.002 0-.002.002-.002M70.417 84.249l.011-.002zM70.389 84.262h.002zM70.316 84.289q.005-.003.009-.003-.006 0-.009.003M70.285 84.299q.004 0 .009-.004-.005.004-.009.004M70.354 84.275l.002-.002q-.001 0-.002.002M48.946 90.965c-.011 0-.022.004-.033.004.011 0 .022-.004.033-.004M70.256 84.311q.003 0 .006-.002-.003.002-.006.002M70.78 82.41l.042-.032zM70.956 82.279l.033-.023zM70.898 82.321q.017-.014.033-.022z" style="opacity:.1;fill:#231f20"/><path d="M70.903 83.794c.2.064.106.171-.087.278l.089-.033s.793-.436.458-.633c-.338-.198-1.129-.275-.613-.969l.02-.02c-.442.344-.756.727-.498 1.021-.002.005.115.191.631.356" style="opacity:.19;fill:#231f20"/><path d="m70.566 84.191-.008.003zM70.631 84.163l-.006.003zM70.598 84.176q-.002.004-.006.004.004 0 .006-.004M70.493 84.223l-.007.002zM70.459 84.233l-.008.004zM70.842 82.363l.034-.025zM48.293 91.024h-.023zM48.444 91.014h-.017zM48.369 91.02h-.027z" style="opacity:.1;fill:#231f20"/><path d="M50.023 89.904s.362.225 1.673.285c0 0 .45 0 .468.035.016.028.036.056-.068.102.06-.021.793-.254.476-.391-.04-.019-.063-.024-.074-.028q-.01 0-.019-.003-.013-.002-.021-.004l-.013-.001q-.01-.003-.021-.005-.006 0-.015-.002l-.017-.002-.017-.004h-.015q-.012-.002-.018-.004-.008 0-.016-.002h-.018q-.005-.005-.01-.004l-.021-.003-.008-.001-.028-.002-.004-.002h-.021q-.006-.002-.012-.002h-.028q-.011-.002-.019-.002h-.009l-.018-.002q-.008-.001-.012-.003h-.027c-.039-.004-.08-.004-.128-.009h-.004l-.022-.002h-.032q-.007-.002-.014-.002l-.02-.002q-.008 0-.016-.002h-.019l-.028-.004h-.019l-.028-.002-.016-.002-.024-.001-.021-.001-.026-.004-.02-.001-.026-.003q-.011 0-.023-.003l-.027-.002q-.01-.002-.021-.002-.018-.001-.035-.005h-.02a.3.3 0 0 0-.057-.006c-.142-.019-.271-.033-.378-.055l-.187-.025s-.47-.014-.653-.316c-.118-.197.457-.318.457-.318s.956-.193 1.917-.321c0 0-2.542.294-2.777.626-.211.34.199.507.199.507" style="opacity:.25;fill:#231f20"/><path d="M69.989 84.399h.004zM48.839 90.979l-.021.002zM48.727 90.988l-.026.002zM70.139 84.35q.005 0 .01-.004-.005.004-.01.004M70.116 84.359q.003-.002.007-.002-.004 0-.007.002M70.193 84.332l.004-.002zM70.068 84.374q.004 0 .007-.002-.004.002-.007.002M70.163 84.342q.006 0 .011-.005-.006.005-.011.005M69.996 84.395H70zM70.004 84.395l.008-.002zM72.23 81.559h-.004zM70.053 84.379h.004zM70.036 84.385q.002 0 .004-.002-.002.002-.004.002" style="opacity:.1;fill:#231f20"/><linearGradient id="E" x1="414.245" x2="509.005" y1="568.266" y2="545.727" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".418" stop-color="#FFF"/><stop offset=".626" stop-color="#F8F9F9"/><stop offset=".951" stop-color="#B2B4B6"/></linearGradient><path d="m7.61 68.141-.139-.131-.021.011z" style="fill:url(#E)"/><linearGradient id="F" x1="416.699" x2="511.823" y1="578.564" y2="555.94" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".418" stop-color="#FFF"/><stop offset=".626" stop-color="#F8F9F9"/><stop offset=".951" stop-color="#B2B4B6"/></linearGradient><path d="m90.412 59.954.689.108c1.976-1.573 3.869-3.571 3.869-3.571s1.258-1.261 1.889-2.356c.22-.381.281-.356.271-.177.023-.09.103-.456-.038-.714-.094-.176-.381.288-.83.861 0 0-2.013 2.926-5.798 5.816-3.786 2.891-4.776 3.771-8.083 5.655 0 0-2.309 1.021-3.914.669-1.246-.271 0-1.547.271-2.699.271-1.146.063-1.58-.225-1.807-.287-.225-.91-.385-2.142-.109 0 0-4.709 1.264-6.819 3.307-1.918 1.854.478 2.619 1.021 2.875 0 0 .78.338.719.672-.063.336-.496.623-.733.783-.239.16-3.338 1.977-8.324 2.764-4.039.641-3.26.255-7.143.654-3.881.399-4.952.72-8.068 1.453s-4.945 1.537-5.352 2.349c-.336.671.479 1.103.991 1.407.511.304 1.423.781 1.119 1.293s-1.631 1.277-4.874 1.391-4.569-.336-5.16-1.04c-.548-.649-.08-1.323.096-1.946 0 0 .382-.814.16-1.215-.224-.398-.737-.494-1.278-.559-.544-.064-3.245-.158-5.337-.271-2.372-.127-5.208-.211-8.611-.928 0 0-2.237-.441-3.69-1.262a3 3 0 0 1-.25-.156.64.64 0 0 1-.25-.209c-.41-.432-.047-.748-.186-1.168-.121-.359-.352-.878-.896-1.501a22 22 0 0 0-.72-.713c-.08-.069-.165-.144-.254-.214-1.276-1.037-1.422-1.149-1.964-1.166-.542-.019-.235.895-.129 1.246.041.136.139.328.242.508-.2-.364-.336-.729-.257-.915.144-.337.309-.308.309-.308s.133-.053.595.297c.463.35 1.499 1.078 2.012 1.705.512.625.481 1.18.481 1.18s-.103.563.451 1.17c.555.604 1.733 1.714 5.859 2.349.021.005.041.005.06.009l.193-.549.568.663.016.002c3.592.519 5.544.563 5.544.563s4.709.164 5.982.164c1.271 0 1.035.664 1.035.664s-.072.361-.225.647c-.153.288-.524 1.365-.144 1.94 0 0 .585 1.426 4.382 1.527 0 0 3.324.267 5.643-.688 2.317-.954.224-2.277.224-2.277s-.794-.483-1.129-.737c-.308-.233-.184-.48-.122-.646.061-.163.297-.355.564-.492.265-.134 1.241-.652 5.365-1.722 4.124-1.067 6.587-1.183 6.587-1.183s.021-.004.062-.006l.334-.656.845.559a77 77 0 0 1 2.537-.17c1.691-.083 4.341-.475 5.879-.811 1.539-.342 3.869-1.059 5.591-1.951 1.724-.891 1.808-1.519 1.808-1.519s.328-.472-.391-.995c-.719-.521-1.037-.38-1.672-1.024-.638-.646.553-1.619.553-1.619s.615-.865 4.021-2.177c3.408-1.313 3.98-.873 4.156-.728.175.142.195.613.123.933-.072.316-.494 1.455-.721 2.055-.227.592-.316 1.402.604 1.6.924.193 2.215-.009 3.427-.443 2.893-1.033 3.757-2.295 8.535-5.764l.029-.023z" style="opacity:.83;fill:url(#F)"/><linearGradient id="G" x1="415.474" x2="510.587" y1="573.42" y2="550.798" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".418" stop-color="#FFF"/><stop offset=".626" stop-color="#F8F9F9"/><stop offset=".951" stop-color="#B2B4B6"/></linearGradient><path d="M100.895 47.596c-.635 1.186-1.164 2.608-1.443 3.5-.045.213-.061.33-.061.33s-.119.654-.054 1.036c.028.161.069.279.106.375l.055.134q.03.068.033.111c.007.082-.044.614-.27 1.23v.002a4 4 0 0 1-.24.539c-.024.05-.053.095-.074.139-.458.814-1.098 1.457-1.604 1.532-.324.049-.484-.117-.557-.386.014.369.086.738.289.963.406.441 1.563-.795 1.563-.795s.688-.789.965-2.062c.406-1.875.187-2.248.187-2.248s-.247-.389-.093-.853c.152-.461 1.156-3.047 1.979-4.01l.502-.562.002-.029-.211-.521q-.195.197-.385.454c-.179.288-.406.654-.689 1.121" style="fill:url(#G)"/><linearGradient id="H" x1="414.775" x2="509.87" y1="570.479" y2="547.861" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".418" stop-color="#FFF"/><stop offset=".626" stop-color="#F8F9F9"/><stop offset=".951" stop-color="#B2B4B6"/></linearGradient><path d="M10.564 70.807a5 5 0 0 1-.469-.356c-.133-.112-.641-.585-1.18-1.086-.212-.194-.411-.382-.589-.55-.277-.262-.524-.493-.688-.646l.107.358.052.089c.183.29.854 1.264 2.153 2.277 1.549 1.213 1.559.729 1.559.729s.062-.4-.296-.84a4 4 0 0 1-.202-.27v.002c0 .002 1.012 1.484-.447.293" style="fill:url(#H)"/><linearGradient id="I" x1="414.915" x2="510.04" y1="571.066" y2="548.442" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".418" stop-color="#FFF"/><stop offset=".626" stop-color="#F8F9F9"/><stop offset=".951" stop-color="#B2B4B6"/></linearGradient><path d="M10.678 69.98" style="fill:url(#I)"/><linearGradient id="J" x1="416.103" x2="511.229" y1="576.065" y2="553.441" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".418" stop-color="#FFF"/><stop offset=".626" stop-color="#F8F9F9"/><stop offset=".951" stop-color="#B2B4B6"/></linearGradient><path d="M96.887 55.023s.227-.76.243-1.066l-.005.021s-.513 1.443-.333 2.16c-.021-.559.095-1.115.095-1.115" style="fill:url(#J)"/><path d="m63.301 4.417.728.072c1.426-.402 2.643-.772 2.643-.772s1.265-.41 1.901-.637c.635-.226 1.09-.313 1.654-.409.565-.096 1.311-.14 1.709-.131.4.007.531.122.531.122s.166.131.244.27c.077.138.74 1.891 2.973 2.005 2.233.112 2.263-1.096 2.065-1.464-.226-.427-.896-.863-.896-.863s-.899-.575-1.092-.847c-.191-.27.034-.357.104-.375.065-.017 2.435-.497 2.729-.609l.021-.021-.562-.171s-.119.134-.789.313-1.235.246-1.742.313c-.506.066-.506.239-.506.239l-.086.136c-.025.075-.067.321.375.642.528.387 1.172.75 1.438 1.04s.586.783.012 1.137a1.7 1.7 0 0 1-.778.264q.001.012 0 .012c-.248.021-.457.03-.638.03l-.155.009-.017-.013c-.506-.024-.746-.142-1.067-.302-.442-.223-.758-.73-.92-1.087s-.521-.662-.521-.662c-.588-.336-1.695-.343-2.813-.15-1.115.193-2.656.707-2.925.812a34 34 0 0 1-2.307.73c-.693.178-1.222.357-1.646.47-.427.111-3.432 1.005-4.556 1.339-1.126.334-1.849.46-1.849.46-1.688.172-2.193-.134-2.193-.134-.296-.124-.261-.526-.261-.526l.009-1.147s-.027-.433-.357-.611c-.328-.179-.779-.252-1.593-.29-.811-.038-1.683.044-2.093.134-.408.09-1.189.313-1.764.952-.572.641-.481 1.139-.481 1.139l.01.201c.154.245.416.524.862.739 1.015.485-1.137 1.342-1.137 1.342-.479.208-1.191.478-2.208.777-2.21.647-3.684.774-3.684.774l.679.254S47.82 8.907 49.5 7.307c0 0 .625-.293.021-.88-.606-.585-.898-.761-.898-.761s-.41-.223.02-.772a2.7 2.7 0 0 1 1.352-.933c.428-.135 1.754-.249 2.925-.093 0 0 .491.042.457.407-.032.365-.087.873-.077 1.028.01.157.025.515.399.845.379.332 1.098.453 1.098.453s1.257.228 2.845-.218c1.586-.444 3.65-1.141 5.438-1.629z" style="opacity:.1;fill:#232323"/><linearGradient id="K" x1="412.615" x2="501.587" y1="535.399" y2="514.885" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".654" stop-color="#FFF"/><stop offset="1" stop-color="#CBCCCE"/></linearGradient><path d="m91.596 12.992.271.486-.034.014c-1.114.515-3.999 1.32-4.271 1.398-.271.08-.166.234-.166.234.029.078.988 1.106.988 1.106 1.178 1.249.494 2.296.494 2.296s-.852 1.347-2.844 1.12a3.23 3.23 0 0 1-2.729-2.049c-.111-.282-.197-.768-.22-1.095-.022-.33-.272-.32-.272-.32-1.069-.03-2.887 1.089-2.887 1.089-.824.47-1.682 1.147-3.479 1.958-.879.396-1.694.716-2.287.936l-.967-.173.091.482-.063.021s-2.268.822-4.529 1.553c-2.268.732-3.65.8-3.65.8s-1.336.12-2.266-.266-.959-.94-.939-1.415.483-1.404.623-1.958c.139-.555-.683-.644-.683-.644s-1.958-.236-3.65.296c-1.69.535-2.54 1.159-2.54 1.159-.91.512-.863.957-.863.957s-.012.467.551.869 1.072.505 1.736.654c.668.149.791.311.791.311 1.08.894.416 1.785.047 2.434-.631 1.113-3.674 1.653-3.674 1.653-3.276.758-5.12 1.08-7.827 1.452l-.876-.46-.276.615c-7.089.936-10.065 1.877-11.065 2.135s-1.261.784-1.369.904.079.171.079.171c.427.137.647.442.647.442s1.399 1.697-.012 3.108c-1.359 1.36-2.785 1.674-2.785 1.674s-2.177.737-4.077.341c-1.899-.399-2.439-1.889-2.416-2.395.024-.505.176-1.075.694-1.661.517-.585.654-.667.654-.667s.358-.279.421-.415c.079-.172-.404-.233-.404-.233-1.034-.13-3.496-.097-5.822.131-1.439.14-2.769.374-3.578.518l-.223-.48-.543.625-3.12.504c-1.514.222-2.576-.028-2.576-.028s-1.331-.397-1.479-1.252c-.147-.852.359-1.87.49-2.177.13-.307.5-.934.5-.934s.068-.13.068-.34-.233-.536-.233-.536-.205-.396-.886-.38c-.682.018-.866.131-1.144.364a.6.6 0 0 0-.108.127.6.6 0 0 1 .073-.158c.21-.309.65-.668 1.401-.7.748-.034 1.041.228 1.041.228.719.82.115 1.845-.351 2.76a2.7 2.7 0 0 0-.229.483 3 3 0 0 0-.087.227c-.358 1.06.292 1.565.668 1.661s1.141.57 4.269-.031c3.13-.603 3.587-.731 3.587-.731s6.145-1.087 8.96-.425l.023.004s1.297.367.331 1.334c-.966.966-1.729 1.617-1.504 2.377.223.762 1.267 1.903 3.646 1.603 0 0 .842-.113 1.105-.165 1.733-.336 2.899-1.268 2.899-1.268s.972-.721.782-1.631c-.187-.908-1.017-1.189-1.017-1.189s-.659-.424-.141-1.237c0 0 .141-.69 2.553-1.317 2.412-.626 6.813-1.518 10.555-1.989 3.49-.408 9.652-1.575 10.89-2.08 1.235-.508 1.497-1.4 1.521-1.708.024-.31.072-.83-1.14-1.09-1.213-.259-1.758-.655-1.931-.79-.172-.138-.545-.483-.545-1.275s1.607-1.745 3.392-2.35c1.78-.606 3.927-.34 3.927-.34 1.948.167.936 1.963.936 1.963-.074.322-.946 1.785.5 2.169 1.541.409 4.175-.347 5.188-.669.829-.261 3.141-1.074 4.688-1.62.352-.122.66-.231.908-.318 1.656-.577 3.019-1.219 3.785-1.681.771-.462 2.144-1.297 2.144-1.297s1.351-.744 1.799-.808c.451-.064 1.619-.346 1.771.771.155 1.115.631 1.899 1.4 2.271a3.36 3.36 0 0 0 3.246-.231c1.182-.771.359-1.901.359-1.901q-.03-.042-.062-.085a3.7 3.7 0 0 0-.487-.646c-.388-.47-.736-.822-.736-.822-.295-.436.053-.692.425-.834.373-.141 2.351-.758 2.351-.758 1.155-.383 1.592-.551 2.053-.988.445-.419-.189-1.34-.239-1.412l.004-.002.608.256q.204.271.4.547l-.007.005s.226.527.054.799c-.095.149-.343.293-.545.395z" style="fill:url(#K)"/><path d="M57.455 92.28c-.034-.042-.042-.034-.012-.063.021-.021.086-.082.115-.137 0 0-1.17-.063-2.141.077-.962.137-1.933.335-1.933.335l.301.146s.127-.055 1.047-.183c.921-.128 1.267-.128 1.267-.128s.808-.063.969-.063c.162 0 .061.104.061.104s-.078.136.366.124c0 0 .663-.027 1.313-.188.001.005-1.13.24-1.353-.024M54.469 92.691s.146.266-2.923.394c0 0 1.788.052 3.31-.198 1.107-.18-.387-.196-.387-.196M13.114 9.856s-.005.096.019.131c.024.034.107.112.107.112s.328-.5.194-.438c0 0-.119.187-.164.23 0 0-.029.04-.088.077-.059.038-.065.023-.068-.112M10.595 12.501s-.388.46 0 .52l.528-.527s.139-.234.139-.398c.001-.001-.51.247-.667.405" style="opacity:.1;fill:#232323"/><path d="M21.093 23.707c1.227.146 1.499-.132 1.527-.172a28 28 0 0 0 2.865-.207c1.685-.21 3.564-.891 3.564-.891s1.554-.568 2.096-1.18l.016-.002s-.693-.6-1.057-1.122c0 0-.286-.557.027-1.035.316-.479.836-1.008 2.344-1.643 1.506-.636 2.356-.514 2.356-.514s.594-.006 1.007.45c.415.458.649 1.006.649 1.006s.029.38-.115.63l-.155.277s.049.017.378-.007c.329-.021 1.165-.142 2.67-.506 1.508-.363 3.407-.972 3.407-.972s4.9-1.578 5.407-1.714 1.357-.436 1.357-.436l.027.059s.405.663.392 1.269v-.057s-.021.301-.698.818c-.674.517-1.226.479-1.678.442-.452-.039-.665-.071-.794-.045l-.72.04c-.787.111-1.224.407-1.224.407-1.804 1.065.731 9.287.731 9.287-3.742.47-8.143 1.363-10.555 1.989s-2.553 1.317-2.553 1.317c-.519.813.141 1.236.141 1.236s.829.283 1.017 1.19c.19.91-.783 1.629-.783 1.629s-1.159.97-2.898 1.268c-1.738.298-2.396.35-3.429-.47-.91-.721-.297-1.864.312-2.301.612-.438.909-.91.988-1.113s.032-.376.032-.376l-.58-.534c-2.005-1.33-9.884.063-9.884.063-.213-1.169-.362-1.171-.282-3.117.051-1.244.291-1.752.291-1.752l.058-.164s.448-1.443 1.141-2.44c0 0 .602-.172 1.364-.349.764-.172 1.241-.258 1.241-.258" style="fill:#6b6b6b"/><linearGradient id="M" x1="231.232" x2="263.619" y1="-407.871" y2="-407.871" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#696969"/><stop offset=".37" stop-color="#2E2E2E"/><stop offset=".455" stop-color="#424242"/><stop offset=".601" stop-color="#303030"/><stop offset=".695" stop-color="#4A4A4A"/><stop offset="1" stop-color="#666"/></linearGradient><path d="M49.855 16.94s-4.085 1.326-3.891 1.254c0 0-.39.075-.686.161-.294.086-.539.247-.539.247s-3.288 1.222-6.438 1.848c-3.148.627-2.977-.361-2.708-.83.232-.409.829-1.112-.188-1.254-1.019-.14-1.788.251-2.21.439-.422.189-3.162 1.362-1.251 2.254 0 0 1.423.642-.377 1.755 0 0-1.816 1.16-5.355 1.77 0 0-.565.063-1.88.111a16.4 16.4 0 0 0-4.12.658c-1.378.391-1.992.579-2.744 1.065l.194-.501.2-.462c1.069-.533 3.719-1.288 5.717-1.378s2.908-.16 4.721-.624c2.134-.546 2.702-1.019 2.93-1.163.194-.123.771-.479.493-.633-.359-.199-.895-.729-.895-.729-.217-.256-.39-.373-.158-1.046.356-1.029 2.196-1.644 2.196-1.644s1.028-.534 2.334-.514c1.305.021 1.287.752 1.287.752s.062.34-.268.827c0 0-.503.579-.049.656.454.081 1.622.179 5.48-1.028s8.085-2.611 8.085-2.611.12.34.12.62" style="opacity:.45;fill:url(#M)"/><linearGradient id="N" x1="231.623" x2="263.494" y1="-407.063" y2="-407.063" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#525252"/><stop offset=".186" stop-color="#333"/><stop offset=".354" stop-color="#AEAEAE"/><stop offset=".42" stop-color="#ADADAD"/><stop offset=".428" stop-color="#9D9D9D"/><stop offset=".443" stop-color="#818181"/><stop offset=".461" stop-color="#6A6A6A"/><stop offset=".481" stop-color="#585858"/><stop offset=".506" stop-color="#4C4C4C"/><stop offset=".539" stop-color="#444"/><stop offset=".617" stop-color="#424242"/><stop offset=".668" stop-color="#454545"/><stop offset="1" stop-color="#BDBDBD"/></linearGradient><path d="M31.145 21.257c-.541.612-2.096 1.18-2.096 1.18s-1.88.68-3.564.891c-1.608.201-2.777.209-2.777.209l-.082-.002c-.175.145-.483.188-.728.21-.244.023-.806-.039-.806-.039s-2.156.432-2.603.616c0 0-.253.392-.331.539-.08.146-.299.594-.299.594 1.069-.534 3.718-1.289 5.717-1.379 1.997-.089 2.908-.159 4.721-.624 2.134-.546 2.702-1.019 2.929-1.163.195-.123.771-.479.493-.633-.358-.199-.894-.729-.894-.729-.217-.256-.391-.373-.158-1.046.356-1.029 2.196-1.644 2.196-1.644s1.028-.533 2.333-.514c1.306.021 1.287.753 1.287.753s.062.34-.269.826c0 0-.503.579-.049.657.455.08 1.622.178 5.48-1.028a575 575 0 0 0 8.085-2.612c-.098-.29-.296-.652-.296-.652s-.85.301-1.358.436c-.506.136-5.407 1.714-5.407 1.714s-1.9.608-3.407.972c-1.506.364-2.342.485-2.671.508-.329.021-.378.006-.378.006s.013-.027.156-.279c.144-.248.115-.629.115-.629s-.235-.548-.649-1.006-1.007-.45-1.007-.45-.849-.121-2.355.514c-1.508.636-2.029 1.164-2.346 1.643-.312.478-.026 1.035-.026 1.035.365.521 1.057 1.122 1.057 1.122" style="fill:url(#N)"/><linearGradient id="O" x1="236.917" x2="235.888" y1="-417.333" y2="-410.527" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#969696"/><stop offset="1"/></linearGradient><path d="M21.606 31.241s-.064-.328.172-.939c.234-.611.908-.595 1.362-.503.455.095.846.298 1.472-.124.627-.423.47-1.583.046-2.852-.423-1.267-.328-2.128-.328-2.128l-.608-.649-.237.696c.047 1.316.657 3.226.829 3.759.173.533.297.8-.735.517-1.034-.282-1.519.125-1.519.125-1.332.862-1.082 2.161-1.082 2.161z" style="opacity:.2;fill:url(#O)"/><path d="M27.498 36.633c-.264-1.763-.917-2.749-.917-2.749-.25.188-.513.693-.513.693s.179.208.471 1.568c0 0 .141.106.438.279.296.173.521.209.521.209M33.152 32.881s-.78.907-.378 2.336c0 0 .454-.379.585-.68 0 0-.145-.458.138-1.017.003 0-.127-.42-.345-.639" style="opacity:.5;fill:#141414"/><linearGradient id="P" x1="428.78" x2="429.53" y1="532.053" y2="524.469" gradientTransform="translate(-406.164 -500.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#333"/><stop offset=".431"/><stop offset="1" stop-color="#2E2E2E"/></linearGradient><path d="M21.2 31.253c.017-1.299.471-1.492.905-1.818.436-.328 1.326-.024 1.326-.024s.678.218 1.046-.1c.369-.319-.017-1.467-.217-2.123-.202-.653-.41-1.599-.445-2.262-.025-.489-.091-.707-.125-.789l-.205.604c.047 1.316.657 3.226.829 3.759.173.533.297.8-.735.517-1.035-.282-1.519.125-1.519.125-1.332.862-1.082 2.162-1.082 2.162l.259-.027z" style="opacity:.18;fill:url(#P)"/><path d="M26.239 34.29c.045.06.421.597.736 2.113l.005.025c.294.17.519.205.519.205-.264-1.763-.917-2.749-.917-2.749-.122.093-.246.259-.343.406M33.152 32.881s-.78.907-.378 2.336c0 0 .125-.104.262-.248l.021-.051a2.03 2.03 0 0 1 .283-1.763l.004-.003a1.3 1.3 0 0 0-.192-.271" style="opacity:.3;fill:#505050"/><path d="M17.159 8.189h.117c-.16.481-.789 1.141-1.068 1.583-.156.248-.252.572-.474.751.038.043-.003.003.04.04.088.052.813-.139.95-.236.082.015.076.011.12.039.042.07-.481.991-.595 1.109v.04c.196-.023.502-.056.634-.16.383-.299.47-.937.75-1.346l-.04-.196c-.222-.04-.681.02-.87.157h-.039c.091-.473.868-1.346 1.146-1.741.454-.647.881-1.269 1.345-1.9.243-.331.585-.622.831-.949.276-.367.569-.85.949-1.107v-.079h-.158c-.186.135-.675.218-.908.354.032.135.019.101.118.158-.139.386-.598.673-.832.991-.371.5-.784.968-1.147 1.464-.123.164-.205.421-.356.553-.237.208-.913.185-1.185.396h-.08c.056-.332.907-1.392 1.147-1.622v-.04c-.408.057-.724.273-.989.473.044.091.037.073.12.12-.145.238-.361.415-.515.633-.197.275-.305.602-.514.871q.021.058.04.118c.252-.022 1.305-.356 1.463-.474m34.777 5.345.596.197c.159.002.327-.002.432-.04-.009-.654-.364-.913-.593-1.345-.113-.22-.175-.523-.355-.673.069-.242.727-.308.988-.396.643-.211 1.371-.422 2.02-.633.305-.099.664-.077.91-.236.146.015.22.029.277.118.143.212.26 1.667.156 2.097-.398 1.663-.896 2.963-1.938 3.958v.039c.385-.062.568-.436.83-.632 1.051-.794 1.762-1.972 2.137-3.444.221-.865-.14-1.713.199-2.452h-.039c-.074-.188-1.082-.553-1.388-.555-.164.177-.399.416-.634.515-.357.152-.838.109-1.146.315-.287-.024-.506-.57-.315-.791-.011-.09-.009-.112-.04-.158-.239-.191-.85-.171-1.268-.158-.133.125-.252.15-.314.358h-.039c-.021.076.02.05.039.078.025.016.163-.007.236.04.449.047.438.566.675.831-.027.069-.011.04-.042.08-.155.123-1.301.453-1.543.515-.185.046-.414-.068-.553-.081-.336-.028-.633.16-.831.277.107.157.434.118.554.276.421.559.609 1.279.989 1.9m7.871-.557c.187.093.187.332.278.514.185.371.437.82.554 1.228v.316c.092.252.396.284.596.435.156-.021.214-.061.314-.118-.066-.753-.525-1.378-.791-1.979-.08-.188-.207-.452-.236-.633-.021-.109.063-.169 0-.276-.051-.123-.072-.085-.156-.159-.059-.04-.031-.016 0-.078.068-.144.213-.287.275-.436.133-.313.127-.576.396-.751-.04-.41-.639-.457-1.107-.435a.6.6 0 0 1-.24.077c.05.103.082.124.199.157.113 1.161-.699 2.225-1.229 2.928-.208.279-.556.456-.75.754h-.04v.038c.525-.086 1.67-1.176 1.937-1.582m-47.4 9.853c-.081.017-.076.009-.117.039-.288.148-.773 1.426-1.346 1.069-.292.002-.319-.055-.476-.16.02-.376.659-1.063.913-1.226.031-.604.187-1.252.118-1.819q-.061-.022-.118-.039c-.14-.046-.25.168-.357.276-.29.291-.648.597-.871.949-.337-.003-1.414-.013-1.623.119h-.119c.099-.256.86-1.096.633-1.464q-.018-.06-.04-.12c-.722.002-1.592 1.287-1.82 1.82-.115.266-.115.573-.276.791v.04l1.622-.199c.205-.044.487.052.633-.039h.554l.277-.356c.33-.349.768-.702 1.028-1.106h.119v.551c-.303.273-.773.695-.91 1.108v.316c-.203.88.223 1.329.99 1.267.5-.466 1.324-.848 1.226-1.779-.042-.035-.003.005-.04-.038m-4.588-.712H7.58c.109-.436.537-.935 1.069-.95v.197l-.554.713c-.113-.002-.215-.002-.276.04m85.225.197a12 12 0 0 0-.475-1.068c-.3-.574-.613-1.414-1.464-1.425-.211.179-.435.322-.555.593-.777 1.762.819 3.747 1.543 4.71.256.339.557.712.948.908-.091 1.376-1.269 1.813-2.53 1.267-.899-.386-1.617-1.237-2.179-1.979-.188-.249-.481-.457-.672-.713-.177-.239-.304-.507-.515-.713v-.039h-.078c.107.426.354.815.514 1.188.669 1.538 1.52 2.614 2.811 3.521.608.428 1.621 1.104 2.494.475 1.526-1.098.783-5.189.158-6.725m-.116 1.901c-.104.1-.539-.419-.635-.515-.441-.443-1.329-1.221-.83-1.979h.197c.388.403.746.788.99 1.344.129.299.152.805.313 1.069-.022.07-.005.04-.035.081m-26.235 7.912v-.395c.179-.801.137-1.765.314-2.572.241-1.088-.101-2.148.99-2.414.021-.106.057-.148 0-.238-.025-.067-.009-.039-.04-.079-.043-.031-.038-.024-.116-.039-.305.222-1.131.373-1.543.474-.313.076-.639.01-.871.158l-.119.04q.019.12.041.237c.451.147.867-.031 1.067.356.13.252.112 1.157.039 1.504-.251 1.163-.146 2.491-.396 3.64-.086.397.022 1.171-.157 1.463v.08c-.241-.115-.397-.426-.554-.633-.354-.467-.875-.84-1.229-1.305-.213-.281-.437-.617-.712-.833.037-.761.259-1.56.438-2.254.131-.522.135-1.005.395-1.386.148-.217.505-.355.751-.475-.002-.1-.004-.146-.04-.198-.014-.04-.023-.079-.037-.119-.543.081-1.003.341-1.505.475-.454.123-.911.092-1.269.276.012.091.01.112.041.158.014.039.024.08.039.118 1.391-.078 1.18.678.912 1.742-.084.326-.029.775-.199 1.028v.079h-.039c-.285-.433-.713-.852-1.067-1.227l-.435-.395c-.104-.137-.16-.312-.278-.436.024-.437.38-.549.713-.672-.015-.183-.052-.206-.118-.317-1.031.151-1.927.73-3.086.791v.041h-.04c.004.1.004.146.04.197v.079c.227.039.564-.054.831.04.427.15.81.648 1.067.99.388.513.996.949 1.384 1.463.204.274.434.634.713.832-.038.696-.229 1.428-.396 2.058-.086.323-.035.735-.197.988-.025.069-.01.039-.041.08-.377-.718-1.104-1.265-1.582-1.9-.918-1.22-1.938-2.319-2.889-3.521 0-.167.01-.268.08-.356.073-.229.359-.443.633-.476.015-.12.033-.135-.039-.238-.016-.038-.026-.077-.041-.118-.803.123-1.521.497-2.293.714-.401.112-.928.057-1.229.276q-.06.02-.117.04c.021.152.061.176.117.277.314-.005.646-.092.949 0 .793.241 1.361 1.137 1.818 1.742.201.266.513.483.713.751.849 1.129 1.808 2.146 2.65 3.285.328.442.771.825 1.066 1.304.179-.004.216-.025.316-.079.213-.929.332-1.866.596-2.81.119-.432.269-.942.314-1.424.327.117.592.607.793.871.618.821 1.491 1.502 2.057 2.373.164-.007.182-.026.277-.078.179-1.342.348-2.688.52-4.033M4.297 38.894c-.013 2.467-.142 6.269 1.781 6.806.7.193 1.087-.271 1.306-.595.786-1.17.565-3.446-.199-4.43-.339.034-.825.84-.988 1.106-.082-.016-.075-.011-.119-.04-.091-.041-.085-.066-.159-.118-.06-.933.127-1.802.159-2.691 1.044.102 1.941.696 3.007.751-.001-.185 0-.434.077-.552-.009-.092-.007-.112-.04-.16-.145-.115-.949-.306-1.186-.315v-.04h-.04c.146-1.174-.186-2.082-.99-2.414l-1.346-.239c-.229-.083-.341-.266-.514-.395-.058-.38-.133-.806.159-1.029-.021-.142-.032-.168-.119-.238v-.039h-.04a2.9 2.9 0 0 0-.315.792c-.234.983.309 1.818.909 2.018l1.188.197c.314.122.453.379.671.595-.009.512-.5.568-.91.435-.64-.208-1.321-.353-1.977-.592-.172-.064-.333-.17-.555-.199l-.08.751 1.662.515c-.023 1.398-.574 3.074.119 4.153a.5.5 0 0 1 .198.08c.78-.054.943-.68 1.345-1.108.342.82.086 2.253-.671 2.453-.326.224-.803-.066-.989-.237-.648-.599-.785-1.511-1.027-2.532-.083-.344.033-1.042-.118-1.307.006-.404.092-1.134-.12-1.344v-.039zm95.039 6.649c-.143-.666.055-1.478-.08-2.097v-.633c-.097-.453-.059-1.056-.156-1.502-.189-.882-.022-1.926-.355-2.652a2.5 2.5 0 0 0-.671-.08c-.103.104-.179.158-.159.278.083.359.547.432.673.792q.02.258.04.514c.133.561.111 1.286.236 1.86v.475c.063.289.16 1.036.078 1.267-.139.41-.584.78-.868 1.068-.754.755-1.64 1.715-2.97 1.859-.025.068-.01.039-.041.08.022.494.476.396.793.594l.236-.042c.122-.074.191-.242.276-.356.2-.261.563-.399.751-.671h.04c.002 1.205.028 2.561.04 3.718h.117c.272-1.172.252-2.61.238-4.039.521-.486.853-1.19 1.385-1.66v-.078h.041c.007 1.251.037 2.529.037 3.797 0 .407-.102 1.378 0 1.544v.237h.08c.106-.425.133-1.023.236-1.501v-.674c.118-.534.117-1.563.003-2.098m-71.023 2.53c-.347-.144-.776-.461-.989-.751-.637-.875-1.337-2.948-.87-4.51.379-1.266 1.202-2.127 2.532-2.454.673-.163 1.397.062 1.821.278 1.208.622 1.725 1.506 2.096 2.967.48 1.887-.132 3.619-1.385 4.194l.237 2.295c.444-.013.852-.105 1.227-.199.629-.155 1.271-.176 1.86-.315.431-.104 1.052-.015 1.384-.237.079-.17-.247-1.35-.315-1.623-.057-.229-.009-.461-.119-.633v-.079q-.138.018-.277.039c.018 1.195-.834 1.032-1.781 1.267-.473.119-1.049.27-1.581.276l-.001-.514c.045-.083.739-.386.868-.476a4.7 4.7 0 0 0 1.229-1.304c.202-.327.366-.764.473-1.149.138-.489.154-1.17.041-1.662-.079-.338-.048-.603-.158-.91-.427-1.187-1.322-2.054-2.453-2.532-.513-.216-1.093-.224-1.7-.356-.539-.116-1.509.124-1.901.238-1.905.562-3.198 1.48-3.799 3.323-.236.728-.163 1.736.04 2.414.467 1.561 1.773 3.02 3.72 3.047v.039c.062.088.06.264.118.355-.024.067-.009.039-.04.08-.164.111-.404.061-.633.117-.47.118-1.986.486-2.334.158-.222-.072-.37-.363-.396-.632-.099.004-.146.004-.197.039h-.082q.219 1.149.435 2.296h.041v.04q2.078-.36 4.154-.713l-.593-2.179c-.112-.168-.468-.148-.672-.234m67.701-4.391c.086.218.254.58.435.712.086.063.132.04.198.119 1.31.113 1.842-2.143 1.308-3.442-.095-.225-.517-.885-.911-.633h-.08c.026-.069.01-.038.04-.08-.001-.188-.021-.25-.077-.356-.08-.013-.156-.026-.238-.038-.039.031-.01.014-.078.038.027.24.111.247.119.514-.64.583-1.185 1.981-.716 3.166m.432-2.097c.088-.213.265-.35.396-.515.082-.015.075-.01.117-.04.301-.001.385.057.555.159.301.711.346 1.954-.156 2.494-.077.085-.229.116-.315.197-.829-.063-.897-1.575-.597-2.295M78.092 57.168c-.445-.273-.507-1.675-.673-2.294-.327-1.215-.483-2.489-.831-3.72-.223-.788-.523-1.605-.435-2.572.139-.138.231-.32.396-.436.223-.154.58-.229.752-.436.027-.051-.019-.128-.041-.238-.459.074-.879.35-1.267.515-.792.337-1.567.536-2.373.87-.252.104-.515.282-.833.315v.238q.041.02.08.04c.042.045 1.033-.392 1.346-.118.356.125.311.59.514.872-.061.614-.672 1.558-.912 2.097a63 63 0 0 1-1.816 3.836c-.248.477-.543 1.334-.871 1.701v.039c-.216-.296-.199-1.051-.314-1.462-.353-1.235-.578-2.591-.951-3.798-.068-.23-.305-1.279-.156-1.503.051-.546.822-.785 1.266-.95q-.017-.14-.039-.277c-.701.105-1.429.479-2.058.713-.595.223-1.14.313-1.741.516-.298.102-.636.275-.986.314v.041h-.041c.015.112.025.172.078.237.162.107 1.03-.352 1.386-.077.557.19.573 1.075.752 1.66.481 1.579.728 3.327 1.187 4.947.115.404.391 1.686.119 2.018-.148.439-.885.615-1.306.791q.02.12.036.237c.609-.09 1.162-.373 1.707-.56 1.063-.354 2.066-.65 3.089-1.029-.017-.092-.027-.186-.041-.275-.437.116-.773.248-1.386.236l-.235-.199q-.101-.316-.199-.632c.043-.499.683-1.421.91-1.86.673-1.293 1.262-2.6 1.856-3.955.229-.519.754-1.275.832-1.857.184.111.133.438.197.672.135.475.211.98.355 1.503.281 1 .391 2.075.673 3.126.104.387.261 1.048.08 1.464-.179.404-.841.673-1.267.83.017.084.037.183.08.238.004.007.906-.288 1.064-.354 1.104-.471 2.236-.959 3.361-1.386-.015-.093-.024-.187-.039-.274-.28.071-.92.435-1.305.196m18.711 3.33c-.143.13-.354.163-.514.277-.501.359-1.025.962-1.385 1.463-.288.402-.534.843-.791 1.268-.112.188-.137.402-.277.553v.08c.346-.059.549-.283.792-.436a29 29 0 0 0 1.858-1.225c.295-.217.515-.551.83-.754.029-.473.125-.844-.077-1.188a2 2 0 0 0-.436-.038m-.474 1.423c-.239.177-.47.423-.712.595-.208.146-.458.224-.633.396h-.04c.13-.408.817-1.107 1.146-1.344.17-.124.383-.157.557-.279h.156c.036.046.034.044.08.08-.037.298-.36.405-.554.552m-85.504 1.544c-.166-.502-.278-.99-.435-1.465-.079-.246-.062-.525-.199-.713v-.118c.269.097.679.087.911.238h.201c-.045-.206-.086-.552-.201-.713-.12-.195-.886-.197-1.106-.354-.312-.244-.607-.947-.832-1.307-.56-.887-1.302-1.832-2.137-2.453-.443-.329-.751-.671-1.544-.673l-.276.198c-.178.789.139 2.248.592 2.611v.078a1.2 1.2 0 0 1-.514-.275h-.04c.007.227.051.522.158.672.046.195.362.354.554.396a26 26 0 0 0 .95 3.05c.289.758.436 1.48.75 2.213.155.356.522.617.634.99h.117c-.089-.334-.271-.646-.394-.949-.364-.875-.653-1.804-.952-2.688-.194-.583-.328-1.146-.514-1.703-.069-.21-.049-.427-.158-.595v-.039c.269.049.43.188.634.276.461.201.903.277 1.385.476.353.146.796.347 1.228.396.048.359.253 1.301.435 1.545v.117c-.602-.412-.589-1-1.663-.91a.8.8 0 0 1-.197.158 1.4 1.4 0 0 0 0 .909c.257.646 1.072 1.991 1.741 2.179.257.184.634-.043.75-.24.242.127.293.682.395.951.212.558.522 1.289 1.031 1.543v.041h.083c-.066-.447-.318-.851-.475-1.229-.35-.855-.624-1.754-.912-2.613M9.678 60.26c-.418-.03-.773-.193-1.108-.315-.894-.332-1.703-.615-2.492-.991-.095-.358-.76-1.644-.396-2.095l.079-.12c.081-.019.077-.011.119-.039 1.219.146 2.442 1.629 3.046 2.452.236.32.43.799.752 1.029zm.633 3.441-.356.436c-.105.078-.223.109-.316.198-.68-.021-.704-.686-.989-1.108.005-.389.152-.39.315-.594.092-.007.112-.007.158-.037.614.004.753.278 1.109.515.058.233.095.334.079.59m23.267 6.093c-.165-.271-.49-.342-.713-.554-.069-.023-.04-.007-.079-.039.51-.264 1.053-.555 1.583-.79.142.158.801.792 1.029.671q.06-.017.118-.038-.018-.336-.04-.673a4.03 4.03 0 0 0-2.059-1.066v.039h-.039c.093.273.398.534.636.672v.119c-.469.068-.885.295-1.307.437-.289.093-.638.08-.873.235h-.117c.171-.479.737-.871 1.028-1.267.576-.776 1.033-1.728 1.94-2.176-.024-.365-1.076-1.12-1.464-.871-.097.051-.029-.021-.079.078-.059.144.137.321.079.554-.076.305-.831 1.74-1.029 1.9v.041c-.408-.139-.718-.523-1.107-.713.069-.364.375-.644.554-.91.453-.684.816-1.335 1.503-1.782-.006-.526-.855-1.075-1.425-1.065.002.242.125.379.08.592-.14.646-.435 1.297-.672 1.861-.156.364-.226.799-.476 1.065-.054.03-.492-.006-.594-.077a1.3 1.3 0 0 0-.394.038v.079c.666.645 1.387.865 2.295 1.268-.126.655-.786 1.092-1.108 1.584-.166 0-.3-.011-.395-.08-.091.017-.098.021-.158.041.016.582.5 1.077.987 1.188.327-.366.737-.543 1.228-.751.449.468.578 1.137.751 1.897.075.332-.047.697.04.988.152.514.426.667.672 1.027h.277c.174-.93-.253-1.832-.475-2.571zm62.512-6.686c-.238.202-.57.296-.83.475-.4.282-.758.659-1.146.95-.177.134-.435.253-.556.436-.199.299-.16.806-.396 1.067v.157c.314-.114.464-.483.713-.672.307-.23.563-.536.87-.754.192-.133.411-.207.594-.355.125.023.115.037.199.081-.021 1.005-.549 1.714-.871 2.454-.093.215-.121.551-.276.71-.074.076-.229.094-.314.157l-.794.873c-.25.344-.365.803-.632 1.146-.002.114-.002.216.037.276.041.031.11.059.16.08.51-.483 1.004-.887 1.424-1.465.658-.904.986-2.047 1.465-3.125.3-.683.734-1.354.711-2.334a.7.7 0 0 1-.117-.158zm-2.77 6.253v.039h-.04c.069-.475.43-.606.596-.952h.079c-.051.394-.35.746-.635.913m-59.149.632c-.08.342.76 1.106 1.027 1.308.133.1.312.328.515.235.104-.008.136-.019.199-.04.046-.105.115-.24.039-.354-.021-.497-1.311-1.054-1.78-1.149m3.799 3.044c.067.034.122.021.198-.039.139-.113.063-.313.159-.475.222-.159.615-.118.911-.199.809-.213 1.753-.198 2.65-.396.425-.093 1.128.16 1.464-.037.04-.016.081-.026.118-.043-.019-.517-1.009-.737-1.545-.588-.237.066-.513.213-.751.275q-.278.021-.555.038c-.062-.644-.38-1.144-.395-1.817.595-.013 1.341-.091 1.739-.316-.008-.2-.045-.2-.118-.314-.453-.107-1.23-.126-1.583.116-.1-.004-.147-.004-.197-.039-.221-.28-.116-.851-.316-1.146v-.158c.426-.092 1.122-.168 1.345-.475.031-.041.014-.011.039-.078-.036-.035-.051-.068-.079-.119-.619-.156-.887-.049-1.423.158-.167-.535.034-.959-.514-1.108.117-.203.506-.194.751-.276a7.6 7.6 0 0 0 1.148-.474c.026-.068.007-.04.04-.08-.022-.2-.078-.193-.159-.316-.571-.044-1.027.011-1.346.316h-.076c.047-.295.231-.718.394-.949.112-.162.318-.14.396-.356h.04V64.1q-.12-.158-.238-.314c-.186-.13-.454-.143-.632-.279-.263-.004-.515-.003-.672.079.021.152.089.248.119.356.109.408-.284 1.669-.436 1.859-.123.154-1.551.672-1.939.555-.092-.029-.36-.164-.435-.239-.032-.039-.015-.008-.04-.077.561-.527.965-1.702 1.741-1.939l.041-.196c-.194-.2-1.135-1.188-1.622-.871-.04.014-.079.022-.117.038 0 .338.168.593.078.949-.182.711-.587 1.556-.95 2.139-.218.35-.693.729-.712 1.229.646-.064.802-.731 1.304-.912q.218.203.436.396c.207.311.168.778.276 1.186q.279 1.285.554 2.571c.025.425.052.845.08 1.269.105.381.42 1.046.829 1.138m1.263-3.005c.031.368.258 1.407.436 1.662l.001.08c-.477.102-.973.239-1.504.237-.082-.564-.352-1.061-.355-1.662.607-.011.92-.255 1.422-.317m-2.294-3.282c.063-.107 1.113-.273 1.228-.199.42.195.27.813.514 1.188-.083.194-1.047.487-1.345.514-.053-.419-.123-1.276-.397-1.503m1.821 1.503h.04c.076.36.119.978.317 1.267-.142.348-1.016.317-1.346.516-.138-.083-.32-1.076-.316-1.346.302-.028 1.086-.288 1.305-.437m-6.846 2.253c-.06.135-.053.354-.117.514-.342.84-.454 1.015.079 1.82.237 0 .269-.037.396-.119.157-.657.182-1.907-.358-2.215m45.109.238c-1.154-.285-2.125.285-3.325.199-.114-.121-.2-.19-.275-.356-.835.024-1.757 1.886-.909 2.453.453.308 1.744.129 2.295 0 .306-.071.783-.139 1.027.038.332.247.273 1.182.157 1.703q-.199 1.462-.396 2.929a400 400 0 0 1-.356 1.779c.606-.003 1.178-.623 1.349-1.069.1-.258.047-.502.119-.791.209-.83.237-1.82.436-2.689.127-.563.041-1.1.156-1.621.086-.393.143-1.696.041-2.059-.061-.201-.216-.359-.319-.516M22.857 82.695c-.135-.102-.229-.283-.356-.395-.473-.42-1.029-.826-1.543-1.188-.426-.298-1.008-.476-1.387-.829-.01-.086.123-.296.041-.516-.335-.896-1.589-1.933-2.374-2.412-.363-.225-.972-.328-1.305-.555-.246-.017-.374-.025-.435.155-.097.218.209.521.315.675.271.381.581.826.95 1.104.276.209.591.392.83.635h.119c-.154-.426-.609-.657-.949-.909-.311-.229-.449-.632-.712-.909.021-.125.035-.115.08-.199 1.093.009 1.802 1.012 2.294 1.662.22.291.571.461.594.951-.116 0-.216 0-.276-.041h-.119c.188.522.824.479 1.267.754.888.549 1.603 1.409 2.373 2.094.262.234.719.466.791.873-.537-.028-.917-.327-1.261-.555-.614-.4-1.597-1.1-2.019-1.662-.08-.104-.106-.263-.199-.355-.109-.111-.261-.145-.355-.275h-.158c-.039.41.407.705.671.948.819.75 1.696 1.442 2.73 1.979.373.191 1.053.521 1.465.275-.055-.566-.702-1.025-1.072-1.305m24.369 2.612c-2.014-1.379-4.985-2.775-8.427-2.689-.167.104-.503.021-.711.078-.288.076-.464.223-.672.355-.008.971 1.446 1.496 2.255 1.698.483.123.909-.104 1.188-.198.215-.82-.776-.94-1.227-1.347h-.081v-.038c3.036-.119 5.308.729 7.043 2.02.433.322.93.783 1.148 1.306.081.194.116.515 0 .674-.159.44-.685.401-1.188.515-1.162.267-2.755-.391-3.285-.91-.108.189.049.48-.118.674-.176.478-.788.354-1.346.474-.917.199-2.353-.271-2.888-.632-.149-.104-.257-.286-.396-.396a.6.6 0 0 0-.041-.199c.081-.073.177-.187.237-.275 1.139-.085 1.718-.027 2.376.596-.017.078-.01.073-.041.114-.074.152-.245.17-.474.161v.074c.417.004.593-.059.83-.197l.04-.236c-.136-.141-.231-.328-.396-.438-.65-.426-1.991-.641-2.729-.156-.116.561.232.864.554 1.105.646.488 1.191.771 2.098 1.029.291.082.55.008.871.076.28.064.765.079 1.068 0 .504-.128 1.205-.658.632-1.268v-.037c.299.109.544.402.831.556.761.397 2.021.726 3.167.476.562-.125 1.143-.125 1.303-.635.179-.277-.068-.668-.156-.826-.369-.66-.855-1.09-1.465-1.504m-7.32-1.822c.14.094.22.291.356.396-.003.1-.004.148-.04.199-.257.697-1.706.182-2.058-.081-.11-.08-.153-.248-.236-.354.015-.082.01-.076.041-.116.108-.306.417-.203.671-.354.502-.001.956.099 1.266.31m36.719.396h-.396c-.262.209-.692.236-.991.396a7 7 0 0 0-.829.515c-.207.148-.326.418-.516.592.004.197.008.229.16.277.039.029.01.018.075.04.042-.047.08-.063.12-.12.033-.023-.027-.104-.04-.232.384-.386.667-.598 1.228-.832.144-.059.447-.233.634-.119h.079c-.026.391-.916 1.591-1.188 1.781v.115c.729-.188 1.215-1.643 1.702-2.174-.013-.09-.01-.111-.04-.157zm-3.166 2.928c-.234.209-.807.229-1.066.435h-.041c.104-.149.291-.213.396-.354.076-.104.107-.226.197-.315-.018-.081-.01-.075-.039-.117v-.08c-1.155-.212-3.084.784-3.68 1.308-.155.135-.248.336-.396.477a.7.7 0 0 0 .039.236c.701.047 2.016-.383 2.174-.949.031-.025.012-.002 0-.04v-.079c-.479-.027-1.124.075-1.422.355h-.039c.26-.396 1.223-.746 1.739-.91.172-.053.55-.149.714-.039.037.015.077.025.117.039-.094.396-.657.838-1.029.949v.08c.607-.141 1.163-.416 1.7-.634.368-.149.786-.188 1.108-.396.229-.149 1.008-1.207 1.068-1.504-.913.138-.987 1.042-1.54 1.538m-3.126.791v.119c-.075.049-.129.156-.198.196-.205.12-.479.106-.674.238-.09-.011-.109-.009-.156-.041h-.039c.107-.337.759-.491 1.067-.512m-16.498 3.717c.015-.037.025-.078.039-.117l-2.927-.119c-.123.082-.312.035-.475.079-.202.059-.426.15-.593.239.026.067.008.038.04.077.238.188 1.624.199 1.9 0h.078v-.077c-.419-.134-1.183.2-1.503 0h-.041v-.041c1.052-.073 2.23-.044 3.325-.04-.105.072-.328.051-.436.119l-.117.039v.08q.357.057.711.117c.037.041-.004.004.039.037-.35.233-1.254.139-1.581-.037v-.08c-.178-.082-.991.084-1.148.117-.133.03-.27-.014-.357.039-.165.01-.181.029-.276.079.022.128.035.115.08.198.255.06.696.064.987.156v-.039h.04v-.039c-.148-.057-.559-.025-.713-.115h-.079c.132-.104 1.425-.278 1.663-.119.067.023.039.007.079.039-.211.038-.424.08-.634.117.025.066.009.039.04.078.065.045.193.045.316.039-.04.074-.054.109-.119.158q.02.036.04.078c.561 0 1.031-.057 1.502-.156.28-.062.624.052.831-.08h.317v-.078c-.539-.002-1.885-.055-2.215.158h-.117c.033-.043-.004-.004.038-.041.155-.18.471-.09.75-.156.44-.104 1.168-.284 1.544 0 .105.064.04-.008.039.117.107-.002.181-.002.236-.036h.277v-.081c-.359-.088-.889-.251-1.188-.434-.17-.104-.092-.248-.392-.275m-40.2-72.958c-.088.32-.274.593-.395.87-.268.613-.507 1.225-.751 1.822-.207.496-.335 1.295-.633 1.699v.079c.416-.074.698-.493.949-.751.617-.634 1.92-2.22 1.9-3.402a1 1 0 0 1-.159-.237 3.8 3.8 0 0 0-.911-.08m.159 1.663c-.181.298-.281.592-.476.871-.178.255-.46.452-.633.713h-.041c.051-.302.214-.546.319-.792.235-.561.396-1.118.671-1.621.152.003.268.015.356.078.095.052.028-.018.079.08.081.197-.179.511-.275.671M84.023 7.875c-.414-.416-.729-.938-1.147-1.346V6.49c-.205.073-.899.688-1.028.871-.25-.095-.391-.365-.594-.514-.676-.508-1.313-1.167-2.49-1.147-.148.115-.367.118-.556.197-.53.23-1.083.688-1.305 1.227-.249.602.004 1.491.196 1.939.392.904 1.03 1.667 1.582 2.414.457.615.973 1.252 1.819 1.464.956.238 1.422-.884 1.781-1.308.37-.435 1.182-.539 1.464-1.107.104-.207.034-.615-.039-.791-.18-.426-1.066-1.622-1.425-1.859.024-.239.135-.247.235-.396.248.121.338.471.516.673.227.258.546.396.791.632.378.003.604-.094.79-.277h.041c-.093-.265-.442-.448-.631-.633m-2.253 4.273c-.699.165-1.047-.293-1.424-.673-.938-.935-1.57-2.093-2.298-3.244-.247-.396-.885-1.134-.554-1.702h.156c.199.299.539.507.754.792.591.784 1.313 1.469 1.898 2.255.359.485.758.94 1.106 1.424.178.249.315.565.556.751-.04.18-.116.264-.194.397m.591-2.809c.32.439.755.688.751 1.463-.122.116-.157.224-.356.276-.039.032-.011.015-.078.041-.56-.932-1.367-1.711-2.017-2.573-.212-.282-.541-.511-.752-.791-.362-.48-.793-.864-1.188-1.305-.113-.131-.168-.257-.313-.357.033-.086.031-.057.076-.118.672.006.994.458 1.386.753.967.725 1.778 1.626 2.491 2.611" style="opacity:.88;fill:#231f20"/><radialGradient id="Q" cx="251.809" cy="-408.361" r="72.751" gradientTransform="matrix(1 0 0 -1 -213.764 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-opacity="0"/><stop offset=".802" stop-opacity=".08"/><stop offset="1" stop-opacity=".388"/></radialGradient><path d="M49.885 17.037c.014-.606-.392-1.27-.392-1.27l-.025-.058s-.487-.949-1.302-1.228c-.815-.278-1.478.342-1.478.342l-.429.494c-.313.364-.507.666-1.198.938-.692.271-1.379.204-1.743.033a.9.9 0 0 1-.457-.537s-.229-.722-.313-1.049c-.086-.331-.309-1.694-.309-1.694s-.491-2.747-.534-3.304c0 0 1.475-.126 3.687-.775 2.299-.673 3.043-1.206 3.043-1.206s-.432-.156-.484-.662c-.051-.507-.089-1.19-.089-1.19s-.089-.5.483-1.139c.571-.64 1.354-.863 1.762-.953.41-.089 1.281-.17 2.093-.134.812.038 1.267.112 1.593.291.328.178.357.61.357.61l-.008 1.146s-.037.402.261.529c0 0 .505.305 2.196.133 0 0 .72-.126 1.846-.46 1.125-.335 4.129-1.229 4.554-1.341s.953-.291 1.646-.469a34 34 0 0 0 2.308-.73c.271-.104 1.812-.618 2.927-.81 1.115-.195 2.227-.186 2.813.149 0 0 .357.304.521.662.163.358.478.863.923 1.088.454.227.752.371 1.875.273 0 0 .022-.096-.395-.37-.417-.277-.991-.701-.991-.701s-.336-.245-.411-.447c-.072-.202-.043-.306-.043-.306l.877-1.406s0-.172.508-.238c.506-.067 1.071-.134 1.74-.313.67-.178.788-.312.788-.312l.58.178s3.546 2.853 4.655 3.583l.199-.239s.436.018.826.172c.394.154.979.562.979.562s1.612 1.31 2.071 2.2l.223.679-.102.161s.918 1.307 2.096 2.602c0 0 1.227 1.664 1.689 2.09 0 0-.108-.399-.201-.849l.336-.226.203-.144.617.259c3.573 4.811 6.432 10.424 8.141 16.328l-.12.484.395.501a51 51 0 0 1 1.728 13.211 52 52 0 0 1-.107 3.339l-.304.511.225.555c-2.231 26.1-24.124 46.584-50.801 46.584-18.502 0-34.702-9.854-43.637-24.6l-.102-.364-.205-.153A50.6 50.6 0 0 1 .874 48.944l.212-.525-.336-.483a51 51 0 0 1-.322-5.756c0-2.985.255-5.909.748-8.755l.25-.562-.087-.328a50.6 50.6 0 0 1 6.474-16.799l.684-.384.081.032s.233-.169.354-.217l.076-.023s1.179-1.971 1.625-2.601c0 0 .542-.348.745-.407 0 0 .124-.016.189.076 0 0 .496-.432 1.699-2.054l.012-.017s-.114-.076-.131-.174.108-.591.173-.717.108-.156.108-.156 1.722-2.032 3.151-3.238c0 0 .26-.202.678-.25 0 0 1.472-.613 3.264-2.184 0 0 .051-.289.478-.858.428-.57 1.456-1.163 2.222-1.337.764-.174.896-.038.896-.038l.064.065.515.766s.565-.316 1.413-.604c.847-.289.979-.262.979-.262l.825 1.336-.987 2s-.644 1.421-1.655 2.185c0 0-.472.284-1.12.127s-1.072.333-1.072.333l-.17.14s.14-.024.346-.103c0 0 .158.065.274.223.114.158.913 1.175.913 1.175s.005.837-.415 1.938c-.419 1.1-1.467 2.891-1.467 2.891s-.733 1.424-1.075 2.253-.515 1.765-.488 2.262c0 0 .187.062.707-.202.655-.332 1.083.027 1.083.027s.719.53 1.041.881c.262.289.802 1.765.209 3.224 0 0-.402 1.008-1.377 1.724 0 0-.216.332-1.529.174-.368-.043-.585-.276-1.372-.2-.785.077-1.231.815-1.231.815l.013-.024c-.692.999-1.154 2.458-1.154 2.458l-.057.165s-.241.509-.292 1.752c-.053 1.284.284 3.109.284 3.109s7.876-1.387 9.88-.055l.58.532s.046.174-.031.376c-.08.204-.375.673-.987 1.113-.611.438-1.222 1.583-.313 2.304 1.034.818 1.691.766 3.43.468 1.74-.297 2.898-1.269 2.898-1.269s.972-.72.783-1.628-1.017-1.189-1.017-1.189-.658-.423-.141-1.238c0 0 .141-.689 2.553-1.316 2.414-.626 6.812-1.52 10.556-1.989 0 0-2.539-8.223-.737-9.289 0 0 .438-.296 1.224-.408l.721-.037c.131-.027.344.005.796.045.452.038 1.001.076 1.678-.441.676-.519.697-.819.697-.819" style="opacity:.38;fill:url(#Q)"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/wolframAlpha-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/wolframAlpha-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="#ff7e00" d="m16.607 10 2.69-3.063-3.955-.88.409-4.08-3.72 1.65L9.998.08 7.952 3.627l-3.72-1.65.397 4.08-3.931.88L3.388 10l-2.69 3.063 3.955.88-.409 4.08 3.72-1.65 2.034 3.547 2.046-3.547 3.72 1.65-.397-4.08 3.955-.88zm-3.51 1.86h-6.2v-1.24h6.2Zm0-2.48h-6.2V8.14h6.2Z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/youtube-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/youtube-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"><rect width="300" height="300" fill="red" ry="150"/><path fill="#fff" d="M149.938 79.223s-63.22 0-79.086 4.123c-8.496 2.374-15.492 9.37-17.866 17.99-4.123 15.867-4.123 48.727-4.123 48.727s0 32.984 4.123 48.601c2.374 8.62 9.245 15.491 17.866 17.865 15.992 4.248 79.086 4.248 79.086 4.248s63.344 0 79.21-4.123c8.621-2.373 15.492-9.12 17.74-17.865 4.249-15.742 4.249-48.601 4.249-48.601s.125-32.985-4.248-48.852c-2.25-8.62-9.12-15.491-17.74-17.74-15.867-4.373-79.211-4.373-79.211-4.373m-20.116 40.48 52.6 30.36-52.6 30.234z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/youtubeMusic-icon.svg b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/images/youtubeMusic-icon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="12" cy="12" r="12" fill="red"/><path fill="#FFF" d="M12 4.65c-4.05 0-7.34 3.28-7.34 7.34 0 4.05 3.28 7.34 7.34 7.34 4.05 0 7.34-3.28 7.34-7.34 0-4.05-3.28-7.34-7.34-7.34m0 13.7c-3.51 0-6.36-2.85-6.36-6.36S8.49 5.63 12 5.63s6.36 2.85 6.36 6.36-2.85 6.36-6.36 6.36"/><path fill="#FFF" d="m9.76 8.38 6.14 3.52-6.14 3.52z"/></svg> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/javascripts/services.js b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/javascripts/services.js @@ -0,0 +1,1099 @@ +import utils from "./utils.js" + +const isChrome = browser.runtime.getBrowserInfo === undefined +window.browser = window.browser || window.chrome + +let config, options + +async function init() { + options = await utils.getOptions() + config = await utils.getConfig() +} + +init() +browser.storage.onChanged.addListener(init) + +function all(service, frontend, options, config) { + let instances = [] + if (!frontend) { + for (const frontend in config.services[service].frontends) { + if (options[frontend]) { + instances.push(...options[frontend]) + } + } + } else if (options[frontend]) { + instances = options[frontend] + } + return instances +} + +/** + * @param {string} service + * @param {URL} url + * @param {{}} config + * @param {{}} options + * @param {string} frontend + */ +function regexArray(service, url, config, options, frontend) { + let targetList = config.services[service].targets + if (frontend) { + if ( + "excludeTargets" in config.services[service].frontends[frontend] && + (service !== "search" || !options["search"].redirectGoogle) + ) { + targetList = targetList.filter( + val => !config.services[service].frontends[frontend].excludeTargets.includes(targetList.indexOf(val)) + ) + } + if (service === "twitter" && options["twitter"].disableTwimg) { + targetList = targetList.splice(2) + } + } + for (const targetString in targetList) { + const target = new RegExp(targetList[targetString]) + if (target.test(url.href)) return true + } + return false +} + +/** + * @param {URL} url + * @param {string} frontend + * @param {string} randomInstance + * @param {string} type + * @returns {undefined|string} + */ +function rewrite(url, originUrl, frontend, randomInstance, type) { + switch (frontend) { + case "hyperpipe": + for (const key of [...url.searchParams.keys()]) if (key !== "q") url.searchParams.delete(key) + return `${randomInstance}${url.pathname}${url.search}`.replace(/\/search\?q=.*/, searchQuery => + searchQuery.replace("?q=", "/") + ) + case "searx": + case "searxng": + for (const key of [...url.searchParams.keys()]) if (key !== "q") url.searchParams.delete(key) + return `${randomInstance}/${url.search}` + case "websurfx": + case "whoogle": + for (const key of [...url.searchParams.keys()]) if (key !== "q") url.searchParams.delete(key) + return `${randomInstance}/search${url.search}` + case "4get": { + const s = url.searchParams.get("q") + if (s !== null) return `${randomInstance}/web?s=${encodeURIComponent(s)}` + return randomInstance + } + case "librey": + for (const key in url.searchParams.keys()) if (key != "q") url.searchParams.delete(key) + return `${randomInstance}/search.php${url.search}` + case "yattee": + url.searchParams.delete("si") + return url.href.replace(/^https?:\/{2}/, "yattee://") + case "freetube": + url.searchParams.delete("si") + return "freetube://" + url.href + case "freetubePwa": + url.searchParams.delete("si") + return "freetube://" + url.href + case "poketube": { + url.searchParams.delete("si") + if (url.pathname.startsWith("/channel")) { + const reg = /\/channel\/(.*)\/?$/.exec(url.pathname) + if (reg) { + const id = reg[1] + return `${randomInstance}/channel?id=${id}${url.search}` + } + } + if (/\/@[a-z]+\//.exec(url.pathname)) return randomInstance + return `${randomInstance}${url.pathname}${url.search}` + } + case "small": + case "libMedium": + case "freedium": + case "scribe": { + const regex = url.hostname.match(/^(link|cdn-images-\d+|.*)\.medium\.com/) + if (regex && regex.length > 1) { + const subdomain = regex[1] + if (subdomain != "link" || !subdomain.startsWith("cdn-images")) { + return `${randomInstance}/@${subdomain}${url.pathname}${url.search}` + } + } + return `${randomInstance}${url.pathname}${url.search}` + } + case "translite": + case "simplyTranslate": + return `${randomInstance}/${url.search}` + case "send": + case "mozhi": + return randomInstance + case "libreTranslate": + return `${randomInstance}/${url.search.replace("sl", "source").replace("tl", "target").replace("text", "q")}` + case "osm": { + if (originUrl && originUrl.host === "earth.google.com") return randomInstance + + let prefs = { layers: "mapnik" } + + let mapCentre = "#" + const mapCentreData = utils.convertMapCentre(url) + if (mapCentreData.zoom && mapCentreData.lon && mapCentreData.lat) { + mapCentre = `#map=${mapCentreData.zoom}/${mapCentreData.lon}/${mapCentreData.lat}` + } + + if (url.pathname.includes("/embed")) { + // https://www.google.com/maps/embed/v1/place?key=AIzaSyD4iE2xVSpkLLOXoyqT-RuPwURN3ddScAI&q=Eiffel+Tower,Paris+France + const query = utils.getQuery(url) + let { coordinate, boundingbox } = utils.addressToLatLng(query) + prefs.bbox = boundingbox + prefs.marker = coordinate + return `${randomInstance}/export/embed.html?${utils.prefsEncoded(prefs)}` + } + + if (url.pathname.includes("/dir")) { + if (url.searchParams.has("travelmode")) { + const travelModes = { + driving: "fossgis_osrm_car", + walking: "fossgis_osrm_foot", + bicycling: "fossgis_osrm_bike", + transit: "fossgis_osrm_car", // not implemented on OSM, default to car. + } + prefs.engine = travelModes[url.searchParams.get("travelmode")] + } + const regex1 = /\/dir\/([^@/]+)\/([^@/]+)\/@-?\d[0-9.]*,-?\d[0-9.]*,\d{1,2}[.z]/.exec(url.pathname) + const regex2 = /\/dir\/([^@/]+)\//.exec(url.pathname) + if (regex1) { + // https://www.google.com/maps/dir/92+Rue+Moncey,+69003+Lyon,+France/M%C3%A9dip%C3%B4le+Lyon-Villeurbanne/@45.760254,4.8486298,13z?travelmode=bicycling + const origin = utils.addressToLatLng(decodeURIComponent(regex1[1])).coordinate ?? "" + const destination = utils.addressToLatLng(decodeURIComponent(regex1[2])).coordinate ?? "" + prefs.route = `${origin};${destination}` + } else if (regex2) { + // https://www.google.com/maps/dir/92+Rue+Moncey,+69003+Lyon,+France/@45.760254,4.8486298,13z?travelmode=bicycling + const origin = utils.addressToLatLng(decodeURIComponent(regex2[1])).coordinate ?? "" + prefs.route = `${origin};` + } else { + // https://www.google.com/maps/dir/?api=1&origin=Space+Needle+Seattle+WA&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling + const origin = utils.addressToLatLng(url.searchParams.get("origin")).coordinate ?? "" + const destination = utils.addressToLatLng(url.searchParams.get("destination")).coordinate ?? "" + prefs.route = `${origin};${destination}` + } + return `${randomInstance}/directions?${utils.prefsEncoded(prefs)}${mapCentre}` + } + + const placeRegex = /\/place\/(.*?)\// + if (url.pathname.match(placeRegex)) { + // https://www.google.com/maps/place/H%C3%B4tel+de+Londres+Eiffel/@40.9845265,28.7081268,14z + const query = url.pathname.match(placeRegex)[1] + return `${randomInstance}/search?query=${query}${mapCentre}` + } + + if (url.searchParams.has("ll")) { + // https://maps.google.com/?ll=38.882147,-76.99017 + const [mlat, mlon] = url.searchParams.get("ll").split(",") + return `${randomInstance}/search?query=${mlat}%2C${mlon}` + } + + if (url.searchParams.has("viewpoint")) { + // https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=48.857832,2.295226&heading=-45&pitch=38&fov=80 + const [mlat, mlon] = url.searchParams.get("viewpoint").split(",") + return `${randomInstance}/search?query=${mlat}%2C${mlon}` + } + + const query = utils.getQuery(url) + if (query) return `${randomInstance}/search?query="${query}${mapCentre}&${utils.prefsEncoded(prefs)}` + return `${randomInstance}/${mapCentre}&${utils.prefsEncoded(prefs)}` + } + case "breezeWiki": { + let wiki, + urlpath = "" + if (url.hostname.match(/^[a-zA-Z0-9-]+\.(?:fandom|wikia)\.com/)) { + wiki = url.hostname.match(/^[a-zA-Z0-9-]+(?=\.(?:fandom|wikia)\.com)/) + if (wiki == "www" || !wiki) wiki = "" + else wiki = `/${wiki}` + urlpath = url.pathname + } else { + wiki = url.pathname.match(/(?<=wiki\/w:c:)[a-zA-Z0-9-]+(?=:)/) + if (!wiki) wiki = "" + else { + wiki = "/" + wiki + "/wiki/" + urlpath = url.pathname.match(/(?<=wiki\/w:c:[a-zA-Z0-9-]+:).+/) + } + } + if (url.href.search(/Special:Search\?query/) > -1) { + return `${randomInstance}${wiki}${urlpath}${url.search}` + .replace(/Special:Search\?query/, "search?q") + .replace(/\/wiki/, "") + } + return `${randomInstance}${wiki}${urlpath}${url.search}` + } + case "rimgo": + if (url.href.search(/^https?:\/{2}(?:[im]\.)?stack\./) > -1) + return `${randomInstance}/stack${url.pathname}${url.search}` + return `${randomInstance}${url.pathname}${url.search}` + case "redlib": + case "libreddit": { + const subdomain = url.hostname.match(/^(?:((?:external-)?preview|i)\.)?redd\.it/) + if (!subdomain) return `${randomInstance}${url.pathname}${url.search}` + switch (subdomain[1]) { + case "preview": + return `${randomInstance}/preview/pre${url.pathname}${url.search}` + case "external-preview": + return `${randomInstance}/preview/external-pre${url.pathname}${url.search}` + case "i": + return `${randomInstance}/img${url.pathname}` + } + return `${randomInstance}/comments${url.pathname}` + } + case "teddit": + if (/^(?:(?:external-)?preview|i)\.redd\.it/.test(url.hostname)) { + if (url.search == "") return `${randomInstance}${url.pathname}?teddit_proxy=${url.hostname}` + else return `${randomInstance}${url.pathname}${url.search}&teddit_proxy=${url.hostname}` + } + return `${randomInstance}${url.pathname}${url.search}` + case "troddit": + case "eddrit": + if (/^(?:(?:external-)?preview|i)\.redd\.it/.test(url.hostname)) return randomInstance + return `${randomInstance}${url.pathname}${url.search}` + case "neuters": { + const p = url.pathname + if (p.startsWith("/article/") || p.startsWith("/pf/") || p.startsWith("/arc/") || p.startsWith("/resizer/")) { + return randomInstance + } + return `${randomInstance}${p}` + } + case "dumb": + if (url.pathname.endsWith("-lyrics")) return `${randomInstance}${url.pathname}` + return `${randomInstance}${url.pathname}${url.search}` + case "intellectual": + return `${randomInstance}${url.pathname}${url.search}` + case "ruralDictionary": + if (!url.pathname.includes("/define.php") && !url.pathname.includes("/random.php") && url.pathname != "/") + return randomInstance + return `${randomInstance}${url.pathname}${url.search}` + case "anonymousOverflow": { + if (url.hostname == "stackoverflow.com") { + const threadID = /^\/a\/(\d+)\/?/.exec(url.pathname) + if (threadID) return `${randomInstance}/questions/${threadID[1]}${url.search}` + return `${randomInstance}${url.pathname}${url.search}` + } + if (url.pathname == "/" || url.pathname == "") { + // https://stackexchange.com or https://superuser.com + return `${randomInstance}${url.pathname}${url.search}` + } + const regex = url.href.match(/https?:\/{2}(?:([a-zA-Z0-9-]+)\.(meta\.)?)?stackexchange\.com\//) + if (regex && regex.length > 1) { + if (regex[2]) { + return `${randomInstance}/exchange/${url.hostname}${url.pathname}${url.search}` + } + const subdomain = regex[1] + return `${randomInstance}/exchange/${subdomain}${url.pathname}${url.search}` + } + const notExchangeRegex = url.hostname.match( + /(?:[a-zA-Z]+\.)?(?:askubuntu\.com|mathoverflow\.net|serverfault\.com|stackapps\.com|superuser\.com|stackoverflow\.com)/ + ) + if (notExchangeRegex) { + return `${randomInstance}/exchange/${notExchangeRegex[0]}${url.pathname}${url.search}` + } + return `${randomInstance}${url.pathname}${url.search}` + } + case "biblioReads": + return `${randomInstance}${url.pathname}${url.search}` + case "wikimore": { + let hostSplit = url.host.split(".") + // wikiless doesn't have mobile view support yet + if (hostSplit[0] != "wikipedia" && hostSplit[0] != "www") { + const lang = url.hostname.split(".")[0] + return `${randomInstance}/wiki/${lang}${url.pathname}${url.search}${url.hash}` + } + return `${randomInstance}${url.pathname}${url.search}${url.hash}` + } + case "wikiless": { + let hostSplit = url.host.split(".") + // wikiless doesn't have mobile view support yet + if (hostSplit[0] != "wikipedia" && hostSplit[0] != "www") { + if (hostSplit[0] == "m") url.searchParams.append("mobileaction", "toggle_view_mobile") + else url.searchParams.append("lang", hostSplit[0]) + if (hostSplit[1] == "m") url.searchParams.append("mobileaction", "toggle_view_mobile") + } + return `${randomInstance}${url.pathname}${url.search}${url.hash}` + } + case "offtiktok": + case "proxiTok": + if (url.pathname.startsWith("/email")) return randomInstance + return `${randomInstance}${url.pathname}${url.search}` + case "waybackClassic": { + const regex = /^\/\web\/(?:[0-9]+)?\*\/(.*)/.exec(url.pathname) + if (regex) { + const link = regex[1] + return `${randomInstance}/cgi-bin/history.cgi?utf8=✓&q=${encodeURIComponent(link)}` + } + const regex2 = /(^\/\web\/([0-9]+)\/.*)/.exec(url.pathname) + if (regex2) { + let link = regex2[1] + link = link.replace(regex2[2], regex2[2] + "if_") + return `https://web.archive.org${link}` + } + return + } + case "gothub": + if (url.hostname == "gist.github.com") return `${randomInstance}/gist${url.pathname}${url.search}` + if (url.hostname == "raw.githubusercontent.com") return `${randomInstance}/raw${url.pathname}${url.search}` + return `${randomInstance}${url.pathname}${url.search}` + case "mikuInvidious": + if (url.hostname == "bilibili.com" || url.hostname == "www.bilibili.com" || url.hostname == "b23.tv") + return `${randomInstance}${url.pathname}${url.search}` + if (url.hostname == "space.bilibili.com") return `${randomInstance}/space${url.pathname}${url.search}` + case "tent": { + if (url.hostname == "bandcamp.com" && url.pathname == "/search") { + const query = url.searchParams.get("q") + return `${randomInstance}/search.php?query=${encodeURIComponent(query)}` + } + if (url.hostname.endsWith("bandcamp.com")) { + const regex = /^(.*)\.bandcamp\.com/.exec(url.hostname) + const artist = regex[1] + if (url.pathname == "/" || url.pathname == "/music") { + return `${randomInstance}/artist.php?name=${artist}` + } else { + const regex = /^\/(.*)\/(.*)/.exec(url.pathname) + if (regex) { + const type = regex[1] + const name = regex[2] + return `${randomInstance}/release.php?artist=${artist}&type=${type}&name=${name}` + } + } + } + if (url.hostname == "f4.bcbits.com") { + const regex = /\/img\/(.*)/.exec(url.pathname) + const image = regex[1] + return `${randomInstance}/image.php?file=${image}` + } + if (url.hostname == "t4.bcbits.com") { + const regex = /\/stream\/(.*)\/(.*)\/(.*)/.exec(url.pathname) + if (regex) { + const directory = regex[1] + const format = regex[2] + const file = regex[3] + const token = url.searchParams.get("token") + return `${randomInstance}/audio.php/?directory=${directory}&format=${format}&file=${file}&token=${encodeURIComponent(token)}` + } + } + } + case "binternet": + if (url.hostname == "i.pinimg.com") return `${randomInstance}/image_proxy.php?url=${encodeURIComponent(url.href)}` + return `${randomInstance}${url.pathname}${url.search}` + case "painterest": + if (url.hostname == "i.pinimg.com") return `${randomInstance}/_/proxy?url=${encodeURIComponent(url.href)}` + const regex = /^\/pin\/[^\/]+/.exec(url.pathname) + if (regex) return `${randomInstance}${regex[0]}` + return `${randomInstance}${url.pathname}${url.search}` + case "laboratory": { + let path = url.pathname + if (path == "/") path = "" + return `${randomInstance}/${url.hostname}${path}${url.search}` + } + case "quetre": { + const regex = /([a-z]+)\.quora\.com/.exec(url.hostname) + if (regex) { + const lang = regex[1] + url.searchParams.append("lang", lang) + return `${randomInstance}${url.pathname}${url.search}` + } + return `${randomInstance}${url.pathname}${url.search}` + } + case "pixivViewer": + case "liteXiv": + case "pixivFe": { + const regex = /\/[a-z]{1,3}\/(.*)/.exec(url.pathname) + if (regex) { + const path = regex[1] + return `${randomInstance}/${path}${url.search}` + } + return `${randomInstance}${url.pathname}${url.search}` + } + case "vixipy": { + const regex = /\/[a-z]{1,3}\/(.*)/.exec(url.pathname) + if (regex) { + let path = regex[1] + if (path.startsWith("tags/")) path = path.replace(/tags/, "tag") + return `${randomInstance}/${path}${url.search}` + } + return `${randomInstance}${url.pathname}${url.search}` + } + case "invidious": { + // tracker + url.searchParams.delete("si") + + if (type == "sub_frame") url.searchParams.append("autoplay", "0") + + if (url.hostname == "youtu.be" || (url.hostname.endsWith("youtube.com") && url.pathname.startsWith("/live"))) { + const watch = url.pathname.substring(url.pathname.lastIndexOf("/") + 1) + return `${randomInstance}/watch?v=${watch}&${url.search.substring(1)}` + } + if (url.hostname.endsWith("youtube.com") && url.pathname.startsWith("/redirect?")) return url.href + return `${randomInstance}${url.pathname}${url.search}` + } + case "freetubeMusic": { + if (url.hostname == "youtu.be" || (url.hostname.endsWith("youtube.com") && url.pathname.startsWith("/live"))) { + const watch = url.pathname.substring(url.pathname.lastIndexOf("/") + 1) + return `freetube://youtube.com/watch?v=${watch}` + } + return "freetube://" + url.href + } + case "invidiousMusic": { + if (url.hostname == "youtu.be" || (url.hostname.endsWith("youtube.com") && url.pathname.startsWith("/live"))) { + const watch = url.pathname.substring(url.pathname.lastIndexOf("/") + 1) + return `${randomInstance}/watch?v=${watch}` + } + return `${randomInstance}${url.pathname}${url.search}` + } + case "materialious": { + url.searchParams.delete("si") + if (url.hostname == "youtu.be" || (url.hostname.endsWith("youtube.com") && url.pathname.startsWith("/live"))) { + const watch = url.pathname.substring(url.pathname.lastIndexOf("/") + 1) + return `${randomInstance}/watch/${watch}${url.search.replace("?", "&")}` + } + if (url.hostname.endsWith("youtube.com")) { + if (url.pathname.startsWith("/watch")) { + if (url.searchParams.has("v")) { + const watch = url.searchParams.get("v") + url.searchParams.delete("v") + return `${randomInstance}/watch/${watch}${url.search.replace("?", "&")}` + } + return `${randomInstance}/watch/${url.search.replace("?", "&")}` + } + if (url.pathname.startsWith("/results")) { + if (url.searchParams.has("search_query")) { + const search = url.searchParams.get("search_query") + url.searchParams.delete("search_query") + return `${randomInstance}/search/${search}${url.search.replace("?", "&")}` + } + return `${randomInstance}/search/${url.search.replace("?", "&")}` + } + if (url.pathname.startsWith("/redirect?")) { + return url.href + } + } + return `${randomInstance}${url.pathname}${url.search}` + } + case "libremdb": { + if (/\/((?:name|title)\/\w+)\/?$/.exec(url.pathname)) { + return `${randomInstance}${url.pathname}${url.search}` + } + return randomInstance + } + case "tuboYoutube": + url.searchParams.delete("si") + if (url.pathname.startsWith("/channel")) return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}` + if (url.pathname.startsWith("/watch")) return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}` + return randomInstance + case "tuboSoundcloud": + if (url.pathname == "/") return `${randomInstance}?kiosk?serviceId=1` + if (url.pathname.match(/^\/[^\/]+(\/$|$)/)) return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}` + if (url.pathname.match(/^\/[^\/]+\/[^\/]+/)) return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}` + return randomInstance + case "twineo": + case "safetwitch": + if (url.hostname.startsWith("clips.")) return `${randomInstance}/clip${url.pathname}${url.search}` + return `${randomInstance}${url.pathname}${url.search}` + + case "tekstoLibre": + return `${randomInstance}/?${url.pathname.slice(1)}` + case "skyview": + if (url.pathname == "/") return randomInstance + return `${randomInstance}?url=${encodeURIComponent(url.href)}` + case "nitter": { + let search = new URLSearchParams(url.search) + + search.delete("ref_src") + search.delete("ref_url") + search.delete("s") // type of device that shared the link + search.delete("t") // some sort of tracking ID + + search = search.toString() + if (search !== "") search = `?${search}` + + if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video") { + try { + const [, id, format, extra] = search.match(/(.*)\?format=(.*)&(.*)/) + const query = encodeURIComponent(`${id}.${format}?${extra}`) + return `${randomInstance}/pic${url.pathname}${query}` + } catch { + return `${randomInstance}/pic${url.pathname}${search}` + } + } + if (url.pathname.split("/").includes("tweets")) + return `${randomInstance}${url.pathname.replace("/tweets", "")}${search}` + if (url.host == "t.co") return `${randomInstance}/t.co${url.pathname}` + return `${randomInstance}${url.pathname}${search}#m` + } + case "priviblur": { + if (url.hostname == "www.tumblr.com") return `${randomInstance}${url.pathname}${url.search}` + if (url.hostname.startsWith("assets")) return `${randomInstance}/tblr/assets${url.pathname}${url.search}` + if (url.hostname.startsWith("static")) return `${randomInstance}/tblr/static${url.pathname}${url.search}` + + const reg = /^([0-9]+)\.media\.tumblr\.com/.exec(url.hostname) // *.media.tumblr.com + if (reg) return `${randomInstance}/tblr/media/${reg[1]}${url.pathname}${url.search}` + + const blogregex = /^(?:www\.)?([a-z\d-]+)\.tumblr\.com/.exec(url.hostname) // <blog>.tumblr.com + if (blogregex) { + const blog_name = blogregex[1] + // Under the <blog>.tumblr.com domain posts are under a /post path + if (url.pathname.startsWith("/post")) + return `${randomInstance}/${blog_name}${url.pathname.slice(5)}${url.search}` + else return `${randomInstance}/${blog_name}${url.pathname}${url.search}` + } + return `${randomInstance}${url.pathname}${url.search}` + } + case "ultimateTab": + case "freetar": + if (url.pathname.startsWith("/search.php")) { + url.searchParams.set("search_term", url.searchParams.get("value")) + url.searchParams.delete("value") + url.searchParams.delete("search_type") + return `${randomInstance}/search${url.search}` + } + if (url.pathname.startsWith("/artist")) return + return `${randomInstance}${url.pathname}${url.search}` + case "ratAintTieba": + url.searchParams.delete("ie") + return `${randomInstance}${url.pathname}${url.search}` + case "shoelace": { + const reg = /^\/(?:(?:(?:[^\/])?\/post)|t)\/([^\/])/.exec(url.pathname) + if (reg) return `${randomInstance}/t/${reg[1]}${url.search}` + return `${randomInstance}${url.pathname}${url.search}` + } + case "skunkyArt": { + if (url.pathname.startsWith("/search")) return `${randomInstance}${url.pathname}${url.search}&type=all` + + const artReg = /^\/(.*?)\/art\/(.*)\/?/.exec(url.pathname) + if (artReg) return `${randomInstance}/post/${artReg[1]}/${artReg[2]}${url.search}` + + const userReg = /^\/([^\/]+)$/.exec(url.pathname) + if (userReg) return `${randomInstance}/group_user?q=${userReg[1]}&type=about` + + const galleryReg = /^\/(.*?)\/gallery(\/$|$)$/.exec(url.pathname) + if (galleryReg) return `${randomInstance}/group_user?q=${galleryReg[1]}&type=gallery` + + return `${randomInstance}${url.pathname}${url.search}` + } + case "ytify": { + if (url.pathname.startsWith("/watch")) + return `${randomInstance}/?s=${encodeURIComponent(url.searchParams.get("v"))}` + + const channelReg = /\/channel\/([^\/]+)/.exec(url.pathname) + if (channelReg) return `${randomInstance}/list?channel=${channelReg[1]}` + + if (url.pathname.startsWith("/playlist")) + return `${randomInstance}/list?playlists=${encodeURIComponent(url.searchParams.get("list"))}` + return `${randomInstance}${url.pathname}${url.search}` + } + case "koub": { + if (url.pathname.startsWith("/view/") || url.pathname.startsWith("/stories/")) { + return `${randomInstance}${url.pathname}${url.search}` + } + const accountReg = /^\/([^\/]+)\/?$/.exec(url.pathname) + if (accountReg) return `${randomInstance}/account${url.pathname}${url.search}` + return randomInstance + } + case "duckDuckGoAiChat": + return "https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=1" + + case "soundcloak": + if (url.pathname.startsWith("/feed") || url.pathname.startsWith("/stream")) { + // this feature requires authentication and is unsupported, so just redirect to main page + return randomInstance + } + + if (url.pathname.startsWith("/search")) { + if (!url.search) { + return randomInstance + } + + let type = "" + if (url.pathname.startsWith("/search/sounds")) { + type = "tracks" + } else if (url.pathname.startsWith("/search/people")) { + type = "users" + } else if (url.pathname.startsWith("/search/albums") || url.pathname.startsWith("/search/sets")) { + type = "playlists" + } + + if (type) { + type = "&type=" + type + } else { + return randomInstance // fallback for unsupported search types (searching for anything for example) + } + + return `${randomInstance}/search${url.search}${type}` + } + + if (url.host == "on.soundcloud.com") { + return `${randomInstance}/on${url.pathname}` + } + + return `${randomInstance}${url.pathname}${url.search}` + case "piped": + case "pipedMaterial": + case "cloudtube": + case "lightTube": + case "viewtube": + url.searchParams.delete("si") + default: + return `${randomInstance}${url.pathname}${url.search}` + } +} + +/** + * @param {URL} url + * @param {string} type + * @param {URL} originUrl + * @param {URL} documentUrl + * @param {boolean} incognito + * @param {boolean} forceRedirection + * @returns {string | undefined} + */ +function redirect(url, type, originUrl, documentUrl, incognito, forceRedirection) { + if (type != "main_frame" && type != "sub_frame" && type != "image") return + let randomInstance + let frontend + if (!forceRedirection && options.redirectOnlyInIncognito == true && !incognito) return + for (const service in config.services) { + if (!forceRedirection && !options[service].enabled) continue + if (!forceRedirection && options[service].redirectOnlyInIncognito == true && !incognito) continue + + frontend = options[service].frontend + + if ( + config.services[service].frontends[frontend].desktopApp && + type != "main_frame" && + options[service].redirectType != "main_frame" + ) + frontend = options[service].embedFrontend + + if (!regexArray(service, url, config, options, frontend)) { + frontend = null + continue + } + + if (type != "main_frame" && documentUrl && options[service].redirectType == "sub_frame") { + if (regexArray(service, documentUrl, config, options, frontend)) { + return + } + } + + if ( + config.services[service].embeddable && + type != options[service].redirectType && + options[service].redirectType != "both" + ) { + if (options[service].unsupportedUrls == "block") return "CANCEL" + return + } + + let instanceList = options[frontend] + if (instanceList === undefined) break // should not happen if settings are correct + + if (config.services[service].frontends[frontend].localhost && options[service].instance == "localhost") { + randomInstance = `http://${frontend}.localhost:8080` + } else if (instanceList.length === 0) { + return `https://no-instance.libredirect.invalid?frontend=${encodeURIComponent(frontend)}&url=${encodeURIComponent(url.href)}` + } else { + randomInstance = utils.getRandomInstance(instanceList) + } + + if (originUrl && instanceList.includes(originUrl.origin)) { + if (type == "main_frame") return "BYPASSTAB" + else return null + } + break + } + if (!frontend) return + + return rewrite(url, originUrl, frontend, randomInstance, type) +} + +/** + * @param {URL} url + * @param {string} type + * @param {URL} originUrl + * @param {URL} documentUrl + * @param {boolean} incognito + * @param {boolean} forceRedirection + * @returns {Promise<string | undefined>} + */ +async function redirectAsync(url, type, originUrl, documentUrl, incognito, forceRedirection) { + await init() + return redirect(url, type, originUrl, documentUrl, incognito, forceRedirection) +} + +/** + * @param {URL} url + */ +async function computeServiceFrontend(url) { + const config = await utils.getConfig() + const options = await utils.getOptions() + for (const service in config.services) { + if (regexArray(service, url, config, options)) { + return { service, frontend: null } + } else { + for (const frontend in config.services[service].frontends) { + const instances = all(service, frontend, options, config) + const i = instances.findIndex(instance => url.href.startsWith(instance)) + if (i >= 0) { + return { service, frontend } + } + } + } + } +} + +/** + * @param {URL} url + * @param {string} customService + */ +function switchInstance(url, customService) { + return new Promise(async resolve => { + let options = await utils.getOptions() + let config = await utils.getConfig() + + const protocolHost = utils.protocolHost(url) + if (customService) { + const instancesList = options[options[customService].frontend] + if (instancesList !== undefined) { + const newInstance = utils.getNextInstance(url.origin, instancesList) + if (newInstance) { + return resolve(`${newInstance}${url.pathname}${url.search}`) + } + } + } else { + for (const service in config.services) { + let instancesList = options[options[service].frontend] + if (instancesList === undefined) continue + const index = instancesList.findIndex(instance => url.href.startsWith(instance)) + if (index < 0) continue + instancesList.splice(index, 1) + if (instancesList.length === 0) return resolve() + const newInstance = utils.getNextInstance(url.origin, instancesList) + if (newInstance) { + return resolve(`${newInstance}${url.pathname}${url.search}`) + } + } + } + resolve() + }) +} + +/** + * @param {URL} url + */ +async function reverse(url) { + let options = await utils.getOptions() + let config = await utils.getConfig() + for (const service in config.services) { + let frontend = options[service].frontend + if (options[frontend] == undefined) continue + if ( + options[frontend].findIndex(instance => url.href.startsWith(instance)) < 0 && + !url.href.startsWith(`http://${frontend}.localhost:8080`) + ) + continue + switch (service) { + case "youtube": + case "imdb": + case "imgur": + case "tiktok": + case "reddit": + case "imdb": + case "snopes": + case "urbanDictionary": + case "quora": + case "twitter": + case "medium": + case "pinterest": + return `${config.services[service].url}${url.pathname}${url.search}` + case "fandom": { + let regex = url.pathname.match(/^\/([a-zA-Z0-9-]+)\/wiki\/(.*)/) + if (regex) return `https://${regex[1]}.fandom.com/wiki/${regex[2]}` + return + } + case "wikipedia": { + const lang = url.searchParams.get("lang") + if (lang != null) { + return `https://${lang}.wikipedia.org${url.pathname}${url.search}${url.hash}` + } + return `https://wikipedia.org${url.pathname}${url.search}${url.hash}` + } + case "stackOverflow": { + if (url.pathname.startsWith("/questions/")) { + return `https://stackoverflow.com${url.pathname}${url.search}` + } + if (url.pathname.startsWith("/exchange/")) { + const regex = /\/exchange\/(.*?)(\/.*)/.exec(url.pathname) + if (regex) { + if (regex[1].includes(".")) { + return `https://${regex[1]}${regex[2]}` + } else { + return `https://${regex[1]}.stackexchange.com${regex[2]}` + } + } + } + return + } + case "tekstowo": + return `${config.services[service].url}/${url.search.slice(1)}` + case "goodreads": + return `https://goodreads.com${url.pathname}${url.search}` + case "soundcloud": + if (frontend == "soundcloak") { + if (url.pathname.includes("/_/")) { + // soundcloak-specific pages + return `${config.services[service].url}${url.pathname.split("/_/")[0]}` + } + + if (url.pathname == "/search") { + let type = url.searchParams.get("type") + switch (type) { + case "playlists": + type = "sets" + break + case "tracks": + type = "sounds" + break + case "users": + type = "people" + break + default: + type = "" + } + + url.searchParams.delete("type") + if (!type) { + return `${config.services[service].url}/search?${url.searchParams.toString()}` + } else { + return `${config.services[service].url}/search/${type}?${url.searchParams.toString()}` + } + } + + return `${config.services[service].url}${url.pathname}` + } + default: + return + } + } + return +} + +const defaultInstances = { + materialious: ["https://app.materialio.us"], + viewtube: ["https://viewtube.io"], + piped: ["https://pipedapi-libre.kavin.rocks"], + pipedMaterial: ["https://piped-material.xn--17b.net"], + cloudtube: ["https://tube.cadence.moe"], + lightTube: ["https://tube.kuylar.dev"], + poketube: ["https://poketube.fun"], + proxiTok: ["https://proxitok.pabloferreiro.es"], + offtiktok: ["https://www.offtiktok.com"], + redlib: ["https://safereddit.com"], + eddrit: ["https://eddrit.com"], + troddit: ["https://www.troddit.com"], + scribe: ["https://scribe.rip"], + libMedium: ["https://md.vern.cc"], + small: ["https://small.bloat.cat"], + freedium: ["https://freedium.cfd"], + quetre: ["https://quetre.iket.me"], + libremdb: ["https://libremdb.iket.me"], + simplyTranslate: ["https://simplytranslate.org"], + translite: ["https://tl.bloat.cat"], + mozhi: ["https://mozhi.aryak.me"], + searxng: ["https://nyc1.sx.ggtyler.dev"], + "4get": ["https://4get.ca"], + websurfx: ["https://alamin655-spacex.hf.space"], + rimgo: ["https://rimgo.vern.cc"], + hyperpipe: ["https://hyperpipe.surge.sh"], + osm: ["https://www.openstreetmap.org"], + breezeWiki: ["https://breezewiki.com"], + neuters: ["https://neuters.de"], + dumb: ["https://dm.vern.cc"], + intellectual: ["https://intellectual.insprill.net"], + ruralDictionary: ["https://rd.vern.cc"], + anonymousOverflow: ["https://code.whatever.social"], + suds: ["https://sd.vern.cc"], + unfunny: ["https://uf.vern.cc"], + soprano: ["https://sp.vern.cc"], + meme: ["https://mm.vern.cc"], + waybackClassic: ["https://wayback-classic.net"], + tent: ["https://tent.sny.sh"], + laboratory: ["https://lab.vern.cc"], + binternet: ["https://bn.bloat.cat"], + painterest: ["https://pt.bloat.cat"], + pixivFe: ["https://pixiv.perennialte.ch"], + liteXiv: ["https://litexiv.465321.best", "https://litexiv.bloat.cat"], + pixivViewer: ["https://pixiv.pictures"], + vixipy: ["https://vx.maid.zone"], + indestructables: ["https://indestructables.private.coffee"], + destructables: ["https://ds.vern.cc"], + structables: ["https://structables.private.coffee"], + safetwitch: ["https://safetwitch.drgns.space"], + twineo: ["https://twineo.exozy.me"], + proxigram: ["https://ig.opnxng.com"], + tuboYoutube: ["https://tubo.media"], + tuboSoundcloud: ["https://tubo.media"], + tekstoLibre: ["https://davilarek.github.io/TekstoLibre"], + skyview: ["https://skyview.social"], + priviblur: ["https://pb.bloat.cat"], + nitter: ["https://nitter.privacydev.net"], + pasted: ["https://pasted.drakeerv.com"], + pasty: ["https://pasty.lus.pm"], + freetar: ["https://freetar.de"], + ultimateTab: ["https://ultimate-tab.com"], + ratAintTieba: ["https://rat.fis.land"], + shoelace: ["https://shoelace.mint.lgbt"], + skunkyArt: ["https://skunky.bloat.cat"], + ytify: ["https://ytify.pp.ua"], + nerdsForNerds: ["https://nn.vern.cc"], + ducksForDucks: ["https://ducksforducks.private.coffee"], + koub: ["https://koub.clovius.club"], + soundcloak: ["https://soundcloak.fly.dev"], + gocook: ["https://cook.adminforge.de"], + wikimore: ["https://wikimore.private.coffee"], + libreTranslate: ["https://libretranslate.com"], + cryptPad: ["https://cryptpad.org"] +} + +async function getDefaults() { + let config = await utils.getConfig() + let options = {} + for (const service in config.services) { + options[service] = {} + for (const defaultOption in config.services[service].options) { + options[service][defaultOption] = config.services[service].options[defaultOption] + } + for (const frontend in config.services[service].frontends) { + if (config.services[service].frontends[frontend].instanceList) { + options[frontend] = [] + } + } + } + options.exceptions = { + url: [], + regex: [], + } + options.theme = "detect" + options.popupServices = ["youtube", "tiktok", "imgur", "reddit", "quora", "translate", "maps"] + options.fetchInstances = "github" + options.redirectOnlyInIncognito = false + options = { ...options, ...defaultInstances } + return options +} + +function initDefaults() { + return new Promise(resolve => { + browser.storage.local.clear(async () => { + options = await getDefaults() + browser.storage.local.set({ options }, () => resolve()) + }) + }) +} + +function processUpdate(_options) { + return new Promise(async resolve => { + const config = await utils.getConfig() + let options = _options ?? (await utils.getOptions()) + + const defaults = await getDefaults() + + // Remove any unknown option or subOption + for (const optionName in options) { + if (!(optionName in defaults)) delete options[optionName] + else if (typeof optionName === "object" && optionName !== null) { + for (const subOptionName in options[optionName]) { + if (!(subOptionName in defaults[optionName])) delete options[optionName][subOptionName] + } + } + } + + // Remove any unknwon popupService + options.popupServices = options.popupServices.filter(service => service in config.services) + + // Add missing options + for (const [defaultName, defaultValue] of Object.entries(defaults)) { + if (!(defaultName in options)) { + options[defaultName] = defaultValue + } + } + + for (const [serviceName, serviceValue] of Object.entries(config.services)) { + // Reset service options if selected frontend is deprecated + if (!(options[serviceName].frontend in serviceValue.frontends)) { + options[serviceName] = serviceValue.options + } + + // Add a default service option if it's not present + for (const optionName in serviceValue.options) { + if (!(optionName in options[serviceName])) { + options[serviceName][optionName] = serviceValue.options[optionName] + } + } + } + + browser.storage.local.clear(() => browser.storage.local.set({ options }, () => resolve())) + }) +} + +/** + * @param {URL} url + */ +async function copyRaw(url) { + const newUrl = await reverse(url) + if (newUrl) { + if (!isChrome) { + navigator.clipboard.writeText(newUrl) + } else { + var copyFrom = document.createElement("textarea") + copyFrom.textContent = newUrl + document.body.appendChild(copyFrom) + copyFrom.select() + document.execCommand("copy") + copyFrom.blur() + document.body.removeChild(copyFrom) + } + } +} + +/** + * @param {URL} url + */ +function isException(url) { + if (!options) return false + if (!options.exceptions) return false + let exceptions = options.exceptions + if (exceptions && url) { + if (exceptions.url) { + for (let item of exceptions.url) { + item = new URL(item) + item = item.href.replace(/^http:\/\//, "https://") + if (item == url.href) { + return true + } + } + } + if (exceptions.regex) { + for (const item of exceptions.regex) { + if (new RegExp(item).test(url.href)) { + return true + } + } + } + } + return false +} + +export default { + redirect, + redirectAsync, + computeServiceFrontend, + reverse, + initDefaults, + processUpdate, + copyRaw, + switchInstance, + isException, +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/javascripts/utils.js b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/assets/javascripts/utils.js @@ -0,0 +1,297 @@ +window.browser = window.browser || window.chrome + +/** + * @param {Array.<T>} instances + * @returns {T} + */ +function getRandomInstance(instances) { + return instances[~~(instances.length * Math.random())] +} + +/** + * @param {string} currentInstanceUrl + * @param {Array.<T>} instances + * @returns {T} + */ +function getNextInstance(currentInstanceUrl, instances) { + const currentInstanceIndex = instances.indexOf(currentInstanceUrl) + if (currentInstanceIndex === -1) return getRandomInstance(instances) + const nextInstanceIndex = (currentInstanceIndex + 1) % instances.length + return instances[nextInstanceIndex] +} + +/** + * @param {URL} url + */ +function protocolHost(url) { + const pathname = url.pathname.replace(/\/$/, "") + + // workaround + if (pathname == "/TekstoLibre" && url.host.endsWith("github.io")) + return `${url.protocol}//${url.host}${pathname.slice(0, -1)}` + + if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}${pathname}` + + return `${url.protocol}//${url.host}${pathname}` +} + +/** + * @typedef FrontendInfo + * @prop {boolean} instanceList + * @prop {string} name + * @prop {string} url + */ + +/** + * @typedef {Object} Service + * @prop {Object.<string, FrontendInfo>} frontends + * @prop {Object} options + */ + +/** + * @typedef {Object} Config + * @prop {Object.<string, Service>} services + */ + +/** + * @returns {Promise<Config>} + */ +function getConfig() { + return new Promise(resolve => { + fetch("/config.json") + .then(response => response.text()) + .then(json => { + resolve(JSON.parse(json)) + return + }) + }) +} + +/** + * @typedef {Object} Option + * @prop {string} frontend + */ + +/** + * @returns {Promise<Object.<string, Option | string[]>>} + */ +function getOptions() { + return new Promise(resolve => browser.storage.local.get("options", r => resolve(r.options))) +} + +function getPingCache() { + return new Promise(resolve => browser.storage.local.get("pingCache", r => resolve(r.pingCache ?? {}))) +} + +function getBlacklist(options) { + return new Promise(resolve => { + let url + if (options.fetchInstances == "github") + url = "https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json" + else if (options.fetchInstances == "codeberg") + url = "https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json" + else return resolve("disabled") + const http = new XMLHttpRequest() + http.open("GET", url, true) + http.onreadystatechange = () => { + if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) resolve(JSON.parse(http.responseText)) + } + http.onerror = () => resolve() + http.ontimeout = () => resolve() + http.send(null) + }) +} + +function getList(options) { + return new Promise(resolve => { + let url + if (options.fetchInstances == "github") + url = "https://raw.githubusercontent.com/libredirect/instances/main/data.json" + else if (options.fetchInstances == "codeberg") + url = "https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json" + else return resolve("disabled") + const http = new XMLHttpRequest() + http.open("GET", url, true) + http.onreadystatechange = () => { + if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) return resolve(JSON.parse(http.responseText)) + } + http.onerror = () => resolve() + http.ontimeout = () => resolve() + http.send(null) + }) +} + +/** + * @param {string} href + */ +function pingOnce(href) { + return new Promise(async resolve => { + let started + let http = new XMLHttpRequest() + http.timeout = 5000 + http.ontimeout = () => resolve(5000) + http.onerror = () => resolve() + http.onreadystatechange = () => { + if (http.readyState == 2) { + if (http.status == 200) { + let ended = new Date().getTime() + http.abort() + resolve(ended - started) + } else { + resolve(5000 + http.status) + } + } + } + http.open("GET", `${href}?_=${new Date().getTime()}`, true) + started = new Date().getTime() + http.send(null) + }) +} + +/** + * @param {string} href + */ +function ping(href) { + return new Promise(async resolve => { + let average = 0 + let time + for (let i = 0; i < 3; i++) { + time = await pingOnce(href) + if (i == 0) continue + if (time >= 5000) { + resolve(time) + return + } + average += time + } + average = parseInt(average / 3) + resolve(average) + }) +} + +function addressToLatLng(address) { + const http = new XMLHttpRequest() + http.open( + "GET", + `https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(address)}&format=json&limit=1`, + false + ) + http.send() + if (http.status == 200) { + const json = JSON.parse(http.responseText)[0] + if (json) { + return { + coordinate: `${json.lat},${json.lon}`, + boundingbox: `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}`, + } + } + return {} + } +} + +function getQuery(url) { + let query = "" + if (url.searchParams.has("q")) query = url.searchParams.get("q") + else if (url.searchParams.has("query")) query = url.searchParams.has("query") + return query +} +function prefsEncoded(prefs) { + return new URLSearchParams(prefs).toString() +} + +function convertMapCentre(url) { + let [lat, lon, zoom] = [null, null, null] + const reg = url.pathname.match(/@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/) + if (reg) { + ;[, lon, lat, zoom] = reg + } else if (url.searchParams.has("center")) { + // Set map centre if present + ;[lat, lon] = url.searchParams.get("center").split(",") + zoom = url.searchParams.get("zoom") ?? "17" + } + return { zoom, lon, lat } +} + +export function randomInstances(clearnet, n) { + let instances = [] + if (n > clearnet.length) n = clearnet.length + for (let i = 0; i < n; i++) { + const randomNumber = Math.floor(Math.random() * clearnet.length) + const randomInstance = clearnet[randomNumber] + instances.push(randomInstance) + } + return instances +} + +async function autoPickInstance(clearnet, url) { + if (url) { + const i = clearnet.findIndex(instance => url.href.startsWith(instance)) + if (i >= 0) clearnet.splice(i, 1) + } + const random = randomInstances(clearnet, 5) + const pings = await Promise.all([ + ...random.map(async instance => { + return [instance, await ping(instance)] + }), + ]) + pings.sort((a, b) => a[1] - b[1]) + return pings[0][0] +} + +export function style(options, window) { + const vars = cssVariables(options, window) + return `--text: ${vars.text}; + --bg-main: ${vars.bgMain}; + --bg-secondary: ${vars.bgSecondary}; + --active: ${vars.active}; + --danger: ${vars.danger}; + --light-grey: ${vars.lightGrey};` +} + +function cssVariables(options, window) { + const dark = { + text: "#fff", + bgMain: "#121212", + bgSecondary: "#202020", + active: "#fbc117", + danger: "#f04141", + lightGrey: "#c3c3c3", + } + + const light = { + text: "black", + bgMain: "white", + bgSecondary: "#e4e4e4", + active: "#fb9817", + danger: "#f04141", + lightGrey: "#c3c3c3", + } + if (options.theme == "dark") { + return dark + } else if (options.theme == "light") { + return light + } else if (window.matchMedia("(prefers-color-scheme: dark)").matches) { + return dark + } else { + return light + } +} + +export default { + getRandomInstance, + getNextInstance, + protocolHost, + getList, + getBlacklist, + getConfig, + getOptions, + getPingCache, + ping, + addressToLatLng, + getQuery, + prefsEncoded, + convertMapCentre, + randomInstances, + style, + autoPickInstance, +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/config.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/config.json @@ -0,0 +1,1498 @@ +{ + "networks": { + "clearnet": { + "tld": "org", + "name": "Clearnet" + }, + "tor": { + "tld": "onion", + "name": "Tor" + }, + "i2p": { + "tld": "i2p", + "name": "I2P" + }, + "loki": { + "tld": "loki", + "name": "Lokinet" + } + }, + "services": { + "youtube": { + "frontends": { + "invidious": { + "name": "Invidious", + "embeddable": true, + "instanceList": true, + "url": "https://invidious.io/" + }, + "materialious": { + "name": "Materialious", + "embeddable": true, + "instanceList": true, + "url": "https://materialio.us/" + }, + "piped": { + "excludeTargets": [ + 2, + 3 + ], + "name": "Piped", + "embeddable": true, + "instanceList": true, + "url": "https://github.com/TeamPiped/Piped" + }, + "pipedMaterial": { + "excludeTargets": [ + 2, + 3 + ], + "name": "Piped-Material", + "embeddable": false, + "instanceList": true, + "url": "https://github.com/mmjee/Piped-Material" + }, + "poketube": { + "excludeTargets": [ + 2, + 3 + ], + "name": "Poke", + "embeddable": true, + "instanceList": true, + "url": "https://codeberg.org/ashley/poke" + }, + "cloudtube": { + "name": "CloudTube", + "embeddable": false, + "instanceList": true, + "url": "https://sr.ht/~cadence/tube", + "excludeTargets": [ + 2, + 3 + ] + }, + "lightTube": { + "name": "LightTube", + "embeddable": false, + "instanceList": true, + "url": "https://github.com/lighttube-org/LightTube" + }, + "tuboYoutube": { + "name": "Tubo", + "embeddable": false, + "instanceList": true, + "url": "https://github.com/migalmoreno/tubo", + "excludeTargets": [ + 2, + 3 + ] + }, + "freetube": { + "excludeTargets": [ + 2, + 3 + ], + "name": "FreeTube", + "embeddable": false, + "desktopApp": true, + "instanceList": false, + "url": "https://github.com/FreeTubeApp/FreeTube" + }, + "yattee": { + "excludeTargets": [ + 2, + 3 + ], + "name": "Yattee", + "embeddable": false, + "desktopApp": true, + "instanceList": false, + "url": "https://github.com/yattee/yattee" + }, + "freetubePwa": { + "excludeTargets": [ + 2, + 3 + ], + "name": "FreeTube PWA", + "embeddable": false, + "instanceList": false, + "url": "https://github.com/MarmadileManteater/FreeTubeCordova" + }, + "viewtube": { + "name": "ViewTube", + "embeddable": true, + "instanceList": true, + "url": "https://github.com/ViewTube/viewtube" + }, + "ytify": { + "name": "ytify", + "embeddable": false, + "instanceList": true, + "url": "https://github.com/n-ce/ytify/" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.|m\\.)?youtube.com(\\/|$)(?!iframe_api\\/|redirect\\/)", + "^https?:\\/{2}img\\.youtube.com\\/vi\\/.*\\/..*", + "^https?:\\/{2}(i|s)\\.ytimg.com\\/vi\\/.*\\/..*", + "^https?:\\/{2}(www\\.)?youtube.com\\/watch?v=..*", + "^https?:\\/{2}(www\\.)?youtu\\.be\\/..*", + "^https?:\\/{2}(www\\.)?(youtube|youtube-nocookie)\\.com\\/embed\\/..*" + ], + "name": "YouTube", + "options": { + "enabled": true, + "redirectType": "main_frame", + "frontend": "invidious", + "embedFrontend": "invidious", + "unsupportedUrls": "bypass", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "embeddable": true, + "url": "https://youtube.com" + }, + "youtubeMusic": { + "frontends": { + "hyperpipe": { + "name": "Hyperpipe", + "instanceList": true, + "url": "https://codeberg.org/Hyperpipe/Hyperpipe" + }, + "invidiousMusic": { + "name": "Invidious", + "embeddable": true, + "instanceList": true, + "url": "https://invidious.io/" + }, + "freetubeMusic": { + "name": "FreeTube", + "embeddable": false, + "desktopApp": true, + "instanceList": false, + "url": "https://github.com/FreeTubeApp/FreeTube" + } + }, + "targets": [ + "^https?:\\/{2}music\\.youtube\\.com\\/" + ], + "name": "YT Music", + "options": { + "enabled": false, + "frontend": "hyperpipe", + "unsupportedUrls": "bypass", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://music.youtube.com" + }, + "twitter": { + "frontends": { + "nitter": { + "name": "Nitter", + "embeddable": true, + "instanceList": true, + "url": "https://github.com/zedeus/nitter", + "localhost": true + } + }, + "targets": [ + "^https?:\\/{2}(www\\.|mobile\\.)?twitter\\.com\\/", + "^https?:\\/{2}(www\\.|mobile\\.)?x\\.com\\/", + "^https?:\\/{2}(pbs\\.|video\\.)twimg\\.com\\/", + "^https?:\\/{2}platform\\.x\\.com/embed\\/", + "^https?:\\/{2}platform\\.twitter\\.com/embed\\/", + "^https?:\\/{2}t\\.co\\/" + ], + "name": "Twitter", + "options": { + "enabled": false, + "redirectType": "main_frame", + "unsupportedUrls": "bypass", + "frontend": "nitter", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "embeddable": true, + "url": "https://twitter.com" + }, + "chatGpt": { + "frontends": { + "duckDuckGoAiChat": { + "name": "DuckDuckGo AI Chat", + "instanceList": false, + "url": "https://duckduckgo.com/duckduckgo-help-pages/aichat/" + } + }, + "targets": ["^https?:\\/{2}chatgpt\\.com"], + "name": "ChatGPT", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "duckDuckGoAiChat", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://chatgpt.com/" + }, + "bluesky": { + "frontends": { + "skyview": { + "name": "Skyview", + "instanceList": true, + "url": "https://github.com/badlogic/skyview" + } + }, + "targets": [ + "^https?:\\/{2}bsky\\.app\\/" + ], + "name": "Bluesky", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "skyview", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://bsky.app/" + }, + "reddit": { + "frontends": { + "libreddit": { + "name": "Libreddit", + "instanceList": true, + "url": "https://github.com/spikecodes/libreddit", + "localhost": true + }, + "redlib": { + "name": "Redlib", + "instanceList": true, + "url": "https://github.com/redlib-org/redlib", + "localhost": false + }, + "teddit": { + "name": "Teddit", + "instanceList": true, + "url": "https://codeberg.org/teddit/teddit", + "localhost": false + }, + "eddrit": { + "name": "Eddrit", + "instanceList": true, + "url": "https://github.com/corenting/eddrit", + "localhost": false + }, + "troddit": { + "name": "Troddit", + "instanceList": false, + "url": "https://github.com/burhan-syed/troddit", + "localhost": false + } + }, + "targets": [ + "^https?:\\/{2}(www\\.|old\\.|np\\.|new\\.|amp\\.)?(reddit|reddittorjg6rue252oqsxryoxengawnmo46qy4kyii5wtqnwfj4ooad)\\.(com|onion)(?=\\/u(ser)?\\/|\\/r\\/|\\/search|\\/new|\\/comments|\\/?$)", + "^https?:\\/{2}((i|(external-)?preview)\\.)?redd\\.it" + ], + "name": "Reddit", + "options": { + "enabled": false, + "frontend": "redlib", + "unsupportedUrls": "bypass", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://reddit.com" + }, + "tumblr": { + "frontends": { + "priviblur": { + "name": "Priviblur", + "embeddable": true, + "instanceList": true, + "url": "https://github.com/syeopite/priviblur", + "localhost": true + } + }, + "targets": [ + "^https?:\\/{2}(media\\.|assets\\.|static\\.)?tumblr\\.com\\/", + "^https?:\\/{2}[0-9]+\\.media\\.tumblr\\.com\\/", + "^https?:\\/{2}(www\\.)?(.*)\\.tumblr.com\\/" + ], + "name": "Tumblr", + "options": { + "enabled": false, + "redirectType": "main_frame", + "unsupportedUrls": "bypass", + "frontend": "priviblur", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "embeddable": true, + "url": "https://tumblr.com" + }, + "twitch": { + "frontends": { + "safetwitch": { + "name": "SafeTwitch", + "embeddable": true, + "instanceList": true, + "url": "https://codeberg.org/dragongoose/safetwitch", + "localhost": false + }, + "twineo": { + "name": "Twineo", + "embeddable": true, + "instanceList": true, + "url": "https://codeberg.org/CloudyyUw/twineo", + "localhost": false + } + }, + "targets": [ + "^https?:\\/{2}(www\\.|clips\\.)?twitch\\.(tv|com)\\/" + ], + "name": "Twitch", + "options": { + "enabled": false, + "redirectType": "main_frame", + "unsupportedUrls": "bypass", + "frontend": "safetwitch", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "embeddable": true, + "url": "https://twitch.tv" + }, + "tiktok": { + "frontends": { + "proxiTok": { + "name": "ProxiTok", + "instanceList": true, + "url": "https://github.com/pablouser1/ProxiTok", + "localhost": true + }, + "offtiktok": { + "name": "Offtiktok", + "instanceList": true, + "url": "https://github.com/MarsHeer/offtiktok", + "localhost": false + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?tiktok\\.com\\/" + ], + "name": "TikTok", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "proxiTok", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://tiktok.com" + }, + "instagram": { + "frontends": { + "proxigram": { + "name": "Proxigram", + "instanceList": true, + "url": "https://codeberg.org/ThePenguinDev/Proxigram", + "localhost": false + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?instagram\\.com" + ], + "name": "Instagram", + "options": { + "enabled": false, + "frontend": "proxigram", + "unsupportedUrls": "bypass", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.instagram.com" + }, + "imdb": { + "frontends": { + "libremdb": { + "name": "libremdb", + "instanceList": true, + "url": "https://github.com/zyachel/libremdb", + "localhost": true + } + }, + "targets": [ + "^https?:\\/{2}(www\\.|m\\.)?imdb\\.com" + ], + "name": "IMDb", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "libremdb", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://imdb.com" + }, + "bilibili": { + "frontends": { + "mikuInvidious": { + "name": "MikuInvidious", + "instanceList": true, + "url": "https://0xacab.org/johnxina/mikuinvidious" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.|space\\.)?bilibili\\.com\\/", + "^https?:\\/{2}b23\\.tv\\/" + ], + "name": "Bilibili", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "mikuInvidious", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://bilibili.com/" + }, + "pixiv": { + "name": "Pixiv", + "frontends": { + "pixivFe": { + "name": "PixivFE", + "instanceList": true, + "url": "https://codeberg.org/VnPower/pixivfe" + }, + "liteXiv": { + "name": "LiteXiv", + "instanceList": true, + "url": "https://codeberg.org/LiteXiv/LiteXiv" + }, + "vixipy": { + "name": "Vixipy", + "instanceList": true, + "url": "https://codeberg.org/vixipy/Vixipy" + }, + "pixivViewer": { + "name": "Pixiv Viewer", + "instanceList": true, + "url": "https://github.com/asadahimeka/pixiv-viewer" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?pixiv\\.net\\/" + ], + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "pixivFe", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.pixiv.net" + }, + "fandom": { + "frontends": { + "breezeWiki": { + "name": "BreezeWiki", + "instanceList": true, + "url": "https://breezewiki.com" + } + }, + "targets": [ + "^https?:\\/{2}([a-zA-Z0-9-]+\\.)?(fandom|wikia)\\.com(?=\\/wiki|\\/?$)" + ], + "name": "Fandom", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "instance": "public", + "frontend": "breezeWiki", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://fandom.com" + }, + "imgur": { + "frontends": { + "rimgo": { + "name": "rimgo", + "instanceList": true, + "url": "https://codeberg.org/video-prize-ranch/rimgo", + "localhost": true, + "embeddable": true + } + }, + "targets": [ + "^https?:\\/{2}([im]\\.)?(stack\\.)?imgur\\.(com|io)\\/" + ], + "name": "Imgur", + "options": { + "enabled": false, + "redirectType": "main_frame", + "unsupportedUrls": "bypass", + "frontend": "rimgo", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "embeddable": true, + "url": "https://imgur.com" + }, + "pinterest": { + "name": "Pinterest", + "frontends": { + "binternet": { + "name": "Binternet", + "instanceList": true, + "url": "https://github.com/Ahwxorg/Binternet", + "embeddable": true + }, + "painterest": { + "name": "Painterest", + "instanceList": true, + "url": "https://codeberg.org/thirtysix/painterest", + "embeddable": true + } + }, + "targets": [ + "^https?:\\/{2}i\\.pinimg\\.com", + "^https?:\\/{2}((?!api\\.)[a-zA-Z]+\\.)?pinterest\\.com" + ], + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "redirectType": "main_frame", + "frontend": "binternet", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "embeddable": true, + "url": "https://pinterest.com" + }, + "soundcloud": { + "frontends": { + "tuboSoundcloud": { + "name": "Tubo", + "embeddable": false, + "instanceList": true, + "url": "https://github.com/migalmoreno/tubo" + }, + "soundcloak": { + "name": "soundcloak", + "embeddable": false, + "instanceList": true, + "url": "https://git.maid.zone/stuff/soundcloak" + } + }, + "targets": [ + "^https?:\\/{2}soundcloud\\.com" + ], + "name": "SoundCloud", + "options": { + "enabled": false, + "redirectType": "main_frame", + "frontend": "tuboSoundcloud", + "unsupportedUrls": "bypass", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "embeddable": false, + "url": "https://soundcloud.com" + }, + "bandcamp": { + "frontends": { + "tent": { + "name": "Tent", + "instanceList": true, + "url": "https://forgejo.sny.sh/sun/Tent" + } + }, + "targets": [ + "^https?:\\/{2}(.*\\.)?bandcamp\\.com\\/", + "^https?:\\/{2}(f4|t4)\\.bcbits\\.com\\/" + ], + "name": "Bandcamp", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "tent", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://bandcamp.com" + }, + "tekstowo": { + "frontends": { + "tekstoLibre": { + "name": "TekstoLibre", + "instanceList": true, + "url": "https://github.com/Davilarek/TekstoLibre" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?tekstowo\\.pl\\/" + ], + "name": "Tekstowo.pl", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "tekstoLibre", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.tekstowo.pl" + }, + "genius": { + "frontends": { + "dumb": { + "name": "Dumb", + "instanceList": true, + "url": "https://github.com/rramiachraf/dumb", + "localhost": true + }, + "intellectual": { + "name": "Intellectual", + "instanceList": true, + "url": "https://github.com/Insprill/intellectual", + "localhost": false + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?genius\\.com\\/" + ], + "name": "Genius", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "dumb", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://genius.com" + }, + "medium": { + "frontends": { + "scribe": { + "name": "Scribe", + "instanceList": true, + "url": "https://sr.ht/~edwardloveall/Scribe" + }, + "libMedium": { + "name": "LibMedium", + "instanceList": true, + "url": "https://github.com/realaravinth/libmedium" + }, + "small": { + "name": "Small", + "instanceList": true, + "url": "https://git.private.coffee/PrivateCoffee/small" + }, + "freedium": { + "name": "Freedium", + "instanceList": true, + "url": "https://codeberg.org/Freedium-cfd" + } + }, + "targets": [ + "^https:\\/{2}([a-zA-Z0-9-]+\\.)?medium\\.com", + "^https?:\\/{2}towardsdatascience\\.com\\/", + "^https?:\\/{2}uxdesign\\.cc\\/", + "^https?:\\/{2}uxplanet\\.org\\/", + "^https?:\\/{2}betterprogramming\\.pub\\/", + "^https?:\\/{2}aninjusticemag\\.com\\/", + "^https?:\\/{2}betterhumans\\.pub\\/", + "^https?:\\/{2}psiloveyou\\.xyz\\/", + "^https?:\\/{2}entrepreneurshandbook\\.co\\/", + "^https?:\\/{2}blog\\.coinbase\\.com\\/", + "^https?:\\/{2}levelup\\.gitconnected\\.com\\/", + "^https?:\\/{2}javascript\\.plainenglish\\.io\\/", + "^https?:\\/{2}blog\\.bitsrc\\.io\\/", + "^https?:\\/{2}itnext\\.io\\/", + "^https?:\\/{2}codeburst\\.io\\/", + "^https?:\\/{2}infosecwriteups\\.com\\/", + "^https?:\\/{2}blog\\.devgenius\\.io\\/", + "^https?:\\/{2}writingcooperative\\.com\\/", + "^https?:\\/{2}proandroiddev\\.com\\/" + ], + "name": "Medium", + "options": { + "frontend": "scribe", + "enabled": false, + "unsupportedUrls": "bypass", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://medium.com" + }, + "quora": { + "frontends": { + "quetre": { + "name": "Quetre", + "instanceList": true, + "url": "https://github.com/zyachel/quetre", + "localhost": true + } + }, + "targets": [ + "^https?:\\/{2}([a-zA-Z0-9-]+\\.)*quora\\.com\\/" + ], + "name": "Quora", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "quetre", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://quora.com" + }, + "github": { + "frontends": { + "gothub": { + "name": "Gothub", + "instanceList": true, + "url": "https://codeberg.org/gothub/gothub" + } + }, + "targets": [ + "^https?:\\/{2}github\\.com\\/", + "^https?:\\/{2}gist\\.github\\.com\\/[^\\/]+\\/[^\\/]+\\/?", + "^https?:\\/{2}raw\\.githubusercontent\\.com\\/[^\\/]+\\/[^\\/]+\\/?" + ], + "name": "GitHub", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "gothub", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://github.com" + }, + "gitlab": { + "frontends": { + "laboratory": { + "name": "Laboratory", + "instanceList": true, + "url": "https://git.vitali64.duckdns.org/utils/laboratory.git/about/" + } + }, + "targets": [ + "^https?:\\/{2}gitlab\\.com\\/", + "^https?:\\/{2}gitlab\\.freedesktop\\.com\\/", + "^https?:\\/{2}gitlab\\.archlinux\\.com\\/" + ], + "name": "GitLab", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "laboratory", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://gitlab.com/" + }, + "stackOverflow": { + "frontends": { + "anonymousOverflow": { + "name": "AnonymousOverflow", + "instanceList": true, + "url": "https://github.com/httpjamesm/AnonymousOverflow", + "localhost": true + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?([a-zA-Z]+\\.)?stackoverflow\\.com\\/", + "^https?:\\/{2}((?!(api|data|blog)\\.)[a-zA-Z0-9-]+\\.(meta\\.)?)?stackexchange\\.com\\/", + "^https?:\\/{2}(www\\.)?([a-zA-Z]+\\.)?(askubuntu\\.com|mathoverflow\\.net|serverfault\\.com|stackapps\\.com|superuser\\.com)\\/" + ], + "name": "Stack Overflow", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "anonymousOverflow", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://stackoverflow.com/" + }, + "reuters": { + "frontends": { + "neuters": { + "name": "Neuters", + "instanceList": true, + "url": "https://github.com/HookedBehemoth/neuters" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?reuters\\.com\\/" + ], + "name": "Reuters", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "neuters", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://reuters.com" + }, + "snopes": { + "frontends": { + "suds": { + "name": "Suds", + "instanceList": true, + "url": "https://git.vern.cc/cobra/Suds" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?snopes\\.com\\/" + ], + "name": "Snopes", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "suds", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.snopes.com" + }, + "ifunny": { + "frontends": { + "unfunny": { + "name": "UNfunny", + "instanceList": true, + "url": "https://git.vern.cc/cobra/UNfunny" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?ifunny\\.co\\/" + ], + "name": "iFunny", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "unfunny", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://ifunny.co" + }, + "tenor": { + "frontends": { + "soprano": { + "name": "Soprano", + "instanceList": true, + "url": "https://git.vern.cc/cobra/Soprano" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?tenor\\.com\\/" + ], + "name": "Tenor", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "soprano", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://tenor.com" + }, + "knowyourmeme": { + "frontends": { + "meme": { + "name": "MeMe", + "instanceList": true, + "url": "https://git.vern.cc/cobra/MeMe" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?knowyourmeme\\.com\\/" + ], + "name": "KnowYourMeme", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "meme", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://knowyourmeme.com" + }, + "urbanDictionary": { + "frontends": { + "ruralDictionary": { + "name": "Rural Dictionary", + "instanceList": true, + "url": "https://codeberg.org/cobra/rural-dict" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?urbandictionary\\.com\\/" + ], + "name": "Urban Dictionary", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "ruralDictionary", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://urbandictionary.com" + }, + "goodreads": { + "frontends": { + "biblioReads": { + "name": "BiblioReads", + "instanceList": true, + "url": "https://github.com/nesaku/BiblioReads", + "localhost": true + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?goodreads\\.com\\/" + ], + "name": "Goodreads", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "biblioReads", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://goodreads.com/" + }, + "wolframAlpha": { + "frontends": { + "wolfreeAlpha": { + "name": "WolfreeAlpha", + "instanceList": true, + "url": "https://git.disroot.org/wolfree" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?wolframalpha\\.com\\/" + ], + "name": "Wolfram Alpha", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "wolfreeAlpha", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.wolframalpha.com" + }, + "instructables": { + "name": "Instructables", + "frontends": { + "structables": { + "name": "Structables", + "instanceList": true, + "url": "https://github.com/PrivateCoffee/structables" + }, + "destructables": { + "name": "Destructables", + "instanceList": true, + "url": "https://git.vern.cc/cobra/Destructables" + }, + "indestructables": { + "name": "Indestructables", + "instanceList": true, + "url": "https://indestructables.codeberg.page" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?instructables\\.com\\/" + ], + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "structables", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.instructables.com" + }, + "wikipedia": { + "frontends": { + "wikiless": { + "name": "Wikiless", + "instanceList": true, + "url": "https://wikiless.org" + }, + "wikimore": { + "name": "Wikimore", + "instanceList": true, + "url": "https://git.private.coffee/privatecoffee/wikimore" + } + }, + "targets": [ + "^https?:\\/{2}([a-z]+\\.)*wikipedia\\.org\\/?" + ], + "name": "Wikipedia", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "wikiless", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://wikipedia.org" + }, + "waybackMachine": { + "frontends": { + "waybackClassic": { + "name": "Wayback Classic", + "instanceList": true, + "url": "https://github.com/ticky/wayback-classic" + } + }, + "targets": [ + "^https?:\\/{2}web\\.archive\\.org\\/" + ], + "name": "Wayback Machine", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "waybackClassic", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://web.archive.org" + }, + "pastebin": { + "frontends": { + "pasted": { + "name": "Pasted", + "instanceList": true, + "url": "https://github.com/Dragynfruit/pasted" + } + }, + "targets": [ + "^https?:\\/{2}pastebin\\.com\\/" + ], + "name": "Pastebin", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "pasted", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "embeddable": true, + "url": "https://pastebin.com" + }, + "search": { + "frontends": { + "searxng": { + "name": "SearXNG", + "instanceList": true, + "url": "https://github.com/searxng/searxng", + "localhost": true, + "excludeTargets": [ + 2, + 3 + ] + }, + "searx": { + "name": "SearX", + "instanceList": true, + "url": "https://searx.github.io/searx/", + "excludeTargets": [ + 2, + 3 + ] + }, + "whoogle": { + "name": "Whoogle", + "instanceList": true, + "url": "https://benbusby.com/projects/whoogle-search/", + "excludeTargets": [ + 2, + 3 + ] + }, + "librey": { + "name": "LibreY", + "instanceList": true, + "url": "https://github.com/Ahwxorg/librey/", + "excludeTargets": [ + 2, + 3 + ] + }, + "4get": { + "name": "4get", + "instanceList": true, + "url": "https://git.lolcat.ca/lolcat/4get", + "excludeTargets": [ + 2, + 3 + ] + }, + "websurfx": { + "name": "Websurfx", + "instanceList": true, + "url": "https://github.com/neon-mmd/websurfx", + "excludeTargets": [ + 2, + 3 + ] + } + }, + "targets": [ + "^https?:\\/{2}search\\.libredirect\\.invalid", + "^https?:\\/{2}libredirect\\.github\\.io\\/\\?q", + "^https?:\\/{2}(www\\.)?google\\.com", + "^https?:\\/{2}(www\\.)?bing\\.com" + ], + "name": "Search", + "options": { + "enabled": false, + "frontend": "searxng", + "unsupportedUrls": "bypass", + "redirectGoogle": false, + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://search.libredirect.invalid" + }, + "translate": { + "frontends": { + "simplyTranslate": { + "name": "SimplyTranslate", + "instanceList": true, + "url": "https://codeberg.org/ManeraKai/simplytranslate", + "localhost": true + }, + "mozhi": { + "name": "Mozhi", + "instanceList": true, + "url": "https://codeberg.org/aryak/mozhi", + "localhost": false, + "imageType": "svg" + }, + "libreTranslate": { + "name": "LibreTranslate", + "instanceList": true, + "url": "https://github.com/LibreTranslate/LibreTranslate" + }, + "translite": { + "name": "Translite", + "instanceList": true, + "url": "https://codeberg.org/gospodin/translite" + } + }, + "targets": [ + "^https?:\\/{2}translate\\.google(\\.[a-z]{2,3}){1,2}\\/", + "^https?:\\/{2}translate\\.libredirect\\.invalid" + ], + "name": "Translate", + "options": { + "enabled": false, + "frontend": "simplyTranslate", + "unsupportedUrls": "bypass", + "instance": "public", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://translate.libredirect.invalid" + }, + "maps": { + "frontends": { + "osm": { + "name": "OpenStreetMap", + "instanceList": true, + "embeddable": true, + "url": "https://www.openstreetmap.org/" + } + }, + "targets": [ + "^https?:\\/{2}maps\\.libredirect\\.invalid", + "^https?:\\/{2}(www\\.)?maps\\.google(\\.[a-z]{2,3}){1,2}\\/", + "^https?:\\/{2}(www\\.)?google(\\.[a-z]{2,3}){1,2}\\/maps\\/?" + ], + "name": "Maps", + "options": { + "redirectType": "main_frame", + "enabled": false, + "frontend": "osm", + "unsupportedUrls": "bypass", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://maps.libredirect.invalid" + }, + "meet": { + "name": "Meet", + "frontends": { + "jitsi": { + "name": "Jitsi", + "instanceList": true, + "url": "https://jitsi.org" + } + }, + "targets": [ + "^https?:\\/{2}meet\\.libredirect\\.invalid\\/" + ], + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "jitsi", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://meet.libredirect.invalid" + }, + "sendFiles": { + "frontends": { + "send": { + "name": "Send", + "instanceList": true, + "url": "https://gitlab.com/timvisee/send" + } + }, + "targets": [ + "^https?:\\/{2}send\\.libredirect\\.invalid", + "^https?:\\/{2}send\\.firefox\\.com\\/?$", + "^https?:\\/{2}sendfiles\\.online\\/?$" + ], + "name": "Send Files", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "send", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://send.libredirect.invalid" + }, + "textStorage": { + "frontends": { + "privateBin": { + "name": "PrivateBin", + "instanceList": true, + "url": "https://privatebin.info" + }, + "pasted": { + "name": "Pasted", + "instanceList": true, + "url": "https://github.com/Dragynfruit/pasted" + }, + "pasty": { + "name": "Pasty", + "instanceList": true, + "url": "https://github.com/lus/pasty" + } + }, + "targets": [ + "^https?:\\/{2}paste\\.libredirect\\.invalid" + ], + "name": "Paste Text", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "privateBin", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://paste.libredirect.invalid" + }, + "office": { + "frontends": { + "cryptPad": { + "name": "CryptPad", + "instanceList": true, + "url": "https://cryptpad.org" + } + }, + "targets": ["^https?:\\/{2}office\\.libredirect\\.invalid"], + "name": "Office", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "cryptPad", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://office.libredirect.invalid" + }, + "ultimateGuitar": { + "frontends": { + "freetar": { + "name": "Freetar", + "instanceList": true, + "url": "https://github.com/kmille/freetar" + }, + "ultimateTab": { + "name": "Ultimate Tab", + "instanceList": false, + "url": "https://github.com/BenoitBellegarde/UltimateTab" + } + }, + "targets": [ + "^https?:\\/{2}(tabs\\.|www\\.)?ultimate-guitar\\.com" + ], + "name": "Ultimate Guitar", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "freetar", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.ultimate-guitar.com" + }, + "baiduTieba": { + "frontends": { + "ratAintTieba": { + "name": "Rat Aint Tieba", + "instanceList": true, + "url": "https://0xacab.org/johnxina/rat" + } + }, + "targets": [ + "^https?:\\/{2}tieba\\.baidu\\.com" + ], + "name": "Baidu Tieba", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "ratAintTieba", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://tieba.baidu.com" + }, + "threads": { + "frontends": { + "shoelace": { + "name": "Shoelace", + "instanceList": true, + "url": "https://git.sr.ht/~nixgoat/shoelace" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?threads\\.net" + ], + "name": "Threads", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "shoelace", + "redirectOnlyInIncognito": false + }, + "imageType": "svgMono", + "url": "https://threads.net" + }, + "deviantArt": { + "frontends": { + "skunkyArt": { + "name": "SkunkyArt", + "instanceList": true, + "url": "https://codeberg.org/skunky/skunkyart" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?deviantart\\.com" + ], + "name": "DeviantArt", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "skunkyArt", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://deviantart.com" + }, + "geeksForGeeks": { + "frontends": { + "nerdsForNerds": { + "name": "NerdsforNerds", + "instanceList": true, + "url": "https://git.vern.cc/cobra/NerdsforNerds" + }, + "ducksForDucks": { + "name": "Ducks for Ducks", + "instanceList": true, + "url": "https://git.private.coffee/PrivateCoffee/ducksforducks" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?geeksforgeeks\\.org" + ], + "name": "GeeksforGeeks", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "nerdsForNerds", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.geeksforgeeks.org" + }, + "coub": { + "frontends": { + "koub": { + "name": "Koub", + "instanceList": true, + "url": "https://codeberg.org/gospodin/koub" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?coub\\.com" + ], + "name": "Coub", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "koub", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://coub.com" + }, + "chefkoch": { + "frontends": { + "gocook": { + "name": "GoCook", + "instanceList": true, + "url": "https://github.com/NoUmlautsAllowed/gocook" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?chefkoch\\.de" + ], + "name": "Chefkoch", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "gocook", + "redirectOnlyInIncognito": false + }, + "imageType": "svg", + "url": "https://www.chefkoch.de" + } + } +} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/manifest.json b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/manifest.json @@ -0,0 +1,95 @@ +{ + "name": "__MSG_extensionName__", + "description": "__MSG_extensionDescription__", + "version": "3.2.0", + "manifest_version": 2, + "browser_specific_settings": { + "gecko": { + "id": "7esoorv3@alefvanoon.anonaddy.me", + "strict_min_version": "89.0" + }, + "gecko_android": { + "strict_min_version": "113.0" + } + }, + "background": { + "page": "pages/background/background.html", + "persistent": true + }, + "icons": { + "16": "assets/images/libredirect-16.png", + "32": "assets/images/libredirect-32.png", + "48": "assets/images/libredirect-48.png", + "64": "assets/images/libredirect-64.png", + "96": "assets/images/libredirect-96.png", + "128": "assets/images/libredirect-128.png" + }, + "permissions": [ + "webRequest", + "webRequestBlocking", + "storage", + "clipboardWrite", + "contextMenus", + "<all_urls>" + ], + "optional_permissions": [ + "bookmarks" + ], + "browser_action": { + "default_title": "__MSG_extensionName__", + "browser_style": false, + "default_popup": "pages/popup/index.html", + "default_icon": { + "16": "assets/images/libredirect-16.png", + "32": "assets/images/libredirect-32.png", + "48": "assets/images/libredirect-48.png", + "64": "assets/images/libredirect-64.png", + "96": "assets/images/libredirect-96.png", + "128": "assets/images/libredirect-128.png" + } + }, + "options_ui": { + "page": "pages/options/index.html", + "browser_style": false, + "open_in_tab": true + }, + "chrome_settings_overrides": { + "search_provider": { + "name": "__MSG_extensionName__", + "keyword": "@libredirect", + "favicon_url": "https://raw.githubusercontent.com/libredirect/browser_extension/master/src/assets/images/libredirect.svg", + "search_url": "https://search.libredirect.invalid/?q={searchTerms}", + "encoding": "UTF-8", + "is_default": false + } + }, + "commands": { + "switchInstance": { + "suggested_key": { + "default": "Alt+Shift+L" + }, + "description": "__MSG_switchInstance__" + }, + "copyRaw": { + "suggested_key": { + "default": "Alt+Shift+C" + }, + "description": "Copies the original link. Ex: Copies the original twitter link while in the nitter website" + }, + "reverse": { + "suggested_key": { + "default": "Alt+Shift+O" + }, + "description": "Redirect to the original link. Ex: Redirects to the original twitter link while in the nitter website" + }, + "redirect": { + "suggested_key": { + "default": "Alt+Shift+R" + }, + "description": "Redirect link. Ex: Redirects original twitter link to nitter" + } + }, + "default_locale": "en", + "update_url": "https://raw.githubusercontent.com/libredirect/libredirect/master/src/updates/updates.xml", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAroWDSoSRZ1scj+eJRrvnhJbrqXTKnhQuxs6+AJg16sqr0bsMdFV+MSY4i4xnK+K5WOYkBliWXgUyk/wzicoAjOnSJddrL/Md4FuWHI2NVIkrlsLOrYkygi5OLqGPajRH/w8Cdmg7KzEpXe/OnYV0/qS8li8huEdTzdeLdhfbiVl1j3DOr4OJALQ7mPeeNFHFo/oVQ+OkSezWLezA5jUGfhtzPYV6u1TXzX7lCi8E/BbDbwkvvXOMcjXCv08kjdLOY2djCA2a6zr0xAb3q8DlexAMZ8vMof7AQRFtBKhLc9n9VFoipMMdBOVQQj/eIcRILBrmkcZNnJxFKiHNJ+NcZQIDAQAB" +} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/background/background.html b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/background/background.html @@ -0,0 +1,7 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8" /> + <script type="module" src="background.js"></script> + </head> +</html> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/background/background.js b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/background/background.js @@ -0,0 +1,361 @@ +"use strict" + +import utils from "../../assets/javascripts/utils.js" +import servicesHelper from "../../assets/javascripts/services.js" + +const isChrome = browser.runtime.getBrowserInfo === undefined +window.browser = window.browser || window.chrome + +browser.runtime.onInstalled.addListener(async details => { + if (details.previousVersion != browser.runtime.getManifest().version) { + // ^Used to prevent this running when debugging with auto-reload + if (details.reason == "install") { + if (!(await utils.getOptions())) { + await servicesHelper.initDefaults() + } + } else if (details.reason == "update") { + await servicesHelper.processUpdate() + } + } +}) + +// true to redirect, false to bypass +let tabIdRedirects = {} + +// true == Always redirect, false == Never redirect, null/undefined == follow options for services +browser.webRequest.onBeforeRequest.addListener( + details => { + const old_href = details.url + const url = new URL(details.url) + if (new RegExp(/^chrome-extension:\/{2}.*\/instances\/.*.json$/).test(url.href) && details.type == "xmlhttprequest") + return null + + // if url is previously bypassed + if (tabIdRedirects[details.tabId] == false) return null + + // Bypass embeds from excepted urls + if ( + details.frameAncestors && + details.frameAncestors.length >= 1 && + servicesHelper.isException(new URL(details.frameAncestors[0].url)) + ) + return null + + if (servicesHelper.isException(url)) { + if (details.type == "main_frame") { + console.log(`Bypassing ${details.tabId} ${url}`) + tabIdRedirects[details.tabId] = false + } + return null + } + + let originUrl + let documentUrl + try { + if (details.originUrl) originUrl = new URL(details.originUrl) + else if (details.initiator) originUrl = new URL(details.initiator) + if (details.documentUrl) documentUrl = new URL(details.documentUrl) + } catch { + return null + } + + let newUrl = servicesHelper.redirect( + url, + details.type, + originUrl, + documentUrl, + details.incognito, + tabIdRedirects[details.tabId] + ) + + if ( + (newUrl && newUrl.startsWith("https://no-instance.libredirect.invalid")) || + (!newUrl && url.href.startsWith("https://no-instance.libredirect.invalid")) + ) { + if (details.type != "main_frame") return null + newUrl = newUrl ? new URL(newUrl) : url + const frontend = newUrl.searchParams.get("frontend") + const oldUrl = new URL(newUrl.searchParams.get("url")) + const params = new URLSearchParams({ + message: "no_instance", + url: oldUrl, + frontend: frontend, + }) + browser.tabs.update({ + url: browser.runtime.getURL(`/pages/messages/index.html?${params.toString()}`), + }) + return { cancel: true } + } + + if (!newUrl && url.href.match(/^https?:\/{2}(.*\.)?libredirect\.invalid.*/)) { + if (details.type != "main_frame") return null + const params = new URLSearchParams({ + message: "disabled", + url: url.href, + }) + browser.tabs.update({ + url: browser.runtime.getURL(`/pages/messages/index.html?${params.toString()}`), + }) + return { cancel: true } + } + + if (newUrl === "CANCEL") { + console.log(`Cancelling ${url}`) + return { cancel: true } + } + if (newUrl === "BYPASSTAB") { + console.log(`Bypassing ${details.tabId} ${url}`) + tabIdRedirects[details.tabId] = false + return null + } + if (newUrl) { + console.log("Redirecting", old_href, "=>", newUrl) + return { redirectUrl: newUrl } + } + return null + }, + { urls: ["<all_urls>"] }, + ["blocking"] +) + +browser.tabs.onRemoved.addListener(tabId => { + if (tabIdRedirects[tabId] != undefined) { + delete tabIdRedirects[tabId] + console.log(`Removed tab ${tabId} from tabIdRedirects`) + } +}) + +browser.runtime.getPlatformInfo(r => { + if (r.os != "fuchsia" && r.os != "ios" && r.os != "android") { + browser.commands.onCommand.addListener(async command => { + browser.tabs.query({ active: true, currentWindow: true }, async tabs => { + const url = new URL(tabs[0].url) + switch (command) { + case "switchInstance": { + const newUrl = await servicesHelper.switchInstance(url) + if (newUrl) browser.tabs.update({ url: newUrl }) + break + } + case "copyRaw": + servicesHelper.copyRaw(url) + break + case "redirect": + browser.tabs.query({ active: true, currentWindow: true }, async tabs => { + if (tabs[0].url) { + const url = new URL(tabs[0].url) + const newUrl = servicesHelper.redirect(url, "main_frame", null, null, false, true) + if (newUrl) { + browser.tabs.update(tabs[0].id, { url: newUrl }, () => { + tabIdRedirects[tabs[0].id] = true + }) + } + } + }) + break + case "reverse": + browser.tabs.query({ active: true, currentWindow: true }, async tabs => { + if (tabs[0].url) { + const url = new URL(tabs[0].url) + const newUrl = await servicesHelper.reverse(url) + if (newUrl) { + browser.tabs.update(tabs[0].id, { url: newUrl }, () => { + tabIdRedirects[tabs[0].id] = false + }) + } + } + }) + break + } + }) + }) + + browser.contextMenus.create({ + id: "settingsTab", + title: browser.i18n.getMessage("settings"), + contexts: ["browser_action"], + }) + browser.contextMenus.create({ + id: "switchInstanceTab", + title: browser.i18n.getMessage("switchInstance"), + contexts: ["browser_action"], + }) + browser.contextMenus.create({ id: "copyReverseTab", title: "Copy Original", contexts: ["browser_action"] }) + browser.contextMenus.create({ id: "redirectTab", title: "Redirect", contexts: ["browser_action"] }) + browser.contextMenus.create({ id: "reverseTab", title: "Redirect To Original", contexts: ["browser_action"] }) + + browser.contextMenus.create({ id: "redirectLink", title: "Redirect", contexts: ["link"] }) + browser.contextMenus.create({ id: "redirectLinkInNewTab", title: "Redirect In New Tab", contexts: ["link"] }) + browser.contextMenus.create({ id: "reverseLink", title: "Redirect To Original", contexts: ["link"] }) + browser.contextMenus.create({ + id: "reverseLinkInNewTab", + title: "Redirect To Original In New Tab", + contexts: ["link"], + }) + browser.contextMenus.create({ id: "copyReverseLink", title: "Copy Original", contexts: ["link"] }) + browser.contextMenus.create({ id: "bypassLink", title: "Bypass", contexts: ["link"] }) + browser.contextMenus.create({ id: "bypassLinkInNewTab", title: "Bypass In New Tab", contexts: ["link"] }) + + if (!isChrome) { + browser.contextMenus.create({ id: "redirectBookmark", title: "Redirect", contexts: ["bookmark"] }) + browser.contextMenus.create({ + id: "redirectBookmarkInNewTab", + title: "Redirect In New Tab", + contexts: ["bookmark"], + }) + browser.contextMenus.create({ id: "reverseBookmark", title: "Redirect To Original", contexts: ["bookmark"] }) + browser.contextMenus.create({ + id: "reverseBookmarkInNewTab", + title: "Redirect To Original In New Tab", + contexts: ["bookmark"], + }) + browser.contextMenus.create({ id: "copyReverseBookmark", title: "Copy Original", contexts: ["bookmark"] }) + browser.contextMenus.create({ id: "bypassBookmark", title: "Bypass", contexts: ["bookmark"] }) + browser.contextMenus.create({ id: "bypassBookmarkInNewTab", title: "Bypass In New Tab", contexts: ["bookmark"] }) + } + + browser.contextMenus.onClicked.addListener(async info => { + switch (info.menuItemId) { + case "switchInstanceTab": { + const url = new URL(info.pageUrl) + const newUrl = await servicesHelper.switchInstance(url) + if (newUrl) browser.tabs.update({ url: newUrl }) + return + } + case "settingsTab": + browser.runtime.openOptionsPage() + return + case "copyReverseTab": + browser.tabs.query({ active: true, currentWindow: true }, async tabs => { + if (tabs[0].url) { + const url = new URL(tabs[0].url) + servicesHelper.copyRaw(url) + } + }) + return + case "reverseTab": + browser.tabs.query({ active: true, currentWindow: true }, async tabs => { + if (tabs[0].url) { + const url = new URL(tabs[0].url) + const newUrl = await servicesHelper.reverse(url) + if (newUrl) { + browser.tabs.update(tabs[0].id, { url: newUrl }, () => { + tabIdRedirects[tabs[0].id] = false + }) + } + } + }) + return + case "redirectTab": + browser.tabs.query({ active: true, currentWindow: true }, async tabs => { + if (tabs[0].url) { + const url = new URL(tabs[0].url) + const newUrl = servicesHelper.redirect(url, "main_frame", null, null, false, true) + if (newUrl) { + browser.tabs.update(tabs[0].id, { url: newUrl }, () => { + tabIdRedirects[tabs[0].id] = true + }) + } + } + }) + return + case "copyReverseLink": { + const url = new URL(info.linkUrl) + await servicesHelper.copyRaw(url) + return + } + case "redirectLink": + case "redirectLinkInNewTab": { + const url = new URL(info.linkUrl) + const newUrl = servicesHelper.redirect(url, "main_frame", null, null, false, true) + if (newUrl) { + if (info.menuItemId == "redirectLink") browser.tabs.update({ url: newUrl }) + else browser.tabs.create({ url: newUrl }) + } + return + } + case "reverseLink": + case "reverseLinkInNewTab": { + const url = new URL(info.linkUrl) + const newUrl = await servicesHelper.reverse(url) + if (newUrl) { + if (info.menuItemId == "reverseLink") { + browser.tabs.update({ url: newUrl }, tab => { + tabIdRedirects[tab.id] = false + }) + } else { + browser.tabs.create({ url: newUrl }, tab => { + tabIdRedirects[tab.id] = false + }) + } + } + return + } + case "bypassLink": + case "bypassLinkInNewTab": { + const url = new URL(info.linkUrl) + if (info.menuItemId == "bypassLink") { + browser.tabs.update({ url: url.href }, tab => { + tabIdRedirects[tab.id] = false + }) + } else { + browser.tabs.create({ url: url.href }, tab => { + tabIdRedirects[tab.id] = false + }) + } + return + } + case "copyReverseBookmark": + browser.bookmarks.get(info.bookmarkId, bookmarks => { + const url = new URL(bookmarks[0].url) + servicesHelper.copyRaw(url) + }) + return + case "redirectBookmark": + case "redirectBookmarkInNewTab": + browser.bookmarks.get(info.bookmarkId, bookmarks => { + const url = new URL(bookmarks[0].url) + const newUrl = servicesHelper.redirect(url, "main_frame", null, null, false, true) + if (newUrl) { + if (info.menuItemId == "redirectBookmark") browser.tabs.update({ url: newUrl }) + else browser.tabs.create({ url: newUrl }) + } + }) + return + case "reverseBookmark": + case "reverseBookmarkInNewTab": + browser.bookmarks.get(info.bookmarkId, async bookmarks => { + const url = new URL(bookmarks[0].url) + const newUrl = await servicesHelper.reverse(url) + if (newUrl) { + if (info.menuItemId == "reverseBookmark") { + browser.tabs.update({ url: newUrl }, tab => { + tabIdRedirects[tab.id] = false + }) + } else { + browser.tabs.create({ url: newUrl }, tab => { + tabIdRedirects[tab.id] = false + }) + } + } + }) + return + case "bypassBookmark": + case "bypassBookmarkInNewTab": + browser.bookmarks.get(info.bookmarkId, async bookmarks => { + const url = new URL(bookmarks[0].url) + if (info.menuItemId == "bypassBookmark") { + browser.tabs.update({ url: url.href }, tab => (tabIdRedirects[tab.id] = false)) + } else { + browser.tabs.create({ url: url.href }, tab => (tabIdRedirects[tab.id] = false)) + } + return + }) + } + }) + } +}) + +browser.runtime.onMessage.addListener(r => { + if (r.message == "reverse") tabIdRedirects[r.tabId] = false + else if (r.message == "redirect") tabIdRedirects[r.tabId] = true +}) diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/Inter-VariableFont_slnt,wght.ttf b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/Inter-VariableFont_slnt,wght.ttf Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/Vazirmatn-VariableFont_wght.ttf b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/Vazirmatn-VariableFont_wght.ttf Binary files differ. diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/styles.css b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/fonts/styles.css @@ -0,0 +1,13 @@ +@font-face { + font-family: "Inter"; + src: url("Inter-VariableFont_slnt,wght.ttf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: "Vazirmatn"; + src: url("Vazirmatn-VariableFont_wght.ttf"); + font-weight: normal; + font-style: normal; +} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.css b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.css @@ -0,0 +1,2 @@ +button.svelte-efu498{color:var(--text);border:none;text-decoration:none;cursor:pointer;font-size:16px;font-weight:bold;transition-duration:0.1s;display:inline-flex;align-items:center;margin:7.5px 0;background-color:var(--bg-secondary);border-radius:5px;padding:10px}button.svelte-efu498:hover:enabled{color:var(--active)}button.svelte-efu498:active:enabled{transform:translateY(1px)}button.svelte-efu498:disabled{cursor:not-allowed;opacity:0.5} +body{width:100vw;height:100vh;margin:0;padding:0}div.main.svelte-14zc8ex{height:100%;display:grid;grid-template-columns:800px;margin:0;padding-top:50px;justify-content:center;font-family:"Inter", sans-serif;box-sizing:border-box;font-size:16px;background-color:var(--bg-main);color:var(--text);overflow:scroll}.margin{margin-right:10px;margin-left:0}.margin_rtl{margin-right:0;margin-left:10px} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.js b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.js @@ -0,0 +1,2 @@ +var app=function(){"use strict";function e(){}function t(e,t){for(const n in t)e[n]=t[n];return e}function n(e){return e()}function a(){return Object.create(null)}function r(e){e.forEach(n)}function s(e){return"function"==typeof e}function c(e,t){return e!=e?t==t:e!==t||e&&"object"==typeof e||"function"==typeof e}function o(e,n,a,r){return e[1]&&r?t(a.ctx.slice(),e[1](r(n))):a.ctx}function i(e){const t={};for(const n in e)"$"!==n[0]&&(t[n]=e[n]);return t}function h(e,t){const n={};t=new Set(t);for(const a in e)t.has(a)||"$"===a[0]||(n[a]=e[a]);return n}function u(e,t){e.appendChild(t)}function p(e,t,n){e.insertBefore(t,n||null)}function l(e){e.parentNode&&e.parentNode.removeChild(e)}function m(e){return document.createElement(e)}function $(e){return document.createElementNS("http://www.w3.org/2000/svg",e)}function d(e){return document.createTextNode(e)}function f(){return d(" ")}function g(e,t,n){null==n?e.removeAttribute(t):e.getAttribute(t)!==n&&e.setAttribute(t,n)}const b=["width","height"];function w(e,t){const n=Object.getOwnPropertyDescriptors(e.__proto__);for(const a in t)null==t[a]?e.removeAttribute(a):"style"===a?e.style.cssText=t[a]:"__value"===a?e.value=e[a]=t[a]:n[a]&&n[a].set&&-1===b.indexOf(a)?e[a]=t[a]:g(e,a,t[a])}function y(e,t){for(const n in t)g(e,n,t[n])}function v(e,t,n){e.classList[n?"add":"remove"](t)}let x;function k(e){x=e}function P(){if(!x)throw new Error("Function called outside component initialization");return x}function _(e,t){const n=e.$$.callbacks[t.type];n&&n.slice().forEach((e=>e.call(this,t)))}const I=[],W=[];let C=[];const q=[],T=Promise.resolve();let L=!1;function R(e){C.push(e)}const O=new Set;let S=0;function z(){if(0!==S)return;const e=x;do{try{for(;S<I.length;){const e=I[S];S++,k(e),E(e.$$)}}catch(e){throw I.length=0,S=0,e}for(k(null),I.length=0,S=0;W.length;)W.pop()();for(let e=0;e<C.length;e+=1){const t=C[e];O.has(t)||(O.add(t),t())}C.length=0}while(I.length);for(;q.length;)q.pop()();L=!1,O.clear(),k(e)}function E(e){if(null!==e.fragment){e.update(),r(e.before_update);const t=e.dirty;e.dirty=[-1],e.fragment&&e.fragment.p(e.ctx,t),e.after_update.forEach(R)}}const U=new Set;let M;function A(e,t){e&&e.i&&(U.delete(e),e.i(t))}function N(e,t,n,a){if(e&&e.o){if(U.has(e))return;U.add(e),M.c.push((()=>{U.delete(e),a&&(n&&e.d(1),a())})),e.o(t)}else a&&a()}function D(e,t){const n={},a={},r={$$scope:1};let s=e.length;for(;s--;){const c=e[s],o=t[s];if(o){for(const e in c)e in o||(a[e]=1);for(const e in o)r[e]||(n[e]=o[e],r[e]=1);e[s]=o}else for(const e in c)r[e]=1}for(const e in a)e in n||(n[e]=void 0);return n}function j(e){e&&e.c()}function Z(e,t,a,c){const{fragment:o,after_update:i}=e.$$;o&&o.m(t,a),c||R((()=>{const t=e.$$.on_mount.map(n).filter(s);e.$$.on_destroy?e.$$.on_destroy.push(...t):r(t),e.$$.on_mount=[]})),i.forEach(R)}function G(e,t){const n=e.$$;null!==n.fragment&&(!function(e){const t=[],n=[];C.forEach((a=>-1===e.indexOf(a)?t.push(a):n.push(a))),n.forEach((e=>e())),C=t}(n.after_update),r(n.on_destroy),n.fragment&&n.fragment.d(t),n.on_destroy=n.fragment=null,n.ctx=[])}function H(e,t){-1===e.$$.dirty[0]&&(I.push(e),L||(L=!0,T.then(z)),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<<t%31}function F(t,n,s,c,o,i,h,u=[-1]){const p=x;k(t);const m=t.$$={fragment:null,ctx:[],props:i,update:e,not_equal:o,bound:a(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(n.context||(p?p.$$.context:[])),callbacks:a(),dirty:u,skip_bound:!1,root:n.target||p.$$.root};h&&h(m.root);let $=!1;if(m.ctx=s?s(t,n.props||{},((e,n,...a)=>{const r=a.length?a[0]:n;return m.ctx&&o(m.ctx[e],m.ctx[e]=r)&&(!m.skip_bound&&m.bound[e]&&m.bound[e](r),$&&H(t,e)),n})):[],m.update(),$=!0,r(m.before_update),m.fragment=!!c&&c(m.ctx),n.target){if(n.hydrate){const e=function(e){return Array.from(e.childNodes)}(n.target);m.fragment&&m.fragment.l(e),e.forEach(l)}else m.fragment&&m.fragment.c();n.intro&&A(t.$$.fragment),Z(t,n.target,n.anchor,n.customElement),z()}k(p)}class X{$destroy(){G(this,1),this.$destroy=e}$on(t,n){if(!s(n))return e;const a=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return a.push(n),()=>{const e=a.indexOf(n);-1!==e&&a.splice(e,1)}}$set(e){var t;this.$$set&&(t=e,0!==Object.keys(t).length)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}function B(e){return e[~~(e.length*Math.random())]}function Y(e){return new Promise((async t=>{let n,a=new XMLHttpRequest;a.timeout=5e3,a.ontimeout=()=>t(5e3),a.onerror=()=>t(),a.onreadystatechange=()=>{if(2==a.readyState)if(200==a.status){let e=(new Date).getTime();a.abort(),t(e-n)}else t(5e3+a.status)},a.open("GET",`${e}?_=${(new Date).getTime()}`,!0),n=(new Date).getTime(),a.send(null)}))}function J(e){return new Promise((async t=>{let n,a=0;for(let r=0;r<3;r++)if(n=await Y(e),0!=r){if(n>=5e3)return void t(n);a+=n}a=parseInt(a/3),t(a)}))}function Q(e,t){let n=[];t>e.length&&(t=e.length);for(let a=0;a<t;a++){const t=e[Math.floor(Math.random()*e.length)];n.push(t)}return n}window.browser=window.browser||window.chrome;var V={getRandomInstance:B,getNextInstance:function(e,t){const n=t.indexOf(e);return-1===n?B(t):t[(n+1)%t.length]},protocolHost:function(e){const t=e.pathname.replace(/\/$/,"");return"/TekstoLibre"==t&&e.host.endsWith("github.io")?`${e.protocol}//${e.host}${t.slice(0,-1)}`:e.username&&e.password?`${e.protocol}//${e.username}:${e.password}@${e.host}${t}`:`${e.protocol}//${e.host}${t}`},getList:function(e){return new Promise((t=>{let n;if("github"==e.fetchInstances)n="https://raw.githubusercontent.com/libredirect/instances/main/data.json";else{if("codeberg"!=e.fetchInstances)return t("disabled");n="https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json"}const a=new XMLHttpRequest;a.open("GET",n,!0),a.onreadystatechange=()=>{if(200===a.status&&a.readyState==XMLHttpRequest.DONE)return t(JSON.parse(a.responseText))},a.onerror=()=>t(),a.ontimeout=()=>t(),a.send(null)}))},getBlacklist:function(e){return new Promise((t=>{let n;if("github"==e.fetchInstances)n="https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json";else{if("codeberg"!=e.fetchInstances)return t("disabled");n="https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json"}const a=new XMLHttpRequest;a.open("GET",n,!0),a.onreadystatechange=()=>{200===a.status&&a.readyState==XMLHttpRequest.DONE&&t(JSON.parse(a.responseText))},a.onerror=()=>t(),a.ontimeout=()=>t(),a.send(null)}))},getConfig:function(){return new Promise((e=>{fetch("/config.json").then((e=>e.text())).then((t=>{e(JSON.parse(t))}))}))},getOptions:function(){return new Promise((e=>browser.storage.local.get("options",(t=>e(t.options)))))},getPingCache:function(){return new Promise((e=>browser.storage.local.get("pingCache",(t=>e(t.pingCache??{})))))},ping:J,addressToLatLng:function(e){const t=new XMLHttpRequest;if(t.open("GET",`https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(e)}&format=json&limit=1`,!1),t.send(),200==t.status){const e=JSON.parse(t.responseText)[0];return e?{coordinate:`${e.lat},${e.lon}`,boundingbox:`${e.boundingbox[2]},${e.boundingbox[1]},${e.boundingbox[3]},${e.boundingbox[0]}`}:{}}},getQuery:function(e){let t="";return e.searchParams.has("q")?t=e.searchParams.get("q"):e.searchParams.has("query")&&(t=e.searchParams.has("query")),t},prefsEncoded:function(e){return new URLSearchParams(e).toString()},convertMapCentre:function(e){let[t,n,a]=[null,null,null];const r=e.pathname.match(/@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/);return r?[,n,t,a]=r:e.searchParams.has("center")&&([t,n]=e.searchParams.get("center").split(","),a=e.searchParams.get("zoom")??"17"),{zoom:a,lon:n,lat:t}},randomInstances:Q,style:function(e,t){const n=function(e,t){const n={text:"#fff",bgMain:"#121212",bgSecondary:"#202020",active:"#fbc117",danger:"#f04141",lightGrey:"#c3c3c3"},a={text:"black",bgMain:"white",bgSecondary:"#e4e4e4",active:"#fb9817",danger:"#f04141",lightGrey:"#c3c3c3"};return"dark"==e.theme?n:"light"==e.theme?a:t.matchMedia("(prefers-color-scheme: dark)").matches?n:a}(e,t);return`--text: ${n.text};\n --bg-main: ${n.bgMain};\n --bg-secondary: ${n.bgSecondary};\n --active: ${n.active};\n --danger: ${n.danger};\n --light-grey: ${n.lightGrey};`},autoPickInstance:async function(e,t){if(t){const n=e.findIndex((e=>t.href.startsWith(e)));n>=0&&e.splice(n,1)}const n=Q(e,5),a=await Promise.all([...n.map((async e=>[e,await J(e)]))]);return a.sort(((e,t)=>e[1]-t[1])),a[0][0]}};const K=void 0===browser.runtime.getBrowserInfo;let ee,te;async function ne(){te=await V.getOptions(),ee=await V.getConfig()}function ae(e,t,n,a){let r=[];if(t)n[t]&&(r=n[t]);else for(const t in a.services[e].frontends)n[t]&&r.push(...n[t]);return r}function re(e,t,n,a,r){let s=n.services[e].targets;r&&(!("excludeTargets"in n.services[e].frontends[r])||"search"===e&&a.search.redirectGoogle||(s=s.filter((t=>!n.services[e].frontends[r].excludeTargets.includes(s.indexOf(t))))),"twitter"===e&&a.twitter.disableTwimg&&(s=s.splice(2)));for(const e in s){if(new RegExp(s[e]).test(t.href))return!0}return!1}function se(e,t,n,a,r,s){if("main_frame"!=t&&"sub_frame"!=t&&"image"!=t)return;let c,o;if(s||1!=te.redirectOnlyInIncognito||r){for(const i in ee.services){if(!s&&!te[i].enabled)continue;if(!s&&1==te[i].redirectOnlyInIncognito&&!r)continue;if(o=te[i].frontend,ee.services[i].frontends[o].desktopApp&&"main_frame"!=t&&"main_frame"!=te[i].redirectType&&(o=te[i].embedFrontend),!re(i,e,ee,te,o)){o=null;continue}if("main_frame"!=t&&a&&"sub_frame"==te[i].redirectType&&re(i,a,ee,te,o))return;if(ee.services[i].embeddable&&t!=te[i].redirectType&&"both"!=te[i].redirectType)return"block"==te[i].unsupportedUrls?"CANCEL":void 0;let h=te[o];if(void 0===h)break;if(ee.services[i].frontends[o].localhost&&"localhost"==te[i].instance)c=`http://${o}.localhost:8080`;else{if(0===h.length)return`https://no-instance.libredirect.invalid?frontend=${encodeURIComponent(o)}&url=${encodeURIComponent(e.href)}`;c=V.getRandomInstance(h)}if(n&&h.includes(n.origin))return"main_frame"==t?"BYPASSTAB":null;break}if(o)return function(e,t,n,a,r){switch(n){case"hyperpipe":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${a}${e.pathname}${e.search}`.replace(/\/search\?q=.*/,(e=>e.replace("?q=","/")));case"searx":case"searxng":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${a}/${e.search}`;case"websurfx":case"whoogle":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${a}/search${e.search}`;case"4get":{const t=e.searchParams.get("q");return null!==t?`${a}/web?s=${encodeURIComponent(t)}`:a}case"librey":for(const t in e.searchParams.keys())"q"!=t&&e.searchParams.delete(t);return`${a}/search.php${e.search}`;case"yattee":return e.searchParams.delete("si"),e.href.replace(/^https?:\/{2}/,"yattee://");case"freetube":case"freetubePwa":return e.searchParams.delete("si"),"freetube://"+e.href;case"poketube":if(e.searchParams.delete("si"),e.pathname.startsWith("/channel")){const t=/\/channel\/(.*)\/?$/.exec(e.pathname);if(t)return`${a}/channel?id=${t[1]}${e.search}`}return/\/@[a-z]+\//.exec(e.pathname)?a:`${a}${e.pathname}${e.search}`;case"small":case"libMedium":case"freedium":case"scribe":{const t=e.hostname.match(/^(link|cdn-images-\d+|.*)\.medium\.com/);if(t&&t.length>1){const n=t[1];if("link"!=n||!n.startsWith("cdn-images"))return`${a}/@${n}${e.pathname}${e.search}`}return`${a}${e.pathname}${e.search}`}case"translite":case"simplyTranslate":return`${a}/${e.search}`;case"send":case"mozhi":return a;case"libreTranslate":return`${a}/${e.search.replace("sl","source").replace("tl","target").replace("text","q")}`;case"osm":{if(t&&"earth.google.com"===t.host)return a;let n={layers:"mapnik"},r="#";const s=V.convertMapCentre(e);if(s.zoom&&s.lon&&s.lat&&(r=`#map=${s.zoom}/${s.lon}/${s.lat}`),e.pathname.includes("/embed")){const t=V.getQuery(e);let{coordinate:r,boundingbox:s}=V.addressToLatLng(t);return n.bbox=s,n.marker=r,`${a}/export/embed.html?${V.prefsEncoded(n)}`}if(e.pathname.includes("/dir")){if(e.searchParams.has("travelmode")){const t={driving:"fossgis_osrm_car",walking:"fossgis_osrm_foot",bicycling:"fossgis_osrm_bike",transit:"fossgis_osrm_car"};n.engine=t[e.searchParams.get("travelmode")]}const t=/\/dir\/([^@/]+)\/([^@/]+)\/@-?\d[0-9.]*,-?\d[0-9.]*,\d{1,2}[.z]/.exec(e.pathname),s=/\/dir\/([^@/]+)\//.exec(e.pathname);if(t){const e=V.addressToLatLng(decodeURIComponent(t[1])).coordinate??"",a=V.addressToLatLng(decodeURIComponent(t[2])).coordinate??"";n.route=`${e};${a}`}else if(s){const e=V.addressToLatLng(decodeURIComponent(s[1])).coordinate??"";n.route=`${e};`}else{const t=V.addressToLatLng(e.searchParams.get("origin")).coordinate??"",a=V.addressToLatLng(e.searchParams.get("destination")).coordinate??"";n.route=`${t};${a}`}return`${a}/directions?${V.prefsEncoded(n)}${r}`}const c=/\/place\/(.*?)\//;if(e.pathname.match(c))return`${a}/search?query=${e.pathname.match(c)[1]}${r}`;if(e.searchParams.has("ll")){const[t,n]=e.searchParams.get("ll").split(",");return`${a}/search?query=${t}%2C${n}`}if(e.searchParams.has("viewpoint")){const[t,n]=e.searchParams.get("viewpoint").split(",");return`${a}/search?query=${t}%2C${n}`}const o=V.getQuery(e);return o?`${a}/search?query="${o}${r}&${V.prefsEncoded(n)}`:`${a}/${r}&${V.prefsEncoded(n)}`}case"breezeWiki":{let t,n="";return e.hostname.match(/^[a-zA-Z0-9-]+\.(?:fandom|wikia)\.com/)?(t=e.hostname.match(/^[a-zA-Z0-9-]+(?=\.(?:fandom|wikia)\.com)/),t="www"!=t&&t?`/${t}`:"",n=e.pathname):(t=e.pathname.match(/(?<=wiki\/w:c:)[a-zA-Z0-9-]+(?=:)/),t?(t="/"+t+"/wiki/",n=e.pathname.match(/(?<=wiki\/w:c:[a-zA-Z0-9-]+:).+/)):t=""),e.href.search(/Special:Search\?query/)>-1?`${a}${t}${n}${e.search}`.replace(/Special:Search\?query/,"search?q").replace(/\/wiki/,""):`${a}${t}${n}${e.search}`}case"rimgo":return e.href.search(/^https?:\/{2}(?:[im]\.)?stack\./)>-1?`${a}/stack${e.pathname}${e.search}`:`${a}${e.pathname}${e.search}`;case"redlib":case"libreddit":{const t=e.hostname.match(/^(?:((?:external-)?preview|i)\.)?redd\.it/);if(!t)return`${a}${e.pathname}${e.search}`;switch(t[1]){case"preview":return`${a}/preview/pre${e.pathname}${e.search}`;case"external-preview":return`${a}/preview/external-pre${e.pathname}${e.search}`;case"i":return`${a}/img${e.pathname}`}return`${a}/comments${e.pathname}`}case"teddit":return/^(?:(?:external-)?preview|i)\.redd\.it/.test(e.hostname)?""==e.search?`${a}${e.pathname}?teddit_proxy=${e.hostname}`:`${a}${e.pathname}${e.search}&teddit_proxy=${e.hostname}`:`${a}${e.pathname}${e.search}`;case"troddit":case"eddrit":return/^(?:(?:external-)?preview|i)\.redd\.it/.test(e.hostname)?a:`${a}${e.pathname}${e.search}`;case"neuters":{const t=e.pathname;return t.startsWith("/article/")||t.startsWith("/pf/")||t.startsWith("/arc/")||t.startsWith("/resizer/")?a:`${a}${t}`}case"dumb":return e.pathname.endsWith("-lyrics")?`${a}${e.pathname}`:`${a}${e.pathname}${e.search}`;case"intellectual":return`${a}${e.pathname}${e.search}`;case"ruralDictionary":return e.pathname.includes("/define.php")||e.pathname.includes("/random.php")||"/"==e.pathname?`${a}${e.pathname}${e.search}`:a;case"anonymousOverflow":{if("stackoverflow.com"==e.hostname){const t=/^\/a\/(\d+)\/?/.exec(e.pathname);return t?`${a}/questions/${t[1]}${e.search}`:`${a}${e.pathname}${e.search}`}if("/"==e.pathname||""==e.pathname)return`${a}${e.pathname}${e.search}`;const t=e.href.match(/https?:\/{2}(?:([a-zA-Z0-9-]+)\.(meta\.)?)?stackexchange\.com\//);if(t&&t.length>1)return t[2]?`${a}/exchange/${e.hostname}${e.pathname}${e.search}`:`${a}/exchange/${t[1]}${e.pathname}${e.search}`;const n=e.hostname.match(/(?:[a-zA-Z]+\.)?(?:askubuntu\.com|mathoverflow\.net|serverfault\.com|stackapps\.com|superuser\.com|stackoverflow\.com)/);return n?`${a}/exchange/${n[0]}${e.pathname}${e.search}`:`${a}${e.pathname}${e.search}`}case"biblioReads":return`${a}${e.pathname}${e.search}`;case"wikimore":{let t=e.host.split(".");return"wikipedia"!=t[0]&&"www"!=t[0]?`${a}/wiki/${e.hostname.split(".")[0]}${e.pathname}${e.search}${e.hash}`:`${a}${e.pathname}${e.search}${e.hash}`}case"wikiless":{let t=e.host.split(".");return"wikipedia"!=t[0]&&"www"!=t[0]&&("m"==t[0]?e.searchParams.append("mobileaction","toggle_view_mobile"):e.searchParams.append("lang",t[0]),"m"==t[1]&&e.searchParams.append("mobileaction","toggle_view_mobile")),`${a}${e.pathname}${e.search}${e.hash}`}case"offtiktok":case"proxiTok":return e.pathname.startsWith("/email")?a:`${a}${e.pathname}${e.search}`;case"waybackClassic":{const t=/^\/\web\/(?:[0-9]+)?\*\/(.*)/.exec(e.pathname);if(t){const e=t[1];return`${a}/cgi-bin/history.cgi?utf8=✓&q=${encodeURIComponent(e)}`}const n=/(^\/\web\/([0-9]+)\/.*)/.exec(e.pathname);if(n){let e=n[1];return e=e.replace(n[2],n[2]+"if_"),`https://web.archive.org${e}`}return}case"gothub":return"gist.github.com"==e.hostname?`${a}/gist${e.pathname}${e.search}`:"raw.githubusercontent.com"==e.hostname?`${a}/raw${e.pathname}${e.search}`:`${a}${e.pathname}${e.search}`;case"mikuInvidious":if("bilibili.com"==e.hostname||"www.bilibili.com"==e.hostname||"b23.tv"==e.hostname)return`${a}${e.pathname}${e.search}`;if("space.bilibili.com"==e.hostname)return`${a}/space${e.pathname}${e.search}`;case"tent":if("bandcamp.com"==e.hostname&&"/search"==e.pathname){const t=e.searchParams.get("q");return`${a}/search.php?query=${encodeURIComponent(t)}`}if(e.hostname.endsWith("bandcamp.com")){const t=/^(.*)\.bandcamp\.com/.exec(e.hostname)[1];if("/"==e.pathname||"/music"==e.pathname)return`${a}/artist.php?name=${t}`;{const n=/^\/(.*)\/(.*)/.exec(e.pathname);if(n)return`${a}/release.php?artist=${t}&type=${n[1]}&name=${n[2]}`}}if("f4.bcbits.com"==e.hostname)return`${a}/image.php?file=${/\/img\/(.*)/.exec(e.pathname)[1]}`;if("t4.bcbits.com"==e.hostname){const t=/\/stream\/(.*)\/(.*)\/(.*)/.exec(e.pathname);if(t){const n=t[1],r=t[2],s=t[3],c=e.searchParams.get("token");return`${a}/audio.php/?directory=${n}&format=${r}&file=${s}&token=${encodeURIComponent(c)}`}}case"binternet":return"i.pinimg.com"==e.hostname?`${a}/image_proxy.php?url=${encodeURIComponent(e.href)}`:`${a}${e.pathname}${e.search}`;case"painterest":if("i.pinimg.com"==e.hostname)return`${a}/_/proxy?url=${encodeURIComponent(e.href)}`;const n=/^\/pin\/[^\/]+/.exec(e.pathname);return n?`${a}${n[0]}`:`${a}${e.pathname}${e.search}`;case"laboratory":{let t=e.pathname;return"/"==t&&(t=""),`${a}/${e.hostname}${t}${e.search}`}case"quetre":{const t=/([a-z]+)\.quora\.com/.exec(e.hostname);if(t){const n=t[1];return e.searchParams.append("lang",n),`${a}${e.pathname}${e.search}`}return`${a}${e.pathname}${e.search}`}case"pixivViewer":case"liteXiv":case"pixivFe":{const t=/\/[a-z]{1,3}\/(.*)/.exec(e.pathname);return t?`${a}/${t[1]}${e.search}`:`${a}${e.pathname}${e.search}`}case"vixipy":{const t=/\/[a-z]{1,3}\/(.*)/.exec(e.pathname);if(t){let n=t[1];return n.startsWith("tags/")&&(n=n.replace(/tags/,"tag")),`${a}/${n}${e.search}`}return`${a}${e.pathname}${e.search}`}case"invidious":return e.searchParams.delete("si"),"sub_frame"==r&&e.searchParams.append("autoplay","0"),"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`${a}/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}&${e.search.substring(1)}`:e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/redirect?")?e.href:`${a}${e.pathname}${e.search}`;case"freetubeMusic":return"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`freetube://youtube.com/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}`:"freetube://"+e.href;case"invidiousMusic":return"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`${a}/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}`:`${a}${e.pathname}${e.search}`;case"materialious":if(e.searchParams.delete("si"),"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live"))return`${a}/watch/${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}${e.search.replace("?","&")}`;if(e.hostname.endsWith("youtube.com")){if(e.pathname.startsWith("/watch")){if(e.searchParams.has("v")){const t=e.searchParams.get("v");return e.searchParams.delete("v"),`${a}/watch/${t}${e.search.replace("?","&")}`}return`${a}/watch/${e.search.replace("?","&")}`}if(e.pathname.startsWith("/results")){if(e.searchParams.has("search_query")){const t=e.searchParams.get("search_query");return e.searchParams.delete("search_query"),`${a}/search/${t}${e.search.replace("?","&")}`}return`${a}/search/${e.search.replace("?","&")}`}if(e.pathname.startsWith("/redirect?"))return e.href}return`${a}${e.pathname}${e.search}`;case"libremdb":return/\/((?:name|title)\/\w+)\/?$/.exec(e.pathname)?`${a}${e.pathname}${e.search}`:a;case"tuboYoutube":return e.searchParams.delete("si"),e.pathname.startsWith("/channel")?`${a}/channel?url=${encodeURIComponent(e.href)}`:e.pathname.startsWith("/watch")?`${a}/stream?url=${encodeURIComponent(e.href)}`:a;case"tuboSoundcloud":return"/"==e.pathname?`${a}?kiosk?serviceId=1`:e.pathname.match(/^\/[^\/]+(\/$|$)/)?`${a}/channel?url=${encodeURIComponent(e.href)}`:e.pathname.match(/^\/[^\/]+\/[^\/]+/)?`${a}/stream?url=${encodeURIComponent(e.href)}`:a;case"twineo":case"safetwitch":return e.hostname.startsWith("clips.")?`${a}/clip${e.pathname}${e.search}`:`${a}${e.pathname}${e.search}`;case"tekstoLibre":return`${a}/?${e.pathname.slice(1)}`;case"skyview":return"/"==e.pathname?a:`${a}?url=${encodeURIComponent(e.href)}`;case"nitter":{let t=new URLSearchParams(e.search);if(t.delete("ref_src"),t.delete("ref_url"),t.delete("s"),t.delete("t"),t=t.toString(),""!==t&&(t=`?${t}`),"pbs"===e.host.split(".")[0]||"video"===e.host.split(".")[0])try{const[,n,r,s]=t.match(/(.*)\?format=(.*)&(.*)/),c=encodeURIComponent(`${n}.${r}?${s}`);return`${a}/pic${e.pathname}${c}`}catch{return`${a}/pic${e.pathname}${t}`}return e.pathname.split("/").includes("tweets")?`${a}${e.pathname.replace("/tweets","")}${t}`:"t.co"==e.host?`${a}/t.co${e.pathname}`:`${a}${e.pathname}${t}#m`}case"priviblur":{if("www.tumblr.com"==e.hostname)return`${a}${e.pathname}${e.search}`;if(e.hostname.startsWith("assets"))return`${a}/tblr/assets${e.pathname}${e.search}`;if(e.hostname.startsWith("static"))return`${a}/tblr/static${e.pathname}${e.search}`;const t=/^([0-9]+)\.media\.tumblr\.com/.exec(e.hostname);if(t)return`${a}/tblr/media/${t[1]}${e.pathname}${e.search}`;const n=/^(?:www\.)?([a-z\d-]+)\.tumblr\.com/.exec(e.hostname);if(n){const t=n[1];return e.pathname.startsWith("/post")?`${a}/${t}${e.pathname.slice(5)}${e.search}`:`${a}/${t}${e.pathname}${e.search}`}return`${a}${e.pathname}${e.search}`}case"ultimateTab":case"freetar":if(e.pathname.startsWith("/search.php"))return e.searchParams.set("search_term",e.searchParams.get("value")),e.searchParams.delete("value"),e.searchParams.delete("search_type"),`${a}/search${e.search}`;if(e.pathname.startsWith("/artist"))return;return`${a}${e.pathname}${e.search}`;case"ratAintTieba":return e.searchParams.delete("ie"),`${a}${e.pathname}${e.search}`;case"shoelace":{const t=/^\/(?:(?:(?:[^\/])?\/post)|t)\/([^\/])/.exec(e.pathname);return t?`${a}/t/${t[1]}${e.search}`:`${a}${e.pathname}${e.search}`}case"skunkyArt":{if(e.pathname.startsWith("/search"))return`${a}${e.pathname}${e.search}&type=all`;const t=/^\/(.*?)\/art\/(.*)\/?/.exec(e.pathname);if(t)return`${a}/post/${t[1]}/${t[2]}${e.search}`;const n=/^\/([^\/]+)$/.exec(e.pathname);if(n)return`${a}/group_user?q=${n[1]}&type=about`;const r=/^\/(.*?)\/gallery(\/$|$)$/.exec(e.pathname);return r?`${a}/group_user?q=${r[1]}&type=gallery`:`${a}${e.pathname}${e.search}`}case"ytify":{if(e.pathname.startsWith("/watch"))return`${a}/?s=${encodeURIComponent(e.searchParams.get("v"))}`;const t=/\/channel\/([^\/]+)/.exec(e.pathname);return t?`${a}/list?channel=${t[1]}`:e.pathname.startsWith("/playlist")?`${a}/list?playlists=${encodeURIComponent(e.searchParams.get("list"))}`:`${a}${e.pathname}${e.search}`}case"koub":return e.pathname.startsWith("/view/")||e.pathname.startsWith("/stories/")?`${a}${e.pathname}${e.search}`:/^\/([^\/]+)\/?$/.exec(e.pathname)?`${a}/account${e.pathname}${e.search}`:a;case"duckDuckGoAiChat":return"https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=1";case"soundcloak":if(e.pathname.startsWith("/feed")||e.pathname.startsWith("/stream"))return a;if(e.pathname.startsWith("/search")){if(!e.search)return a;let t="";return e.pathname.startsWith("/search/sounds")?t="tracks":e.pathname.startsWith("/search/people")?t="users":(e.pathname.startsWith("/search/albums")||e.pathname.startsWith("/search/sets"))&&(t="playlists"),t?(t="&type="+t,`${a}/search${e.search}${t}`):a}return"on.soundcloud.com"==e.host?`${a}/on${e.pathname}`:`${a}${e.pathname}${e.search}`;case"piped":case"pipedMaterial":case"cloudtube":case"lightTube":case"viewtube":e.searchParams.delete("si");default:return`${a}${e.pathname}${e.search}`}}(e,n,o,c,t)}}async function ce(e){let t=await V.getOptions(),n=await V.getConfig();for(const a in n.services){let r=t[a].frontend;if(null!=t[r]&&(!(t[r].findIndex((t=>e.href.startsWith(t)))<0)||e.href.startsWith(`http://${r}.localhost:8080`)))switch(a){case"youtube":case"imdb":case"imgur":case"tiktok":case"reddit":case"imdb":case"snopes":case"urbanDictionary":case"quora":case"twitter":case"medium":case"pinterest":return`${n.services[a].url}${e.pathname}${e.search}`;case"fandom":{let t=e.pathname.match(/^\/([a-zA-Z0-9-]+)\/wiki\/(.*)/);return t?`https://${t[1]}.fandom.com/wiki/${t[2]}`:void 0}case"wikipedia":{const t=e.searchParams.get("lang");return null!=t?`https://${t}.wikipedia.org${e.pathname}${e.search}${e.hash}`:`https://wikipedia.org${e.pathname}${e.search}${e.hash}`}case"stackOverflow":if(e.pathname.startsWith("/questions/"))return`https://stackoverflow.com${e.pathname}${e.search}`;if(e.pathname.startsWith("/exchange/")){const t=/\/exchange\/(.*?)(\/.*)/.exec(e.pathname);if(t)return t[1].includes(".")?`https://${t[1]}${t[2]}`:`https://${t[1]}.stackexchange.com${t[2]}`}return;case"tekstowo":return`${n.services[a].url}/${e.search.slice(1)}`;case"goodreads":return`https://goodreads.com${e.pathname}${e.search}`;case"soundcloud":if("soundcloak"==r){if(e.pathname.includes("/_/"))return`${n.services[a].url}${e.pathname.split("/_/")[0]}`;if("/search"==e.pathname){let t=e.searchParams.get("type");switch(t){case"playlists":t="sets";break;case"tracks":t="sounds";break;case"users":t="people";break;default:t=""}return e.searchParams.delete("type"),t?`${n.services[a].url}/search/${t}?${e.searchParams.toString()}`:`${n.services[a].url}/search?${e.searchParams.toString()}`}return`${n.services[a].url}${e.pathname}`}default:return}}}window.browser=window.browser||window.chrome,ne(),browser.storage.onChanged.addListener(ne);const oe={materialious:["https://app.materialio.us"],viewtube:["https://viewtube.io"],piped:["https://pipedapi-libre.kavin.rocks"],pipedMaterial:["https://piped-material.xn--17b.net"],cloudtube:["https://tube.cadence.moe"],lightTube:["https://tube.kuylar.dev"],poketube:["https://poketube.fun"],proxiTok:["https://proxitok.pabloferreiro.es"],offtiktok:["https://www.offtiktok.com"],redlib:["https://safereddit.com"],eddrit:["https://eddrit.com"],troddit:["https://www.troddit.com"],scribe:["https://scribe.rip"],libMedium:["https://md.vern.cc"],small:["https://small.bloat.cat"],freedium:["https://freedium.cfd"],quetre:["https://quetre.iket.me"],libremdb:["https://libremdb.iket.me"],simplyTranslate:["https://simplytranslate.org"],translite:["https://tl.bloat.cat"],mozhi:["https://mozhi.aryak.me"],searxng:["https://nyc1.sx.ggtyler.dev"],"4get":["https://4get.ca"],websurfx:["https://alamin655-spacex.hf.space"],rimgo:["https://rimgo.vern.cc"],hyperpipe:["https://hyperpipe.surge.sh"],osm:["https://www.openstreetmap.org"],breezeWiki:["https://breezewiki.com"],neuters:["https://neuters.de"],dumb:["https://dm.vern.cc"],intellectual:["https://intellectual.insprill.net"],ruralDictionary:["https://rd.vern.cc"],anonymousOverflow:["https://code.whatever.social"],suds:["https://sd.vern.cc"],unfunny:["https://uf.vern.cc"],soprano:["https://sp.vern.cc"],meme:["https://mm.vern.cc"],waybackClassic:["https://wayback-classic.net"],tent:["https://tent.sny.sh"],laboratory:["https://lab.vern.cc"],binternet:["https://bn.bloat.cat"],painterest:["https://pt.bloat.cat"],pixivFe:["https://pixiv.perennialte.ch"],liteXiv:["https://litexiv.465321.best","https://litexiv.bloat.cat"],pixivViewer:["https://pixiv.pictures"],vixipy:["https://vx.maid.zone"],indestructables:["https://indestructables.private.coffee"],destructables:["https://ds.vern.cc"],structables:["https://structables.private.coffee"],safetwitch:["https://safetwitch.drgns.space"],twineo:["https://twineo.exozy.me"],proxigram:["https://ig.opnxng.com"],tuboYoutube:["https://tubo.media"],tuboSoundcloud:["https://tubo.media"],tekstoLibre:["https://davilarek.github.io/TekstoLibre"],skyview:["https://skyview.social"],priviblur:["https://pb.bloat.cat"],nitter:["https://nitter.privacydev.net"],pasted:["https://pasted.drakeerv.com"],pasty:["https://pasty.lus.pm"],freetar:["https://freetar.de"],ultimateTab:["https://ultimate-tab.com"],ratAintTieba:["https://rat.fis.land"],shoelace:["https://shoelace.mint.lgbt"],skunkyArt:["https://skunky.bloat.cat"],ytify:["https://ytify.pp.ua"],nerdsForNerds:["https://nn.vern.cc"],ducksForDucks:["https://ducksforducks.private.coffee"],koub:["https://koub.clovius.club"],soundcloak:["https://soundcloak.fly.dev"],gocook:["https://cook.adminforge.de"],wikimore:["https://wikimore.private.coffee"],libreTranslate:["https://libretranslate.com"],cryptPad:["https://cryptpad.org"]};async function ie(){let e=await V.getConfig(),t={};for(const n in e.services){t[n]={};for(const a in e.services[n].options)t[n][a]=e.services[n].options[a];for(const a in e.services[n].frontends)e.services[n].frontends[a].instanceList&&(t[a]=[])}return t.exceptions={url:[],regex:[]},t.theme="detect",t.popupServices=["youtube","tiktok","imgur","reddit","quora","translate","maps"],t.fetchInstances="github",t.redirectOnlyInIncognito=!1,t={...t,...oe},t}var he={redirect:se,redirectAsync:async function(e,t,n,a,r,s){return await ne(),se(e,t,n,a,r,s)},computeServiceFrontend:async function(e){const t=await V.getConfig(),n=await V.getOptions();for(const a in t.services){if(re(a,e,t,n))return{service:a,frontend:null};for(const r in t.services[a].frontends){const s=ae(a,r,n,t).findIndex((t=>e.href.startsWith(t)));if(s>=0)return{service:a,frontend:r}}}},reverse:ce,initDefaults:function(){return new Promise((e=>{browser.storage.local.clear((async()=>{te=await ie(),browser.storage.local.set({options:te},(()=>e()))}))}))},processUpdate:function(e){return new Promise((async t=>{const n=await V.getConfig();let a=e??await V.getOptions();const r=await ie();for(const e in a)if(e in r){if("object"==typeof e&&null!==e)for(const t in a[e])t in r[e]||delete a[e][t]}else delete a[e];a.popupServices=a.popupServices.filter((e=>e in n.services));for(const[e,t]of Object.entries(r))e in a||(a[e]=t);for(const[e,t]of Object.entries(n.services)){a[e].frontend in t.frontends||(a[e]=t.options);for(const n in t.options)n in a[e]||(a[e][n]=t.options[n])}browser.storage.local.clear((()=>browser.storage.local.set({options:a},(()=>t()))))}))},copyRaw:async function(e){const t=await ce(e);if(t)if(K){var n=document.createElement("textarea");n.textContent=t,document.body.appendChild(n),n.select(),document.execCommand("copy"),n.blur(),document.body.removeChild(n)}else navigator.clipboard.writeText(t)},switchInstance:function(e,t){return new Promise((async n=>{let a=await V.getOptions(),r=await V.getConfig();if(V.protocolHost(e),t){const r=a[a[t].frontend];if(void 0!==r){const t=V.getNextInstance(e.origin,r);if(t)return n(`${t}${e.pathname}${e.search}`)}}else for(const t in r.services){let r=a[a[t].frontend];if(void 0===r)continue;const s=r.findIndex((t=>e.href.startsWith(t)));if(s<0)continue;if(r.splice(s,1),0===r.length)return n();const c=V.getNextInstance(e.origin,r);if(c)return n(`${c}${e.pathname}${e.search}`)}n()}))},isException:function(e){if(!te)return!1;if(!te.exceptions)return!1;let t=te.exceptions;if(t&&e){if(t.url)for(let n of t.url)if(n=new URL(n),n=n.href.replace(/^http:\/\//,"https://"),n==e.href)return!0;if(t.regex)for(const n of t.regex)if(new RegExp(n).test(e.href))return!0}return!1}};const ue=[];function pe(t,n=e){let a;const r=new Set;function s(e){if(c(t,e)&&(t=e,a)){const e=!ue.length;for(const e of r)e[1](),ue.push(e,t);if(e){for(let e=0;e<ue.length;e+=2)ue[e][0](ue[e+1]);ue.length=0}}}return{set:s,update:function(e){s(e(t))},subscribe:function(c,o=e){const i=[c,o];return r.add(i),1===r.size&&(a=n(s)||e),c(t),()=>{r.delete(i),0===r.size&&a&&(a(),a=null)}}}}const le=pe(null),me=pe(null),$e=pe("general");function de(e){let n,a,r,s;const c=e[3].default,i=function(e,t,n,a){if(e){const r=o(e,t,n,a);return e[0](r)}}(c,e,e[2],null);let h=[e[0],e[1]],u={};for(let e=0;e<h.length;e+=1)u=t(u,h[e]);return{c(){n=m("button"),i&&i.c(),w(n,u),v(n,"svelte-efu498",!0)},m(t,c){p(t,n,c),i&&i.m(n,null),n.autofocus&&n.focus(),a=!0,r||(s=function(e,t,n,a){return e.addEventListener(t,n,a),()=>e.removeEventListener(t,n,a)}(n,"click",e[4]),r=!0)},p(e,[t]){i&&i.p&&(!a||4&t)&&function(e,t,n,a,r,s){if(r){const c=o(t,n,a,s);e.p(c,r)}}(i,c,e,e[2],a?function(e,t,n,a){if(e[2]&&a){const r=e[2](a(n));if(void 0===t.dirty)return r;if("object"==typeof r){const e=[],n=Math.max(t.dirty.length,r.length);for(let a=0;a<n;a+=1)e[a]=t.dirty[a]|r[a];return e}return t.dirty|r}return t.dirty}(c,e[2],t,null):function(e){if(e.ctx.length>32){const t=[],n=e.ctx.length/32;for(let e=0;e<n;e++)t[e]=-1;return t}return-1}(e[2]),null),w(n,u=D(h,[1&t&&e[0],2&t&&e[1]])),v(n,"svelte-efu498",!0)},i(e){a||(A(i,e),a=!0)},o(e){N(i,e),a=!1},d(e){e&&l(n),i&&i.d(e),r=!1,s()}}}function fe(e,n,a){const r=[];let s=h(n,r),{$$slots:c={},$$scope:o}=n;return e.$$set=e=>{a(1,n=t(t({},n),i(e))),a(0,s=h(n,r)),"$$scope"in e&&a(2,o=e.$$scope)},n=i(n),[s,n,o,c,function(t){_.call(this,e,t)}]}class ge extends X{constructor(e){super(),F(this,e,fe,de,c,{})}}function be(n){let a,r,s=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"20px"},{viewBox:"0 -960 960 960"},{width:"20px"},{fill:"currentColor"}],c={};for(let e=0;e<s.length;e+=1)c=t(c,s[e]);return{c(){a=$("svg"),r=$("path"),g(r,"d","M144-144v-178l342-342-54-53 51-51 72 72 110.22-110.22q4.45-4.45 11.11-7.11Q683-816 691-816t15 2.5q7 2.5 12 7.5l87 88q4.55 5.83 7.27 12.64 2.73 6.8 2.73 14.58t-2.66 14.44q-2.67 6.66-7.11 11.1L696-556l72 73-51 51-54-54-341 342H144Zm72-72h76l320-320-75-76-321 320v76Zm424-385 90-91-38-39-91 90 39 40Zm0 0-39-40 39 40Z"),y(a,c)},m(e,t){p(e,a,t),u(a,r)},p(e,[t]){y(a,c=D(s,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"20px"},{viewBox:"0 -960 960 960"},{width:"20px"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&l(a)}}}function we(e,n,a){const r=[];let s=h(n,r);return e.$$set=e=>{n=t(t({},n),i(e)),a(0,s=h(n,r))},[s]}class ye extends X{constructor(e){super(),F(this,e,we,be,c,{})}}function ve(t){let n;return{c(){n=m("p"),n.textContent="Loading..."},m(e,t){p(e,n,t)},p:e,i:e,o:e,d(e){e&&l(n)}}}function xe(e){let t,n,a,r;const s=[Pe,ke],c=[];return~(n=function(e){return"disabled"==e[5].get("message")?0:"no_instance"==e[5].get("message")?1:-1}(e))&&(a=c[n]=s[n](e)),{c(){t=m("div"),a&&a.c(),g(t,"class","main svelte-14zc8ex"),g(t,"dir","auto"),g(t,"style",e[2])},m(e,a){p(e,t,a),~n&&c[n].m(t,null),r=!0},p(e,n){a&&a.p(e,n),(!r||4&n)&&g(t,"style",e[2])},i(e){r||(A(a),r=!0)},o(e){N(a),r=!1},d(e){e&&l(t),~n&&c[n].d()}}}function ke(e){let t,n,a,r,s;return r=new ge({props:{disabled:e[3],$$slots:{default:[_e]},$$scope:{ctx:e}}}),r.$on("click",e[10]),{c(){t=m("div"),n=m("h1"),n.textContent="You have no instance selected for this frontend",a=f(),j(r.$$.fragment)},m(e,c){p(e,t,c),u(t,n),u(t,a),Z(r,t,null),s=!0},p(e,t){const n={};8&t&&(n.disabled=e[3]),16384&t&&(n.$$scope={dirty:t,ctx:e}),r.$set(n)},i(e){s||(A(r.$$.fragment,e),s=!0)},o(e){N(r.$$.fragment,e),s=!1},d(e){e&&l(t),G(r)}}}function Pe(e){let t,n,a,r,s;return r=new ge({props:{$$slots:{default:[Ie]},$$scope:{ctx:e}}}),r.$on("click",e[9]),{c(){t=m("div"),n=m("h1"),n.textContent="You disabled redirections for this service",a=f(),j(r.$$.fragment)},m(e,c){p(e,t,c),u(t,n),u(t,a),Z(r,t,null),s=!0},p(e,t){const n={};16384&t&&(n.$$scope={dirty:t,ctx:e}),r.$set(n)},i(e){s||(A(r.$$.fragment,e),s=!0)},o(e){N(r.$$.fragment,e),s=!1},d(e){e&&l(t),G(r)}}}function _e(t){let n,a,r,s,c=(t[4].i18n.getMessage("autoPickInstance")||"Auto Pick Instance")+"";return n=new ye({props:{class:"margin margin_"+document.body.dir}}),{c(){j(n.$$.fragment),a=f(),r=d(c)},m(e,t){Z(n,e,t),p(e,a,t),p(e,r,t),s=!0},p:e,i(e){s||(A(n.$$.fragment,e),s=!0)},o(e){N(n.$$.fragment,e),s=!1},d(e){G(n,e),e&&l(a),e&&l(r)}}}function Ie(t){let n,a=(t[4].i18n.getMessage("enable")||"Enable")+"";return{c(){n=d(a)},m(e,t){p(e,n,t)},p:e,d(e){e&&l(n)}}}function We(e){let t,n,a,s;const c=[xe,ve],o=[];function i(e,t){return e[0]&&e[1]?0:1}return t=i(e),n=o[t]=c[t](e),{c(){n.c(),a=d("")},m(e,n){o[t].m(e,n),p(e,a,n),s=!0},p(e,[s]){let h=t;t=i(e),t===h?o[t].p(e,s):(M={r:0,c:[],p:M},N(o[h],1,1,(()=>{o[h]=null})),M.r||r(M.c),M=M.p,n=o[t],n?n.p(e,s):(n=o[t]=c[t](e),n.c()),A(n,1),n.m(a.parentNode,a))},i(e){s||(A(n),s=!0)},o(e){N(n),s=!1},d(e){o[t].d(e),e&&l(a)}}}function Ce(e,t,n){const a=window.browser||window.chrome;let r;const s=le.subscribe((e=>{e&&(n(0,r=e),a.storage.local.set({options:e}))}));let c;const o=me.subscribe((e=>n(1,c=e)));var i;let h;i=()=>{s(),o()},P().$$.on_destroy.push(i),function(e){P().$$.on_mount.push(e)}((async()=>{let e=await V.getOptions();e||(await he.initDefaults(),e=await V.getOptions()),le.set(e),me.set(await V.getConfig())})),$e.subscribe((e=>e));let u=!1;const p=new URLSearchParams(window.location.search),l=new URL(p.get("url"));async function m(){n(3,u=!0);const e=p.get("frontend"),t=(await V.getList(r))[e].clearnet,a=await V.autoPickInstance(t);r[e].push(a),le.set(r),n(3,u=!1)}async function $(){const e=await he.redirectAsync(l,"main_frame",null,null,!1,!0);a.tabs.update({url:e})}return e.$$.update=()=>{1&e.$$.dirty&&r&&n(2,h=V.style(r,window))},[r,c,h,u,a,p,l,m,$,async()=>{const{service:e}=await he.computeServiceFrontend(l);n(0,r[e].enabled=!0,r),le.set(r),await $()},async()=>{await m(),await $()}]}const qe=new class extends X{constructor(e){super(),F(this,e,Ce,We,c,{})}}({target:document.body});return qe}(); +//# sourceMappingURL=bundle.js.map diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.js.map b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/build/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundle.js","sources":["../../../../node_modules/svelte/internal/index.mjs","../../../assets/javascripts/utils.js","../../../assets/javascripts/services.js","../../../../node_modules/svelte/store/index.mjs","../../messages_src/stores.js","../../components/Button.svelte","../../icons/AutoPickIcon.svelte","../../messages_src/App.svelte","../../messages_src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\nfunction split_css_unit(value) {\n const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n constructor(options) {\n this.options = options;\n this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n }\n observe(element, listener) {\n this._listeners.set(element, listener);\n this._getObserver().observe(element, this.options);\n return () => {\n this._listeners.delete(element);\n this._observer.unobserve(element); // this line can probably be removed\n };\n }\n _getObserver() {\n var _a;\n return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n var _a;\n for (const entry of entries) {\n ResizeObserverSingleton.entries.set(entry.target, entry);\n (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n }\n }));\n }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n let children = target.childNodes;\n // If target is <head>, there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n return style.sheet;\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction comment(content) {\n return document.createComment(content);\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_immediate_propagation(fn) {\n return function (event) {\n event.stopImmediatePropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data_map(node, data_map) {\n Object.keys(data_map).forEach((key) => {\n set_custom_element_data(node, key, data_map[key]);\n });\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction set_dynamic_element_data(tag) {\n return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction init_binding_group(group) {\n let _inputs;\n return {\n /* push */ p(...inputs) {\n _inputs = inputs;\n _inputs.forEach(input => group.push(input));\n },\n /* remove */ r() {\n _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n }\n };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n let _group = get_binding_group(group);\n let _inputs;\n function get_binding_group(group) {\n for (let i = 0; i < indexes.length; i++) {\n group = group[indexes[i]] = group[indexes[i]] || [];\n }\n return group;\n }\n function push() {\n _inputs.forEach(input => _group.push(input));\n }\n function remove() {\n _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n }\n return {\n /* update */ u(new_indexes) {\n indexes = new_indexes;\n const new_group = get_binding_group(group);\n if (new_group !== _group) {\n remove();\n _group = new_group;\n push();\n }\n },\n /* push */ p(...inputs) {\n _inputs = inputs;\n push();\n },\n /* remove */ r: remove\n };\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n node.data = '' + data;\n return undefined;\n }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable(text, data);\n }\n else {\n set_data(text, data);\n }\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value == null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value, mounting) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n if (!mounting || value !== undefined) {\n select.selectedIndex = -1; // no option should be selected\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked');\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n // see https://github.com/sveltejs/svelte/issues/4233\n fn();\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n const result = [];\n let started = 0;\n for (const node of head.childNodes) {\n if (node.nodeType === 8 /* comment node */) {\n const comment = node.textContent.trim();\n if (comment === `HEAD_${nodeId}_END`) {\n started -= 1;\n result.push(node);\n }\n else if (comment === `HEAD_${nodeId}_START`) {\n started += 1;\n result.push(node);\n }\n }\n else if (started > 0) {\n result.push(node);\n }\n }\n return result;\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n /** #7364 target for <template> may be provided as #document-fragment(11) */\n else\n this.e = element((target.nodeType === 11 ? 'TEMPLATE' : target.nodeName));\n this.t = target.tagName !== 'TEMPLATE' ? target : target.content;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes, is_svg = false) {\n super(is_svg);\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\nfunction construct_svelte_component(component, props) {\n return new component(props);\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n managed_styles.set(doc, info);\n return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n if (!rules[name]) {\n rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n managed_styles.forEach(info => {\n const { ownerNode } = info.stylesheet;\n // there is no ownerNode if it runs on jsdom.\n if (ownerNode)\n detach(ownerNode);\n });\n managed_styles.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs#run-time-svelte-beforeupdate\n */\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs#run-time-svelte-onmount\n */\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n */\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs#run-time-svelte-ondestroy\n */\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * https://svelte.dev/docs#run-time-svelte-createeventdispatcher\n */\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail, { cancelable = false } = {}) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail, { cancelable });\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n return !event.defaultPrevented;\n }\n return true;\n };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-setcontext\n */\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-getcontext\n */\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs#run-time-svelte-getallcontexts\n */\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-hascontext\n */\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nlet render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n// for afterUpdates called during the initial onMount, which are called in\n// reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n// dirty_components array and will cause a reentrant call to flush(). Because\n// the flush index is kept outside the function, the reentrant call will pick\n// up where the earlier call left off and go through all dirty components. The\n// current_component value is saved and restored so that the reentrant call will\n// not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n// callback called a second time; the seen_callbacks set, outside the flush()\n// function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n // Do not reenter flush while dirty components are updated, as this can\n // result in an infinite loop. Instead, let the inner flush handle it.\n // Reentrancy is ok afterwards for bindings etc.\n if (flushidx !== 0) {\n return;\n }\n const saved_component = current_component;\n do {\n // first, call beforeUpdate functions\n // and update components\n try {\n while (flushidx < dirty_components.length) {\n const component = dirty_components[flushidx];\n flushidx++;\n set_current_component(component);\n update(component.$$);\n }\n }\n catch (e) {\n // reset dirty state to not end up in a deadlocked state and then rethrow\n dirty_components.length = 0;\n flushidx = 0;\n throw e;\n }\n set_current_component(null);\n dirty_components.length = 0;\n flushidx = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n seen_callbacks.clear();\n set_current_component(saved_component);\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n */\nfunction flush_render_callbacks(fns) {\n const filtered = [];\n const targets = [];\n render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));\n targets.forEach((c) => c());\n render_callbacks = filtered;\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n else if (callback) {\n callback();\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n const options = { direction: 'in' };\n let config = fn(node, params, options);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config(options);\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n const options = { direction: 'out' };\n let config = fn(node, params, options);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n const options = { direction: 'both' };\n let config = fn(node, params, options);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n const updates = [];\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n // defer updates until all the DOM shuffling is done\n updates.push(() => block.p(child_ctx, dirty));\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n run_all(updates);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\nconst _boolean_attributes = [\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n];\n/**\n * List of HTML boolean attributes (e.g. `<input disabled>`).\n * Source: https://html.spec.whatwg.org/multipage/indices.html\n */\nconst boolean_attributes = new Set([..._boolean_attributes]);\n\n/** regex of all html void element names */\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n const attributes = Object.assign({}, ...args);\n if (attrs_to_add) {\n const classes_to_add = attrs_to_add.classes;\n const styles_to_add = attrs_to_add.styles;\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n if (styles_to_add) {\n if (attributes.style == null) {\n attributes.style = style_object_to_string(styles_to_add);\n }\n else {\n attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n }\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n const style_object = {};\n for (const individual_style of style_attribute.split(';')) {\n const colon_index = individual_style.indexOf(':');\n const name = individual_style.slice(0, colon_index).trim();\n const value = individual_style.slice(colon_index + 1).trim();\n if (!name)\n continue;\n style_object[name] = value;\n }\n for (const name in style_directive) {\n const value = style_directive[name];\n if (value) {\n style_object[name] = value;\n }\n else {\n delete style_object[name];\n }\n }\n return style_object;\n}\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n/**\n * Note: this method is performance sensitive and has been optimized\n * https://github.com/sveltejs/svelte/pull/5701\n */\nfunction escape(value, is_attr = false) {\n const str = String(value);\n const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;\n pattern.lastIndex = 0;\n let escaped = '';\n let last = 0;\n while (pattern.test(str)) {\n const i = pattern.lastIndex - 1;\n const ch = str[i];\n escaped += str.substring(last, i) + (ch === '&' ? '&amp;' : (ch === '\"' ? '&quot;' : '&lt;'));\n last = i + 1;\n }\n return escaped + str.substring(last);\n}\nfunction escape_attribute_value(value) {\n // keep booleans, null, and undefined for the sake of `spread`\n const should_escape = typeof value === 'string' || (value && typeof value === 'object');\n return should_escape ? escape(value, true) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules. Otherwise you may need to fix a <${name}>.`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n const assignment = (boolean && value === true) ? '' : `=\"${escape(value, true)}\"`;\n return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n return Object.keys(style_object)\n .filter(key => style_object[key])\n .map(key => `${key}: ${escape_attribute_value(style_object[key])};`)\n .join(' ');\n}\nfunction add_styles(style_object) {\n const styles = style_object_to_string(style_object);\n return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n // if the component was destroyed immediately\n // it will update the `$$.on_destroy` reference to `null`.\n // the destructured on_destroy may still reference to the old array\n if (component.$$.on_destroy) {\n component.$$.on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n flush_render_callbacks($$.after_update);\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: [],\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n if (has_stop_immediate_propagation)\n modifiers.push('stopImmediatePropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_contenteditable_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_maybe_contenteditable_dev(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable_dev(text, data);\n }\n else {\n set_data_dev(text, data);\n }\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nfunction validate_dynamic_element(tag) {\n const is_string = typeof tag === 'string';\n if (tag && !is_string) {\n throw new Error('<svelte:element> expects \"this\" attribute to be a string.');\n }\n}\nfunction validate_void_dynamic_element(tag) {\n if (tag && is_void(tag)) {\n console.warn(`<svelte:element this=\"${tag}\"> is self-closing and cannot have content.`);\n }\n}\nfunction construct_svelte_component_dev(component, props) {\n const error_message = 'this={...} of <svelte:component> should specify a Svelte component.';\n try {\n const instance = new component(props);\n if (!instance.$$ || !instance.$set || !instance.$on || !instance.$destroy) {\n throw new Error(error_message);\n }\n return instance;\n }\n catch (err) {\n const { message } = err;\n if (typeof message === 'string' && message.indexOf('is not a constructor') !== -1) {\n throw new Error(error_message);\n }\n else {\n throw err;\n }\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, ResizeObserverSingleton, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_iframe_resize_listener, add_location, add_render_callback, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_comment, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, comment, component_subscribe, compute_rest_props, compute_slots, construct_svelte_component, construct_svelte_component_dev, contenteditable_truthy_values, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, flush_render_callbacks, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, head_selector, identity, init, init_binding_group, init_binding_group_dynamic, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, resize_observer_border_box, resize_observer_content_box, resize_observer_device_pixel_content_box, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_custom_element_data_map, set_data, set_data_contenteditable, set_data_contenteditable_dev, set_data_dev, set_data_maybe_contenteditable, set_data_maybe_contenteditable_dev, set_dynamic_element_data, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, split_css_unit, spread, src_url_equal, start_hydrating, stop_immediate_propagation, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","window.browser = window.browser || window.chrome\n\n/**\n * @param {Array.<T>} instances\n * @returns {T}\n */\nfunction getRandomInstance(instances) {\n return instances[~~(instances.length * Math.random())]\n}\n\n/**\n * @param {string} currentInstanceUrl\n * @param {Array.<T>} instances\n * @returns {T}\n */\nfunction getNextInstance(currentInstanceUrl, instances) {\n const currentInstanceIndex = instances.indexOf(currentInstanceUrl)\n if (currentInstanceIndex === -1) return getRandomInstance(instances)\n const nextInstanceIndex = (currentInstanceIndex + 1) % instances.length\n return instances[nextInstanceIndex]\n}\n\n/**\n * @param {URL} url\n */\nfunction protocolHost(url) {\n const pathname = url.pathname.replace(/\\/$/, \"\")\n\n // workaround\n if (pathname == \"/TekstoLibre\" && url.host.endsWith(\"github.io\"))\n return `${url.protocol}//${url.host}${pathname.slice(0, -1)}`\n\n if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}${pathname}`\n\n return `${url.protocol}//${url.host}${pathname}`\n}\n\n/**\n * @typedef FrontendInfo\n * @prop {boolean} instanceList\n * @prop {string} name\n * @prop {string} url\n */\n\n/**\n * @typedef {Object} Service\n * @prop {Object.<string, FrontendInfo>} frontends\n * @prop {Object} options\n */\n\n/**\n * @typedef {Object} Config\n * @prop {Object.<string, Service>} services\n */\n\n/**\n * @returns {Promise<Config>}\n */\nfunction getConfig() {\n return new Promise(resolve => {\n fetch(\"/config.json\")\n .then(response => response.text())\n .then(json => {\n resolve(JSON.parse(json))\n return\n })\n })\n}\n\n/**\n * @typedef {Object} Option\n * @prop {string} frontend\n */\n\n/**\n * @returns {Promise<Object.<string, Option | string[]>>}\n */\nfunction getOptions() {\n return new Promise(resolve => browser.storage.local.get(\"options\", r => resolve(r.options)))\n}\n\nfunction getPingCache() {\n return new Promise(resolve => browser.storage.local.get(\"pingCache\", r => resolve(r.pingCache ?? {})))\n}\n\nfunction getBlacklist(options) {\n return new Promise(resolve => {\n let url\n if (options.fetchInstances == \"github\")\n url = \"https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json\"\n else if (options.fetchInstances == \"codeberg\")\n url = \"https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json\"\n else return resolve(\"disabled\")\n const http = new XMLHttpRequest()\n http.open(\"GET\", url, true)\n http.onreadystatechange = () => {\n if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) resolve(JSON.parse(http.responseText))\n }\n http.onerror = () => resolve()\n http.ontimeout = () => resolve()\n http.send(null)\n })\n}\n\nfunction getList(options) {\n return new Promise(resolve => {\n let url\n if (options.fetchInstances == \"github\")\n url = \"https://raw.githubusercontent.com/libredirect/instances/main/data.json\"\n else if (options.fetchInstances == \"codeberg\")\n url = \"https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json\"\n else return resolve(\"disabled\")\n const http = new XMLHttpRequest()\n http.open(\"GET\", url, true)\n http.onreadystatechange = () => {\n if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) return resolve(JSON.parse(http.responseText))\n }\n http.onerror = () => resolve()\n http.ontimeout = () => resolve()\n http.send(null)\n })\n}\n\n/**\n * @param {string} href\n */\nfunction pingOnce(href) {\n return new Promise(async resolve => {\n let started\n let http = new XMLHttpRequest()\n http.timeout = 5000\n http.ontimeout = () => resolve(5000)\n http.onerror = () => resolve()\n http.onreadystatechange = () => {\n if (http.readyState == 2) {\n if (http.status == 200) {\n let ended = new Date().getTime()\n http.abort()\n resolve(ended - started)\n } else {\n resolve(5000 + http.status)\n }\n }\n }\n http.open(\"GET\", `${href}?_=${new Date().getTime()}`, true)\n started = new Date().getTime()\n http.send(null)\n })\n}\n\n/**\n * @param {string} href\n */\nfunction ping(href) {\n return new Promise(async resolve => {\n let average = 0\n let time\n for (let i = 0; i < 3; i++) {\n time = await pingOnce(href)\n if (i == 0) continue\n if (time >= 5000) {\n resolve(time)\n return\n }\n average += time\n }\n average = parseInt(average / 3)\n resolve(average)\n })\n}\n\nfunction addressToLatLng(address) {\n const http = new XMLHttpRequest()\n http.open(\n \"GET\",\n `https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(address)}&format=json&limit=1`,\n false\n )\n http.send()\n if (http.status == 200) {\n const json = JSON.parse(http.responseText)[0]\n if (json) {\n return {\n coordinate: `${json.lat},${json.lon}`,\n boundingbox: `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}`,\n }\n }\n return {}\n }\n}\n\nfunction getQuery(url) {\n let query = \"\"\n if (url.searchParams.has(\"q\")) query = url.searchParams.get(\"q\")\n else if (url.searchParams.has(\"query\")) query = url.searchParams.has(\"query\")\n return query\n}\nfunction prefsEncoded(prefs) {\n return new URLSearchParams(prefs).toString()\n}\n\nfunction convertMapCentre(url) {\n let [lat, lon, zoom] = [null, null, null]\n const reg = url.pathname.match(/@(-?\\d[0-9.]*),(-?\\d[0-9.]*),(\\d{1,2})[.z]/)\n if (reg) {\n ;[, lon, lat, zoom] = reg\n } else if (url.searchParams.has(\"center\")) {\n // Set map centre if present\n ;[lat, lon] = url.searchParams.get(\"center\").split(\",\")\n zoom = url.searchParams.get(\"zoom\") ?? \"17\"\n }\n return { zoom, lon, lat }\n}\n\nexport function randomInstances(clearnet, n) {\n let instances = []\n if (n > clearnet.length) n = clearnet.length\n for (let i = 0; i < n; i++) {\n const randomNumber = Math.floor(Math.random() * clearnet.length)\n const randomInstance = clearnet[randomNumber]\n instances.push(randomInstance)\n }\n return instances\n}\n\nasync function autoPickInstance(clearnet, url) {\n if (url) {\n const i = clearnet.findIndex(instance => url.href.startsWith(instance))\n if (i >= 0) clearnet.splice(i, 1)\n }\n const random = randomInstances(clearnet, 5)\n const pings = await Promise.all([\n ...random.map(async instance => {\n return [instance, await ping(instance)]\n }),\n ])\n pings.sort((a, b) => a[1] - b[1])\n return pings[0][0]\n}\n\nexport function style(options, window) {\n const vars = cssVariables(options, window)\n return `--text: ${vars.text};\n --bg-main: ${vars.bgMain};\n --bg-secondary: ${vars.bgSecondary};\n --active: ${vars.active};\n --danger: ${vars.danger};\n --light-grey: ${vars.lightGrey};`\n}\n\nfunction cssVariables(options, window) {\n const dark = {\n text: \"#fff\",\n bgMain: \"#121212\",\n bgSecondary: \"#202020\",\n active: \"#fbc117\",\n danger: \"#f04141\",\n lightGrey: \"#c3c3c3\",\n }\n\n const light = {\n text: \"black\",\n bgMain: \"white\",\n bgSecondary: \"#e4e4e4\",\n active: \"#fb9817\",\n danger: \"#f04141\",\n lightGrey: \"#c3c3c3\",\n }\n if (options.theme == \"dark\") {\n return dark\n } else if (options.theme == \"light\") {\n return light\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n return dark\n } else {\n return light\n }\n}\n\nexport default {\n getRandomInstance,\n getNextInstance,\n protocolHost,\n getList,\n getBlacklist,\n getConfig,\n getOptions,\n getPingCache,\n ping,\n addressToLatLng,\n getQuery,\n prefsEncoded,\n convertMapCentre,\n randomInstances,\n style,\n autoPickInstance,\n}\n","import utils from \"./utils.js\"\n\nconst isChrome = browser.runtime.getBrowserInfo === undefined\nwindow.browser = window.browser || window.chrome\n\nlet config, options\n\nasync function init() {\n options = await utils.getOptions()\n config = await utils.getConfig()\n}\n\ninit()\nbrowser.storage.onChanged.addListener(init)\n\nfunction all(service, frontend, options, config) {\n let instances = []\n if (!frontend) {\n for (const frontend in config.services[service].frontends) {\n if (options[frontend]) {\n instances.push(...options[frontend])\n }\n }\n } else if (options[frontend]) {\n instances = options[frontend]\n }\n return instances\n}\n\n/**\n * @param {string} service\n * @param {URL} url\n * @param {{}} config\n * @param {{}} options\n * @param {string} frontend\n */\nfunction regexArray(service, url, config, options, frontend) {\n let targetList = config.services[service].targets\n if (frontend) {\n if (\n \"excludeTargets\" in config.services[service].frontends[frontend] &&\n (service !== \"search\" || !options[\"search\"].redirectGoogle)\n ) {\n targetList = targetList.filter(\n val => !config.services[service].frontends[frontend].excludeTargets.includes(targetList.indexOf(val))\n )\n }\n if (service === \"twitter\" && options[\"twitter\"].disableTwimg) {\n targetList = targetList.splice(2)\n }\n }\n for (const targetString in targetList) {\n const target = new RegExp(targetList[targetString])\n if (target.test(url.href)) return true\n }\n return false\n}\n\n/**\n * @param {URL} url\n * @param {string} frontend\n * @param {string} randomInstance\n * @param {string} type\n * @returns {undefined|string}\n */\nfunction rewrite(url, originUrl, frontend, randomInstance, type) {\n switch (frontend) {\n case \"hyperpipe\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}${url.pathname}${url.search}`.replace(/\\/search\\?q=.*/, searchQuery =>\n searchQuery.replace(\"?q=\", \"/\")\n )\n case \"searx\":\n case \"searxng\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}/${url.search}`\n case \"websurfx\":\n case \"whoogle\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}/search${url.search}`\n case \"4get\": {\n const s = url.searchParams.get(\"q\")\n if (s !== null) return `${randomInstance}/web?s=${encodeURIComponent(s)}`\n return randomInstance\n }\n case \"librey\":\n for (const key in url.searchParams.keys()) if (key != \"q\") url.searchParams.delete(key)\n return `${randomInstance}/search.php${url.search}`\n case \"yattee\":\n url.searchParams.delete(\"si\")\n return url.href.replace(/^https?:\\/{2}/, \"yattee://\")\n case \"freetube\":\n url.searchParams.delete(\"si\")\n return \"freetube://\" + url.href\n case \"freetubePwa\":\n url.searchParams.delete(\"si\")\n return \"freetube://\" + url.href\n case \"poketube\": {\n url.searchParams.delete(\"si\")\n if (url.pathname.startsWith(\"/channel\")) {\n const reg = /\\/channel\\/(.*)\\/?$/.exec(url.pathname)\n if (reg) {\n const id = reg[1]\n return `${randomInstance}/channel?id=${id}${url.search}`\n }\n }\n if (/\\/@[a-z]+\\//.exec(url.pathname)) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"small\":\n case \"libMedium\":\n case \"freedium\":\n case \"scribe\": {\n const regex = url.hostname.match(/^(link|cdn-images-\\d+|.*)\\.medium\\.com/)\n if (regex && regex.length > 1) {\n const subdomain = regex[1]\n if (subdomain != \"link\" || !subdomain.startsWith(\"cdn-images\")) {\n return `${randomInstance}/@${subdomain}${url.pathname}${url.search}`\n }\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"translite\":\n case \"simplyTranslate\":\n return `${randomInstance}/${url.search}`\n case \"send\":\n case \"mozhi\":\n return randomInstance\n case \"libreTranslate\":\n return `${randomInstance}/${url.search.replace(\"sl\", \"source\").replace(\"tl\", \"target\").replace(\"text\", \"q\")}`\n case \"osm\": {\n if (originUrl && originUrl.host === \"earth.google.com\") return randomInstance\n\n let prefs = { layers: \"mapnik\" }\n\n let mapCentre = \"#\"\n const mapCentreData = utils.convertMapCentre(url)\n if (mapCentreData.zoom && mapCentreData.lon && mapCentreData.lat) {\n mapCentre = `#map=${mapCentreData.zoom}/${mapCentreData.lon}/${mapCentreData.lat}`\n }\n\n if (url.pathname.includes(\"/embed\")) {\n // https://www.google.com/maps/embed/v1/place?key=AIzaSyD4iE2xVSpkLLOXoyqT-RuPwURN3ddScAI&q=Eiffel+Tower,Paris+France\n const query = utils.getQuery(url)\n let { coordinate, boundingbox } = utils.addressToLatLng(query)\n prefs.bbox = boundingbox\n prefs.marker = coordinate\n return `${randomInstance}/export/embed.html?${utils.prefsEncoded(prefs)}`\n }\n\n if (url.pathname.includes(\"/dir\")) {\n if (url.searchParams.has(\"travelmode\")) {\n const travelModes = {\n driving: \"fossgis_osrm_car\",\n walking: \"fossgis_osrm_foot\",\n bicycling: \"fossgis_osrm_bike\",\n transit: \"fossgis_osrm_car\", // not implemented on OSM, default to car.\n }\n prefs.engine = travelModes[url.searchParams.get(\"travelmode\")]\n }\n const regex1 = /\\/dir\\/([^@/]+)\\/([^@/]+)\\/@-?\\d[0-9.]*,-?\\d[0-9.]*,\\d{1,2}[.z]/.exec(url.pathname)\n const regex2 = /\\/dir\\/([^@/]+)\\//.exec(url.pathname)\n if (regex1) {\n // https://www.google.com/maps/dir/92+Rue+Moncey,+69003+Lyon,+France/M%C3%A9dip%C3%B4le+Lyon-Villeurbanne/@45.760254,4.8486298,13z?travelmode=bicycling\n const origin = utils.addressToLatLng(decodeURIComponent(regex1[1])).coordinate ?? \"\"\n const destination = utils.addressToLatLng(decodeURIComponent(regex1[2])).coordinate ?? \"\"\n prefs.route = `${origin};${destination}`\n } else if (regex2) {\n // https://www.google.com/maps/dir/92+Rue+Moncey,+69003+Lyon,+France/@45.760254,4.8486298,13z?travelmode=bicycling\n const origin = utils.addressToLatLng(decodeURIComponent(regex2[1])).coordinate ?? \"\"\n prefs.route = `${origin};`\n } else {\n // https://www.google.com/maps/dir/?api=1&origin=Space+Needle+Seattle+WA&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling\n const origin = utils.addressToLatLng(url.searchParams.get(\"origin\")).coordinate ?? \"\"\n const destination = utils.addressToLatLng(url.searchParams.get(\"destination\")).coordinate ?? \"\"\n prefs.route = `${origin};${destination}`\n }\n return `${randomInstance}/directions?${utils.prefsEncoded(prefs)}${mapCentre}`\n }\n\n const placeRegex = /\\/place\\/(.*?)\\//\n if (url.pathname.match(placeRegex)) {\n // https://www.google.com/maps/place/H%C3%B4tel+de+Londres+Eiffel/@40.9845265,28.7081268,14z\n const query = url.pathname.match(placeRegex)[1]\n return `${randomInstance}/search?query=${query}${mapCentre}`\n }\n\n if (url.searchParams.has(\"ll\")) {\n // https://maps.google.com/?ll=38.882147,-76.99017\n const [mlat, mlon] = url.searchParams.get(\"ll\").split(\",\")\n return `${randomInstance}/search?query=${mlat}%2C${mlon}`\n }\n\n if (url.searchParams.has(\"viewpoint\")) {\n // https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=48.857832,2.295226&heading=-45&pitch=38&fov=80\n const [mlat, mlon] = url.searchParams.get(\"viewpoint\").split(\",\")\n return `${randomInstance}/search?query=${mlat}%2C${mlon}`\n }\n\n const query = utils.getQuery(url)\n if (query) return `${randomInstance}/search?query=\"${query}${mapCentre}&${utils.prefsEncoded(prefs)}`\n return `${randomInstance}/${mapCentre}&${utils.prefsEncoded(prefs)}`\n }\n case \"breezeWiki\": {\n let wiki,\n urlpath = \"\"\n if (url.hostname.match(/^[a-zA-Z0-9-]+\\.(?:fandom|wikia)\\.com/)) {\n wiki = url.hostname.match(/^[a-zA-Z0-9-]+(?=\\.(?:fandom|wikia)\\.com)/)\n if (wiki == \"www\" || !wiki) wiki = \"\"\n else wiki = `/${wiki}`\n urlpath = url.pathname\n } else {\n wiki = url.pathname.match(/(?<=wiki\\/w:c:)[a-zA-Z0-9-]+(?=:)/)\n if (!wiki) wiki = \"\"\n else {\n wiki = \"/\" + wiki + \"/wiki/\"\n urlpath = url.pathname.match(/(?<=wiki\\/w:c:[a-zA-Z0-9-]+:).+/)\n }\n }\n if (url.href.search(/Special:Search\\?query/) > -1) {\n return `${randomInstance}${wiki}${urlpath}${url.search}`\n .replace(/Special:Search\\?query/, \"search?q\")\n .replace(/\\/wiki/, \"\")\n }\n return `${randomInstance}${wiki}${urlpath}${url.search}`\n }\n case \"rimgo\":\n if (url.href.search(/^https?:\\/{2}(?:[im]\\.)?stack\\./) > -1)\n return `${randomInstance}/stack${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"redlib\":\n case \"libreddit\": {\n const subdomain = url.hostname.match(/^(?:((?:external-)?preview|i)\\.)?redd\\.it/)\n if (!subdomain) return `${randomInstance}${url.pathname}${url.search}`\n switch (subdomain[1]) {\n case \"preview\":\n return `${randomInstance}/preview/pre${url.pathname}${url.search}`\n case \"external-preview\":\n return `${randomInstance}/preview/external-pre${url.pathname}${url.search}`\n case \"i\":\n return `${randomInstance}/img${url.pathname}`\n }\n return `${randomInstance}/comments${url.pathname}`\n }\n case \"teddit\":\n if (/^(?:(?:external-)?preview|i)\\.redd\\.it/.test(url.hostname)) {\n if (url.search == \"\") return `${randomInstance}${url.pathname}?teddit_proxy=${url.hostname}`\n else return `${randomInstance}${url.pathname}${url.search}&teddit_proxy=${url.hostname}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n case \"troddit\":\n case \"eddrit\":\n if (/^(?:(?:external-)?preview|i)\\.redd\\.it/.test(url.hostname)) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"neuters\": {\n const p = url.pathname\n if (p.startsWith(\"/article/\") || p.startsWith(\"/pf/\") || p.startsWith(\"/arc/\") || p.startsWith(\"/resizer/\")) {\n return randomInstance\n }\n return `${randomInstance}${p}`\n }\n case \"dumb\":\n if (url.pathname.endsWith(\"-lyrics\")) return `${randomInstance}${url.pathname}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"intellectual\":\n return `${randomInstance}${url.pathname}${url.search}`\n case \"ruralDictionary\":\n if (!url.pathname.includes(\"/define.php\") && !url.pathname.includes(\"/random.php\") && url.pathname != \"/\")\n return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"anonymousOverflow\": {\n if (url.hostname == \"stackoverflow.com\") {\n const threadID = /^\\/a\\/(\\d+)\\/?/.exec(url.pathname)\n if (threadID) return `${randomInstance}/questions/${threadID[1]}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n if (url.pathname == \"/\" || url.pathname == \"\") {\n // https://stackexchange.com or https://superuser.com\n return `${randomInstance}${url.pathname}${url.search}`\n }\n const regex = url.href.match(/https?:\\/{2}(?:([a-zA-Z0-9-]+)\\.(meta\\.)?)?stackexchange\\.com\\//)\n if (regex && regex.length > 1) {\n if (regex[2]) {\n return `${randomInstance}/exchange/${url.hostname}${url.pathname}${url.search}`\n }\n const subdomain = regex[1]\n return `${randomInstance}/exchange/${subdomain}${url.pathname}${url.search}`\n }\n const notExchangeRegex = url.hostname.match(\n /(?:[a-zA-Z]+\\.)?(?:askubuntu\\.com|mathoverflow\\.net|serverfault\\.com|stackapps\\.com|superuser\\.com|stackoverflow\\.com)/\n )\n if (notExchangeRegex) {\n return `${randomInstance}/exchange/${notExchangeRegex[0]}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"biblioReads\":\n return `${randomInstance}${url.pathname}${url.search}`\n case \"wikimore\": {\n let hostSplit = url.host.split(\".\")\n // wikiless doesn't have mobile view support yet\n if (hostSplit[0] != \"wikipedia\" && hostSplit[0] != \"www\") {\n const lang = url.hostname.split(\".\")[0]\n return `${randomInstance}/wiki/${lang}${url.pathname}${url.search}${url.hash}`\n }\n return `${randomInstance}${url.pathname}${url.search}${url.hash}`\n }\n case \"wikiless\": {\n let hostSplit = url.host.split(\".\")\n // wikiless doesn't have mobile view support yet\n if (hostSplit[0] != \"wikipedia\" && hostSplit[0] != \"www\") {\n if (hostSplit[0] == \"m\") url.searchParams.append(\"mobileaction\", \"toggle_view_mobile\")\n else url.searchParams.append(\"lang\", hostSplit[0])\n if (hostSplit[1] == \"m\") url.searchParams.append(\"mobileaction\", \"toggle_view_mobile\")\n }\n return `${randomInstance}${url.pathname}${url.search}${url.hash}`\n }\n case \"offtiktok\":\n case \"proxiTok\":\n if (url.pathname.startsWith(\"/email\")) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"waybackClassic\": {\n const regex = /^\\/\\web\\/(?:[0-9]+)?\\*\\/(.*)/.exec(url.pathname)\n if (regex) {\n const link = regex[1]\n return `${randomInstance}/cgi-bin/history.cgi?utf8=✓&q=${encodeURIComponent(link)}`\n }\n const regex2 = /(^\\/\\web\\/([0-9]+)\\/.*)/.exec(url.pathname)\n if (regex2) {\n let link = regex2[1]\n link = link.replace(regex2[2], regex2[2] + \"if_\")\n return `https://web.archive.org${link}`\n }\n return\n }\n case \"gothub\":\n if (url.hostname == \"gist.github.com\") return `${randomInstance}/gist${url.pathname}${url.search}`\n if (url.hostname == \"raw.githubusercontent.com\") return `${randomInstance}/raw${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"mikuInvidious\":\n if (url.hostname == \"bilibili.com\" || url.hostname == \"www.bilibili.com\" || url.hostname == \"b23.tv\")\n return `${randomInstance}${url.pathname}${url.search}`\n if (url.hostname == \"space.bilibili.com\") return `${randomInstance}/space${url.pathname}${url.search}`\n case \"tent\": {\n if (url.hostname == \"bandcamp.com\" && url.pathname == \"/search\") {\n const query = url.searchParams.get(\"q\")\n return `${randomInstance}/search.php?query=${encodeURIComponent(query)}`\n }\n if (url.hostname.endsWith(\"bandcamp.com\")) {\n const regex = /^(.*)\\.bandcamp\\.com/.exec(url.hostname)\n const artist = regex[1]\n if (url.pathname == \"/\" || url.pathname == \"/music\") {\n return `${randomInstance}/artist.php?name=${artist}`\n } else {\n const regex = /^\\/(.*)\\/(.*)/.exec(url.pathname)\n if (regex) {\n const type = regex[1]\n const name = regex[2]\n return `${randomInstance}/release.php?artist=${artist}&type=${type}&name=${name}`\n }\n }\n }\n if (url.hostname == \"f4.bcbits.com\") {\n const regex = /\\/img\\/(.*)/.exec(url.pathname)\n const image = regex[1]\n return `${randomInstance}/image.php?file=${image}`\n }\n if (url.hostname == \"t4.bcbits.com\") {\n const regex = /\\/stream\\/(.*)\\/(.*)\\/(.*)/.exec(url.pathname)\n if (regex) {\n const directory = regex[1]\n const format = regex[2]\n const file = regex[3]\n const token = url.searchParams.get(\"token\")\n return `${randomInstance}/audio.php/?directory=${directory}&format=${format}&file=${file}&token=${encodeURIComponent(token)}`\n }\n }\n }\n case \"binternet\":\n if (url.hostname == \"i.pinimg.com\") return `${randomInstance}/image_proxy.php?url=${encodeURIComponent(url.href)}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"painterest\":\n if (url.hostname == \"i.pinimg.com\") return `${randomInstance}/_/proxy?url=${encodeURIComponent(url.href)}`\n const regex = /^\\/pin\\/[^\\/]+/.exec(url.pathname)\n if (regex) return `${randomInstance}${regex[0]}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"laboratory\": {\n let path = url.pathname\n if (path == \"/\") path = \"\"\n return `${randomInstance}/${url.hostname}${path}${url.search}`\n }\n case \"quetre\": {\n const regex = /([a-z]+)\\.quora\\.com/.exec(url.hostname)\n if (regex) {\n const lang = regex[1]\n url.searchParams.append(\"lang\", lang)\n return `${randomInstance}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"pixivViewer\":\n case \"liteXiv\":\n case \"pixivFe\": {\n const regex = /\\/[a-z]{1,3}\\/(.*)/.exec(url.pathname)\n if (regex) {\n const path = regex[1]\n return `${randomInstance}/${path}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"vixipy\": {\n const regex = /\\/[a-z]{1,3}\\/(.*)/.exec(url.pathname)\n if (regex) {\n let path = regex[1]\n if (path.startsWith(\"tags/\")) path = path.replace(/tags/, \"tag\")\n return `${randomInstance}/${path}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"invidious\": {\n // tracker\n url.searchParams.delete(\"si\")\n\n if (type == \"sub_frame\") url.searchParams.append(\"autoplay\", \"0\")\n\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch?v=${watch}&${url.search.substring(1)}`\n }\n if (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/redirect?\")) return url.href\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"freetubeMusic\": {\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `freetube://youtube.com/watch?v=${watch}`\n }\n return \"freetube://\" + url.href\n }\n case \"invidiousMusic\": {\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch?v=${watch}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"materialious\": {\n url.searchParams.delete(\"si\")\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch/${watch}${url.search.replace(\"?\", \"&\")}`\n }\n if (url.hostname.endsWith(\"youtube.com\")) {\n if (url.pathname.startsWith(\"/watch\")) {\n if (url.searchParams.has(\"v\")) {\n const watch = url.searchParams.get(\"v\")\n url.searchParams.delete(\"v\")\n return `${randomInstance}/watch/${watch}${url.search.replace(\"?\", \"&\")}`\n }\n return `${randomInstance}/watch/${url.search.replace(\"?\", \"&\")}`\n }\n if (url.pathname.startsWith(\"/results\")) {\n if (url.searchParams.has(\"search_query\")) {\n const search = url.searchParams.get(\"search_query\")\n url.searchParams.delete(\"search_query\")\n return `${randomInstance}/search/${search}${url.search.replace(\"?\", \"&\")}`\n }\n return `${randomInstance}/search/${url.search.replace(\"?\", \"&\")}`\n }\n if (url.pathname.startsWith(\"/redirect?\")) {\n return url.href\n }\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"libremdb\": {\n if (/\\/((?:name|title)\\/\\w+)\\/?$/.exec(url.pathname)) {\n return `${randomInstance}${url.pathname}${url.search}`\n }\n return randomInstance\n }\n case \"tuboYoutube\":\n url.searchParams.delete(\"si\")\n if (url.pathname.startsWith(\"/channel\")) return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}`\n if (url.pathname.startsWith(\"/watch\")) return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}`\n return randomInstance\n case \"tuboSoundcloud\":\n if (url.pathname == \"/\") return `${randomInstance}?kiosk?serviceId=1`\n if (url.pathname.match(/^\\/[^\\/]+(\\/$|$)/)) return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}`\n if (url.pathname.match(/^\\/[^\\/]+\\/[^\\/]+/)) return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}`\n return randomInstance\n case \"twineo\":\n case \"safetwitch\":\n if (url.hostname.startsWith(\"clips.\")) return `${randomInstance}/clip${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n\n case \"tekstoLibre\":\n return `${randomInstance}/?${url.pathname.slice(1)}`\n case \"skyview\":\n if (url.pathname == \"/\") return randomInstance\n return `${randomInstance}?url=${encodeURIComponent(url.href)}`\n case \"nitter\": {\n let search = new URLSearchParams(url.search)\n\n search.delete(\"ref_src\")\n search.delete(\"ref_url\")\n search.delete(\"s\") // type of device that shared the link\n search.delete(\"t\") // some sort of tracking ID\n\n search = search.toString()\n if (search !== \"\") search = `?${search}`\n\n if (url.host.split(\".\")[0] === \"pbs\" || url.host.split(\".\")[0] === \"video\") {\n try {\n const [, id, format, extra] = search.match(/(.*)\\?format=(.*)&(.*)/)\n const query = encodeURIComponent(`${id}.${format}?${extra}`)\n return `${randomInstance}/pic${url.pathname}${query}`\n } catch {\n return `${randomInstance}/pic${url.pathname}${search}`\n }\n }\n if (url.pathname.split(\"/\").includes(\"tweets\"))\n return `${randomInstance}${url.pathname.replace(\"/tweets\", \"\")}${search}`\n if (url.host == \"t.co\") return `${randomInstance}/t.co${url.pathname}`\n return `${randomInstance}${url.pathname}${search}#m`\n }\n case \"priviblur\": {\n if (url.hostname == \"www.tumblr.com\") return `${randomInstance}${url.pathname}${url.search}`\n if (url.hostname.startsWith(\"assets\")) return `${randomInstance}/tblr/assets${url.pathname}${url.search}`\n if (url.hostname.startsWith(\"static\")) return `${randomInstance}/tblr/static${url.pathname}${url.search}`\n\n const reg = /^([0-9]+)\\.media\\.tumblr\\.com/.exec(url.hostname) // *.media.tumblr.com\n if (reg) return `${randomInstance}/tblr/media/${reg[1]}${url.pathname}${url.search}`\n\n const blogregex = /^(?:www\\.)?([a-z\\d-]+)\\.tumblr\\.com/.exec(url.hostname) // <blog>.tumblr.com\n if (blogregex) {\n const blog_name = blogregex[1]\n // Under the <blog>.tumblr.com domain posts are under a /post path\n if (url.pathname.startsWith(\"/post\"))\n return `${randomInstance}/${blog_name}${url.pathname.slice(5)}${url.search}`\n else return `${randomInstance}/${blog_name}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"ultimateTab\":\n case \"freetar\":\n if (url.pathname.startsWith(\"/search.php\")) {\n url.searchParams.set(\"search_term\", url.searchParams.get(\"value\"))\n url.searchParams.delete(\"value\")\n url.searchParams.delete(\"search_type\")\n return `${randomInstance}/search${url.search}`\n }\n if (url.pathname.startsWith(\"/artist\")) return\n return `${randomInstance}${url.pathname}${url.search}`\n case \"ratAintTieba\":\n url.searchParams.delete(\"ie\")\n return `${randomInstance}${url.pathname}${url.search}`\n case \"shoelace\": {\n const reg = /^\\/(?:(?:(?:[^\\/])?\\/post)|t)\\/([^\\/])/.exec(url.pathname)\n if (reg) return `${randomInstance}/t/${reg[1]}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"skunkyArt\": {\n if (url.pathname.startsWith(\"/search\")) return `${randomInstance}${url.pathname}${url.search}&type=all`\n\n const artReg = /^\\/(.*?)\\/art\\/(.*)\\/?/.exec(url.pathname)\n if (artReg) return `${randomInstance}/post/${artReg[1]}/${artReg[2]}${url.search}`\n\n const userReg = /^\\/([^\\/]+)$/.exec(url.pathname)\n if (userReg) return `${randomInstance}/group_user?q=${userReg[1]}&type=about`\n\n const galleryReg = /^\\/(.*?)\\/gallery(\\/$|$)$/.exec(url.pathname)\n if (galleryReg) return `${randomInstance}/group_user?q=${galleryReg[1]}&type=gallery`\n\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"ytify\": {\n if (url.pathname.startsWith(\"/watch\"))\n return `${randomInstance}/?s=${encodeURIComponent(url.searchParams.get(\"v\"))}`\n\n const channelReg = /\\/channel\\/([^\\/]+)/.exec(url.pathname)\n if (channelReg) return `${randomInstance}/list?channel=${channelReg[1]}`\n\n if (url.pathname.startsWith(\"/playlist\"))\n return `${randomInstance}/list?playlists=${encodeURIComponent(url.searchParams.get(\"list\"))}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"koub\": {\n if (url.pathname.startsWith(\"/view/\") || url.pathname.startsWith(\"/stories/\")) {\n return `${randomInstance}${url.pathname}${url.search}`\n }\n const accountReg = /^\\/([^\\/]+)\\/?$/.exec(url.pathname)\n if (accountReg) return `${randomInstance}/account${url.pathname}${url.search}`\n return randomInstance\n }\n case \"duckDuckGoAiChat\":\n return \"https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=1\"\n\n case \"soundcloak\":\n if (url.pathname.startsWith(\"/feed\") || url.pathname.startsWith(\"/stream\")) {\n // this feature requires authentication and is unsupported, so just redirect to main page\n return randomInstance\n }\n\n if (url.pathname.startsWith(\"/search\")) {\n if (!url.search) {\n return randomInstance\n }\n\n let type = \"\"\n if (url.pathname.startsWith(\"/search/sounds\")) {\n type = \"tracks\"\n } else if (url.pathname.startsWith(\"/search/people\")) {\n type = \"users\"\n } else if (url.pathname.startsWith(\"/search/albums\") || url.pathname.startsWith(\"/search/sets\")) {\n type = \"playlists\"\n }\n\n if (type) {\n type = \"&type=\" + type\n } else {\n return randomInstance // fallback for unsupported search types (searching for anything for example)\n }\n\n return `${randomInstance}/search${url.search}${type}`\n }\n\n if (url.host == \"on.soundcloud.com\") {\n return `${randomInstance}/on${url.pathname}`\n }\n\n return `${randomInstance}${url.pathname}${url.search}`\n case \"piped\":\n case \"pipedMaterial\":\n case \"cloudtube\":\n case \"lightTube\":\n case \"viewtube\":\n url.searchParams.delete(\"si\")\n default:\n return `${randomInstance}${url.pathname}${url.search}`\n }\n}\n\n/**\n * @param {URL} url\n * @param {string} type\n * @param {URL} originUrl\n * @param {URL} documentUrl\n * @param {boolean} incognito\n * @param {boolean} forceRedirection\n * @returns {string | undefined}\n */\nfunction redirect(url, type, originUrl, documentUrl, incognito, forceRedirection) {\n if (type != \"main_frame\" && type != \"sub_frame\" && type != \"image\") return\n let randomInstance\n let frontend\n if (!forceRedirection && options.redirectOnlyInIncognito == true && !incognito) return\n for (const service in config.services) {\n if (!forceRedirection && !options[service].enabled) continue\n if (!forceRedirection && options[service].redirectOnlyInIncognito == true && !incognito) continue\n\n frontend = options[service].frontend\n\n if (\n config.services[service].frontends[frontend].desktopApp &&\n type != \"main_frame\" &&\n options[service].redirectType != \"main_frame\"\n )\n frontend = options[service].embedFrontend\n\n if (!regexArray(service, url, config, options, frontend)) {\n frontend = null\n continue\n }\n\n if (type != \"main_frame\" && documentUrl && options[service].redirectType == \"sub_frame\") {\n if (regexArray(service, documentUrl, config, options, frontend)) {\n return\n }\n }\n\n if (\n config.services[service].embeddable &&\n type != options[service].redirectType &&\n options[service].redirectType != \"both\"\n ) {\n if (options[service].unsupportedUrls == \"block\") return \"CANCEL\"\n return\n }\n\n let instanceList = options[frontend]\n if (instanceList === undefined) break // should not happen if settings are correct\n\n if (config.services[service].frontends[frontend].localhost && options[service].instance == \"localhost\") {\n randomInstance = `http://${frontend}.localhost:8080`\n } else if (instanceList.length === 0) {\n return `https://no-instance.libredirect.invalid?frontend=${encodeURIComponent(frontend)}&url=${encodeURIComponent(url.href)}`\n } else {\n randomInstance = utils.getRandomInstance(instanceList)\n }\n\n if (originUrl && instanceList.includes(originUrl.origin)) {\n if (type == \"main_frame\") return \"BYPASSTAB\"\n else return null\n }\n break\n }\n if (!frontend) return\n\n return rewrite(url, originUrl, frontend, randomInstance, type)\n}\n\n/**\n * @param {URL} url\n * @param {string} type\n * @param {URL} originUrl\n * @param {URL} documentUrl\n * @param {boolean} incognito\n * @param {boolean} forceRedirection\n * @returns {Promise<string | undefined>}\n */\nasync function redirectAsync(url, type, originUrl, documentUrl, incognito, forceRedirection) {\n await init()\n return redirect(url, type, originUrl, documentUrl, incognito, forceRedirection)\n}\n\n/**\n * @param {URL} url\n */\nasync function computeServiceFrontend(url) {\n const config = await utils.getConfig()\n const options = await utils.getOptions()\n for (const service in config.services) {\n if (regexArray(service, url, config, options)) {\n return { service, frontend: null }\n } else {\n for (const frontend in config.services[service].frontends) {\n const instances = all(service, frontend, options, config)\n const i = instances.findIndex(instance => url.href.startsWith(instance))\n if (i >= 0) {\n return { service, frontend }\n }\n }\n }\n }\n}\n\n/**\n * @param {URL} url\n * @param {string} customService\n */\nfunction switchInstance(url, customService) {\n return new Promise(async resolve => {\n let options = await utils.getOptions()\n let config = await utils.getConfig()\n\n const protocolHost = utils.protocolHost(url)\n if (customService) {\n const instancesList = options[options[customService].frontend]\n if (instancesList !== undefined) {\n const newInstance = utils.getNextInstance(url.origin, instancesList)\n if (newInstance) {\n return resolve(`${newInstance}${url.pathname}${url.search}`)\n }\n }\n } else {\n for (const service in config.services) {\n let instancesList = options[options[service].frontend]\n if (instancesList === undefined) continue\n const index = instancesList.findIndex(instance => url.href.startsWith(instance))\n if (index < 0) continue\n instancesList.splice(index, 1)\n if (instancesList.length === 0) return resolve()\n const newInstance = utils.getNextInstance(url.origin, instancesList)\n if (newInstance) {\n return resolve(`${newInstance}${url.pathname}${url.search}`)\n }\n }\n }\n resolve()\n })\n}\n\n/**\n * @param {URL} url\n */\nasync function reverse(url) {\n let options = await utils.getOptions()\n let config = await utils.getConfig()\n for (const service in config.services) {\n let frontend = options[service].frontend\n if (options[frontend] == undefined) continue\n if (\n options[frontend].findIndex(instance => url.href.startsWith(instance)) < 0 &&\n !url.href.startsWith(`http://${frontend}.localhost:8080`)\n )\n continue\n switch (service) {\n case \"youtube\":\n case \"imdb\":\n case \"imgur\":\n case \"tiktok\":\n case \"reddit\":\n case \"imdb\":\n case \"snopes\":\n case \"urbanDictionary\":\n case \"quora\":\n case \"twitter\":\n case \"medium\":\n case \"pinterest\":\n return `${config.services[service].url}${url.pathname}${url.search}`\n case \"fandom\": {\n let regex = url.pathname.match(/^\\/([a-zA-Z0-9-]+)\\/wiki\\/(.*)/)\n if (regex) return `https://${regex[1]}.fandom.com/wiki/${regex[2]}`\n return\n }\n case \"wikipedia\": {\n const lang = url.searchParams.get(\"lang\")\n if (lang != null) {\n return `https://${lang}.wikipedia.org${url.pathname}${url.search}${url.hash}`\n }\n return `https://wikipedia.org${url.pathname}${url.search}${url.hash}`\n }\n case \"stackOverflow\": {\n if (url.pathname.startsWith(\"/questions/\")) {\n return `https://stackoverflow.com${url.pathname}${url.search}`\n }\n if (url.pathname.startsWith(\"/exchange/\")) {\n const regex = /\\/exchange\\/(.*?)(\\/.*)/.exec(url.pathname)\n if (regex) {\n if (regex[1].includes(\".\")) {\n return `https://${regex[1]}${regex[2]}`\n } else {\n return `https://${regex[1]}.stackexchange.com${regex[2]}`\n }\n }\n }\n return\n }\n case \"tekstowo\":\n return `${config.services[service].url}/${url.search.slice(1)}`\n case \"goodreads\":\n return `https://goodreads.com${url.pathname}${url.search}`\n case \"soundcloud\":\n if (frontend == \"soundcloak\") {\n if (url.pathname.includes(\"/_/\")) {\n // soundcloak-specific pages\n return `${config.services[service].url}${url.pathname.split(\"/_/\")[0]}`\n }\n\n if (url.pathname == \"/search\") {\n let type = url.searchParams.get(\"type\")\n switch (type) {\n case \"playlists\":\n type = \"sets\"\n break\n case \"tracks\":\n type = \"sounds\"\n break\n case \"users\":\n type = \"people\"\n break\n default:\n type = \"\"\n }\n\n url.searchParams.delete(\"type\")\n if (!type) {\n return `${config.services[service].url}/search?${url.searchParams.toString()}`\n } else {\n return `${config.services[service].url}/search/${type}?${url.searchParams.toString()}`\n }\n }\n\n return `${config.services[service].url}${url.pathname}`\n }\n default:\n return\n }\n }\n return\n}\n\nconst defaultInstances = {\n materialious: [\"https://app.materialio.us\"],\n viewtube: [\"https://viewtube.io\"],\n piped: [\"https://pipedapi-libre.kavin.rocks\"],\n pipedMaterial: [\"https://piped-material.xn--17b.net\"],\n cloudtube: [\"https://tube.cadence.moe\"],\n lightTube: [\"https://tube.kuylar.dev\"],\n poketube: [\"https://poketube.fun\"],\n proxiTok: [\"https://proxitok.pabloferreiro.es\"],\n offtiktok: [\"https://www.offtiktok.com\"],\n redlib: [\"https://safereddit.com\"],\n eddrit: [\"https://eddrit.com\"],\n troddit: [\"https://www.troddit.com\"],\n scribe: [\"https://scribe.rip\"],\n libMedium: [\"https://md.vern.cc\"],\n small: [\"https://small.bloat.cat\"],\n freedium: [\"https://freedium.cfd\"],\n quetre: [\"https://quetre.iket.me\"],\n libremdb: [\"https://libremdb.iket.me\"],\n simplyTranslate: [\"https://simplytranslate.org\"],\n translite: [\"https://tl.bloat.cat\"],\n mozhi: [\"https://mozhi.aryak.me\"],\n searxng: [\"https://nyc1.sx.ggtyler.dev\"],\n \"4get\": [\"https://4get.ca\"],\n websurfx: [\"https://alamin655-spacex.hf.space\"],\n rimgo: [\"https://rimgo.vern.cc\"],\n hyperpipe: [\"https://hyperpipe.surge.sh\"],\n osm: [\"https://www.openstreetmap.org\"],\n breezeWiki: [\"https://breezewiki.com\"],\n neuters: [\"https://neuters.de\"],\n dumb: [\"https://dm.vern.cc\"],\n intellectual: [\"https://intellectual.insprill.net\"],\n ruralDictionary: [\"https://rd.vern.cc\"],\n anonymousOverflow: [\"https://code.whatever.social\"],\n suds: [\"https://sd.vern.cc\"],\n unfunny: [\"https://uf.vern.cc\"],\n soprano: [\"https://sp.vern.cc\"],\n meme: [\"https://mm.vern.cc\"],\n waybackClassic: [\"https://wayback-classic.net\"],\n tent: [\"https://tent.sny.sh\"],\n laboratory: [\"https://lab.vern.cc\"],\n binternet: [\"https://bn.bloat.cat\"],\n painterest: [\"https://pt.bloat.cat\"],\n pixivFe: [\"https://pixiv.perennialte.ch\"],\n liteXiv: [\"https://litexiv.465321.best\", \"https://litexiv.bloat.cat\"],\n pixivViewer: [\"https://pixiv.pictures\"],\n vixipy: [\"https://vx.maid.zone\"],\n indestructables: [\"https://indestructables.private.coffee\"],\n destructables: [\"https://ds.vern.cc\"],\n structables: [\"https://structables.private.coffee\"],\n safetwitch: [\"https://safetwitch.drgns.space\"],\n twineo: [\"https://twineo.exozy.me\"],\n proxigram: [\"https://ig.opnxng.com\"],\n tuboYoutube: [\"https://tubo.media\"],\n tuboSoundcloud: [\"https://tubo.media\"],\n tekstoLibre: [\"https://davilarek.github.io/TekstoLibre\"],\n skyview: [\"https://skyview.social\"],\n priviblur: [\"https://pb.bloat.cat\"],\n nitter: [\"https://nitter.privacydev.net\"],\n pasted: [\"https://pasted.drakeerv.com\"],\n pasty: [\"https://pasty.lus.pm\"],\n freetar: [\"https://freetar.de\"],\n ultimateTab: [\"https://ultimate-tab.com\"],\n ratAintTieba: [\"https://rat.fis.land\"],\n shoelace: [\"https://shoelace.mint.lgbt\"],\n skunkyArt: [\"https://skunky.bloat.cat\"],\n ytify: [\"https://ytify.pp.ua\"],\n nerdsForNerds: [\"https://nn.vern.cc\"],\n ducksForDucks: [\"https://ducksforducks.private.coffee\"],\n koub: [\"https://koub.clovius.club\"],\n soundcloak: [\"https://soundcloak.fly.dev\"],\n gocook: [\"https://cook.adminforge.de\"],\n wikimore: [\"https://wikimore.private.coffee\"],\n libreTranslate: [\"https://libretranslate.com\"],\n cryptPad: [\"https://cryptpad.org\"],\n}\n\nasync function getDefaults() {\n let config = await utils.getConfig()\n let options = {}\n for (const service in config.services) {\n options[service] = {}\n for (const defaultOption in config.services[service].options) {\n options[service][defaultOption] = config.services[service].options[defaultOption]\n }\n for (const frontend in config.services[service].frontends) {\n if (config.services[service].frontends[frontend].instanceList) {\n options[frontend] = []\n }\n }\n }\n options.exceptions = {\n url: [],\n regex: [],\n }\n options.theme = \"detect\"\n options.popupServices = [\"youtube\", \"tiktok\", \"imgur\", \"reddit\", \"quora\", \"translate\", \"maps\"]\n options.fetchInstances = \"github\"\n options.redirectOnlyInIncognito = false\n options = { ...options, ...defaultInstances }\n return options\n}\n\nfunction initDefaults() {\n return new Promise(resolve => {\n browser.storage.local.clear(async () => {\n options = await getDefaults()\n browser.storage.local.set({ options }, () => resolve())\n })\n })\n}\n\nfunction processUpdate(_options) {\n return new Promise(async resolve => {\n const config = await utils.getConfig()\n let options = _options ?? (await utils.getOptions())\n\n const defaults = await getDefaults()\n\n // Remove any unknown option or subOption\n for (const optionName in options) {\n if (!(optionName in defaults)) delete options[optionName]\n else if (typeof optionName === \"object\" && optionName !== null) {\n for (const subOptionName in options[optionName]) {\n if (!(subOptionName in defaults[optionName])) delete options[optionName][subOptionName]\n }\n }\n }\n\n // Remove any unknwon popupService\n options.popupServices = options.popupServices.filter(service => service in config.services)\n\n // Add missing options\n for (const [defaultName, defaultValue] of Object.entries(defaults)) {\n if (!(defaultName in options)) {\n options[defaultName] = defaultValue\n }\n }\n\n for (const [serviceName, serviceValue] of Object.entries(config.services)) {\n // Reset service options if selected frontend is deprecated\n if (!(options[serviceName].frontend in serviceValue.frontends)) {\n options[serviceName] = serviceValue.options\n }\n\n // Add a default service option if it's not present\n for (const optionName in serviceValue.options) {\n if (!(optionName in options[serviceName])) {\n options[serviceName][optionName] = serviceValue.options[optionName]\n }\n }\n }\n\n browser.storage.local.clear(() => browser.storage.local.set({ options }, () => resolve()))\n })\n}\n\n/**\n * @param {URL} url\n */\nasync function copyRaw(url) {\n const newUrl = await reverse(url)\n if (newUrl) {\n if (!isChrome) {\n navigator.clipboard.writeText(newUrl)\n } else {\n var copyFrom = document.createElement(\"textarea\")\n copyFrom.textContent = newUrl\n document.body.appendChild(copyFrom)\n copyFrom.select()\n document.execCommand(\"copy\")\n copyFrom.blur()\n document.body.removeChild(copyFrom)\n }\n }\n}\n\n/**\n * @param {URL} url\n */\nfunction isException(url) {\n if (!options) return false\n if (!options.exceptions) return false\n let exceptions = options.exceptions\n if (exceptions && url) {\n if (exceptions.url) {\n for (let item of exceptions.url) {\n item = new URL(item)\n item = item.href.replace(/^http:\\/\\//, \"https://\")\n if (item == url.href) {\n return true\n }\n }\n }\n if (exceptions.regex) {\n for (const item of exceptions.regex) {\n if (new RegExp(item).test(url.href)) {\n return true\n }\n }\n }\n }\n return false\n}\n\nexport default {\n redirect,\n redirectAsync,\n computeServiceFrontend,\n reverse,\n initDefaults,\n processUpdate,\n copyRaw,\n switchInstance,\n isException,\n}\n","import { noop, safe_not_equal, subscribe, run_all, is_function } from '../internal/index.mjs';\nexport { get_store_value as get } from '../internal/index.mjs';\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n * @param value initial value\n * @param {StartStopNotifier} [start]\n */\nfunction readable(value, start) {\n return {\n subscribe: writable(value, start).subscribe\n };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n * @param {*=}value initial value\n * @param {StartStopNotifier=} start\n */\nfunction writable(value, start = noop) {\n let stop;\n const subscribers = new Set();\n function set(new_value) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) { // store is ready\n const run_queue = !subscriber_queue.length;\n for (const subscriber of subscribers) {\n subscriber[1]();\n subscriber_queue.push(subscriber, value);\n }\n if (run_queue) {\n for (let i = 0; i < subscriber_queue.length; i += 2) {\n subscriber_queue[i][0](subscriber_queue[i + 1]);\n }\n subscriber_queue.length = 0;\n }\n }\n }\n }\n function update(fn) {\n set(fn(value));\n }\n function subscribe(run, invalidate = noop) {\n const subscriber = [run, invalidate];\n subscribers.add(subscriber);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(subscriber);\n if (subscribers.size === 0 && stop) {\n stop();\n stop = null;\n }\n };\n }\n return { set, update, subscribe };\n}\nfunction derived(stores, fn, initial_value) {\n const single = !Array.isArray(stores);\n const stores_array = single\n ? [stores]\n : stores;\n const auto = fn.length < 2;\n return readable(initial_value, (set) => {\n let started = false;\n const values = [];\n let pending = 0;\n let cleanup = noop;\n const sync = () => {\n if (pending) {\n return;\n }\n cleanup();\n const result = fn(single ? values[0] : values, set);\n if (auto) {\n set(result);\n }\n else {\n cleanup = is_function(result) ? result : noop;\n }\n };\n const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => {\n values[i] = value;\n pending &= ~(1 << i);\n if (started) {\n sync();\n }\n }, () => {\n pending |= (1 << i);\n }));\n started = true;\n sync();\n return function stop() {\n run_all(unsubscribers);\n cleanup();\n // We need to set this to false because callbacks can still happen despite having unsubscribed:\n // Callbacks might already be placed in the queue which doesn't know it should no longer\n // invoke this derived store.\n started = false;\n };\n });\n}\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * @param store - store to make readonly\n */\nfunction readonly(store) {\n return {\n subscribe: store.subscribe.bind(store)\n };\n}\n\nexport { derived, readable, readonly, writable };\n","import { writable } from \"svelte/store\"\n\nexport const options = writable(null)\nexport const config = writable(null)\nexport const page = writable(\"general\")\n","<button {...$$restProps} on:click {...$$props}>\n <slot></slot>\n</button>\n\n<style>\n button {\n color: var(--text);\n border: none;\n text-decoration: none;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n transition-duration: 0.1s;\n display: inline-flex;\n align-items: center;\n margin: 7.5px 0;\n background-color: var(--bg-secondary);\n border-radius: 5px;\n padding: 10px;\n }\n\n button:hover:enabled {\n color: var(--active);\n }\n\n button:active:enabled {\n transform: translateY(1px);\n }\n\n button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n \n</style>\n","<svg\n {...$$restProps}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"20px\"\n viewBox=\"0 -960 960 960\"\n width=\"20px\"\n fill=\"currentColor\"\n ><path\n d=\"M144-144v-178l342-342-54-53 51-51 72 72 110.22-110.22q4.45-4.45 11.11-7.11Q683-816 691-816t15 2.5q7 2.5 12 7.5l87 88q4.55 5.83 7.27 12.64 2.73 6.8 2.73 14.58t-2.66 14.44q-2.67 6.66-7.11 11.1L696-556l72 73-51 51-54-54-341 342H144Zm72-72h76l320-320-75-76-321 320v76Zm424-385 90-91-38-39-91 90 39 40Zm0 0-39-40 39 40Z\"\n /></svg\n>\n","<script>\n const browser = window.browser || window.chrome\n\n import utils from \"../../assets/javascripts/utils.js\"\n import { onDestroy } from \"svelte\"\n import servicesHelper from \"../../assets/javascripts/services.js\"\n import { onMount } from \"svelte\"\n\n import { options, config, page } from \"./stores\"\n import Button from \"../components/Button.svelte\"\n import AutoPickIcon from \"../icons/AutoPickIcon.svelte\"\n\n let _options\n const unsubscribeOptions = options.subscribe(val => {\n if (val) {\n _options = val\n browser.storage.local.set({ options: val })\n }\n })\n\n let _config\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n onMount(async () => {\n let opts = await utils.getOptions()\n if (!opts) {\n await servicesHelper.initDefaults()\n opts = await utils.getOptions()\n }\n options.set(opts)\n config.set(await utils.getConfig())\n })\n\n let _page\n page.subscribe(val => (_page = val))\n\n let style\n $: if (_options) style = utils.style(_options, window)\n\n let autoPicking = false\n\n const params = new URLSearchParams(window.location.search)\n const oldUrl = new URL(params.get(\"url\"))\n\n async function autoPick() {\n autoPicking = true\n const frontend = params.get(\"frontend\")\n const redirects = await utils.getList(_options)\n const clearnet = redirects[frontend][\"clearnet\"]\n const instance = await utils.autoPickInstance(clearnet)\n _options[frontend].push(instance)\n options.set(_options)\n autoPicking = false\n }\n\n async function redirectUrl() {\n const newUrl = await servicesHelper.redirectAsync(oldUrl, \"main_frame\", null, null, false, true)\n browser.tabs.update({ url: newUrl })\n }\n</script>\n\n{#if _options && _config}\n <div class=\"main\" dir=\"auto\" {style}>\n {#if params.get(\"message\") == \"disabled\"}\n <div>\n <h1>You disabled redirections for this service</h1>\n <Button\n on:click={async () => {\n const { service } = await servicesHelper.computeServiceFrontend(oldUrl)\n _options[service].enabled = true\n options.set(_options)\n await redirectUrl()\n }}\n >\n {browser.i18n.getMessage(\"enable\") || \"Enable\"}\n </Button>\n </div>\n {:else if params.get(\"message\") == \"no_instance\"}\n <div>\n <h1>You have no instance selected for this frontend</h1>\n <Button\n on:click={async () => {\n await autoPick()\n await redirectUrl()\n }}\n disabled={autoPicking}\n >\n <AutoPickIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"autoPickInstance\") || \"Auto Pick Instance\"}\n </Button>\n </div>\n {/if}\n </div>\n{:else}\n <p>Loading...</p>\n{/if}\n\n<style>\n :global(body) {\n width: 100vw;\n height: 100vh;\n margin: 0;\n padding: 0;\n }\n\n div.main {\n height: 100%;\n display: grid;\n grid-template-columns: 800px;\n margin: 0;\n padding-top: 50px;\n justify-content: center;\n font-family: \"Inter\", sans-serif;\n box-sizing: border-box;\n font-size: 16px;\n background-color: var(--bg-main);\n color: var(--text);\n overflow: scroll;\n }\n\n :global(.margin) {\n margin-right: 10px;\n margin-left: 0;\n }\n :global(.margin_rtl) {\n margin-right: 0;\n margin-left: 10px;\n }\n</style>\n","import App from \"./App.svelte\"\n\nconst app = new App({\n target: document.body,\n})\n\nexport default app\n"],"names":["noop","assign","tar","src","k","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","get_slot_context","definition","ctx","$$scope","slice","exclude_internal_props","props","result","compute_rest_props","keys","rest","Set","has","append","target","node","appendChild","insert","anchor","insertBefore","detach","parentNode","removeChild","element","name","document","createElement","svg_element","createElementNS","text","data","createTextNode","space","attr","attribute","value","removeAttribute","getAttribute","setAttribute","always_set_through_set_attribute","set_attributes","attributes","descriptors","getOwnPropertyDescriptors","__proto__","key","style","cssText","set","indexOf","set_svg_attributes","toggle_class","toggle","classList","current_component","set_current_component","component","get_current_component","Error","bubble","event","callbacks","$$","type","call","this","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","add_render_callback","push","seen_callbacks","flushidx","flush","saved_component","length","update","e","pop","i","callback","add","clear","fragment","before_update","dirty","p","after_update","outroing","outros","transition_in","block","local","delete","transition_out","o","c","d","get_spread_update","levels","updates","to_null_out","accounted_for","n","undefined","create_component","mount_component","customElement","m","new_on_destroy","on_mount","map","filter","on_destroy","destroy_component","detaching","filtered","targets","flush_render_callbacks","make_dirty","then","fill","init","options","instance","create_fragment","not_equal","append_styles","parent_component","bound","on_disconnect","context","Map","skip_bound","root","ready","ret","hydrate","nodes","Array","from","childNodes","children","l","intro","SvelteComponent","$destroy","$on","index","splice","$set","$$props","obj","$$set","getRandomInstance","instances","Math","random","pingOnce","href","async","started","http","XMLHttpRequest","timeout","ontimeout","onerror","onreadystatechange","readyState","status","ended","Date","getTime","abort","open","send","ping","time","average","parseInt","randomInstances","clearnet","randomInstance","floor","window","browser","chrome","utils","getNextInstance","currentInstanceUrl","currentInstanceIndex","protocolHost","url","pathname","replace","host","endsWith","protocol","username","password","getList","fetchInstances","DONE","JSON","parse","responseText","getBlacklist","getConfig","fetch","response","json","getOptions","storage","get","r","getPingCache","pingCache","addressToLatLng","address","encodeURIComponent","coordinate","lat","lon","boundingbox","getQuery","query","searchParams","prefsEncoded","prefs","URLSearchParams","toString","convertMapCentre","zoom","reg","match","split","vars","dark","bgMain","bgSecondary","active","danger","lightGrey","light","theme","matchMedia","matches","cssVariables","autoPickInstance","findIndex","startsWith","pings","all","sort","isChrome","runtime","getBrowserInfo","config","service","frontend","services","frontends","regexArray","targetList","redirectGoogle","val","excludeTargets","includes","disableTwimg","targetString","RegExp","test","redirect","originUrl","documentUrl","incognito","forceRedirection","redirectOnlyInIncognito","enabled","desktopApp","redirectType","embedFrontend","embeddable","unsupportedUrls","instanceList","localhost","origin","search","searchQuery","s","exec","regex","hostname","subdomain","layers","mapCentre","mapCentreData","bbox","marker","travelModes","driving","walking","bicycling","transit","engine","regex1","regex2","decodeURIComponent","destination","route","placeRegex","mlat","mlon","wiki","urlpath","threadID","notExchangeRegex","hostSplit","hash","link","artist","directory","format","file","token","path","lang","substring","lastIndexOf","watch","id","extra","blogregex","blog_name","artReg","userReg","galleryReg","channelReg","rewrite","reverse","onChanged","addListener","defaultInstances","materialious","viewtube","piped","pipedMaterial","cloudtube","lightTube","poketube","proxiTok","offtiktok","redlib","eddrit","troddit","scribe","libMedium","small","freedium","quetre","libremdb","simplyTranslate","translite","mozhi","searxng","websurfx","rimgo","hyperpipe","osm","breezeWiki","neuters","dumb","intellectual","ruralDictionary","anonymousOverflow","suds","unfunny","soprano","meme","waybackClassic","tent","laboratory","binternet","painterest","pixivFe","liteXiv","pixivViewer","vixipy","indestructables","destructables","structables","safetwitch","twineo","proxigram","tuboYoutube","tuboSoundcloud","tekstoLibre","skyview","priviblur","nitter","pasted","pasty","freetar","ultimateTab","ratAintTieba","shoelace","skunkyArt","ytify","nerdsForNerds","ducksForDucks","koub","soundcloak","gocook","wikimore","libreTranslate","cryptPad","getDefaults","defaultOption","exceptions","popupServices","servicesHelper","redirectAsync","computeServiceFrontend","initDefaults","processUpdate","_options","defaults","optionName","subOptionName","defaultName","defaultValue","entries","serviceName","serviceValue","copyRaw","newUrl","copyFrom","textContent","body","select","execCommand","blur","navigator","clipboard","writeText","switchInstance","customService","instancesList","newInstance","isException","item","URL","subscriber_queue","writable","start","stop","subscribers","new_value","run_queue","subscriber","subscribe","invalidate","size","page","slot_ctx","button_levels","button","handler","addEventListener","removeEventListener","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","lets","merged","len","max","svg","div","h1","t1_value","i18n","getMessage","dir","t_value","unsubscribeOptions","$$invalidate","_config","unsubscribeConfig","onMount","opts","autoPicking","params","location","oldUrl","autoPick","redirectUrl","tabs","app"],"mappings":"gCAAA,SAASA,IAAU,CAEnB,SAASC,EAAOC,EAAKC,GAEjB,IAAK,MAAMC,KAAKD,EACZD,EAAIE,GAAKD,EAAIC,GACjB,OAAOF,CACX,CAWA,SAASG,EAAIC,GACT,OAAOA,GACX,CACA,SAASC,IACL,OAAOC,OAAOC,OAAO,KACzB,CACA,SAASC,EAAQC,GACbA,EAAIC,QAAQP,EAChB,CACA,SAASQ,EAAYC,GACjB,MAAwB,mBAAVA,CAClB,CACA,SAASC,EAAeC,EAAGC,GACvB,OAAOD,GAAKA,EAAIC,GAAKA,EAAID,IAAMC,GAAOD,GAAkB,iBAANA,GAAgC,mBAANA,CAChF,CAyCA,SAASE,EAAiBC,EAAYC,EAAKC,EAASf,GAChD,OAAOa,EAAW,IAAMb,EAClBL,EAAOoB,EAAQD,IAAIE,QAASH,EAAW,GAAGb,EAAGc,KAC7CC,EAAQD,GAClB,CAwCA,SAASG,EAAuBC,GAC5B,MAAMC,EAAS,CAAA,EACf,IAAK,MAAMrB,KAAKoB,EACC,MAATpB,EAAE,KACFqB,EAAOrB,GAAKoB,EAAMpB,IAC1B,OAAOqB,CACX,CACA,SAASC,EAAmBF,EAAOG,GAC/B,MAAMC,EAAO,CAAA,EACbD,EAAO,IAAIE,IAAIF,GACf,IAAK,MAAMvB,KAAKoB,EACPG,EAAKG,IAAI1B,IAAe,MAATA,EAAE,KAClBwB,EAAKxB,GAAKoB,EAAMpB,IACxB,OAAOwB,CACX,CA6NA,SAASG,EAAOC,EAAQC,GACpBD,EAAOE,YAAYD,EACvB,CAoDA,SAASE,EAAOH,EAAQC,EAAMG,GAC1BJ,EAAOK,aAAaJ,EAAMG,GAAU,KACxC,CASA,SAASE,EAAOL,GACRA,EAAKM,YACLN,EAAKM,WAAWC,YAAYP,EAEpC,CAOA,SAASQ,EAAQC,GACb,OAAOC,SAASC,cAAcF,EAClC,CAgBA,SAASG,EAAYH,GACjB,OAAOC,SAASG,gBAAgB,6BAA8BJ,EAClE,CACA,SAASK,EAAKC,GACV,OAAOL,SAASM,eAAeD,EACnC,CACA,SAASE,IACL,OAAOH,EAAK,IAChB,CA8CA,SAASI,EAAKlB,EAAMmB,EAAWC,GACd,MAATA,EACApB,EAAKqB,gBAAgBF,GAChBnB,EAAKsB,aAAaH,KAAeC,GACtCpB,EAAKuB,aAAaJ,EAAWC,EACrC,CAQA,MAAMI,EAAmC,CAAC,QAAS,UACnD,SAASC,EAAezB,EAAM0B,GAE1B,MAAMC,EAAcpD,OAAOqD,0BAA0B5B,EAAK6B,WAC1D,IAAK,MAAMC,KAAOJ,EACS,MAAnBA,EAAWI,GACX9B,EAAKqB,gBAAgBS,GAER,UAARA,EACL9B,EAAK+B,MAAMC,QAAUN,EAAWI,GAEnB,YAARA,EACL9B,EAAKoB,MAAQpB,EAAK8B,GAAOJ,EAAWI,GAE/BH,EAAYG,IAAQH,EAAYG,GAAKG,MAA0D,IAAnDT,EAAiCU,QAAQJ,GAC1F9B,EAAK8B,GAAOJ,EAAWI,GAGvBZ,EAAKlB,EAAM8B,EAAKJ,EAAWI,GAGvC,CACA,SAASK,EAAmBnC,EAAM0B,GAC9B,IAAK,MAAMI,KAAOJ,EACdR,EAAKlB,EAAM8B,EAAKJ,EAAWI,GAEnC,CA+UA,SAASM,EAAa5B,EAASC,EAAM4B,GACjC7B,EAAQ8B,UAAUD,EAAS,MAAQ,UAAU5B,EACjD,CAiPA,IAAI8B,EACJ,SAASC,EAAsBC,GAC3BF,EAAoBE,CACxB,CACA,SAASC,IACL,IAAKH,EACD,MAAM,IAAII,MAAM,oDACpB,OAAOJ,CACX,CAkHA,SAASK,EAAOH,EAAWI,GACvB,MAAMC,EAAYL,EAAUM,GAAGD,UAAUD,EAAMG,MAC3CF,GAEAA,EAAUzD,QAAQV,SAAQN,GAAMA,EAAG4E,KAAKC,KAAML,IAEtD,CAEA,MAAMM,EAAmB,GAEnBC,EAAoB,GAC1B,IAAIC,EAAmB,GACvB,MAAMC,EAAkB,GAClBC,EAAmCC,QAAQC,UACjD,IAAIC,GAAmB,EAWvB,SAASC,EAAoBtF,GACzBgF,EAAiBO,KAAKvF,EAC1B,CAsBA,MAAMwF,EAAiB,IAAIjE,IAC3B,IAAIkE,EAAW,EACf,SAASC,IAIL,GAAiB,IAAbD,EACA,OAEJ,MAAME,EAAkBzB,EACxB,EAAG,CAGC,IACI,KAAOuB,EAAWX,EAAiBc,QAAQ,CACvC,MAAMxB,EAAYU,EAAiBW,GACnCA,IACAtB,EAAsBC,GACtByB,EAAOzB,EAAUM,GACpB,CACJ,CACD,MAAOoB,GAIH,MAFAhB,EAAiBc,OAAS,EAC1BH,EAAW,EACLK,CACT,CAID,IAHA3B,EAAsB,MACtBW,EAAiBc,OAAS,EAC1BH,EAAW,EACJV,EAAkBa,QACrBb,EAAkBgB,KAAlBhB,GAIJ,IAAK,IAAIiB,EAAI,EAAGA,EAAIhB,EAAiBY,OAAQI,GAAK,EAAG,CACjD,MAAMC,EAAWjB,EAAiBgB,GAC7BR,EAAehE,IAAIyE,KAEpBT,EAAeU,IAAID,GACnBA,IAEP,CACDjB,EAAiBY,OAAS,CAClC,OAAad,EAAiBc,QAC1B,KAAOX,EAAgBW,QACnBX,EAAgBc,KAAhBd,GAEJI,GAAmB,EACnBG,EAAeW,QACfhC,EAAsBwB,EAC1B,CACA,SAASE,EAAOnB,GACZ,GAAoB,OAAhBA,EAAG0B,SAAmB,CACtB1B,EAAGmB,SACHzF,EAAQsE,EAAG2B,eACX,MAAMC,EAAQ5B,EAAG4B,MACjB5B,EAAG4B,MAAQ,EAAE,GACb5B,EAAG0B,UAAY1B,EAAG0B,SAASG,EAAE7B,EAAG5D,IAAKwF,GACrC5B,EAAG8B,aAAalG,QAAQgF,EAC3B,CACL,CAyBA,MAAMmB,EAAW,IAAIlF,IACrB,IAAImF,EAcJ,SAASC,EAAcC,EAAOC,GACtBD,GAASA,EAAMZ,IACfS,EAASK,OAAOF,GAChBA,EAAMZ,EAAEa,GAEhB,CACA,SAASE,EAAeH,EAAOC,EAAO7E,EAAQiE,GAC1C,GAAIW,GAASA,EAAMI,EAAG,CAClB,GAAIP,EAASjF,IAAIoF,GACb,OACJH,EAASP,IAAIU,GACbF,EAAOO,EAAE1B,MAAK,KACVkB,EAASK,OAAOF,GACZX,IACIjE,GACA4E,EAAMM,EAAE,GACZjB,IACH,IAELW,EAAMI,EAAEH,EACX,MACQZ,GACLA,GAER,CAkaA,SAASkB,EAAkBC,EAAQC,GAC/B,MAAMxB,EAAS,CAAA,EACTyB,EAAc,CAAA,EACdC,EAAgB,CAAExG,QAAS,GACjC,IAAIiF,EAAIoB,EAAOxB,OACf,KAAOI,KAAK,CACR,MAAMgB,EAAII,EAAOpB,GACXwB,EAAIH,EAAQrB,GAClB,GAAIwB,EAAG,CACH,IAAK,MAAM/D,KAAOuD,EACRvD,KAAO+D,IACTF,EAAY7D,GAAO,GAE3B,IAAK,MAAMA,KAAO+D,EACTD,EAAc9D,KACfoC,EAAOpC,GAAO+D,EAAE/D,GAChB8D,EAAc9D,GAAO,GAG7B2D,EAAOpB,GAAKwB,CACf,MAEG,IAAK,MAAM/D,KAAOuD,EACdO,EAAc9D,GAAO,CAGhC,CACD,IAAK,MAAMA,KAAO6D,EACR7D,KAAOoC,IACTA,EAAOpC,QAAOgE,GAEtB,OAAO5B,CACX,CAiOA,SAAS6B,EAAiBd,GACtBA,GAASA,EAAMK,GACnB,CAIA,SAASU,EAAgBvD,EAAW1C,EAAQI,EAAQ8F,GAChD,MAAMxB,SAAEA,EAAQI,aAAEA,GAAiBpC,EAAUM,GAC7C0B,GAAYA,EAASyB,EAAEnG,EAAQI,GAC1B8F,GAEDtC,GAAoB,KAChB,MAAMwC,EAAiB1D,EAAUM,GAAGqD,SAASC,IAAIjI,GAAKkI,OAAO1H,GAIzD6D,EAAUM,GAAGwD,WACb9D,EAAUM,GAAGwD,WAAW3C,QAAQuC,GAKhC1H,EAAQ0H,GAEZ1D,EAAUM,GAAGqD,SAAW,EAAE,IAGlCvB,EAAalG,QAAQgF,EACzB,CACA,SAAS6C,EAAkB/D,EAAWgE,GAClC,MAAM1D,EAAKN,EAAUM,GACD,OAAhBA,EAAG0B,YA9vBX,SAAgC/F,GAC5B,MAAMgI,EAAW,GACXC,EAAU,GAChBtD,EAAiB1E,SAAS2G,IAA0B,IAApB5G,EAAIwD,QAAQoD,GAAYoB,EAAS9C,KAAK0B,GAAKqB,EAAQ/C,KAAK0B,KACxFqB,EAAQhI,SAAS2G,GAAMA,MACvBjC,EAAmBqD,CACvB,CAyvBQE,CAAuB7D,EAAG8B,cAC1BpG,EAAQsE,EAAGwD,YACXxD,EAAG0B,UAAY1B,EAAG0B,SAASc,EAAEkB,GAG7B1D,EAAGwD,WAAaxD,EAAG0B,SAAW,KAC9B1B,EAAG5D,IAAM,GAEjB,CACA,SAAS0H,EAAWpE,EAAW4B,IACI,IAA3B5B,EAAUM,GAAG4B,MAAM,KACnBxB,EAAiBS,KAAKnB,GA52BrBiB,IACDA,GAAmB,EACnBH,EAAiBuD,KAAK/C,IA42BtBtB,EAAUM,GAAG4B,MAAMoC,KAAK,IAE5BtE,EAAUM,GAAG4B,MAAON,EAAI,GAAM,IAAO,GAAMA,EAAI,EACnD,CACA,SAAS2C,EAAKvE,EAAWwE,EAASC,EAAUC,EAAiBC,EAAW7H,EAAO8H,EAAe1C,EAAQ,EAAE,IACpG,MAAM2C,EAAmB/E,EACzBC,EAAsBC,GACtB,MAAMM,EAAKN,EAAUM,GAAK,CACtB0B,SAAU,KACVtF,IAAK,GAELI,QACA2E,OAAQnG,EACRqJ,YACAG,MAAOjJ,IAEP8H,SAAU,GACVG,WAAY,GACZiB,cAAe,GACf9C,cAAe,GACfG,aAAc,GACd4C,QAAS,IAAIC,IAAIT,EAAQQ,UAAYH,EAAmBA,EAAiBvE,GAAG0E,QAAU,KAEtF3E,UAAWxE,IACXqG,QACAgD,YAAY,EACZC,KAAMX,EAAQlH,QAAUuH,EAAiBvE,GAAG6E,MAEhDP,GAAiBA,EAActE,EAAG6E,MAClC,IAAIC,GAAQ,EAkBZ,GAjBA9E,EAAG5D,IAAM+H,EACHA,EAASzE,EAAWwE,EAAQ1H,OAAS,CAAE,GAAE,CAAC8E,EAAGyD,KAAQnI,KACnD,MAAMyB,EAAQzB,EAAKsE,OAAStE,EAAK,GAAKmI,EAOtC,OANI/E,EAAG5D,KAAOiI,EAAUrE,EAAG5D,IAAIkF,GAAItB,EAAG5D,IAAIkF,GAAKjD,MACtC2B,EAAG4E,YAAc5E,EAAGwE,MAAMlD,IAC3BtB,EAAGwE,MAAMlD,GAAGjD,GACZyG,GACAhB,EAAWpE,EAAW4B,IAEvByD,CAAG,IAEZ,GACN/E,EAAGmB,SACH2D,GAAQ,EACRpJ,EAAQsE,EAAG2B,eAEX3B,EAAG0B,WAAW0C,GAAkBA,EAAgBpE,EAAG5D,KAC/C8H,EAAQlH,OAAQ,CAChB,GAAIkH,EAAQc,QAAS,CAEjB,MAAMC,EAvhDlB,SAAkBxH,GACd,OAAOyH,MAAMC,KAAK1H,EAAQ2H,WAC9B,CAqhD0BC,CAASnB,EAAQlH,QAE/BgD,EAAG0B,UAAY1B,EAAG0B,SAAS4D,EAAEL,GAC7BA,EAAMrJ,QAAQ0B,EACjB,MAGG0C,EAAG0B,UAAY1B,EAAG0B,SAASa,IAE3B2B,EAAQqB,OACRtD,EAAcvC,EAAUM,GAAG0B,UAC/BuB,EAAgBvD,EAAWwE,EAAQlH,OAAQkH,EAAQ9G,OAAQ8G,EAAQhB,eAEnElC,GACH,CACDvB,EAAsB8E,EAC1B,CAoDA,MAAMiB,EACF,QAAAC,GACIhC,EAAkBtD,KAAM,GACxBA,KAAKsF,SAAWzK,CACnB,CACD,GAAA0K,CAAIzF,EAAMsB,GACN,IAAK1F,EAAY0F,GACb,OAAOvG,EAEX,MAAM+E,EAAaI,KAAKH,GAAGD,UAAUE,KAAUE,KAAKH,GAAGD,UAAUE,GAAQ,IAEzE,OADAF,EAAUc,KAAKU,GACR,KACH,MAAMoE,EAAQ5F,EAAUZ,QAAQoC,IACjB,IAAXoE,GACA5F,EAAU6F,OAAOD,EAAO,EAAE,CAErC,CACD,IAAAE,CAAKC,GAhrET,IAAkBC,EAirEN5F,KAAK6F,QAjrECD,EAirEkBD,EAhrEG,IAA5BtK,OAAOmB,KAAKoJ,GAAK7E,UAirEhBf,KAAKH,GAAG4E,YAAa,EACrBzE,KAAK6F,MAAMF,GACX3F,KAAKH,GAAG4E,YAAa,EAE5B,EC5tEL,SAASqB,EAAkBC,GACzB,OAAOA,KAAaA,EAAUhF,OAASiF,KAAKC,UAC9C,CAsHA,SAASC,EAASC,GAChB,OAAO,IAAI7F,SAAQ8F,UACjB,IAAIC,EACAC,EAAO,IAAIC,eACfD,EAAKE,QAAU,IACfF,EAAKG,UAAY,IAAMlG,EAAQ,KAC/B+F,EAAKI,QAAU,IAAMnG,IACrB+F,EAAKK,mBAAqB,KACxB,GAAuB,GAAnBL,EAAKM,WACP,GAAmB,KAAfN,EAAKO,OAAe,CACtB,IAAIC,GAAQ,IAAIC,MAAOC,UACvBV,EAAKW,QACL1G,EAAQuG,EAAQT,EAC1B,MACU9F,EAAQ,IAAO+F,EAAKO,OAEvB,EAEHP,EAAKY,KAAK,MAAO,GAAGf,QAAU,IAAIY,MAAOC,aAAa,GACtDX,GAAU,IAAIU,MAAOC,UACrBV,EAAKa,KAAK,KAAK,GAEnB,CAKA,SAASC,EAAKjB,GACZ,OAAO,IAAI7F,SAAQ8F,UACjB,IACIiB,EADAC,EAAU,EAEd,IAAK,IAAInG,EAAI,EAAGA,EAAI,EAAGA,IAErB,GADAkG,QAAanB,EAASC,GACb,GAALhF,EAAJ,CACA,GAAIkG,GAAQ,IAEV,YADA9G,EAAQ8G,GAGVC,GAAWD,CALC,CAOdC,EAAUC,SAASD,EAAU,GAC7B/G,EAAQ+G,EAAQ,GAEpB,CA6CO,SAASE,EAAgBC,EAAU9E,GACxC,IAAIoD,EAAY,GACZpD,EAAI8E,EAAS1G,SAAQ4B,EAAI8E,EAAS1G,QACtC,IAAK,IAAII,EAAI,EAAGA,EAAIwB,EAAGxB,IAAK,CAC1B,MACMuG,EAAiBD,EADFzB,KAAK2B,MAAM3B,KAAKC,SAAWwB,EAAS1G,SAEzDgF,EAAUrF,KAAKgH,EAChB,CACD,OAAO3B,CACT,CA/NA6B,OAAOC,QAAUD,OAAOC,SAAWD,OAAOE,OAuR3B,IAAAC,EAAA,CACbjC,oBACAkC,gBA1QF,SAAyBC,EAAoBlC,GAC3C,MAAMmC,EAAuBnC,EAAU/G,QAAQiJ,GAC/C,OAA8B,IAA1BC,EAAoCpC,EAAkBC,GAEnDA,GADoBmC,EAAuB,GAAKnC,EAAUhF,OAEnE,EAsQEoH,aAjQF,SAAsBC,GACpB,MAAMC,EAAWD,EAAIC,SAASC,QAAQ,MAAO,IAG7C,MAAgB,gBAAZD,GAA8BD,EAAIG,KAAKC,SAAS,aAC3C,GAAGJ,EAAIK,aAAaL,EAAIG,OAAOF,EAASlM,MAAM,GAAI,KAEvDiM,EAAIM,UAAYN,EAAIO,SAAiB,GAAGP,EAAIK,aAAaL,EAAIM,YAAYN,EAAIO,YAAYP,EAAIG,OAAOF,IAEjG,GAAGD,EAAIK,aAAaL,EAAIG,OAAOF,GACxC,EAwPEO,QAnLF,SAAiB7E,GACf,OAAO,IAAIzD,SAAQC,IACjB,IAAI6H,EACJ,GAA8B,UAA1BrE,EAAQ8E,eACVT,EAAM,6EACH,IAA8B,YAA1BrE,EAAQ8E,eAEZ,OAAOtI,EAAQ,YADlB6H,EAAM,sEACsB,CAC9B,MAAM9B,EAAO,IAAIC,eACjBD,EAAKY,KAAK,MAAOkB,GAAK,GACtB9B,EAAKK,mBAAqB,KACxB,GAAoB,MAAhBL,EAAKO,QAAkBP,EAAKM,YAAcL,eAAeuC,KAAM,OAAOvI,EAAQwI,KAAKC,MAAM1C,EAAK2C,cAAa,EAEjH3C,EAAKI,QAAU,IAAMnG,IACrB+F,EAAKG,UAAY,IAAMlG,IACvB+F,EAAKa,KAAK,KAAK,GAEnB,EAmKE+B,aAvMF,SAAsBnF,GACpB,OAAO,IAAIzD,SAAQC,IACjB,IAAI6H,EACJ,GAA8B,UAA1BrE,EAAQ8E,eACVT,EAAM,kFACH,IAA8B,YAA1BrE,EAAQ8E,eAEZ,OAAOtI,EAAQ,YADlB6H,EAAM,2EACsB,CAC9B,MAAM9B,EAAO,IAAIC,eACjBD,EAAKY,KAAK,MAAOkB,GAAK,GACtB9B,EAAKK,mBAAqB,KACJ,MAAhBL,EAAKO,QAAkBP,EAAKM,YAAcL,eAAeuC,MAAMvI,EAAQwI,KAAKC,MAAM1C,EAAK2C,cAAc,EAE3G3C,EAAKI,QAAU,IAAMnG,IACrB+F,EAAKG,UAAY,IAAMlG,IACvB+F,EAAKa,KAAK,KAAK,GAEnB,EAuLEgC,UAnOF,WACE,OAAO,IAAI7I,SAAQC,IACjB6I,MAAM,gBACHxF,MAAKyF,GAAYA,EAASzL,SAC1BgG,MAAK0F,IACJ/I,EAAQwI,KAAKC,MAAMM,GACnB,GACA,GAER,EA2NEC,WAjNF,WACE,OAAO,IAAIjJ,SAAQC,GAAWsH,QAAQ2B,QAAQxH,MAAMyH,IAAI,WAAWC,GAAKnJ,EAAQmJ,EAAE3F,YACpF,EAgNE4F,aA9MF,WACE,OAAO,IAAIrJ,SAAQC,GAAWsH,QAAQ2B,QAAQxH,MAAMyH,IAAI,aAAaC,GAAKnJ,EAAQmJ,EAAEE,WAAa,CAAA,MACnG,EA6MExC,OACAyC,gBAtHF,SAAyBC,GACvB,MAAMxD,EAAO,IAAIC,eAOjB,GANAD,EAAKY,KACH,MACA,gDAAgD6C,mBAAmBD,0BACnE,GAEFxD,EAAKa,OACc,KAAfb,EAAKO,OAAe,CACtB,MAAMyC,EAAOP,KAAKC,MAAM1C,EAAK2C,cAAc,GAC3C,OAAIK,EACK,CACLU,WAAY,GAAGV,EAAKW,OAAOX,EAAKY,MAChCC,YAAa,GAAGb,EAAKa,YAAY,MAAMb,EAAKa,YAAY,MAAMb,EAAKa,YAAY,MAAMb,EAAKa,YAAY,MAGnG,CAAE,CACV,CACH,EAqGEC,SAnGF,SAAkBhC,GAChB,IAAIiC,EAAQ,GAGZ,OAFIjC,EAAIkC,aAAa3N,IAAI,KAAM0N,EAAQjC,EAAIkC,aAAab,IAAI,KACnDrB,EAAIkC,aAAa3N,IAAI,WAAU0N,EAAQjC,EAAIkC,aAAa3N,IAAI,UAC9D0N,CACT,EA+FEE,aA9FF,SAAsBC,GACpB,OAAO,IAAIC,gBAAgBD,GAAOE,UACpC,EA6FEC,iBA3FF,SAA0BvC,GACxB,IAAK6B,EAAKC,EAAKU,GAAQ,CAAC,KAAM,KAAM,MACpC,MAAMC,EAAMzC,EAAIC,SAASyC,MAAM,8CAQ/B,OAPID,GACD,CAAGX,EAAKD,EAAKW,GAAQC,EACbzC,EAAIkC,aAAa3N,IAAI,aAE5BsN,EAAKC,GAAO9B,EAAIkC,aAAab,IAAI,UAAUsB,MAAM,KACnDH,EAAOxC,EAAIkC,aAAab,IAAI,SAAW,MAElC,CAAEmB,OAAMV,MAAKD,MACtB,EAiFEzC,kBACA3I,MAtDK,SAAekF,EAAS6D,GAC7B,MAAMoD,EASR,SAAsBjH,EAAS6D,GAC7B,MAAMqD,EAAO,CACXrN,KAAM,OACNsN,OAAQ,UACRC,YAAa,UACbC,OAAQ,UACRC,OAAQ,UACRC,UAAW,WAGPC,EAAQ,CACZ3N,KAAM,QACNsN,OAAQ,QACRC,YAAa,UACbC,OAAQ,UACRC,OAAQ,UACRC,UAAW,WAEb,MAAqB,QAAjBvH,EAAQyH,MACHP,EACmB,SAAjBlH,EAAQyH,MACVD,EACE3D,EAAO6D,WAAW,gCAAgCC,QACpDT,EAEAM,CAEX,CApCeI,CAAa5H,EAAS6D,GACnC,MAAO,WAAWoD,EAAKpN,uBACVoN,EAAKE,8BACAF,EAAKG,6BACXH,EAAKI,wBACLJ,EAAKK,4BACDL,EAAKM,YACvB,EA+CEM,iBAtEFxF,eAAgCqB,EAAUW,GACxC,GAAIA,EAAK,CACP,MAAMjH,EAAIsG,EAASoE,WAAU7H,GAAYoE,EAAIjC,KAAK2F,WAAW9H,KACzD7C,GAAK,GAAGsG,EAAShC,OAAOtE,EAAG,EAChC,CACD,MAAM8E,EAASuB,EAAgBC,EAAU,GACnCsE,QAAczL,QAAQ0L,IAAI,IAC3B/F,EAAO9C,KAAIiD,SACL,CAACpC,QAAgBoD,EAAKpD,QAIjC,OADA+H,EAAME,MAAK,CAACpQ,EAAGC,IAAMD,EAAE,GAAKC,EAAE,KACvBiQ,EAAM,GAAG,EAClB,GC5OA,MAAMG,OAA8CtJ,IAAnCiF,QAAQsE,QAAQC,eAGjC,IAAIC,GAAQtI,GAEZqC,eAAetC,KACbC,SAAgBgE,EAAMwB,aACtB8C,SAAetE,EAAMoB,WACvB,CAKA,SAAS6C,GAAIM,EAASC,EAAUxI,EAASsI,GACvC,IAAItG,EAAY,GAChB,GAAKwG,EAMMxI,EAAQwI,KACjBxG,EAAYhC,EAAQwI,SANpB,IAAK,MAAMA,KAAYF,EAAOG,SAASF,GAASG,UAC1C1I,EAAQwI,IACVxG,EAAUrF,QAAQqD,EAAQwI,IAMhC,OAAOxG,CACT,CASA,SAAS2G,GAAWJ,EAASlE,EAAKiE,EAAQtI,EAASwI,GACjD,IAAII,EAAaN,EAAOG,SAASF,GAAS7I,QACtC8I,MAEA,mBAAoBF,EAAOG,SAASF,GAASG,UAAUF,KAC1C,WAAZD,GAAyBvI,EAAgB,OAAE6I,iBAE5CD,EAAaA,EAAWvJ,QACtByJ,IAAQR,EAAOG,SAASF,GAASG,UAAUF,GAAUO,eAAeC,SAASJ,EAAW3N,QAAQ6N,OAGpF,YAAZP,GAAyBvI,EAAiB,QAAEiJ,eAC9CL,EAAaA,EAAWlH,OAAO,KAGnC,IAAK,MAAMwH,KAAgBN,EAAY,CAErC,GADe,IAAIO,OAAOP,EAAWM,IAC1BE,KAAK/E,EAAIjC,MAAO,OAAO,CACnC,CACD,OAAO,CACT,CAolBA,SAASiH,GAAShF,EAAKtI,EAAMuN,EAAWC,EAAaC,EAAWC,GAC9D,GAAY,cAAR1N,GAAgC,aAARA,GAA+B,SAARA,EAAiB,OACpE,IAAI4H,EACA6E,EACJ,GAAKiB,GAAuD,GAAnCzJ,GAAQ0J,yBAAoCF,EAArE,CACA,IAAK,MAAMjB,KAAWD,GAAOG,SAAU,CACrC,IAAKgB,IAAqBzJ,GAAQuI,GAASoB,QAAS,SACpD,IAAKF,GAAgE,GAA5CzJ,GAAQuI,GAASmB,0BAAoCF,EAAW,SAWzF,GATAhB,EAAWxI,GAAQuI,GAASC,SAG1BF,GAAOG,SAASF,GAASG,UAAUF,GAAUoB,YACrC,cAAR7N,GACiC,cAAjCiE,GAAQuI,GAASsB,eAEjBrB,EAAWxI,GAAQuI,GAASuB,gBAEzBnB,GAAWJ,EAASlE,EAAKiE,GAAQtI,GAASwI,GAAW,CACxDA,EAAW,KACX,QACD,CAED,GAAY,cAARzM,GAAwBwN,GAAgD,aAAjCvJ,GAAQuI,GAASsB,cACtDlB,GAAWJ,EAASgB,EAAajB,GAAQtI,GAASwI,GACpD,OAIJ,GACEF,GAAOG,SAASF,GAASwB,YACzBhO,GAAQiE,GAAQuI,GAASsB,cACQ,QAAjC7J,GAAQuI,GAASsB,aAEjB,MAAwC,SAApC7J,GAAQuI,GAASyB,gBAAmC,cACxD,EAGF,IAAIC,EAAejK,GAAQwI,GAC3B,QAAqB3J,IAAjBoL,EAA4B,MAEhC,GAAI3B,GAAOG,SAASF,GAASG,UAAUF,GAAU0B,WAA0C,aAA7BlK,GAAQuI,GAAStI,SAC7E0D,EAAiB,UAAU6E,uBACtB,IAA4B,IAAxByB,EAAajN,OACtB,MAAO,oDAAoDgJ,mBAAmBwC,UAAiBxC,mBAAmB3B,EAAIjC,QAEtHuB,EAAiBK,EAAMjC,kBAAkBkI,EAC1C,CAED,GAAIX,GAAaW,EAAajB,SAASM,EAAUa,QAC/C,MAAY,cAARpO,EAA6B,YACrB,KAEd,KACD,CACD,GAAKyM,EAEL,OApoBF,SAAiBnE,EAAKiF,EAAWd,EAAU7E,EAAgB5H,GACzD,OAAQyM,GACN,IAAK,YACH,IAAK,MAAM3N,IAAO,IAAIwJ,EAAIkC,aAAa9N,QAAqB,MAARoC,GAAawJ,EAAIkC,aAAarI,OAAOrD,GACzF,MAAO,GAAG8I,IAAiBU,EAAIC,WAAWD,EAAI+F,SAAS7F,QAAQ,kBAAkB8F,GAC/EA,EAAY9F,QAAQ,MAAO,OAE/B,IAAK,QACL,IAAK,UACH,IAAK,MAAM1J,IAAO,IAAIwJ,EAAIkC,aAAa9N,QAAqB,MAARoC,GAAawJ,EAAIkC,aAAarI,OAAOrD,GACzF,MAAO,GAAG8I,KAAkBU,EAAI+F,SAClC,IAAK,WACL,IAAK,UACH,IAAK,MAAMvP,IAAO,IAAIwJ,EAAIkC,aAAa9N,QAAqB,MAARoC,GAAawJ,EAAIkC,aAAarI,OAAOrD,GACzF,MAAO,GAAG8I,WAAwBU,EAAI+F,SACxC,IAAK,OAAQ,CACX,MAAME,EAAIjG,EAAIkC,aAAab,IAAI,KAC/B,OAAU,OAAN4E,EAAmB,GAAG3G,WAAwBqC,mBAAmBsE,KAC9D3G,CACR,CACD,IAAK,SACH,IAAK,MAAM9I,KAAOwJ,EAAIkC,aAAa9N,OAAmB,KAAPoC,GAAYwJ,EAAIkC,aAAarI,OAAOrD,GACnF,MAAO,GAAG8I,eAA4BU,EAAI+F,SAC5C,IAAK,SAEH,OADA/F,EAAIkC,aAAarI,OAAO,MACjBmG,EAAIjC,KAAKmC,QAAQ,gBAAiB,aAC3C,IAAK,WAGL,IAAK,cAEH,OADAF,EAAIkC,aAAarI,OAAO,MACjB,cAAgBmG,EAAIjC,KAC7B,IAAK,WAEH,GADAiC,EAAIkC,aAAarI,OAAO,MACpBmG,EAAIC,SAASyD,WAAW,YAAa,CACvC,MAAMjB,EAAM,sBAAsByD,KAAKlG,EAAIC,UAC3C,GAAIwC,EAEF,MAAO,GAAGnD,gBADCmD,EAAI,KAC6BzC,EAAI+F,QAEnD,CACD,MAAI,cAAcG,KAAKlG,EAAIC,UAAkBX,EACtC,GAAGA,IAAiBU,EAAIC,WAAWD,EAAI+F,SAEhD,IAAK,QACL,IAAK,YACL,IAAK,WACL,IAAK,SAAU,CACb,MAAMI,EAAQnG,EAAIoG,SAAS1D,MAAM,0CACjC,GAAIyD,GAASA,EAAMxN,OAAS,EAAG,CAC7B,MAAM0N,EAAYF,EAAM,GACxB,GAAiB,QAAbE,IAAwBA,EAAU3C,WAAW,cAC/C,MAAO,GAAGpE,MAAmB+G,IAAYrG,EAAIC,WAAWD,EAAI+F,QAE/D,CACD,MAAO,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,YACL,IAAK,kBACH,MAAO,GAAGzG,KAAkBU,EAAI+F,SAClC,IAAK,OACL,IAAK,QACH,OAAOzG,EACT,IAAK,iBACH,MAAO,GAAGA,KAAkBU,EAAI+F,OAAO7F,QAAQ,KAAM,UAAUA,QAAQ,KAAM,UAAUA,QAAQ,OAAQ,OACzG,IAAK,MAAO,CACV,GAAI+E,GAAgC,qBAAnBA,EAAU9E,KAA6B,OAAOb,EAE/D,IAAI8C,EAAQ,CAAEkE,OAAQ,UAElBC,EAAY,IAChB,MAAMC,EAAgB7G,EAAM4C,iBAAiBvC,GAK7C,GAJIwG,EAAchE,MAAQgE,EAAc1E,KAAO0E,EAAc3E,MAC3D0E,EAAY,QAAQC,EAAchE,QAAQgE,EAAc1E,OAAO0E,EAAc3E,OAG3E7B,EAAIC,SAAS0E,SAAS,UAAW,CAEnC,MAAM1C,EAAQtC,EAAMqC,SAAShC,GAC7B,IAAI4B,WAAEA,EAAUG,YAAEA,GAAgBpC,EAAM8B,gBAAgBQ,GAGxD,OAFAG,EAAMqE,KAAO1E,EACbK,EAAMsE,OAAS9E,EACR,GAAGtC,uBAAoCK,EAAMwC,aAAaC,IAClE,CAED,GAAIpC,EAAIC,SAAS0E,SAAS,QAAS,CACjC,GAAI3E,EAAIkC,aAAa3N,IAAI,cAAe,CACtC,MAAMoS,EAAc,CAClBC,QAAS,mBACTC,QAAS,oBACTC,UAAW,oBACXC,QAAS,oBAEX3E,EAAM4E,OAASL,EAAY3G,EAAIkC,aAAab,IAAI,cACjD,CACD,MAAM4F,EAAS,kEAAkEf,KAAKlG,EAAIC,UACpFiH,EAAS,oBAAoBhB,KAAKlG,EAAIC,UAC5C,GAAIgH,EAAQ,CAEV,MAAMnB,EAASnG,EAAM8B,gBAAgB0F,mBAAmBF,EAAO,KAAKrF,YAAc,GAC5EwF,EAAczH,EAAM8B,gBAAgB0F,mBAAmBF,EAAO,KAAKrF,YAAc,GACvFQ,EAAMiF,MAAQ,GAAGvB,KAAUsB,GAC5B,MAAM,GAAIF,EAAQ,CAEjB,MAAMpB,EAASnG,EAAM8B,gBAAgB0F,mBAAmBD,EAAO,KAAKtF,YAAc,GAClFQ,EAAMiF,MAAQ,GAAGvB,IAC3B,KAAe,CAEL,MAAMA,EAASnG,EAAM8B,gBAAgBzB,EAAIkC,aAAab,IAAI,WAAWO,YAAc,GAC7EwF,EAAczH,EAAM8B,gBAAgBzB,EAAIkC,aAAab,IAAI,gBAAgBO,YAAc,GAC7FQ,EAAMiF,MAAQ,GAAGvB,KAAUsB,GAC5B,CACD,MAAO,GAAG9H,gBAA6BK,EAAMwC,aAAaC,KAASmE,GACpE,CAED,MAAMe,EAAa,mBACnB,GAAItH,EAAIC,SAASyC,MAAM4E,GAGrB,MAAO,GAAGhI,kBADIU,EAAIC,SAASyC,MAAM4E,GAAY,KACIf,IAGnD,GAAIvG,EAAIkC,aAAa3N,IAAI,MAAO,CAE9B,MAAOgT,EAAMC,GAAQxH,EAAIkC,aAAab,IAAI,MAAMsB,MAAM,KACtD,MAAO,GAAGrD,kBAA+BiI,OAAUC,GACpD,CAED,GAAIxH,EAAIkC,aAAa3N,IAAI,aAAc,CAErC,MAAOgT,EAAMC,GAAQxH,EAAIkC,aAAab,IAAI,aAAasB,MAAM,KAC7D,MAAO,GAAGrD,kBAA+BiI,OAAUC,GACpD,CAED,MAAMvF,EAAQtC,EAAMqC,SAAShC,GAC7B,OAAIiC,EAAc,GAAG3C,mBAAgC2C,IAAQsE,KAAa5G,EAAMwC,aAAaC,KACtF,GAAG9C,KAAkBiH,KAAa5G,EAAMwC,aAAaC,IAC7D,CACD,IAAK,aAAc,CACjB,IAAIqF,EACFC,EAAU,GAcZ,OAbI1H,EAAIoG,SAAS1D,MAAM,0CACrB+E,EAAOzH,EAAIoG,SAAS1D,MAAM,6CAErB+E,EADO,OAARA,GAAkBA,EACV,IAAIA,IADmB,GAEnCC,EAAU1H,EAAIC,WAEdwH,EAAOzH,EAAIC,SAASyC,MAAM,qCACrB+E,GAEHA,EAAO,IAAMA,EAAO,SACpBC,EAAU1H,EAAIC,SAASyC,MAAM,oCAHpB+E,EAAO,IAMhBzH,EAAIjC,KAAKgI,OAAO,0BAA4B,EACvC,GAAGzG,IAAiBmI,IAAOC,IAAU1H,EAAI+F,SAC7C7F,QAAQ,wBAAyB,YACjCA,QAAQ,SAAU,IAEhB,GAAGZ,IAAiBmI,IAAOC,IAAU1H,EAAI+F,QACjD,CACD,IAAK,QACH,OAAI/F,EAAIjC,KAAKgI,OAAO,oCAAsC,EACjD,GAAGzG,UAAuBU,EAAIC,WAAWD,EAAI+F,SAC/C,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,SACL,IAAK,YAAa,CAChB,MAAMM,EAAYrG,EAAIoG,SAAS1D,MAAM,6CACrC,IAAK2D,EAAW,MAAO,GAAG/G,IAAiBU,EAAIC,WAAWD,EAAI+F,SAC9D,OAAQM,EAAU,IAChB,IAAK,UACH,MAAO,GAAG/G,gBAA6BU,EAAIC,WAAWD,EAAI+F,SAC5D,IAAK,mBACH,MAAO,GAAGzG,yBAAsCU,EAAIC,WAAWD,EAAI+F,SACrE,IAAK,IACH,MAAO,GAAGzG,QAAqBU,EAAIC,WAEvC,MAAO,GAAGX,aAA0BU,EAAIC,UACzC,CACD,IAAK,SACH,MAAI,yCAAyC8E,KAAK/E,EAAIoG,UAClC,IAAdpG,EAAI+F,OAAqB,GAAGzG,IAAiBU,EAAIC,yBAAyBD,EAAIoG,WACtE,GAAG9G,IAAiBU,EAAIC,WAAWD,EAAI+F,uBAAuB/F,EAAIoG,WAEzE,GAAG9G,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,UACL,IAAK,SACH,MAAI,yCAAyChB,KAAK/E,EAAIoG,UAAkB9G,EACjE,GAAGA,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,UAAW,CACd,MAAMzM,EAAI0G,EAAIC,SACd,OAAI3G,EAAEoK,WAAW,cAAgBpK,EAAEoK,WAAW,SAAWpK,EAAEoK,WAAW,UAAYpK,EAAEoK,WAAW,aACtFpE,EAEF,GAAGA,IAAiBhG,GAC5B,CACD,IAAK,OACH,OAAI0G,EAAIC,SAASG,SAAS,WAAmB,GAAGd,IAAiBU,EAAIC,WAC9D,GAAGX,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,eACH,MAAO,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,kBACH,OAAK/F,EAAIC,SAAS0E,SAAS,gBAAmB3E,EAAIC,SAAS0E,SAAS,gBAAkC,KAAhB3E,EAAIC,SAEnF,GAAGX,IAAiBU,EAAIC,WAAWD,EAAI+F,SADrCzG,EAEX,IAAK,oBAAqB,CACxB,GAAoB,qBAAhBU,EAAIoG,SAAiC,CACvC,MAAMuB,EAAW,iBAAiBzB,KAAKlG,EAAIC,UAC3C,OAAI0H,EAAiB,GAAGrI,eAA4BqI,EAAS,KAAK3H,EAAI+F,SAC/D,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,GAAoB,KAAhB/F,EAAIC,UAAmC,IAAhBD,EAAIC,SAE7B,MAAO,GAAGX,IAAiBU,EAAIC,WAAWD,EAAI+F,SAEhD,MAAMI,EAAQnG,EAAIjC,KAAK2E,MAAM,mEAC7B,GAAIyD,GAASA,EAAMxN,OAAS,EAC1B,OAAIwN,EAAM,GACD,GAAG7G,cAA2BU,EAAIoG,WAAWpG,EAAIC,WAAWD,EAAI+F,SAGlE,GAAGzG,cADQ6G,EAAM,KACyBnG,EAAIC,WAAWD,EAAI+F,SAEtE,MAAM6B,EAAmB5H,EAAIoG,SAAS1D,MACpC,0HAEF,OAAIkF,EACK,GAAGtI,cAA2BsI,EAAiB,KAAK5H,EAAIC,WAAWD,EAAI+F,SAEzE,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,cACH,MAAO,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,WAAY,CACf,IAAI8B,EAAY7H,EAAIG,KAAKwC,MAAM,KAE/B,MAAoB,aAAhBkF,EAAU,IAAqC,OAAhBA,EAAU,GAEpC,GAAGvI,UADGU,EAAIoG,SAASzD,MAAM,KAAK,KACG3C,EAAIC,WAAWD,EAAI+F,SAAS/F,EAAI8H,OAEnE,GAAGxI,IAAiBU,EAAIC,WAAWD,EAAI+F,SAAS/F,EAAI8H,MAC5D,CACD,IAAK,WAAY,CACf,IAAID,EAAY7H,EAAIG,KAAKwC,MAAM,KAO/B,MALoB,aAAhBkF,EAAU,IAAqC,OAAhBA,EAAU,KACvB,KAAhBA,EAAU,GAAW7H,EAAIkC,aAAa1N,OAAO,eAAgB,sBAC5DwL,EAAIkC,aAAa1N,OAAO,OAAQqT,EAAU,IAC3B,KAAhBA,EAAU,IAAW7H,EAAIkC,aAAa1N,OAAO,eAAgB,uBAE5D,GAAG8K,IAAiBU,EAAIC,WAAWD,EAAI+F,SAAS/F,EAAI8H,MAC5D,CACD,IAAK,YACL,IAAK,WACH,OAAI9H,EAAIC,SAASyD,WAAW,UAAkBpE,EACvC,GAAGA,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,iBAAkB,CACrB,MAAMI,EAAQ,+BAA+BD,KAAKlG,EAAIC,UACtD,GAAIkG,EAAO,CACT,MAAM4B,EAAO5B,EAAM,GACnB,MAAO,GAAG7G,kCAA+CqC,mBAAmBoG,IAC7E,CACD,MAAMb,EAAS,0BAA0BhB,KAAKlG,EAAIC,UAClD,GAAIiH,EAAQ,CACV,IAAIa,EAAOb,EAAO,GAElB,OADAa,EAAOA,EAAK7H,QAAQgH,EAAO,GAAIA,EAAO,GAAK,OACpC,0BAA0Ba,GAClC,CACD,MACD,CACD,IAAK,SACH,MAAoB,mBAAhB/H,EAAIoG,SAAsC,GAAG9G,SAAsBU,EAAIC,WAAWD,EAAI+F,SACtE,6BAAhB/F,EAAIoG,SAAgD,GAAG9G,QAAqBU,EAAIC,WAAWD,EAAI+F,SAC5F,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,gBACH,GAAoB,gBAAhB/F,EAAIoG,UAA8C,oBAAhBpG,EAAIoG,UAAkD,UAAhBpG,EAAIoG,SAC9E,MAAO,GAAG9G,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,GAAoB,sBAAhB/F,EAAIoG,SAAkC,MAAO,GAAG9G,UAAuBU,EAAIC,WAAWD,EAAI+F,SAChG,IAAK,OACH,GAAoB,gBAAhB/F,EAAIoG,UAA8C,WAAhBpG,EAAIC,SAAuB,CAC/D,MAAMgC,EAAQjC,EAAIkC,aAAab,IAAI,KACnC,MAAO,GAAG/B,sBAAmCqC,mBAAmBM,IACjE,CACD,GAAIjC,EAAIoG,SAAShG,SAAS,gBAAiB,CACzC,MACM4H,EADQ,uBAAuB9B,KAAKlG,EAAIoG,UACzB,GACrB,GAAoB,KAAhBpG,EAAIC,UAAmC,UAAhBD,EAAIC,SAC7B,MAAO,GAAGX,qBAAkC0I,IACvC,CACL,MAAM7B,EAAQ,gBAAgBD,KAAKlG,EAAIC,UACvC,GAAIkG,EAGF,MAAO,GAAG7G,wBAAqC0I,UAFlC7B,EAAM,WACNA,EAAM,IAGtB,CACF,CACD,GAAoB,iBAAhBnG,EAAIoG,SAGN,MAAO,GAAG9G,oBAFI,cAAc4G,KAAKlG,EAAIC,UACjB,KAGtB,GAAoB,iBAAhBD,EAAIoG,SAA6B,CACnC,MAAMD,EAAQ,6BAA6BD,KAAKlG,EAAIC,UACpD,GAAIkG,EAAO,CACT,MAAM8B,EAAY9B,EAAM,GAClB+B,EAAS/B,EAAM,GACfgC,EAAOhC,EAAM,GACbiC,EAAQpI,EAAIkC,aAAab,IAAI,SACnC,MAAO,GAAG/B,0BAAuC2I,YAAoBC,UAAeC,WAAcxG,mBAAmByG,IACtH,CACF,CAEH,IAAK,YACH,MAAoB,gBAAhBpI,EAAIoG,SAAmC,GAAG9G,yBAAsCqC,mBAAmB3B,EAAIjC,QACpG,GAAGuB,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,aACH,GAAoB,gBAAhB/F,EAAIoG,SAA4B,MAAO,GAAG9G,iBAA8BqC,mBAAmB3B,EAAIjC,QACnG,MAAMoI,EAAQ,iBAAiBD,KAAKlG,EAAIC,UACxC,OAAIkG,EAAc,GAAG7G,IAAiB6G,EAAM,KACrC,GAAG7G,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,aAAc,CACjB,IAAIsC,EAAOrI,EAAIC,SAEf,MADY,KAARoI,IAAaA,EAAO,IACjB,GAAG/I,KAAkBU,EAAIoG,WAAWiC,IAAOrI,EAAI+F,QACvD,CACD,IAAK,SAAU,CACb,MAAMI,EAAQ,uBAAuBD,KAAKlG,EAAIoG,UAC9C,GAAID,EAAO,CACT,MAAMmC,EAAOnC,EAAM,GAEnB,OADAnG,EAAIkC,aAAa1N,OAAO,OAAQ8T,GACzB,GAAGhJ,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,MAAO,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,cACL,IAAK,UACL,IAAK,UAAW,CACd,MAAMI,EAAQ,qBAAqBD,KAAKlG,EAAIC,UAC5C,OAAIkG,EAEK,GAAG7G,KADG6G,EAAM,KACgBnG,EAAI+F,SAElC,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,SAAU,CACb,MAAMI,EAAQ,qBAAqBD,KAAKlG,EAAIC,UAC5C,GAAIkG,EAAO,CACT,IAAIkC,EAAOlC,EAAM,GAEjB,OADIkC,EAAK3E,WAAW,WAAU2E,EAAOA,EAAKnI,QAAQ,OAAQ,QACnD,GAAGZ,KAAkB+I,IAAOrI,EAAI+F,QACxC,CACD,MAAO,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,YAMH,OAJA/F,EAAIkC,aAAarI,OAAO,MAEZ,aAARnC,GAAqBsI,EAAIkC,aAAa1N,OAAO,WAAY,KAEzC,YAAhBwL,EAAIoG,UAA2BpG,EAAIoG,SAAShG,SAAS,gBAAkBJ,EAAIC,SAASyD,WAAW,SAE1F,GAAGpE,aADIU,EAAIC,SAASsI,UAAUvI,EAAIC,SAASuI,YAAY,KAAO,MACxBxI,EAAI+F,OAAOwC,UAAU,KAEhEvI,EAAIoG,SAAShG,SAAS,gBAAkBJ,EAAIC,SAASyD,WAAW,cAAsB1D,EAAIjC,KACvF,GAAGuB,IAAiBU,EAAIC,WAAWD,EAAI+F,SAEhD,IAAK,gBACH,MAAoB,YAAhB/F,EAAIoG,UAA2BpG,EAAIoG,SAAShG,SAAS,gBAAkBJ,EAAIC,SAASyD,WAAW,SAE1F,kCADO1D,EAAIC,SAASsI,UAAUvI,EAAIC,SAASuI,YAAY,KAAO,KAGhE,cAAgBxI,EAAIjC,KAE7B,IAAK,iBACH,MAAoB,YAAhBiC,EAAIoG,UAA2BpG,EAAIoG,SAAShG,SAAS,gBAAkBJ,EAAIC,SAASyD,WAAW,SAE1F,GAAGpE,aADIU,EAAIC,SAASsI,UAAUvI,EAAIC,SAASuI,YAAY,KAAO,KAGhE,GAAGlJ,IAAiBU,EAAIC,WAAWD,EAAI+F,SAEhD,IAAK,eAEH,GADA/F,EAAIkC,aAAarI,OAAO,MACJ,YAAhBmG,EAAIoG,UAA2BpG,EAAIoG,SAAShG,SAAS,gBAAkBJ,EAAIC,SAASyD,WAAW,SAEjG,MAAO,GAAGpE,WADIU,EAAIC,SAASsI,UAAUvI,EAAIC,SAASuI,YAAY,KAAO,KAC3BxI,EAAI+F,OAAO7F,QAAQ,IAAK,OAEpE,GAAIF,EAAIoG,SAAShG,SAAS,eAAgB,CACxC,GAAIJ,EAAIC,SAASyD,WAAW,UAAW,CACrC,GAAI1D,EAAIkC,aAAa3N,IAAI,KAAM,CAC7B,MAAMkU,EAAQzI,EAAIkC,aAAab,IAAI,KAEnC,OADArB,EAAIkC,aAAarI,OAAO,KACjB,GAAGyF,WAAwBmJ,IAAQzI,EAAI+F,OAAO7F,QAAQ,IAAK,MACnE,CACD,MAAO,GAAGZ,WAAwBU,EAAI+F,OAAO7F,QAAQ,IAAK,MAC3D,CACD,GAAIF,EAAIC,SAASyD,WAAW,YAAa,CACvC,GAAI1D,EAAIkC,aAAa3N,IAAI,gBAAiB,CACxC,MAAMwR,EAAS/F,EAAIkC,aAAab,IAAI,gBAEpC,OADArB,EAAIkC,aAAarI,OAAO,gBACjB,GAAGyF,YAAyByG,IAAS/F,EAAI+F,OAAO7F,QAAQ,IAAK,MACrE,CACD,MAAO,GAAGZ,YAAyBU,EAAI+F,OAAO7F,QAAQ,IAAK,MAC5D,CACD,GAAIF,EAAIC,SAASyD,WAAW,cAC1B,OAAO1D,EAAIjC,IAEd,CACD,MAAO,GAAGuB,IAAiBU,EAAIC,WAAWD,EAAI+F,SAEhD,IAAK,WACH,MAAI,8BAA8BG,KAAKlG,EAAIC,UAClC,GAAGX,IAAiBU,EAAIC,WAAWD,EAAI+F,SAEzCzG,EAET,IAAK,cAEH,OADAU,EAAIkC,aAAarI,OAAO,MACpBmG,EAAIC,SAASyD,WAAW,YAAoB,GAAGpE,iBAA8BqC,mBAAmB3B,EAAIjC,QACpGiC,EAAIC,SAASyD,WAAW,UAAkB,GAAGpE,gBAA6BqC,mBAAmB3B,EAAIjC,QAC9FuB,EACT,IAAK,iBACH,MAAoB,KAAhBU,EAAIC,SAAwB,GAAGX,sBAC/BU,EAAIC,SAASyC,MAAM,oBAA4B,GAAGpD,iBAA8BqC,mBAAmB3B,EAAIjC,QACvGiC,EAAIC,SAASyC,MAAM,qBAA6B,GAAGpD,gBAA6BqC,mBAAmB3B,EAAIjC,QACpGuB,EACT,IAAK,SACL,IAAK,aACH,OAAIU,EAAIoG,SAAS1C,WAAW,UAAkB,GAAGpE,SAAsBU,EAAIC,WAAWD,EAAI+F,SACnF,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,SAEhD,IAAK,cACH,MAAO,GAAGzG,MAAmBU,EAAIC,SAASlM,MAAM,KAClD,IAAK,UACH,MAAoB,KAAhBiM,EAAIC,SAAwBX,EACzB,GAAGA,SAAsBqC,mBAAmB3B,EAAIjC,QACzD,IAAK,SAAU,CACb,IAAIgI,EAAS,IAAI1D,gBAAgBrC,EAAI+F,QAUrC,GARAA,EAAOlM,OAAO,WACdkM,EAAOlM,OAAO,WACdkM,EAAOlM,OAAO,KACdkM,EAAOlM,OAAO,KAEdkM,EAASA,EAAOzD,WACD,KAAXyD,IAAeA,EAAS,IAAIA,KAED,QAA3B/F,EAAIG,KAAKwC,MAAM,KAAK,IAA2C,UAA3B3C,EAAIG,KAAKwC,MAAM,KAAK,GAC1D,IACE,MAAM,CAAG+F,EAAIR,EAAQS,GAAS5C,EAAOrD,MAAM,0BACrCT,EAAQN,mBAAmB,GAAG+G,KAAMR,KAAUS,KACpD,MAAO,GAAGrJ,QAAqBU,EAAIC,WAAWgC,GACxD,CAAU,MACA,MAAO,GAAG3C,QAAqBU,EAAIC,WAAW8F,GAC/C,CAEH,OAAI/F,EAAIC,SAAS0C,MAAM,KAAKgC,SAAS,UAC5B,GAAGrF,IAAiBU,EAAIC,SAASC,QAAQ,UAAW,MAAM6F,IACnD,QAAZ/F,EAAIG,KAAuB,GAAGb,SAAsBU,EAAIC,WACrD,GAAGX,IAAiBU,EAAIC,WAAW8F,KAC3C,CACD,IAAK,YAAa,CAChB,GAAoB,kBAAhB/F,EAAIoG,SAA8B,MAAO,GAAG9G,IAAiBU,EAAIC,WAAWD,EAAI+F,SACpF,GAAI/F,EAAIoG,SAAS1C,WAAW,UAAW,MAAO,GAAGpE,gBAA6BU,EAAIC,WAAWD,EAAI+F,SACjG,GAAI/F,EAAIoG,SAAS1C,WAAW,UAAW,MAAO,GAAGpE,gBAA6BU,EAAIC,WAAWD,EAAI+F,SAEjG,MAAMtD,EAAM,gCAAgCyD,KAAKlG,EAAIoG,UACrD,GAAI3D,EAAK,MAAO,GAAGnD,gBAA6BmD,EAAI,KAAKzC,EAAIC,WAAWD,EAAI+F,SAE5E,MAAM6C,EAAY,sCAAsC1C,KAAKlG,EAAIoG,UACjE,GAAIwC,EAAW,CACb,MAAMC,EAAYD,EAAU,GAE5B,OAAI5I,EAAIC,SAASyD,WAAW,SACnB,GAAGpE,KAAkBuJ,IAAY7I,EAAIC,SAASlM,MAAM,KAAKiM,EAAI+F,SAC1D,GAAGzG,KAAkBuJ,IAAY7I,EAAIC,WAAWD,EAAI+F,QACjE,CACD,MAAO,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,cACL,IAAK,UACH,GAAI/F,EAAIC,SAASyD,WAAW,eAI1B,OAHA1D,EAAIkC,aAAavL,IAAI,cAAeqJ,EAAIkC,aAAab,IAAI,UACzDrB,EAAIkC,aAAarI,OAAO,SACxBmG,EAAIkC,aAAarI,OAAO,eACjB,GAAGyF,WAAwBU,EAAI+F,SAExC,GAAI/F,EAAIC,SAASyD,WAAW,WAAY,OACxC,MAAO,GAAGpE,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,eAEH,OADA/F,EAAIkC,aAAarI,OAAO,MACjB,GAAGyF,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,WAAY,CACf,MAAMtD,EAAM,yCAAyCyD,KAAKlG,EAAIC,UAC9D,OAAIwC,EAAY,GAAGnD,OAAoBmD,EAAI,KAAKzC,EAAI+F,SAC7C,GAAGzG,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,YAAa,CAChB,GAAI/F,EAAIC,SAASyD,WAAW,WAAY,MAAO,GAAGpE,IAAiBU,EAAIC,WAAWD,EAAI+F,kBAEtF,MAAM+C,EAAS,yBAAyB5C,KAAKlG,EAAIC,UACjD,GAAI6I,EAAQ,MAAO,GAAGxJ,UAAuBwJ,EAAO,MAAMA,EAAO,KAAK9I,EAAI+F,SAE1E,MAAMgD,EAAU,eAAe7C,KAAKlG,EAAIC,UACxC,GAAI8I,EAAS,MAAO,GAAGzJ,kBAA+ByJ,EAAQ,gBAE9D,MAAMC,EAAa,4BAA4B9C,KAAKlG,EAAIC,UACxD,OAAI+I,EAAmB,GAAG1J,kBAA+B0J,EAAW,kBAE7D,GAAG1J,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,QAAS,CACZ,GAAI/F,EAAIC,SAASyD,WAAW,UAC1B,MAAO,GAAGpE,QAAqBqC,mBAAmB3B,EAAIkC,aAAab,IAAI,QAEzE,MAAM4H,EAAa,sBAAsB/C,KAAKlG,EAAIC,UAClD,OAAIgJ,EAAmB,GAAG3J,kBAA+B2J,EAAW,KAEhEjJ,EAAIC,SAASyD,WAAW,aACnB,GAAGpE,oBAAiCqC,mBAAmB3B,EAAIkC,aAAab,IAAI,WAC9E,GAAG/B,IAAiBU,EAAIC,WAAWD,EAAI+F,QAC/C,CACD,IAAK,OACH,OAAI/F,EAAIC,SAASyD,WAAW,WAAa1D,EAAIC,SAASyD,WAAW,aACxD,GAAGpE,IAAiBU,EAAIC,WAAWD,EAAI+F,SAE7B,kBAAkBG,KAAKlG,EAAIC,UACvB,GAAGX,YAAyBU,EAAIC,WAAWD,EAAI+F,SAC/DzG,EAET,IAAK,mBACH,MAAO,gEAET,IAAK,aACH,GAAIU,EAAIC,SAASyD,WAAW,UAAY1D,EAAIC,SAASyD,WAAW,WAE9D,OAAOpE,EAGT,GAAIU,EAAIC,SAASyD,WAAW,WAAY,CACtC,IAAK1D,EAAI+F,OACP,OAAOzG,EAGT,IAAI5H,EAAO,GASX,OARIsI,EAAIC,SAASyD,WAAW,kBAC1BhM,EAAO,SACEsI,EAAIC,SAASyD,WAAW,kBACjChM,EAAO,SACEsI,EAAIC,SAASyD,WAAW,mBAAqB1D,EAAIC,SAASyD,WAAW,mBAC9EhM,EAAO,aAGLA,GACFA,EAAO,SAAWA,EAKb,GAAG4H,WAAwBU,EAAI+F,SAASrO,KAHtC4H,CAIV,CAED,MAAgB,qBAAZU,EAAIG,KACC,GAAGb,OAAoBU,EAAIC,WAG7B,GAAGX,IAAiBU,EAAIC,WAAWD,EAAI+F,SAChD,IAAK,QACL,IAAK,gBACL,IAAK,YACL,IAAK,YACL,IAAK,WACH/F,EAAIkC,aAAarI,OAAO,MAC1B,QACE,MAAO,GAAGyF,IAAiBU,EAAIC,WAAWD,EAAI+F,SAEpD,CAoESmD,CAAQlJ,EAAKiF,EAAWd,EAAU7E,EAAgB5H,EArDuB,CAsDlF,CA4EAsG,eAAemL,GAAQnJ,GACrB,IAAIrE,QAAgBgE,EAAMwB,aACtB8C,QAAetE,EAAMoB,YACzB,IAAK,MAAMmD,KAAWD,EAAOG,SAAU,CACrC,IAAID,EAAWxI,EAAQuI,GAASC,SAChC,GAAyB3J,MAArBmB,EAAQwI,OAEVxI,EAAQwI,GAAUV,WAAU7H,GAAYoE,EAAIjC,KAAK2F,WAAW9H,KAAa,IACxEoE,EAAIjC,KAAK2F,WAAW,UAAUS,qBAGjC,OAAQD,GACN,IAAK,UACL,IAAK,OACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,SACL,IAAK,kBACL,IAAK,QACL,IAAK,UACL,IAAK,SACL,IAAK,YACH,MAAO,GAAGD,EAAOG,SAASF,GAASlE,MAAMA,EAAIC,WAAWD,EAAI+F,SAC9D,IAAK,SAAU,CACb,IAAII,EAAQnG,EAAIC,SAASyC,MAAM,kCAC/B,OAAIyD,EAAc,WAAWA,EAAM,sBAAsBA,EAAM,UAC/D,CACD,CACD,IAAK,YAAa,CAChB,MAAMmC,EAAOtI,EAAIkC,aAAab,IAAI,QAClC,OAAY,MAARiH,EACK,WAAWA,kBAAqBtI,EAAIC,WAAWD,EAAI+F,SAAS/F,EAAI8H,OAElE,wBAAwB9H,EAAIC,WAAWD,EAAI+F,SAAS/F,EAAI8H,MAChE,CACD,IAAK,gBACH,GAAI9H,EAAIC,SAASyD,WAAW,eAC1B,MAAO,4BAA4B1D,EAAIC,WAAWD,EAAI+F,SAExD,GAAI/F,EAAIC,SAASyD,WAAW,cAAe,CACzC,MAAMyC,EAAQ,0BAA0BD,KAAKlG,EAAIC,UACjD,GAAIkG,EACF,OAAIA,EAAM,GAAGxB,SAAS,KACb,WAAWwB,EAAM,KAAKA,EAAM,KAE5B,WAAWA,EAAM,uBAAuBA,EAAM,IAG1D,CACD,OAEF,IAAK,WACH,MAAO,GAAGlC,EAAOG,SAASF,GAASlE,OAAOA,EAAI+F,OAAOhS,MAAM,KAC7D,IAAK,YACH,MAAO,wBAAwBiM,EAAIC,WAAWD,EAAI+F,SACpD,IAAK,aACH,GAAgB,cAAZ5B,EAA0B,CAC5B,GAAInE,EAAIC,SAAS0E,SAAS,OAExB,MAAO,GAAGV,EAAOG,SAASF,GAASlE,MAAMA,EAAIC,SAAS0C,MAAM,OAAO,KAGrE,GAAoB,WAAhB3C,EAAIC,SAAuB,CAC7B,IAAIvI,EAAOsI,EAAIkC,aAAab,IAAI,QAChC,OAAQ3J,GACN,IAAK,YACHA,EAAO,OACP,MACF,IAAK,SACHA,EAAO,SACP,MACF,IAAK,QACHA,EAAO,SACP,MACF,QACEA,EAAO,GAIX,OADAsI,EAAIkC,aAAarI,OAAO,QACnBnC,EAGI,GAAGuM,EAAOG,SAASF,GAASlE,cAActI,KAAQsI,EAAIkC,aAAaI,aAFnE,GAAG2B,EAAOG,SAASF,GAASlE,cAAcA,EAAIkC,aAAaI,YAIrE,CAED,MAAO,GAAG2B,EAAOG,SAASF,GAASlE,MAAMA,EAAIC,UAC9C,CACH,QACE,OAEL,CAEH,CA92BAT,OAAOC,QAAUD,OAAOC,SAAWD,OAAOE,OAS1ChE,KACA+D,QAAQ2B,QAAQgI,UAAUC,YAAY3N,IAs2BtC,MAAM4N,GAAmB,CACvBC,aAAc,CAAC,6BACfC,SAAU,CAAC,uBACXC,MAAO,CAAC,sCACRC,cAAe,CAAC,sCAChBC,UAAW,CAAC,4BACZC,UAAW,CAAC,2BACZC,SAAU,CAAC,wBACXC,SAAU,CAAC,qCACXC,UAAW,CAAC,6BACZC,OAAQ,CAAC,0BACTC,OAAQ,CAAC,sBACTC,QAAS,CAAC,2BACVC,OAAQ,CAAC,sBACTC,UAAW,CAAC,sBACZC,MAAO,CAAC,2BACRC,SAAU,CAAC,wBACXC,OAAQ,CAAC,0BACTC,SAAU,CAAC,4BACXC,gBAAiB,CAAC,+BAClBC,UAAW,CAAC,wBACZC,MAAO,CAAC,0BACRC,QAAS,CAAC,+BACV,OAAQ,CAAC,mBACTC,SAAU,CAAC,qCACXC,MAAO,CAAC,yBACRC,UAAW,CAAC,8BACZC,IAAK,CAAC,iCACNC,WAAY,CAAC,0BACbC,QAAS,CAAC,sBACVC,KAAM,CAAC,sBACPC,aAAc,CAAC,qCACfC,gBAAiB,CAAC,sBAClBC,kBAAmB,CAAC,gCACpBC,KAAM,CAAC,sBACPC,QAAS,CAAC,sBACVC,QAAS,CAAC,sBACVC,KAAM,CAAC,sBACPC,eAAgB,CAAC,+BACjBC,KAAM,CAAC,uBACPC,WAAY,CAAC,uBACbC,UAAW,CAAC,wBACZC,WAAY,CAAC,wBACbC,QAAS,CAAC,gCACVC,QAAS,CAAC,8BAA+B,6BACzCC,YAAa,CAAC,0BACdC,OAAQ,CAAC,wBACTC,gBAAiB,CAAC,0CAClBC,cAAe,CAAC,sBAChBC,YAAa,CAAC,sCACdC,WAAY,CAAC,kCACbC,OAAQ,CAAC,2BACTC,UAAW,CAAC,yBACZC,YAAa,CAAC,sBACdC,eAAgB,CAAC,sBACjBC,YAAa,CAAC,2CACdC,QAAS,CAAC,0BACVC,UAAW,CAAC,wBACZC,OAAQ,CAAC,iCACTC,OAAQ,CAAC,+BACTC,MAAO,CAAC,wBACRC,QAAS,CAAC,sBACVC,YAAa,CAAC,4BACdC,aAAc,CAAC,wBACfC,SAAU,CAAC,8BACXC,UAAW,CAAC,4BACZC,MAAO,CAAC,uBACRC,cAAe,CAAC,sBAChBC,cAAe,CAAC,wCAChBC,KAAM,CAAC,6BACPC,WAAY,CAAC,8BACbC,OAAQ,CAAC,8BACTC,SAAU,CAAC,mCACXC,eAAgB,CAAC,8BACjBC,SAAU,CAAC,yBAGb/P,eAAegQ,KACb,IAAI/J,QAAetE,EAAMoB,YACrBpF,EAAU,CAAE,EAChB,IAAK,MAAMuI,KAAWD,EAAOG,SAAU,CACrCzI,EAAQuI,GAAW,CAAE,EACrB,IAAK,MAAM+J,KAAiBhK,EAAOG,SAASF,GAASvI,QACnDA,EAAQuI,GAAS+J,GAAiBhK,EAAOG,SAASF,GAASvI,QAAQsS,GAErE,IAAK,MAAM9J,KAAYF,EAAOG,SAASF,GAASG,UAC1CJ,EAAOG,SAASF,GAASG,UAAUF,GAAUyB,eAC/CjK,EAAQwI,GAAY,GAGzB,CAUD,OATAxI,EAAQuS,WAAa,CACnBlO,IAAK,GACLmG,MAAO,IAETxK,EAAQyH,MAAQ,SAChBzH,EAAQwS,cAAgB,CAAC,UAAW,SAAU,QAAS,SAAU,QAAS,YAAa,QACvFxS,EAAQ8E,eAAiB,SACzB9E,EAAQ0J,yBAA0B,EAClC1J,EAAU,IAAKA,KAAY2N,IACpB3N,CACT,CAwGe,IAAAyS,GAAA,CACbpJ,YACAqJ,cAjXFrQ,eAA6BgC,EAAKtI,EAAMuN,EAAWC,EAAaC,EAAWC,GAEzE,aADM1J,KACCsJ,GAAShF,EAAKtI,EAAMuN,EAAWC,EAAaC,EAAWC,EAChE,EA+WEkJ,uBA1WFtQ,eAAsCgC,GACpC,MAAMiE,QAAetE,EAAMoB,YACrBpF,QAAgBgE,EAAMwB,aAC5B,IAAK,MAAM+C,KAAWD,EAAOG,SAAU,CACrC,GAAIE,GAAWJ,EAASlE,EAAKiE,EAAQtI,GACnC,MAAO,CAAEuI,UAASC,SAAU,MAE5B,IAAK,MAAMA,KAAYF,EAAOG,SAASF,GAASG,UAAW,CACzD,MACMtL,EADY6K,GAAIM,EAASC,EAAUxI,EAASsI,GAC9BR,WAAU7H,GAAYoE,EAAIjC,KAAK2F,WAAW9H,KAC9D,GAAI7C,GAAK,EACP,MAAO,CAAEmL,UAASC,WAErB,CAEJ,CACH,EA2VEgF,WACAoF,aA3GF,WACE,OAAO,IAAIrW,SAAQC,IACjBsH,QAAQ2B,QAAQxH,MAAMV,OAAM8E,UAC1BrC,SAAgBqS,KAChBvO,QAAQ2B,QAAQxH,MAAMjD,IAAI,CAAAgF,QAAEA,KAAW,IAAMxD,KAAU,GACvD,GAEN,EAqGEqW,cAnGF,SAAuBC,GACrB,OAAO,IAAIvW,SAAQ8F,UACjB,MAAMiG,QAAetE,EAAMoB,YAC3B,IAAIpF,EAAU8S,SAAmB9O,EAAMwB,aAEvC,MAAMuN,QAAiBV,KAGvB,IAAK,MAAMW,KAAchT,EACvB,GAAMgT,KAAcD,GACf,GAA0B,iBAAfC,GAA0C,OAAfA,EACzC,IAAK,MAAMC,KAAiBjT,EAAQgT,GAC5BC,KAAiBF,EAASC,WAAqBhT,EAAQgT,GAAYC,eAHvCjT,EAAQgT,GAShDhT,EAAQwS,cAAgBxS,EAAQwS,cAAcnT,QAAOkJ,GAAWA,KAAWD,EAAOG,WAGlF,IAAK,MAAOyK,EAAaC,KAAiB7b,OAAO8b,QAAQL,GACjDG,KAAelT,IACnBA,EAAQkT,GAAeC,GAI3B,IAAK,MAAOE,EAAaC,KAAiBhc,OAAO8b,QAAQ9K,EAAOG,UAAW,CAEnEzI,EAAQqT,GAAa7K,YAAY8K,EAAa5K,YAClD1I,EAAQqT,GAAeC,EAAatT,SAItC,IAAK,MAAMgT,KAAcM,EAAatT,QAC9BgT,KAAchT,EAAQqT,KAC1BrT,EAAQqT,GAAaL,GAAcM,EAAatT,QAAQgT,GAG7D,CAEDlP,QAAQ2B,QAAQxH,MAAMV,OAAM,IAAMuG,QAAQ2B,QAAQxH,MAAMjD,IAAI,CAAEgF,YAAW,IAAMxD,OAAW,GAE9F,EAyDE+W,QApDFlR,eAAuBgC,GACrB,MAAMmP,QAAehG,GAAQnJ,GAC7B,GAAImP,EACF,GAAKrL,EAEE,CACL,IAAIsL,EAAWha,SAASC,cAAc,YACtC+Z,EAASC,YAAcF,EACvB/Z,SAASka,KAAK3a,YAAYya,GAC1BA,EAASG,SACTna,SAASoa,YAAY,QACrBJ,EAASK,OACTra,SAASka,KAAKra,YAAYma,EAC3B,MATCM,UAAUC,UAAUC,UAAUT,EAWpC,EAsCEU,eAzVF,SAAwB7P,EAAK8P,GAC3B,OAAO,IAAI5X,SAAQ8F,UACjB,IAAIrC,QAAgBgE,EAAMwB,aACtB8C,QAAetE,EAAMoB,YAGzB,GADqBpB,EAAMI,aAAaC,GACpC8P,EAAe,CACjB,MAAMC,EAAgBpU,EAAQA,EAAQmU,GAAe3L,UACrD,QAAsB3J,IAAlBuV,EAA6B,CAC/B,MAAMC,EAAcrQ,EAAMC,gBAAgBI,EAAI8F,OAAQiK,GACtD,GAAIC,EACF,OAAO7X,EAAQ,GAAG6X,IAAchQ,EAAIC,WAAWD,EAAI+F,SAEtD,CACP,MACM,IAAK,MAAM7B,KAAWD,EAAOG,SAAU,CACrC,IAAI2L,EAAgBpU,EAAQA,EAAQuI,GAASC,UAC7C,QAAsB3J,IAAlBuV,EAA6B,SACjC,MAAM3S,EAAQ2S,EAActM,WAAU7H,GAAYoE,EAAIjC,KAAK2F,WAAW9H,KACtE,GAAIwB,EAAQ,EAAG,SAEf,GADA2S,EAAc1S,OAAOD,EAAO,GACC,IAAzB2S,EAAcpX,OAAc,OAAOR,IACvC,MAAM6X,EAAcrQ,EAAMC,gBAAgBI,EAAI8F,OAAQiK,GACtD,GAAIC,EACF,OAAO7X,EAAQ,GAAG6X,IAAchQ,EAAIC,WAAWD,EAAI+F,SAEtD,CAEH5N,GAAS,GAEb,EA4TE8X,YAlCF,SAAqBjQ,GACnB,IAAKrE,GAAS,OAAO,EACrB,IAAKA,GAAQuS,WAAY,OAAO,EAChC,IAAIA,EAAavS,GAAQuS,WACzB,GAAIA,GAAclO,EAAK,CACrB,GAAIkO,EAAWlO,IACb,IAAK,IAAIkQ,KAAQhC,EAAWlO,IAG1B,GAFAkQ,EAAO,IAAIC,IAAID,GACfA,EAAOA,EAAKnS,KAAKmC,QAAQ,aAAc,YACnCgQ,GAAQlQ,EAAIjC,KACd,OAAO,EAIb,GAAImQ,EAAW/H,MACb,IAAK,MAAM+J,KAAQhC,EAAW/H,MAC5B,GAAI,IAAIrB,OAAOoL,GAAMnL,KAAK/E,EAAIjC,MAC5B,OAAO,CAId,CACD,OAAO,CACT,GC3jCA,MAAMqS,GAAmB,GAgBzB,SAASC,GAASva,EAAOwa,EAAQ7d,GAC7B,IAAI8d,EACJ,MAAMC,EAAc,IAAIlc,IACxB,SAASqC,EAAI8Z,GACT,GAAIjd,EAAesC,EAAO2a,KACtB3a,EAAQ2a,EACJF,GAAM,CACN,MAAMG,GAAaN,GAAiBzX,OACpC,IAAK,MAAMgY,KAAcH,EACrBG,EAAW,KACXP,GAAiB9X,KAAKqY,EAAY7a,GAEtC,GAAI4a,EAAW,CACX,IAAK,IAAI3X,EAAI,EAAGA,EAAIqX,GAAiBzX,OAAQI,GAAK,EAC9CqX,GAAiBrX,GAAG,GAAGqX,GAAiBrX,EAAI,IAEhDqX,GAAiBzX,OAAS,CAC7B,CACJ,CAER,CAmBD,MAAO,CAAEhC,MAAKiC,OAlBd,SAAgB7F,GACZ4D,EAAI5D,EAAG+C,GACV,EAgBqB8a,UAftB,SAAmB9d,EAAK+d,EAAape,GACjC,MAAMke,EAAa,CAAC7d,EAAK+d,GAMzB,OALAL,EAAYvX,IAAI0X,GACS,IAArBH,EAAYM,OACZP,EAAOD,EAAM3Z,IAAQlE,GAEzBK,EAAIgD,GACG,KACH0a,EAAY3W,OAAO8W,GACM,IAArBH,EAAYM,MAAcP,IAC1BA,IACAA,EAAO,KACV,CAER,EAEL,CCzDO,MAAM5U,GAAU0U,GAAS,MACnBpM,GAASoM,GAAS,MAClBU,GAAOV,GAAS,6DJ+D7B,SAAqBzc,EAAYC,EAAKC,EAASf,GAC3C,GAAIa,EAAY,CACZ,MAAMod,EAAWrd,EAAiBC,EAAYC,EAAKC,EAASf,GAC5D,OAAOa,EAAW,GAAGod,EACxB,CACL,iBKxEY,IAAAC,EAAA,CAAApd,KAA0BA,EAAO,0HAA7Ce,EAESH,EAAAyc,EAAArc,oDL2cT,SAAgBH,EAAM6C,EAAO4Z,EAASxV,GAElC,OADAjH,EAAK0c,iBAAiB7Z,EAAO4Z,EAASxV,GAC/B,IAAMjH,EAAK2c,oBAAoB9Z,EAAO4Z,EAASxV,EAC1D,qDAhXA,SAA0B2V,EAAMC,EAAiB1d,EAAKC,EAAS0d,EAAcC,GACzE,GAAID,EAAc,CACd,MAAME,EAAe/d,EAAiB4d,EAAiB1d,EAAKC,EAAS2d,GACrEH,EAAKhY,EAAEoY,EAAcF,EACxB,CACL,eAvBA,SAA0B5d,EAAYE,EAASuF,EAAOtG,GAClD,GAAIa,EAAW,IAAMb,EAAI,CACrB,MAAM4e,EAAO/d,EAAW,GAAGb,EAAGsG,IAC9B,QAAsBmB,IAAlB1G,EAAQuF,MACR,OAAOsY,EAEX,GAAoB,iBAATA,EAAmB,CAC1B,MAAMC,EAAS,GACTC,EAAMjU,KAAKkU,IAAIhe,EAAQuF,MAAMV,OAAQgZ,EAAKhZ,QAChD,IAAK,IAAII,EAAI,EAAGA,EAAI8Y,EAAK9Y,GAAK,EAC1B6Y,EAAO7Y,GAAKjF,EAAQuF,MAAMN,GAAK4Y,EAAK5Y,GAExC,OAAO6Y,CACV,CACD,OAAO9d,EAAQuF,MAAQsY,CAC1B,CACD,OAAO7d,EAAQuF,KACnB,iBAWA,SAAkCvF,GAC9B,GAAIA,EAAQD,IAAI8E,OAAS,GAAI,CACzB,MAAMU,EAAQ,GACRV,EAAS7E,EAAQD,IAAI8E,OAAS,GACpC,IAAK,IAAII,EAAI,EAAGA,EAAIJ,EAAQI,IACxBM,EAAMN,IAAM,EAEhB,OAAOM,CACV,CACD,OAAQ,CACZ,8BKpHYxF,EAAW,QAAeA,EAAO,kZCCvCA,EAAW,6hBADjBe,EAUCH,EAAAsd,EAAAld,GAHEL,EAECud,EAAA1J,6BARExU,EAAW,kYCkGfe,EAAiBH,EAAA6E,EAAAzE,qGA/BV,MAAyB,YAAzBhB,EAAO,GAAAwN,IAAI,WAAwB,EAcL,eAAzBxN,EAAO,GAAAwN,IAAI,WAA2B,oIAflDzM,EA8BMH,EAAAud,EAAAnd,4MAPYhB,EAAW,2LAPzBe,EAYMH,EAAAud,EAAAnd,GAXJL,EAAwDwd,EAAAC,+DAM5Cpe,EAAW,gXArBzBe,EAYMH,EAAAud,EAAAnd,GAXJL,EAAmDwd,EAAAC,8MAuBhDC,GAAAre,KAAQse,KAAKC,WAAW,qBAAuB,sBAAoB,kDADhChd,SAASka,KAAK+C,qMAbjD,MAAAC,GAAAze,KAAQse,KAAKC,WAAW,WAAa,UAAQ,0HAbnD,OAAAve,MAAYA,EAAO,GAAA,8CPsYb2B,EAAK,kFAy5BZiE,EAAS,CACL6H,EAAG,EACHtH,EAAG,GACHV,EAAGG,iCAIFA,EAAO6H,GACRnO,EAAQsG,EAAOO,GAEnBP,EAASA,EAAOH,yJO12CZ,MAAAmG,EAAUD,OAAOC,SAAWD,OAAOE,WAWrC+O,EACE,MAAA8D,EAAqB5W,GAAQiV,WAAUnM,IACvCA,IACF+N,EAAA,EAAA/D,EAAWhK,GACXhF,EAAQ2B,QAAQxH,MAAMjD,IAAG,CAAGgF,QAAS8I,YAIrCgO,QACEC,EAAoBzO,GAAO2M,WAAUnM,GAAG+N,EAAA,EAAKC,EAAUhO,KPunC/D,IAAmB1R,MOnmCb0D,EPmmCa1D,EOrnCR,KACPwf,IACAG,GAAiB,EPonCjBtb,IAAwBK,GAAGwD,WAAW3C,KAAKvF,GApB/C,SAAiBA,GACbqE,IAAwBK,GAAGqD,SAASxC,KAAKvF,EAC7C,CO/lCE4f,EAAO3U,cACD4U,QAAajT,EAAMwB,aAClByR,UACGxE,GAAeG,eACrBqE,QAAajT,EAAMwB,cAErBxF,GAAQhF,IAAIic,GACZ3O,GAAOtN,UAAUgJ,EAAMoB,YAAS,IAIlCgQ,GAAKH,WAAUnM,GAAgBA,IAK3B,IAAAoO,GAAc,EAEZ,MAAAC,MAAazQ,gBAAgB7C,OAAOuT,SAAShN,QAC7CiN,MAAa7C,IAAI2C,EAAOzR,IAAI,uBAEnB4R,IACbT,EAAA,EAAAK,GAAc,GACR,MAAA1O,EAAW2O,EAAOzR,IAAI,YAEtBhC,SADkBM,EAAMa,QAAQiO,IACXtK,GAAoB,SACzCvI,QAAiB+D,EAAM6D,iBAAiBnE,GAC9CoP,EAAStK,GAAU7L,KAAKsD,GACxBD,GAAQhF,IAAI8X,GACZ+D,EAAA,EAAAK,GAAc,kBAGDK,IACP,MAAA/D,QAAef,GAAeC,cAAc2E,EAAQ,aAAc,KAAM,MAAM,GAAO,GAC3FvT,EAAQ0T,KAAKva,OAAS,CAAAoH,IAAKmP,0CApBtBV,GAAQ+D,EAAA,EAAE/b,EAAQkJ,EAAMlJ,MAAMgY,EAAUjP,uCA+B7B,MAAA0E,QAAAA,SAAkBkK,GAAeE,uBAAuB0E,GAChER,EAAA,EAAA/D,EAASvK,GAASoB,SAAU,EAAImJ,GAChC9S,GAAQhF,IAAI8X,SACNyE,GAAW,kBAWXD,UACAC,GAAW,GCtFxB,MAACE,GAAM,kEAAQ,CAClB3e,OAAQW,SAASka","x_google_ignoreList":[0,3]} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/index.html b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages/index.html @@ -0,0 +1,14 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width,initial-scale=1" /> + <link rel="icon" type="image/x-icon" href="../../../assets/images/libredirect.svg" /> + <title>Settings</title> + <link rel="stylesheet" href="build/bundle.css" /> + <link rel="stylesheet" href="../fonts/styles.css" /> + <script defer src="build/bundle.js"></script> + </head> + + <body></body> +</html> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/App.svelte b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/App.svelte @@ -0,0 +1,134 @@ +<script> + const browser = window.browser || window.chrome + + import utils from "../../assets/javascripts/utils.js" + import { onDestroy } from "svelte" + import servicesHelper from "../../assets/javascripts/services.js" + import { onMount } from "svelte" + + import { options, config, page } from "./stores" + import Button from "../components/Button.svelte" + import AutoPickIcon from "../icons/AutoPickIcon.svelte" + + let _options + const unsubscribeOptions = options.subscribe(val => { + if (val) { + _options = val + browser.storage.local.set({ options: val }) + } + }) + + let _config + const unsubscribeConfig = config.subscribe(val => (_config = val)) + + onDestroy(() => { + unsubscribeOptions() + unsubscribeConfig() + }) + + onMount(async () => { + let opts = await utils.getOptions() + if (!opts) { + await servicesHelper.initDefaults() + opts = await utils.getOptions() + } + options.set(opts) + config.set(await utils.getConfig()) + }) + + let _page + page.subscribe(val => (_page = val)) + + let style + $: if (_options) style = utils.style(_options, window) + + let autoPicking = false + + const params = new URLSearchParams(window.location.search) + const oldUrl = new URL(params.get("url")) + + async function autoPick() { + autoPicking = true + const frontend = params.get("frontend") + const redirects = await utils.getList(_options) + const clearnet = redirects[frontend]["clearnet"] + const instance = await utils.autoPickInstance(clearnet) + _options[frontend].push(instance) + options.set(_options) + autoPicking = false + } + + async function redirectUrl() { + const newUrl = await servicesHelper.redirectAsync(oldUrl, "main_frame", null, null, false, true) + browser.tabs.update({ url: newUrl }) + } +</script> + +{#if _options && _config} + <div class="main" dir="auto" {style}> + {#if params.get("message") == "disabled"} + <div> + <h1>You disabled redirections for this service</h1> + <Button + on:click={async () => { + const { service } = await servicesHelper.computeServiceFrontend(oldUrl) + _options[service].enabled = true + options.set(_options) + await redirectUrl() + }} + > + {browser.i18n.getMessage("enable") || "Enable"} + </Button> + </div> + {:else if params.get("message") == "no_instance"} + <div> + <h1>You have no instance selected for this frontend</h1> + <Button + on:click={async () => { + await autoPick() + await redirectUrl() + }} + disabled={autoPicking} + > + <AutoPickIcon class="margin margin_{document.body.dir}" /> + {browser.i18n.getMessage("autoPickInstance") || "Auto Pick Instance"} + </Button> + </div> + {/if} + </div> +{:else} + <p>Loading...</p> +{/if} + +<style> + :global(body) { + width: 100vw; + height: 100vh; + margin: 0; + padding: 0; + } + + div.main { + height: 100%; + display: grid; + grid-template-columns: 800px; + margin: 0; + padding-top: 50px; + justify-content: center; + font-family: "Inter", sans-serif; + box-sizing: border-box; + font-size: 16px; + background-color: var(--bg-main); + color: var(--text); + overflow: scroll; + } + + :global(.margin) { + margin-right: 10px; + margin-left: 0; + } + :global(.margin_rtl) { + margin-right: 0; + margin-left: 10px; + } +</style> diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/main.js b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/main.js @@ -0,0 +1,7 @@ +import App from "./App.svelte" + +const app = new App({ + target: document.body, +}) + +export default app diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/stores.js b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/messages_src/stores.js @@ -0,0 +1,5 @@ +import { writable } from "svelte/store" + +export const options = writable(null) +export const config = writable(null) +export const page = writable("general") diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.css b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.css @@ -0,0 +1,17 @@ +div.svelte-1jzk4ot{justify-content:space-between;display:flex;align-items:center;margin:20px 0} +select.svelte-13a0xyj{font-weight:bold;box-sizing:border-box;border-style:solid;border-color:#767676;color:var(--text);font-size:16px;padding:8px;background-color:var(--bg-secondary);border:none;margin:0;max-width:500px;border-radius:3px}select.svelte-13a0xyj:disabled{opacity:0.6;cursor:not-allowed} +input.svelte-z6c0dv{font-weight:bold;box-sizing:border-box;color:var(--text);font-size:16px;padding:8px;background-color:var(--bg-secondary);border:none;margin:0;width:400px;border-radius:3px;outline-color:var(--active)}input.svelte-z6c0dv:focus{outline-color:var(--active)}@media(max-width: 715px){input.svelte-z6c0dv{width:200px}} +span.svelte-1auan3b{font-size:18px}span.svelte-1auan3b a{color:var(--text);text-decoration:none}span.svelte-1auan3b a:hover{text-decoration:underline} +.add.svelte-kqf76d{background-color:transparent;border:none;color:var(--text);padding:0;margin:0;text-decoration:none;display:inline-block;cursor:pointer} +button.svelte-efu498{color:var(--text);border:none;text-decoration:none;cursor:pointer;font-size:16px;font-weight:bold;transition-duration:0.1s;display:inline-flex;align-items:center;margin:7.5px 0;background-color:var(--bg-secondary);border-radius:5px;padding:10px}button.svelte-efu498:hover:enabled{color:var(--active)}button.svelte-efu498:active:enabled{transform:translateY(1px)}button.svelte-efu498:disabled{cursor:not-allowed;opacity:0.5} +.margin{margin-right:10px;margin-left:0}.margin_rtl{margin-right:0;margin-left:10px} +input[type="checkbox"].svelte-1i76whx{appearance:none;-moz-appearance:none;-webkit-appearance:none;width:46px;height:24px;background-color:var(--light-grey);border-radius:50px;transition:0.4s;cursor:pointer}input[type="checkbox"].svelte-1i76whx:checked{background-color:var(--active)}input[type="checkbox"].svelte-1i76whx::before{content:"";display:inline-block;width:18px;height:18px;box-sizing:border-box;position:relative;top:3px;left:3.5px;background-color:white;border-radius:50%;transition:0.3s}input[type="checkbox"].svelte-1i76whx:checked::before{left:24px}input[type="checkbox"].rtl.svelte-1i76whx::before{left:auto;right:3.5px}input[type="checkbox"].rtl.svelte-1i76whx:checked::before{left:auto;right:24px} +div.svelte-9vgfun{display:flex;flex-direction:column;margin:0 20px}a.svelte-9vgfun{display:flex;align-items:center;font-size:18px;text-decoration:none;color:var(--text);transition:0.1s;margin:10px;min-width:max-content}a.svelte-9vgfun:hover{color:var(--active)}@media(max-width: 1250px){div.svelte-9vgfun{flex-direction:row;justify-content:center;margin:0}}@media(max-width: 715px){a.svelte-9vgfun{margin:5px}}.margin{margin-right:5px;margin-left:0}.margin_rtl{margin-right:0;margin-left:5px} +svg.svelte-qbd276{width:var(--chevron-icon-width, 20px);height:var(--chevron-icon-width, 20px);color:var(--chevron-icon-colour, currentColor)} +svg.svelte-whdbu1{width:var(--clear-icon-width, 20px);height:var(--clear-icon-width, 20px);color:var(--clear-icon-color, currentColor)} +.loading.svelte-1p3nqvd{width:var(--spinner-width, 20px);height:var(--spinner-height, 20px);color:var(--spinner-color, var(--icons-color));animation:svelte-1p3nqvd-rotate 0.75s linear infinite;transform-origin:center center;transform:none}.circle_path.svelte-1p3nqvd{stroke-dasharray:90;stroke-linecap:round}@keyframes svelte-1p3nqvd-rotate{100%{transform:rotate(360deg)}} +.svelte-select.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{--borderRadius:var(--border-radius);--clearSelectColor:var(--clear-select-color);--clearSelectWidth:var(--clear-select-width);--disabledBackground:var(--disabled-background);--disabledBorderColor:var(--disabled-border-color);--disabledColor:var(--disabled-color);--disabledPlaceholderColor:var(--disabled-placeholder-color);--disabledPlaceholderOpacity:var(--disabled-placeholder-opacity);--errorBackground:var(--error-background);--errorBorder:var(--error-border);--groupItemPaddingLeft:var(--group-item-padding-left);--groupTitleColor:var(--group-title-color);--groupTitleFontSize:var(--group-title-font-size);--groupTitleFontWeight:var(--group-title-font-weight);--groupTitlePadding:var(--group-title-padding);--groupTitleTextTransform:var(--group-title-text-transform);--groupTitleBorderColor:var(--group-title-border-color);--groupTitleBorderWidth:var(--group-title-border-width);--groupTitleBorderStyle:var(--group-title-border-style);--indicatorColor:var(--chevron-color);--indicatorHeight:var(--chevron-height);--indicatorWidth:var(--chevron-width);--inputColor:var(--input-color);--inputLeft:var(--input-left);--inputLetterSpacing:var(--input-letter-spacing);--inputMargin:var(--input-margin);--inputPadding:var(--input-padding);--itemActiveBackground:var(--item-active-background);--itemColor:var(--item-color);--itemFirstBorderRadius:var(--item-first-border-radius);--itemHoverBG:var(--item-hover-bg);--itemHoverColor:var(--item-hover-color);--itemIsActiveBG:var(--item-is-active-bg);--itemIsActiveColor:var(--item-is-active-color);--itemIsNotSelectableColor:var(--item-is-not-selectable-color);--itemPadding:var(--item-padding);--listBackground:var(--list-background);--listBorder:var(--list-border);--listBorderRadius:var(--list-border-radius);--listEmptyColor:var(--list-empty-color);--listEmptyPadding:var(--list-empty-padding);--listEmptyTextAlign:var(--list-empty-text-align);--listMaxHeight:var(--list-max-height);--listPosition:var(--list-position);--listShadow:var(--list-shadow);--listZIndex:var(--list-z-index);--multiItemBG:var(--multi-item-bg);--multiItemBorderRadius:var(--multi-item-border-radius);--multiItemDisabledHoverBg:var(--multi-item-disabled-hover-bg);--multiItemDisabledHoverColor:var(--multi-item-disabled-hover-color);--multiItemHeight:var(--multi-item-height);--multiItemMargin:var(--multi-item-margin);--multiItemPadding:var(--multi-item-padding);--multiSelectInputMargin:var(--multi-select-input-margin);--multiSelectInputPadding:var(--multi-select-input-padding);--multiSelectPadding:var(--multi-select-padding);--placeholderColor:var(--placeholder-color);--placeholderOpacity:var(--placeholder-opacity);--selectedItemPadding:var(--selected-item-padding);--spinnerColor:var(--spinner-color);--spinnerHeight:var(--spinner-height);--spinnerWidth:var(--spinner-width);--internal-padding:0 0 0 16px;border:var(--border, 1px solid #d8dbdf);border-radius:var(--border-radius, 6px);min-height:var(--height, 42px);position:relative;display:flex;align-items:stretch;padding:var(--padding, var(--internal-padding));background:var(--background, #fff);margin:var(--margin, 0);width:var(--width, 100%);font-size:var(--font-size, 16px);max-height:var(--max-height)}.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{box-sizing:var(--box-sizing, border-box)}.svelte-select.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8:hover{border:var(--border-hover, 1px solid #b2b8bf)}.value-container.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{display:flex;flex:1 1 0%;flex-wrap:wrap;align-items:center;gap:5px 10px;padding:var(--value-container-padding, 5px 0);position:relative;overflow:var(--value-container-overflow, hidden);align-self:stretch}.prepend.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8,.indicators.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{display:flex;flex-shrink:0;align-items:center}.indicators.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{position:var(--indicators-position);top:var(--indicators-top);right:var(--indicators-right);bottom:var(--indicators-bottom)}input.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{position:absolute;cursor:default;border:none;color:var(--input-color, var(--item-color));padding:var(--input-padding, 0);letter-spacing:var(--input-letter-spacing, inherit);margin:var(--input-margin, 0);min-width:10px;top:0;right:0;bottom:0;left:0;background:transparent;font-size:var(--font-size, 16px)}.svelte-82qwg8:not(.multi)>.value-container.svelte-82qwg8>input.svelte-82qwg8{width:100%;height:100%}input.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8::placeholder{color:var(--placeholder-color, #78848f);opacity:var(--placeholder-opacity, 1)}input.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8:focus{outline:none}.svelte-select.focused.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{border:var(--border-focused, 1px solid #006fe8);border-radius:var(--border-radius-focused, var(--border-radius, 6px))}.disabled.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{background:var(--disabled-background, #ebedef);border-color:var(--disabled-border-color, #ebedef);color:var(--disabled-color, #c1c6cc)}.disabled.svelte-82qwg8 input.svelte-82qwg8.svelte-82qwg8::placeholder{color:var(--disabled-placeholder-color, #c1c6cc);opacity:var(--disabled-placeholder-opacity, 1)}.selected-item.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{position:relative;overflow:var(--selected-item-overflow, hidden);padding:var(--selected-item-padding, 0 20px 0 0);text-overflow:ellipsis;white-space:nowrap;color:var(--selected-item-color, inherit);font-size:var(--font-size, 16px)}.multi.svelte-82qwg8 .selected-item.svelte-82qwg8.svelte-82qwg8{position:absolute;line-height:var(--height, 42px);height:var(--height, 42px)}.selected-item.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8:focus{outline:none}.hide-selected-item.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{opacity:0}.icon.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{display:flex;align-items:center;justify-content:center}.clear-select.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{all:unset;display:flex;align-items:center;justify-content:center;width:var(--clear-select-width, 40px);height:var(--clear-select-height, 100%);color:var(--clear-select-color, var(--icons-color));margin:var(--clear-select-margin, 0);pointer-events:all;flex-shrink:0}.clear-select.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8:focus{outline:var(--clear-select-focus-outline, 1px solid #006fe8)}.loading.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{width:var(--loading-width, 40px);height:var(--loading-height);color:var(--loading-color, var(--icons-color));margin:var(--loading--margin, 0);flex-shrink:0}.chevron.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{width:var(--chevron-width, 40px);height:var(--chevron-height, 40px);background:var(--chevron-background, transparent);pointer-events:var(--chevron-pointer-events, none);color:var(--chevron-color, var(--icons-color));border:var(--chevron-border, 0 0 0 1px solid #d8dbdf);flex-shrink:0}.multi.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{padding:var(--multi-select-padding, var(--internal-padding))}.multi.svelte-82qwg8 input.svelte-82qwg8.svelte-82qwg8{padding:var(--multi-select-input-padding, 0);position:relative;margin:var(--multi-select-input-margin, 5px 0);flex:1 1 40px}.svelte-select.error.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{border:var(--error-border, 1px solid #ff2d55);background:var(--error-background, #fff)}.a11y-text.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{z-index:9999;border:0px;clip:rect(1px, 1px, 1px, 1px);height:1px;width:1px;position:absolute;overflow:hidden;padding:0px;white-space:nowrap}.multi-item.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{background:var(--multi-item-bg, #ebedef);margin:var(--multi-item-margin, 0);outline:var(--multi-item-outline, 1px solid #ddd);border-radius:var(--multi-item-border-radius, 4px);height:var(--multi-item-height, 25px);line-height:var(--multi-item-height, 25px);display:flex;cursor:default;padding:var(--multi-item-padding, 0 5px);overflow:hidden;gap:var(--multi-item-gap, 4px);outline-offset:-1px;max-width:var(--multi-max-width, none);color:var(--multi-item-color, var(--item-color))}.multi-item.disabled.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8:hover{background:var(--multi-item-disabled-hover-bg, #ebedef);color:var(--multi-item-disabled-hover-color, #c1c6cc)}.multi-item-text.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.multi-item-clear.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{display:flex;align-items:center;justify-content:center;--clear-icon-color:var(--multi-item-clear-icon-color, #000)}.multi-item.active.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{outline:var(--multi-item-active-outline, 1px solid #006fe8)}.svelte-select-list.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{box-shadow:var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24));border-radius:var(--list-border-radius, 4px);max-height:var(--list-max-height, 252px);overflow-y:auto;background:var(--list-background, #fff);position:var(--list-position, absolute);z-index:var(--list-z-index, 2);border:var(--list-border)}.prefloat.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{opacity:0;pointer-events:none}.list-group-title.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{color:var(--group-title-color, #8f8f8f);cursor:default;font-size:var(--group-title-font-size, 16px);font-weight:var(--group-title-font-weight, 600);height:var(--height, 42px);line-height:var(--height, 42px);padding:var(--group-title-padding, 0 20px);text-overflow:ellipsis;overflow-x:hidden;white-space:nowrap;text-transform:var(--group-title-text-transform, uppercase);border-width:var(--group-title-border-width, medium);border-style:var(--group-title-border-style, none);border-color:var(--group-title-border-color, color)}.empty.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{text-align:var(--list-empty-text-align, center);padding:var(--list-empty-padding, 20px 0);color:var(--list-empty-color, #78848f)}.item.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{cursor:default;height:var(--item-height, var(--height, 42px));line-height:var(--item-line-height, var(--height, 42px));padding:var(--item-padding, 0 20px);color:var(--item-color, inherit);text-overflow:ellipsis;overflow:hidden;white-space:nowrap;transition:var(--item-transition, all 0.2s);align-items:center;width:100%}.item.group-item.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{padding-left:var(--group-item-padding-left, 40px)}.item.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8:active{background:var(--item-active-background, #b9daff)}.item.active.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{background:var(--item-is-active-bg, #007aff);color:var(--item-is-active-color, #fff)}.item.first.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{border-radius:var(--item-first-border-radius, 4px 4px 0 0)}.item.hover.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8:not(.active){background:var(--item-hover-bg, #e7f2ff);color:var(--item-hover-color, inherit)}.item.not-selectable.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8,.item.hover.item.not-selectable.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8,.item.active.item.not-selectable.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8,.item.not-selectable.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8:active{color:var(--item-is-not-selectable-color, #999);background:transparent}.required.svelte-82qwg8.svelte-82qwg8.svelte-82qwg8{opacity:0;z-index:-1;position:absolute;top:0;left:0;bottom:0;right:0} +.add.svelte-f3h0n0{background-color:transparent;border:none;color:var(--text);padding:0;margin:0;text-decoration:none;display:inline-block;cursor:pointer}a.svelte-f3h0n0{color:var(--text);text-decoration:none;word-wrap:anywhere}a.svelte-f3h0n0:hover{text-decoration:underline}.margin{margin-right:10px;margin-left:0}.margin_rtl{margin-right:0;margin-left:10px} +.svelte_select{font-weight:bold;--item-padding:0 10px;--border:none;--border-hover:none;--border-focused:none;--width:210px;--background:var(--bg-secondary);--list-background:var(--bg-secondary);--item-is-active-bg:grey;--item-hover-bg:grey;--item-is-active-color:var(--text);--list-max-height:400px;--padding:0 0 0 10px;--item-color:var(--text);--item-transition:none + }.svelte_select .slot{display:flex;justify-content:start;align-items:center}.svelte_select img, .svelte_select svg{margin-right:10px;margin-left:0;height:26px;width:26px;color:var(--text)}.svelte_select .disabled{opacity:0.4} +body{width:100vw;height:100vh;margin:0;padding:0}div.svelte-1xshtt5{height:100%;display:grid;grid-template-columns:min-content 800px;margin:0;padding-top:50px;justify-content:center;font-family:"Inter", sans-serif;box-sizing:border-box;font-size:16px;background-color:var(--bg-main);color:var(--text);overflow:scroll}@media(max-width: 1250px){div.svelte-1xshtt5{grid-template-columns:auto;grid-template-rows:min-content auto;padding-left:5vw;padding-right:5vw}}@media(max-width: 715px){div.svelte-1xshtt5{font-size:14px;grid-template-columns:auto;grid-template-rows:min-content auto;padding-left:5vw;padding-right:5vw}} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.js b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.js @@ -0,0 +1,2 @@ +var app=function(){"use strict";function e(){}function t(e,t){for(const n in t)e[n]=t[n];return e}function n(e){return e()}function r(){return Object.create(null)}function s(e){e.forEach(n)}function o(e){return"function"==typeof e}function c(e,t){return e!=e?t==t:e!==t||e&&"object"==typeof e||"function"==typeof e}let i;function a(e,t){return i||(i=document.createElement("a")),i.href=t,e===i.href}function l(t,...n){if(null==t)return e;const r=t.subscribe(...n);return r.unsubscribe?()=>r.unsubscribe():r}function u(e,t,n){e.$$.on_destroy.push(l(t,n))}function d(e,t,n,r){if(e){const s=p(e,t,n,r);return e[0](s)}}function p(e,n,r,s){return e[1]&&s?t(r.ctx.slice(),e[1](s(n))):r.ctx}function f(e,t,n,r){if(e[2]&&r){const s=e[2](r(n));if(void 0===t.dirty)return s;if("object"==typeof s){const e=[],n=Math.max(t.dirty.length,s.length);for(let r=0;r<n;r+=1)e[r]=t.dirty[r]|s[r];return e}return t.dirty|s}return t.dirty}function $(e,t,n,r,s,o){if(s){const c=p(t,n,r,o);e.p(c,s)}}function m(e){if(e.ctx.length>32){const t=[],n=e.ctx.length/32;for(let e=0;e<n;e++)t[e]=-1;return t}return-1}function h(e){const t={};for(const n in e)"$"!==n[0]&&(t[n]=e[n]);return t}function g(e,t){const n={};t=new Set(t);for(const r in e)t.has(r)||"$"===r[0]||(n[r]=e[r]);return n}function v(t){return t&&o(t.destroy)?t.destroy:e}function w(e,t){e.appendChild(t)}function b(e,t,n){e.insertBefore(t,n||null)}function y(e){e.parentNode&&e.parentNode.removeChild(e)}function x(e,t){for(let n=0;n<e.length;n+=1)e[n]&&e[n].d(t)}function k(e){return document.createElement(e)}function C(e){return document.createElementNS("http://www.w3.org/2000/svg",e)}function I(e){return document.createTextNode(e)}function S(){return I(" ")}function T(){return I("")}function O(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}function L(e){return function(t){return t.preventDefault(),e.call(this,t)}}function _(e){return function(t){return t.stopPropagation(),e.call(this,t)}}function q(e,t,n){null==n?e.removeAttribute(t):e.getAttribute(t)!==n&&e.setAttribute(t,n)}const P=["width","height"];function E(e,t){const n=Object.getOwnPropertyDescriptors(e.__proto__);for(const r in t)null==t[r]?e.removeAttribute(r):"style"===r?e.style.cssText=t[r]:"__value"===r?e.value=e[r]=t[r]:n[r]&&n[r].set&&-1===P.indexOf(r)?e[r]=t[r]:q(e,r,t[r])}function M(e,t){for(const n in t)q(e,n,t[n])}function A(e,t){t=""+t,e.data!==t&&(e.data=t)}function R(e,t){e.value=null==t?"":t}function W(e,t,n,r){null==n?e.style.removeProperty(t):e.style.setProperty(t,n,r?"important":"")}function F(e,t,n){for(let n=0;n<e.options.length;n+=1){const r=e.options[n];if(r.__value===t)return void(r.selected=!0)}n&&void 0===t||(e.selectedIndex=-1)}function B(e,t,n){e.classList[n?"add":"remove"](t)}class N{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,t,n=null){this.e||(this.is_svg?this.e=C(t.nodeName):this.e=k(11===t.nodeType?"TEMPLATE":t.nodeName),this.t="TEMPLATE"!==t.tagName?t:t.content,this.c(e)),this.i(n)}h(e){this.e.innerHTML=e,this.n=Array.from("TEMPLATE"===this.e.nodeName?this.e.content.childNodes:this.e.childNodes)}i(e){for(let t=0;t<this.n.length;t+=1)b(this.t,this.n[t],e)}p(e){this.d(),this.h(e),this.i(this.a)}d(){this.n.forEach(y)}}let z;function D(e){z=e}function H(){if(!z)throw new Error("Function called outside component initialization");return z}function j(e){H().$$.on_mount.push(e)}function U(e){H().$$.on_destroy.push(e)}function V(){const e=H();return(t,n,{cancelable:r=!1}={})=>{const s=e.$$.callbacks[t];if(s){const o=function(e,t,{bubbles:n=!1,cancelable:r=!1}={}){const s=document.createEvent("CustomEvent");return s.initCustomEvent(e,n,r,t),s}(t,n,{cancelable:r});return s.slice().forEach((t=>{t.call(e,o)})),!o.defaultPrevented}return!0}}function G(e,t){const n=e.$$.callbacks[t.type];n&&n.slice().forEach((e=>e.call(this,t)))}const Z=[],J=[];let Q=[];const X=[],Y=Promise.resolve();let K=!1;function ee(){K||(K=!0,Y.then(oe))}function te(e){Q.push(e)}function ne(e){X.push(e)}const re=new Set;let se=0;function oe(){if(0!==se)return;const e=z;do{try{for(;se<Z.length;){const e=Z[se];se++,D(e),ce(e.$$)}}catch(e){throw Z.length=0,se=0,e}for(D(null),Z.length=0,se=0;J.length;)J.pop()();for(let e=0;e<Q.length;e+=1){const t=Q[e];re.has(t)||(re.add(t),t())}Q.length=0}while(Z.length);for(;X.length;)X.pop()();K=!1,re.clear(),D(e)}function ce(e){if(null!==e.fragment){e.update(),s(e.before_update);const t=e.dirty;e.dirty=[-1],e.fragment&&e.fragment.p(e.ctx,t),e.after_update.forEach(te)}}const ie=new Set;let ae;function le(){ae={r:0,c:[],p:ae}}function ue(){ae.r||s(ae.c),ae=ae.p}function de(e,t){e&&e.i&&(ie.delete(e),e.i(t))}function pe(e,t,n,r){if(e&&e.o){if(ie.has(e))return;ie.add(e),ae.c.push((()=>{ie.delete(e),r&&(n&&e.d(1),r())})),e.o(t)}else r&&r()}function fe(e,t){const n={},r={},s={$$scope:1};let o=e.length;for(;o--;){const c=e[o],i=t[o];if(i){for(const e in c)e in i||(r[e]=1);for(const e in i)s[e]||(n[e]=i[e],s[e]=1);e[o]=i}else for(const e in c)s[e]=1}for(const e in r)e in n||(n[e]=void 0);return n}function $e(e,t,n){const r=e.$$.props[t];void 0!==r&&(e.$$.bound[r]=n,n(e.$$.ctx[r]))}function me(e){e&&e.c()}function he(e,t,r,c){const{fragment:i,after_update:a}=e.$$;i&&i.m(t,r),c||te((()=>{const t=e.$$.on_mount.map(n).filter(o);e.$$.on_destroy?e.$$.on_destroy.push(...t):s(t),e.$$.on_mount=[]})),a.forEach(te)}function ge(e,t){const n=e.$$;null!==n.fragment&&(!function(e){const t=[],n=[];Q.forEach((r=>-1===e.indexOf(r)?t.push(r):n.push(r))),n.forEach((e=>e())),Q=t}(n.after_update),s(n.on_destroy),n.fragment&&n.fragment.d(t),n.on_destroy=n.fragment=null,n.ctx=[])}function ve(t,n,o,c,i,a,l,u=[-1]){const d=z;D(t);const p=t.$$={fragment:null,ctx:[],props:a,update:e,not_equal:i,bound:r(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(n.context||(d?d.$$.context:[])),callbacks:r(),dirty:u,skip_bound:!1,root:n.target||d.$$.root};l&&l(p.root);let f=!1;if(p.ctx=o?o(t,n.props||{},((e,n,...r)=>{const s=r.length?r[0]:n;return p.ctx&&i(p.ctx[e],p.ctx[e]=s)&&(!p.skip_bound&&p.bound[e]&&p.bound[e](s),f&&function(e,t){-1===e.$$.dirty[0]&&(Z.push(e),ee(),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<<t%31}(t,e)),n})):[],p.update(),f=!0,s(p.before_update),p.fragment=!!c&&c(p.ctx),n.target){if(n.hydrate){const e=function(e){return Array.from(e.childNodes)}(n.target);p.fragment&&p.fragment.l(e),e.forEach(y)}else p.fragment&&p.fragment.c();n.intro&&de(t.$$.fragment),he(t,n.target,n.anchor,n.customElement),oe()}D(d)}class we{$destroy(){ge(this,1),this.$destroy=e}$on(t,n){if(!o(n))return e;const r=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return r.push(n),()=>{const e=r.indexOf(n);-1!==e&&r.splice(e,1)}}$set(e){var t;this.$$set&&(t=e,0!==Object.keys(t).length)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}function be(e){let n,r,s,o;const c=e[2].default,i=d(c,e,e[1],null);let a=[e[0]],l={};for(let e=0;e<a.length;e+=1)l=t(l,a[e]);return{c(){n=k("div"),i&&i.c(),E(n,l),B(n,"svelte-1jzk4ot",!0)},m(t,c){b(t,n,c),i&&i.m(n,null),r=!0,s||(o=O(n,"click",e[3]),s=!0)},p(e,[t]){i&&i.p&&(!r||2&t)&&$(i,c,e,e[1],r?f(c,e[1],t,null):m(e[1]),null),E(n,l=fe(a,[1&t&&e[0]])),B(n,"svelte-1jzk4ot",!0)},i(e){r||(de(i,e),r=!0)},o(e){pe(i,e),r=!1},d(e){e&&y(n),i&&i.d(e),s=!1,o()}}}function ye(e,n,r){const s=[];let o=g(n,s),{$$slots:c={},$$scope:i}=n;return e.$$set=e=>{n=t(t({},n),h(e)),r(0,o=g(n,s)),"$$scope"in e&&r(1,i=e.$$scope)},[o,i,c,function(t){G.call(this,e,t)}]}class xe extends we{constructor(e){super(),ve(this,e,ye,be,c,{})}}function ke(e,t,n){const r=e.slice();return r[8]=t[n],r}function Ce(e){let t,n,r,s=e[8].name+"";return{c(){t=k("option"),n=I(s),t.__value=r=e[8].value,t.value=t.__value},m(e,r){b(e,t,r),w(t,n)},p(e,o){2&o&&s!==(s=e[8].name+"")&&A(n,s),2&o&&r!==(r=e[8].value)&&(t.__value=r,t.value=t.__value)},d(e){e&&y(t)}}}function Ie(t){let n,r,c,i=t[1],a=[];for(let e=0;e<i.length;e+=1)a[e]=Ce(ke(t,i,e));return{c(){n=k("select");for(let e=0;e<a.length;e+=1)a[e].c();q(n,"aria-label",t[3]),q(n,"class","svelte-13a0xyj"),void 0===t[0]&&te((()=>t[7].call(n)))},m(e,s){b(e,n,s);for(let e=0;e<a.length;e+=1)a[e]&&a[e].m(n,null);F(n,t[0],!0),r||(c=[O(n,"change",t[7]),O(n,"change",(function(){o(t[2])&&t[2].apply(this,arguments)})),O(n,"change",t[4]),O(n,"contextmenu",t[5]),O(n,"input",t[6])],r=!0)},p(e,[r]){if(t=e,2&r){let e;for(i=t[1],e=0;e<i.length;e+=1){const s=ke(t,i,e);a[e]?a[e].p(s,r):(a[e]=Ce(s),a[e].c(),a[e].m(n,null))}for(;e<a.length;e+=1)a[e].d(1);a.length=i.length}8&r&&q(n,"aria-label",t[3]),3&r&&F(n,t[0])},i:e,o:e,d(e){e&&y(n),x(a,e),r=!1,s(c)}}}function Se(e,t,n){let{values:r}=t,{value:s}=t,{onChange:o}=t,{ariaLabel:c}=t;return e.$$set=e=>{"values"in e&&n(1,r=e.values),"value"in e&&n(0,s=e.value),"onChange"in e&&n(2,o=e.onChange),"ariaLabel"in e&&n(3,c=e.ariaLabel)},[s,r,o,c,function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(){s=function(e){const t=e.querySelector(":checked");return t&&t.__value}(this),n(0,s),n(1,r)}]}let Te=class extends we{constructor(e){super(),ve(this,e,Se,Ie,c,{values:1,value:0,onChange:2,ariaLabel:3})}};function Oe(t){let n,r;return{c(){n=C("svg"),r=C("path"),q(r,"d","M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"),q(n,"style",t[0]),q(n,"xmlns","http://www.w3.org/2000/svg"),q(n,"height","20px"),q(n,"viewBox","0 0 24 24"),q(n,"width","20px"),q(n,"fill","currentColor")},m(e,t){b(e,n,t),w(n,r)},p(e,[t]){1&t&&q(n,"style",e[0])},i:e,o:e,d(e){e&&y(n)}}}function Le(e,t,n){let{style:r=""}=t;return e.$$set=e=>{"style"in e&&n(0,r=e.style)},[r]}class _e extends we{constructor(e){super(),ve(this,e,Le,Oe,c,{style:0})}}function qe(t){let n,r;return{c(){n=C("svg"),r=C("path"),q(r,"d","m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z"),q(n,"style",t[0]),q(n,"xmlns","http://www.w3.org/2000/svg"),q(n,"height","20px"),q(n,"viewBox","0 -960 960 960"),q(n,"width","20px"),q(n,"fill","currentColor")},m(e,t){b(e,n,t),w(n,r)},p(e,[t]){1&t&&q(n,"style",e[0])},i:e,o:e,d(e){e&&y(n)}}}function Pe(e,t,n){let{style:r=""}=t;return e.$$set=e=>{"style"in e&&n(0,r=e.style)},[r]}class Ee extends we{constructor(e){super(),ve(this,e,Pe,qe,c,{style:0})}}function Me(n){let r,o,c,i=[n[1]],a={};for(let e=0;e<i.length;e+=1)a=t(a,i[e]);return{c(){r=k("input"),E(r,a),B(r,"svelte-z6c0dv",!0)},m(e,t){b(e,r,t),r.autofocus&&r.focus(),R(r,n[0]),o||(c=[O(r,"input",n[15]),O(r,"blur",n[2]),O(r,"change",n[3]),O(r,"click",n[4]),O(r,"contextmenu",n[5]),O(r,"focus",n[6]),O(r,"keydown",n[7]),O(r,"keypress",n[8]),O(r,"keyup",n[9]),O(r,"mouseover",n[10]),O(r,"mouseenter",n[11]),O(r,"mouseleave",n[12]),O(r,"paste",n[13]),O(r,"input",n[14])],o=!0)},p(e,[t]){E(r,a=fe(i,[2&t&&e[1]])),1&t&&r.value!==e[0]&&R(r,e[0]),B(r,"svelte-z6c0dv",!0)},i:e,o:e,d(e){e&&y(r),o=!1,s(c)}}}function Ae(e,n,r){const s=["value"];let o=g(n,s),{value:c}=n;return e.$$set=e=>{n=t(t({},n),h(e)),r(1,o=g(n,s)),"value"in e&&r(0,c=e.value)},[c,o,function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(){c=this.value,r(0,c)}]}class Re extends we{constructor(e){super(),ve(this,e,Ae,Me,c,{value:0})}}function We(e){let n,r;const s=e[2].default,o=d(s,e,e[1],null);let c=[e[0]],i={};for(let e=0;e<c.length;e+=1)i=t(i,c[e]);return{c(){n=k("span"),o&&o.c(),E(n,i),B(n,"svelte-1auan3b",!0)},m(e,t){b(e,n,t),o&&o.m(n,null),r=!0},p(e,[t]){o&&o.p&&(!r||2&t)&&$(o,s,e,e[1],r?f(s,e[1],t,null):m(e[1]),null),E(n,i=fe(c,[1&t&&e[0]])),B(n,"svelte-1auan3b",!0)},i(e){r||(de(o,e),r=!0)},o(e){pe(o,e),r=!1},d(e){e&&y(n),o&&o.d(e)}}}function Fe(e,n,r){const s=[];let o=g(n,s),{$$slots:c={},$$scope:i}=n;return e.$$set=e=>{n=t(t({},n),h(e)),r(0,o=g(n,s)),"$$scope"in e&&r(1,i=e.$$scope)},[o,i,c]}class Be extends we{constructor(e){super(),ve(this,e,Fe,We,c,{})}}const Ne=[];function ze(t,n=e){let r;const s=new Set;function o(e){if(c(t,e)&&(t=e,r)){const e=!Ne.length;for(const e of s)e[1](),Ne.push(e,t);if(e){for(let e=0;e<Ne.length;e+=2)Ne[e][0](Ne[e+1]);Ne.length=0}}}return{set:o,update:function(e){o(e(t))},subscribe:function(c,i=e){const a=[c,i];return s.add(a),1===s.size&&(r=n(o)||e),c(t),()=>{s.delete(a),0===s.size&&r&&(r(),r=null)}}}}function De(t,n,r){const c=!Array.isArray(t),i=c?[t]:t,a=n.length<2;return u=t=>{let r=!1;const u=[];let d=0,p=e;const f=()=>{if(d)return;p();const r=n(c?u[0]:u,t);a?t(r):p=o(r)?r:e},$=i.map(((e,t)=>l(e,(e=>{u[t]=e,d&=~(1<<t),r&&f()}),(()=>{d|=1<<t}))));return r=!0,f(),function(){s($),p(),r=!1}},{subscribe:ze(r,u).subscribe};var u}const He=ze(null),je=ze(null);function Ue(e,t,n){const r=e.slice();return r[14]=t[n],r}function Ve(t){let n,r=(t[4].i18n.getMessage("excludeFromRedirecting")||"Excluded from redirecting")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Ge(e){let t,n;return t=new Be({props:{$$slots:{default:[Ve]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},p(e,n){const r={};131072&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function Ze(e){let t,n,r,s,o,c,i,a,l,u,d,p;function f(t){e[7](t)}let $={placeholder:e[3],"aria-label":"Add url exception input"};function m(t){e[9](t)}void 0!==e[2]&&($.value=e[2]),n=new Re({props:$}),J.push((()=>$e(n,"value",f))),n.$on("keydown",e[8]);let h={values:[{value:"url",name:"URL"},{value:"regex",name:"Regex"}]};return void 0!==e[0]&&(h.value=e[0]),o=new Te({props:h}),J.push((()=>$e(o,"value",m))),l=new _e({}),{c(){t=k("div"),me(n.$$.fragment),s=S(),me(o.$$.fragment),i=S(),a=k("button"),me(l.$$.fragment),q(a,"class","add svelte-kqf76d"),q(a,"aria-label","Add the url exception")},m(r,c){b(r,t,c),he(n,t,null),w(t,s),he(o,t,null),b(r,i,c),b(r,a,c),he(l,a,null),u=!0,d||(p=O(a,"click",e[6]),d=!0)},p(e,t){const s={};8&t&&(s.placeholder=e[3]),!r&&4&t&&(r=!0,s.value=e[2],ne((()=>r=!1))),n.$set(s);const i={};!c&&1&t&&(c=!0,i.value=e[0],ne((()=>c=!1))),o.$set(i)},i(e){u||(de(n.$$.fragment,e),de(o.$$.fragment,e),de(l.$$.fragment,e),u=!0)},o(e){pe(n.$$.fragment,e),pe(o.$$.fragment,e),pe(l.$$.fragment,e),u=!1},d(e){e&&y(t),ge(n),ge(o),e&&y(i),e&&y(a),ge(l),d=!1,p()}}}function Je(e){let t,n,r,s,o,c,i,a=e[14]+"";function l(){return e[10](e[14])}return s=new Ee({}),{c(){t=I(a),n=S(),r=k("button"),me(s.$$.fragment),q(r,"class","add svelte-kqf76d")},m(e,a){b(e,t,a),b(e,n,a),b(e,r,a),he(s,r,null),o=!0,c||(i=O(r,"click",l),c=!0)},p(n,r){e=n,(!o||2&r)&&a!==(a=e[14]+"")&&A(t,a)},i(e){o||(de(s.$$.fragment,e),o=!0)},o(e){pe(s.$$.fragment,e),o=!1},d(e){e&&y(t),e&&y(n),e&&y(r),ge(s),c=!1,i()}}}function Qe(e){let t,n,r,s;return t=new xe({props:{$$slots:{default:[Je]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment),n=S(),r=k("hr")},m(e,o){he(t,e,o),b(e,n,o),b(e,r,o),s=!0},p(e,n){const r={};131074&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(de(t.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),e&&y(r)}}}function Xe(e){let t,n,r,s,o,c,i,a,l;t=new xe({props:{$$slots:{default:[Ge]},$$scope:{ctx:e}}}),s=new xe({props:{$$slots:{default:[Ze]},$$scope:{ctx:e}}});let u=[...e[1].exceptions.url,...e[1].exceptions.regex],d=[];for(let t=0;t<u.length;t+=1)d[t]=Qe(Ue(e,u,t));const p=e=>pe(d[e],1,1,(()=>{d[e]=null}));return{c(){me(t.$$.fragment),n=S(),r=k("div"),me(s.$$.fragment),o=S(),c=k("hr"),i=S(),a=k("div");for(let e=0;e<d.length;e+=1)d[e].c();q(a,"class","checklist"),q(r,"dir","ltr")},m(e,u){he(t,e,u),b(e,n,u),b(e,r,u),he(s,r,null),w(r,o),w(r,c),w(r,i),w(r,a);for(let e=0;e<d.length;e+=1)d[e]&&d[e].m(a,null);l=!0},p(e,[n]){const r={};131072&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r);const o={};if(131085&n&&(o.$$scope={dirty:n,ctx:e}),s.$set(o),34&n){let t;for(u=[...e[1].exceptions.url,...e[1].exceptions.regex],t=0;t<u.length;t+=1){const r=Ue(e,u,t);d[t]?(d[t].p(r,n),de(d[t],1)):(d[t]=Qe(r),d[t].c(),de(d[t],1),d[t].m(a,null))}for(le(),t=u.length;t<d.length;t+=1)p(t);ue()}},i(e){if(!l){de(t.$$.fragment,e),de(s.$$.fragment,e);for(let e=0;e<u.length;e+=1)de(d[e]);l=!0}},o(e){pe(t.$$.fragment,e),pe(s.$$.fragment,e),d=d.filter(Boolean);for(let e=0;e<d.length;e+=1)pe(d[e]);l=!1},d(e){ge(t,e),e&&y(n),e&&y(r),ge(s),x(d,e)}}}function Ye(e,t,n){let r;const s=window.browser||window.chrome;let o;const c=He.subscribe((e=>n(1,o=e))),i=je.subscribe((e=>e));U((()=>{c(),i()}));let a="url",l="";function u(e){let t;t=o.exceptions.url.indexOf(e),t>-1?o.exceptions.url.splice(t,1):(t=o.exceptions.regex.indexOf(e),t>-1&&o.exceptions.regex.splice(t,1)),He.set(o)}function d(){let e=!1;"url"==a&&/^(ftp|http|https):\/\/[^ "]+$/.test(l)?(e=!0,o.exceptions.url.includes(l)||o.exceptions.url.push(l)):"regex"==a&&(e=!0,o.exceptions.regex.includes(l)||o.exceptions.regex.push(l)),e&&(He.set(o),n(2,l=""))}return e.$$.update=()=>{1&e.$$.dirty&&n(3,r="url"==a?"https://www.google.com":"https?://(www.|)youtube.com/")},[a,o,l,r,s,u,d,function(e){l=e,n(2,l)},e=>{"Enter"===e.key&&d()},function(e){a=e,n(0,a)},e=>u(e)]}class Ke extends we{constructor(e){super(),ve(this,e,Ye,Xe,c,{})}}function et(e){let n,r,s,o;const c=e[3].default,i=d(c,e,e[2],null);let a=[e[0],e[1]],l={};for(let e=0;e<a.length;e+=1)l=t(l,a[e]);return{c(){n=k("button"),i&&i.c(),E(n,l),B(n,"svelte-efu498",!0)},m(t,c){b(t,n,c),i&&i.m(n,null),n.autofocus&&n.focus(),r=!0,s||(o=O(n,"click",e[4]),s=!0)},p(e,[t]){i&&i.p&&(!r||4&t)&&$(i,c,e,e[2],r?f(c,e[2],t,null):m(e[2]),null),E(n,l=fe(a,[1&t&&e[0],2&t&&e[1]])),B(n,"svelte-efu498",!0)},i(e){r||(de(i,e),r=!0)},o(e){pe(i,e),r=!1},d(e){e&&y(n),i&&i.d(e),s=!1,o()}}}function tt(e,n,r){const s=[];let o=g(n,s),{$$slots:c={},$$scope:i}=n;return e.$$set=e=>{r(1,n=t(t({},n),h(e))),r(0,o=g(n,s)),"$$scope"in e&&r(2,i=e.$$scope)},n=h(n),[o,n,i,c,function(t){G.call(this,e,t)}]}class nt extends we{constructor(e){super(),ve(this,e,tt,et,c,{})}}function rt(n){let r,s,o=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{viewBox:"0 0 24 24"},{width:"24px"},{fill:"currentColor"}],c={};for(let e=0;e<o.length;e+=1)c=t(c,o[e]);return{c(){r=C("svg"),s=C("path"),q(s,"d","M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"),M(r,c)},m(e,t){b(e,r,t),w(r,s)},p(e,[t]){M(r,c=fe(o,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{viewBox:"0 0 24 24"},{width:"24px"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&y(r)}}}function st(e,n,r){const s=[];let o=g(n,s);return e.$$set=e=>{n=t(t({},n),h(e)),r(0,o=g(n,s))},[o]}class ot extends we{constructor(e){super(),ve(this,e,st,rt,c,{})}}function ct(n){let r,s,o=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{viewBox:"0 0 24 24"},{width:"24px"},{fill:"currentColor"}],c={};for(let e=0;e<o.length;e+=1)c=t(c,o[e]);return{c(){r=C("svg"),s=C("path"),q(s,"d","M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"),M(r,c)},m(e,t){b(e,r,t),w(r,s)},p(e,[t]){M(r,c=fe(o,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{viewBox:"0 0 24 24"},{width:"24px"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&y(r)}}}function it(e,n,r){const s=[];let o=g(n,s);return e.$$set=e=>{n=t(t({},n),h(e)),r(0,o=g(n,s))},[o]}class at extends we{constructor(e){super(),ve(this,e,it,ct,c,{})}}function lt(n){let r,s,o,c=[{xmlns:"http://www.w3.org/2000/svg"},{"enable-background":"new 0 0 24 24"},{height:"24px"},{viewBox:"0 0 24 24"},{width:"24px"},{fill:"currentColor"},n[0]],i={};for(let e=0;e<c.length;e+=1)i=t(i,c[e]);return{c(){r=C("svg"),s=C("path"),o=C("path"),q(s,"d","M12,5V2L8,6l4,4V7c3.31,0,6,2.69,6,6c0,2.97-2.17,5.43-5,5.91v2.02c3.95-0.49,7-3.85,7-7.93C20,8.58,16.42,5,12,5z"),q(o,"d","M6,13c0-1.65,0.67-3.15,1.76-4.24L6.34,7.34C4.9,8.79,4,10.79,4,13c0,4.08,3.05,7.44,7,7.93v-2.02 C8.17,18.43,6,15.97,6,13z"),M(r,i)},m(e,t){b(e,r,t),w(r,s),w(r,o)},p(e,[t]){M(r,i=fe(c,[{xmlns:"http://www.w3.org/2000/svg"},{"enable-background":"new 0 0 24 24"},{height:"24px"},{viewBox:"0 0 24 24"},{width:"24px"},{fill:"currentColor"},1&t&&e[0]]))},i:e,o:e,d(e){e&&y(r)}}}function ut(e,n,r){const s=[];let o=g(n,s);return e.$$set=e=>{n=t(t({},n),h(e)),r(0,o=g(n,s))},[o]}class dt extends we{constructor(e){super(),ve(this,e,ut,lt,c,{})}}function pt(e){return e[~~(e.length*Math.random())]}function ft(e){return new Promise((async t=>{let n,r=new XMLHttpRequest;r.timeout=5e3,r.ontimeout=()=>t(5e3),r.onerror=()=>t(),r.onreadystatechange=()=>{if(2==r.readyState)if(200==r.status){let e=(new Date).getTime();r.abort(),t(e-n)}else t(5e3+r.status)},r.open("GET",`${e}?_=${(new Date).getTime()}`,!0),n=(new Date).getTime(),r.send(null)}))}function $t(e){return new Promise((async t=>{let n,r=0;for(let s=0;s<3;s++)if(n=await ft(e),0!=s){if(n>=5e3)return void t(n);r+=n}r=parseInt(r/3),t(r)}))}function mt(e,t){let n=[];t>e.length&&(t=e.length);for(let r=0;r<t;r++){const t=e[Math.floor(Math.random()*e.length)];n.push(t)}return n}window.browser=window.browser||window.chrome;var ht={getRandomInstance:pt,getNextInstance:function(e,t){const n=t.indexOf(e);return-1===n?pt(t):t[(n+1)%t.length]},protocolHost:function(e){const t=e.pathname.replace(/\/$/,"");return"/TekstoLibre"==t&&e.host.endsWith("github.io")?`${e.protocol}//${e.host}${t.slice(0,-1)}`:e.username&&e.password?`${e.protocol}//${e.username}:${e.password}@${e.host}${t}`:`${e.protocol}//${e.host}${t}`},getList:function(e){return new Promise((t=>{let n;if("github"==e.fetchInstances)n="https://raw.githubusercontent.com/libredirect/instances/main/data.json";else{if("codeberg"!=e.fetchInstances)return t("disabled");n="https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json"}const r=new XMLHttpRequest;r.open("GET",n,!0),r.onreadystatechange=()=>{if(200===r.status&&r.readyState==XMLHttpRequest.DONE)return t(JSON.parse(r.responseText))},r.onerror=()=>t(),r.ontimeout=()=>t(),r.send(null)}))},getBlacklist:function(e){return new Promise((t=>{let n;if("github"==e.fetchInstances)n="https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json";else{if("codeberg"!=e.fetchInstances)return t("disabled");n="https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json"}const r=new XMLHttpRequest;r.open("GET",n,!0),r.onreadystatechange=()=>{200===r.status&&r.readyState==XMLHttpRequest.DONE&&t(JSON.parse(r.responseText))},r.onerror=()=>t(),r.ontimeout=()=>t(),r.send(null)}))},getConfig:function(){return new Promise((e=>{fetch("/config.json").then((e=>e.text())).then((t=>{e(JSON.parse(t))}))}))},getOptions:function(){return new Promise((e=>browser.storage.local.get("options",(t=>e(t.options)))))},getPingCache:function(){return new Promise((e=>browser.storage.local.get("pingCache",(t=>e(t.pingCache??{})))))},ping:$t,addressToLatLng:function(e){const t=new XMLHttpRequest;if(t.open("GET",`https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(e)}&format=json&limit=1`,!1),t.send(),200==t.status){const e=JSON.parse(t.responseText)[0];return e?{coordinate:`${e.lat},${e.lon}`,boundingbox:`${e.boundingbox[2]},${e.boundingbox[1]},${e.boundingbox[3]},${e.boundingbox[0]}`}:{}}},getQuery:function(e){let t="";return e.searchParams.has("q")?t=e.searchParams.get("q"):e.searchParams.has("query")&&(t=e.searchParams.has("query")),t},prefsEncoded:function(e){return new URLSearchParams(e).toString()},convertMapCentre:function(e){let[t,n,r]=[null,null,null];const s=e.pathname.match(/@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/);return s?[,n,t,r]=s:e.searchParams.has("center")&&([t,n]=e.searchParams.get("center").split(","),r=e.searchParams.get("zoom")??"17"),{zoom:r,lon:n,lat:t}},randomInstances:mt,style:function(e,t){const n=function(e,t){const n={text:"#fff",bgMain:"#121212",bgSecondary:"#202020",active:"#fbc117",danger:"#f04141",lightGrey:"#c3c3c3"},r={text:"black",bgMain:"white",bgSecondary:"#e4e4e4",active:"#fb9817",danger:"#f04141",lightGrey:"#c3c3c3"};return"dark"==e.theme?n:"light"==e.theme?r:t.matchMedia("(prefers-color-scheme: dark)").matches?n:r}(e,t);return`--text: ${n.text};\n --bg-main: ${n.bgMain};\n --bg-secondary: ${n.bgSecondary};\n --active: ${n.active};\n --danger: ${n.danger};\n --light-grey: ${n.lightGrey};`},autoPickInstance:async function(e,t){if(t){const n=e.findIndex((e=>t.href.startsWith(e)));n>=0&&e.splice(n,1)}const n=mt(e,5),r=await Promise.all([...n.map((async e=>[e,await $t(e)]))]);return r.sort(((e,t)=>e[1]-t[1])),r[0][0]}};const gt=void 0===browser.runtime.getBrowserInfo;let vt,wt;async function bt(){wt=await ht.getOptions(),vt=await ht.getConfig()}function yt(e,t,n,r){let s=[];if(t)n[t]&&(s=n[t]);else for(const t in r.services[e].frontends)n[t]&&s.push(...n[t]);return s}function xt(e,t,n,r,s){let o=n.services[e].targets;s&&(!("excludeTargets"in n.services[e].frontends[s])||"search"===e&&r.search.redirectGoogle||(o=o.filter((t=>!n.services[e].frontends[s].excludeTargets.includes(o.indexOf(t))))),"twitter"===e&&r.twitter.disableTwimg&&(o=o.splice(2)));for(const e in o){if(new RegExp(o[e]).test(t.href))return!0}return!1}function kt(e,t,n,r,s,o){if("main_frame"!=t&&"sub_frame"!=t&&"image"!=t)return;let c,i;if(o||1!=wt.redirectOnlyInIncognito||s){for(const a in vt.services){if(!o&&!wt[a].enabled)continue;if(!o&&1==wt[a].redirectOnlyInIncognito&&!s)continue;if(i=wt[a].frontend,vt.services[a].frontends[i].desktopApp&&"main_frame"!=t&&"main_frame"!=wt[a].redirectType&&(i=wt[a].embedFrontend),!xt(a,e,vt,wt,i)){i=null;continue}if("main_frame"!=t&&r&&"sub_frame"==wt[a].redirectType&&xt(a,r,vt,wt,i))return;if(vt.services[a].embeddable&&t!=wt[a].redirectType&&"both"!=wt[a].redirectType)return"block"==wt[a].unsupportedUrls?"CANCEL":void 0;let l=wt[i];if(void 0===l)break;if(vt.services[a].frontends[i].localhost&&"localhost"==wt[a].instance)c=`http://${i}.localhost:8080`;else{if(0===l.length)return`https://no-instance.libredirect.invalid?frontend=${encodeURIComponent(i)}&url=${encodeURIComponent(e.href)}`;c=ht.getRandomInstance(l)}if(n&&l.includes(n.origin))return"main_frame"==t?"BYPASSTAB":null;break}if(i)return function(e,t,n,r,s){switch(n){case"hyperpipe":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${r}${e.pathname}${e.search}`.replace(/\/search\?q=.*/,(e=>e.replace("?q=","/")));case"searx":case"searxng":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${r}/${e.search}`;case"websurfx":case"whoogle":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${r}/search${e.search}`;case"4get":{const t=e.searchParams.get("q");return null!==t?`${r}/web?s=${encodeURIComponent(t)}`:r}case"librey":for(const t in e.searchParams.keys())"q"!=t&&e.searchParams.delete(t);return`${r}/search.php${e.search}`;case"yattee":return e.searchParams.delete("si"),e.href.replace(/^https?:\/{2}/,"yattee://");case"freetube":case"freetubePwa":return e.searchParams.delete("si"),"freetube://"+e.href;case"poketube":if(e.searchParams.delete("si"),e.pathname.startsWith("/channel")){const t=/\/channel\/(.*)\/?$/.exec(e.pathname);if(t)return`${r}/channel?id=${t[1]}${e.search}`}return/\/@[a-z]+\//.exec(e.pathname)?r:`${r}${e.pathname}${e.search}`;case"small":case"libMedium":case"freedium":case"scribe":{const t=e.hostname.match(/^(link|cdn-images-\d+|.*)\.medium\.com/);if(t&&t.length>1){const n=t[1];if("link"!=n||!n.startsWith("cdn-images"))return`${r}/@${n}${e.pathname}${e.search}`}return`${r}${e.pathname}${e.search}`}case"translite":case"simplyTranslate":return`${r}/${e.search}`;case"send":case"mozhi":return r;case"libreTranslate":return`${r}/${e.search.replace("sl","source").replace("tl","target").replace("text","q")}`;case"osm":{if(t&&"earth.google.com"===t.host)return r;let n={layers:"mapnik"},s="#";const o=ht.convertMapCentre(e);if(o.zoom&&o.lon&&o.lat&&(s=`#map=${o.zoom}/${o.lon}/${o.lat}`),e.pathname.includes("/embed")){const t=ht.getQuery(e);let{coordinate:s,boundingbox:o}=ht.addressToLatLng(t);return n.bbox=o,n.marker=s,`${r}/export/embed.html?${ht.prefsEncoded(n)}`}if(e.pathname.includes("/dir")){if(e.searchParams.has("travelmode")){const t={driving:"fossgis_osrm_car",walking:"fossgis_osrm_foot",bicycling:"fossgis_osrm_bike",transit:"fossgis_osrm_car"};n.engine=t[e.searchParams.get("travelmode")]}const t=/\/dir\/([^@/]+)\/([^@/]+)\/@-?\d[0-9.]*,-?\d[0-9.]*,\d{1,2}[.z]/.exec(e.pathname),o=/\/dir\/([^@/]+)\//.exec(e.pathname);if(t){const e=ht.addressToLatLng(decodeURIComponent(t[1])).coordinate??"",r=ht.addressToLatLng(decodeURIComponent(t[2])).coordinate??"";n.route=`${e};${r}`}else if(o){const e=ht.addressToLatLng(decodeURIComponent(o[1])).coordinate??"";n.route=`${e};`}else{const t=ht.addressToLatLng(e.searchParams.get("origin")).coordinate??"",r=ht.addressToLatLng(e.searchParams.get("destination")).coordinate??"";n.route=`${t};${r}`}return`${r}/directions?${ht.prefsEncoded(n)}${s}`}const c=/\/place\/(.*?)\//;if(e.pathname.match(c))return`${r}/search?query=${e.pathname.match(c)[1]}${s}`;if(e.searchParams.has("ll")){const[t,n]=e.searchParams.get("ll").split(",");return`${r}/search?query=${t}%2C${n}`}if(e.searchParams.has("viewpoint")){const[t,n]=e.searchParams.get("viewpoint").split(",");return`${r}/search?query=${t}%2C${n}`}const i=ht.getQuery(e);return i?`${r}/search?query="${i}${s}&${ht.prefsEncoded(n)}`:`${r}/${s}&${ht.prefsEncoded(n)}`}case"breezeWiki":{let t,n="";return e.hostname.match(/^[a-zA-Z0-9-]+\.(?:fandom|wikia)\.com/)?(t=e.hostname.match(/^[a-zA-Z0-9-]+(?=\.(?:fandom|wikia)\.com)/),t="www"!=t&&t?`/${t}`:"",n=e.pathname):(t=e.pathname.match(/(?<=wiki\/w:c:)[a-zA-Z0-9-]+(?=:)/),t?(t="/"+t+"/wiki/",n=e.pathname.match(/(?<=wiki\/w:c:[a-zA-Z0-9-]+:).+/)):t=""),e.href.search(/Special:Search\?query/)>-1?`${r}${t}${n}${e.search}`.replace(/Special:Search\?query/,"search?q").replace(/\/wiki/,""):`${r}${t}${n}${e.search}`}case"rimgo":return e.href.search(/^https?:\/{2}(?:[im]\.)?stack\./)>-1?`${r}/stack${e.pathname}${e.search}`:`${r}${e.pathname}${e.search}`;case"redlib":case"libreddit":{const t=e.hostname.match(/^(?:((?:external-)?preview|i)\.)?redd\.it/);if(!t)return`${r}${e.pathname}${e.search}`;switch(t[1]){case"preview":return`${r}/preview/pre${e.pathname}${e.search}`;case"external-preview":return`${r}/preview/external-pre${e.pathname}${e.search}`;case"i":return`${r}/img${e.pathname}`}return`${r}/comments${e.pathname}`}case"teddit":return/^(?:(?:external-)?preview|i)\.redd\.it/.test(e.hostname)?""==e.search?`${r}${e.pathname}?teddit_proxy=${e.hostname}`:`${r}${e.pathname}${e.search}&teddit_proxy=${e.hostname}`:`${r}${e.pathname}${e.search}`;case"troddit":case"eddrit":return/^(?:(?:external-)?preview|i)\.redd\.it/.test(e.hostname)?r:`${r}${e.pathname}${e.search}`;case"neuters":{const t=e.pathname;return t.startsWith("/article/")||t.startsWith("/pf/")||t.startsWith("/arc/")||t.startsWith("/resizer/")?r:`${r}${t}`}case"dumb":return e.pathname.endsWith("-lyrics")?`${r}${e.pathname}`:`${r}${e.pathname}${e.search}`;case"intellectual":return`${r}${e.pathname}${e.search}`;case"ruralDictionary":return e.pathname.includes("/define.php")||e.pathname.includes("/random.php")||"/"==e.pathname?`${r}${e.pathname}${e.search}`:r;case"anonymousOverflow":{if("stackoverflow.com"==e.hostname){const t=/^\/a\/(\d+)\/?/.exec(e.pathname);return t?`${r}/questions/${t[1]}${e.search}`:`${r}${e.pathname}${e.search}`}if("/"==e.pathname||""==e.pathname)return`${r}${e.pathname}${e.search}`;const t=e.href.match(/https?:\/{2}(?:([a-zA-Z0-9-]+)\.(meta\.)?)?stackexchange\.com\//);if(t&&t.length>1)return t[2]?`${r}/exchange/${e.hostname}${e.pathname}${e.search}`:`${r}/exchange/${t[1]}${e.pathname}${e.search}`;const n=e.hostname.match(/(?:[a-zA-Z]+\.)?(?:askubuntu\.com|mathoverflow\.net|serverfault\.com|stackapps\.com|superuser\.com|stackoverflow\.com)/);return n?`${r}/exchange/${n[0]}${e.pathname}${e.search}`:`${r}${e.pathname}${e.search}`}case"biblioReads":return`${r}${e.pathname}${e.search}`;case"wikimore":{let t=e.host.split(".");return"wikipedia"!=t[0]&&"www"!=t[0]?`${r}/wiki/${e.hostname.split(".")[0]}${e.pathname}${e.search}${e.hash}`:`${r}${e.pathname}${e.search}${e.hash}`}case"wikiless":{let t=e.host.split(".");return"wikipedia"!=t[0]&&"www"!=t[0]&&("m"==t[0]?e.searchParams.append("mobileaction","toggle_view_mobile"):e.searchParams.append("lang",t[0]),"m"==t[1]&&e.searchParams.append("mobileaction","toggle_view_mobile")),`${r}${e.pathname}${e.search}${e.hash}`}case"offtiktok":case"proxiTok":return e.pathname.startsWith("/email")?r:`${r}${e.pathname}${e.search}`;case"waybackClassic":{const t=/^\/\web\/(?:[0-9]+)?\*\/(.*)/.exec(e.pathname);if(t){const e=t[1];return`${r}/cgi-bin/history.cgi?utf8=✓&q=${encodeURIComponent(e)}`}const n=/(^\/\web\/([0-9]+)\/.*)/.exec(e.pathname);if(n){let e=n[1];return e=e.replace(n[2],n[2]+"if_"),`https://web.archive.org${e}`}return}case"gothub":return"gist.github.com"==e.hostname?`${r}/gist${e.pathname}${e.search}`:"raw.githubusercontent.com"==e.hostname?`${r}/raw${e.pathname}${e.search}`:`${r}${e.pathname}${e.search}`;case"mikuInvidious":if("bilibili.com"==e.hostname||"www.bilibili.com"==e.hostname||"b23.tv"==e.hostname)return`${r}${e.pathname}${e.search}`;if("space.bilibili.com"==e.hostname)return`${r}/space${e.pathname}${e.search}`;case"tent":if("bandcamp.com"==e.hostname&&"/search"==e.pathname){const t=e.searchParams.get("q");return`${r}/search.php?query=${encodeURIComponent(t)}`}if(e.hostname.endsWith("bandcamp.com")){const t=/^(.*)\.bandcamp\.com/.exec(e.hostname)[1];if("/"==e.pathname||"/music"==e.pathname)return`${r}/artist.php?name=${t}`;{const n=/^\/(.*)\/(.*)/.exec(e.pathname);if(n)return`${r}/release.php?artist=${t}&type=${n[1]}&name=${n[2]}`}}if("f4.bcbits.com"==e.hostname)return`${r}/image.php?file=${/\/img\/(.*)/.exec(e.pathname)[1]}`;if("t4.bcbits.com"==e.hostname){const t=/\/stream\/(.*)\/(.*)\/(.*)/.exec(e.pathname);if(t){const n=t[1],s=t[2],o=t[3],c=e.searchParams.get("token");return`${r}/audio.php/?directory=${n}&format=${s}&file=${o}&token=${encodeURIComponent(c)}`}}case"binternet":return"i.pinimg.com"==e.hostname?`${r}/image_proxy.php?url=${encodeURIComponent(e.href)}`:`${r}${e.pathname}${e.search}`;case"painterest":if("i.pinimg.com"==e.hostname)return`${r}/_/proxy?url=${encodeURIComponent(e.href)}`;const n=/^\/pin\/[^\/]+/.exec(e.pathname);return n?`${r}${n[0]}`:`${r}${e.pathname}${e.search}`;case"laboratory":{let t=e.pathname;return"/"==t&&(t=""),`${r}/${e.hostname}${t}${e.search}`}case"quetre":{const t=/([a-z]+)\.quora\.com/.exec(e.hostname);if(t){const n=t[1];return e.searchParams.append("lang",n),`${r}${e.pathname}${e.search}`}return`${r}${e.pathname}${e.search}`}case"pixivViewer":case"liteXiv":case"pixivFe":{const t=/\/[a-z]{1,3}\/(.*)/.exec(e.pathname);return t?`${r}/${t[1]}${e.search}`:`${r}${e.pathname}${e.search}`}case"vixipy":{const t=/\/[a-z]{1,3}\/(.*)/.exec(e.pathname);if(t){let n=t[1];return n.startsWith("tags/")&&(n=n.replace(/tags/,"tag")),`${r}/${n}${e.search}`}return`${r}${e.pathname}${e.search}`}case"invidious":return e.searchParams.delete("si"),"sub_frame"==s&&e.searchParams.append("autoplay","0"),"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`${r}/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}&${e.search.substring(1)}`:e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/redirect?")?e.href:`${r}${e.pathname}${e.search}`;case"freetubeMusic":return"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`freetube://youtube.com/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}`:"freetube://"+e.href;case"invidiousMusic":return"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`${r}/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}`:`${r}${e.pathname}${e.search}`;case"materialious":if(e.searchParams.delete("si"),"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live"))return`${r}/watch/${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}${e.search.replace("?","&")}`;if(e.hostname.endsWith("youtube.com")){if(e.pathname.startsWith("/watch")){if(e.searchParams.has("v")){const t=e.searchParams.get("v");return e.searchParams.delete("v"),`${r}/watch/${t}${e.search.replace("?","&")}`}return`${r}/watch/${e.search.replace("?","&")}`}if(e.pathname.startsWith("/results")){if(e.searchParams.has("search_query")){const t=e.searchParams.get("search_query");return e.searchParams.delete("search_query"),`${r}/search/${t}${e.search.replace("?","&")}`}return`${r}/search/${e.search.replace("?","&")}`}if(e.pathname.startsWith("/redirect?"))return e.href}return`${r}${e.pathname}${e.search}`;case"libremdb":return/\/((?:name|title)\/\w+)\/?$/.exec(e.pathname)?`${r}${e.pathname}${e.search}`:r;case"tuboYoutube":return e.searchParams.delete("si"),e.pathname.startsWith("/channel")?`${r}/channel?url=${encodeURIComponent(e.href)}`:e.pathname.startsWith("/watch")?`${r}/stream?url=${encodeURIComponent(e.href)}`:r;case"tuboSoundcloud":return"/"==e.pathname?`${r}?kiosk?serviceId=1`:e.pathname.match(/^\/[^\/]+(\/$|$)/)?`${r}/channel?url=${encodeURIComponent(e.href)}`:e.pathname.match(/^\/[^\/]+\/[^\/]+/)?`${r}/stream?url=${encodeURIComponent(e.href)}`:r;case"twineo":case"safetwitch":return e.hostname.startsWith("clips.")?`${r}/clip${e.pathname}${e.search}`:`${r}${e.pathname}${e.search}`;case"tekstoLibre":return`${r}/?${e.pathname.slice(1)}`;case"skyview":return"/"==e.pathname?r:`${r}?url=${encodeURIComponent(e.href)}`;case"nitter":{let t=new URLSearchParams(e.search);if(t.delete("ref_src"),t.delete("ref_url"),t.delete("s"),t.delete("t"),t=t.toString(),""!==t&&(t=`?${t}`),"pbs"===e.host.split(".")[0]||"video"===e.host.split(".")[0])try{const[,n,s,o]=t.match(/(.*)\?format=(.*)&(.*)/),c=encodeURIComponent(`${n}.${s}?${o}`);return`${r}/pic${e.pathname}${c}`}catch{return`${r}/pic${e.pathname}${t}`}return e.pathname.split("/").includes("tweets")?`${r}${e.pathname.replace("/tweets","")}${t}`:"t.co"==e.host?`${r}/t.co${e.pathname}`:`${r}${e.pathname}${t}#m`}case"priviblur":{if("www.tumblr.com"==e.hostname)return`${r}${e.pathname}${e.search}`;if(e.hostname.startsWith("assets"))return`${r}/tblr/assets${e.pathname}${e.search}`;if(e.hostname.startsWith("static"))return`${r}/tblr/static${e.pathname}${e.search}`;const t=/^([0-9]+)\.media\.tumblr\.com/.exec(e.hostname);if(t)return`${r}/tblr/media/${t[1]}${e.pathname}${e.search}`;const n=/^(?:www\.)?([a-z\d-]+)\.tumblr\.com/.exec(e.hostname);if(n){const t=n[1];return e.pathname.startsWith("/post")?`${r}/${t}${e.pathname.slice(5)}${e.search}`:`${r}/${t}${e.pathname}${e.search}`}return`${r}${e.pathname}${e.search}`}case"ultimateTab":case"freetar":if(e.pathname.startsWith("/search.php"))return e.searchParams.set("search_term",e.searchParams.get("value")),e.searchParams.delete("value"),e.searchParams.delete("search_type"),`${r}/search${e.search}`;if(e.pathname.startsWith("/artist"))return;return`${r}${e.pathname}${e.search}`;case"ratAintTieba":return e.searchParams.delete("ie"),`${r}${e.pathname}${e.search}`;case"shoelace":{const t=/^\/(?:(?:(?:[^\/])?\/post)|t)\/([^\/])/.exec(e.pathname);return t?`${r}/t/${t[1]}${e.search}`:`${r}${e.pathname}${e.search}`}case"skunkyArt":{if(e.pathname.startsWith("/search"))return`${r}${e.pathname}${e.search}&type=all`;const t=/^\/(.*?)\/art\/(.*)\/?/.exec(e.pathname);if(t)return`${r}/post/${t[1]}/${t[2]}${e.search}`;const n=/^\/([^\/]+)$/.exec(e.pathname);if(n)return`${r}/group_user?q=${n[1]}&type=about`;const s=/^\/(.*?)\/gallery(\/$|$)$/.exec(e.pathname);return s?`${r}/group_user?q=${s[1]}&type=gallery`:`${r}${e.pathname}${e.search}`}case"ytify":{if(e.pathname.startsWith("/watch"))return`${r}/?s=${encodeURIComponent(e.searchParams.get("v"))}`;const t=/\/channel\/([^\/]+)/.exec(e.pathname);return t?`${r}/list?channel=${t[1]}`:e.pathname.startsWith("/playlist")?`${r}/list?playlists=${encodeURIComponent(e.searchParams.get("list"))}`:`${r}${e.pathname}${e.search}`}case"koub":return e.pathname.startsWith("/view/")||e.pathname.startsWith("/stories/")?`${r}${e.pathname}${e.search}`:/^\/([^\/]+)\/?$/.exec(e.pathname)?`${r}/account${e.pathname}${e.search}`:r;case"duckDuckGoAiChat":return"https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=1";case"soundcloak":if(e.pathname.startsWith("/feed")||e.pathname.startsWith("/stream"))return r;if(e.pathname.startsWith("/search")){if(!e.search)return r;let t="";return e.pathname.startsWith("/search/sounds")?t="tracks":e.pathname.startsWith("/search/people")?t="users":(e.pathname.startsWith("/search/albums")||e.pathname.startsWith("/search/sets"))&&(t="playlists"),t?(t="&type="+t,`${r}/search${e.search}${t}`):r}return"on.soundcloud.com"==e.host?`${r}/on${e.pathname}`:`${r}${e.pathname}${e.search}`;case"piped":case"pipedMaterial":case"cloudtube":case"lightTube":case"viewtube":e.searchParams.delete("si");default:return`${r}${e.pathname}${e.search}`}}(e,n,i,c,t)}}async function Ct(e){let t=await ht.getOptions(),n=await ht.getConfig();for(const r in n.services){let s=t[r].frontend;if(null!=t[s]&&(!(t[s].findIndex((t=>e.href.startsWith(t)))<0)||e.href.startsWith(`http://${s}.localhost:8080`)))switch(r){case"youtube":case"imdb":case"imgur":case"tiktok":case"reddit":case"imdb":case"snopes":case"urbanDictionary":case"quora":case"twitter":case"medium":case"pinterest":return`${n.services[r].url}${e.pathname}${e.search}`;case"fandom":{let t=e.pathname.match(/^\/([a-zA-Z0-9-]+)\/wiki\/(.*)/);return t?`https://${t[1]}.fandom.com/wiki/${t[2]}`:void 0}case"wikipedia":{const t=e.searchParams.get("lang");return null!=t?`https://${t}.wikipedia.org${e.pathname}${e.search}${e.hash}`:`https://wikipedia.org${e.pathname}${e.search}${e.hash}`}case"stackOverflow":if(e.pathname.startsWith("/questions/"))return`https://stackoverflow.com${e.pathname}${e.search}`;if(e.pathname.startsWith("/exchange/")){const t=/\/exchange\/(.*?)(\/.*)/.exec(e.pathname);if(t)return t[1].includes(".")?`https://${t[1]}${t[2]}`:`https://${t[1]}.stackexchange.com${t[2]}`}return;case"tekstowo":return`${n.services[r].url}/${e.search.slice(1)}`;case"goodreads":return`https://goodreads.com${e.pathname}${e.search}`;case"soundcloud":if("soundcloak"==s){if(e.pathname.includes("/_/"))return`${n.services[r].url}${e.pathname.split("/_/")[0]}`;if("/search"==e.pathname){let t=e.searchParams.get("type");switch(t){case"playlists":t="sets";break;case"tracks":t="sounds";break;case"users":t="people";break;default:t=""}return e.searchParams.delete("type"),t?`${n.services[r].url}/search/${t}?${e.searchParams.toString()}`:`${n.services[r].url}/search?${e.searchParams.toString()}`}return`${n.services[r].url}${e.pathname}`}default:return}}}window.browser=window.browser||window.chrome,bt(),browser.storage.onChanged.addListener(bt);const It={materialious:["https://app.materialio.us"],viewtube:["https://viewtube.io"],piped:["https://pipedapi-libre.kavin.rocks"],pipedMaterial:["https://piped-material.xn--17b.net"],cloudtube:["https://tube.cadence.moe"],lightTube:["https://tube.kuylar.dev"],poketube:["https://poketube.fun"],proxiTok:["https://proxitok.pabloferreiro.es"],offtiktok:["https://www.offtiktok.com"],redlib:["https://safereddit.com"],eddrit:["https://eddrit.com"],troddit:["https://www.troddit.com"],scribe:["https://scribe.rip"],libMedium:["https://md.vern.cc"],small:["https://small.bloat.cat"],freedium:["https://freedium.cfd"],quetre:["https://quetre.iket.me"],libremdb:["https://libremdb.iket.me"],simplyTranslate:["https://simplytranslate.org"],translite:["https://tl.bloat.cat"],mozhi:["https://mozhi.aryak.me"],searxng:["https://nyc1.sx.ggtyler.dev"],"4get":["https://4get.ca"],websurfx:["https://alamin655-spacex.hf.space"],rimgo:["https://rimgo.vern.cc"],hyperpipe:["https://hyperpipe.surge.sh"],osm:["https://www.openstreetmap.org"],breezeWiki:["https://breezewiki.com"],neuters:["https://neuters.de"],dumb:["https://dm.vern.cc"],intellectual:["https://intellectual.insprill.net"],ruralDictionary:["https://rd.vern.cc"],anonymousOverflow:["https://code.whatever.social"],suds:["https://sd.vern.cc"],unfunny:["https://uf.vern.cc"],soprano:["https://sp.vern.cc"],meme:["https://mm.vern.cc"],waybackClassic:["https://wayback-classic.net"],tent:["https://tent.sny.sh"],laboratory:["https://lab.vern.cc"],binternet:["https://bn.bloat.cat"],painterest:["https://pt.bloat.cat"],pixivFe:["https://pixiv.perennialte.ch"],liteXiv:["https://litexiv.465321.best","https://litexiv.bloat.cat"],pixivViewer:["https://pixiv.pictures"],vixipy:["https://vx.maid.zone"],indestructables:["https://indestructables.private.coffee"],destructables:["https://ds.vern.cc"],structables:["https://structables.private.coffee"],safetwitch:["https://safetwitch.drgns.space"],twineo:["https://twineo.exozy.me"],proxigram:["https://ig.opnxng.com"],tuboYoutube:["https://tubo.media"],tuboSoundcloud:["https://tubo.media"],tekstoLibre:["https://davilarek.github.io/TekstoLibre"],skyview:["https://skyview.social"],priviblur:["https://pb.bloat.cat"],nitter:["https://nitter.privacydev.net"],pasted:["https://pasted.drakeerv.com"],pasty:["https://pasty.lus.pm"],freetar:["https://freetar.de"],ultimateTab:["https://ultimate-tab.com"],ratAintTieba:["https://rat.fis.land"],shoelace:["https://shoelace.mint.lgbt"],skunkyArt:["https://skunky.bloat.cat"],ytify:["https://ytify.pp.ua"],nerdsForNerds:["https://nn.vern.cc"],ducksForDucks:["https://ducksforducks.private.coffee"],koub:["https://koub.clovius.club"],soundcloak:["https://soundcloak.fly.dev"],gocook:["https://cook.adminforge.de"],wikimore:["https://wikimore.private.coffee"],libreTranslate:["https://libretranslate.com"],cryptPad:["https://cryptpad.org"]};async function St(){let e=await ht.getConfig(),t={};for(const n in e.services){t[n]={};for(const r in e.services[n].options)t[n][r]=e.services[n].options[r];for(const r in e.services[n].frontends)e.services[n].frontends[r].instanceList&&(t[r]=[])}return t.exceptions={url:[],regex:[]},t.theme="detect",t.popupServices=["youtube","tiktok","imgur","reddit","quora","translate","maps"],t.fetchInstances="github",t.redirectOnlyInIncognito=!1,t={...t,...It},t}var Tt={redirect:kt,redirectAsync:async function(e,t,n,r,s,o){return await bt(),kt(e,t,n,r,s,o)},computeServiceFrontend:async function(e){const t=await ht.getConfig(),n=await ht.getOptions();for(const r in t.services){if(xt(r,e,t,n))return{service:r,frontend:null};for(const s in t.services[r].frontends){const o=yt(r,s,n,t).findIndex((t=>e.href.startsWith(t)));if(o>=0)return{service:r,frontend:s}}}},reverse:Ct,initDefaults:function(){return new Promise((e=>{browser.storage.local.clear((async()=>{wt=await St(),browser.storage.local.set({options:wt},(()=>e()))}))}))},processUpdate:function(e){return new Promise((async t=>{const n=await ht.getConfig();let r=e??await ht.getOptions();const s=await St();for(const e in r)if(e in s){if("object"==typeof e&&null!==e)for(const t in r[e])t in s[e]||delete r[e][t]}else delete r[e];r.popupServices=r.popupServices.filter((e=>e in n.services));for(const[e,t]of Object.entries(s))e in r||(r[e]=t);for(const[e,t]of Object.entries(n.services)){r[e].frontend in t.frontends||(r[e]=t.options);for(const n in t.options)n in r[e]||(r[e][n]=t.options[n])}browser.storage.local.clear((()=>browser.storage.local.set({options:r},(()=>t()))))}))},copyRaw:async function(e){const t=await Ct(e);if(t)if(gt){var n=document.createElement("textarea");n.textContent=t,document.body.appendChild(n),n.select(),document.execCommand("copy"),n.blur(),document.body.removeChild(n)}else navigator.clipboard.writeText(t)},switchInstance:function(e,t){return new Promise((async n=>{let r=await ht.getOptions(),s=await ht.getConfig();if(ht.protocolHost(e),t){const s=r[r[t].frontend];if(void 0!==s){const t=ht.getNextInstance(e.origin,s);if(t)return n(`${t}${e.pathname}${e.search}`)}}else for(const t in s.services){let s=r[r[t].frontend];if(void 0===s)continue;const o=s.findIndex((t=>e.href.startsWith(t)));if(o<0)continue;if(s.splice(o,1),0===s.length)return n();const c=ht.getNextInstance(e.origin,s);if(c)return n(`${c}${e.pathname}${e.search}`)}n()}))},isException:function(e){if(!wt)return!1;if(!wt.exceptions)return!1;let t=wt.exceptions;if(t&&e){if(t.url)for(let n of t.url)if(n=new URL(n),n=n.href.replace(/^http:\/\//,"https://"),n==e.href)return!0;if(t.regex)for(const n of t.regex)if(new RegExp(n).test(e.href))return!0}return!1}};function Ot(t){let n,r,s,o,c=(t[2].i18n.getMessage("importSettings")||"Import Settings")+"";return n=new at({props:{class:"margin margin_"+document.body.dir}}),{c(){me(n.$$.fragment),r=S(),s=I(c)},m(e,t){he(n,e,t),b(e,r,t),b(e,s,t),o=!0},p:e,i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){ge(n,e),e&&y(r),e&&y(s)}}}function Lt(t){let n,r,s,o,c=(t[2].i18n.getMessage("exportSettings")||"Export Settings")+"";return n=new ot({props:{class:"margin margin_"+document.body.dir}}),{c(){me(n.$$.fragment),r=S(),s=I(c)},m(e,t){he(n,e,t),b(e,r,t),b(e,s,t),o=!0},p:e,i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){ge(n,e),e&&y(r),e&&y(s)}}}function _t(t){let n,r,s,o,c=(t[2].i18n.getMessage("exportSettingsToSync")||"Export Settings to Sync")+"";return n=new ot({props:{class:"margin margin_"+document.body.dir}}),{c(){me(n.$$.fragment),r=S(),s=I(c)},m(e,t){he(n,e,t),b(e,r,t),b(e,s,t),o=!0},p:e,i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){ge(n,e),e&&y(r),e&&y(s)}}}function qt(t){let n,r,s,o,c=(t[2].i18n.getMessage("importSettingsFromSync")||"Import Settings from Sync")+"";return n=new at({props:{class:"margin margin_"+document.body.dir}}),{c(){me(n.$$.fragment),r=S(),s=I(c)},m(e,t){he(n,e,t),b(e,r,t),b(e,s,t),o=!0},p:e,i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){ge(n,e),e&&y(r),e&&y(s)}}}function Pt(t){let n,r,s,o,c=(t[2].i18n.getMessage("resetSettings")||"Reset Settings")+"";return n=new dt({props:{class:"margin margin_"+document.body.dir}}),{c(){me(n.$$.fragment),r=S(),s=I(c)},m(e,t){he(n,e,t),b(e,r,t),b(e,s,t),o=!0},p:e,i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){ge(n,e),e&&y(r),e&&y(s)}}}function Et(e){let t,n,r,s,o,c,i,a,l,u,d,p,f,$,m;return n=new nt({props:{$$slots:{default:[Ot]},$$scope:{ctx:e}}}),n.$on("click",e[7]),c=new nt({props:{$$slots:{default:[Lt]},$$scope:{ctx:e}}}),c.$on("click",e[3]),a=new nt({props:{$$slots:{default:[_t]},$$scope:{ctx:e}}}),a.$on("click",e[4]),u=new nt({props:{$$slots:{default:[qt]},$$scope:{ctx:e}}}),u.$on("click",e[5]),p=new nt({props:{$$slots:{default:[Pt]},$$scope:{ctx:e}}}),p.$on("click",e[6]),{c(){t=k("div"),me(n.$$.fragment),r=S(),s=k("input"),o=S(),me(c.$$.fragment),i=S(),me(a.$$.fragment),l=S(),me(u.$$.fragment),d=S(),me(p.$$.fragment),q(s,"type","file"),q(s,"accept",".json"),W(s,"display","none"),q(t,"class","buttons")},m(h,g){b(h,t,g),he(n,t,null),w(t,r),w(t,s),e[8](s),w(t,o),he(c,t,null),w(t,i),he(a,t,null),w(t,l),he(u,t,null),w(t,d),he(p,t,null),f=!0,$||(m=O(s,"change",e[9]),$=!0)},p(e,[t]){const r={};4096&t&&(r.$$scope={dirty:t,ctx:e}),n.$set(r);const s={};4096&t&&(s.$$scope={dirty:t,ctx:e}),c.$set(s);const o={};4096&t&&(o.$$scope={dirty:t,ctx:e}),a.$set(o);const i={};4096&t&&(i.$$scope={dirty:t,ctx:e}),u.$set(i);const l={};4096&t&&(l.$$scope={dirty:t,ctx:e}),p.$set(l)},i(e){f||(de(n.$$.fragment,e),de(c.$$.fragment,e),de(a.$$.fragment,e),de(u.$$.fragment,e),de(p.$$.fragment,e),f=!0)},o(e){pe(n.$$.fragment,e),pe(c.$$.fragment,e),pe(a.$$.fragment,e),pe(u.$$.fragment,e),pe(p.$$.fragment,e),f=!1},d(r){r&&y(t),ge(n),e[8](null),ge(c),ge(a),ge(u),ge(p),$=!1,m()}}}function Mt(e,t,n){const r=window.browser||window.chrome;let s;let o,c;U(He.subscribe((e=>s=e)));return e.$$.update=()=>{if(1&e.$$.dirty&&c){const e=new FileReader;e.readAsText(c[0]),e.onload=async()=>{let t=JSON.parse(e.result);t.version!=r.runtime.getManifest().version&&alert("Importing from a previous version. Be careful"),await Tt.processUpdate(t),He.set(await ht.getOptions())},e.onerror=e=>{console.log("error",e),alert("Error!")}}},[c,o,r,async function(){s.version=r.runtime.getManifest().version;const e=JSON.stringify(s,null," "),t=document.createElement("a");t.href="data:application/json;base64,"+btoa(e),t.download=`libredirect-settings-v${s.version}-${(new Date).toISOString().replace(":","-").slice(0,-5)}.json`,t.click()},async function(){s.version=r.runtime.getManifest().version,r.storage.sync.set({options:s})},async function(){r.storage.sync.get({options:He},(async e=>{let t=e.options;t.version!=r.runtime.getManifest().version&&alert("Importing from a previous version. Be careful"),await Tt.processUpdate(t),He.set(await ht.getOptions())}))},async function(){await Tt.initDefaults(),He.set(await ht.getOptions())},()=>o.click(),function(e){J[e?"unshift":"push"]((()=>{o=e,n(1,o)}))},function(){c=this.files,n(0,c)}]}class At extends we{constructor(e){super(),ve(this,e,Mt,Et,c,{})}}function Rt(n){let r,c,i,a,l=[{class:c=document.body.dir},n[2],{type:"checkbox"}],u={};for(let e=0;e<l.length;e+=1)u=t(u,l[e]);return{c(){r=k("input"),E(r,u),B(r,"svelte-1i76whx",!0)},m(e,t){b(e,r,t),r.autofocus&&r.focus(),r.checked=n[0],i||(a=[O(r,"change",n[3]),O(r,"change",(function(){o(n[1])&&n[1].apply(this,arguments)}))],i=!0)},p(e,[t]){n=e,E(r,u=fe(l,[{class:c},4&t&&n[2],{type:"checkbox"}])),1&t&&(r.checked=n[0]),B(r,"svelte-1i76whx",!0)},i:e,o:e,d(e){e&&y(r),i=!1,s(a)}}}function Wt(e,n,r){const s=["checked","onChange"];let o=g(n,s),{checked:c}=n,{onChange:i}=n;return e.$$set=e=>{n=t(t({},n),h(e)),r(2,o=g(n,s)),"checked"in e&&r(0,c=e.checked),"onChange"in e&&r(1,i=e.onChange)},[c,i,o,function(){c=this.checked,r(0,c)}]}class Ft extends we{constructor(e){super(),ve(this,e,Wt,Rt,c,{checked:0,onChange:1})}}function Bt(t){let n,r=(t[3].i18n.getMessage("theme")||"Theme")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Nt(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[Bt]},$$scope:{ctx:e}}}),r=new Te({props:{values:[{value:"detect",name:e[3].i18n.getMessage("auto")||"Auto"},{value:"light",name:e[3].i18n.getMessage("light")||"Light"},{value:"dark",name:e[3].i18n.getMessage("dark")||"Dark"}],value:e[2].theme,onChange:e[4]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};512&n&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};4&n&&(o.value=e[2].theme),4&n&&(o.onChange=e[4]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function zt(t){let n,r=(t[3].i18n.getMessage("fetchPublicInstances")||"Fetch public instances")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Dt(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[zt]},$$scope:{ctx:e}}}),r=new Te({props:{value:e[2].fetchInstances,values:[{value:"github",name:"GitHub"},{value:"codeberg",name:"Codeberg"},{value:"disable",name:e[3].i18n.getMessage("disable")||"Disable"}],onChange:e[5]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};512&n&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};4&n&&(o.value=e[2].fetchInstances),4&n&&(o.onChange=e[5]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function Ht(t){let n,r=(t[3].i18n.getMessage("redirectOnlyInIncognito")||"Redirect Only in Incognito")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function jt(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[Ht]},$$scope:{ctx:e}}}),r=new Ft({props:{checked:e[2].redirectOnlyInIncognito,onChange:e[6]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};512&n&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};4&n&&(o.checked=e[2].redirectOnlyInIncognito),4&n&&(o.onChange=e[6]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function Ut(e){let t,n;return t=new xe({props:{$$slots:{default:[Gt]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},p(e,n){const r={};514&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function Vt(t){let n,r=(t[3].i18n.getMessage("bookmarksMenu")||"Bookmarks menu")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Gt(e){let t,n,r,s,o;function c(t){e[7](t)}t=new Be({props:{$$slots:{default:[Vt]},$$scope:{ctx:e}}});let i={};return void 0!==e[1]&&(i.checked=e[1]),r=new Ft({props:i}),J.push((()=>$e(r,"checked",c))),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,s){he(t,e,s),b(e,n,s),he(r,e,s),o=!0},p(e,n){const o={};512&n&&(o.$$scope={dirty:n,ctx:e}),t.$set(o);const c={};!s&&2&n&&(s=!0,c.checked=e[1],ne((()=>s=!1))),r.$set(c)},i(e){o||(de(t.$$.fragment,e),de(r.$$.fragment,e),o=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),o=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function Zt(e){let t,n,r,s,o,c,i,a,l,u,d,p;n=new xe({props:{$$slots:{default:[Nt]},$$scope:{ctx:e}}}),s=new xe({props:{$$slots:{default:[Dt]},$$scope:{ctx:e}}}),c=new xe({props:{$$slots:{default:[jt]},$$scope:{ctx:e}}});let f=!1===e[0]&&Ut(e);return l=new Ke({}),d=new At({}),{c(){t=k("div"),me(n.$$.fragment),r=S(),me(s.$$.fragment),o=S(),me(c.$$.fragment),i=S(),f&&f.c(),a=S(),me(l.$$.fragment),u=S(),me(d.$$.fragment)},m(e,$){b(e,t,$),he(n,t,null),w(t,r),he(s,t,null),w(t,o),he(c,t,null),w(t,i),f&&f.m(t,null),w(t,a),he(l,t,null),w(t,u),he(d,t,null),p=!0},p(e,[r]){const o={};516&r&&(o.$$scope={dirty:r,ctx:e}),n.$set(o);const i={};516&r&&(i.$$scope={dirty:r,ctx:e}),s.$set(i);const l={};516&r&&(l.$$scope={dirty:r,ctx:e}),c.$set(l),!1===e[0]?f?(f.p(e,r),1&r&&de(f,1)):(f=Ut(e),f.c(),de(f,1),f.m(t,a)):f&&(le(),pe(f,1,1,(()=>{f=null})),ue())},i(e){p||(de(n.$$.fragment,e),de(s.$$.fragment,e),de(c.$$.fragment,e),de(f),de(l.$$.fragment,e),de(d.$$.fragment,e),p=!0)},o(e){pe(n.$$.fragment,e),pe(s.$$.fragment,e),pe(c.$$.fragment,e),pe(f),pe(l.$$.fragment,e),pe(d.$$.fragment,e),p=!1},d(e){e&&y(t),ge(n),ge(s),ge(c),f&&f.d(),ge(l),ge(d)}}}function Jt(e,t,n){const r=window.browser||window.chrome;let s;U(He.subscribe((e=>n(2,s=e))));let o,c=null;r.runtime.getPlatformInfo((e=>{switch(e.os){case"fuchsia":case"ios":case"android":n(0,c=!0);break;default:n(0,c=!1)}c||r.permissions.contains({permissions:["bookmarks"]},(e=>n(1,o=e)))}));return e.$$.update=()=>{3&e.$$.dirty&&null!==c&&!1===c&&(o?r.permissions.request({permissions:["bookmarks"]},(e=>n(1,o=e))):(r.permissions.remove({permissions:["bookmarks"]}),n(1,o=!1)))},[c,o,s,r,e=>{n(2,s.theme=e.target.options[e.target.options.selectedIndex].value,s),He.set(s)},e=>{n(2,s.fetchInstances=e.target.options[e.target.options.selectedIndex].value,s),He.set(s)},e=>{n(2,s.redirectOnlyInIncognito=e.target.checked,s),He.set(s)},function(e){o=e,n(1,o),n(0,c)}]}class Qt extends we{constructor(e){super(),ve(this,e,Jt,Zt,c,{})}}var Xt=function(e){if("undefined"==typeof window){const{subscribe:t}=ze(e);return{subscribe:t}}const t=ze(window.location.href),n=history.pushState,r=history.replaceState,s=()=>t.set(window.location.href);return history.pushState=()=>{n.apply(this,arguments),s()},history.replaceState=()=>{r.apply(this,arguments),s()},window.addEventListener("popstate",s),window.addEventListener("hashchange",s),{subscribe:De(t,(e=>new URL(e))).subscribe}}();function Yt(n){let r,s,o=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{"enable-background":"new 0 0 24 24"},{height:"26px"},{viewBox:"0 0 24 24"},{width:"26px"},{fill:"currentColor"}],c={};for(let e=0;e<o.length;e+=1)c=t(c,o[e]);return{c(){r=C("svg"),s=C("path"),q(s,"d","M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"),M(r,c)},m(e,t){b(e,r,t),w(r,s)},p(e,[t]){M(r,c=fe(o,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{"enable-background":"new 0 0 24 24"},{height:"26px"},{viewBox:"0 0 24 24"},{width:"26px"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&y(r)}}}function Kt(e,n,r){return e.$$set=e=>{r(0,n=t(t({},n),h(e)))},[n=h(n)]}class en extends we{constructor(e){super(),ve(this,e,Kt,Yt,c,{})}}function tn(n){let r,s,o=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{fill:"currentColor"},{height:"24px"},{viewBox:"0 -960 960 960"},{width:"24px"}],c={};for(let e=0;e<o.length;e+=1)c=t(c,o[e]);return{c(){r=C("svg"),s=C("path"),q(s,"d","m240-120 240-240 240 240H240ZM80-280v-480q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v480q0 33-23.5 56.5T800-200H680v-80h120v-480H160v480h120v80H160q-33 0-56.5-23.5T80-280Zm400-200Z"),M(r,c)},m(e,t){b(e,r,t),w(r,s)},p(e,[t]){M(r,c=fe(o,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{fill:"currentColor"},{height:"24px"},{viewBox:"0 -960 960 960"},{width:"24px"}]))},i:e,o:e,d(e){e&&y(r)}}}function nn(e,n,r){return e.$$set=e=>{r(0,n=t(t({},n),h(e)))},[n=h(n)]}class rn extends we{constructor(e){super(),ve(this,e,nn,tn,c,{})}}function sn(n){let r,s,o=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{viewBox:"0 -960 960 960"},{width:"24px"},{fill:"currentColor"}],c={};for(let e=0;e<o.length;e+=1)c=t(c,o[e]);return{c(){r=C("svg"),s=C("path"),q(s,"d","M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"),M(r,c)},m(e,t){b(e,r,t),w(r,s)},p(e,[t]){M(r,c=fe(o,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{viewBox:"0 -960 960 960"},{width:"24px"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&y(r)}}}function on(e,n,r){return e.$$set=e=>{r(0,n=t(t({},n),h(e)))},[n=h(n)]}class cn extends we{constructor(e){super(),ve(this,e,on,sn,c,{})}}function an(e){let t,n,r,s,o,c,i,a,l,u,d,p,f,$,m,h,g,v,x=(e[1].i18n.getMessage("general")||"General")+"",C=(e[1].i18n.getMessage("services")||"Services")+"",T=(e[1].i18n.getMessage("about")||"About")+"";return r=new en({props:{class:"margin margin_"+document.body.dir}}),l=new rn({props:{class:"margin margin_"+document.body.dir}}),m=new cn({props:{class:"margin margin_"+document.body.dir}}),{c(){t=k("div"),n=k("a"),me(r.$$.fragment),s=S(),o=I(x),i=S(),a=k("a"),me(l.$$.fragment),u=S(),d=I(C),f=S(),$=k("a"),me(m.$$.fragment),h=S(),g=I(T),q(n,"href","#general"),q(n,"style",c="#general"==e[0].hash&&"color: var(--active);"),q(n,"class","svelte-9vgfun"),q(a,"href","#services"),q(a,"style",p="#services"==e[0].hash&&"color: var(--active);"),q(a,"class","svelte-9vgfun"),q($,"href","https://libredirect.github.io"),q($,"target","_blank"),q($,"rel","noopener noreferrer"),q($,"class","svelte-9vgfun"),q(t,"class","svelte-9vgfun")},m(e,c){b(e,t,c),w(t,n),he(r,n,null),w(n,s),w(n,o),w(t,i),w(t,a),he(l,a,null),w(a,u),w(a,d),w(t,f),w(t,$),he(m,$,null),w($,h),w($,g),v=!0},p(e,[t]){(!v||1&t&&c!==(c="#general"==e[0].hash&&"color: var(--active);"))&&q(n,"style",c),(!v||1&t&&p!==(p="#services"==e[0].hash&&"color: var(--active);"))&&q(a,"style",p)},i(e){v||(de(r.$$.fragment,e),de(l.$$.fragment,e),de(m.$$.fragment,e),v=!0)},o(e){pe(r.$$.fragment,e),pe(l.$$.fragment,e),pe(m.$$.fragment,e),v=!1},d(e){e&&y(t),ge(r),ge(l),ge(m)}}}function ln(e,t,n){let r;u(e,Xt,(e=>n(0,r=e)));const s=window.browser||window.chrome;return[r,s]}class un extends we{constructor(e){super(),ve(this,e,ln,an,c,{})}}const dn=Math.min,pn=Math.max,fn=Math.round,$n=Math.floor,mn=e=>({x:e,y:e}),hn={left:"right",right:"left",bottom:"top",top:"bottom"},gn={start:"end",end:"start"};function vn(e,t,n){return pn(e,dn(t,n))}function wn(e,t){return"function"==typeof e?e(t):e}function bn(e){return e.split("-")[0]}function yn(e){return e.split("-")[1]}function xn(e){return"x"===e?"y":"x"}function kn(e){return"y"===e?"height":"width"}function Cn(e){return["top","bottom"].includes(bn(e))?"y":"x"}function In(e){return xn(Cn(e))}function Sn(e){return e.replace(/start|end/g,(e=>gn[e]))}function Tn(e){return e.replace(/left|right|bottom|top/g,(e=>hn[e]))}function On(e){const{x:t,y:n,width:r,height:s}=e;return{width:r,height:s,top:n,left:t,right:t+r,bottom:n+s,x:t,y:n}}function Ln(e,t,n){let{reference:r,floating:s}=e;const o=Cn(t),c=In(t),i=kn(c),a=bn(t),l="y"===o,u=r.x+r.width/2-s.width/2,d=r.y+r.height/2-s.height/2,p=r[i]/2-s[i]/2;let f;switch(a){case"top":f={x:u,y:r.y-s.height};break;case"bottom":f={x:u,y:r.y+r.height};break;case"right":f={x:r.x+r.width,y:d};break;case"left":f={x:r.x-s.width,y:d};break;default:f={x:r.x,y:r.y}}switch(yn(t)){case"start":f[c]-=p*(n&&l?-1:1);break;case"end":f[c]+=p*(n&&l?-1:1)}return f}async function _n(e,t){var n;void 0===t&&(t={});const{x:r,y:s,platform:o,rects:c,elements:i,strategy:a}=e,{boundary:l="clippingAncestors",rootBoundary:u="viewport",elementContext:d="floating",altBoundary:p=!1,padding:f=0}=wn(t,e),$=function(e){return"number"!=typeof e?function(e){return{top:0,right:0,bottom:0,left:0,...e}}(e):{top:e,right:e,bottom:e,left:e}}(f),m=i[p?"floating"===d?"reference":"floating":d],h=On(await o.getClippingRect({element:null==(n=await(null==o.isElement?void 0:o.isElement(m)))||n?m:m.contextElement||await(null==o.getDocumentElement?void 0:o.getDocumentElement(i.floating)),boundary:l,rootBoundary:u,strategy:a})),g="floating"===d?{x:r,y:s,width:c.floating.width,height:c.floating.height}:c.reference,v=await(null==o.getOffsetParent?void 0:o.getOffsetParent(i.floating)),w=await(null==o.isElement?void 0:o.isElement(v))&&await(null==o.getScale?void 0:o.getScale(v))||{x:1,y:1},b=On(o.convertOffsetParentRelativeRectToViewportRelativeRect?await o.convertOffsetParentRelativeRectToViewportRelativeRect({elements:i,rect:g,offsetParent:v,strategy:a}):g);return{top:(h.top-b.top+$.top)/w.y,bottom:(b.bottom-h.bottom+$.bottom)/w.y,left:(h.left-b.left+$.left)/w.x,right:(b.right-h.right+$.right)/w.x}}function qn(){return"undefined"!=typeof window}function Pn(e){return An(e)?(e.nodeName||"").toLowerCase():"#document"}function En(e){var t;return(null==e||null==(t=e.ownerDocument)?void 0:t.defaultView)||window}function Mn(e){var t;return null==(t=(An(e)?e.ownerDocument:e.document)||window.document)?void 0:t.documentElement}function An(e){return!!qn()&&(e instanceof Node||e instanceof En(e).Node)}function Rn(e){return!!qn()&&(e instanceof Element||e instanceof En(e).Element)}function Wn(e){return!!qn()&&(e instanceof HTMLElement||e instanceof En(e).HTMLElement)}function Fn(e){return!(!qn()||"undefined"==typeof ShadowRoot)&&(e instanceof ShadowRoot||e instanceof En(e).ShadowRoot)}function Bn(e){const{overflow:t,overflowX:n,overflowY:r,display:s}=Un(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(s)}function Nn(e){return["table","td","th"].includes(Pn(e))}function zn(e){return[":popover-open",":modal"].some((t=>{try{return e.matches(t)}catch(e){return!1}}))}function Dn(e){const t=Hn(),n=Rn(e)?Un(e):e;return["transform","translate","scale","rotate","perspective"].some((e=>!!n[e]&&"none"!==n[e]))||!!n.containerType&&"normal"!==n.containerType||!t&&!!n.backdropFilter&&"none"!==n.backdropFilter||!t&&!!n.filter&&"none"!==n.filter||["transform","translate","scale","rotate","perspective","filter"].some((e=>(n.willChange||"").includes(e)))||["paint","layout","strict","content"].some((e=>(n.contain||"").includes(e)))}function Hn(){return!("undefined"==typeof CSS||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function jn(e){return["html","body","#document"].includes(Pn(e))}function Un(e){return En(e).getComputedStyle(e)}function Vn(e){return Rn(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Gn(e){if("html"===Pn(e))return e;const t=e.assignedSlot||e.parentNode||Fn(e)&&e.host||Mn(e);return Fn(t)?t.host:t}function Zn(e){const t=Gn(e);return jn(t)?e.ownerDocument?e.ownerDocument.body:e.body:Wn(t)&&Bn(t)?t:Zn(t)}function Jn(e,t,n){var r;void 0===t&&(t=[]),void 0===n&&(n=!0);const s=Zn(e),o=s===(null==(r=e.ownerDocument)?void 0:r.body),c=En(s);if(o){const e=Qn(c);return t.concat(c,c.visualViewport||[],Bn(s)?s:[],e&&n?Jn(e):[])}return t.concat(s,Jn(s,[],n))}function Qn(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function Xn(e){const t=Un(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const s=Wn(e),o=s?e.offsetWidth:n,c=s?e.offsetHeight:r,i=fn(n)!==o||fn(r)!==c;return i&&(n=o,r=c),{width:n,height:r,$:i}}function Yn(e){return Rn(e)?e:e.contextElement}function Kn(e){const t=Yn(e);if(!Wn(t))return mn(1);const n=t.getBoundingClientRect(),{width:r,height:s,$:o}=Xn(t);let c=(o?fn(n.width):n.width)/r,i=(o?fn(n.height):n.height)/s;return c&&Number.isFinite(c)||(c=1),i&&Number.isFinite(i)||(i=1),{x:c,y:i}}const er=mn(0);function tr(e){const t=En(e);return Hn()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:er}function nr(e,t,n,r){void 0===t&&(t=!1),void 0===n&&(n=!1);const s=e.getBoundingClientRect(),o=Yn(e);let c=mn(1);t&&(r?Rn(r)&&(c=Kn(r)):c=Kn(e));const i=function(e,t,n){return void 0===t&&(t=!1),!(!n||t&&n!==En(e))&&t}(o,n,r)?tr(o):mn(0);let a=(s.left+i.x)/c.x,l=(s.top+i.y)/c.y,u=s.width/c.x,d=s.height/c.y;if(o){const e=En(o),t=r&&Rn(r)?En(r):r;let n=e,s=Qn(n);for(;s&&r&&t!==n;){const e=Kn(s),t=s.getBoundingClientRect(),r=Un(s),o=t.left+(s.clientLeft+parseFloat(r.paddingLeft))*e.x,c=t.top+(s.clientTop+parseFloat(r.paddingTop))*e.y;a*=e.x,l*=e.y,u*=e.x,d*=e.y,a+=o,l+=c,n=En(s),s=Qn(n)}}return On({width:u,height:d,x:a,y:l})}function rr(e,t){const n=Vn(e).scrollLeft;return t?t.left+n:nr(Mn(e)).left+n}function sr(e,t,n){void 0===n&&(n=!1);const r=e.getBoundingClientRect();return{x:r.left+t.scrollLeft-(n?0:rr(e,r)),y:r.top+t.scrollTop}}function or(e,t,n){let r;if("viewport"===t)r=function(e,t){const n=En(e),r=Mn(e),s=n.visualViewport;let o=r.clientWidth,c=r.clientHeight,i=0,a=0;if(s){o=s.width,c=s.height;const e=Hn();(!e||e&&"fixed"===t)&&(i=s.offsetLeft,a=s.offsetTop)}return{width:o,height:c,x:i,y:a}}(e,n);else if("document"===t)r=function(e){const t=Mn(e),n=Vn(e),r=e.ownerDocument.body,s=pn(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),o=pn(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let c=-n.scrollLeft+rr(e);const i=-n.scrollTop;return"rtl"===Un(r).direction&&(c+=pn(t.clientWidth,r.clientWidth)-s),{width:s,height:o,x:c,y:i}}(Mn(e));else if(Rn(t))r=function(e,t){const n=nr(e,!0,"fixed"===t),r=n.top+e.clientTop,s=n.left+e.clientLeft,o=Wn(e)?Kn(e):mn(1);return{width:e.clientWidth*o.x,height:e.clientHeight*o.y,x:s*o.x,y:r*o.y}}(t,n);else{const n=tr(e);r={x:t.x-n.x,y:t.y-n.y,width:t.width,height:t.height}}return On(r)}function cr(e,t){const n=Gn(e);return!(n===t||!Rn(n)||jn(n))&&("fixed"===Un(n).position||cr(n,t))}function ir(e,t,n){const r=Wn(t),s=Mn(t),o="fixed"===n,c=nr(e,!0,o,t);let i={scrollLeft:0,scrollTop:0};const a=mn(0);if(r||!r&&!o)if(("body"!==Pn(t)||Bn(s))&&(i=Vn(t)),r){const e=nr(t,!0,o,t);a.x=e.x+t.clientLeft,a.y=e.y+t.clientTop}else s&&(a.x=rr(s));const l=!s||r||o?mn(0):sr(s,i);return{x:c.left+i.scrollLeft-a.x-l.x,y:c.top+i.scrollTop-a.y-l.y,width:c.width,height:c.height}}function ar(e){return"static"===Un(e).position}function lr(e,t){if(!Wn(e)||"fixed"===Un(e).position)return null;if(t)return t(e);let n=e.offsetParent;return Mn(e)===n&&(n=n.ownerDocument.body),n}function ur(e,t){const n=En(e);if(zn(e))return n;if(!Wn(e)){let t=Gn(e);for(;t&&!jn(t);){if(Rn(t)&&!ar(t))return t;t=Gn(t)}return n}let r=lr(e,t);for(;r&&Nn(r)&&ar(r);)r=lr(r,t);return r&&jn(r)&&ar(r)&&!Dn(r)?n:r||function(e){let t=Gn(e);for(;Wn(t)&&!jn(t);){if(Dn(t))return t;if(zn(t))return null;t=Gn(t)}return null}(e)||n}const dr={convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{elements:t,rect:n,offsetParent:r,strategy:s}=e;const o="fixed"===s,c=Mn(r),i=!!t&&zn(t.floating);if(r===c||i&&o)return n;let a={scrollLeft:0,scrollTop:0},l=mn(1);const u=mn(0),d=Wn(r);if((d||!d&&!o)&&(("body"!==Pn(r)||Bn(c))&&(a=Vn(r)),Wn(r))){const e=nr(r);l=Kn(r),u.x=e.x+r.clientLeft,u.y=e.y+r.clientTop}const p=!c||d||o?mn(0):sr(c,a,!0);return{width:n.width*l.x,height:n.height*l.y,x:n.x*l.x-a.scrollLeft*l.x+u.x+p.x,y:n.y*l.y-a.scrollTop*l.y+u.y+p.y}},getDocumentElement:Mn,getClippingRect:function(e){let{element:t,boundary:n,rootBoundary:r,strategy:s}=e;const o="clippingAncestors"===n?zn(t)?[]:function(e,t){const n=t.get(e);if(n)return n;let r=Jn(e,[],!1).filter((e=>Rn(e)&&"body"!==Pn(e))),s=null;const o="fixed"===Un(e).position;let c=o?Gn(e):e;for(;Rn(c)&&!jn(c);){const t=Un(c),n=Dn(c);n||"fixed"!==t.position||(s=null),(o?!n&&!s:!n&&"static"===t.position&&s&&["absolute","fixed"].includes(s.position)||Bn(c)&&!n&&cr(e,c))?r=r.filter((e=>e!==c)):s=t,c=Gn(c)}return t.set(e,r),r}(t,this._c):[].concat(n),c=[...o,r],i=c[0],a=c.reduce(((e,n)=>{const r=or(t,n,s);return e.top=pn(r.top,e.top),e.right=dn(r.right,e.right),e.bottom=dn(r.bottom,e.bottom),e.left=pn(r.left,e.left),e}),or(t,i,s));return{width:a.right-a.left,height:a.bottom-a.top,x:a.left,y:a.top}},getOffsetParent:ur,getElementRects:async function(e){const t=this.getOffsetParent||ur,n=this.getDimensions,r=await n(e.floating);return{reference:ir(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}},getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){const{width:t,height:n}=Xn(e);return{width:t,height:n}},getScale:Kn,isElement:Rn,isRTL:function(e){return"rtl"===Un(e).direction}};function pr(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function fr(e,t,n,r){void 0===r&&(r={});const{ancestorScroll:s=!0,ancestorResize:o=!0,elementResize:c="function"==typeof ResizeObserver,layoutShift:i="function"==typeof IntersectionObserver,animationFrame:a=!1}=r,l=Yn(e),u=s||o?[...l?Jn(l):[],...Jn(t)]:[];u.forEach((e=>{s&&e.addEventListener("scroll",n,{passive:!0}),o&&e.addEventListener("resize",n)}));const d=l&&i?function(e,t){let n,r=null;const s=Mn(e);function o(){var e;clearTimeout(n),null==(e=r)||e.disconnect(),r=null}return function c(i,a){void 0===i&&(i=!1),void 0===a&&(a=1),o();const l=e.getBoundingClientRect(),{left:u,top:d,width:p,height:f}=l;if(i||t(),!p||!f)return;const $={rootMargin:-$n(d)+"px "+-$n(s.clientWidth-(u+p))+"px "+-$n(s.clientHeight-(d+f))+"px "+-$n(u)+"px",threshold:pn(0,dn(1,a))||1};let m=!0;function h(t){const r=t[0].intersectionRatio;if(r!==a){if(!m)return c();r?c(!1,r):n=setTimeout((()=>{c(!1,1e-7)}),1e3)}1!==r||pr(l,e.getBoundingClientRect())||c(),m=!1}try{r=new IntersectionObserver(h,{...$,root:s.ownerDocument})}catch(e){r=new IntersectionObserver(h,$)}r.observe(e)}(!0),o}(l,n):null;let p,f=-1,$=null;c&&($=new ResizeObserver((e=>{let[r]=e;r&&r.target===l&&$&&($.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame((()=>{var e;null==(e=$)||e.observe(t)}))),n()})),l&&!a&&$.observe(l),$.observe(t));let m=a?nr(e):null;return a&&function t(){const r=nr(e);m&&!pr(m,r)&&n();m=r,p=requestAnimationFrame(t)}(),n(),()=>{var e;u.forEach((e=>{s&&e.removeEventListener("scroll",n),o&&e.removeEventListener("resize",n)})),null==d||d(),null==(e=$)||e.disconnect(),$=null,a&&cancelAnimationFrame(p)}}const $r=function(e){return void 0===e&&(e=0),{name:"offset",options:e,async fn(t){var n,r;const{x:s,y:o,placement:c,middlewareData:i}=t,a=await async function(e,t){const{placement:n,platform:r,elements:s}=e,o=await(null==r.isRTL?void 0:r.isRTL(s.floating)),c=bn(n),i=yn(n),a="y"===Cn(n),l=["left","top"].includes(c)?-1:1,u=o&&a?-1:1,d=wn(t,e);let{mainAxis:p,crossAxis:f,alignmentAxis:$}="number"==typeof d?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return i&&"number"==typeof $&&(f="end"===i?-1*$:$),a?{x:f*u,y:p*l}:{x:p*l,y:f*u}}(t,e);return c===(null==(n=i.offset)?void 0:n.placement)&&null!=(r=i.arrow)&&r.alignmentOffset?{}:{x:s+a.x,y:o+a.y,data:{...a,placement:c}}}}},mr=function(e){return void 0===e&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:s}=t,{mainAxis:o=!0,crossAxis:c=!1,limiter:i={fn:e=>{let{x:t,y:n}=e;return{x:t,y:n}}},...a}=wn(e,t),l={x:n,y:r},u=await _n(t,a),d=Cn(bn(s)),p=xn(d);let f=l[p],$=l[d];if(o){const e="y"===p?"bottom":"right";f=vn(f+u["y"===p?"top":"left"],f,f-u[e])}if(c){const e="y"===d?"bottom":"right";$=vn($+u["y"===d?"top":"left"],$,$-u[e])}const m=i.fn({...t,[p]:f,[d]:$});return{...m,data:{x:m.x-n,y:m.y-r,enabled:{[p]:o,[d]:c}}}}}},hr=function(e){return void 0===e&&(e={}),{name:"flip",options:e,async fn(t){var n,r;const{placement:s,middlewareData:o,rects:c,initialPlacement:i,platform:a,elements:l}=t,{mainAxis:u=!0,crossAxis:d=!0,fallbackPlacements:p,fallbackStrategy:f="bestFit",fallbackAxisSideDirection:$="none",flipAlignment:m=!0,...h}=wn(e,t);if(null!=(n=o.arrow)&&n.alignmentOffset)return{};const g=bn(s),v=Cn(i),w=bn(i)===i,b=await(null==a.isRTL?void 0:a.isRTL(l.floating)),y=p||(w||!m?[Tn(i)]:function(e){const t=Tn(e);return[Sn(e),t,Sn(t)]}(i)),x="none"!==$;!p&&x&&y.push(...function(e,t,n,r){const s=yn(e);let o=function(e,t,n){const r=["left","right"],s=["right","left"],o=["top","bottom"],c=["bottom","top"];switch(e){case"top":case"bottom":return n?t?s:r:t?r:s;case"left":case"right":return t?o:c;default:return[]}}(bn(e),"start"===n,r);return s&&(o=o.map((e=>e+"-"+s)),t&&(o=o.concat(o.map(Sn)))),o}(i,m,$,b));const k=[i,...y],C=await _n(t,h),I=[];let S=(null==(r=o.flip)?void 0:r.overflows)||[];if(u&&I.push(C[g]),d){const e=function(e,t,n){void 0===n&&(n=!1);const r=yn(e),s=In(e),o=kn(s);let c="x"===s?r===(n?"end":"start")?"right":"left":"start"===r?"bottom":"top";return t.reference[o]>t.floating[o]&&(c=Tn(c)),[c,Tn(c)]}(s,c,b);I.push(C[e[0]],C[e[1]])}if(S=[...S,{placement:s,overflows:I}],!I.every((e=>e<=0))){var T,O;const e=((null==(T=o.flip)?void 0:T.index)||0)+1,t=k[e];if(t)return{data:{index:e,overflows:S},reset:{placement:t}};let n=null==(O=S.filter((e=>e.overflows[0]<=0)).sort(((e,t)=>e.overflows[1]-t.overflows[1]))[0])?void 0:O.placement;if(!n)switch(f){case"bestFit":{var L;const e=null==(L=S.filter((e=>{if(x){const t=Cn(e.placement);return t===v||"y"===t}return!0})).map((e=>[e.placement,e.overflows.filter((e=>e>0)).reduce(((e,t)=>e+t),0)])).sort(((e,t)=>e[1]-t[1]))[0])?void 0:L[0];e&&(n=e);break}case"initialPlacement":n=i}if(s!==n)return{reset:{placement:n}}}return{}}}},gr=(e,t,n)=>{const r=new Map,s={platform:dr,...n},o={...s.platform,_c:r};return(async(e,t,n)=>{const{placement:r="bottom",strategy:s="absolute",middleware:o=[],platform:c}=n,i=o.filter(Boolean),a=await(null==c.isRTL?void 0:c.isRTL(t));let l=await c.getElementRects({reference:e,floating:t,strategy:s}),{x:u,y:d}=Ln(l,r,a),p=r,f={},$=0;for(let n=0;n<i.length;n++){const{name:o,fn:m}=i[n],{x:h,y:g,data:v,reset:w}=await m({x:u,y:d,initialPlacement:r,placement:p,strategy:s,middlewareData:f,rects:l,platform:c,elements:{reference:e,floating:t}});u=null!=h?h:u,d=null!=g?g:d,f={...f,[o]:{...f[o],...v}},w&&$<=50&&($++,"object"==typeof w&&(w.placement&&(p=w.placement),w.rects&&(l=!0===w.rects?await c.getElementRects({reference:e,floating:t,strategy:s}):w.rects),({x:u,y:d}=Ln(l,p,a))),n=-1)}return{x:u,y:d,placement:p,strategy:s,middlewareData:f}})(e,t,{...s,platform:o})};function vr(e){let t,n;const r={autoUpdate:!0};let s=e;const o=t=>({...r,...e||{},...t||{}}),c=e=>{t&&n&&(s=o(e),gr(t,n,s).then((e=>{Object.assign(n.style,{position:e.strategy,left:`${e.x}px`,top:`${e.y}px`}),s?.onComputed&&s.onComputed(e)})))},i=e=>{U(e.subscribe((e=>{void 0===t?(t=e,c()):(Object.assign(t,e),c())})))};return[e=>{if("subscribe"in e)return i(e),{};t=e,c()},(e,r)=>{let i;n=e,s=o(r),setTimeout((()=>c(r)),0),c(r);const a=()=>{i&&(i(),i=void 0)},l=({autoUpdate:e}=s||{})=>{a(),!1!==e&&(ee(),Y).then((()=>fr(t,n,(()=>c(s)),!0===e?{}:e)))};return i=l(),{update(e){c(e),i=l(e)},destroy(){a()}}},c]}function wr({loadOptions:e,filterText:t,items:n,multiple:r,value:s,itemId:o,groupBy:c,filterSelectedItems:i,itemFilter:a,convertStringItemsToObjects:l,filterGroupedItems:u,label:d}){if(n&&e)return n;if(!n)return[];n&&n.length>0&&"object"!=typeof n[0]&&(n=l(n));let p=n.filter((e=>{let n=a(e[d],t,e);return n&&r&&s?.length&&(n=!s.some((t=>!!i&&t[o]===e[o]))),n}));return c&&(p=u(p)),p}async function br({dispatch:e,loadOptions:t,convertStringItemsToObjects:n,filterText:r}){let s=await t(r).catch((t=>{console.warn("svelte-select loadOptions error :>> ",t),e("error",{type:"loadOptions",details:t})}));if(s&&!s.cancelled)return s?(s&&s.length>0&&"object"!=typeof s[0]&&(s=n(s)),e("loaded",{items:s})):s=[],{filteredItems:s,loading:!1,focused:!0,listOpen:!0}}function yr(t){let n,r;return{c(){n=C("svg"),r=C("path"),q(r,"fill","currentColor"),q(r,"d","M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747\n 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0\n 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502\n 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0\n 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"),q(n,"width","100%"),q(n,"height","100%"),q(n,"viewBox","0 0 20 20"),q(n,"focusable","false"),q(n,"aria-hidden","true"),q(n,"class","svelte-qbd276")},m(e,t){b(e,n,t),w(n,r)},p:e,i:e,o:e,d(e){e&&y(n)}}}class xr extends we{constructor(e){super(),ve(this,e,null,yr,c,{})}}function kr(t){let n,r;return{c(){n=C("svg"),r=C("path"),q(r,"fill","currentColor"),q(r,"d","M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124\n l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"),q(n,"width","100%"),q(n,"height","100%"),q(n,"viewBox","-2 -2 50 50"),q(n,"focusable","false"),q(n,"aria-hidden","true"),q(n,"role","presentation"),q(n,"class","svelte-whdbu1")},m(e,t){b(e,n,t),w(n,r)},p:e,i:e,o:e,d(e){e&&y(n)}}}class Cr extends we{constructor(e){super(),ve(this,e,null,kr,c,{})}}function Ir(t){let n,r;return{c(){n=C("svg"),r=C("circle"),q(r,"class","circle_path svelte-1p3nqvd"),q(r,"cx","50"),q(r,"cy","50"),q(r,"r","20"),q(r,"fill","none"),q(r,"stroke","currentColor"),q(r,"stroke-width","5"),q(r,"stroke-miterlimit","10"),q(n,"class","loading svelte-1p3nqvd"),q(n,"viewBox","25 25 50 50")},m(e,t){b(e,n,t),w(n,r)},p:e,i:e,o:e,d(e){e&&y(n)}}}class Sr extends we{constructor(e){super(),ve(this,e,null,Ir,c,{})}}const Tr=e=>({value:8&e[0]}),Or=e=>({value:e[3]}),Lr=e=>({value:8&e[0]}),_r=e=>({value:e[3]}),qr=e=>({listOpen:64&e[0]}),Pr=e=>({listOpen:e[6]}),Er=e=>({}),Mr=e=>({}),Ar=e=>({}),Rr=e=>({}),Wr=e=>({selection:8&e[0]}),Fr=e=>({selection:e[3]});function Br(e,t,n){const r=e.slice();return r[126]=t[n],r[128]=n,r}const Nr=e=>({}),zr=e=>({}),Dr=e=>({selection:8&e[0]}),Hr=e=>({selection:e[126],index:e[128]}),jr=e=>({}),Ur=e=>({}),Vr=e=>({}),Gr=e=>({}),Zr=e=>({}),Jr=e=>({});function Qr(e,t,n){const r=e.slice();return r[126]=t[n],r[128]=n,r}const Xr=e=>({item:16777216&e[0]}),Yr=e=>({item:e[126],index:e[128]}),Kr=e=>({filteredItems:16777216&e[0]}),es=e=>({filteredItems:e[24]}),ts=e=>({}),ns=e=>({});function rs(e){let t,n,r,o,c,i,a,l,u=e[50]["list-prepend"]&&ss(e);const d=[is,cs,os],p=[];function f(e,t){return e[50].list?0:e[24].length>0?1:e[19]?-1:2}~(r=f(e))&&(o=p[r]=d[r](e));let $=e[50]["list-append"]&&ls(e);return{c(){t=k("div"),u&&u.c(),n=S(),o&&o.c(),c=S(),$&&$.c(),q(t,"class","svelte-select-list svelte-82qwg8"),q(t,"role","none"),B(t,"prefloat",e[28])},m(s,o){b(s,t,o),u&&u.m(t,null),w(t,n),~r&&p[r].m(t,null),w(t,c),$&&$.m(t,null),e[91](t),i=!0,a||(l=[v(e[49].call(null,t)),O(t,"scroll",e[41]),O(t,"pointerup",_(L(e[85]))),O(t,"mousedown",_(L(e[86])))],a=!0)},p(e,s){e[50]["list-prepend"]?u?(u.p(e,s),524288&s[1]&&de(u,1)):(u=ss(e),u.c(),de(u,1),u.m(t,n)):u&&(le(),pe(u,1,1,(()=>{u=null})),ue());let a=r;r=f(e),r===a?~r&&p[r].p(e,s):(o&&(le(),pe(p[a],1,1,(()=>{p[a]=null})),ue()),~r?(o=p[r],o?o.p(e,s):(o=p[r]=d[r](e),o.c()),de(o,1),o.m(t,c)):o=null),e[50]["list-append"]?$?($.p(e,s),524288&s[1]&&de($,1)):($=ls(e),$.c(),de($,1),$.m(t,null)):$&&(le(),pe($,1,1,(()=>{$=null})),ue()),(!i||268435456&s[0])&&B(t,"prefloat",e[28])},i(e){i||(de(u),de(o),de($),i=!0)},o(e){pe(u),pe(o),pe($),i=!1},d(n){n&&y(t),u&&u.d(),~r&&p[r].d(),$&&$.d(),e[91](null),a=!1,s(l)}}}function ss(e){let t;const n=e[83]["list-prepend"],r=d(n,e,e[82],ns);return{c(){r&&r.c()},m(e,n){r&&r.m(e,n),t=!0},p(e,s){r&&r.p&&(!t||1048576&s[2])&&$(r,n,e,e[82],t?f(n,e[82],s,ts):m(e[82]),ns)},i(e){t||(de(r,e),t=!0)},o(e){pe(r,e),t=!1},d(e){r&&r.d(e)}}}function os(t){let n;const r=t[83].empty,s=d(r,t,t[82],Jr),o=s||function(){let t;return{c(){t=k("div"),t.textContent="No options",q(t,"class","empty svelte-82qwg8")},m(e,n){b(e,t,n)},p:e,d(e){e&&y(t)}}}();return{c(){o&&o.c()},m(e,t){o&&o.m(e,t),n=!0},p(e,t){s&&s.p&&(!n||1048576&t[2])&&$(s,r,e,e[82],n?f(r,e[82],t,Zr):m(e[82]),Jr)},i(e){n||(de(o,e),n=!0)},o(e){pe(o,e),n=!1},d(e){o&&o.d(e)}}}function cs(e){let t,n,r=e[24],s=[];for(let t=0;t<r.length;t+=1)s[t]=as(Qr(e,r,t));const o=e=>pe(s[e],1,1,(()=>{s[e]=null}));return{c(){for(let e=0;e<s.length;e+=1)s[e].c();t=T()},m(e,r){for(let t=0;t<s.length;t+=1)s[t]&&s[t].m(e,r);b(e,t,r),n=!0},p(e,n){if(1627402376&n[0]|28672&n[1]|1048576&n[2]){let c;for(r=e[24],c=0;c<r.length;c+=1){const o=Qr(e,r,c);s[c]?(s[c].p(o,n),de(s[c],1)):(s[c]=as(o),s[c].c(),de(s[c],1),s[c].m(t.parentNode,t))}for(le(),c=r.length;c<s.length;c+=1)o(c);ue()}},i(e){if(!n){for(let e=0;e<r.length;e+=1)de(s[e]);n=!0}},o(e){s=s.filter(Boolean);for(let e=0;e<s.length;e+=1)pe(s[e]);n=!1},d(e){x(s,e),e&&y(t)}}}function is(e){let t;const n=e[83].list,r=d(n,e,e[82],es);return{c(){r&&r.c()},m(e,n){r&&r.m(e,n),t=!0},p(e,s){r&&r.p&&(!t||16777216&s[0]|1048576&s[2])&&$(r,n,e,e[82],t?f(n,e[82],s,Kr):m(e[82]),es)},i(e){t||(de(r,e),t=!0)},o(e){pe(r,e),t=!1},d(e){r&&r.d(e)}}}function as(e){let t,n,r,c,i,a,l,u;const p=e[83].item,h=d(p,e,e[82],Yr),g=h||function(e){let t,n=e[126]?.[e[12]]+"";return{c(){t=I(n)},m(e,n){b(e,t,n)},p(e,r){16781312&r[0]&&n!==(n=e[126]?.[e[12]]+"")&&A(t,n)},d(e){e&&y(t)}}}(e);function x(){return e[88](e[128])}function C(){return e[89](e[128])}function T(){return e[90](e[126],e[128])}return{c(){t=k("div"),n=k("div"),g&&g.c(),i=S(),q(n,"class","item svelte-82qwg8"),B(n,"list-group-title",e[126].groupHeader),B(n,"active",e[45](e[126],e[3],e[13])),B(n,"first",0===e[128]),B(n,"hover",e[7]===e[128]),B(n,"group-item",e[126].groupItem),B(n,"not-selectable",!1===e[126]?.selectable),q(t,"class","list-item svelte-82qwg8"),q(t,"tabindex","-1"),q(t,"role","none")},m(s,o){b(s,t,o),w(t,n),g&&g.m(n,null),w(t,i),a=!0,l||(u=[v(r=e[46].call(null,n,{scroll:e[45](e[126],e[3],e[13]),listDom:e[30]})),v(c=e[47].call(null,n,{scroll:e[29]===e[128],listDom:e[30]})),O(t,"mouseover",x),O(t,"focus",C),O(t,"click",_(T)),O(t,"keydown",_(L(e[87])))],l=!0)},p(t,s){e=t,h?h.p&&(!a||16777216&s[0]|1048576&s[2])&&$(h,p,e,e[82],a?f(p,e[82],s,Xr):m(e[82]),Yr):g&&g.p&&(!a||16781312&s[0])&&g.p(e,a?s:[-1,-1,-1,-1,-1]),r&&o(r.update)&&1090527240&s[0]&&r.update.call(null,{scroll:e[45](e[126],e[3],e[13]),listDom:e[30]}),c&&o(c.update)&&1610612736&s[0]&&c.update.call(null,{scroll:e[29]===e[128],listDom:e[30]}),(!a||16777216&s[0])&&B(n,"list-group-title",e[126].groupHeader),(!a||16785416&s[0]|16384&s[1])&&B(n,"active",e[45](e[126],e[3],e[13])),(!a||128&s[0])&&B(n,"hover",e[7]===e[128]),(!a||16777216&s[0])&&B(n,"group-item",e[126].groupItem),(!a||16777216&s[0])&&B(n,"not-selectable",!1===e[126]?.selectable)},i(e){a||(de(g,e),a=!0)},o(e){pe(g,e),a=!1},d(e){e&&y(t),g&&g.d(e),l=!1,s(u)}}}function ls(e){let t;const n=e[83]["list-append"],r=d(n,e,e[82],Gr);return{c(){r&&r.c()},m(e,n){r&&r.m(e,n),t=!0},p(e,s){r&&r.p&&(!t||1048576&s[2])&&$(r,n,e,e[82],t?f(n,e[82],s,Vr):m(e[82]),Gr)},i(e){t||(de(r,e),t=!0)},o(e){pe(r,e),t=!1},d(e){r&&r.d(e)}}}function us(e){let t,n,r,s,o;return{c(){t=k("span"),n=I(e[32]),r=S(),s=k("span"),o=I(e[31]),q(t,"id","aria-selection"),q(t,"class","svelte-82qwg8"),q(s,"id","aria-context"),q(s,"class","svelte-82qwg8")},m(e,c){b(e,t,c),w(t,n),b(e,r,c),b(e,s,c),w(s,o)},p(e,t){2&t[1]&&A(n,e[32]),1&t[1]&&A(o,e[31])},d(e){e&&y(t),e&&y(r),e&&y(s)}}}function ds(e){let t,n,r,s;const o=[fs,ps],c=[];function i(e,t){return e[9]?0:1}return t=i(e),n=c[t]=o[t](e),{c(){n.c(),r=T()},m(e,n){c[t].m(e,n),b(e,r,n),s=!0},p(e,s){let a=t;t=i(e),t===a?c[t].p(e,s):(le(),pe(c[a],1,1,(()=>{c[a]=null})),ue(),n=c[t],n?n.p(e,s):(n=c[t]=o[t](e),n.c()),de(n,1),n.m(r.parentNode,r))},i(e){s||(de(n),s=!0)},o(e){pe(n),s=!1},d(e){c[t].d(e),e&&y(r)}}}function ps(e){let t,n;const r=e[83].selection,s=d(r,e,e[82],Fr),o=s||function(e){let t,n=e[3][e[12]]+"";return{c(){t=I(n)},m(e,n){b(e,t,n)},p(e,r){4104&r[0]&&n!==(n=e[3][e[12]]+"")&&A(t,n)},d(e){e&&y(t)}}}(e);return{c(){t=k("div"),o&&o.c(),q(t,"class","selected-item svelte-82qwg8"),B(t,"hide-selected-item",e[35])},m(e,r){b(e,t,r),o&&o.m(t,null),n=!0},p(e,c){s?s.p&&(!n||8&c[0]|1048576&c[2])&&$(s,r,e,e[82],n?f(r,e[82],c,Wr):m(e[82]),Fr):o&&o.p&&(!n||4104&c[0])&&o.p(e,n?c:[-1,-1,-1,-1,-1]),(!n||16&c[1])&&B(t,"hide-selected-item",e[35])},i(e){n||(de(o,e),n=!0)},o(e){pe(o,e),n=!1},d(e){e&&y(t),o&&o.d(e)}}}function fs(e){let t,n,r=e[3],s=[];for(let t=0;t<r.length;t+=1)s[t]=ms(Br(e,r,t));const o=e=>pe(s[e],1,1,(()=>{s[e]=null}));return{c(){for(let e=0;e<s.length;e+=1)s[e].c();t=T()},m(e,r){for(let t=0;t<s.length;t+=1)s[t]&&s[t].m(e,r);b(e,t,r),n=!0},p(e,n){if(67116040&n[0]|32&n[1]|1048576&n[2]){let c;for(r=e[3],c=0;c<r.length;c+=1){const o=Br(e,r,c);s[c]?(s[c].p(o,n),de(s[c],1)):(s[c]=ms(o),s[c].c(),de(s[c],1),s[c].m(t.parentNode,t))}for(le(),c=r.length;c<s.length;c+=1)o(c);ue()}},i(e){if(!n){for(let e=0;e<r.length;e+=1)de(s[e]);n=!0}},o(e){s=s.filter(Boolean);for(let e=0;e<s.length;e+=1)pe(s[e]);n=!1},d(e){x(s,e),e&&y(t)}}}function $s(e){let t,n,r,s;const o=e[83]["multi-clear-icon"],c=d(o,e,e[82],zr),i=c||function(){let e,t;return e=new Cr({}),{c(){me(e.$$.fragment)},m(n,r){he(e,n,r),t=!0},i(n){t||(de(e.$$.fragment,n),t=!0)},o(n){pe(e.$$.fragment,n),t=!1},d(t){ge(e,t)}}}();function a(){return e[92](e[128])}return{c(){t=k("div"),i&&i.c(),q(t,"class","multi-item-clear svelte-82qwg8")},m(e,o){b(e,t,o),i&&i.m(t,null),n=!0,r||(s=O(t,"pointerup",_(L(a))),r=!0)},p(t,r){e=t,c&&c.p&&(!n||1048576&r[2])&&$(c,o,e,e[82],n?f(o,e[82],r,Nr):m(e[82]),zr)},i(e){n||(de(i,e),n=!0)},o(e){pe(i,e),n=!1},d(e){e&&y(t),i&&i.d(e),r=!1,s()}}}function ms(e){let t,n,r,o,c,i,a;const l=e[83].selection,u=d(l,e,e[82],Hr),p=u||function(e){let t,n=e[126][e[12]]+"";return{c(){t=I(n)},m(e,n){b(e,t,n)},p(e,r){4104&r[0]&&n!==(n=e[126][e[12]]+"")&&A(t,n)},d(e){e&&y(t)}}}(e);let h=!e[11]&&!e[10]&&Cr&&$s(e);function g(){return e[93](e[128])}return{c(){t=k("div"),n=k("span"),p&&p.c(),r=S(),h&&h.c(),o=S(),q(n,"class","multi-item-text svelte-82qwg8"),q(t,"class","multi-item svelte-82qwg8"),q(t,"role","none"),B(t,"active",e[26]===e[128]),B(t,"disabled",e[11])},m(s,l){b(s,t,l),w(t,n),p&&p.m(n,null),w(t,r),h&&h.m(t,null),w(t,o),c=!0,i||(a=[O(t,"click",L(g)),O(t,"keydown",_(L(e[84])))],i=!0)},p(n,r){e=n,u?u.p&&(!c||8&r[0]|1048576&r[2])&&$(u,l,e,e[82],c?f(l,e[82],r,Dr):m(e[82]),Hr):p&&p.p&&(!c||4104&r[0])&&p.p(e,c?r:[-1,-1,-1,-1,-1]),e[11]||e[10]||!Cr?h&&(le(),pe(h,1,1,(()=>{h=null})),ue()):h?(h.p(e,r),3072&r[0]&&de(h,1)):(h=$s(e),h.c(),de(h,1),h.m(t,o)),(!c||67108864&r[0])&&B(t,"active",e[26]===e[128]),(!c||2048&r[0])&&B(t,"disabled",e[11])},i(e){c||(de(p,e),de(h),c=!0)},o(e){pe(p,e),pe(h),c=!1},d(e){e&&y(t),p&&p.d(e),h&&h.d(),i=!1,s(a)}}}function hs(e){let t,n;const r=e[83]["loading-icon"],s=d(r,e,e[82],Rr),o=s||function(){let e,t;return e=new Sr({}),{c(){me(e.$$.fragment)},m(n,r){he(e,n,r),t=!0},i(n){t||(de(e.$$.fragment,n),t=!0)},o(n){pe(e.$$.fragment,n),t=!1},d(t){ge(e,t)}}}();return{c(){t=k("div"),o&&o.c(),q(t,"class","icon loading svelte-82qwg8"),q(t,"aria-hidden","true")},m(e,r){b(e,t,r),o&&o.m(t,null),n=!0},p(e,t){s&&s.p&&(!n||1048576&t[2])&&$(s,r,e,e[82],n?f(r,e[82],t,Ar):m(e[82]),Rr)},i(e){n||(de(o,e),n=!0)},o(e){pe(o,e),n=!1},d(e){e&&y(t),o&&o.d(e)}}}function gs(e){let t,n,r,s;const o=e[83]["clear-icon"],c=d(o,e,e[82],Mr),i=c||function(){let e,t;return e=new Cr({}),{c(){me(e.$$.fragment)},m(n,r){he(e,n,r),t=!0},i(n){t||(de(e.$$.fragment,n),t=!0)},o(n){pe(e.$$.fragment,n),t=!1},d(t){ge(e,t)}}}();return{c(){t=k("button"),i&&i.c(),q(t,"type","button"),q(t,"class","icon clear-select svelte-82qwg8")},m(o,c){b(o,t,c),i&&i.m(t,null),n=!0,r||(s=O(t,"click",e[22]),r=!0)},p(e,t){c&&c.p&&(!n||1048576&t[2])&&$(c,o,e,e[82],n?f(o,e[82],t,Er):m(e[82]),Mr)},i(e){n||(de(i,e),n=!0)},o(e){pe(i,e),n=!1},d(e){e&&y(t),i&&i.d(e),r=!1,s()}}}function vs(e){let t,n;const r=e[83]["chevron-icon"],s=d(r,e,e[82],Pr),o=s||function(){let e,t;return e=new xr({}),{c(){me(e.$$.fragment)},m(n,r){he(e,n,r),t=!0},i(n){t||(de(e.$$.fragment,n),t=!0)},o(n){pe(e.$$.fragment,n),t=!1},d(t){ge(e,t)}}}();return{c(){t=k("div"),o&&o.c(),q(t,"class","icon chevron svelte-82qwg8"),q(t,"aria-hidden","true")},m(e,r){b(e,t,r),o&&o.m(t,null),n=!0},p(e,t){s&&s.p&&(!n||64&t[0]|1048576&t[2])&&$(s,r,e,e[82],n?f(r,e[82],t,qr):m(e[82]),Pr)},i(e){n||(de(o,e),n=!0)},o(e){pe(o,e),n=!1},d(e){e&&y(t),o&&o.d(e)}}}function ws(t){let n;const r=t[83].required,s=d(r,t,t[82],Or),o=s||function(){let t;return{c(){t=k("select"),q(t,"class","required svelte-82qwg8"),t.required=!0,q(t,"tabindex","-1"),q(t,"aria-hidden","true")},m(e,n){b(e,t,n)},p:e,d(e){e&&y(t)}}}();return{c(){o&&o.c()},m(e,t){o&&o.m(e,t),n=!0},p(e,t){s&&s.p&&(!n||8&t[0]|1048576&t[2])&&$(s,r,e,e[82],n?f(r,e[82],t,Tr):m(e[82]),Or)},i(e){n||(de(o,e),n=!0)},o(e){pe(o,e),n=!1},d(e){o&&o.d(e)}}}function bs(e){let n,r,o,c,i,a,l,u,p,h,g,x,C,I,T,_,P,M,A,W,F=e[6]&&rs(e),N=e[2]&&us(e);const z=e[83].prepend,D=d(z,e,e[82],Ur);let H=e[25]&&ds(e),j=[{readOnly:h=!e[17]},e[27],{placeholder:e[33]},{style:e[18]},{disabled:e[11]}],U={};for(let e=0;e<j.length;e+=1)U=t(U,j[e]);let V=e[5]&&hs(e),G=e[34]&&gs(e),Z=e[20]&&vs(e);const J=e[83]["input-hidden"],Q=d(J,e,e[82],_r),X=Q||function(e){let t,n;return{c(){t=k("input"),q(t,"name",e[8]),q(t,"type","hidden"),t.value=n=e[3]?JSON.stringify(e[3]):null,q(t,"class","svelte-82qwg8")},m(e,n){b(e,t,n)},p(e,r){256&r[0]&&q(t,"name",e[8]),8&r[0]&&n!==(n=e[3]?JSON.stringify(e[3]):null)&&(t.value=n)},d(e){e&&y(t)}}}(e);let Y=e[16]&&(!e[3]||0===e[3].length)&&ws(e);return{c(){n=k("div"),F&&F.c(),r=S(),o=k("span"),N&&N.c(),c=S(),i=k("div"),D&&D.c(),a=S(),l=k("div"),H&&H.c(),u=S(),p=k("input"),g=S(),x=k("div"),V&&V.c(),C=S(),G&&G.c(),I=S(),Z&&Z.c(),T=S(),X&&X.c(),_=S(),Y&&Y.c(),q(o,"aria-live","polite"),q(o,"aria-atomic","false"),q(o,"aria-relevant","additions text"),q(o,"class","a11y-text svelte-82qwg8"),q(i,"class","prepend svelte-82qwg8"),E(p,U),B(p,"svelte-82qwg8",!0),q(l,"class","value-container svelte-82qwg8"),q(x,"class","indicators svelte-82qwg8"),q(n,"class",P="svelte-select "+e[21]+" svelte-82qwg8"),q(n,"style",e[14]),q(n,"role","none"),B(n,"multi",e[9]),B(n,"disabled",e[11]),B(n,"focused",e[2]),B(n,"list-open",e[6]),B(n,"show-chevron",e[20]),B(n,"error",e[15])},m(t,s){b(t,n,s),F&&F.m(n,null),w(n,r),w(n,o),N&&N.m(o,null),w(n,c),w(n,i),D&&D.m(i,null),w(n,a),w(n,l),H&&H.m(l,null),w(l,u),w(l,p),p.autofocus&&p.focus(),e[94](p),R(p,e[4]),w(n,g),w(n,x),V&&V.m(x,null),w(x,C),G&&G.m(x,null),w(x,I),Z&&Z.m(x,null),w(n,T),X&&X.m(n,null),w(n,_),Y&&Y.m(n,null),e[96](n),M=!0,A||(W=[O(window,"click",e[42]),O(window,"keydown",e[37]),O(p,"keydown",e[37]),O(p,"blur",e[39]),O(p,"focus",e[38]),O(p,"input",e[95]),O(n,"pointerup",L(e[40])),v(e[48].call(null,n))],A=!0)},p(e,t){e[6]?F?(F.p(e,t),64&t[0]&&de(F,1)):(F=rs(e),F.c(),de(F,1),F.m(n,r)):F&&(le(),pe(F,1,1,(()=>{F=null})),ue()),e[2]?N?N.p(e,t):(N=us(e),N.c(),N.m(o,null)):N&&(N.d(1),N=null),D&&D.p&&(!M||1048576&t[2])&&$(D,z,e,e[82],M?f(z,e[82],t,jr):m(e[82]),Ur),e[25]?H?(H.p(e,t),33554432&t[0]&&de(H,1)):(H=ds(e),H.c(),de(H,1),H.m(l,u)):H&&(le(),pe(H,1,1,(()=>{H=null})),ue()),E(p,U=fe(j,[(!M||131072&t[0]&&h!==(h=!e[17]))&&{readOnly:h},134217728&t[0]&&e[27],(!M||4&t[1])&&{placeholder:e[33]},(!M||262144&t[0])&&{style:e[18]},(!M||2048&t[0])&&{disabled:e[11]}])),16&t[0]&&p.value!==e[4]&&R(p,e[4]),B(p,"svelte-82qwg8",!0),e[5]?V?(V.p(e,t),32&t[0]&&de(V,1)):(V=hs(e),V.c(),de(V,1),V.m(x,C)):V&&(le(),pe(V,1,1,(()=>{V=null})),ue()),e[34]?G?(G.p(e,t),8&t[1]&&de(G,1)):(G=gs(e),G.c(),de(G,1),G.m(x,I)):G&&(le(),pe(G,1,1,(()=>{G=null})),ue()),e[20]?Z?(Z.p(e,t),1048576&t[0]&&de(Z,1)):(Z=vs(e),Z.c(),de(Z,1),Z.m(x,null)):Z&&(le(),pe(Z,1,1,(()=>{Z=null})),ue()),Q?Q.p&&(!M||8&t[0]|1048576&t[2])&&$(Q,J,e,e[82],M?f(J,e[82],t,Lr):m(e[82]),_r):X&&X.p&&(!M||264&t[0])&&X.p(e,M?t:[-1,-1,-1,-1,-1]),!e[16]||e[3]&&0!==e[3].length?Y&&(le(),pe(Y,1,1,(()=>{Y=null})),ue()):Y?(Y.p(e,t),65544&t[0]&&de(Y,1)):(Y=ws(e),Y.c(),de(Y,1),Y.m(n,null)),(!M||2097152&t[0]&&P!==(P="svelte-select "+e[21]+" svelte-82qwg8"))&&q(n,"class",P),(!M||16384&t[0])&&q(n,"style",e[14]),(!M||2097664&t[0])&&B(n,"multi",e[9]),(!M||2099200&t[0])&&B(n,"disabled",e[11]),(!M||2097156&t[0])&&B(n,"focused",e[2]),(!M||2097216&t[0])&&B(n,"list-open",e[6]),(!M||3145728&t[0])&&B(n,"show-chevron",e[20]),(!M||2129920&t[0])&&B(n,"error",e[15])},i(e){M||(de(F),de(D,e),de(H),de(V),de(G),de(Z),de(X,e),de(Y),M=!0)},o(e){pe(F),pe(D,e),pe(H),pe(V),pe(G),pe(Z),pe(X,e),pe(Y),M=!1},d(t){t&&y(n),F&&F.d(),N&&N.d(),D&&D.d(t),H&&H.d(),e[94](null),V&&V.d(),G&&G.d(),Z&&Z.d(),X&&X.d(t),Y&&Y.d(),e[96](null),A=!1,s(W)}}}function ys(e){return e.map(((e,t)=>({index:t,value:e,label:`${e}`})))}function xs(e,t,n){let r,s,o,c,i,a,l,u,d,{$$slots:p={},$$scope:f}=t;const $=function(e){const t={};for(const n in e)t[n]=!0;return t}(p),m=V();let{justValue:h=null}=t,{filter:g=wr}=t,{getItems:v=br}=t,{id:w=null}=t,{name:b=null}=t,{container:y}=t,{input:x}=t,{multiple:k=!1}=t,{multiFullItemClearable:C=!1}=t,{disabled:I=!1}=t,{focused:S=!1}=t,{value:T=null}=t,{filterText:O=""}=t,{placeholder:L="Please select"}=t,{placeholderAlwaysShow:_=!1}=t,{items:q=null}=t,{label:P="label"}=t,{itemFilter:E=(e,t,n)=>`${e}`.toLowerCase().includes(t.toLowerCase())}=t,{groupBy:M}=t,{groupFilter:A=e=>e}=t,{groupHeaderSelectable:R=!1}=t,{itemId:W="value"}=t,{loadOptions:F}=t,{containerStyles:B=""}=t,{hasError:N=!1}=t,{filterSelectedItems:z=!0}=t,{required:D=!1}=t,{closeListOnChange:Z=!0}=t,{clearFilterTextOnBlur:Q=!0}=t,{createGroupHeaderItem:X=(e,t)=>({value:e,[P]:e})}=t;let Y,K,ee,te,ne,re,{searchable:se=!0}=t,{inputStyles:oe=""}=t,{clearable:ce=!0}=t,{loading:ie=!1}=t,{listOpen:ae=!1}=t,{debounce:le=(e,t=1)=>{clearTimeout(Y),Y=setTimeout(e,t)}}=t,{debounceWait:ue=300}=t,{hideEmptyState:de=!1}=t,{inputAttributes:pe={}}=t,{listAutoWidth:fe=!0}=t,{showChevron:$e=!1}=t,{listOffset:me=5}=t,{hoverItemIndex:he=0}=t,{floatingConfig:ge={}}=t,{class:ve=""}=t;function we(e){const t=[],n={};e.forEach((e=>{const r=M(e);t.includes(r)||(t.push(r),n[r]=[],r&&n[r].push(Object.assign(X(r,e),{id:r,groupHeader:!0,selectable:R}))),n[r].push(Object.assign({groupItem:!!r},e))}));const r=[];return A(t).forEach((e=>{n[e]&&r.push(...n[e])})),r}function be(e=0,t){n(7,he=e<0?0:e),!t&&M&&l[he]&&!l[he].selectable&&Fe(1)}var ye;function xe(){let e=!0;if(T){const t=[],r=[];T.forEach((n=>{t.includes(n[W])?e=!1:(t.push(n[W]),r.push(n))})),e||n(3,T=r)}return e}function ke(e){let t=e?e[W]:T[W];return q.find((e=>e[W]===t))}async function Ce(e){const t=T[e];1===T.length?n(3,T=void 0):n(3,T=T.filter((e=>e!==t))),m("clear",t)}function Ie(e){S&&x===document?.activeElement||(e&&m("focus",e),x?.focus(),n(2,S=!0))}async function Se(e){Me||(ae||S)&&(m("blur",e),Te(),n(2,S=!1),n(26,K=void 0),x?.blur())}function Te(){Q&&n(4,O=""),n(6,ae=!1)}ye=async()=>{n(78,ee=T),n(79,te=O),n(80,ne=k)},H().$$.before_update.push(ye),j((()=>{ae&&n(2,S=!0),S&&x&&x.focus()}));let{ariaValues:Oe=e=>`Option ${e}, selected.`}=t,{ariaListOpen:Le=(e,t)=>`You are currently focused on option ${e}. There are ${t} results available.`}=t,{ariaFocused:_e=()=>"Select is focused, type to refine list, press down to open the menu."}=t;let qe,Pe=null;function Ee(){clearTimeout(qe),qe=setTimeout((()=>{Me=!1}),100)}U((()=>{Pe?.remove()}));let Me=!1;function Ae(e){e&&!1!==e.selectable&&function(e){if(e){n(4,O="");const t=Object.assign({},e);if(t.groupHeader&&!t.selectable)return;n(3,T=k?T?T.concat([t]):[t]:n(3,T=t)),setTimeout((()=>{Z&&Te(),n(26,K=void 0),m("change",T),m("select",e)}))}}(e)}function Re(e){Me||n(7,he=e)}function We(e){const{item:t,i:r}=e;if(!1!==t?.selectable)return T&&!k&&T[W]===t[W]?Te():void(function(e){return e.groupHeader&&e.selectable||e.selectable||!e.hasOwnProperty("selectable")}(t)&&(n(7,he=r),Ae(t)))}function Fe(e){if(0===l.filter((e=>!Object.hasOwn(e,"selectable")||!0===e.selectable)).length)return n(7,he=0);e>0&&he===l.length-1?n(7,he=0):n(7,e<0&&0===he?he=l.length-1:he+=e);const t=l[he];t&&!1===t.selectable&&(1!==e&&-1!==e||Fe(e))}const Be=ze,Ne=ze;function ze(e){return{update(t){t.scroll&&(Ee(),e.scrollIntoView({behavior:"auto",block:"nearest"}))}}}let De={strategy:"absolute",placement:"bottom-start",middleware:[$r(me),hr(),mr()],autoUpdate:!1};const[He,je,Ue]=vr(De);let Ve=!0;return e.$$set=e=>{"justValue"in e&&n(52,h=e.justValue),"filter"in e&&n(53,g=e.filter),"getItems"in e&&n(54,v=e.getItems),"id"in e&&n(55,w=e.id),"name"in e&&n(8,b=e.name),"container"in e&&n(0,y=e.container),"input"in e&&n(1,x=e.input),"multiple"in e&&n(9,k=e.multiple),"multiFullItemClearable"in e&&n(10,C=e.multiFullItemClearable),"disabled"in e&&n(11,I=e.disabled),"focused"in e&&n(2,S=e.focused),"value"in e&&n(3,T=e.value),"filterText"in e&&n(4,O=e.filterText),"placeholder"in e&&n(56,L=e.placeholder),"placeholderAlwaysShow"in e&&n(57,_=e.placeholderAlwaysShow),"items"in e&&n(51,q=e.items),"label"in e&&n(12,P=e.label),"itemFilter"in e&&n(58,E=e.itemFilter),"groupBy"in e&&n(59,M=e.groupBy),"groupFilter"in e&&n(60,A=e.groupFilter),"groupHeaderSelectable"in e&&n(61,R=e.groupHeaderSelectable),"itemId"in e&&n(13,W=e.itemId),"loadOptions"in e&&n(62,F=e.loadOptions),"containerStyles"in e&&n(14,B=e.containerStyles),"hasError"in e&&n(15,N=e.hasError),"filterSelectedItems"in e&&n(63,z=e.filterSelectedItems),"required"in e&&n(16,D=e.required),"closeListOnChange"in e&&n(64,Z=e.closeListOnChange),"clearFilterTextOnBlur"in e&&n(65,Q=e.clearFilterTextOnBlur),"createGroupHeaderItem"in e&&n(66,X=e.createGroupHeaderItem),"searchable"in e&&n(17,se=e.searchable),"inputStyles"in e&&n(18,oe=e.inputStyles),"clearable"in e&&n(68,ce=e.clearable),"loading"in e&&n(5,ie=e.loading),"listOpen"in e&&n(6,ae=e.listOpen),"debounce"in e&&n(69,le=e.debounce),"debounceWait"in e&&n(70,ue=e.debounceWait),"hideEmptyState"in e&&n(19,de=e.hideEmptyState),"inputAttributes"in e&&n(71,pe=e.inputAttributes),"listAutoWidth"in e&&n(72,fe=e.listAutoWidth),"showChevron"in e&&n(20,$e=e.showChevron),"listOffset"in e&&n(73,me=e.listOffset),"hoverItemIndex"in e&&n(7,he=e.hoverItemIndex),"floatingConfig"in e&&n(74,ge=e.floatingConfig),"class"in e&&n(21,ve=e.class),"ariaValues"in e&&n(75,Oe=e.ariaValues),"ariaListOpen"in e&&n(76,Le=e.ariaListOpen),"ariaFocused"in e&&n(77,_e=e.ariaFocused),"$$scope"in e&&n(82,f=e.$$scope)},e.$$.update=()=>{8&e.$$.dirty[0]|1048576&e.$$.dirty[1]&&T&&function(){if("string"==typeof T){let e=(q||[]).find((e=>e[W]===T));n(3,T=e||{[W]:T,label:T})}else k&&Array.isArray(T)&&T.length>0&&n(3,T=T.map((e=>"string"==typeof e?{value:e,label:e}:e)))}(),131072&e.$$.dirty[0]|512&e.$$.dirty[2]&&(!pe&&se||(n(27,re=Object.assign({autocapitalize:"none",autocomplete:"off",autocorrect:"off",spellcheck:!1,tabindex:0,type:"text","aria-autocomplete":"list"},pe)),w&&n(27,re.id=w,re),se||n(27,re.readonly=!0,re))),512&e.$$.dirty[0]&&k&&T&&(Array.isArray(T)?n(3,T=[...T]):n(3,T=[T])),512&e.$$.dirty[0]|262144&e.$$.dirty[2]&&ne&&!k&&T&&n(3,T=null),520&e.$$.dirty[0]&&k&&T&&T.length>1&&xe(),8&e.$$.dirty[0]&&T&&(k?JSON.stringify(T)!==JSON.stringify(ee)&&xe()&&m("input",T):ee&&JSON.stringify(T[W])===JSON.stringify(ee[W])||m("input",T)),520&e.$$.dirty[0]|65536&e.$$.dirty[2]&&!T&&k&&ee&&m("input",T),6&e.$$.dirty[0]&&!S&&x&&Te(),16&e.$$.dirty[0]|131072&e.$$.dirty[2]&&O!==te&&(F||0!==O.length)&&(F?le((async function(){n(5,ie=!0);let e=await v({dispatch:m,loadOptions:F,convertStringItemsToObjects:ys,filterText:O});e?(n(5,ie=e.loading),n(6,ae=ae?e.listOpen:O.length>0),n(2,S=ae&&e.focused),n(51,q=M?we(e.filteredItems):e.filteredItems)):(n(5,ie=!1),n(2,S=!0),n(6,ae=!0))}),ue):(n(6,ae=!0),k&&n(26,K=void 0))),12824&e.$$.dirty[0]|407896064&e.$$.dirty[1]|3&e.$$.dirty[2]&&n(24,l=g({loadOptions:F,filterText:O,items:q,multiple:k,value:T,itemId:W,groupBy:M,label:P,filterSelectedItems:z,itemFilter:E,convertStringItemsToObjects:ys,filterGroupedItems:we})),16777800&e.$$.dirty[0]&&!k&&ae&&T&&l&&be(l.findIndex((e=>e[W]===T[W])),!0),576&e.$$.dirty[0]&&ae&&k&&n(7,he=0),16&e.$$.dirty[0]&&O&&n(7,he=0),128&e.$$.dirty[0]&&m("hoverItem",he),520&e.$$.dirty[0]&&n(25,r=k?T&&T.length>0:T),33554448&e.$$.dirty[0]&&n(35,s=r&&O.length>0),33556512&e.$$.dirty[0]|64&e.$$.dirty[2]&&n(34,o=r&&ce&&!I&&!ie),520&e.$$.dirty[0]|100663296&e.$$.dirty[1]&&n(33,c=_&&k||k&&0===T?.length?L:T?"":L),520&e.$$.dirty[0]&&n(32,i=T?function(e){let t;return t=e&&T.length>0?T.map((e=>e[P])).join(", "):T[P],Oe(t)}(k):""),16777412&e.$$.dirty[0]&&n(31,a=function(){if(!l||0===l.length)return"";let e=l[he];if(ae&&e){let t=l?l.length:0;return Le(e[P],t)}return _e()}()),1048576&e.$$.dirty[1]&&function(e){e&&0!==e.length&&!e.some((e=>"object"!=typeof e))&&T&&(k?!T.some((e=>!e||!e[W])):T[W])&&(Array.isArray(T)?n(3,T=T.map((e=>ke(e)||e))):n(3,T=ke()||T))}(q),8712&e.$$.dirty[0]&&n(52,h=k?T?T.map((e=>e[W])):null:T?T[W]:T),520&e.$$.dirty[0]|65536&e.$$.dirty[2]&&(k||!ee||T||m("input",T)),16777800&e.$$.dirty[0]&&ae&&l&&!k&&!T&&be(),16777216&e.$$.dirty[0]&&function(e){ae&&m("filter",e)}(l),1&e.$$.dirty[0]|4096&e.$$.dirty[2]&&y&&void 0===ge?.autoUpdate&&n(81,De.autoUpdate=!0,De),1&e.$$.dirty[0]|528384&e.$$.dirty[2]&&y&&ge&&Ue(Object.assign(De,ge)),8388608&e.$$.dirty[0]&&n(30,u=!!Pe),8388672&e.$$.dirty[0]&&function(e,t){if(!e||!t)return n(28,Ve=!0);setTimeout((()=>{n(28,Ve=!1)}),0)}(Pe,ae),8388673&e.$$.dirty[0]&&ae&&y&&Pe&&function(){const{width:e}=y.getBoundingClientRect();n(23,Pe.style.width=fe?e+"px":"auto",Pe)}(),128&e.$$.dirty[0]&&n(29,d=he),70&e.$$.dirty[0]&&x&&ae&&!S&&Ie()},[y,x,S,T,O,ie,ae,he,b,k,C,I,P,W,B,N,D,se,oe,de,$e,ve,function(){m("clear",T),n(3,T=void 0),Te(),Ie()},Pe,l,r,K,re,Ve,d,u,a,i,c,o,s,Ce,function(e){if(S)switch(e.stopPropagation(),e.key){case"Escape":e.preventDefault(),Te();break;case"Enter":if(e.preventDefault(),ae){if(0===l.length)break;const e=l[he];if(T&&!k&&T[W]===e[W]){Te();break}Ae(l[he])}break;case"ArrowDown":e.preventDefault(),ae?Fe(1):(n(6,ae=!0),n(26,K=void 0));break;case"ArrowUp":e.preventDefault(),ae?Fe(-1):(n(6,ae=!0),n(26,K=void 0));break;case"Tab":if(ae&&S){if(0===l.length||T&&T[W]===l[he][W])return Te();e.preventDefault(),Ae(l[he]),Te()}break;case"Backspace":if(!k||O.length>0)return;if(k&&T&&T.length>0){if(Ce(void 0!==K?K:T.length-1),0===K||void 0===K)break;n(26,K=T.length>K?K-1:void 0)}break;case"ArrowLeft":if(!T||!k||O.length>0)return;void 0===K?n(26,K=T.length-1):T.length>K&&0!==K&&n(26,K-=1);break;case"ArrowRight":if(!T||!k||O.length>0||void 0===K)return;K===T.length-1?n(26,K=void 0):K<T.length-1&&n(26,K+=1)}},Ie,Se,function(){if(!I)return O.length>0?n(6,ae=!0):void n(6,ae=!ae)},Ee,function(e){ae||S||!y||y.contains(e.target)||Pe?.contains(e.target)||Se()},Re,We,function(e,t,n){if(!k)return t&&t[n]===e[n]},Be,Ne,He,je,$,q,h,g,v,w,L,_,E,M,A,R,F,z,Z,Q,X,()=>l,ce,le,ue,pe,fe,me,ge,Oe,Le,_e,ee,te,ne,De,f,p,function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},function(t){G.call(this,e,t)},e=>Re(e),e=>Re(e),(e,t)=>We({item:e,i:t}),function(e){J[e?"unshift":"push"]((()=>{Pe=e,n(23,Pe)}))},e=>Ce(e),e=>C?Ce(e):{},function(e){J[e?"unshift":"push"]((()=>{x=e,n(1,x)}))},function(){O=this.value,n(4,O)},function(e){J[e?"unshift":"push"]((()=>{y=e,n(0,y)}))}]}class ks extends we{constructor(e){super(),ve(this,e,xs,bs,c,{justValue:52,filter:53,getItems:54,id:55,name:8,container:0,input:1,multiple:9,multiFullItemClearable:10,disabled:11,focused:2,value:3,filterText:4,placeholder:56,placeholderAlwaysShow:57,items:51,label:12,itemFilter:58,groupBy:59,groupFilter:60,groupHeaderSelectable:61,itemId:13,loadOptions:62,containerStyles:14,hasError:15,filterSelectedItems:63,required:16,closeListOnChange:64,clearFilterTextOnBlur:65,createGroupHeaderItem:66,getFilteredItems:67,searchable:17,inputStyles:18,clearable:68,loading:5,listOpen:6,debounce:69,debounceWait:70,hideEmptyState:19,inputAttributes:71,listAutoWidth:72,showChevron:20,listOffset:73,hoverItemIndex:7,floatingConfig:74,class:21,handleClear:22,ariaValues:75,ariaListOpen:76,ariaFocused:77},null,[-1,-1,-1,-1,-1])}get getFilteredItems(){return this.$$.ctx[67]}get handleClear(){return this.$$.ctx[22]}}function Cs(e){let t;function n(e,t){return"svgMono"==e[2]?Ss:Is}let r=n(e),s=r(e);return{c(){s.c(),t=T()},m(e,n){s.m(e,n),b(e,t,n)},p(e,o){r===(r=n(e))&&s?s.p(e,o):(s.d(1),s=r(e),s&&(s.c(),s.m(t.parentNode,t)))},d(e){s.d(e),e&&y(t)}}}function Is(e){let t,n,r;return{c(){t=k("img"),a(t.src,n=`/assets/images/${e[0].value}-icon.${e[2]}`)||q(t,"src",n),q(t,"alt",r=e[0].label)},m(e,n){b(e,t,n)},p(e,s){5&s&&!a(t.src,n=`/assets/images/${e[0].value}-icon.${e[2]}`)&&q(t,"src",n),1&s&&r!==(r=e[0].label)&&q(t,"alt",r)},d(e){e&&y(t)}}}function Ss(e){let t;function n(e,t){return"dark"==e[1]?Os:Ts}let r=n(e),s=r(e);return{c(){s.c(),t=T()},m(e,n){s.m(e,n),b(e,t,n)},p(e,o){r===(r=n(e))&&s?s.p(e,o):(s.d(1),s=r(e),s&&(s.c(),s.m(t.parentNode,t)))},d(e){s.d(e),e&&y(t)}}}function Ts(e){let t,n,r;return{c(){t=k("img"),a(t.src,n=`/assets/images/${e[0].value}-icon.svg`)||q(t,"src",n),q(t,"alt",r=e[0].label)},m(e,n){b(e,t,n)},p(e,s){1&s&&!a(t.src,n=`/assets/images/${e[0].value}-icon.svg`)&&q(t,"src",n),1&s&&r!==(r=e[0].label)&&q(t,"alt",r)},d(e){e&&y(t)}}}function Os(e){let t,n,r;return{c(){t=k("img"),a(t.src,n=`/assets/images/${e[0].value}-icon-light.svg`)||q(t,"src",n),q(t,"alt",r=e[0].label)},m(e,n){b(e,t,n)},p(e,s){1&s&&!a(t.src,n=`/assets/images/${e[0].value}-icon-light.svg`)&&q(t,"src",n),1&s&&r!==(r=e[0].label)&&q(t,"alt",r)},d(e){e&&y(t)}}}function Ls(t){let n,r=t[2]&&Cs(t);return{c(){r&&r.c(),n=T()},m(e,t){r&&r.m(e,t),b(e,n,t)},p(e,[t]){e[2]?r?r.p(e,t):(r=Cs(e),r.c(),r.m(n.parentNode,n)):r&&(r.d(1),r=null)},i:e,o:e,d(e){r&&r.d(e),e&&y(n)}}}function _s(e,t,n){let r,s,o,{details:c}=t,{selectedService:i}=t;const a=He.subscribe((e=>n(4,s=e))),l=je.subscribe((e=>n(5,o=e)));let u;return U((()=>{a(),l()})),e.$$set=e=>{"details"in e&&n(0,c=e.details),"selectedService"in e&&n(3,i=e.selectedService)},e.$$.update=()=>{16&e.$$.dirty&&s&&("dark"==s.theme?n(1,u="dark"):"light"==s.theme?n(1,u="light"):window.matchMedia("(prefers-color-scheme: dark)").matches?n(1,u="dark"):n(1,u="light")),41&e.$$.dirty&&n(2,r=o.services[i].frontends[c.value].imageType)},[c,u,r,i,s,o]}class qs extends we{constructor(e){super(),ve(this,e,_s,Ls,c,{details:0,selectedService:3})}}function Ps(t){let n,r=(t[7].i18n.getMessage("redirectType")||"Redirect Type")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Es(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[Ps]},$$scope:{ctx:e}}}),r=new Te({props:{value:e[4].redirectType,onChange:e[9],values:e[6]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};32768&n&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};16&n&&(o.value=e[4].redirectType),18&n&&(o.onChange=e[9]),64&n&&(o.values=e[6]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function Ms(e){let t,n;return t=new xe({props:{$$slots:{default:[Fs]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},p(e,n){const r={};32791&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function As(t){let n,r=(t[7].i18n.getMessage("embedFrontend")||"Embed Frontend")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Rs(e){let t,n,r,s,o,c=e[14].label+"";return n=new qs({props:{details:e[14],selectedService:e[0]}}),{c(){t=k("div"),me(n.$$.fragment),r=S(),s=I(c),q(t,"class","slot"),q(t,"slot","item")},m(e,c){b(e,t,c),he(n,t,null),w(t,r),w(t,s),o=!0},p(e,t){const r={};16384&t&&(r.details=e[14]),1&t&&(r.selectedService=e[0]),n.$set(r),(!o||16384&t)&&c!==(c=e[14].label+"")&&A(s,c)},i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){e&&y(t),ge(n)}}}function Ws(e){let t,n,r,s,o,c=e[13].label+"";return n=new qs({props:{details:e[13],selectedService:e[0]}}),{c(){t=k("div"),me(n.$$.fragment),r=S(),s=I(c),q(t,"class","slot"),q(t,"slot","selection")},m(e,c){b(e,t,c),he(n,t,null),w(t,r),w(t,s),o=!0},p(e,t){const r={};8192&t&&(r.details=e[13]),1&t&&(r.selectedService=e[0]),n.$set(r),(!o||8192&t)&&c!==(c=e[13].label+"")&&A(s,c)},i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){e&&y(t),ge(n)}}}function Fs(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[As]},$$scope:{ctx:e}}}),r=new ks({props:{clearable:!1,class:"svelte_select",value:e[4].embedFrontend,items:e[2],$$slots:{selection:[Ws,({selection:e})=>({13:e}),({selection:e})=>e?8192:0],item:[Rs,({item:e})=>({14:e}),({item:e})=>e?16384:0]},$$scope:{ctx:e}}}),r.$on("change",e[10]),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};32768&n&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};16&n&&(o.value=e[4].embedFrontend),4&n&&(o.items=e[2]),57345&n&&(o.$$scope={dirty:n,ctx:e}),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function Bs(e){let t,n,r,s;t=new xe({props:{$$slots:{default:[Es]},$$scope:{ctx:e}}});let o=e[3].frontends[e[5]].desktopApp&&"main_frame"!=e[4].redirectType&&Ms(e);return{c(){me(t.$$.fragment),n=S(),o&&o.c(),r=T()},m(e,c){he(t,e,c),b(e,n,c),o&&o.m(e,c),b(e,r,c),s=!0},p(e,[n]){const s={};32850&n&&(s.$$scope={dirty:n,ctx:e}),t.$set(s),e[3].frontends[e[5]].desktopApp&&"main_frame"!=e[4].redirectType?o?(o.p(e,n),56&n&&de(o,1)):(o=Ms(e),o.c(),de(o,1),o.m(r.parentNode,r)):o&&(le(),pe(o,1,1,(()=>{o=null})),ue())},i(e){s||(de(t.$$.fragment,e),de(o),s=!0)},o(e){pe(t.$$.fragment,e),pe(o),s=!1},d(e){ge(t,e),e&&y(n),o&&o.d(e),e&&y(r)}}}function Ns(e,t,n){let r,s,o;const c=window.browser||window.chrome;let i,a;const l=He.subscribe((e=>n(1,i=e))),u=je.subscribe((e=>n(8,a=e)));U((()=>{l(),u()}));let d,{selectedService:p}=t,f=[];return e.$$set=e=>{"selectedService"in e&&n(0,p=e.selectedService)},e.$$.update=()=>{if(257&e.$$.dirty&&n(3,r=a.services[p]),3&e.$$.dirty&&n(4,s=i[p]),3&e.$$.dirty&&n(5,o=i[p].frontend),58&e.$$.dirty&&(r.frontends[o].embeddable?n(6,d=[{value:"both",name:c.i18n.getMessage("both")||"Both"},{value:"sub_frame",name:c.i18n.getMessage("onlyEmbedded")||"Only Embedded"},{value:"main_frame",name:c.i18n.getMessage("onlyNotEmbedded")||"Only Not Embedded"}]):r.frontends[o].desktopApp&&Object.values(r.frontends).some((e=>e.embeddable))?(n(6,d=[{value:"both",name:c.i18n.getMessage("both")||"Both"},{value:"main_frame",name:c.i18n.getMessage("onlyNotEmbedded")||"Only Not Embedded"}]),"sub_frame"==s.redirectType&&(n(4,s.redirectType="main_frame",s),He.set(i))):(n(6,d=[{value:"main_frame",name:c.i18n.getMessage("onlyNotEmbedded")||"Only Not Embedded"}]),n(4,s.redirectType="main_frame",s),He.set(i))),12&e.$$.dirty&&r){n(2,f=[]);for(const[e,t]of Object.entries(r.frontends))t.embeddable&&t.instanceList&&f.push({value:e,label:t.name})}},[p,i,f,r,s,o,d,c,a,e=>{n(4,s.redirectType=e.target.options[e.target.options.selectedIndex].value,s),He.set(i)},e=>{n(4,s.embedFrontend=e.detail.value,s),He.set(i)}]}class zs extends we{constructor(e){super(),ve(this,e,Ns,Bs,c,{selectedService:0})}}function Ds(n){let r,s,o=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"20px"},{viewBox:"0 0 24 24"},{width:"20px"},{fill:"currentColor"}],c={};for(let e=0;e<o.length;e+=1)c=t(c,o[e]);return{c(){r=C("svg"),s=C("path"),q(s,"d","M10.45 15.5q.6.6 1.55.587.95-.012 1.4-.687L19 7l-8.4 5.6q-.675.45-.712 1.375-.038.925.562 1.525ZM12 4q1.475 0 2.838.412Q16.2 4.825 17.4 5.65l-1.9 1.2q-.825-.425-1.712-.637Q12.9 6 12 6 8.675 6 6.338 8.337 4 10.675 4 14q0 1.05.287 2.075Q4.575 17.1 5.1 18h13.8q.575-.95.838-1.975Q20 15 20 13.9q0-.9-.212-1.75-.213-.85-.638-1.65l1.2-1.9q.75 1.175 1.188 2.5.437 1.325.462 2.75.025 1.425-.325 2.725-.35 1.3-1.025 2.475-.275.45-.75.7-.475.25-1 .25H5.1q-.525 0-1-.25t-.75-.7q-.65-1.125-1-2.387Q2 15.4 2 14q0-2.075.788-3.888.787-1.812 2.15-3.175Q6.3 5.575 8.125 4.787 9.95 4 12 4Zm.175 7.825Z"),M(r,c)},m(e,t){b(e,r,t),w(r,s)},p(e,[t]){M(r,c=fe(o,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"20px"},{viewBox:"0 0 24 24"},{width:"20px"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&y(r)}}}function Hs(e,n,r){const s=[];let o=g(n,s);return e.$$set=e=>{n=t(t({},n),h(e)),r(0,o=g(n,s))},[o]}class js extends we{constructor(e){super(),ve(this,e,Hs,Ds,c,{})}}function Us(n){let r,s,o=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"20px"},{viewBox:"0 -960 960 960"},{width:"20px"},{fill:"currentColor"}],c={};for(let e=0;e<o.length;e+=1)c=t(c,o[e]);return{c(){r=C("svg"),s=C("path"),q(s,"d","M144-144v-178l342-342-54-53 51-51 72 72 110.22-110.22q4.45-4.45 11.11-7.11Q683-816 691-816t15 2.5q7 2.5 12 7.5l87 88q4.55 5.83 7.27 12.64 2.73 6.8 2.73 14.58t-2.66 14.44q-2.67 6.66-7.11 11.1L696-556l72 73-51 51-54-54-341 342H144Zm72-72h76l320-320-75-76-321 320v76Zm424-385 90-91-38-39-91 90 39 40Zm0 0-39-40 39 40Z"),M(r,c)},m(e,t){b(e,r,t),w(r,s)},p(e,[t]){M(r,c=fe(o,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"20px"},{viewBox:"0 -960 960 960"},{width:"20px"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&y(r)}}}function Vs(e,n,r){const s=[];let o=g(n,s);return e.$$set=e=>{n=t(t({},n),h(e)),r(0,o=g(n,s))},[o]}class Gs extends we{constructor(e){super(),ve(this,e,Vs,Us,c,{})}}function Zs(e,t,n){const r=e.slice();return r[26]=t[n][0],r[27]=t[n][1],r}function Js(e,t,n){const r=e.slice();return r[30]=t[n],r}function Qs(e,t,n){const r=e.slice();return r[30]=t[n],r}function Xs(e){let t,n,r,s,o,c,i,a,l,u,d,p,f,$;s=new nt({props:{disabled:e[9],$$slots:{default:[Ys]},$$scope:{ctx:e}}}),s.$on("click",e[15]),c=new nt({props:{disabled:e[8],$$slots:{default:[Ks]},$$scope:{ctx:e}}}),c.$on("click",e[16]),a=new xe({props:{$$slots:{default:[to]},$$scope:{ctx:e}}}),d=new xe({props:{$$slots:{default:[no]},$$scope:{ctx:e}}});let m=e[1][e[0]],h=[];for(let t=0;t<m.length;t+=1)h[t]=co(Qs(e,m,t));const g=e=>pe(h[e],1,1,(()=>{h[e]=null}));let v="disabled"!==e[3]&&"disabled"!==e[6]&&io(e);return{c(){t=k("hr"),n=S(),r=k("div"),me(s.$$.fragment),o=S(),me(c.$$.fragment),i=S(),me(a.$$.fragment),l=S(),u=k("div"),me(d.$$.fragment),p=S();for(let e=0;e<h.length;e+=1)h[e].c();f=S(),v&&v.c(),q(u,"dir","ltr")},m(e,m){b(e,t,m),b(e,n,m),b(e,r,m),he(s,r,null),w(r,o),he(c,r,null),b(e,i,m),he(a,e,m),b(e,l,m),b(e,u,m),he(d,u,null),w(u,p);for(let e=0;e<h.length;e+=1)h[e]&&h[e].m(u,null);w(u,f),v&&v.m(u,null),$=!0},p(e,t){const n={};512&t[0]&&(n.disabled=e[9]),16&t[1]&&(n.$$scope={dirty:t,ctx:e}),s.$set(n);const r={};256&t[0]&&(r.disabled=e[8]),16&t[1]&&(r.$$scope={dirty:t,ctx:e}),c.$set(r);const o={};3&t[0]|16&t[1]&&(o.$$scope={dirty:t,ctx:e}),a.$set(o);const i={};if(128&t[0]|16&t[1]&&(i.$$scope={dirty:t,ctx:e}),d.$set(i),4131&t[0]){let n;for(m=e[1][e[0]],n=0;n<m.length;n+=1){const r=Qs(e,m,n);h[n]?(h[n].p(r,t),de(h[n],1)):(h[n]=co(r),h[n].c(),de(h[n],1),h[n].m(u,f))}for(le(),n=m.length;n<h.length;n+=1)g(n);ue()}"disabled"!==e[3]&&"disabled"!==e[6]?v?(v.p(e,t),72&t[0]&&de(v,1)):(v=io(e),v.c(),de(v,1),v.m(u,null)):v&&(le(),pe(v,1,1,(()=>{v=null})),ue())},i(e){if(!$){de(s.$$.fragment,e),de(c.$$.fragment,e),de(a.$$.fragment,e),de(d.$$.fragment,e);for(let e=0;e<m.length;e+=1)de(h[e]);de(v),$=!0}},o(e){pe(s.$$.fragment,e),pe(c.$$.fragment,e),pe(a.$$.fragment,e),pe(d.$$.fragment,e),h=h.filter(Boolean);for(let e=0;e<h.length;e+=1)pe(h[e]);pe(v),$=!1},d(e){e&&y(t),e&&y(n),e&&y(r),ge(s),ge(c),e&&y(i),ge(a,e),e&&y(l),e&&y(u),ge(d),x(h,e),v&&v.d()}}}function Ys(t){let n,r,s,o,c=(t[11].i18n.getMessage("pingInstances")||"Ping Instances")+"";return n=new js({props:{class:"margin margin_"+document.body.dir}}),{c(){me(n.$$.fragment),r=S(),s=I(c)},m(e,t){he(n,e,t),b(e,r,t),b(e,s,t),o=!0},p:e,i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){ge(n,e),e&&y(r),e&&y(s)}}}function Ks(t){let n,r,s,o,c=(t[11].i18n.getMessage("autoPickInstance")||"Auto Pick Instance")+"";return n=new Gs({props:{class:"margin margin_"+document.body.dir}}),{c(){me(n.$$.fragment),r=S(),s=I(c)},m(e,t){he(n,e,t),b(e,r,t),b(e,s,t),o=!0},p:e,i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){ge(n,e),e&&y(r),e&&y(s)}}}function eo(t){let n,r=(t[11].i18n.getMessage("addYourFavoriteInstances")||"Add your favorite instances")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function to(e){let t,n,r,s,o,c,i;return t=new Be({props:{$$slots:{default:[eo]},$$scope:{ctx:e}}}),s=new Ee({props:{style:"color: var(--active);"}}),{c(){me(t.$$.fragment),n=S(),r=k("button"),me(s.$$.fragment),q(r,"class","add svelte-f3h0n0"),q(r,"title","Remove All Instances")},m(a,l){he(t,a,l),b(a,n,l),b(a,r,l),he(s,r,null),o=!0,c||(i=O(r,"click",e[17]),c=!0)},p(e,n){const r={};16&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){o||(de(t.$$.fragment,e),de(s.$$.fragment,e),o=!0)},o(e){pe(t.$$.fragment,e),pe(s.$$.fragment,e),o=!1},d(e){ge(t,e),e&&y(n),e&&y(r),ge(s),c=!1,i()}}}function no(e){let t,n,r,s,o,c,i,a;function l(t){e[18](t)}let u={type:"url",placeholder:"https://instance.com",title:"Add instance input"};return void 0!==e[7]&&(u.value=e[7]),t=new Re({props:u}),J.push((()=>$e(t,"value",l))),t.$on("keydown",e[19]),o=new _e({}),{c(){me(t.$$.fragment),r=S(),s=k("button"),me(o.$$.fragment),q(s,"class","add svelte-f3h0n0"),q(s,"title","Add the instance")},m(n,l){he(t,n,l),b(n,r,l),b(n,s,l),he(o,s,null),c=!0,i||(a=O(s,"click",e[13]),i=!0)},p(e,r){const s={};!n&&128&r[0]&&(n=!0,s.value=e[7],ne((()=>n=!1))),t.$set(s)},i(e){c||(de(t.$$.fragment,e),de(o.$$.fragment,e),c=!0)},o(e){pe(t.$$.fragment,e),pe(o.$$.fragment,e),c=!1},d(e){ge(t,e),e&&y(r),e&&y(s),ge(o),i=!1,a()}}}function ro(e){let t;return{c(){t=k("span"),t.textContent="custom",W(t,"color","grey")},m(e,n){b(e,t,n)},d(e){e&&y(t)}}}function so(e){let t,n,r=e[5][e[30]].value+"";return{c(){t=k("span"),n=I(r),W(t,"color",e[5][e[30]].color)},m(e,r){b(e,t,r),w(t,n)},p(e,s){35&s[0]&&r!==(r=e[5][e[30]].value+"")&&A(n,r),35&s[0]&&W(t,"color",e[5][e[30]].color)},d(e){e&&y(t)}}}function oo(e){let t,n,r,s,o,c,i,a,l,u,d,p,f=e[30]+"",$=e[12](e[30]),m=$&&ro(),h=e[5]&&e[5][e[30]]&&so(e);function g(){return e[20](e[30])}return l=new Ee({}),{c(){t=k("span"),n=k("a"),r=I(f),o=S(),m&&m.c(),c=S(),h&&h.c(),i=S(),a=k("button"),me(l.$$.fragment),q(n,"href",s=e[30]),q(n,"target","_blank"),q(n,"rel","noopener noreferrer"),q(n,"class","svelte-f3h0n0"),q(a,"class","add svelte-f3h0n0"),q(a,"title","Remove Instance")},m(e,s){b(e,t,s),w(t,n),w(n,r),w(t,o),m&&m.m(t,null),w(t,c),h&&h.m(t,null),b(e,i,s),b(e,a,s),he(l,a,null),u=!0,d||(p=O(a,"click",g),d=!0)},p(o,i){e=o,(!u||3&i[0])&&f!==(f=e[30]+"")&&A(r,f),(!u||3&i[0]&&s!==(s=e[30]))&&q(n,"href",s),3&i[0]&&($=e[12](e[30])),$?m||(m=ro(),m.c(),m.m(t,c)):m&&(m.d(1),m=null),e[5]&&e[5][e[30]]?h?h.p(e,i):(h=so(e),h.c(),h.m(t,null)):h&&(h.d(1),h=null)},i(e){u||(de(l.$$.fragment,e),u=!0)},o(e){pe(l.$$.fragment,e),u=!1},d(e){e&&y(t),m&&m.d(),h&&h.d(),e&&y(i),e&&y(a),ge(l),d=!1,p()}}}function co(e){let t,n,r,s;return t=new xe({props:{$$slots:{default:[oo]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment),n=S(),r=k("hr")},m(e,o){he(t,e,o),b(e,n,o),b(e,r,o),s=!0},p(e,n){const r={};35&n[0]|16&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(de(t.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),e&&y(r)}}}function io(e){let t,n,r,s;const o=[lo,ao],c=[];function i(e,t){return e[3][e[0]]&&e[3][e[0]].clearnet?0:1}return t=i(e),n=c[t]=o[t](e),{c(){n.c(),r=T()},m(e,n){c[t].m(e,n),b(e,r,n),s=!0},p(e,s){let a=t;t=i(e),t===a?c[t].p(e,s):(le(),pe(c[a],1,1,(()=>{c[a]=null})),ue(),n=c[t],n?n.p(e,s):(n=c[t]=o[t](e),n.c()),de(n,1),n.m(r.parentNode,r))},i(e){s||(de(n),s=!0)},o(e){pe(n),s=!1},d(e){c[t].d(e),e&&y(r)}}}function ao(e){let t,n;return t=new xe({props:{$$slots:{default:[po]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},p(e,n){const r={};16&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function lo(e){let t,n,r=Object.entries(e[2].networks),s=[];for(let t=0;t<r.length;t+=1)s[t]=ko(Zs(e,r,t));const o=e=>pe(s[e],1,1,(()=>{s[e]=null}));return{c(){for(let e=0;e<s.length;e+=1)s[e].c();t=T()},m(e,r){for(let t=0;t<s.length;t+=1)s[t]&&s[t].m(e,r);b(e,t,r),n=!0},p(e,n){if(111&n[0]){let c;for(r=Object.entries(e[2].networks),c=0;c<r.length;c+=1){const o=Zs(e,r,c);s[c]?(s[c].p(o,n),de(s[c],1)):(s[c]=ko(o),s[c].c(),de(s[c],1),s[c].m(t.parentNode,t))}for(le(),c=r.length;c<s.length;c+=1)o(c);ue()}},i(e){if(!n){for(let e=0;e<r.length;e+=1)de(s[e]);n=!0}},o(e){s=s.filter(Boolean);for(let e=0;e<s.length;e+=1)pe(s[e]);n=!1},d(e){x(s,e),e&&y(t)}}}function uo(e){let t;return{c(){t=I("No instances found.")},m(e,n){b(e,t,n)},d(e){e&&y(t)}}}function po(e){let t,n;return t=new Be({props:{$$slots:{default:[uo]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},p(e,n){const r={};16&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function fo(e){let t,n,r,s,o,c,i,a;t=new xe({}),r=new xe({props:{$$slots:{default:[mo]},$$scope:{ctx:e}}});let l=e[3][e[0]][e[26]],u=[];for(let t=0;t<l.length;t+=1)u[t]=xo(Js(e,l,t));const d=e=>pe(u[e],1,1,(()=>{u[e]=null}));return{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment),s=S(),o=k("hr"),c=S();for(let e=0;e<u.length;e+=1)u[e].c();i=T()},m(e,l){he(t,e,l),b(e,n,l),he(r,e,l),b(e,s,l),b(e,o,l),b(e,c,l);for(let t=0;t<u.length;t+=1)u[t]&&u[t].m(e,l);b(e,i,l),a=!0},p(e,t){const n={};if(15&t[0]|16&t[1]&&(n.$$scope={dirty:t,ctx:e}),r.$set(n),111&t[0]){let n;for(l=e[3][e[0]][e[26]],n=0;n<l.length;n+=1){const r=Js(e,l,n);u[n]?(u[n].p(r,t),de(u[n],1)):(u[n]=xo(r),u[n].c(),de(u[n],1),u[n].m(i.parentNode,i))}for(le(),n=l.length;n<u.length;n+=1)d(n);ue()}},i(e){if(!a){de(t.$$.fragment,e),de(r.$$.fragment,e);for(let e=0;e<l.length;e+=1)de(u[e]);a=!0}},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),u=u.filter(Boolean);for(let e=0;e<u.length;e+=1)pe(u[e]);a=!1},d(e){ge(t,e),e&&y(n),ge(r,e),e&&y(s),e&&y(o),e&&y(c),x(u,e),e&&y(i)}}}function $o(e){let t,n=e[27].name+"";return{c(){t=I(n)},m(e,n){b(e,t,n)},p(e,r){4&r[0]&&n!==(n=e[27].name+"")&&A(t,n)},d(e){e&&y(t)}}}function mo(e){let t,n,r,s,o,c,i;function a(){return e[21](e[26])}return t=new Be({props:{$$slots:{default:[$o]},$$scope:{ctx:e}}}),s=new _e({props:{style:"color: var(--active);"}}),{c(){me(t.$$.fragment),n=S(),r=k("button"),me(s.$$.fragment),q(r,"class","add svelte-f3h0n0"),q(r,"title","Add All Instances")},m(e,l){he(t,e,l),b(e,n,l),b(e,r,l),he(s,r,null),o=!0,c||(i=O(r,"click",a),c=!0)},p(n,r){e=n;const s={};4&r[0]|16&r[1]&&(s.$$scope={dirty:r,ctx:e}),t.$set(s)},i(e){o||(de(t.$$.fragment,e),de(s.$$.fragment,e),o=!0)},o(e){pe(t.$$.fragment,e),pe(s.$$.fragment,e),o=!1},d(e){ge(t,e),e&&y(n),e&&y(r),ge(s),c=!1,i()}}}function ho(e){let t;return{c(){t=k("a"),t.textContent="cloudflare",q(t,"href","https://libredirect.github.io/docs.html#instances"),q(t,"target","_blank"),q(t,"rel","noopener noreferrer"),W(t,"color","red"),q(t,"class","svelte-f3h0n0")},m(e,n){b(e,t,n)},d(e){e&&y(t)}}}function go(e){let t;return{c(){t=k("span"),t.textContent="chosen",W(t,"color","grey")},m(e,n){b(e,t,n)},d(e){e&&y(t)}}}function vo(e){let t,n,r=e[5][e[30]].value+"";return{c(){t=k("span"),n=I(r),W(t,"color",e[5][e[30]].color)},m(e,r){b(e,t,r),w(t,n)},p(e,s){45&s[0]&&r!==(r=e[5][e[30]].value+"")&&A(n,r),45&s[0]&&W(t,"color",e[5][e[30]].color)},d(e){e&&y(t)}}}function wo(e){let t,n,r,s,o;function c(){return e[23](e[30])}return n=new Ee({}),{c(){t=k("button"),me(n.$$.fragment),q(t,"class","add svelte-f3h0n0"),q(t,"title","Remove Instance")},m(e,i){b(e,t,i),he(n,t,null),r=!0,s||(o=O(t,"click",c),s=!0)},p(t,n){e=t},i(e){r||(de(n.$$.fragment,e),r=!0)},o(e){pe(n.$$.fragment,e),r=!1},d(e){e&&y(t),ge(n),s=!1,o()}}}function bo(e){let t,n,r,s,o;function c(){return e[22](e[30])}return n=new _e({}),{c(){t=k("button"),me(n.$$.fragment),q(t,"class","add svelte-f3h0n0"),q(t,"title","Add instance")},m(e,i){b(e,t,i),he(n,t,null),r=!0,s||(o=O(t,"click",c),s=!0)},p(t,n){e=t},i(e){r||(de(n.$$.fragment,e),r=!0)},o(e){pe(n.$$.fragment,e),r=!1},d(e){e&&y(t),ge(n),s=!1,o()}}}function yo(e){let t,n,r,s,o,c,i,a,l,u,d,p,f,$=e[30]+"",m=e[6].cloudflare.includes(e[30]),h=e[1][e[0]].includes(e[30]),g=m&&ho(),v=h&&go(),x=e[5]&&e[5][e[30]]&&vo(e);const C=[bo,wo],O=[];function L(e,t){return 15&t[0]&&(l=null),null==l&&(l=!e[1][e[0]].includes(e[30])),l?0:1}return u=L(e,[-1,-1]),d=O[u]=C[u](e),{c(){t=k("span"),n=k("a"),r=I($),o=S(),g&&g.c(),c=S(),v&&v.c(),i=S(),x&&x.c(),a=S(),d.c(),p=T(),q(n,"href",s=e[30]),q(n,"target","_blank"),q(n,"rel","noopener noreferrer"),q(n,"class","svelte-f3h0n0")},m(e,s){b(e,t,s),w(t,n),w(n,r),w(t,o),g&&g.m(t,null),w(t,c),v&&v.m(t,null),w(t,i),x&&x.m(t,null),b(e,a,s),O[u].m(e,s),b(e,p,s),f=!0},p(e,o){(!f||13&o[0])&&$!==($=e[30]+"")&&A(r,$),(!f||13&o[0]&&s!==(s=e[30]))&&q(n,"href",s),77&o[0]&&(m=e[6].cloudflare.includes(e[30])),m?g||(g=ho(),g.c(),g.m(t,c)):g&&(g.d(1),g=null),15&o[0]&&(h=e[1][e[0]].includes(e[30])),h?v||(v=go(),v.c(),v.m(t,i)):v&&(v.d(1),v=null),e[5]&&e[5][e[30]]?x?x.p(e,o):(x=vo(e),x.c(),x.m(t,null)):x&&(x.d(1),x=null);let a=u;u=L(e,o),u===a?O[u].p(e,o):(le(),pe(O[a],1,1,(()=>{O[a]=null})),ue(),d=O[u],d?d.p(e,o):(d=O[u]=C[u](e),d.c()),de(d,1),d.m(p.parentNode,p))},i(e){f||(de(d),f=!0)},o(e){pe(d),f=!1},d(e){e&&y(t),g&&g.d(),v&&v.d(),x&&x.d(),e&&y(a),O[u].d(e),e&&y(p)}}}function xo(e){let t,n,r,s;return t=new xe({props:{$$slots:{default:[yo]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment),n=S(),r=k("hr")},m(e,o){he(t,e,o),b(e,n,o),b(e,r,o),s=!0},p(e,n){const r={};111&n[0]|16&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(de(t.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),e&&y(r)}}}function ko(e){let t,n,r=e[3][e[0]]&&e[3][e[0]][e[26]]&&e[3][e[0]][e[26]].length>0&&fo(e);return{c(){r&&r.c(),t=T()},m(e,s){r&&r.m(e,s),b(e,t,s),n=!0},p(e,n){e[3][e[0]]&&e[3][e[0]][e[26]]&&e[3][e[0]][e[26]].length>0?r?(r.p(e,n),13&n[0]&&de(r,1)):(r=fo(e),r.c(),de(r,1),r.m(t.parentNode,t)):r&&(le(),pe(r,1,1,(()=>{r=null})),ue())},i(e){n||(de(r),n=!0)},o(e){pe(r),n=!1},d(e){r&&r.d(e),e&&y(t)}}}function Co(e){let t,n,r=e[10].frontends[e[0]].instanceList&&e[3]&&e[6]&&Xs(e);return{c(){r&&r.c(),t=T()},m(e,s){r&&r.m(e,s),b(e,t,s),n=!0},p(e,n){e[10].frontends[e[0]].instanceList&&e[3]&&e[6]?r?(r.p(e,n),1097&n[0]&&de(r,1)):(r=Xs(e),r.c(),de(r,1),r.m(t.parentNode,t)):r&&(le(),pe(r,1,1,(()=>{r=null})),ue())},i(e){n||(de(r),n=!0)},o(e){pe(r),n=!1},d(e){r&&r.d(e),e&&y(t)}}}function Io(e,t,n){let r;const s=window.browser||window.chrome;let o,c,{selectedService:i}=t,{selectedFrontend:a}=t;const l=He.subscribe((e=>n(1,o=e))),u=je.subscribe((e=>n(2,c=e)));let d,p;U((()=>{l(),u()}));let f,$,m=[];function h(){const e=ht.protocolHost(new URL($));o[a].includes(e)||(o[a].push(e),n(7,$=""),He.set(o))}j((async()=>{n(6,d=await ht.getBlacklist(o)),n(3,p=await ht.getList(o)),n(5,f=await ht.getPingCache())}));let g=!1,v=!1;return e.$$set=e=>{"selectedService"in e&&n(14,i=e.selectedService),"selectedFrontend"in e&&n(0,a=e.selectedFrontend)},e.$$.update=()=>{16388&e.$$.dirty[0]&&n(10,r=c.services[i]),27&e.$$.dirty[0]&&(n(4,m=[]),o[a]&&m.push(...o[a]),p&&p[a]&&m.push(...p[a].clearnet),n(4,m=[...new Set(m)])),32&e.$$.dirty[0]&&f&&s.storage.local.set({pingCache:f})},[a,o,c,p,m,f,d,$,g,v,r,s,function(e){if(p[a])for(const t in p[a])if(p[a][t].includes(e))return!1;return!0},h,i,async()=>{n(9,v=!0),n(5,f={}),await Promise.allSettled(m.map((async e=>{n(5,f[e]={color:"lightblue",value:"pinging..."},f);const t=await ht.ping(e);n(5,f[e]=function(e){let t,n;return e<5e3?(t=`${e}ms`,e<=1e3?n="green":e<=2e3&&(n="orange")):e>=5e3?(n="red",5e3==e&&(t="5000ms+"),e>5e3&&(t="Error: "+(e-5e3))):(n="red",t="Server not found"),{color:n,value:t}}(t),f)}))),n(9,v=!1)},async()=>{n(8,g=!0);const e=p[a].clearnet;for(const t of o[a]){const n=e.indexOf(t);n>=0&&e.splice(n,1)}const t=await ht.autoPickInstance(e);o[a].push(t),He.set(o),n(8,g=!1)},()=>{o[a]&&(n(1,o[a]=[],o),He.set(o))},function(e){$=e,n(7,$)},e=>"Enter"===e.key&&h(),e=>{const t=o[a].indexOf(e);t>-1&&(o[a].splice(t,1),He.set(o))},e=>{if(o[a]){for(const t of p[a][e])o[a].includes(t)||o[a].push(t);He.set(o)}},e=>{o[a]&&(o[a].push(e),He.set(o))},e=>{const t=o[a].indexOf(e);t>-1&&(o[a].splice(t,1),He.set(o))}]}class So extends we{constructor(e){super(),ve(this,e,Io,Co,c,{selectedService:14,selectedFrontend:0},null,[-1,-1])}}function To(e){let t;function n(e,t){return"svgMono"==e[2]?Lo:Oo}let r=n(e),s=r(e);return{c(){s.c(),t=T()},m(e,n){s.m(e,n),b(e,t,n)},p(e,o){r===(r=n(e))&&s?s.p(e,o):(s.d(1),s=r(e),s&&(s.c(),s.m(t.parentNode,t)))},d(e){s.d(e),e&&y(t)}}}function Oo(e){let t,n,r;return{c(){t=k("img"),a(t.src,n=`/assets/images/${e[0].value}-icon.${e[2]}`)||q(t,"src",n),q(t,"alt",r=e[0].label)},m(e,n){b(e,t,n)},p(e,s){5&s&&!a(t.src,n=`/assets/images/${e[0].value}-icon.${e[2]}`)&&q(t,"src",n),1&s&&r!==(r=e[0].label)&&q(t,"alt",r)},d(e){e&&y(t)}}}function Lo(e){let t;function n(e,t){return"dark"==e[1]?qo:_o}let r=n(e),s=r(e);return{c(){s.c(),t=T()},m(e,n){s.m(e,n),b(e,t,n)},p(e,o){r===(r=n(e))&&s?s.p(e,o):(s.d(1),s=r(e),s&&(s.c(),s.m(t.parentNode,t)))},d(e){s.d(e),e&&y(t)}}}function _o(e){let t,n,r;return{c(){t=k("img"),a(t.src,n=`/assets/images/${e[0].value}-icon.svg`)||q(t,"src",n),q(t,"alt",r=e[0].label)},m(e,n){b(e,t,n)},p(e,s){1&s&&!a(t.src,n=`/assets/images/${e[0].value}-icon.svg`)&&q(t,"src",n),1&s&&r!==(r=e[0].label)&&q(t,"alt",r)},d(e){e&&y(t)}}}function qo(e){let t,n,r;return{c(){t=k("img"),a(t.src,n=`/assets/images/${e[0].value}-icon-light.svg`)||q(t,"src",n),q(t,"alt",r=e[0].label)},m(e,n){b(e,t,n)},p(e,s){1&s&&!a(t.src,n=`/assets/images/${e[0].value}-icon-light.svg`)&&q(t,"src",n),1&s&&r!==(r=e[0].label)&&q(t,"alt",r)},d(e){e&&y(t)}}}function Po(t){let n,r=t[2]&&To(t);return{c(){r&&r.c(),n=T()},m(e,t){r&&r.m(e,t),b(e,n,t)},p(e,[t]){e[2]?r?r.p(e,t):(r=To(e),r.c(),r.m(n.parentNode,n)):r&&(r.d(1),r=null)},i:e,o:e,d(e){r&&r.d(e),e&&y(n)}}}function Eo(e,t,n){let r,s,o,{details:c}=t;const i=He.subscribe((e=>n(3,s=e))),a=je.subscribe((e=>n(4,o=e)));let l;return U((()=>{i(),a()})),e.$$set=e=>{"details"in e&&n(0,c=e.details)},e.$$.update=()=>{8&e.$$.dirty&&s&&("dark"==s.theme?n(1,l="dark"):"light"==s.theme?n(1,l="light"):window.matchMedia("(prefers-color-scheme: dark)").matches?n(1,l="dark"):n(1,l="light")),17&e.$$.dirty&&n(2,r=o.services[c.value].imageType)},[c,l,r,s,o]}class Mo extends we{constructor(e){super(),ve(this,e,Eo,Po,c,{details:0})}}function Ao(e){let t,n,r,s=(e[9].i18n.getMessage("service")||"Service")+"";return{c(){t=k("a"),n=I(s),q(t,"href",r=e[2].url),W(t,"text-decoration","underline"),q(t,"target","_blank"),q(t,"rel","noopener noreferrer")},m(e,r){b(e,t,r),w(t,n)},p(e,n){4&n[0]&&r!==(r=e[2].url)&&q(t,"href",r)},d(e){e&&y(t)}}}function Ro(e){let t,n,r,s,o,c,i=e[31].label+"";return n=new Mo({props:{details:e[31]}}),{c(){t=k("div"),me(n.$$.fragment),r=S(),s=I(i),q(t,"class",o="slot "+(!e[0][e[31].value].enabled&&"disabled")),q(t,"slot","item")},m(e,o){b(e,t,o),he(n,t,null),w(t,r),w(t,s),c=!0},p(e,r){const a={};1&r[1]&&(a.details=e[31]),n.$set(a),(!c||1&r[1])&&i!==(i=e[31].label+"")&&A(s,i),(!c||1&r[0]|1&r[1]&&o!==(o="slot "+(!e[0][e[31].value].enabled&&"disabled")))&&q(t,"class",o)},i(e){c||(de(n.$$.fragment,e),c=!0)},o(e){pe(n.$$.fragment,e),c=!1},d(e){e&&y(t),ge(n)}}}function Wo(t){let n,r=(t[9].i18n.getMessage("searchService")||"Search Service")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,i:e,o:e,d(e){e&&y(n)}}}function Fo(e){let t,n,r,s,o=e[30].label+"";return t=new Mo({props:{details:e[30]}}),{c(){me(t.$$.fragment),n=S(),r=I(o)},m(e,o){he(t,e,o),b(e,n,o),b(e,r,o),s=!0},p(e,n){const c={};1073741824&n[0]&&(c.details=e[30]),t.$set(c),(!s||1073741824&n[0])&&o!==(o=e[30].label+"")&&A(r,o)},i(e){s||(de(t.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),e&&y(r)}}}function Bo(e){let t,n,r,s,o;const c=[Fo,Wo],i=[];function a(e,t){return e[4]?1:0}return n=a(e),r=i[n]=c[n](e),{c(){t=k("div"),r.c(),q(t,"class",s="slot "+(!e[0][e[30].value].enabled&&!e[4]&&"disabled")),q(t,"slot","selection")},m(e,r){b(e,t,r),i[n].m(t,null),o=!0},p(e,l){let u=n;n=a(e),n===u?i[n].p(e,l):(le(),pe(i[u],1,1,(()=>{i[u]=null})),ue(),r=i[n],r?r.p(e,l):(r=i[n]=c[n](e),r.c()),de(r,1),r.m(t,null)),(!o||1073741841&l[0]&&s!==(s="slot "+(!e[0][e[30].value].enabled&&!e[4]&&"disabled")))&&q(t,"class",s)},i(e){o||(de(r),o=!0)},o(e){pe(r),o=!1},d(e){e&&y(t),i[n].d()}}}function No(t){let n;return{c(){n=k("div"),n.textContent="🮦",W(n,"font-size","10px"),q(n,"slot","chevron-icon")},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function zo(e){let t,n,r,o,c,i,a;return t=new Be({props:{$$slots:{default:[Ao]},$$scope:{ctx:e}}}),o=new ks({props:{clearable:!1,class:"svelte_select",value:e[1],showChevron:!0,items:[...e[7].map(pc)],$$slots:{"chevron-icon":[No],selection:[Bo,({selection:e})=>({30:e}),({selection:e})=>[e?1073741824:0]],item:[Ro,({item:e})=>({31:e}),({item:e})=>[0,e?1:0]]},$$scope:{ctx:e}}}),o.$on("change",e[11]),o.$on("pointerup",e[12]),o.$on("focus",e[13]),o.$on("blur",e[14]),{c(){me(t.$$.fragment),n=S(),r=k("div"),me(o.$$.fragment),q(r,"dir","ltr")},m(s,l){he(t,s,l),b(s,n,l),b(s,r,l),he(o,r,null),c=!0,i||(a=[O(r,"click",e[15]),O(r,"keydown",null)],i=!0)},p(e,n){const r={};4&n[0]|2&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r);const s={};2&n[0]&&(s.value=e[1]),128&n[0]&&(s.items=[...e[7].map(pc)]),1073741841&n[0]|3&n[1]&&(s.$$scope={dirty:n,ctx:e}),o.$set(s)},i(e){c||(de(t.$$.fragment,e),de(o.$$.fragment,e),c=!0)},o(e){pe(t.$$.fragment,e),pe(o.$$.fragment,e),c=!1},d(e){ge(t,e),e&&y(n),e&&y(r),ge(o),i=!1,s(a)}}}function Do(t){let n,r=(t[9].i18n.getMessage("enable")||"Enable")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Ho(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[Do]},$$scope:{ctx:e}}}),r=new Ft({props:{checked:e[3].enabled,onChange:e[16]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};2&n[1]&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};8&n[0]&&(o.checked=e[3].enabled),9&n[0]&&(o.onChange=e[16]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function jo(t){let n,r=(t[9].i18n.getMessage("showInPopup")||"Show in popup")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Uo(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[jo]},$$scope:{ctx:e}}}),r=new Ft({props:{checked:e[0].popupServices.includes(e[1]),onChange:e[17]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};2&n[1]&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};3&n[0]&&(o.checked=e[0].popupServices.includes(e[1])),3&n[0]&&(o.onChange=e[17]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function Vo(e){let t,n,r=(e[9].i18n.getMessage("frontend")||"Frontend")+"";return{c(){t=k("a"),n=I(r),q(t,"href",e[8]),W(t,"text-decoration","underline"),q(t,"target","_blank"),q(t,"rel","noopener noreferrer")},m(e,r){b(e,t,r),w(t,n)},p(e,n){256&n[0]&&q(t,"href",e[8])},d(e){e&&y(t)}}}function Go(e){let t,n,r,s,o,c=e[31].label+"";return n=new qs({props:{details:e[31],selectedService:e[1]}}),{c(){t=k("div"),me(n.$$.fragment),r=S(),s=I(c),q(t,"class","slot"),q(t,"slot","item")},m(e,c){b(e,t,c),he(n,t,null),w(t,r),w(t,s),o=!0},p(e,t){const r={};1&t[1]&&(r.details=e[31]),2&t[0]&&(r.selectedService=e[1]),n.$set(r),(!o||1&t[1])&&c!==(c=e[31].label+"")&&A(s,c)},i(e){o||(de(n.$$.fragment,e),o=!0)},o(e){pe(n.$$.fragment,e),o=!1},d(e){e&&y(t),ge(n)}}}function Zo(t){let n,r=(t[9].i18n.getMessage("search_frontend")||"Search Frontend")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,i:e,o:e,d(e){e&&y(n)}}}function Jo(e){let t,n,r,s,o=e[30].label+"";return t=new qs({props:{details:e[30],selectedService:e[1]}}),{c(){me(t.$$.fragment),n=S(),r=I(o)},m(e,o){he(t,e,o),b(e,n,o),b(e,r,o),s=!0},p(e,n){const c={};1073741824&n[0]&&(c.details=e[30]),2&n[0]&&(c.selectedService=e[1]),t.$set(c),(!s||1073741824&n[0])&&o!==(o=e[30].label+"")&&A(r,o)},i(e){s||(de(t.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),e&&y(r)}}}function Qo(e){let t,n,r,s;const o=[Jo,Zo],c=[];function i(e,t){return e[5]?1:0}return n=i(e),r=c[n]=o[n](e),{c(){t=k("div"),r.c(),q(t,"class","slot"),q(t,"slot","selection")},m(e,r){b(e,t,r),c[n].m(t,null),s=!0},p(e,s){let a=n;n=i(e),n===a?c[n].p(e,s):(le(),pe(c[a],1,1,(()=>{c[a]=null})),ue(),r=c[n],r?r.p(e,s):(r=c[n]=o[n](e),r.c()),de(r,1),r.m(t,null))},i(e){s||(de(r),s=!0)},o(e){pe(r),s=!1},d(e){e&&y(t),c[n].d()}}}function Xo(t){let n;return{c(){n=k("div"),n.textContent="🮦",W(n,"font-size","10px"),q(n,"slot","chevron-icon")},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function Yo(e){let t,n,r,o,c,i,a;return t=new Be({props:{$$slots:{default:[Vo]},$$scope:{ctx:e}}}),o=new ks({props:{clearable:!1,dir:"ltr",class:"svelte_select",value:e[3].frontend,showChevron:!0,items:[...e[6].map(fc)],$$slots:{"chevron-icon":[Xo],selection:[Qo,({selection:e})=>({30:e}),({selection:e})=>[e?1073741824:0]],item:[Go,({item:e})=>({31:e}),({item:e})=>[0,e?1:0]]},$$scope:{ctx:e}}}),o.$on("change",e[18]),o.$on("pointerup",e[19]),o.$on("focus",e[20]),o.$on("blur",e[21]),{c(){me(t.$$.fragment),n=S(),r=k("div"),me(o.$$.fragment),q(r,"dir","ltr")},m(s,l){he(t,s,l),b(s,n,l),b(s,r,l),he(o,r,null),c=!0,i||(a=[O(r,"click",e[22]),O(r,"keydown",null)],i=!0)},p(e,n){const r={};256&n[0]|2&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r);const s={};8&n[0]&&(s.value=e[3].frontend),64&n[0]&&(s.items=[...e[6].map(fc)]),1073741858&n[0]|3&n[1]&&(s.$$scope={dirty:n,ctx:e}),o.$set(s)},i(e){c||(de(t.$$.fragment,e),de(o.$$.fragment,e),c=!0)},o(e){pe(t.$$.fragment,e),pe(o.$$.fragment,e),c=!1},d(e){ge(t,e),e&&y(n),e&&y(r),ge(o),i=!1,s(a)}}}function Ko(t){let n,r=(t[9].i18n.getMessage("unsupportedIframesHandling")||"Unsupported embeds handling")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function ec(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[Ko]},$$scope:{ctx:e}}}),r=new Te({props:{value:e[3].unsupportedUrls,onChange:e[23],values:[{value:"bypass",name:e[9].i18n.getMessage("bypass")||"Bypass"},{value:"block",name:e[9].i18n.getMessage("block")||"Block"}]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};2&n[1]&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};8&n[0]&&(o.value=e[3].unsupportedUrls),9&n[0]&&(o.onChange=e[23]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function tc(t){let n,r=(t[9].i18n.getMessage("redirectOnlyInIncognito")||"Redirect Only in Incognito")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function nc(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[tc]},$$scope:{ctx:e}}}),r=new Ft({props:{checked:e[3].redirectOnlyInIncognito,onChange:e[24]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};2&n[1]&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};8&n[0]&&(o.checked=e[3].redirectOnlyInIncognito),9&n[0]&&(o.onChange=e[24]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function rc(e){let t,n,r,s;return t=new xe({props:{$$slots:{default:[oc]},$$scope:{ctx:e}}}),r=new xe({props:{$$slots:{default:[ic]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};9&n[0]|2&n[1]&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};2&n[1]&&(o.$$scope={dirty:n,ctx:e}),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function sc(t){let n,r=(t[9].i18n.getMessage("redirectGoogle")||"Redirect Google")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function oc(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[sc]},$$scope:{ctx:e}}}),r=new Ft({props:{checked:e[3].redirectGoogle,onChange:e[25]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};2&n[1]&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};8&n[0]&&(o.checked=e[3].redirectGoogle),9&n[0]&&(o.onChange=e[25]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function cc(t){let n,r,s=(t[9].i18n.getMessage("searchHint")||'Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click\n <a\n href="https://libredirect.github.io/docs.html#search_engine_chromium"\n target="_blank"\n rel="noopener noreferrer"\n >here\n </a>.')+"";return{c(){n=new N(!1),r=T(),n.a=r},m(e,t){n.m(s,e,t),b(e,r,t)},p:e,d(e){e&&y(r),e&&n.d()}}}function ic(e){let t,n;return t=new Be({props:{$$slots:{default:[cc]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},p(e,n){const r={};2&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function ac(e){let t,n;return t=new xe({props:{$$slots:{default:[uc]},$$scope:{ctx:e}}}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},p(e,n){const r={};9&n[0]|2&n[1]&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function lc(t){let n,r=(t[9].i18n.getMessage("disableTwimg")||"Disable twimg.com")+"";return{c(){n=I(r)},m(e,t){b(e,n,t)},p:e,d(e){e&&y(n)}}}function uc(e){let t,n,r,s;return t=new Be({props:{$$slots:{default:[lc]},$$scope:{ctx:e}}}),r=new Ft({props:{checked:e[3].disableTwimg,onChange:e[26]}}),{c(){me(t.$$.fragment),n=S(),me(r.$$.fragment)},m(e,o){he(t,e,o),b(e,n,o),he(r,e,o),s=!0},p(e,n){const s={};2&n[1]&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const o={};8&n[0]&&(o.checked=e[3].disableTwimg),9&n[0]&&(o.onChange=e[26]),r.$set(o)},i(e){s||(de(t.$$.fragment,e),de(r.$$.fragment,e),s=!0)},o(e){pe(t.$$.fragment,e),pe(r.$$.fragment,e),s=!1},d(e){ge(t,e),e&&y(n),ge(r,e)}}}function dc(e){let t,n,r,s,o,c,i,a,l,u,d,p,f,$,m,h,g,v,x,C,I,T,O,L,_,P,E;n=new xe({props:{$$slots:{default:[zo]},$$scope:{ctx:e}}}),c=new xe({props:{$$slots:{default:[Ho]},$$scope:{ctx:e}}}),a=new xe({props:{$$slots:{default:[Uo]},$$scope:{ctx:e}}}),d=new xe({props:{$$slots:{default:[Yo]},$$scope:{ctx:e}}}),f=new zs({props:{selectedService:e[1]}}),m=new xe({props:{$$slots:{default:[ec]},$$scope:{ctx:e}}}),v=new xe({props:{$$slots:{default:[nc]},$$scope:{ctx:e}}});let M="search"==e[1]&&rc(e),A="twitter"==e[1]&&ac(e);return O=new So({props:{selectedService:e[1],selectedFrontend:e[2].frontends[e[3].frontend].desktopApp&&"main_frame"!=e[3].redirectType?e[3].embedFrontend:e[3].frontend}}),_=new xe({}),{c(){t=k("div"),me(n.$$.fragment),r=S(),s=k("hr"),o=S(),me(c.$$.fragment),i=S(),me(a.$$.fragment),l=S(),u=k("div"),me(d.$$.fragment),p=S(),me(f.$$.fragment),$=S(),me(m.$$.fragment),h=S(),g=k("div"),me(v.$$.fragment),C=S(),M&&M.c(),I=S(),A&&A.c(),T=S(),me(O.$$.fragment),L=S(),me(_.$$.fragment),q(g,"style",x=e[0].redirectOnlyInIncognito&&"pointer-events: none;opacity: 0.4;user-select: none;"),q(u,"style",P=!e[3].enabled&&"pointer-events: none;opacity: 0.4;user-select: none;")},m(e,y){b(e,t,y),he(n,t,null),w(t,r),w(t,s),w(t,o),he(c,t,null),w(t,i),he(a,t,null),w(t,l),w(t,u),he(d,u,null),w(u,p),he(f,u,null),w(u,$),he(m,u,null),w(u,h),w(u,g),he(v,g,null),w(u,C),M&&M.m(u,null),w(u,I),A&&A.m(u,null),w(u,T),he(O,u,null),w(u,L),he(_,u,null),E=!0},p(e,t){const r={};151&t[0]|2&t[1]&&(r.$$scope={dirty:t,ctx:e}),n.$set(r);const s={};9&t[0]|2&t[1]&&(s.$$scope={dirty:t,ctx:e}),c.$set(s);const o={};3&t[0]|2&t[1]&&(o.$$scope={dirty:t,ctx:e}),a.$set(o);const i={};379&t[0]|2&t[1]&&(i.$$scope={dirty:t,ctx:e}),d.$set(i);const l={};2&t[0]&&(l.selectedService=e[1]),f.$set(l);const p={};9&t[0]|2&t[1]&&(p.$$scope={dirty:t,ctx:e}),m.$set(p);const $={};9&t[0]|2&t[1]&&($.$$scope={dirty:t,ctx:e}),v.$set($),(!E||1&t[0]&&x!==(x=e[0].redirectOnlyInIncognito&&"pointer-events: none;opacity: 0.4;user-select: none;"))&&q(g,"style",x),"search"==e[1]?M?(M.p(e,t),2&t[0]&&de(M,1)):(M=rc(e),M.c(),de(M,1),M.m(u,I)):M&&(le(),pe(M,1,1,(()=>{M=null})),ue()),"twitter"==e[1]?A?(A.p(e,t),2&t[0]&&de(A,1)):(A=ac(e),A.c(),de(A,1),A.m(u,T)):A&&(le(),pe(A,1,1,(()=>{A=null})),ue());const h={};2&t[0]&&(h.selectedService=e[1]),12&t[0]&&(h.selectedFrontend=e[2].frontends[e[3].frontend].desktopApp&&"main_frame"!=e[3].redirectType?e[3].embedFrontend:e[3].frontend),O.$set(h),(!E||8&t[0]&&P!==(P=!e[3].enabled&&"pointer-events: none;opacity: 0.4;user-select: none;"))&&q(u,"style",P)},i(e){E||(de(n.$$.fragment,e),de(c.$$.fragment,e),de(a.$$.fragment,e),de(d.$$.fragment,e),de(f.$$.fragment,e),de(m.$$.fragment,e),de(v.$$.fragment,e),de(M),de(A),de(O.$$.fragment,e),de(_.$$.fragment,e),E=!0)},o(e){pe(n.$$.fragment,e),pe(c.$$.fragment,e),pe(a.$$.fragment,e),pe(d.$$.fragment,e),pe(f.$$.fragment,e),pe(m.$$.fragment,e),pe(v.$$.fragment,e),pe(M),pe(A),pe(O.$$.fragment,e),pe(_.$$.fragment,e),E=!1},d(e){e&&y(t),ge(n),ge(c),ge(a),ge(d),ge(f),ge(m),ge(v),M&&M.d(),A&&A.d(),ge(O),ge(_)}}}const pc=([e,t])=>({value:e,label:t.name}),fc=([e,t])=>({value:e,label:t.name});function $c(e,t,n){let r,s,o,c,i,a;u(e,Xt,(e=>n(27,a=e)));const l=window.browser||window.chrome;let d,p;const f=He.subscribe((e=>n(0,d=e))),$=je.subscribe((e=>n(10,p=e)));U((()=>{f(),$()}));let m=a.hash.startsWith("#services:")?a.hash.split(":")[1]:"youtube",h=!1,g=!1;return e.$$.update=()=>{1026&e.$$.dirty[0]&&n(2,r=p.services[m]),3&e.$$.dirty[0]&&n(3,s=d[m]),12&e.$$.dirty[0]&&n(8,o=r.frontends[s.frontend].url),1024&e.$$.dirty[0]&&n(7,c=Object.entries(p.services)),4&e.$$.dirty[0]&&n(6,i=Object.entries(r.frontends))},[d,m,r,s,h,g,i,c,o,l,p,e=>{n(1,m=e.detail.value),window.location.hash=`services:${e.detail.value}`,n(4,h=!1)},()=>n(4,h=!1),()=>n(4,h=!0),()=>n(4,h=!1),()=>n(4,h=!0),e=>{n(3,s.enabled=e.target.checked,s),He.set(d)},e=>{if(e.target.checked&&!d.popupServices.includes(m))d.popupServices.push(m);else if(d.popupServices.includes(m)){const e=d.popupServices.indexOf(m);-1!==e&&d.popupServices.splice(e,1)}He.set(d)},e=>{n(3,s.frontend=e.detail.value,s),He.set(d),n(5,g=!1)},()=>n(4,h=!1),()=>n(5,g=!0),()=>n(5,g=!1),()=>n(5,g=!0),e=>{n(3,s.unsupportedUrls=e.target.options[e.target.options.selectedIndex].value,s),He.set(d)},e=>{n(3,s.redirectOnlyInIncognito=e.target.checked,s),He.set(d)},e=>{n(3,s.redirectGoogle=e.target.checked,s),He.set(d)},e=>{n(3,s.disableTwimg=e.target.checked,s),He.set(d)}]}class mc extends we{constructor(e){super(),ve(this,e,$c,dc,c,{},null,[-1,-1])}}function hc(t){let n;return{c(){n=k("p"),n.textContent="Loading..."},m(e,t){b(e,n,t)},p:e,i:e,o:e,d(e){e&&y(n)}}}function gc(e){let t,n,r,s,o,c,i;n=new un({});const a=[wc,vc],l=[];function u(e,t){return 8&t&&(s=null),e[3].hash&&"#general"!=e[3].hash?(null==s&&(s=!!e[3].hash.startsWith("#services")),s?1:-1):0}return~(o=u(e,-1))&&(c=l[o]=a[o](e)),{c(){var s;t=k("div"),me(n.$$.fragment),r=S(),c&&c.c(),q(t,"class",(null==(s=e[4])?"":s)+" svelte-1xshtt5"),q(t,"dir",e[4]),q(t,"style",e[2])},m(e,s){b(e,t,s),he(n,t,null),w(t,r),~o&&l[o].m(t,null),i=!0},p(e,n){let r=o;o=u(e,n),o!==r&&(c&&(le(),pe(l[r],1,1,(()=>{l[r]=null})),ue()),~o?(c=l[o],c||(c=l[o]=a[o](e),c.c()),de(c,1),c.m(t,null)):c=null),(!i||4&n)&&q(t,"style",e[2])},i(e){i||(de(n.$$.fragment,e),de(c),i=!0)},o(e){pe(n.$$.fragment,e),pe(c),i=!1},d(e){e&&y(t),ge(n),~o&&l[o].d()}}}function vc(e){let t,n;return t=new mc({}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function wc(e){let t,n;return t=new Qt({}),{c(){me(t.$$.fragment)},m(e,r){he(t,e,r),n=!0},i(e){n||(de(t.$$.fragment,e),n=!0)},o(e){pe(t.$$.fragment,e),n=!1},d(e){ge(t,e)}}}function bc(e){let t,n,r,s;const o=[gc,hc],c=[];function i(e,t){return e[0]&&e[1]?0:1}return t=i(e),n=c[t]=o[t](e),{c(){n.c(),r=T()},m(e,n){c[t].m(e,n),b(e,r,n),s=!0},p(e,[s]){let a=t;t=i(e),t===a?c[t].p(e,s):(le(),pe(c[a],1,1,(()=>{c[a]=null})),ue(),n=c[t],n?n.p(e,s):(n=c[t]=o[t](e),n.c()),de(n,1),n.m(r.parentNode,r))},i(e){s||(de(n),s=!0)},o(e){pe(n),s=!1},d(e){c[t].d(e),e&&y(r)}}}function yc(e,t,n){let r;u(e,Xt,(e=>n(3,r=e)));const s=window.browser||window.chrome;let o;const c=He.subscribe((e=>{e&&(n(0,o=e),s.storage.local.set({options:e}))}));let i;const a=je.subscribe((e=>n(1,i=e)));let l;U((()=>{c(),a()})),j((async()=>{let e=await ht.getOptions();e||(await Tt.initDefaults(),e=await ht.getOptions()),He.set(e),je.set(await ht.getConfig())}));const d=["ar","iw","ku","fa","ur"].includes(s.i18n.getUILanguage())?"rtl":"ltr";return document.body.dir=d,e.$$.update=()=>{1&e.$$.dirty&&o&&n(2,l=ht.style(o,window))},[o,i,l,r,d]}const xc=new class extends we{constructor(e){super(),ve(this,e,yc,bc,c,{})}}({target:document.body});return xc}(); +//# sourceMappingURL=bundle.js.map diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.js.map b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/build/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundle.js","sources":["../../../../node_modules/svelte/internal/index.mjs","../../components/Row.svelte","../../components/Select.svelte","../../icons/AddIcon.svelte","../../icons/CloseIcon.svelte","../../components/Input.svelte","../../components/Label.svelte","../../../../node_modules/svelte/store/index.mjs","../../options_src/stores.js","../../options_src/General/Exceptions.svelte","../../components/Button.svelte","../../icons/ExportIcon.svelte","../../icons/ImportIcon.svelte","../../icons/ResetIcon.svelte","../../../assets/javascripts/utils.js","../../../assets/javascripts/services.js","../../options_src/General/SettingsButtons.svelte","../../components/Checkbox.svelte","../../options_src/General/General.svelte","../../options_src/url.js","../../icons/GeneralIcon.svelte","../../icons/ServicesIcon.svelte","../../icons/AboutIcon.svelte","../../options_src/Sidebar.svelte","../../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../../../../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../../../../node_modules/svelte-floating-ui/index.js","../../../../node_modules/svelte-select/filter.js","../../../../node_modules/svelte-select/get-items.js","../../../../node_modules/svelte-select/ChevronIcon.svelte","../../../../node_modules/svelte-select/ClearIcon.svelte","../../../../node_modules/svelte-select/LoadingIcon.svelte","../../../../node_modules/svelte-select/Select.svelte","../../options_src/Services/FrontendIcon.svelte","../../options_src/Services/RedirectType.svelte","../../icons/PingIcon.svelte","../../icons/AutoPickIcon.svelte","../../options_src/Services/Instances.svelte","../../options_src/Services/ServiceIcon.svelte","../../options_src/Services/Services.svelte","../../options_src/App.svelte","../../options_src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\nfunction split_css_unit(value) {\n const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n constructor(options) {\n this.options = options;\n this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n }\n observe(element, listener) {\n this._listeners.set(element, listener);\n this._getObserver().observe(element, this.options);\n return () => {\n this._listeners.delete(element);\n this._observer.unobserve(element); // this line can probably be removed\n };\n }\n _getObserver() {\n var _a;\n return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n var _a;\n for (const entry of entries) {\n ResizeObserverSingleton.entries.set(entry.target, entry);\n (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n }\n }));\n }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n let children = target.childNodes;\n // If target is <head>, there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n return style.sheet;\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction comment(content) {\n return document.createComment(content);\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_immediate_propagation(fn) {\n return function (event) {\n event.stopImmediatePropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data_map(node, data_map) {\n Object.keys(data_map).forEach((key) => {\n set_custom_element_data(node, key, data_map[key]);\n });\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction set_dynamic_element_data(tag) {\n return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction init_binding_group(group) {\n let _inputs;\n return {\n /* push */ p(...inputs) {\n _inputs = inputs;\n _inputs.forEach(input => group.push(input));\n },\n /* remove */ r() {\n _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n }\n };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n let _group = get_binding_group(group);\n let _inputs;\n function get_binding_group(group) {\n for (let i = 0; i < indexes.length; i++) {\n group = group[indexes[i]] = group[indexes[i]] || [];\n }\n return group;\n }\n function push() {\n _inputs.forEach(input => _group.push(input));\n }\n function remove() {\n _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n }\n return {\n /* update */ u(new_indexes) {\n indexes = new_indexes;\n const new_group = get_binding_group(group);\n if (new_group !== _group) {\n remove();\n _group = new_group;\n push();\n }\n },\n /* push */ p(...inputs) {\n _inputs = inputs;\n push();\n },\n /* remove */ r: remove\n };\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n node.data = '' + data;\n return undefined;\n }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable(text, data);\n }\n else {\n set_data(text, data);\n }\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value == null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value, mounting) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n if (!mounting || value !== undefined) {\n select.selectedIndex = -1; // no option should be selected\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked');\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n // see https://github.com/sveltejs/svelte/issues/4233\n fn();\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n const result = [];\n let started = 0;\n for (const node of head.childNodes) {\n if (node.nodeType === 8 /* comment node */) {\n const comment = node.textContent.trim();\n if (comment === `HEAD_${nodeId}_END`) {\n started -= 1;\n result.push(node);\n }\n else if (comment === `HEAD_${nodeId}_START`) {\n started += 1;\n result.push(node);\n }\n }\n else if (started > 0) {\n result.push(node);\n }\n }\n return result;\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n /** #7364 target for <template> may be provided as #document-fragment(11) */\n else\n this.e = element((target.nodeType === 11 ? 'TEMPLATE' : target.nodeName));\n this.t = target.tagName !== 'TEMPLATE' ? target : target.content;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes, is_svg = false) {\n super(is_svg);\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\nfunction construct_svelte_component(component, props) {\n return new component(props);\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n managed_styles.set(doc, info);\n return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n if (!rules[name]) {\n rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n managed_styles.forEach(info => {\n const { ownerNode } = info.stylesheet;\n // there is no ownerNode if it runs on jsdom.\n if (ownerNode)\n detach(ownerNode);\n });\n managed_styles.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs#run-time-svelte-beforeupdate\n */\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs#run-time-svelte-onmount\n */\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n */\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs#run-time-svelte-ondestroy\n */\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * https://svelte.dev/docs#run-time-svelte-createeventdispatcher\n */\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail, { cancelable = false } = {}) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail, { cancelable });\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n return !event.defaultPrevented;\n }\n return true;\n };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-setcontext\n */\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-getcontext\n */\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs#run-time-svelte-getallcontexts\n */\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-hascontext\n */\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nlet render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n// for afterUpdates called during the initial onMount, which are called in\n// reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n// dirty_components array and will cause a reentrant call to flush(). Because\n// the flush index is kept outside the function, the reentrant call will pick\n// up where the earlier call left off and go through all dirty components. The\n// current_component value is saved and restored so that the reentrant call will\n// not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n// callback called a second time; the seen_callbacks set, outside the flush()\n// function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n // Do not reenter flush while dirty components are updated, as this can\n // result in an infinite loop. Instead, let the inner flush handle it.\n // Reentrancy is ok afterwards for bindings etc.\n if (flushidx !== 0) {\n return;\n }\n const saved_component = current_component;\n do {\n // first, call beforeUpdate functions\n // and update components\n try {\n while (flushidx < dirty_components.length) {\n const component = dirty_components[flushidx];\n flushidx++;\n set_current_component(component);\n update(component.$$);\n }\n }\n catch (e) {\n // reset dirty state to not end up in a deadlocked state and then rethrow\n dirty_components.length = 0;\n flushidx = 0;\n throw e;\n }\n set_current_component(null);\n dirty_components.length = 0;\n flushidx = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n seen_callbacks.clear();\n set_current_component(saved_component);\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n */\nfunction flush_render_callbacks(fns) {\n const filtered = [];\n const targets = [];\n render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));\n targets.forEach((c) => c());\n render_callbacks = filtered;\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n else if (callback) {\n callback();\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n const options = { direction: 'in' };\n let config = fn(node, params, options);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config(options);\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n const options = { direction: 'out' };\n let config = fn(node, params, options);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n const options = { direction: 'both' };\n let config = fn(node, params, options);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n const updates = [];\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n // defer updates until all the DOM shuffling is done\n updates.push(() => block.p(child_ctx, dirty));\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n run_all(updates);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\nconst _boolean_attributes = [\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n];\n/**\n * List of HTML boolean attributes (e.g. `<input disabled>`).\n * Source: https://html.spec.whatwg.org/multipage/indices.html\n */\nconst boolean_attributes = new Set([..._boolean_attributes]);\n\n/** regex of all html void element names */\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n const attributes = Object.assign({}, ...args);\n if (attrs_to_add) {\n const classes_to_add = attrs_to_add.classes;\n const styles_to_add = attrs_to_add.styles;\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n if (styles_to_add) {\n if (attributes.style == null) {\n attributes.style = style_object_to_string(styles_to_add);\n }\n else {\n attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n }\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n const style_object = {};\n for (const individual_style of style_attribute.split(';')) {\n const colon_index = individual_style.indexOf(':');\n const name = individual_style.slice(0, colon_index).trim();\n const value = individual_style.slice(colon_index + 1).trim();\n if (!name)\n continue;\n style_object[name] = value;\n }\n for (const name in style_directive) {\n const value = style_directive[name];\n if (value) {\n style_object[name] = value;\n }\n else {\n delete style_object[name];\n }\n }\n return style_object;\n}\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n/**\n * Note: this method is performance sensitive and has been optimized\n * https://github.com/sveltejs/svelte/pull/5701\n */\nfunction escape(value, is_attr = false) {\n const str = String(value);\n const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;\n pattern.lastIndex = 0;\n let escaped = '';\n let last = 0;\n while (pattern.test(str)) {\n const i = pattern.lastIndex - 1;\n const ch = str[i];\n escaped += str.substring(last, i) + (ch === '&' ? '&amp;' : (ch === '\"' ? '&quot;' : '&lt;'));\n last = i + 1;\n }\n return escaped + str.substring(last);\n}\nfunction escape_attribute_value(value) {\n // keep booleans, null, and undefined for the sake of `spread`\n const should_escape = typeof value === 'string' || (value && typeof value === 'object');\n return should_escape ? escape(value, true) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules. Otherwise you may need to fix a <${name}>.`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n const assignment = (boolean && value === true) ? '' : `=\"${escape(value, true)}\"`;\n return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n return Object.keys(style_object)\n .filter(key => style_object[key])\n .map(key => `${key}: ${escape_attribute_value(style_object[key])};`)\n .join(' ');\n}\nfunction add_styles(style_object) {\n const styles = style_object_to_string(style_object);\n return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n // if the component was destroyed immediately\n // it will update the `$$.on_destroy` reference to `null`.\n // the destructured on_destroy may still reference to the old array\n if (component.$$.on_destroy) {\n component.$$.on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n flush_render_callbacks($$.after_update);\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: [],\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n if (has_stop_immediate_propagation)\n modifiers.push('stopImmediatePropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_contenteditable_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_maybe_contenteditable_dev(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable_dev(text, data);\n }\n else {\n set_data_dev(text, data);\n }\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nfunction validate_dynamic_element(tag) {\n const is_string = typeof tag === 'string';\n if (tag && !is_string) {\n throw new Error('<svelte:element> expects \"this\" attribute to be a string.');\n }\n}\nfunction validate_void_dynamic_element(tag) {\n if (tag && is_void(tag)) {\n console.warn(`<svelte:element this=\"${tag}\"> is self-closing and cannot have content.`);\n }\n}\nfunction construct_svelte_component_dev(component, props) {\n const error_message = 'this={...} of <svelte:component> should specify a Svelte component.';\n try {\n const instance = new component(props);\n if (!instance.$$ || !instance.$set || !instance.$on || !instance.$destroy) {\n throw new Error(error_message);\n }\n return instance;\n }\n catch (err) {\n const { message } = err;\n if (typeof message === 'string' && message.indexOf('is not a constructor') !== -1) {\n throw new Error(error_message);\n }\n else {\n throw err;\n }\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, ResizeObserverSingleton, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_iframe_resize_listener, add_location, add_render_callback, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_comment, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, comment, component_subscribe, compute_rest_props, compute_slots, construct_svelte_component, construct_svelte_component_dev, contenteditable_truthy_values, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, flush_render_callbacks, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, head_selector, identity, init, init_binding_group, init_binding_group_dynamic, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, resize_observer_border_box, resize_observer_content_box, resize_observer_device_pixel_content_box, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_custom_element_data_map, set_data, set_data_contenteditable, set_data_contenteditable_dev, set_data_dev, set_data_maybe_contenteditable, set_data_maybe_contenteditable_dev, set_dynamic_element_data, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, split_css_unit, spread, src_url_equal, start_hydrating, stop_immediate_propagation, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","<div {...$$restProps} on:click>\n <slot></slot>\n</div>\n\n<style>\n div {\n justify-content: space-between;\n display: flex;\n align-items: center;\n margin: 20px 0;\n }\n</style>\n","<script>\n export let values\n export let value\n export let onChange\n export let ariaLabel\n</script>\n\n<select bind:value on:change={onChange} aria-label={ariaLabel} on:change on:contextmenu on:input>\n {#each values as option}\n <option value={option.value}>{option.name}</option>\n {/each}\n</select>\n\n<style>\n select {\n font-weight: bold;\n box-sizing: border-box;\n border-style: solid;\n border-color: #767676;\n color: var(--text);\n font-size: 16px;\n padding: 8px;\n background-color: var(--bg-secondary);\n border: none;\n margin: 0;\n max-width: 500px;\n border-radius: 3px;\n }\n\n select:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n</style>\n","<script>\n export let style = \"\"\n</script>\n\n<svg {style} xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 0 24 24\" width=\"20px\" fill=\"currentColor\">\n <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n</svg>\n","<script>\n export let style = \"\"\n</script>\n\n<svg {style} xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 -960 960 960\" width=\"20px\" fill=\"currentColor\"\n ><path d=\"m291-240-51-51 189-189-189-189 51-51 189 189 189-189 51 51-189 189 189 189-51 51-189-189-189 189Z\" /></svg\n>\n","<script>\n export let value\n</script>\n\n<input\n {...$$restProps}\n bind:value\n on:blur\n on:change\n on:click\n on:contextmenu\n on:focus\n on:keydown\n on:keypress\n on:keyup\n on:mouseover\n on:mouseenter\n on:mouseleave\n on:paste\n on:input\n/>\n\n<style>\n input {\n font-weight: bold;\n box-sizing: border-box;\n color: var(--text);\n font-size: 16px;\n padding: 8px;\n background-color: var(--bg-secondary);\n border: none;\n margin: 0;\n width: 400px;\n border-radius: 3px;\n outline-color: var(--active);\n }\n\n input:focus {\n outline-color: var(--active);\n }\n @media (max-width: 715px) {\n input {\n width: 200px;\n }\n }\n</style>\n","<span {...$$restProps}>\n <slot></slot>\n</span>\n\n<style>\n span {\n font-size: 18px;\n }\n\n span :global(a) {\n color: var(--text);\n text-decoration: none;\n }\n\n span :global(a:hover) {\n text-decoration: underline;\n }\n</style>\n","import { noop, safe_not_equal, subscribe, run_all, is_function } from '../internal/index.mjs';\nexport { get_store_value as get } from '../internal/index.mjs';\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n * @param value initial value\n * @param {StartStopNotifier} [start]\n */\nfunction readable(value, start) {\n return {\n subscribe: writable(value, start).subscribe\n };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n * @param {*=}value initial value\n * @param {StartStopNotifier=} start\n */\nfunction writable(value, start = noop) {\n let stop;\n const subscribers = new Set();\n function set(new_value) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) { // store is ready\n const run_queue = !subscriber_queue.length;\n for (const subscriber of subscribers) {\n subscriber[1]();\n subscriber_queue.push(subscriber, value);\n }\n if (run_queue) {\n for (let i = 0; i < subscriber_queue.length; i += 2) {\n subscriber_queue[i][0](subscriber_queue[i + 1]);\n }\n subscriber_queue.length = 0;\n }\n }\n }\n }\n function update(fn) {\n set(fn(value));\n }\n function subscribe(run, invalidate = noop) {\n const subscriber = [run, invalidate];\n subscribers.add(subscriber);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(subscriber);\n if (subscribers.size === 0 && stop) {\n stop();\n stop = null;\n }\n };\n }\n return { set, update, subscribe };\n}\nfunction derived(stores, fn, initial_value) {\n const single = !Array.isArray(stores);\n const stores_array = single\n ? [stores]\n : stores;\n const auto = fn.length < 2;\n return readable(initial_value, (set) => {\n let started = false;\n const values = [];\n let pending = 0;\n let cleanup = noop;\n const sync = () => {\n if (pending) {\n return;\n }\n cleanup();\n const result = fn(single ? values[0] : values, set);\n if (auto) {\n set(result);\n }\n else {\n cleanup = is_function(result) ? result : noop;\n }\n };\n const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => {\n values[i] = value;\n pending &= ~(1 << i);\n if (started) {\n sync();\n }\n }, () => {\n pending |= (1 << i);\n }));\n started = true;\n sync();\n return function stop() {\n run_all(unsubscribers);\n cleanup();\n // We need to set this to false because callbacks can still happen despite having unsubscribed:\n // Callbacks might already be placed in the queue which doesn't know it should no longer\n // invoke this derived store.\n started = false;\n };\n });\n}\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * @param store - store to make readonly\n */\nfunction readonly(store) {\n return {\n subscribe: store.subscribe.bind(store)\n };\n}\n\nexport { derived, readable, readonly, writable };\n","import { writable } from \"svelte/store\"\n\nexport const options = writable(null)\nexport const config = writable(null)\n","<script>\n const browser = window.browser || window.chrome\n\n import Row from \"../../components/Row.svelte\"\n import Select from \"../../components/Select.svelte\"\n import AddIcon from \"../../icons/AddIcon.svelte\"\n import CloseIcon from \"../../icons/CloseIcon.svelte\"\n import Input from \"../../components/Input.svelte\"\n import Label from \"../../components/Label.svelte\"\n import { options, config } from \"../stores\"\n import { onDestroy } from \"svelte\"\n\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n let inputType = \"url\"\n let inputValue = \"\"\n\n $: inputPlaceholder = inputType == \"url\" ? \"https://www.google.com\" : \"https?://(www.|)youtube.com/\"\n\n function removeException(exception) {\n let index\n index = _options.exceptions.url.indexOf(exception)\n if (index > -1) {\n _options.exceptions.url.splice(index, 1)\n } else {\n index = _options.exceptions.regex.indexOf(exception)\n if (index > -1) _options.exceptions.regex.splice(index, 1)\n }\n options.set(_options)\n }\n\n function addException() {\n let valid = false\n if (inputType == \"url\" && /^(ftp|http|https):\\/\\/[^ \"]+$/.test(inputValue)) {\n valid = true\n if (!_options.exceptions.url.includes(inputValue)) {\n _options.exceptions.url.push(inputValue)\n }\n } else if (inputType == \"regex\") {\n valid = true\n if (!_options.exceptions.regex.includes(inputValue)) {\n _options.exceptions.regex.push(inputValue)\n }\n }\n if (valid) {\n options.set(_options)\n inputValue = \"\"\n }\n }\n</script>\n\n<Row>\n <Label>{browser.i18n.getMessage(\"excludeFromRedirecting\") || \"Excluded from redirecting\"}</Label>\n</Row>\n<div dir=\"ltr\">\n <Row>\n <div>\n <Input\n placeholder={inputPlaceholder}\n aria-label=\"Add url exception input\"\n bind:value={inputValue}\n on:keydown={e => {\n if (e.key === \"Enter\") addException()\n }}\n />\n <Select\n bind:value={inputType}\n values={[\n { value: \"url\", name: \"URL\" },\n { value: \"regex\", name: \"Regex\" },\n ]}\n />\n </div>\n <button class=\"add\" on:click={addException} aria-label=\"Add the url exception\">\n <AddIcon />\n </button>\n </Row>\n <hr />\n <div class=\"checklist\">\n {#each [..._options.exceptions.url, ..._options.exceptions.regex] as exception}\n <Row>\n {exception}\n <button class=\"add\" on:click={() => removeException(exception)}>\n <CloseIcon />\n </button>\n </Row>\n <hr />\n {/each}\n </div>\n</div>\n\n<style>\n .add {\n background-color: transparent;\n border: none;\n color: var(--text);\n padding: 0;\n margin: 0;\n text-decoration: none;\n display: inline-block;\n cursor: pointer;\n }\n</style>\n","<button {...$$restProps} on:click {...$$props}>\n <slot></slot>\n</button>\n\n<style>\n button {\n color: var(--text);\n border: none;\n text-decoration: none;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n transition-duration: 0.1s;\n display: inline-flex;\n align-items: center;\n margin: 7.5px 0;\n background-color: var(--bg-secondary);\n border-radius: 5px;\n padding: 10px;\n }\n\n button:hover:enabled {\n color: var(--active);\n }\n\n button:active:enabled {\n transform: translateY(1px);\n }\n\n button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n \n</style>\n","<svg\n {...$$restProps}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n>\n <path\n d=\"M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"\n />\n</svg>\n","<svg\n {...$$restProps}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n>\n <path\n d=\"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"\n />\n</svg>\n","<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n enable-background=\"new 0 0 24 24\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n {...$$restProps}\n>\n <path\n d=\"M12,5V2L8,6l4,4V7c3.31,0,6,2.69,6,6c0,2.97-2.17,5.43-5,5.91v2.02c3.95-0.49,7-3.85,7-7.93C20,8.58,16.42,5,12,5z\"\n />\n <path\n d=\"M6,13c0-1.65,0.67-3.15,1.76-4.24L6.34,7.34C4.9,8.79,4,10.79,4,13c0,4.08,3.05,7.44,7,7.93v-2.02 C8.17,18.43,6,15.97,6,13z\"\n />\n</svg>\n","window.browser = window.browser || window.chrome\n\n/**\n * @param {Array.<T>} instances\n * @returns {T}\n */\nfunction getRandomInstance(instances) {\n return instances[~~(instances.length * Math.random())]\n}\n\n/**\n * @param {string} currentInstanceUrl\n * @param {Array.<T>} instances\n * @returns {T}\n */\nfunction getNextInstance(currentInstanceUrl, instances) {\n const currentInstanceIndex = instances.indexOf(currentInstanceUrl)\n if (currentInstanceIndex === -1) return getRandomInstance(instances)\n const nextInstanceIndex = (currentInstanceIndex + 1) % instances.length\n return instances[nextInstanceIndex]\n}\n\n/**\n * @param {URL} url\n */\nfunction protocolHost(url) {\n const pathname = url.pathname.replace(/\\/$/, \"\")\n\n // workaround\n if (pathname == \"/TekstoLibre\" && url.host.endsWith(\"github.io\"))\n return `${url.protocol}//${url.host}${pathname.slice(0, -1)}`\n\n if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}${pathname}`\n\n return `${url.protocol}//${url.host}${pathname}`\n}\n\n/**\n * @typedef FrontendInfo\n * @prop {boolean} instanceList\n * @prop {string} name\n * @prop {string} url\n */\n\n/**\n * @typedef {Object} Service\n * @prop {Object.<string, FrontendInfo>} frontends\n * @prop {Object} options\n */\n\n/**\n * @typedef {Object} Config\n * @prop {Object.<string, Service>} services\n */\n\n/**\n * @returns {Promise<Config>}\n */\nfunction getConfig() {\n return new Promise(resolve => {\n fetch(\"/config.json\")\n .then(response => response.text())\n .then(json => {\n resolve(JSON.parse(json))\n return\n })\n })\n}\n\n/**\n * @typedef {Object} Option\n * @prop {string} frontend\n */\n\n/**\n * @returns {Promise<Object.<string, Option | string[]>>}\n */\nfunction getOptions() {\n return new Promise(resolve => browser.storage.local.get(\"options\", r => resolve(r.options)))\n}\n\nfunction getPingCache() {\n return new Promise(resolve => browser.storage.local.get(\"pingCache\", r => resolve(r.pingCache ?? {})))\n}\n\nfunction getBlacklist(options) {\n return new Promise(resolve => {\n let url\n if (options.fetchInstances == \"github\")\n url = \"https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json\"\n else if (options.fetchInstances == \"codeberg\")\n url = \"https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json\"\n else return resolve(\"disabled\")\n const http = new XMLHttpRequest()\n http.open(\"GET\", url, true)\n http.onreadystatechange = () => {\n if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) resolve(JSON.parse(http.responseText))\n }\n http.onerror = () => resolve()\n http.ontimeout = () => resolve()\n http.send(null)\n })\n}\n\nfunction getList(options) {\n return new Promise(resolve => {\n let url\n if (options.fetchInstances == \"github\")\n url = \"https://raw.githubusercontent.com/libredirect/instances/main/data.json\"\n else if (options.fetchInstances == \"codeberg\")\n url = \"https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json\"\n else return resolve(\"disabled\")\n const http = new XMLHttpRequest()\n http.open(\"GET\", url, true)\n http.onreadystatechange = () => {\n if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) return resolve(JSON.parse(http.responseText))\n }\n http.onerror = () => resolve()\n http.ontimeout = () => resolve()\n http.send(null)\n })\n}\n\n/**\n * @param {string} href\n */\nfunction pingOnce(href) {\n return new Promise(async resolve => {\n let started\n let http = new XMLHttpRequest()\n http.timeout = 5000\n http.ontimeout = () => resolve(5000)\n http.onerror = () => resolve()\n http.onreadystatechange = () => {\n if (http.readyState == 2) {\n if (http.status == 200) {\n let ended = new Date().getTime()\n http.abort()\n resolve(ended - started)\n } else {\n resolve(5000 + http.status)\n }\n }\n }\n http.open(\"GET\", `${href}?_=${new Date().getTime()}`, true)\n started = new Date().getTime()\n http.send(null)\n })\n}\n\n/**\n * @param {string} href\n */\nfunction ping(href) {\n return new Promise(async resolve => {\n let average = 0\n let time\n for (let i = 0; i < 3; i++) {\n time = await pingOnce(href)\n if (i == 0) continue\n if (time >= 5000) {\n resolve(time)\n return\n }\n average += time\n }\n average = parseInt(average / 3)\n resolve(average)\n })\n}\n\nfunction addressToLatLng(address) {\n const http = new XMLHttpRequest()\n http.open(\n \"GET\",\n `https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(address)}&format=json&limit=1`,\n false\n )\n http.send()\n if (http.status == 200) {\n const json = JSON.parse(http.responseText)[0]\n if (json) {\n return {\n coordinate: `${json.lat},${json.lon}`,\n boundingbox: `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}`,\n }\n }\n return {}\n }\n}\n\nfunction getQuery(url) {\n let query = \"\"\n if (url.searchParams.has(\"q\")) query = url.searchParams.get(\"q\")\n else if (url.searchParams.has(\"query\")) query = url.searchParams.has(\"query\")\n return query\n}\nfunction prefsEncoded(prefs) {\n return new URLSearchParams(prefs).toString()\n}\n\nfunction convertMapCentre(url) {\n let [lat, lon, zoom] = [null, null, null]\n const reg = url.pathname.match(/@(-?\\d[0-9.]*),(-?\\d[0-9.]*),(\\d{1,2})[.z]/)\n if (reg) {\n ;[, lon, lat, zoom] = reg\n } else if (url.searchParams.has(\"center\")) {\n // Set map centre if present\n ;[lat, lon] = url.searchParams.get(\"center\").split(\",\")\n zoom = url.searchParams.get(\"zoom\") ?? \"17\"\n }\n return { zoom, lon, lat }\n}\n\nexport function randomInstances(clearnet, n) {\n let instances = []\n if (n > clearnet.length) n = clearnet.length\n for (let i = 0; i < n; i++) {\n const randomNumber = Math.floor(Math.random() * clearnet.length)\n const randomInstance = clearnet[randomNumber]\n instances.push(randomInstance)\n }\n return instances\n}\n\nasync function autoPickInstance(clearnet, url) {\n if (url) {\n const i = clearnet.findIndex(instance => url.href.startsWith(instance))\n if (i >= 0) clearnet.splice(i, 1)\n }\n const random = randomInstances(clearnet, 5)\n const pings = await Promise.all([\n ...random.map(async instance => {\n return [instance, await ping(instance)]\n }),\n ])\n pings.sort((a, b) => a[1] - b[1])\n return pings[0][0]\n}\n\nexport function style(options, window) {\n const vars = cssVariables(options, window)\n return `--text: ${vars.text};\n --bg-main: ${vars.bgMain};\n --bg-secondary: ${vars.bgSecondary};\n --active: ${vars.active};\n --danger: ${vars.danger};\n --light-grey: ${vars.lightGrey};`\n}\n\nfunction cssVariables(options, window) {\n const dark = {\n text: \"#fff\",\n bgMain: \"#121212\",\n bgSecondary: \"#202020\",\n active: \"#fbc117\",\n danger: \"#f04141\",\n lightGrey: \"#c3c3c3\",\n }\n\n const light = {\n text: \"black\",\n bgMain: \"white\",\n bgSecondary: \"#e4e4e4\",\n active: \"#fb9817\",\n danger: \"#f04141\",\n lightGrey: \"#c3c3c3\",\n }\n if (options.theme == \"dark\") {\n return dark\n } else if (options.theme == \"light\") {\n return light\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n return dark\n } else {\n return light\n }\n}\n\nexport default {\n getRandomInstance,\n getNextInstance,\n protocolHost,\n getList,\n getBlacklist,\n getConfig,\n getOptions,\n getPingCache,\n ping,\n addressToLatLng,\n getQuery,\n prefsEncoded,\n convertMapCentre,\n randomInstances,\n style,\n autoPickInstance,\n}\n","import utils from \"./utils.js\"\n\nconst isChrome = browser.runtime.getBrowserInfo === undefined\nwindow.browser = window.browser || window.chrome\n\nlet config, options\n\nasync function init() {\n options = await utils.getOptions()\n config = await utils.getConfig()\n}\n\ninit()\nbrowser.storage.onChanged.addListener(init)\n\nfunction all(service, frontend, options, config) {\n let instances = []\n if (!frontend) {\n for (const frontend in config.services[service].frontends) {\n if (options[frontend]) {\n instances.push(...options[frontend])\n }\n }\n } else if (options[frontend]) {\n instances = options[frontend]\n }\n return instances\n}\n\n/**\n * @param {string} service\n * @param {URL} url\n * @param {{}} config\n * @param {{}} options\n * @param {string} frontend\n */\nfunction regexArray(service, url, config, options, frontend) {\n let targetList = config.services[service].targets\n if (frontend) {\n if (\n \"excludeTargets\" in config.services[service].frontends[frontend] &&\n (service !== \"search\" || !options[\"search\"].redirectGoogle)\n ) {\n targetList = targetList.filter(\n val => !config.services[service].frontends[frontend].excludeTargets.includes(targetList.indexOf(val))\n )\n }\n if (service === \"twitter\" && options[\"twitter\"].disableTwimg) {\n targetList = targetList.splice(2)\n }\n }\n for (const targetString in targetList) {\n const target = new RegExp(targetList[targetString])\n if (target.test(url.href)) return true\n }\n return false\n}\n\n/**\n * @param {URL} url\n * @param {string} frontend\n * @param {string} randomInstance\n * @param {string} type\n * @returns {undefined|string}\n */\nfunction rewrite(url, originUrl, frontend, randomInstance, type) {\n switch (frontend) {\n case \"hyperpipe\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}${url.pathname}${url.search}`.replace(/\\/search\\?q=.*/, searchQuery =>\n searchQuery.replace(\"?q=\", \"/\")\n )\n case \"searx\":\n case \"searxng\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}/${url.search}`\n case \"websurfx\":\n case \"whoogle\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}/search${url.search}`\n case \"4get\": {\n const s = url.searchParams.get(\"q\")\n if (s !== null) return `${randomInstance}/web?s=${encodeURIComponent(s)}`\n return randomInstance\n }\n case \"librey\":\n for (const key in url.searchParams.keys()) if (key != \"q\") url.searchParams.delete(key)\n return `${randomInstance}/search.php${url.search}`\n case \"yattee\":\n url.searchParams.delete(\"si\")\n return url.href.replace(/^https?:\\/{2}/, \"yattee://\")\n case \"freetube\":\n url.searchParams.delete(\"si\")\n return \"freetube://\" + url.href\n case \"freetubePwa\":\n url.searchParams.delete(\"si\")\n return \"freetube://\" + url.href\n case \"poketube\": {\n url.searchParams.delete(\"si\")\n if (url.pathname.startsWith(\"/channel\")) {\n const reg = /\\/channel\\/(.*)\\/?$/.exec(url.pathname)\n if (reg) {\n const id = reg[1]\n return `${randomInstance}/channel?id=${id}${url.search}`\n }\n }\n if (/\\/@[a-z]+\\//.exec(url.pathname)) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"small\":\n case \"libMedium\":\n case \"freedium\":\n case \"scribe\": {\n const regex = url.hostname.match(/^(link|cdn-images-\\d+|.*)\\.medium\\.com/)\n if (regex && regex.length > 1) {\n const subdomain = regex[1]\n if (subdomain != \"link\" || !subdomain.startsWith(\"cdn-images\")) {\n return `${randomInstance}/@${subdomain}${url.pathname}${url.search}`\n }\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"translite\":\n case \"simplyTranslate\":\n return `${randomInstance}/${url.search}`\n case \"send\":\n case \"mozhi\":\n return randomInstance\n case \"libreTranslate\":\n return `${randomInstance}/${url.search.replace(\"sl\", \"source\").replace(\"tl\", \"target\").replace(\"text\", \"q\")}`\n case \"osm\": {\n if (originUrl && originUrl.host === \"earth.google.com\") return randomInstance\n\n let prefs = { layers: \"mapnik\" }\n\n let mapCentre = \"#\"\n const mapCentreData = utils.convertMapCentre(url)\n if (mapCentreData.zoom && mapCentreData.lon && mapCentreData.lat) {\n mapCentre = `#map=${mapCentreData.zoom}/${mapCentreData.lon}/${mapCentreData.lat}`\n }\n\n if (url.pathname.includes(\"/embed\")) {\n // https://www.google.com/maps/embed/v1/place?key=AIzaSyD4iE2xVSpkLLOXoyqT-RuPwURN3ddScAI&q=Eiffel+Tower,Paris+France\n const query = utils.getQuery(url)\n let { coordinate, boundingbox } = utils.addressToLatLng(query)\n prefs.bbox = boundingbox\n prefs.marker = coordinate\n return `${randomInstance}/export/embed.html?${utils.prefsEncoded(prefs)}`\n }\n\n if (url.pathname.includes(\"/dir\")) {\n if (url.searchParams.has(\"travelmode\")) {\n const travelModes = {\n driving: \"fossgis_osrm_car\",\n walking: \"fossgis_osrm_foot\",\n bicycling: \"fossgis_osrm_bike\",\n transit: \"fossgis_osrm_car\", // not implemented on OSM, default to car.\n }\n prefs.engine = travelModes[url.searchParams.get(\"travelmode\")]\n }\n const regex1 = /\\/dir\\/([^@/]+)\\/([^@/]+)\\/@-?\\d[0-9.]*,-?\\d[0-9.]*,\\d{1,2}[.z]/.exec(url.pathname)\n const regex2 = /\\/dir\\/([^@/]+)\\//.exec(url.pathname)\n if (regex1) {\n // https://www.google.com/maps/dir/92+Rue+Moncey,+69003+Lyon,+France/M%C3%A9dip%C3%B4le+Lyon-Villeurbanne/@45.760254,4.8486298,13z?travelmode=bicycling\n const origin = utils.addressToLatLng(decodeURIComponent(regex1[1])).coordinate ?? \"\"\n const destination = utils.addressToLatLng(decodeURIComponent(regex1[2])).coordinate ?? \"\"\n prefs.route = `${origin};${destination}`\n } else if (regex2) {\n // https://www.google.com/maps/dir/92+Rue+Moncey,+69003+Lyon,+France/@45.760254,4.8486298,13z?travelmode=bicycling\n const origin = utils.addressToLatLng(decodeURIComponent(regex2[1])).coordinate ?? \"\"\n prefs.route = `${origin};`\n } else {\n // https://www.google.com/maps/dir/?api=1&origin=Space+Needle+Seattle+WA&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling\n const origin = utils.addressToLatLng(url.searchParams.get(\"origin\")).coordinate ?? \"\"\n const destination = utils.addressToLatLng(url.searchParams.get(\"destination\")).coordinate ?? \"\"\n prefs.route = `${origin};${destination}`\n }\n return `${randomInstance}/directions?${utils.prefsEncoded(prefs)}${mapCentre}`\n }\n\n const placeRegex = /\\/place\\/(.*?)\\//\n if (url.pathname.match(placeRegex)) {\n // https://www.google.com/maps/place/H%C3%B4tel+de+Londres+Eiffel/@40.9845265,28.7081268,14z\n const query = url.pathname.match(placeRegex)[1]\n return `${randomInstance}/search?query=${query}${mapCentre}`\n }\n\n if (url.searchParams.has(\"ll\")) {\n // https://maps.google.com/?ll=38.882147,-76.99017\n const [mlat, mlon] = url.searchParams.get(\"ll\").split(\",\")\n return `${randomInstance}/search?query=${mlat}%2C${mlon}`\n }\n\n if (url.searchParams.has(\"viewpoint\")) {\n // https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=48.857832,2.295226&heading=-45&pitch=38&fov=80\n const [mlat, mlon] = url.searchParams.get(\"viewpoint\").split(\",\")\n return `${randomInstance}/search?query=${mlat}%2C${mlon}`\n }\n\n const query = utils.getQuery(url)\n if (query) return `${randomInstance}/search?query=\"${query}${mapCentre}&${utils.prefsEncoded(prefs)}`\n return `${randomInstance}/${mapCentre}&${utils.prefsEncoded(prefs)}`\n }\n case \"breezeWiki\": {\n let wiki,\n urlpath = \"\"\n if (url.hostname.match(/^[a-zA-Z0-9-]+\\.(?:fandom|wikia)\\.com/)) {\n wiki = url.hostname.match(/^[a-zA-Z0-9-]+(?=\\.(?:fandom|wikia)\\.com)/)\n if (wiki == \"www\" || !wiki) wiki = \"\"\n else wiki = `/${wiki}`\n urlpath = url.pathname\n } else {\n wiki = url.pathname.match(/(?<=wiki\\/w:c:)[a-zA-Z0-9-]+(?=:)/)\n if (!wiki) wiki = \"\"\n else {\n wiki = \"/\" + wiki + \"/wiki/\"\n urlpath = url.pathname.match(/(?<=wiki\\/w:c:[a-zA-Z0-9-]+:).+/)\n }\n }\n if (url.href.search(/Special:Search\\?query/) > -1) {\n return `${randomInstance}${wiki}${urlpath}${url.search}`\n .replace(/Special:Search\\?query/, \"search?q\")\n .replace(/\\/wiki/, \"\")\n }\n return `${randomInstance}${wiki}${urlpath}${url.search}`\n }\n case \"rimgo\":\n if (url.href.search(/^https?:\\/{2}(?:[im]\\.)?stack\\./) > -1)\n return `${randomInstance}/stack${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"redlib\":\n case \"libreddit\": {\n const subdomain = url.hostname.match(/^(?:((?:external-)?preview|i)\\.)?redd\\.it/)\n if (!subdomain) return `${randomInstance}${url.pathname}${url.search}`\n switch (subdomain[1]) {\n case \"preview\":\n return `${randomInstance}/preview/pre${url.pathname}${url.search}`\n case \"external-preview\":\n return `${randomInstance}/preview/external-pre${url.pathname}${url.search}`\n case \"i\":\n return `${randomInstance}/img${url.pathname}`\n }\n return `${randomInstance}/comments${url.pathname}`\n }\n case \"teddit\":\n if (/^(?:(?:external-)?preview|i)\\.redd\\.it/.test(url.hostname)) {\n if (url.search == \"\") return `${randomInstance}${url.pathname}?teddit_proxy=${url.hostname}`\n else return `${randomInstance}${url.pathname}${url.search}&teddit_proxy=${url.hostname}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n case \"troddit\":\n case \"eddrit\":\n if (/^(?:(?:external-)?preview|i)\\.redd\\.it/.test(url.hostname)) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"neuters\": {\n const p = url.pathname\n if (p.startsWith(\"/article/\") || p.startsWith(\"/pf/\") || p.startsWith(\"/arc/\") || p.startsWith(\"/resizer/\")) {\n return randomInstance\n }\n return `${randomInstance}${p}`\n }\n case \"dumb\":\n if (url.pathname.endsWith(\"-lyrics\")) return `${randomInstance}${url.pathname}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"intellectual\":\n return `${randomInstance}${url.pathname}${url.search}`\n case \"ruralDictionary\":\n if (!url.pathname.includes(\"/define.php\") && !url.pathname.includes(\"/random.php\") && url.pathname != \"/\")\n return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"anonymousOverflow\": {\n if (url.hostname == \"stackoverflow.com\") {\n const threadID = /^\\/a\\/(\\d+)\\/?/.exec(url.pathname)\n if (threadID) return `${randomInstance}/questions/${threadID[1]}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n if (url.pathname == \"/\" || url.pathname == \"\") {\n // https://stackexchange.com or https://superuser.com\n return `${randomInstance}${url.pathname}${url.search}`\n }\n const regex = url.href.match(/https?:\\/{2}(?:([a-zA-Z0-9-]+)\\.(meta\\.)?)?stackexchange\\.com\\//)\n if (regex && regex.length > 1) {\n if (regex[2]) {\n return `${randomInstance}/exchange/${url.hostname}${url.pathname}${url.search}`\n }\n const subdomain = regex[1]\n return `${randomInstance}/exchange/${subdomain}${url.pathname}${url.search}`\n }\n const notExchangeRegex = url.hostname.match(\n /(?:[a-zA-Z]+\\.)?(?:askubuntu\\.com|mathoverflow\\.net|serverfault\\.com|stackapps\\.com|superuser\\.com|stackoverflow\\.com)/\n )\n if (notExchangeRegex) {\n return `${randomInstance}/exchange/${notExchangeRegex[0]}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"biblioReads\":\n return `${randomInstance}${url.pathname}${url.search}`\n case \"wikimore\": {\n let hostSplit = url.host.split(\".\")\n // wikiless doesn't have mobile view support yet\n if (hostSplit[0] != \"wikipedia\" && hostSplit[0] != \"www\") {\n const lang = url.hostname.split(\".\")[0]\n return `${randomInstance}/wiki/${lang}${url.pathname}${url.search}${url.hash}`\n }\n return `${randomInstance}${url.pathname}${url.search}${url.hash}`\n }\n case \"wikiless\": {\n let hostSplit = url.host.split(\".\")\n // wikiless doesn't have mobile view support yet\n if (hostSplit[0] != \"wikipedia\" && hostSplit[0] != \"www\") {\n if (hostSplit[0] == \"m\") url.searchParams.append(\"mobileaction\", \"toggle_view_mobile\")\n else url.searchParams.append(\"lang\", hostSplit[0])\n if (hostSplit[1] == \"m\") url.searchParams.append(\"mobileaction\", \"toggle_view_mobile\")\n }\n return `${randomInstance}${url.pathname}${url.search}${url.hash}`\n }\n case \"offtiktok\":\n case \"proxiTok\":\n if (url.pathname.startsWith(\"/email\")) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"waybackClassic\": {\n const regex = /^\\/\\web\\/(?:[0-9]+)?\\*\\/(.*)/.exec(url.pathname)\n if (regex) {\n const link = regex[1]\n return `${randomInstance}/cgi-bin/history.cgi?utf8=✓&q=${encodeURIComponent(link)}`\n }\n const regex2 = /(^\\/\\web\\/([0-9]+)\\/.*)/.exec(url.pathname)\n if (regex2) {\n let link = regex2[1]\n link = link.replace(regex2[2], regex2[2] + \"if_\")\n return `https://web.archive.org${link}`\n }\n return\n }\n case \"gothub\":\n if (url.hostname == \"gist.github.com\") return `${randomInstance}/gist${url.pathname}${url.search}`\n if (url.hostname == \"raw.githubusercontent.com\") return `${randomInstance}/raw${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"mikuInvidious\":\n if (url.hostname == \"bilibili.com\" || url.hostname == \"www.bilibili.com\" || url.hostname == \"b23.tv\")\n return `${randomInstance}${url.pathname}${url.search}`\n if (url.hostname == \"space.bilibili.com\") return `${randomInstance}/space${url.pathname}${url.search}`\n case \"tent\": {\n if (url.hostname == \"bandcamp.com\" && url.pathname == \"/search\") {\n const query = url.searchParams.get(\"q\")\n return `${randomInstance}/search.php?query=${encodeURIComponent(query)}`\n }\n if (url.hostname.endsWith(\"bandcamp.com\")) {\n const regex = /^(.*)\\.bandcamp\\.com/.exec(url.hostname)\n const artist = regex[1]\n if (url.pathname == \"/\" || url.pathname == \"/music\") {\n return `${randomInstance}/artist.php?name=${artist}`\n } else {\n const regex = /^\\/(.*)\\/(.*)/.exec(url.pathname)\n if (regex) {\n const type = regex[1]\n const name = regex[2]\n return `${randomInstance}/release.php?artist=${artist}&type=${type}&name=${name}`\n }\n }\n }\n if (url.hostname == \"f4.bcbits.com\") {\n const regex = /\\/img\\/(.*)/.exec(url.pathname)\n const image = regex[1]\n return `${randomInstance}/image.php?file=${image}`\n }\n if (url.hostname == \"t4.bcbits.com\") {\n const regex = /\\/stream\\/(.*)\\/(.*)\\/(.*)/.exec(url.pathname)\n if (regex) {\n const directory = regex[1]\n const format = regex[2]\n const file = regex[3]\n const token = url.searchParams.get(\"token\")\n return `${randomInstance}/audio.php/?directory=${directory}&format=${format}&file=${file}&token=${encodeURIComponent(token)}`\n }\n }\n }\n case \"binternet\":\n if (url.hostname == \"i.pinimg.com\") return `${randomInstance}/image_proxy.php?url=${encodeURIComponent(url.href)}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"painterest\":\n if (url.hostname == \"i.pinimg.com\") return `${randomInstance}/_/proxy?url=${encodeURIComponent(url.href)}`\n const regex = /^\\/pin\\/[^\\/]+/.exec(url.pathname)\n if (regex) return `${randomInstance}${regex[0]}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"laboratory\": {\n let path = url.pathname\n if (path == \"/\") path = \"\"\n return `${randomInstance}/${url.hostname}${path}${url.search}`\n }\n case \"quetre\": {\n const regex = /([a-z]+)\\.quora\\.com/.exec(url.hostname)\n if (regex) {\n const lang = regex[1]\n url.searchParams.append(\"lang\", lang)\n return `${randomInstance}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"pixivViewer\":\n case \"liteXiv\":\n case \"pixivFe\": {\n const regex = /\\/[a-z]{1,3}\\/(.*)/.exec(url.pathname)\n if (regex) {\n const path = regex[1]\n return `${randomInstance}/${path}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"vixipy\": {\n const regex = /\\/[a-z]{1,3}\\/(.*)/.exec(url.pathname)\n if (regex) {\n let path = regex[1]\n if (path.startsWith(\"tags/\")) path = path.replace(/tags/, \"tag\")\n return `${randomInstance}/${path}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"invidious\": {\n // tracker\n url.searchParams.delete(\"si\")\n\n if (type == \"sub_frame\") url.searchParams.append(\"autoplay\", \"0\")\n\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch?v=${watch}&${url.search.substring(1)}`\n }\n if (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/redirect?\")) return url.href\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"freetubeMusic\": {\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `freetube://youtube.com/watch?v=${watch}`\n }\n return \"freetube://\" + url.href\n }\n case \"invidiousMusic\": {\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch?v=${watch}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"materialious\": {\n url.searchParams.delete(\"si\")\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch/${watch}${url.search.replace(\"?\", \"&\")}`\n }\n if (url.hostname.endsWith(\"youtube.com\")) {\n if (url.pathname.startsWith(\"/watch\")) {\n if (url.searchParams.has(\"v\")) {\n const watch = url.searchParams.get(\"v\")\n url.searchParams.delete(\"v\")\n return `${randomInstance}/watch/${watch}${url.search.replace(\"?\", \"&\")}`\n }\n return `${randomInstance}/watch/${url.search.replace(\"?\", \"&\")}`\n }\n if (url.pathname.startsWith(\"/results\")) {\n if (url.searchParams.has(\"search_query\")) {\n const search = url.searchParams.get(\"search_query\")\n url.searchParams.delete(\"search_query\")\n return `${randomInstance}/search/${search}${url.search.replace(\"?\", \"&\")}`\n }\n return `${randomInstance}/search/${url.search.replace(\"?\", \"&\")}`\n }\n if (url.pathname.startsWith(\"/redirect?\")) {\n return url.href\n }\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"libremdb\": {\n if (/\\/((?:name|title)\\/\\w+)\\/?$/.exec(url.pathname)) {\n return `${randomInstance}${url.pathname}${url.search}`\n }\n return randomInstance\n }\n case \"tuboYoutube\":\n url.searchParams.delete(\"si\")\n if (url.pathname.startsWith(\"/channel\")) return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}`\n if (url.pathname.startsWith(\"/watch\")) return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}`\n return randomInstance\n case \"tuboSoundcloud\":\n if (url.pathname == \"/\") return `${randomInstance}?kiosk?serviceId=1`\n if (url.pathname.match(/^\\/[^\\/]+(\\/$|$)/)) return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}`\n if (url.pathname.match(/^\\/[^\\/]+\\/[^\\/]+/)) return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}`\n return randomInstance\n case \"twineo\":\n case \"safetwitch\":\n if (url.hostname.startsWith(\"clips.\")) return `${randomInstance}/clip${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n\n case \"tekstoLibre\":\n return `${randomInstance}/?${url.pathname.slice(1)}`\n case \"skyview\":\n if (url.pathname == \"/\") return randomInstance\n return `${randomInstance}?url=${encodeURIComponent(url.href)}`\n case \"nitter\": {\n let search = new URLSearchParams(url.search)\n\n search.delete(\"ref_src\")\n search.delete(\"ref_url\")\n search.delete(\"s\") // type of device that shared the link\n search.delete(\"t\") // some sort of tracking ID\n\n search = search.toString()\n if (search !== \"\") search = `?${search}`\n\n if (url.host.split(\".\")[0] === \"pbs\" || url.host.split(\".\")[0] === \"video\") {\n try {\n const [, id, format, extra] = search.match(/(.*)\\?format=(.*)&(.*)/)\n const query = encodeURIComponent(`${id}.${format}?${extra}`)\n return `${randomInstance}/pic${url.pathname}${query}`\n } catch {\n return `${randomInstance}/pic${url.pathname}${search}`\n }\n }\n if (url.pathname.split(\"/\").includes(\"tweets\"))\n return `${randomInstance}${url.pathname.replace(\"/tweets\", \"\")}${search}`\n if (url.host == \"t.co\") return `${randomInstance}/t.co${url.pathname}`\n return `${randomInstance}${url.pathname}${search}#m`\n }\n case \"priviblur\": {\n if (url.hostname == \"www.tumblr.com\") return `${randomInstance}${url.pathname}${url.search}`\n if (url.hostname.startsWith(\"assets\")) return `${randomInstance}/tblr/assets${url.pathname}${url.search}`\n if (url.hostname.startsWith(\"static\")) return `${randomInstance}/tblr/static${url.pathname}${url.search}`\n\n const reg = /^([0-9]+)\\.media\\.tumblr\\.com/.exec(url.hostname) // *.media.tumblr.com\n if (reg) return `${randomInstance}/tblr/media/${reg[1]}${url.pathname}${url.search}`\n\n const blogregex = /^(?:www\\.)?([a-z\\d-]+)\\.tumblr\\.com/.exec(url.hostname) // <blog>.tumblr.com\n if (blogregex) {\n const blog_name = blogregex[1]\n // Under the <blog>.tumblr.com domain posts are under a /post path\n if (url.pathname.startsWith(\"/post\"))\n return `${randomInstance}/${blog_name}${url.pathname.slice(5)}${url.search}`\n else return `${randomInstance}/${blog_name}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"ultimateTab\":\n case \"freetar\":\n if (url.pathname.startsWith(\"/search.php\")) {\n url.searchParams.set(\"search_term\", url.searchParams.get(\"value\"))\n url.searchParams.delete(\"value\")\n url.searchParams.delete(\"search_type\")\n return `${randomInstance}/search${url.search}`\n }\n if (url.pathname.startsWith(\"/artist\")) return\n return `${randomInstance}${url.pathname}${url.search}`\n case \"ratAintTieba\":\n url.searchParams.delete(\"ie\")\n return `${randomInstance}${url.pathname}${url.search}`\n case \"shoelace\": {\n const reg = /^\\/(?:(?:(?:[^\\/])?\\/post)|t)\\/([^\\/])/.exec(url.pathname)\n if (reg) return `${randomInstance}/t/${reg[1]}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"skunkyArt\": {\n if (url.pathname.startsWith(\"/search\")) return `${randomInstance}${url.pathname}${url.search}&type=all`\n\n const artReg = /^\\/(.*?)\\/art\\/(.*)\\/?/.exec(url.pathname)\n if (artReg) return `${randomInstance}/post/${artReg[1]}/${artReg[2]}${url.search}`\n\n const userReg = /^\\/([^\\/]+)$/.exec(url.pathname)\n if (userReg) return `${randomInstance}/group_user?q=${userReg[1]}&type=about`\n\n const galleryReg = /^\\/(.*?)\\/gallery(\\/$|$)$/.exec(url.pathname)\n if (galleryReg) return `${randomInstance}/group_user?q=${galleryReg[1]}&type=gallery`\n\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"ytify\": {\n if (url.pathname.startsWith(\"/watch\"))\n return `${randomInstance}/?s=${encodeURIComponent(url.searchParams.get(\"v\"))}`\n\n const channelReg = /\\/channel\\/([^\\/]+)/.exec(url.pathname)\n if (channelReg) return `${randomInstance}/list?channel=${channelReg[1]}`\n\n if (url.pathname.startsWith(\"/playlist\"))\n return `${randomInstance}/list?playlists=${encodeURIComponent(url.searchParams.get(\"list\"))}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"koub\": {\n if (url.pathname.startsWith(\"/view/\") || url.pathname.startsWith(\"/stories/\")) {\n return `${randomInstance}${url.pathname}${url.search}`\n }\n const accountReg = /^\\/([^\\/]+)\\/?$/.exec(url.pathname)\n if (accountReg) return `${randomInstance}/account${url.pathname}${url.search}`\n return randomInstance\n }\n case \"duckDuckGoAiChat\":\n return \"https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=1\"\n\n case \"soundcloak\":\n if (url.pathname.startsWith(\"/feed\") || url.pathname.startsWith(\"/stream\")) {\n // this feature requires authentication and is unsupported, so just redirect to main page\n return randomInstance\n }\n\n if (url.pathname.startsWith(\"/search\")) {\n if (!url.search) {\n return randomInstance\n }\n\n let type = \"\"\n if (url.pathname.startsWith(\"/search/sounds\")) {\n type = \"tracks\"\n } else if (url.pathname.startsWith(\"/search/people\")) {\n type = \"users\"\n } else if (url.pathname.startsWith(\"/search/albums\") || url.pathname.startsWith(\"/search/sets\")) {\n type = \"playlists\"\n }\n\n if (type) {\n type = \"&type=\" + type\n } else {\n return randomInstance // fallback for unsupported search types (searching for anything for example)\n }\n\n return `${randomInstance}/search${url.search}${type}`\n }\n\n if (url.host == \"on.soundcloud.com\") {\n return `${randomInstance}/on${url.pathname}`\n }\n\n return `${randomInstance}${url.pathname}${url.search}`\n case \"piped\":\n case \"pipedMaterial\":\n case \"cloudtube\":\n case \"lightTube\":\n case \"viewtube\":\n url.searchParams.delete(\"si\")\n default:\n return `${randomInstance}${url.pathname}${url.search}`\n }\n}\n\n/**\n * @param {URL} url\n * @param {string} type\n * @param {URL} originUrl\n * @param {URL} documentUrl\n * @param {boolean} incognito\n * @param {boolean} forceRedirection\n * @returns {string | undefined}\n */\nfunction redirect(url, type, originUrl, documentUrl, incognito, forceRedirection) {\n if (type != \"main_frame\" && type != \"sub_frame\" && type != \"image\") return\n let randomInstance\n let frontend\n if (!forceRedirection && options.redirectOnlyInIncognito == true && !incognito) return\n for (const service in config.services) {\n if (!forceRedirection && !options[service].enabled) continue\n if (!forceRedirection && options[service].redirectOnlyInIncognito == true && !incognito) continue\n\n frontend = options[service].frontend\n\n if (\n config.services[service].frontends[frontend].desktopApp &&\n type != \"main_frame\" &&\n options[service].redirectType != \"main_frame\"\n )\n frontend = options[service].embedFrontend\n\n if (!regexArray(service, url, config, options, frontend)) {\n frontend = null\n continue\n }\n\n if (type != \"main_frame\" && documentUrl && options[service].redirectType == \"sub_frame\") {\n if (regexArray(service, documentUrl, config, options, frontend)) {\n return\n }\n }\n\n if (\n config.services[service].embeddable &&\n type != options[service].redirectType &&\n options[service].redirectType != \"both\"\n ) {\n if (options[service].unsupportedUrls == \"block\") return \"CANCEL\"\n return\n }\n\n let instanceList = options[frontend]\n if (instanceList === undefined) break // should not happen if settings are correct\n\n if (config.services[service].frontends[frontend].localhost && options[service].instance == \"localhost\") {\n randomInstance = `http://${frontend}.localhost:8080`\n } else if (instanceList.length === 0) {\n return `https://no-instance.libredirect.invalid?frontend=${encodeURIComponent(frontend)}&url=${encodeURIComponent(url.href)}`\n } else {\n randomInstance = utils.getRandomInstance(instanceList)\n }\n\n if (originUrl && instanceList.includes(originUrl.origin)) {\n if (type == \"main_frame\") return \"BYPASSTAB\"\n else return null\n }\n break\n }\n if (!frontend) return\n\n return rewrite(url, originUrl, frontend, randomInstance, type)\n}\n\n/**\n * @param {URL} url\n * @param {string} type\n * @param {URL} originUrl\n * @param {URL} documentUrl\n * @param {boolean} incognito\n * @param {boolean} forceRedirection\n * @returns {Promise<string | undefined>}\n */\nasync function redirectAsync(url, type, originUrl, documentUrl, incognito, forceRedirection) {\n await init()\n return redirect(url, type, originUrl, documentUrl, incognito, forceRedirection)\n}\n\n/**\n * @param {URL} url\n */\nasync function computeServiceFrontend(url) {\n const config = await utils.getConfig()\n const options = await utils.getOptions()\n for (const service in config.services) {\n if (regexArray(service, url, config, options)) {\n return { service, frontend: null }\n } else {\n for (const frontend in config.services[service].frontends) {\n const instances = all(service, frontend, options, config)\n const i = instances.findIndex(instance => url.href.startsWith(instance))\n if (i >= 0) {\n return { service, frontend }\n }\n }\n }\n }\n}\n\n/**\n * @param {URL} url\n * @param {string} customService\n */\nfunction switchInstance(url, customService) {\n return new Promise(async resolve => {\n let options = await utils.getOptions()\n let config = await utils.getConfig()\n\n const protocolHost = utils.protocolHost(url)\n if (customService) {\n const instancesList = options[options[customService].frontend]\n if (instancesList !== undefined) {\n const newInstance = utils.getNextInstance(url.origin, instancesList)\n if (newInstance) {\n return resolve(`${newInstance}${url.pathname}${url.search}`)\n }\n }\n } else {\n for (const service in config.services) {\n let instancesList = options[options[service].frontend]\n if (instancesList === undefined) continue\n const index = instancesList.findIndex(instance => url.href.startsWith(instance))\n if (index < 0) continue\n instancesList.splice(index, 1)\n if (instancesList.length === 0) return resolve()\n const newInstance = utils.getNextInstance(url.origin, instancesList)\n if (newInstance) {\n return resolve(`${newInstance}${url.pathname}${url.search}`)\n }\n }\n }\n resolve()\n })\n}\n\n/**\n * @param {URL} url\n */\nasync function reverse(url) {\n let options = await utils.getOptions()\n let config = await utils.getConfig()\n for (const service in config.services) {\n let frontend = options[service].frontend\n if (options[frontend] == undefined) continue\n if (\n options[frontend].findIndex(instance => url.href.startsWith(instance)) < 0 &&\n !url.href.startsWith(`http://${frontend}.localhost:8080`)\n )\n continue\n switch (service) {\n case \"youtube\":\n case \"imdb\":\n case \"imgur\":\n case \"tiktok\":\n case \"reddit\":\n case \"imdb\":\n case \"snopes\":\n case \"urbanDictionary\":\n case \"quora\":\n case \"twitter\":\n case \"medium\":\n case \"pinterest\":\n return `${config.services[service].url}${url.pathname}${url.search}`\n case \"fandom\": {\n let regex = url.pathname.match(/^\\/([a-zA-Z0-9-]+)\\/wiki\\/(.*)/)\n if (regex) return `https://${regex[1]}.fandom.com/wiki/${regex[2]}`\n return\n }\n case \"wikipedia\": {\n const lang = url.searchParams.get(\"lang\")\n if (lang != null) {\n return `https://${lang}.wikipedia.org${url.pathname}${url.search}${url.hash}`\n }\n return `https://wikipedia.org${url.pathname}${url.search}${url.hash}`\n }\n case \"stackOverflow\": {\n if (url.pathname.startsWith(\"/questions/\")) {\n return `https://stackoverflow.com${url.pathname}${url.search}`\n }\n if (url.pathname.startsWith(\"/exchange/\")) {\n const regex = /\\/exchange\\/(.*?)(\\/.*)/.exec(url.pathname)\n if (regex) {\n if (regex[1].includes(\".\")) {\n return `https://${regex[1]}${regex[2]}`\n } else {\n return `https://${regex[1]}.stackexchange.com${regex[2]}`\n }\n }\n }\n return\n }\n case \"tekstowo\":\n return `${config.services[service].url}/${url.search.slice(1)}`\n case \"goodreads\":\n return `https://goodreads.com${url.pathname}${url.search}`\n case \"soundcloud\":\n if (frontend == \"soundcloak\") {\n if (url.pathname.includes(\"/_/\")) {\n // soundcloak-specific pages\n return `${config.services[service].url}${url.pathname.split(\"/_/\")[0]}`\n }\n\n if (url.pathname == \"/search\") {\n let type = url.searchParams.get(\"type\")\n switch (type) {\n case \"playlists\":\n type = \"sets\"\n break\n case \"tracks\":\n type = \"sounds\"\n break\n case \"users\":\n type = \"people\"\n break\n default:\n type = \"\"\n }\n\n url.searchParams.delete(\"type\")\n if (!type) {\n return `${config.services[service].url}/search?${url.searchParams.toString()}`\n } else {\n return `${config.services[service].url}/search/${type}?${url.searchParams.toString()}`\n }\n }\n\n return `${config.services[service].url}${url.pathname}`\n }\n default:\n return\n }\n }\n return\n}\n\nconst defaultInstances = {\n materialious: [\"https://app.materialio.us\"],\n viewtube: [\"https://viewtube.io\"],\n piped: [\"https://pipedapi-libre.kavin.rocks\"],\n pipedMaterial: [\"https://piped-material.xn--17b.net\"],\n cloudtube: [\"https://tube.cadence.moe\"],\n lightTube: [\"https://tube.kuylar.dev\"],\n poketube: [\"https://poketube.fun\"],\n proxiTok: [\"https://proxitok.pabloferreiro.es\"],\n offtiktok: [\"https://www.offtiktok.com\"],\n redlib: [\"https://safereddit.com\"],\n eddrit: [\"https://eddrit.com\"],\n troddit: [\"https://www.troddit.com\"],\n scribe: [\"https://scribe.rip\"],\n libMedium: [\"https://md.vern.cc\"],\n small: [\"https://small.bloat.cat\"],\n freedium: [\"https://freedium.cfd\"],\n quetre: [\"https://quetre.iket.me\"],\n libremdb: [\"https://libremdb.iket.me\"],\n simplyTranslate: [\"https://simplytranslate.org\"],\n translite: [\"https://tl.bloat.cat\"],\n mozhi: [\"https://mozhi.aryak.me\"],\n searxng: [\"https://nyc1.sx.ggtyler.dev\"],\n \"4get\": [\"https://4get.ca\"],\n websurfx: [\"https://alamin655-spacex.hf.space\"],\n rimgo: [\"https://rimgo.vern.cc\"],\n hyperpipe: [\"https://hyperpipe.surge.sh\"],\n osm: [\"https://www.openstreetmap.org\"],\n breezeWiki: [\"https://breezewiki.com\"],\n neuters: [\"https://neuters.de\"],\n dumb: [\"https://dm.vern.cc\"],\n intellectual: [\"https://intellectual.insprill.net\"],\n ruralDictionary: [\"https://rd.vern.cc\"],\n anonymousOverflow: [\"https://code.whatever.social\"],\n suds: [\"https://sd.vern.cc\"],\n unfunny: [\"https://uf.vern.cc\"],\n soprano: [\"https://sp.vern.cc\"],\n meme: [\"https://mm.vern.cc\"],\n waybackClassic: [\"https://wayback-classic.net\"],\n tent: [\"https://tent.sny.sh\"],\n laboratory: [\"https://lab.vern.cc\"],\n binternet: [\"https://bn.bloat.cat\"],\n painterest: [\"https://pt.bloat.cat\"],\n pixivFe: [\"https://pixiv.perennialte.ch\"],\n liteXiv: [\"https://litexiv.465321.best\", \"https://litexiv.bloat.cat\"],\n pixivViewer: [\"https://pixiv.pictures\"],\n vixipy: [\"https://vx.maid.zone\"],\n indestructables: [\"https://indestructables.private.coffee\"],\n destructables: [\"https://ds.vern.cc\"],\n structables: [\"https://structables.private.coffee\"],\n safetwitch: [\"https://safetwitch.drgns.space\"],\n twineo: [\"https://twineo.exozy.me\"],\n proxigram: [\"https://ig.opnxng.com\"],\n tuboYoutube: [\"https://tubo.media\"],\n tuboSoundcloud: [\"https://tubo.media\"],\n tekstoLibre: [\"https://davilarek.github.io/TekstoLibre\"],\n skyview: [\"https://skyview.social\"],\n priviblur: [\"https://pb.bloat.cat\"],\n nitter: [\"https://nitter.privacydev.net\"],\n pasted: [\"https://pasted.drakeerv.com\"],\n pasty: [\"https://pasty.lus.pm\"],\n freetar: [\"https://freetar.de\"],\n ultimateTab: [\"https://ultimate-tab.com\"],\n ratAintTieba: [\"https://rat.fis.land\"],\n shoelace: [\"https://shoelace.mint.lgbt\"],\n skunkyArt: [\"https://skunky.bloat.cat\"],\n ytify: [\"https://ytify.pp.ua\"],\n nerdsForNerds: [\"https://nn.vern.cc\"],\n ducksForDucks: [\"https://ducksforducks.private.coffee\"],\n koub: [\"https://koub.clovius.club\"],\n soundcloak: [\"https://soundcloak.fly.dev\"],\n gocook: [\"https://cook.adminforge.de\"],\n wikimore: [\"https://wikimore.private.coffee\"],\n libreTranslate: [\"https://libretranslate.com\"],\n cryptPad: [\"https://cryptpad.org\"],\n}\n\nasync function getDefaults() {\n let config = await utils.getConfig()\n let options = {}\n for (const service in config.services) {\n options[service] = {}\n for (const defaultOption in config.services[service].options) {\n options[service][defaultOption] = config.services[service].options[defaultOption]\n }\n for (const frontend in config.services[service].frontends) {\n if (config.services[service].frontends[frontend].instanceList) {\n options[frontend] = []\n }\n }\n }\n options.exceptions = {\n url: [],\n regex: [],\n }\n options.theme = \"detect\"\n options.popupServices = [\"youtube\", \"tiktok\", \"imgur\", \"reddit\", \"quora\", \"translate\", \"maps\"]\n options.fetchInstances = \"github\"\n options.redirectOnlyInIncognito = false\n options = { ...options, ...defaultInstances }\n return options\n}\n\nfunction initDefaults() {\n return new Promise(resolve => {\n browser.storage.local.clear(async () => {\n options = await getDefaults()\n browser.storage.local.set({ options }, () => resolve())\n })\n })\n}\n\nfunction processUpdate(_options) {\n return new Promise(async resolve => {\n const config = await utils.getConfig()\n let options = _options ?? (await utils.getOptions())\n\n const defaults = await getDefaults()\n\n // Remove any unknown option or subOption\n for (const optionName in options) {\n if (!(optionName in defaults)) delete options[optionName]\n else if (typeof optionName === \"object\" && optionName !== null) {\n for (const subOptionName in options[optionName]) {\n if (!(subOptionName in defaults[optionName])) delete options[optionName][subOptionName]\n }\n }\n }\n\n // Remove any unknwon popupService\n options.popupServices = options.popupServices.filter(service => service in config.services)\n\n // Add missing options\n for (const [defaultName, defaultValue] of Object.entries(defaults)) {\n if (!(defaultName in options)) {\n options[defaultName] = defaultValue\n }\n }\n\n for (const [serviceName, serviceValue] of Object.entries(config.services)) {\n // Reset service options if selected frontend is deprecated\n if (!(options[serviceName].frontend in serviceValue.frontends)) {\n options[serviceName] = serviceValue.options\n }\n\n // Add a default service option if it's not present\n for (const optionName in serviceValue.options) {\n if (!(optionName in options[serviceName])) {\n options[serviceName][optionName] = serviceValue.options[optionName]\n }\n }\n }\n\n browser.storage.local.clear(() => browser.storage.local.set({ options }, () => resolve()))\n })\n}\n\n/**\n * @param {URL} url\n */\nasync function copyRaw(url) {\n const newUrl = await reverse(url)\n if (newUrl) {\n if (!isChrome) {\n navigator.clipboard.writeText(newUrl)\n } else {\n var copyFrom = document.createElement(\"textarea\")\n copyFrom.textContent = newUrl\n document.body.appendChild(copyFrom)\n copyFrom.select()\n document.execCommand(\"copy\")\n copyFrom.blur()\n document.body.removeChild(copyFrom)\n }\n }\n}\n\n/**\n * @param {URL} url\n */\nfunction isException(url) {\n if (!options) return false\n if (!options.exceptions) return false\n let exceptions = options.exceptions\n if (exceptions && url) {\n if (exceptions.url) {\n for (let item of exceptions.url) {\n item = new URL(item)\n item = item.href.replace(/^http:\\/\\//, \"https://\")\n if (item == url.href) {\n return true\n }\n }\n }\n if (exceptions.regex) {\n for (const item of exceptions.regex) {\n if (new RegExp(item).test(url.href)) {\n return true\n }\n }\n }\n }\n return false\n}\n\nexport default {\n redirect,\n redirectAsync,\n computeServiceFrontend,\n reverse,\n initDefaults,\n processUpdate,\n copyRaw,\n switchInstance,\n isException,\n}\n","<script>\n const browser = window.browser || window.chrome\n\n import { onDestroy } from \"svelte\"\n import Button from \"../../components/Button.svelte\"\n import ExportIcon from \"../../icons/ExportIcon.svelte\"\n import ImportIcon from \"../../icons/ImportIcon.svelte\"\n import ResetIcon from \"../../icons/ResetIcon.svelte\"\n import { options } from \"../stores\"\n import servicesHelper from \"../../../assets/javascripts/services.js\"\n import utils from \"../../../assets/javascripts/utils.js\"\n\n let _options\n const unsubscribe = options.subscribe(val => (_options = val))\n onDestroy(unsubscribe)\n\n let importSettingsInput\n let importSettingsFiles\n $: if (importSettingsFiles) {\n const reader = new FileReader()\n reader.readAsText(importSettingsFiles[0])\n reader.onload = async () => {\n let data = JSON.parse(reader.result)\n if (data.version != browser.runtime.getManifest().version) {\n alert(\"Importing from a previous version. Be careful\")\n }\n await servicesHelper.processUpdate(data)\n options.set(await utils.getOptions())\n }\n reader.onerror = error => {\n console.log(\"error\", error)\n alert(\"Error!\")\n }\n }\n\n async function exportSettings() {\n _options.version = browser.runtime.getManifest().version\n const resultString = JSON.stringify(_options, null, \" \")\n const anchor = document.createElement(\"a\")\n anchor.href = \"data:application/json;base64,\" + btoa(resultString)\n anchor.download = `libredirect-settings-v${_options.version}-${new Date().toISOString().replace(\":\", \"-\").slice(0, -5)}.json`\n anchor.click()\n }\n\n async function exportSettingsSync() {\n _options.version = browser.runtime.getManifest().version\n browser.storage.sync.set({ options: _options })\n }\n\n async function importSettingsSync() {\n browser.storage.sync.get({ options }, async r => {\n let data = r.options\n if (data.version != browser.runtime.getManifest().version) {\n alert(\"Importing from a previous version. Be careful\")\n }\n await servicesHelper.processUpdate(data)\n options.set(await utils.getOptions())\n })\n }\n\n async function resetSettings() {\n await servicesHelper.initDefaults()\n options.set(await utils.getOptions())\n }\n</script>\n\n<div class=\"buttons\">\n <Button on:click={() => importSettingsInput.click()}>\n <ImportIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"importSettings\") || \"Import Settings\"}\n </Button>\n <input\n type=\"file\"\n accept=\".json\"\n style=\"display: none\"\n bind:this={importSettingsInput}\n bind:files={importSettingsFiles}\n />\n\n <Button on:click={exportSettings}>\n <ExportIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"exportSettings\") || \"Export Settings\"}\n </Button>\n\n <Button on:click={exportSettingsSync}>\n <ExportIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"exportSettingsToSync\") || \"Export Settings to Sync\"}\n </Button>\n\n <Button on:click={importSettingsSync}>\n <ImportIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"importSettingsFromSync\") || \"Import Settings from Sync\"}\n </Button>\n\n <Button on:click={resetSettings}>\n <ResetIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"resetSettings\") || \"Reset Settings\"}\n </Button>\n</div>\n\n<style>\n :global(.margin) {\n margin-right: 10px;\n margin-left: 0;\n }\n :global(.margin_rtl) {\n margin-right: 0;\n margin-left: 10px;\n }\n</style>\n","<script>\n export let checked\n export let onChange\n</script>\n\n<input class={document.body.dir} {...$$restProps} bind:checked on:change={onChange} type=\"checkbox\" />\n\n<style>\n input[type=\"checkbox\"] {\n appearance: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n width: 46px;\n height: 24px;\n background-color: var(--light-grey);\n border-radius: 50px;\n transition: 0.4s;\n cursor: pointer;\n }\n\n input[type=\"checkbox\"]:checked {\n background-color: var(--active);\n }\n\n input[type=\"checkbox\"]::before {\n content: \"\";\n display: inline-block;\n width: 18px;\n height: 18px;\n box-sizing: border-box;\n position: relative;\n top: 3px;\n left: 3.5px;\n background-color: white;\n border-radius: 50%;\n transition: 0.3s;\n }\n\n input[type=\"checkbox\"]:checked::before {\n left: 24px;\n }\n\n input[type=\"checkbox\"].rtl::before {\n left: auto;\n right: 3.5px;\n }\n\n input[type=\"checkbox\"].rtl:checked::before {\n left: auto;\n right: 24px;\n }\n</style>\n","<script>\n const browser = window.browser || window.chrome\n\n import Exceptions from \"./Exceptions.svelte\"\n import SettingsButtons from \"./SettingsButtons.svelte\"\n import { options } from \"../stores\"\n import { onDestroy } from \"svelte\"\n import Row from \"../../components/Row.svelte\"\n import Label from \"../../components/Label.svelte\"\n import Select from \"../../components/Select.svelte\"\n import Checkbox from \"../../components/Checkbox.svelte\"\n\n let _options\n const unsubscribe = options.subscribe(val => (_options = val))\n onDestroy(unsubscribe)\n\n let disableBookmarks = null\n browser.runtime.getPlatformInfo(r => {\n switch (r.os) {\n case \"fuchsia\":\n case \"ios\":\n case \"android\":\n disableBookmarks = true\n break\n default:\n disableBookmarks = false\n }\n if (!disableBookmarks) {\n browser.permissions.contains({ permissions: [\"bookmarks\"] }, r => (bookmarksPermission = r))\n }\n })\n\n let bookmarksPermission\n $: if (disableBookmarks !== null && disableBookmarks === false) {\n if (bookmarksPermission) {\n browser.permissions.request({ permissions: [\"bookmarks\"] }, r => (bookmarksPermission = r))\n } else {\n browser.permissions.remove({ permissions: [\"bookmarks\"] })\n bookmarksPermission = false\n }\n }\n</script>\n\n<div>\n <Row>\n <Label>{browser.i18n.getMessage(\"theme\") || \"Theme\"}</Label>\n <Select\n values={[\n { value: \"detect\", name: browser.i18n.getMessage(\"auto\") || \"Auto\" },\n { value: \"light\", name: browser.i18n.getMessage(\"light\") || \"Light\" },\n { value: \"dark\", name: browser.i18n.getMessage(\"dark\") || \"Dark\" },\n ]}\n value={_options.theme}\n onChange={e => {\n _options.theme = e.target.options[e.target.options.selectedIndex].value\n options.set(_options)\n }}\n />\n </Row>\n\n <Row>\n <Label>{browser.i18n.getMessage(\"fetchPublicInstances\") || \"Fetch public instances\"}</Label>\n <Select\n value={_options.fetchInstances}\n values={[\n { value: \"github\", name: \"GitHub\" },\n { value: \"codeberg\", name: \"Codeberg\" },\n { value: \"disable\", name: browser.i18n.getMessage(\"disable\") || \"Disable\" },\n ]}\n onChange={e => {\n _options.fetchInstances = e.target.options[e.target.options.selectedIndex].value\n options.set(_options)\n }}\n />\n </Row>\n\n <Row>\n <Label>{browser.i18n.getMessage(\"redirectOnlyInIncognito\") || \"Redirect Only in Incognito\"}</Label>\n <Checkbox\n checked={_options.redirectOnlyInIncognito}\n onChange={e => {\n _options.redirectOnlyInIncognito = e.target.checked\n options.set(_options)\n }}\n />\n </Row>\n\n {#if disableBookmarks === false}\n <Row>\n <Label>{browser.i18n.getMessage(\"bookmarksMenu\") || \"Bookmarks menu\"}</Label>\n <Checkbox bind:checked={bookmarksPermission} />\n </Row>\n {/if}\n\n <Exceptions />\n\n <SettingsButtons />\n</div>\n","// https://svelte.dev/repl/5abaac000b164aa1aacc6051d5c4f584?version=3.59.2\n\nimport { derived, writable } from 'svelte/store'\n\nexport function createUrlStore(ssrUrl) {\n // Ideally a bundler constant so that it's tree-shakable\n if (typeof window === 'undefined') {\n const { subscribe } = writable(ssrUrl)\n return { subscribe }\n }\n\n const href = writable(window.location.href)\n\n const originalPushState = history.pushState\n const originalReplaceState = history.replaceState\n\n const updateHref = () => href.set(window.location.href)\n\n history.pushState = () => {\n originalPushState.apply(this, arguments)\n updateHref()\n }\n\n history.replaceState = () => {\n originalReplaceState.apply(this, arguments)\n updateHref()\n }\n\n window.addEventListener('popstate', updateHref)\n window.addEventListener('hashchange', updateHref)\n\n return {\n subscribe: derived(href, ($href) => new URL($href)).subscribe\n }\n}\n\n// If you're using in a pure SPA, you can return a store directly and share it everywhere\nexport default createUrlStore()\n","<svg\n {...$$props}\n xmlns=\"http://www.w3.org/2000/svg\"\n enable-background=\"new 0 0 24 24\"\n height=\"26px\"\n viewBox=\"0 0 24 24\"\n width=\"26px\"\n fill=\"currentColor\"\n>\n <path\n d=\"M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z\"\n ></path>\n</svg>\n","<svg\n {...$$props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n ><path\n d=\"m240-120 240-240 240 240H240ZM80-280v-480q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v480q0 33-23.5 56.5T800-200H680v-80h120v-480H160v480h120v80H160q-33 0-56.5-23.5T80-280Zm400-200Z\"\n /></svg\n>\n","<svg\n {...$$props}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n ><path\n d=\"M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\"\n /></svg\n>\n","<script>\n const browser = window.browser || window.chrome\n\n import url from \"./url\"\n import GeneralIcon from \"../icons/GeneralIcon.svelte\"\n import ServicesIcon from \"../icons/ServicesIcon.svelte\"\n import AboutIcon from \"../icons/AboutIcon.svelte\"\n</script>\n\n<div>\n <a href=\"#general\" style={$url.hash == \"#general\" && \"color: var(--active);\"}>\n <GeneralIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"general\") || \"General\"}\n </a>\n <a href=\"#services\" style={$url.hash == \"#services\" && \"color: var(--active);\"}>\n <ServicesIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"services\") || \"Services\"}\n </a>\n <a href=\"https://libredirect.github.io\" target=\"_blank\" rel=\"noopener noreferrer\">\n <AboutIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"about\") || \"About\"}\n </a>\n</div>\n\n<style>\n div {\n display: flex;\n flex-direction: column;\n margin: 0 20px;\n }\n\n a {\n display: flex;\n align-items: center;\n font-size: 18px;\n text-decoration: none;\n color: var(--text);\n transition: 0.1s;\n margin: 10px;\n min-width: max-content;\n }\n\n a:hover {\n color: var(--active);\n }\n\n @media (max-width: 1250px) {\n div {\n flex-direction: row;\n justify-content: center;\n margin: 0;\n }\n }\n\n @media (max-width: 715px) {\n a {\n margin: 5px;\n }\n }\n\n :global(.margin) {\n margin-right: 5px;\n margin-left: 0;\n }\n :global(.margin_rtl) {\n margin-right: 0;\n margin-left: 5px;\n }\n</style>\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n return [':popover-open', ':modal'].some(selector => {\n try {\n return element.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return ['transform', 'translate', 'scale', 'rotate', 'perspective'].some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {\n if (ignoreScrollbarX === void 0) {\n ignoreScrollbarX = false;\n }\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect));\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","//@ts-ignore\nimport { arrow as arrowCore } from \"./core\";\nimport { autoUpdate as _autoUpdate, computePosition } from \"./dom/index.js\";\nimport { get } from \"svelte/store\";\nimport { onDestroy, tick } from 'svelte';\nexport function createFloatingActions(initOptions) {\n let referenceElement;\n let floatingElement;\n const defaultOptions = {\n autoUpdate: true\n };\n let options = initOptions;\n const getOptions = (mixin) => {\n return { ...defaultOptions, ...(initOptions || {}), ...(mixin || {}) };\n };\n const updatePosition = (updateOptions) => {\n if (referenceElement && floatingElement) {\n options = getOptions(updateOptions);\n computePosition(referenceElement, floatingElement, options)\n .then(v => {\n Object.assign(floatingElement.style, {\n position: v.strategy,\n left: `${v.x}px`,\n top: `${v.y}px`,\n });\n options?.onComputed && options.onComputed(v);\n });\n }\n };\n const referenceAction = node => {\n if ('subscribe' in node) {\n setupVirtualElementObserver(node);\n return {};\n }\n else {\n referenceElement = node;\n updatePosition();\n }\n };\n const contentAction = (node, contentOptions) => {\n let autoUpdateDestroy;\n floatingElement = node;\n options = getOptions(contentOptions);\n setTimeout(() => updatePosition(contentOptions), 0); //tick doesn't work\n updatePosition(contentOptions);\n const destroyAutoUpdate = () => {\n if (autoUpdateDestroy) {\n autoUpdateDestroy();\n autoUpdateDestroy = undefined;\n }\n };\n const initAutoUpdate = ({ autoUpdate } = options || {}) => {\n destroyAutoUpdate();\n if (autoUpdate !== false) {\n tick().then(() => {\n return _autoUpdate(referenceElement, floatingElement, () => updatePosition(options), (autoUpdate === true ? {} : autoUpdate));\n });\n }\n return;\n };\n autoUpdateDestroy = initAutoUpdate();\n return {\n update(contentOptions) {\n updatePosition(contentOptions);\n autoUpdateDestroy = initAutoUpdate(contentOptions);\n },\n destroy() {\n destroyAutoUpdate();\n }\n };\n };\n const setupVirtualElementObserver = (node) => {\n const unsubscribe = node.subscribe(($node) => {\n if (referenceElement === undefined) {\n referenceElement = $node;\n updatePosition();\n }\n else {\n // Preserve the reference to the virtual element.\n Object.assign(referenceElement, $node);\n updatePosition();\n }\n });\n onDestroy(unsubscribe);\n };\n return [\n referenceAction,\n contentAction,\n updatePosition\n ];\n}\nexport function arrow(options) {\n return {\n name: \"arrow\",\n options,\n fn(args) {\n const element = get(options.element);\n if (element) {\n return arrowCore({\n element,\n padding: options.padding\n }).fn(args);\n }\n return {};\n }\n };\n}\n","export default function filter({\n loadOptions,\n filterText,\n items,\n multiple,\n value,\n itemId,\n groupBy,\n filterSelectedItems,\n itemFilter,\n convertStringItemsToObjects,\n filterGroupedItems,\n label,\n}) {\n if (items && loadOptions) return items;\n if (!items) return [];\n\n if (items && items.length > 0 && typeof items[0] !== 'object') {\n items = convertStringItemsToObjects(items);\n }\n\n let filterResults = items.filter((item) => {\n let matchesFilter = itemFilter(item[label], filterText, item);\n if (matchesFilter && multiple && value?.length) {\n matchesFilter = !value.some((x) => {\n return filterSelectedItems ? x[itemId] === item[itemId] : false;\n });\n }\n\n return matchesFilter;\n });\n\n if (groupBy) {\n filterResults = filterGroupedItems(filterResults);\n }\n\n return filterResults;\n}\n","export default async function getItems({ dispatch, loadOptions, convertStringItemsToObjects, filterText }) {\n let res = await loadOptions(filterText).catch((err) => {\n console.warn('svelte-select loadOptions error :>> ', err);\n dispatch('error', { type: 'loadOptions', details: err });\n });\n\n if (res && !res.cancelled) { \n if (res) {\n if (res && res.length > 0 && typeof res[0] !== 'object') {\n res = convertStringItemsToObjects(res);\n }\n \n dispatch('loaded', { items: res });\n } else {\n res = [];\n }\n\n return {\n filteredItems: res,\n loading: false,\n focused: true,\n listOpen: true,\n };\n }\n}\n","<svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 20 20\"\n focusable=\"false\"\n aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747\n 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0\n 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502\n 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0\n 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z\" />\n</svg>\n\n<style>\n svg {\n width: var(--chevron-icon-width, 20px);\n height: var(--chevron-icon-width, 20px);\n color: var(--chevron-icon-colour, currentColor);\n }\n</style>","<svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"-2 -2 50 50\"\n focusable=\"false\"\n aria-hidden=\"true\"\n role=\"presentation\"\n>\n <path\n fill=\"currentColor\"\n d=\"M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124\n l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z\"\n />\n</svg>\n\n<style>\n svg {\n width: var(--clear-icon-width, 20px);\n height: var(--clear-icon-width, 20px);\n color: var(--clear-icon-color, currentColor);\n }\n</style>","<svg class=\"loading\" viewBox=\"25 25 50 50\">\n <circle\n class=\"circle_path\"\n cx=\"50\"\n cy=\"50\"\n r=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"5\"\n stroke-miterlimit=\"10\" />\n</svg>\n\n<style>\n .loading {\n width: var(--spinner-width, 20px);\n height: var(--spinner-height, 20px);\n color: var(--spinner-color, var(--icons-color));\n animation: rotate 0.75s linear infinite;\n transform-origin: center center;\n transform: none;\n }\n\n .circle_path {\n stroke-dasharray: 90;\n stroke-linecap: round;\n }\n\n @keyframes rotate {\n 100% {\n transform: rotate(360deg);\n }\n }\n</style>","<script>\n import { beforeUpdate, createEventDispatcher, onDestroy, onMount } from 'svelte';\n import { offset, flip, shift } from 'svelte-floating-ui/dom';\n import { createFloatingActions } from 'svelte-floating-ui';\n\n const dispatch = createEventDispatcher();\n\n import _filter from './filter';\n import _getItems from './get-items';\n\n import ChevronIcon from './ChevronIcon.svelte';\n import ClearIcon from './ClearIcon.svelte';\n import LoadingIcon from './LoadingIcon.svelte';\n\n export let justValue = null; // read-only\n\n export let filter = _filter;\n export let getItems = _getItems;\n\n export let id = null;\n export let name = null;\n export let container = undefined;\n export let input = undefined;\n export let multiple = false;\n export let multiFullItemClearable = false;\n export let disabled = false;\n export let focused = false;\n export let value = null;\n export let filterText = '';\n export let placeholder = 'Please select';\n export let placeholderAlwaysShow = false;\n export let items = null;\n export let label = 'label';\n export let itemFilter = (label, filterText, option) => `${label}`.toLowerCase().includes(filterText.toLowerCase());\n export let groupBy = undefined;\n export let groupFilter = (groups) => groups;\n export let groupHeaderSelectable = false;\n export let itemId = 'value';\n export let loadOptions = undefined;\n export let containerStyles = '';\n export let hasError = false;\n export let filterSelectedItems = true;\n export let required = false;\n export let closeListOnChange = true;\n export let clearFilterTextOnBlur = true;\n\n export let createGroupHeaderItem = (groupValue, item) => {\n return {\n value: groupValue,\n [label]: groupValue,\n };\n };\n\n export const getFilteredItems = () => {\n return filteredItems;\n };\n\n export let searchable = true;\n export let inputStyles = '';\n export let clearable = true;\n export let loading = false;\n export let listOpen = false;\n\n let timeout;\n export let debounce = (fn, wait = 1) => {\n clearTimeout(timeout);\n timeout = setTimeout(fn, wait);\n };\n\n export let debounceWait = 300;\n export let hideEmptyState = false;\n export let inputAttributes = {};\n export let listAutoWidth = true;\n export let showChevron = false;\n export let listOffset = 5;\n export let hoverItemIndex = 0;\n export let floatingConfig = {};\n\n export { containerClasses as class };\n\n let containerClasses = '';\n let activeValue;\n let prev_value;\n let prev_filterText;\n let prev_multiple;\n\n function setValue() {\n if (typeof value === 'string') {\n let item = (items || []).find((item) => item[itemId] === value);\n value = item || {\n [itemId]: value,\n label: value,\n };\n } else if (multiple && Array.isArray(value) && value.length > 0) {\n value = value.map((item) => (typeof item === 'string' ? { value: item, label: item } : item));\n }\n }\n\n let _inputAttributes;\n function assignInputAttributes() {\n _inputAttributes = Object.assign(\n {\n autocapitalize: 'none',\n autocomplete: 'off',\n autocorrect: 'off',\n spellcheck: false,\n tabindex: 0,\n type: 'text',\n 'aria-autocomplete': 'list',\n },\n inputAttributes\n );\n\n if (id) {\n _inputAttributes['id'] = id;\n }\n\n if (!searchable) {\n _inputAttributes['readonly'] = true;\n }\n }\n\n function convertStringItemsToObjects(_items) {\n return _items.map((item, index) => {\n return {\n index,\n value: item,\n label: `${item}`,\n };\n });\n }\n\n function filterGroupedItems(_items) {\n const groupValues = [];\n const groups = {};\n\n _items.forEach((item) => {\n const groupValue = groupBy(item);\n\n if (!groupValues.includes(groupValue)) {\n groupValues.push(groupValue);\n groups[groupValue] = [];\n\n if (groupValue) {\n groups[groupValue].push(\n Object.assign(createGroupHeaderItem(groupValue, item), {\n id: groupValue,\n groupHeader: true,\n selectable: groupHeaderSelectable,\n })\n );\n }\n }\n\n groups[groupValue].push(Object.assign({ groupItem: !!groupValue }, item));\n });\n\n const sortedGroupedItems = [];\n\n groupFilter(groupValues).forEach((groupValue) => {\n if (groups[groupValue]) sortedGroupedItems.push(...groups[groupValue]);\n });\n\n return sortedGroupedItems;\n }\n\n function dispatchSelectedItem() {\n if (multiple) {\n if (JSON.stringify(value) !== JSON.stringify(prev_value)) {\n if (checkValueForDuplicates()) {\n dispatch('input', value);\n }\n }\n return;\n }\n\n if (!prev_value || JSON.stringify(value[itemId]) !== JSON.stringify(prev_value[itemId])) {\n dispatch('input', value);\n }\n }\n\n function setupMulti() {\n if (value) {\n if (Array.isArray(value)) {\n value = [...value];\n } else {\n value = [value];\n }\n }\n }\n\n function setupSingle() {\n if (value) value = null;\n }\n\n $: if ((items, value)) setValue();\n $: if (inputAttributes || !searchable) assignInputAttributes();\n $: if (multiple) setupMulti();\n $: if (prev_multiple && !multiple) setupSingle();\n $: if (multiple && value && value.length > 1) checkValueForDuplicates();\n $: if (value) dispatchSelectedItem();\n $: if (!value && multiple && prev_value) dispatch('input', value);\n $: if (!focused && input) closeList();\n $: if (filterText !== prev_filterText) setupFilterText();\n $: if (!multiple && listOpen && value && filteredItems) setValueIndexAsHoverIndex();\n $: dispatchHover(hoverItemIndex);\n\n function setValueIndexAsHoverIndex() {\n const valueIndex = filteredItems.findIndex((i) => {\n return i[itemId] === value[itemId];\n });\n\n checkHoverSelectable(valueIndex, true);\n }\n\n function dispatchHover(i) {\n dispatch('hoverItem', i);\n }\n\n function checkHoverSelectable(startingIndex = 0, ignoreGroup) {\n hoverItemIndex = startingIndex < 0 ? 0 : startingIndex;\n if (!ignoreGroup && groupBy && filteredItems[hoverItemIndex] && !filteredItems[hoverItemIndex].selectable) {\n setHoverIndex(1);\n }\n }\n\n function setupFilterText() {\n if (!loadOptions && filterText.length === 0) return;\n\n if (loadOptions) {\n debounce(async function () {\n loading = true;\n let res = await getItems({\n dispatch,\n loadOptions,\n convertStringItemsToObjects,\n filterText,\n });\n\n if (res) {\n loading = res.loading;\n listOpen = listOpen ? res.listOpen : filterText.length > 0 ? true : false;\n focused = listOpen && res.focused;\n items = groupBy ? filterGroupedItems(res.filteredItems) : res.filteredItems;\n } else {\n loading = false;\n focused = true;\n listOpen = true;\n }\n }, debounceWait);\n } else {\n listOpen = true;\n\n if (multiple) {\n activeValue = undefined;\n }\n }\n }\n\n $: hasValue = multiple ? value && value.length > 0 : value;\n $: hideSelectedItem = hasValue && filterText.length > 0;\n $: showClear = hasValue && clearable && !disabled && !loading;\n $: placeholderText =\n placeholderAlwaysShow && multiple\n ? placeholder\n : multiple && value?.length === 0\n ? placeholder\n : value\n ? ''\n : placeholder;\n $: ariaSelection = value ? handleAriaSelection(multiple) : '';\n $: ariaContext = handleAriaContent({ filteredItems, hoverItemIndex, focused, listOpen });\n $: updateValueDisplay(items);\n $: justValue = computeJustValue(multiple, value, itemId);\n $: if (!multiple && prev_value && !value) dispatch('input', value);\n $: filteredItems = filter({\n loadOptions,\n filterText,\n items,\n multiple,\n value,\n itemId,\n groupBy,\n label,\n filterSelectedItems,\n itemFilter,\n convertStringItemsToObjects,\n filterGroupedItems,\n });\n $: if (listOpen && filteredItems && !multiple && !value) checkHoverSelectable();\n $: handleFilterEvent(filteredItems);\n $: if (container && floatingConfig) floatingUpdate(Object.assign(_floatingConfig, floatingConfig));\n $: listDom = !!list;\n $: listMounted(list, listOpen);\n $: if (listOpen && container && list) setListWidth();\n $: scrollToHoverItem = hoverItemIndex;\n $: if (listOpen && multiple) hoverItemIndex = 0;\n $: if (input && listOpen && !focused) handleFocus();\n $: if (filterText) hoverItemIndex = 0;\n\n function handleFilterEvent(items) {\n if (listOpen) dispatch('filter', items);\n }\n\n beforeUpdate(async () => {\n prev_value = value;\n prev_filterText = filterText;\n prev_multiple = multiple;\n });\n\n function computeJustValue() {\n if (multiple) return value ? value.map((item) => item[itemId]) : null;\n return value ? value[itemId] : value;\n }\n\n function checkValueForDuplicates() {\n let noDuplicates = true;\n if (value) {\n const ids = [];\n const uniqueValues = [];\n\n value.forEach((val) => {\n if (!ids.includes(val[itemId])) {\n ids.push(val[itemId]);\n uniqueValues.push(val);\n } else {\n noDuplicates = false;\n }\n });\n\n if (!noDuplicates) value = uniqueValues;\n }\n return noDuplicates;\n }\n\n function findItem(selection) {\n let matchTo = selection ? selection[itemId] : value[itemId];\n return items.find((item) => item[itemId] === matchTo);\n }\n\n function updateValueDisplay(items) {\n if (!items || items.length === 0 || items.some((item) => typeof item !== 'object')) return;\n if (!value || (multiple ? value.some((selection) => !selection || !selection[itemId]) : !value[itemId])) return;\n\n if (Array.isArray(value)) {\n value = value.map((selection) => findItem(selection) || selection);\n } else {\n value = findItem() || value;\n }\n }\n\n async function handleMultiItemClear(i) {\n const itemToRemove = value[i];\n\n if (value.length === 1) {\n value = undefined;\n } else {\n value = value.filter((item) => {\n return item !== itemToRemove;\n });\n }\n\n dispatch('clear', itemToRemove);\n }\n\n function handleKeyDown(e) {\n if (!focused) return;\n e.stopPropagation();\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n closeList();\n break;\n case 'Enter':\n e.preventDefault();\n\n if (listOpen) {\n if (filteredItems.length === 0) break;\n const hoverItem = filteredItems[hoverItemIndex];\n\n if (value && !multiple && value[itemId] === hoverItem[itemId]) {\n closeList();\n break;\n } else {\n handleSelect(filteredItems[hoverItemIndex]);\n }\n }\n\n break;\n case 'ArrowDown':\n e.preventDefault();\n\n if (listOpen) {\n setHoverIndex(1);\n } else {\n listOpen = true;\n activeValue = undefined;\n }\n\n break;\n case 'ArrowUp':\n e.preventDefault();\n\n if (listOpen) {\n setHoverIndex(-1);\n } else {\n listOpen = true;\n activeValue = undefined;\n }\n\n break;\n case 'Tab':\n if (listOpen && focused) {\n if (\n filteredItems.length === 0 ||\n (value && value[itemId] === filteredItems[hoverItemIndex][itemId])\n )\n return closeList();\n\n e.preventDefault();\n handleSelect(filteredItems[hoverItemIndex]);\n closeList();\n }\n\n break;\n case 'Backspace':\n if (!multiple || filterText.length > 0) return;\n\n if (multiple && value && value.length > 0) {\n handleMultiItemClear(activeValue !== undefined ? activeValue : value.length - 1);\n if (activeValue === 0 || activeValue === undefined) break;\n activeValue = value.length > activeValue ? activeValue - 1 : undefined;\n }\n\n break;\n case 'ArrowLeft':\n if (!value || !multiple || filterText.length > 0) return;\n if (activeValue === undefined) {\n activeValue = value.length - 1;\n } else if (value.length > activeValue && activeValue !== 0) {\n activeValue -= 1;\n }\n break;\n case 'ArrowRight':\n if (!value || !multiple || filterText.length > 0 || activeValue === undefined) return;\n if (activeValue === value.length - 1) {\n activeValue = undefined;\n } else if (activeValue < value.length - 1) {\n activeValue += 1;\n }\n break;\n }\n }\n\n function handleFocus(e) {\n if (focused && input === document?.activeElement) return;\n if (e) dispatch('focus', e);\n input?.focus();\n focused = true;\n }\n\n async function handleBlur(e) {\n if (isScrolling) return;\n if (listOpen || focused) {\n dispatch('blur', e);\n closeList();\n focused = false;\n activeValue = undefined;\n input?.blur();\n }\n }\n\n function handleClick() {\n if (disabled) return;\n if (filterText.length > 0) return listOpen = true;\n listOpen = !listOpen;\n }\n\n export function handleClear() {\n dispatch('clear', value);\n value = undefined;\n closeList();\n handleFocus();\n }\n\n onMount(() => {\n if (listOpen) focused = true;\n if (focused && input) input.focus();\n });\n\n function itemSelected(selection) {\n if (selection) {\n filterText = '';\n const item = Object.assign({}, selection);\n\n if (item.groupHeader && !item.selectable) return;\n value = multiple ? (value ? value.concat([item]) : [item]) : (value = item);\n\n setTimeout(() => {\n if (closeListOnChange) closeList();\n activeValue = undefined;\n dispatch('change', value);\n dispatch('select', selection);\n });\n }\n }\n\n function closeList() {\n if (clearFilterTextOnBlur) {\n filterText = '';\n }\n listOpen = false;\n }\n\n export let ariaValues = (values) => {\n return `Option ${values}, selected.`;\n };\n\n export let ariaListOpen = (label, count) => {\n return `You are currently focused on option ${label}. There are ${count} results available.`;\n };\n\n export let ariaFocused = () => {\n return `Select is focused, type to refine list, press down to open the menu.`;\n };\n\n function handleAriaSelection(_multiple) {\n let selected = undefined;\n\n if (_multiple && value.length > 0) {\n selected = value.map((v) => v[label]).join(', ');\n } else {\n selected = value[label];\n }\n\n return ariaValues(selected);\n }\n\n function handleAriaContent() {\n if (!filteredItems || filteredItems.length === 0) return '';\n let _item = filteredItems[hoverItemIndex];\n if (listOpen && _item) {\n let count = filteredItems ? filteredItems.length : 0;\n return ariaListOpen(_item[label], count);\n } else {\n return ariaFocused();\n }\n }\n\n let list = null;\n\n let isScrollingTimer;\n function handleListScroll() {\n clearTimeout(isScrollingTimer);\n isScrollingTimer = setTimeout(() => {\n isScrolling = false;\n }, 100);\n }\n\n function handleClickOutside(event) {\n if (!listOpen && !focused && container && !container.contains(event.target) && !list?.contains(event.target)) {\n handleBlur();\n }\n }\n\n onDestroy(() => {\n list?.remove();\n });\n\n let isScrolling = false;\n\n function handleSelect(item) {\n if (!item || item.selectable === false) return;\n itemSelected(item);\n }\n\n function handleHover(i) {\n if (isScrolling) return;\n hoverItemIndex = i;\n }\n\n function handleItemClick(args) {\n const { item, i } = args;\n if (item?.selectable === false) return;\n if (value && !multiple && value[itemId] === item[itemId]) return closeList();\n if (isItemSelectable(item)) {\n hoverItemIndex = i;\n handleSelect(item);\n }\n }\n\n function setHoverIndex(increment) {\n let selectableFilteredItems = filteredItems.filter(\n (item) => !Object.hasOwn(item, 'selectable') || item.selectable === true\n );\n\n if (selectableFilteredItems.length === 0) {\n return (hoverItemIndex = 0);\n }\n\n if (increment > 0 && hoverItemIndex === filteredItems.length - 1) {\n hoverItemIndex = 0;\n } else if (increment < 0 && hoverItemIndex === 0) {\n hoverItemIndex = filteredItems.length - 1;\n } else {\n hoverItemIndex = hoverItemIndex + increment;\n }\n\n const hover = filteredItems[hoverItemIndex];\n\n if (hover && hover.selectable === false) {\n if (increment === 1 || increment === -1) setHoverIndex(increment);\n return;\n }\n }\n\n function isItemActive(item, value, itemId) {\n if (multiple) return;\n return value && value[itemId] === item[itemId];\n }\n\n function isItemFirst(itemIndex) {\n return itemIndex === 0;\n }\n\n function isItemSelectable(item) {\n return (item.groupHeader && item.selectable) || item.selectable || !item.hasOwnProperty('selectable');\n }\n\n const activeScroll = scrollAction;\n const hoverScroll = scrollAction;\n\n function scrollAction(node) {\n return {\n update(args) {\n if (args.scroll) {\n handleListScroll();\n node.scrollIntoView({ behavior: 'auto', block: 'nearest' });\n }\n },\n };\n }\n\n function setListWidth() {\n const { width } = container.getBoundingClientRect();\n list.style.width = listAutoWidth ? width + 'px' : 'auto';\n }\n\n let _floatingConfig = {\n strategy: 'absolute',\n placement: 'bottom-start',\n middleware: [offset(listOffset), flip(), shift()],\n autoUpdate: false,\n };\n\n const [floatingRef, floatingContent, floatingUpdate] = createFloatingActions(_floatingConfig);\n\n $: if (container && floatingConfig?.autoUpdate === undefined) {\n _floatingConfig.autoUpdate = true;\n }\n\n let prefloat = true;\n function listMounted(list, listOpen) {\n if (!list || !listOpen) return (prefloat = true);\n setTimeout(() => {\n prefloat = false;\n }, 0);\n }\n</script>\n\n<svelte:window on:click={handleClickOutside} on:keydown={handleKeyDown} />\n\n<div\n class=\"svelte-select {containerClasses}\"\n class:multi={multiple}\n class:disabled\n class:focused\n class:list-open={listOpen}\n class:show-chevron={showChevron}\n class:error={hasError}\n style={containerStyles}\n on:pointerup|preventDefault={handleClick}\n bind:this={container}\n use:floatingRef\n role=\"none\">\n {#if listOpen}\n <div\n use:floatingContent\n bind:this={list}\n class=\"svelte-select-list\"\n class:prefloat\n on:scroll={handleListScroll}\n on:pointerup|preventDefault|stopPropagation\n on:mousedown|preventDefault|stopPropagation\n\t\t\trole=\"none\">\n {#if $$slots['list-prepend']}<slot name=\"list-prepend\" />{/if}\n {#if $$slots.list}<slot name=\"list\" {filteredItems} />\n {:else if filteredItems.length > 0}\n {#each filteredItems as item, i}\n <div\n on:mouseover={() => handleHover(i)}\n on:focus={() => handleHover(i)}\n on:click|stopPropagation={() => handleItemClick({ item, i })}\n on:keydown|preventDefault|stopPropagation\n class=\"list-item\"\n tabindex=\"-1\"\n role=\"none\">\n <div\n use:activeScroll={{ scroll: isItemActive(item, value, itemId), listDom }}\n use:hoverScroll={{ scroll: scrollToHoverItem === i, listDom }}\n class=\"item\"\n class:list-group-title={item.groupHeader}\n class:active={isItemActive(item, value, itemId)}\n class:first={isItemFirst(i)}\n class:hover={hoverItemIndex === i}\n class:group-item={item.groupItem}\n class:not-selectable={item?.selectable === false}>\n <slot name=\"item\" {item} index={i}>\n {item?.[label]}\n </slot>\n </div>\n </div>\n {/each}\n {:else if !hideEmptyState}\n <slot name=\"empty\">\n <div class=\"empty\">No options</div>\n </slot>\n {/if}\n {#if $$slots['list-append']}<slot name=\"list-append\" />{/if}\n </div>\n {/if}\n\n <span aria-live=\"polite\" aria-atomic=\"false\" aria-relevant=\"additions text\" class=\"a11y-text\">\n {#if focused}\n <span id=\"aria-selection\">{ariaSelection}</span>\n <span id=\"aria-context\">\n {ariaContext}\n </span>\n {/if}\n </span>\n\n <div class=\"prepend\">\n <slot name=\"prepend\" />\n </div>\n\n <div class=\"value-container\">\n {#if hasValue}\n {#if multiple}\n {#each value as item, i}\n <div\n class=\"multi-item\"\n class:active={activeValue === i}\n class:disabled\n on:click|preventDefault={() => (multiFullItemClearable ? handleMultiItemClear(i) : {})}\n on:keydown|preventDefault|stopPropagation\n role=\"none\">\n <span class=\"multi-item-text\">\n <slot name=\"selection\" selection={item} index={i}>\n {item[label]}\n </slot>\n </span>\n\n {#if !disabled && !multiFullItemClearable && ClearIcon}\n <div\n class=\"multi-item-clear\"\n on:pointerup|preventDefault|stopPropagation={() => handleMultiItemClear(i)}>\n <slot name=\"multi-clear-icon\">\n <ClearIcon />\n </slot>\n </div>\n {/if}\n </div>\n {/each}\n {:else}\n <div class=\"selected-item\" class:hide-selected-item={hideSelectedItem}>\n <slot name=\"selection\" selection={value}>\n {value[label]}\n </slot>\n </div>\n {/if}\n {/if}\n\n <input\n on:keydown={handleKeyDown}\n on:blur={handleBlur}\n on:focus={handleFocus}\n readOnly={!searchable}\n {..._inputAttributes}\n bind:this={input}\n bind:value={filterText}\n placeholder={placeholderText}\n style={inputStyles}\n {disabled} />\n </div>\n\n <div class=\"indicators\">\n {#if loading}\n <div class=\"icon loading\" aria-hidden=\"true\">\n <slot name=\"loading-icon\">\n <LoadingIcon />\n </slot>\n </div>\n {/if}\n\n {#if showClear}\n <button type=\"button\" class=\"icon clear-select\" on:click={handleClear}>\n <slot name=\"clear-icon\">\n <ClearIcon />\n </slot>\n </button>\n {/if}\n\n {#if showChevron}\n <div class=\"icon chevron\" aria-hidden=\"true\">\n <slot name=\"chevron-icon\" {listOpen}>\n <ChevronIcon />\n </slot>\n </div>\n {/if}\n </div>\n\n <slot name=\"input-hidden\" {value}>\n <input {name} type=\"hidden\" value={value ? JSON.stringify(value) : null} />\n </slot>\n\n {#if required && (!value || value.length === 0)}\n <slot name=\"required\" {value}>\n <select class=\"required\" required tabindex=\"-1\" aria-hidden=\"true\" />\n </slot>\n {/if}\n</div>\n\n<style>\n .svelte-select {\n /* deprecating camelCase custom props in favour of kebab-case for v5 */\n --borderRadius: var(--border-radius);\n --clearSelectColor: var(--clear-select-color);\n --clearSelectWidth: var(--clear-select-width);\n --disabledBackground: var(--disabled-background);\n --disabledBorderColor: var(--disabled-border-color);\n --disabledColor: var(--disabled-color);\n --disabledPlaceholderColor: var(--disabled-placeholder-color);\n --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity);\n --errorBackground: var(--error-background);\n --errorBorder: var(--error-border);\n --groupItemPaddingLeft: var(--group-item-padding-left);\n --groupTitleColor: var(--group-title-color);\n --groupTitleFontSize: var(--group-title-font-size);\n --groupTitleFontWeight: var(--group-title-font-weight);\n --groupTitlePadding: var(--group-title-padding);\n --groupTitleTextTransform: var(--group-title-text-transform);\n --groupTitleBorderColor: var(--group-title-border-color);\n --groupTitleBorderWidth: var(--group-title-border-width);\n --groupTitleBorderStyle: var(--group-title-border-style);\n --indicatorColor: var(--chevron-color);\n --indicatorHeight: var(--chevron-height);\n --indicatorWidth: var(--chevron-width);\n --inputColor: var(--input-color);\n --inputLeft: var(--input-left);\n --inputLetterSpacing: var(--input-letter-spacing);\n --inputMargin: var(--input-margin);\n --inputPadding: var(--input-padding);\n --itemActiveBackground: var(--item-active-background);\n --itemColor: var(--item-color);\n --itemFirstBorderRadius: var(--item-first-border-radius);\n --itemHoverBG: var(--item-hover-bg);\n --itemHoverColor: var(--item-hover-color);\n --itemIsActiveBG: var(--item-is-active-bg);\n --itemIsActiveColor: var(--item-is-active-color);\n --itemIsNotSelectableColor: var(--item-is-not-selectable-color);\n --itemPadding: var(--item-padding);\n --listBackground: var(--list-background);\n --listBorder: var(--list-border);\n --listBorderRadius: var(--list-border-radius);\n --listEmptyColor: var(--list-empty-color);\n --listEmptyPadding: var(--list-empty-padding);\n --listEmptyTextAlign: var(--list-empty-text-align);\n --listMaxHeight: var(--list-max-height);\n --listPosition: var(--list-position);\n --listShadow: var(--list-shadow);\n --listZIndex: var(--list-z-index);\n --multiItemBG: var(--multi-item-bg);\n --multiItemBorderRadius: var(--multi-item-border-radius);\n --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg);\n --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color);\n --multiItemHeight: var(--multi-item-height);\n --multiItemMargin: var(--multi-item-margin);\n --multiItemPadding: var(--multi-item-padding);\n --multiSelectInputMargin: var(--multi-select-input-margin);\n --multiSelectInputPadding: var(--multi-select-input-padding);\n --multiSelectPadding: var(--multi-select-padding);\n --placeholderColor: var(--placeholder-color);\n --placeholderOpacity: var(--placeholder-opacity);\n --selectedItemPadding: var(--selected-item-padding);\n --spinnerColor: var(--spinner-color);\n --spinnerHeight: var(--spinner-height);\n --spinnerWidth: var(--spinner-width);\n\n --internal-padding: 0 0 0 16px;\n\n border: var(--border, 1px solid #d8dbdf);\n border-radius: var(--border-radius, 6px);\n min-height: var(--height, 42px);\n position: relative;\n display: flex;\n align-items: stretch;\n padding: var(--padding, var(--internal-padding));\n background: var(--background, #fff);\n margin: var(--margin, 0);\n width: var(--width, 100%);\n font-size: var(--font-size, 16px);\n max-height: var(--max-height);\n }\n\n * {\n box-sizing: var(--box-sizing, border-box);\n }\n\n .svelte-select:hover {\n border: var(--border-hover, 1px solid #b2b8bf);\n }\n\n .value-container {\n display: flex;\n flex: 1 1 0%;\n flex-wrap: wrap;\n align-items: center;\n gap: 5px 10px;\n padding: var(--value-container-padding, 5px 0);\n position: relative;\n overflow: var(--value-container-overflow, hidden);\n align-self: stretch;\n }\n\n .prepend,\n .indicators {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n }\n\n .indicators {\n position: var(--indicators-position);\n top: var(--indicators-top);\n right: var(--indicators-right);\n bottom: var(--indicators-bottom);\n }\n\n input {\n position: absolute;\n cursor: default;\n border: none;\n color: var(--input-color, var(--item-color));\n padding: var(--input-padding, 0);\n letter-spacing: var(--input-letter-spacing, inherit);\n margin: var(--input-margin, 0);\n min-width: 10px;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: transparent;\n font-size: var(--font-size, 16px);\n }\n\n :not(.multi) > .value-container > input {\n width: 100%;\n height: 100%;\n }\n\n input::placeholder {\n color: var(--placeholder-color, #78848f);\n opacity: var(--placeholder-opacity, 1);\n }\n\n input:focus {\n outline: none;\n }\n\n .svelte-select.focused {\n border: var(--border-focused, 1px solid #006fe8);\n border-radius: var(--border-radius-focused, var(--border-radius, 6px));\n }\n\n .disabled {\n background: var(--disabled-background, #ebedef);\n border-color: var(--disabled-border-color, #ebedef);\n color: var(--disabled-color, #c1c6cc);\n }\n\n .disabled input::placeholder {\n color: var(--disabled-placeholder-color, #c1c6cc);\n opacity: var(--disabled-placeholder-opacity, 1);\n }\n\n .selected-item {\n position: relative;\n overflow: var(--selected-item-overflow, hidden);\n padding: var(--selected-item-padding, 0 20px 0 0);\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--selected-item-color, inherit);\n font-size: var(--font-size, 16px);\n }\n\n .multi .selected-item {\n position: absolute;\n line-height: var(--height, 42px);\n height: var(--height, 42px);\n }\n\n .selected-item:focus {\n outline: none;\n }\n\n .hide-selected-item {\n opacity: 0;\n }\n\n .icon {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .clear-select {\n all: unset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--clear-select-width, 40px);\n height: var(--clear-select-height, 100%);\n color: var(--clear-select-color, var(--icons-color));\n margin: var(--clear-select-margin, 0);\n pointer-events: all;\n flex-shrink: 0;\n }\n\n .clear-select:focus {\n outline: var(--clear-select-focus-outline, 1px solid #006fe8);\n }\n\n .loading {\n width: var(--loading-width, 40px);\n height: var(--loading-height);\n color: var(--loading-color, var(--icons-color));\n margin: var(--loading--margin, 0);\n flex-shrink: 0;\n }\n\n .chevron {\n width: var(--chevron-width, 40px);\n height: var(--chevron-height, 40px);\n background: var(--chevron-background, transparent);\n pointer-events: var(--chevron-pointer-events, none);\n color: var(--chevron-color, var(--icons-color));\n border: var(--chevron-border, 0 0 0 1px solid #d8dbdf);\n flex-shrink: 0;\n }\n\n .multi {\n padding: var(--multi-select-padding, var(--internal-padding));\n }\n\n .multi input {\n padding: var(--multi-select-input-padding, 0);\n position: relative;\n margin: var(--multi-select-input-margin, 5px 0);\n flex: 1 1 40px;\n }\n\n .svelte-select.error {\n border: var(--error-border, 1px solid #ff2d55);\n background: var(--error-background, #fff);\n }\n\n .a11y-text {\n z-index: 9999;\n border: 0px;\n clip: rect(1px, 1px, 1px, 1px);\n height: 1px;\n width: 1px;\n position: absolute;\n overflow: hidden;\n padding: 0px;\n white-space: nowrap;\n }\n\n .multi-item {\n background: var(--multi-item-bg, #ebedef);\n margin: var(--multi-item-margin, 0);\n outline: var(--multi-item-outline, 1px solid #ddd);\n border-radius: var(--multi-item-border-radius, 4px);\n height: var(--multi-item-height, 25px);\n line-height: var(--multi-item-height, 25px);\n display: flex;\n cursor: default;\n padding: var(--multi-item-padding, 0 5px);\n overflow: hidden;\n gap: var(--multi-item-gap, 4px);\n outline-offset: -1px;\n max-width: var(--multi-max-width, none);\n color: var(--multi-item-color, var(--item-color));\n }\n\n .multi-item.disabled:hover {\n background: var(--multi-item-disabled-hover-bg, #ebedef);\n color: var(--multi-item-disabled-hover-color, #c1c6cc);\n }\n\n .multi-item-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .multi-item-clear {\n display: flex;\n align-items: center;\n justify-content: center;\n --clear-icon-color: var(--multi-item-clear-icon-color, #000);\n }\n\n .multi-item.active {\n outline: var(--multi-item-active-outline, 1px solid #006fe8);\n }\n\n .svelte-select-list {\n box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24));\n border-radius: var(--list-border-radius, 4px);\n max-height: var(--list-max-height, 252px);\n overflow-y: auto;\n background: var(--list-background, #fff);\n position: var(--list-position, absolute);\n z-index: var(--list-z-index, 2);\n border: var(--list-border);\n }\n\n .prefloat {\n opacity: 0;\n pointer-events: none;\n }\n\n .list-group-title {\n color: var(--group-title-color, #8f8f8f);\n cursor: default;\n font-size: var(--group-title-font-size, 16px);\n font-weight: var(--group-title-font-weight, 600);\n height: var(--height, 42px);\n line-height: var(--height, 42px);\n padding: var(--group-title-padding, 0 20px);\n text-overflow: ellipsis;\n overflow-x: hidden;\n white-space: nowrap;\n text-transform: var(--group-title-text-transform, uppercase);\n border-width: var(--group-title-border-width, medium);\n border-style: var(--group-title-border-style, none);\n border-color: var(--group-title-border-color, color);\n }\n\n .empty {\n text-align: var(--list-empty-text-align, center);\n padding: var(--list-empty-padding, 20px 0);\n color: var(--list-empty-color, #78848f);\n }\n\n .item {\n cursor: default;\n height: var(--item-height, var(--height, 42px));\n line-height: var(--item-line-height, var(--height, 42px));\n padding: var(--item-padding, 0 20px);\n color: var(--item-color, inherit);\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n transition: var(--item-transition, all 0.2s);\n align-items: center;\n width: 100%;\n }\n\n .item.group-item {\n padding-left: var(--group-item-padding-left, 40px);\n }\n\n .item:active {\n background: var(--item-active-background, #b9daff);\n }\n\n .item.active {\n background: var(--item-is-active-bg, #007aff);\n color: var(--item-is-active-color, #fff);\n }\n\n .item.first {\n border-radius: var(--item-first-border-radius, 4px 4px 0 0);\n }\n\n .item.hover:not(.active) {\n background: var(--item-hover-bg, #e7f2ff);\n color: var(--item-hover-color, inherit);\n }\n\n .item.not-selectable,\n .item.hover.item.not-selectable,\n .item.active.item.not-selectable,\n .item.not-selectable:active {\n color: var(--item-is-not-selectable-color, #999);\n background: transparent;\n }\n\n .required {\n opacity: 0;\n z-index: -1;\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n }\n</style>\n","<script>\n import { onDestroy } from \"svelte\"\n export let details\n export let selectedService\n import { config, options } from \"../stores\"\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n let theme\n $: if (_options) {\n if (_options.theme == \"dark\") {\n theme = \"dark\"\n } else if (_options.theme == \"light\") {\n theme = \"light\"\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n theme = \"dark\"\n } else {\n theme = \"light\"\n }\n }\n $: imageType = _config.services[selectedService].frontends[details.value].imageType\n</script>\n\n{#if imageType}\n {#if imageType == \"svgMono\"}\n {#if theme == \"dark\"}\n <img src={`/assets/images/${details.value}-icon-light.svg`} alt={details.label} />\n {:else}\n <img src={`/assets/images/${details.value}-icon.svg`} alt={details.label} />\n {/if}\n {:else}\n <img src={`/assets/images/${details.value}-icon.${imageType}`} alt={details.label} />\n {/if}\n{/if}\n","<script>\n const browser = window.browser || window.chrome\n\n import { onDestroy } from \"svelte\"\n import SvelteSelect from \"svelte-select\"\n import { options, config } from \"../stores\"\n import Row from \"../../components/Row.svelte\"\n import Label from \"../../components/Label.svelte\"\n import FrontendIcon from \"./FrontendIcon.svelte\"\n import Select from \"../../components/Select.svelte\"\n\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n export let selectedService\n\n $: serviceConf = _config.services[selectedService]\n $: serviceOptions = _options[selectedService]\n $: frontendName = _options[selectedService].frontend\n\n let values\n $: if (serviceConf.frontends[frontendName].embeddable) {\n values = [\n { value: \"both\", name: browser.i18n.getMessage(\"both\") || \"Both\" },\n { value: \"sub_frame\", name: browser.i18n.getMessage(\"onlyEmbedded\") || \"Only Embedded\" },\n { value: \"main_frame\", name: browser.i18n.getMessage(\"onlyNotEmbedded\") || \"Only Not Embedded\" },\n ]\n } else if (\n serviceConf.frontends[frontendName].desktopApp &&\n Object.values(serviceConf.frontends).some(frontend => frontend.embeddable)\n ) {\n values = [\n { value: \"both\", name: browser.i18n.getMessage(\"both\") || \"Both\" },\n { value: \"main_frame\", name: browser.i18n.getMessage(\"onlyNotEmbedded\") || \"Only Not Embedded\" },\n ]\n if (serviceOptions.redirectType == \"sub_frame\") {\n serviceOptions.redirectType = \"main_frame\"\n options.set(_options)\n }\n } else {\n values = [{ value: \"main_frame\", name: browser.i18n.getMessage(\"onlyNotEmbedded\") || \"Only Not Embedded\" }]\n serviceOptions.redirectType = \"main_frame\"\n options.set(_options)\n }\n\n let embeddableFrontends = []\n $: if (serviceConf) {\n embeddableFrontends = []\n for (const [frontendId, frontendConf] of Object.entries(serviceConf.frontends)) {\n if (frontendConf.embeddable && frontendConf.instanceList) {\n embeddableFrontends.push({\n value: frontendId,\n label: frontendConf.name,\n })\n }\n }\n }\n</script>\n\n<Row>\n <Label>{browser.i18n.getMessage(\"redirectType\") || \"Redirect Type\"}</Label>\n <Select\n value={serviceOptions.redirectType}\n onChange={e => {\n serviceOptions.redirectType = e.target.options[e.target.options.selectedIndex].value\n options.set(_options)\n }}\n {values}\n />\n</Row>\n\n{#if serviceConf.frontends[frontendName].desktopApp && serviceOptions.redirectType != \"main_frame\"}\n <Row>\n <Label>{browser.i18n.getMessage(\"embedFrontend\") || \"Embed Frontend\"}</Label>\n <SvelteSelect\n clearable={false}\n class=\"svelte_select\"\n value={serviceOptions.embedFrontend}\n on:change={e => {\n serviceOptions.embedFrontend = e.detail.value\n options.set(_options)\n }}\n items={embeddableFrontends}\n >\n <div class=\"slot\" slot=\"item\" let:item>\n <FrontendIcon details={item} {selectedService} />\n {item.label}\n </div>\n <div class=\"slot\" slot=\"selection\" let:selection>\n <FrontendIcon details={selection} {selectedService} />\n {selection.label}\n </div>\n </SvelteSelect>\n </Row>\n{/if}\n","<svg\n {...$$restProps}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"20px\"\n viewBox=\"0 0 24 24\"\n width=\"20px\"\n fill=\"currentColor\"\n>\n <path\n d=\"M10.45 15.5q.6.6 1.55.587.95-.012 1.4-.687L19 7l-8.4 5.6q-.675.45-.712 1.375-.038.925.562 1.525ZM12 4q1.475 0 2.838.412Q16.2 4.825 17.4 5.65l-1.9 1.2q-.825-.425-1.712-.637Q12.9 6 12 6 8.675 6 6.338 8.337 4 10.675 4 14q0 1.05.287 2.075Q4.575 17.1 5.1 18h13.8q.575-.95.838-1.975Q20 15 20 13.9q0-.9-.212-1.75-.213-.85-.638-1.65l1.2-1.9q.75 1.175 1.188 2.5.437 1.325.462 2.75.025 1.425-.325 2.725-.35 1.3-1.025 2.475-.275.45-.75.7-.475.25-1 .25H5.1q-.525 0-1-.25t-.75-.7q-.65-1.125-1-2.387Q2 15.4 2 14q0-2.075.788-3.888.787-1.812 2.15-3.175Q6.3 5.575 8.125 4.787 9.95 4 12 4Zm.175 7.825Z\"\n /></svg\n>\n","<svg\n {...$$restProps}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"20px\"\n viewBox=\"0 -960 960 960\"\n width=\"20px\"\n fill=\"currentColor\"\n ><path\n d=\"M144-144v-178l342-342-54-53 51-51 72 72 110.22-110.22q4.45-4.45 11.11-7.11Q683-816 691-816t15 2.5q7 2.5 12 7.5l87 88q4.55 5.83 7.27 12.64 2.73 6.8 2.73 14.58t-2.66 14.44q-2.67 6.66-7.11 11.1L696-556l72 73-51 51-54-54-341 342H144Zm72-72h76l320-320-75-76-321 320v76Zm424-385 90-91-38-39-91 90 39 40Zm0 0-39-40 39 40Z\"\n /></svg\n>\n","<script>\n const browser = window.browser || window.chrome\n\n import Button from \"../../components/Button.svelte\"\n import AddIcon from \"../../icons/AddIcon.svelte\"\n import { options, config } from \"../stores\"\n import PingIcon from \"../../icons/PingIcon.svelte\"\n import AutoPickIcon from \"../../icons/AutoPickIcon.svelte\"\n import Row from \"../../components/Row.svelte\"\n import Input from \"../../components/Input.svelte\"\n import Label from \"../../components/Label.svelte\"\n import CloseIcon from \"../../icons/CloseIcon.svelte\"\n import { onDestroy, onMount } from \"svelte\"\n import utils from \"../../../assets/javascripts/utils\"\n\n export let selectedService\n export let selectedFrontend\n\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n let blacklist\n let redirects\n\n $: serviceConf = _config.services[selectedService]\n\n let allInstances = []\n\n $: {\n allInstances = []\n if (_options[selectedFrontend]) allInstances.push(..._options[selectedFrontend])\n if (redirects && redirects[selectedFrontend]) {\n allInstances.push(...redirects[selectedFrontend][\"clearnet\"])\n }\n allInstances = [...new Set(allInstances)]\n }\n\n let pingCache\n $: {\n if (pingCache) browser.storage.local.set({ pingCache })\n }\n\n function isCustomInstance(instance) {\n if (redirects[selectedFrontend]) {\n for (const network in redirects[selectedFrontend]) {\n if (redirects[selectedFrontend][network].includes(instance)) return false\n }\n }\n return true\n }\n\n function colorTime(time) {\n let value\n let color\n if (time < 5000) {\n value = `${time}ms`\n if (time <= 1000) color = \"green\"\n else if (time <= 2000) color = \"orange\"\n } else if (time >= 5000) {\n color = \"red\"\n if (time == 5000) value = \"5000ms+\"\n if (time > 5000) value = `Error: ${time - 5000}`\n } else {\n color = \"red\"\n value = \"Server not found\"\n }\n return { color, value }\n }\n\n onMount(async () => {\n blacklist = await utils.getBlacklist(_options)\n redirects = await utils.getList(_options)\n pingCache = await utils.getPingCache()\n })\n\n let addInstanceValue\n function addInstance() {\n const instance = utils.protocolHost(new URL(addInstanceValue))\n if (!_options[selectedFrontend].includes(instance)) {\n _options[selectedFrontend].push(instance)\n addInstanceValue = \"\"\n options.set(_options)\n }\n }\n\n let autoPicking = false\n let pinging = false\n</script>\n\n{#if serviceConf.frontends[selectedFrontend].instanceList && redirects && blacklist}\n <hr />\n\n <div>\n <Button\n on:click={async () => {\n pinging = true\n pingCache = {}\n await Promise.allSettled(\n allInstances.map(async (instance) => {\n pingCache[instance] = { color: \"lightblue\", value: \"pinging...\" }\n const time = await utils.ping(instance)\n pingCache[instance] = colorTime(time)\n })\n )\n pinging = false\n }}\n disabled={pinging}\n >\n <PingIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"pingInstances\") || \"Ping Instances\"}\n </Button>\n <Button\n on:click={async () => {\n autoPicking = true\n const clearnet = redirects[selectedFrontend][\"clearnet\"]\n for (const instance of _options[selectedFrontend]) {\n const i = clearnet.indexOf(instance)\n if (i >= 0) clearnet.splice(i, 1)\n }\n const instance = await utils.autoPickInstance(clearnet)\n _options[selectedFrontend].push(instance)\n options.set(_options)\n autoPicking = false\n }}\n disabled={autoPicking}\n >\n <AutoPickIcon class=\"margin margin_{document.body.dir}\" />\n {browser.i18n.getMessage(\"autoPickInstance\") || \"Auto Pick Instance\"}\n </Button>\n </div>\n\n <Row>\n <Label>{browser.i18n.getMessage(\"addYourFavoriteInstances\") || \"Add your favorite instances\"}</Label>\n <button\n on:click={() => {\n if (_options[selectedFrontend]) {\n _options[selectedFrontend] = []\n options.set(_options)\n }\n }}\n class=\"add\"\n title=\"Remove All Instances\"\n >\n <CloseIcon style=\"color: var(--active);\" />\n </button>\n </Row>\n <div dir=\"ltr\">\n <Row>\n <Input\n bind:value={addInstanceValue}\n type=\"url\"\n placeholder=\"https://instance.com\"\n title=\"Add instance input\"\n on:keydown={e => e.key === \"Enter\" && addInstance()}\n />\n <button on:click={addInstance} class=\"add\" title=\"Add the instance\">\n <AddIcon />\n </button>\n </Row>\n\n {#each _options[selectedFrontend] as instance}\n <Row>\n <span>\n <a href={instance} target=\"_blank\" rel=\"noopener noreferrer\">{instance}</a>\n {#if isCustomInstance(instance)}\n <span style=\"color:grey\">custom</span>\n {/if}\n {#if pingCache && pingCache[instance]}\n <span style=\"color:{pingCache[instance].color}\">{pingCache[instance].value}</span>\n {/if}\n </span>\n <button\n class=\"add\"\n title=\"Remove Instance\"\n on:click={() => {\n const index = _options[selectedFrontend].indexOf(instance)\n if (index > -1) {\n _options[selectedFrontend].splice(index, 1)\n options.set(_options)\n }\n }}\n >\n <CloseIcon />\n </button>\n </Row>\n <hr />\n {/each}\n\n {#if redirects !== \"disabled\" && blacklist !== \"disabled\"}\n {#if redirects[selectedFrontend] && redirects[selectedFrontend][\"clearnet\"]}\n {#each Object.entries(_config.networks) as [networkName, network]}\n {#if redirects[selectedFrontend] && redirects[selectedFrontend][networkName] && redirects[selectedFrontend][networkName].length > 0}\n <Row></Row>\n <Row>\n <Label>{network.name}</Label>\n <button\n on:click={() => {\n if (_options[selectedFrontend]) {\n for (const instance of redirects[selectedFrontend][networkName]) {\n if (!_options[selectedFrontend].includes(instance)) _options[selectedFrontend].push(instance)\n }\n options.set(_options)\n }\n }}\n class=\"add\"\n title=\"Add All Instances\"\n >\n <AddIcon style=\"color: var(--active);\" />\n </button>\n </Row>\n <hr />\n {#each redirects[selectedFrontend][networkName] as instance}\n <Row>\n <span>\n <a href={instance} target=\"_blank\" rel=\"noopener noreferrer\">{instance}</a>\n {#if blacklist.cloudflare.includes(instance)}\n <a\n href=\"https://libredirect.github.io/docs.html#instances\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style=\"color:red;\"\n >\n cloudflare\n </a>\n {/if}\n {#if _options[selectedFrontend].includes(instance)}\n <span style=\"color:grey\">chosen</span>\n {/if}\n {#if pingCache && pingCache[instance]}\n <span style=\"color:{pingCache[instance].color}\">{pingCache[instance].value}</span>\n {/if}\n </span>\n {#if !_options[selectedFrontend].includes(instance)}\n <button\n class=\"add\"\n title=\"Add instance\"\n on:click={() => {\n if (_options[selectedFrontend]) {\n _options[selectedFrontend].push(instance)\n options.set(_options)\n }\n }}\n >\n <AddIcon />\n </button>\n {:else}\n <button\n class=\"add\"\n title=\"Remove Instance\"\n on:click={() => {\n const index = _options[selectedFrontend].indexOf(instance)\n if (index > -1) {\n _options[selectedFrontend].splice(index, 1)\n options.set(_options)\n }\n }}\n >\n <CloseIcon />\n </button>\n {/if}\n </Row>\n <hr />\n {/each}\n {/if}\n {/each}\n {:else}\n <Row><Label>No instances found.</Label></Row>\n {/if}\n {/if}\n </div>\n{/if}\n\n<style>\n .add {\n background-color: transparent;\n border: none;\n color: var(--text);\n padding: 0;\n margin: 0;\n text-decoration: none;\n display: inline-block;\n cursor: pointer;\n }\n\n a {\n color: var(--text);\n text-decoration: none;\n word-wrap: anywhere;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n :global(.margin) {\n margin-right: 10px;\n margin-left: 0;\n }\n :global(.margin_rtl) {\n margin-right: 0;\n margin-left: 10px;\n }\n</style>\n","<script>\n import { onDestroy } from \"svelte\"\n export let details\n import { config, options } from \"../stores\"\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n let theme\n $: if (_options) {\n if (_options.theme == \"dark\") {\n theme = \"dark\"\n } else if (_options.theme == \"light\") {\n theme = \"light\"\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n theme = \"dark\"\n } else {\n theme = \"light\"\n }\n }\n $: imageType = _config.services[details.value].imageType\n</script>\n\n{#if imageType}\n {#if imageType == \"svgMono\"}\n {#if theme == \"dark\"}\n <img src={`/assets/images/${details.value}-icon-light.svg`} alt={details.label} />\n {:else}\n <img src={`/assets/images/${details.value}-icon.svg`} alt={details.label} />\n {/if}\n {:else}\n <img src={`/assets/images/${details.value}-icon.${imageType}`} alt={details.label} />\n {/if}\n{/if}\n","<script>\n const browser = window.browser || window.chrome\n\n import url from \"../url\"\n import Row from \"../../components/Row.svelte\"\n import Label from \"../../components/Label.svelte\"\n import Select from \"../../components/Select.svelte\"\n import { options, config } from \"../stores\"\n import RedirectType from \"./RedirectType.svelte\"\n import { onDestroy } from \"svelte\"\n import Instances from \"./Instances.svelte\"\n import SvelteSelect from \"svelte-select\"\n import ServiceIcon from \"./ServiceIcon.svelte\"\n import FrontendIcon from \"./FrontendIcon.svelte\"\n import Checkbox from \"../../components/Checkbox.svelte\"\n\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n let selectedService = $url.hash.startsWith(\"#services:\") ? $url.hash.split(\":\")[1] : \"youtube\"\n let hideServiceSelection = false\n let hideFrontendSelection = false\n $: serviceConf = _config.services[selectedService]\n $: serviceOptions = _options[selectedService]\n $: frontendWebsite = serviceConf.frontends[serviceOptions.frontend].url\n $: servicesEntries = Object.entries(_config.services)\n $: frontendEntries = Object.entries(serviceConf.frontends)\n</script>\n\n<div>\n <Row>\n <Label>\n <a href={serviceConf.url} style=\"text-decoration: underline;\" target=\"_blank\" rel=\"noopener noreferrer\">\n {browser.i18n.getMessage(\"service\") || \"Service\"}\n </a>\n </Label>\n <div dir=\"ltr\" on:click={() => (hideServiceSelection = true)} on:keydown={null}>\n <SvelteSelect\n clearable={false}\n class=\"svelte_select\"\n value={selectedService}\n showChevron\n on:change={e => {\n selectedService = e.detail.value\n window.location.hash = `services:${e.detail.value}`\n hideServiceSelection = false\n }}\n on:pointerup={() => (hideServiceSelection = false)}\n on:focus={() => (hideServiceSelection = true)}\n on:blur={() => (hideServiceSelection = false)}\n items={[\n ...servicesEntries.map(([serviceKey, service]) => {\n return { value: serviceKey, label: service.name }\n }),\n ]}\n >\n <div class={\"slot \" + (!_options[item.value].enabled && \"disabled\")} slot=\"item\" let:item>\n <ServiceIcon details={item} />\n {item.label}\n </div>\n <div\n class={\"slot \" + (!_options[selection.value].enabled && !hideServiceSelection && \"disabled\")}\n slot=\"selection\"\n let:selection\n >\n {#if !hideServiceSelection}\n <ServiceIcon details={selection} />\n {selection.label}\n {:else}\n {browser.i18n.getMessage(\"searchService\") || \"Search Service\"}\n {/if}\n </div>\n <div style=\"font-size: 10px;\" slot=\"chevron-icon\">🮦</div>\n </SvelteSelect>\n </div>\n </Row>\n\n <hr />\n\n <Row>\n <Label>{browser.i18n.getMessage(\"enable\") || \"Enable\"}</Label>\n <Checkbox\n checked={serviceOptions.enabled}\n onChange={e => {\n serviceOptions.enabled = e.target.checked\n options.set(_options)\n }}\n />\n </Row>\n\n <Row>\n <Label>{browser.i18n.getMessage(\"showInPopup\") || \"Show in popup\"}</Label>\n <Checkbox\n checked={_options.popupServices.includes(selectedService)}\n onChange={e => {\n if (e.target.checked && !_options.popupServices.includes(selectedService)) {\n _options.popupServices.push(selectedService)\n } else if (_options.popupServices.includes(selectedService)) {\n const index = _options.popupServices.indexOf(selectedService)\n if (index !== -1) _options.popupServices.splice(index, 1)\n }\n options.set(_options)\n }}\n />\n </Row>\n\n <div style={!serviceOptions.enabled && \"pointer-events: none;opacity: 0.4;user-select: none;\"}>\n <Row>\n <Label>\n <a href={frontendWebsite} style=\"text-decoration: underline;\" target=\"_blank\" rel=\"noopener noreferrer\">\n {browser.i18n.getMessage(\"frontend\") || \"Frontend\"}\n </a>\n </Label>\n <div dir=\"ltr\" on:click={() => (hideFrontendSelection = true)} on:keydown={null}>\n <SvelteSelect\n clearable={false}\n dir=\"ltr\"\n class=\"svelte_select\"\n value={serviceOptions.frontend}\n showChevron\n on:change={e => {\n serviceOptions.frontend = e.detail.value\n options.set(_options)\n hideFrontendSelection = false\n }}\n on:pointerup={() => (hideServiceSelection = false)}\n on:focus={() => (hideFrontendSelection = true)}\n on:blur={() => (hideFrontendSelection = false)}\n items={[\n ...frontendEntries.map(([frontendId, frontend]) => ({\n value: frontendId,\n label: frontend.name,\n })),\n ]}\n >\n <div class=\"slot\" slot=\"item\" let:item>\n <FrontendIcon details={item} {selectedService} />\n {item.label}\n </div>\n <div class=\"slot\" slot=\"selection\" let:selection>\n {#if !hideFrontendSelection}\n <FrontendIcon details={selection} {selectedService} />\n {selection.label}\n {:else}\n {browser.i18n.getMessage(\"search_frontend\") || \"Search Frontend\"}\n {/if}\n </div>\n <div style=\"font-size: 10px;\" slot=\"chevron-icon\">🮦</div>\n </SvelteSelect>\n </div>\n </Row>\n\n <RedirectType {selectedService} />\n\n <Row>\n <Label>{browser.i18n.getMessage(\"unsupportedIframesHandling\") || \"Unsupported embeds handling\"}</Label>\n <Select\n value={serviceOptions.unsupportedUrls}\n onChange={e => {\n serviceOptions.unsupportedUrls = e.target.options[e.target.options.selectedIndex].value\n options.set(_options)\n }}\n values={[\n { value: \"bypass\", name: browser.i18n.getMessage(\"bypass\") || \"Bypass\" },\n { value: \"block\", name: browser.i18n.getMessage(\"block\") || \"Block\" },\n ]}\n />\n </Row>\n\n <div style={_options.redirectOnlyInIncognito && \"pointer-events: none;opacity: 0.4;user-select: none;\"}>\n <Row>\n <Label>{browser.i18n.getMessage(\"redirectOnlyInIncognito\") || \"Redirect Only in Incognito\"}</Label>\n <Checkbox\n checked={serviceOptions.redirectOnlyInIncognito}\n onChange={e => {\n serviceOptions.redirectOnlyInIncognito = e.target.checked\n options.set(_options)\n }}\n />\n </Row>\n </div>\n\n {#if selectedService == \"search\"}\n <Row>\n <Label>{browser.i18n.getMessage(\"redirectGoogle\") || \"Redirect Google\"}</Label>\n <Checkbox\n checked={serviceOptions.redirectGoogle}\n onChange={e => {\n serviceOptions.redirectGoogle = e.target.checked\n options.set(_options)\n }}\n />\n </Row>\n <Row>\n <Label>\n {@html browser.i18n.getMessage(\"searchHint\") ||\n `Set LibRedirect as Default Search Engine. For how to do in chromium browsers, click\n <a\n href=\"https://libredirect.github.io/docs.html#search_engine_chromium\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >here\n </a>.`}\n </Label>\n </Row>\n {/if}\n\n {#if selectedService == \"twitter\"}\n <Row>\n <Label>{browser.i18n.getMessage(\"disableTwimg\") || \"Disable twimg.com\"}</Label>\n <Checkbox\n checked={serviceOptions.disableTwimg}\n onChange={e => {\n serviceOptions.disableTwimg = e.target.checked\n options.set(_options)\n }}\n />\n </Row>\n {/if}\n\n <Instances\n {selectedService}\n selectedFrontend={!serviceConf.frontends[serviceOptions.frontend].desktopApp ||\n serviceOptions.redirectType == \"main_frame\"\n ? serviceOptions.frontend\n : serviceOptions.embedFrontend}\n />\n\n <Row></Row>\n </div>\n</div>\n\n<style>\n :global(.svelte_select) {\n font-weight: bold;\n --item-padding: 0 10px;\n --border: none;\n --border-hover: none;\n --border-focused: none;\n --width: 210px;\n --background: var(--bg-secondary);\n --list-background: var(--bg-secondary);\n --item-is-active-bg: grey;\n --item-hover-bg: grey;\n --item-is-active-color: var(--text);\n --list-max-height: 400px;\n --padding: 0 0 0 10px;\n --item-color: var(--text);\n --item-transition: none\n }\n :global(.svelte_select .slot) {\n display: flex;\n justify-content: start;\n align-items: center;\n }\n\n :global(.svelte_select img, .svelte_select svg) {\n margin-right: 10px;\n margin-left: 0;\n height: 26px;\n width: 26px;\n color: var(--text);\n }\n\n :global(.svelte_select .disabled) {\n opacity: 0.4;\n }\n</style>\n","<script>\n const browser = window.browser || window.chrome\n\n import General from \"./General/General.svelte\"\n import url from \"./url\"\n import utils from \"../../assets/javascripts/utils.js\"\n import { onDestroy } from \"svelte\"\n import servicesHelper from \"../../assets/javascripts/services.js\"\n import { onMount } from \"svelte\"\n import Sidebar from \"./Sidebar.svelte\"\n import { options, config } from \"./stores\"\n import Services from \"./Services/Services.svelte\"\n\n let _options\n const unsubscribeOptions = options.subscribe(val => {\n if (val) {\n _options = val\n browser.storage.local.set({ options: val })\n }\n })\n\n let _config\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n onMount(async () => {\n let opts = await utils.getOptions()\n if (!opts) {\n await servicesHelper.initDefaults()\n opts = await utils.getOptions()\n }\n options.set(opts)\n config.set(await utils.getConfig())\n })\n\n let style\n $: if (_options) style = utils.style(_options, window)\n\n const dir = [\"ar\", \"iw\", \"ku\", \"fa\", \"ur\"].includes(browser.i18n.getUILanguage()) ? \"rtl\" : \"ltr\"\n document.body.dir = dir\n</script>\n\n{#if _options && _config}\n <div class={dir} {dir} {style}>\n <Sidebar />\n {#if !$url.hash || $url.hash == \"#general\"}\n <General />\n {:else if $url.hash.startsWith(\"#services\")}\n <Services />\n {/if}\n </div>\n{:else}\n <p>Loading...</p>\n{/if}\n\n<style>\n :global(body) {\n width: 100vw;\n height: 100vh;\n margin: 0;\n padding: 0;\n }\n\n div {\n height: 100%;\n display: grid;\n grid-template-columns: min-content 800px;\n margin: 0;\n padding-top: 50px;\n justify-content: center;\n font-family: \"Inter\", sans-serif;\n box-sizing: border-box;\n font-size: 16px;\n background-color: var(--bg-main);\n color: var(--text);\n overflow: scroll;\n }\n\n @media (max-width: 1250px) {\n div {\n grid-template-columns: auto;\n grid-template-rows: min-content auto;\n padding-left: 5vw;\n padding-right: 5vw;\n }\n }\n\n @media (max-width: 715px) {\n div {\n font-size: 14px;\n grid-template-columns: auto;\n grid-template-rows: min-content auto;\n padding-left: 5vw;\n padding-right: 5vw;\n }\n }\n</style>\n","import App from \"./App.svelte\"\n\nconst app = new App({\n target: document.body,\n})\n\nexport default app\n"],"names":["noop","assign","tar","src","k","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","src_url_equal","element_src","url","document","createElement","href","subscribe","store","callbacks","unsub","unsubscribe","component_subscribe","component","callback","$$","on_destroy","push","create_slot","definition","ctx","$$scope","slot_ctx","get_slot_context","slice","get_slot_changes","dirty","lets","undefined","merged","len","Math","max","length","i","update_slot_base","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","p","get_all_dirty_from_scope","exclude_internal_props","props","result","compute_rest_props","keys","rest","Set","has","action_destroyer","action_result","destroy","append","target","node","appendChild","insert","anchor","insertBefore","detach","parentNode","removeChild","destroy_each","iterations","detaching","d","element","name","svg_element","createElementNS","text","data","createTextNode","space","empty","listen","event","handler","options","addEventListener","removeEventListener","prevent_default","preventDefault","call","this","stop_propagation","stopPropagation","attr","attribute","value","removeAttribute","getAttribute","setAttribute","always_set_through_set_attribute","set_attributes","attributes","descriptors","getOwnPropertyDescriptors","__proto__","key","style","cssText","set","indexOf","set_svg_attributes","set_data","set_input_value","input","set_style","important","removeProperty","setProperty","select_option","select","mounting","option","__value","selected","selectedIndex","toggle_class","toggle","classList","HtmlTag","constructor","is_svg","e","n","c","html","h","m","nodeName","nodeType","t","tagName","content","innerHTML","Array","from","childNodes","current_component","set_current_component","get_current_component","Error","onMount","on_mount","onDestroy","createEventDispatcher","type","detail","cancelable","bubbles","createEvent","initCustomEvent","custom_event","defaultPrevented","bubble","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","schedule_update","then","flush","add_render_callback","add_flush_callback","seen_callbacks","flushidx","saved_component","update","pop","add","clear","fragment","before_update","after_update","outroing","outros","group_outros","r","check_outros","transition_in","block","local","delete","transition_out","o","get_spread_update","levels","updates","to_null_out","accounted_for","bind","index","bound","create_component","mount_component","customElement","new_on_destroy","map","filter","destroy_component","filtered","targets","flush_render_callbacks","init","instance","create_fragment","not_equal","append_styles","parent_component","on_disconnect","context","Map","skip_bound","root","ready","ret","fill","make_dirty","hydrate","nodes","children","l","intro","SvelteComponent","$destroy","$on","splice","$set","$$props","obj","$$set","div","t_value","option_value_value","apply","arguments","values","onChange","ariaLabel","selected_option","querySelector","svg","path","span","subscriber_queue","writable","start","stop","subscribers","new_value","run_queue","subscriber","invalidate","size","derived","stores","initial_value","single","isArray","stores_array","auto","started","pending","cleanup","sync","unsubscribers","config","i18n","getMessage","button","t0","t0_value","hr","exceptions","regex","div1","div0","each_blocks","browser","window","chrome","_options","unsubscribeOptions","val","$$invalidate","unsubscribeConfig","inputType","inputValue","removeException","exception","addException","valid","test","includes","inputPlaceholder","button_levels","path0","path1","getRandomInstance","instances","random","pingOnce","async","http","XMLHttpRequest","timeout","ontimeout","onerror","onreadystatechange","readyState","status","ended","Date","getTime","abort","open","send","ping","time","average","parseInt","randomInstances","clearnet","randomInstance","floor","utils","getNextInstance","currentInstanceUrl","currentInstanceIndex","protocolHost","pathname","replace","host","endsWith","protocol","username","password","getList","fetchInstances","DONE","JSON","parse","responseText","getBlacklist","getConfig","fetch","response","json","getOptions","storage","get","getPingCache","pingCache","addressToLatLng","address","encodeURIComponent","coordinate","lat","lon","boundingbox","getQuery","query","searchParams","prefsEncoded","prefs","URLSearchParams","toString","convertMapCentre","zoom","reg","match","split","vars","dark","bgMain","bgSecondary","active","danger","lightGrey","light","theme","matchMedia","matches","cssVariables","autoPickInstance","findIndex","startsWith","pings","all","sort","isChrome","runtime","getBrowserInfo","service","frontend","services","frontends","regexArray","targetList","redirectGoogle","excludeTargets","disableTwimg","targetString","RegExp","redirect","originUrl","documentUrl","incognito","forceRedirection","redirectOnlyInIncognito","enabled","desktopApp","redirectType","embedFrontend","embeddable","unsupportedUrls","instanceList","localhost","origin","search","searchQuery","s","exec","hostname","subdomain","layers","mapCentre","mapCentreData","bbox","marker","travelModes","driving","walking","bicycling","transit","engine","regex1","regex2","decodeURIComponent","destination","route","placeRegex","mlat","mlon","wiki","urlpath","threadID","notExchangeRegex","hostSplit","hash","link","artist","directory","format","file","token","lang","substring","lastIndexOf","watch","id","extra","blogregex","blog_name","artReg","userReg","galleryReg","channelReg","rewrite","reverse","onChanged","addListener","defaultInstances","materialious","viewtube","piped","pipedMaterial","cloudtube","lightTube","poketube","proxiTok","offtiktok","redlib","eddrit","troddit","scribe","libMedium","small","freedium","quetre","libremdb","simplyTranslate","translite","mozhi","searxng","websurfx","rimgo","hyperpipe","osm","breezeWiki","neuters","dumb","intellectual","ruralDictionary","anonymousOverflow","suds","unfunny","soprano","meme","waybackClassic","tent","laboratory","binternet","painterest","pixivFe","liteXiv","pixivViewer","vixipy","indestructables","destructables","structables","safetwitch","twineo","proxigram","tuboYoutube","tuboSoundcloud","tekstoLibre","skyview","priviblur","nitter","pasted","pasty","freetar","ultimateTab","ratAintTieba","shoelace","skunkyArt","ytify","nerdsForNerds","ducksForDucks","koub","soundcloak","gocook","wikimore","libreTranslate","cryptPad","getDefaults","defaultOption","popupServices","servicesHelper","redirectAsync","computeServiceFrontend","initDefaults","processUpdate","defaults","optionName","subOptionName","defaultName","defaultValue","entries","serviceName","serviceValue","copyRaw","newUrl","copyFrom","textContent","body","execCommand","blur","navigator","clipboard","writeText","switchInstance","customService","instancesList","newInstance","isException","item","URL","t1_value","dir","importSettingsInput","importSettingsFiles","reader","FileReader","readAsText","onload","version","getManifest","alert","error","console","log","resultString","stringify","btoa","download","toISOString","click","$$value","files","checked","select_changes","checkbox_changes","if_block","create_if_block","bookmarksPermission","disableBookmarks","getPlatformInfo","os","permissions","contains","request","remove","ssrUrl","location","originalPushState","history","pushState","originalReplaceState","replaceState","updateHref","$href","createUrlStore","t4_value","t7_value","a0","a0_style_value","a1","a1_style_value","a2","current","min","round","createCoords","v","x","y","oppositeSideMap","left","right","bottom","top","oppositeAlignmentMap","end","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","getAlignmentAxis","getOppositeAlignmentPlacement","alignment","getOppositePlacement","side","rectToClientRect","rect","width","height","computeCoordsFromPlacement","_ref","rtl","reference","floating","sideAxis","alignmentAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","detectOverflow","state","_await$platform$isEle","platform","rects","elements","strategy","boundary","rootBoundary","elementContext","altBoundary","padding","paddingObject","expandPaddingObject","getPaddingObject","clippingClientRect","getClippingRect","isElement","contextElement","getDocumentElement","offsetParent","getOffsetParent","offsetScale","getScale","elementClientRect","convertOffsetParentRelativeRectToViewportRelativeRect","hasWindow","getNodeName","isNode","toLowerCase","getWindow","_node$ownerDocument","ownerDocument","defaultView","documentElement","Node","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","isOverflowElement","overflow","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","some","selector","isContainingBlock","elementOrCss","webkit","isWebKit","css","containerType","backdropFilter","willChange","contain","CSS","supports","isLastTraversableNode","getNodeScroll","scrollLeft","scrollTop","scrollX","scrollY","getParentNode","assignedSlot","getNearestOverflowAncestor","getOverflowAncestors","list","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","concat","visualViewport","parent","getPrototypeOf","getCssDimensions","parseFloat","hasOffset","offsetWidth","offsetHeight","shouldFallback","$","unwrapElement","domElement","getBoundingClientRect","Number","isFinite","noOffsets","getVisualOffsets","offsetLeft","offsetTop","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","isFixed","floatingOffsetParent","shouldAddVisualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","clientLeft","paddingLeft","clientTop","paddingTop","getWindowScrollBarX","leftScroll","getHTMLOffset","scroll","ignoreScrollbarX","htmlRect","getClientRectFromClippingAncestor","clippingAncestor","clientWidth","clientHeight","visualViewportBased","getViewportRect","scrollWidth","scrollHeight","direction","getDocumentRect","getInnerBoundingClientRect","hasFixedPositionAncestor","stopNode","position","getRectRelativeToOffsetParent","isOffsetParentAnElement","offsets","offsetRect","htmlOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","svgOffsetParent","currentNode","getContainingBlock","topLayer","elementClippingAncestors","cache","cachedResult","el","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingElementAncestors","_c","clippingAncestors","firstClippingAncestor","clippingRect","reduce","accRect","getElementRects","getOffsetParentFn","getDimensionsFn","getDimensions","floatingDimensions","getClientRects","isRTL","rectsAreEqual","autoUpdate","ancestorScroll","ancestorResize","elementResize","ResizeObserver","layoutShift","IntersectionObserver","animationFrame","referenceEl","ancestors","passive","cleanupIo","onMove","timeoutId","io","_io","clearTimeout","disconnect","refresh","skip","threshold","elementRectForRootMargin","rootMargin","isFirstUpdate","handleObserve","ratio","intersectionRatio","setTimeout","observe","observeMove","frameId","reobserveFrame","resizeObserver","firstEntry","unobserve","cancelAnimationFrame","requestAnimationFrame","_resizeObserver","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","offset","_middlewareData$offse","_middlewareData$arrow","middlewareData","diffCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","convertValueToCoords","arrow","alignmentOffset","shift","checkMainAxis","checkCrossAxis","limiter","detectOverflowOptions","mainAxisCoord","crossAxisCoord","maxSide","limitedCoords","flip","_middlewareData$flip","initialPlacement","fallbackPlacements","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment","initialSideAxis","isBasePlacement","oppositePlacement","getExpandedPlacements","hasFallbackAxisSideDirection","isStart","lr","rl","tb","bt","getSideList","getOppositeAxisPlacements","placements","overflows","overflowsData","sides","mainAlignmentSide","getAlignmentSides","every","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","reset","resetPlacement","_overflowsData$filter2","currentSideAxis","acc","computePosition","mergedOptions","platformWithCache","middleware","validMiddleware","Boolean","statefulPlacement","resetCount","nextX","nextY","computePosition$1","createFloatingActions","initOptions","referenceElement","floatingElement","defaultOptions","mixin","updatePosition","updateOptions","onComputed","setupVirtualElementObserver","$node","contentOptions","autoUpdateDestroy","destroyAutoUpdate","initAutoUpdate","_autoUpdate","loadOptions","filterText","items","multiple","itemId","groupBy","filterSelectedItems","itemFilter","convertStringItemsToObjects","filterGroupedItems","label","filterResults","matchesFilter","getItems","dispatch","res","catch","err","warn","details","cancelled","filteredItems","loading","focused","listOpen","circle","if_block0","create_if_block_13","if_block2","create_if_block_9","groupHeader","groupItem","selectable","listDom","span0","span1","ClearIcon","create_if_block_6","create_if_block_8","create_if_block_7","create_if_block_4","create_if_block_3","create_if_block_2","create_if_block_1","input_1","if_block6","div3","div2","readOnly","input_1_readonly_value","_items","slots","justValue","_filter","_getItems","container","multiFullItemClearable","disabled","placeholder","placeholderAlwaysShow","groupFilter","groups","groupHeaderSelectable","containerStyles","hasError","required","closeListOnChange","clearFilterTextOnBlur","createGroupHeaderItem","groupValue","activeValue","prev_value","prev_filterText","prev_multiple","_inputAttributes","searchable","inputStyles","clearable","debounce","wait","debounceWait","hideEmptyState","inputAttributes","listAutoWidth","showChevron","listOffset","hoverItemIndex","floatingConfig","class","containerClasses","groupValues","sortedGroupedItems","checkHoverSelectable","startingIndex","ignoreGroup","setHoverIndex","checkValueForDuplicates","noDuplicates","ids","uniqueValues","findItem","selection","matchTo","find","handleMultiItemClear","itemToRemove","handleFocus","activeElement","focus","handleBlur","isScrolling","closeList","ariaValues","ariaListOpen","count","ariaFocused","isScrollingTimer","handleListScroll","handleSelect","itemSelected","handleHover","handleItemClick","args","hasOwnProperty","isItemSelectable","increment","hasOwn","hover","activeScroll","scrollAction","hoverScroll","scrollIntoView","behavior","_floatingConfig","floatingRef","floatingContent","floatingUpdate","prefloat","setValue","autocapitalize","autocomplete","autocorrect","spellcheck","tabindex","hasValue","hideSelectedItem","showClear","placeholderText","ariaSelection","_multiple","join","handleAriaSelection","ariaContext","_item","handleAriaContent","updateValueDisplay","handleFilterEvent","listMounted","setListWidth","scrollToHoverItem","hoverItem","img","img_src_value","img_alt_value","_config","selectedService","imageType","t1","svelteselect_changes","embeddableFrontends","serviceConf","serviceOptions","frontendName","frontendId","frontendConf","each_value_2","color","show_if","each_value","networks","show_if_2","cloudflare","show_if_1","create_if_block_5","selectedFrontend","blacklist","redirects","addInstanceValue","allInstances","addInstance","autoPicking","pinging","network","allSettled","colorTime","networkName","a_href_value","func","func_3","raw_value","if_block1","instances_changes","serviceKey","$url","hideServiceSelection","hideFrontendSelection","frontendWebsite","servicesEntries","frontendEntries","opts","getUILanguage","app"],"mappings":"gCAAA,SAASA,IAAU,CAEnB,SAASC,EAAOC,EAAKC,GAEjB,IAAK,MAAMC,KAAKD,EACZD,EAAIE,GAAKD,EAAIC,GACjB,OAAOF,CACX,CAWA,SAASG,EAAIC,GACT,OAAOA,GACX,CACA,SAASC,IACL,OAAOC,OAAOC,OAAO,KACzB,CACA,SAASC,EAAQC,GACbA,EAAIC,QAAQP,EAChB,CACA,SAASQ,EAAYC,GACjB,MAAwB,mBAAVA,CAClB,CACA,SAASC,EAAeC,EAAGC,GACvB,OAAOD,GAAKA,EAAIC,GAAKA,EAAID,IAAMC,GAAOD,GAAkB,iBAANA,GAAgC,mBAANA,CAChF,CACA,IAAIE,EACJ,SAASC,EAAcC,EAAaC,GAKhC,OAJKH,IACDA,EAAuBI,SAASC,cAAc,MAElDL,EAAqBM,KAAOH,EACrBD,IAAgBF,EAAqBM,IAChD,CAYA,SAASC,EAAUC,KAAUC,GACzB,GAAa,MAATD,EACA,OAAO1B,EAEX,MAAM4B,EAAQF,EAAMD,aAAaE,GACjC,OAAOC,EAAMC,YAAc,IAAMD,EAAMC,cAAgBD,CAC3D,CAMA,SAASE,EAAoBC,EAAWL,EAAOM,GAC3CD,EAAUE,GAAGC,WAAWC,KAAKV,EAAUC,EAAOM,GAClD,CACA,SAASI,EAAYC,EAAYC,EAAKC,EAASjC,GAC3C,GAAI+B,EAAY,CACZ,MAAMG,EAAWC,EAAiBJ,EAAYC,EAAKC,EAASjC,GAC5D,OAAO+B,EAAW,GAAGG,EACxB,CACL,CACA,SAASC,EAAiBJ,EAAYC,EAAKC,EAASjC,GAChD,OAAO+B,EAAW,IAAM/B,EAClBL,EAAOsC,EAAQD,IAAII,QAASL,EAAW,GAAG/B,EAAGgC,KAC7CC,EAAQD,GAClB,CACA,SAASK,EAAiBN,EAAYE,EAASK,EAAOtC,GAClD,GAAI+B,EAAW,IAAM/B,EAAI,CACrB,MAAMuC,EAAOR,EAAW,GAAG/B,EAAGsC,IAC9B,QAAsBE,IAAlBP,EAAQK,MACR,OAAOC,EAEX,GAAoB,iBAATA,EAAmB,CAC1B,MAAME,EAAS,GACTC,EAAMC,KAAKC,IAAIX,EAAQK,MAAMO,OAAQN,EAAKM,QAChD,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAKI,GAAK,EAC1BL,EAAOK,GAAKb,EAAQK,MAAMQ,GAAKP,EAAKO,GAExC,OAAOL,CACV,CACD,OAAOR,EAAQK,MAAQC,CAC1B,CACD,OAAON,EAAQK,KACnB,CACA,SAASS,EAAiBC,EAAMC,EAAiBjB,EAAKC,EAASiB,EAAcC,GACzE,GAAID,EAAc,CACd,MAAME,EAAejB,EAAiBc,EAAiBjB,EAAKC,EAASkB,GACrEH,EAAKK,EAAED,EAAcF,EACxB,CACL,CAKA,SAASI,EAAyBrB,GAC9B,GAAIA,EAAQD,IAAIa,OAAS,GAAI,CACzB,MAAMP,EAAQ,GACRO,EAASZ,EAAQD,IAAIa,OAAS,GACpC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAQC,IACxBR,EAAMQ,IAAM,EAEhB,OAAOR,CACV,CACD,OAAQ,CACZ,CACA,SAASiB,EAAuBC,GAC5B,MAAMC,EAAS,CAAA,EACf,IAAK,MAAM3D,KAAK0D,EACC,MAAT1D,EAAE,KACF2D,EAAO3D,GAAK0D,EAAM1D,IAC1B,OAAO2D,CACX,CACA,SAASC,EAAmBF,EAAOG,GAC/B,MAAMC,EAAO,CAAA,EACbD,EAAO,IAAIE,IAAIF,GACf,IAAK,MAAM7D,KAAK0D,EACPG,EAAKG,IAAIhE,IAAe,MAATA,EAAE,KAClB8D,EAAK9D,GAAK0D,EAAM1D,IACxB,OAAO8D,CACX,CAyBA,SAASG,EAAiBC,GACtB,OAAOA,GAAiBzD,EAAYyD,EAAcC,SAAWD,EAAcC,QAAUvE,CACzF,CAkMA,SAASwE,EAAOC,EAAQC,GACpBD,EAAOE,YAAYD,EACvB,CAoDA,SAASE,EAAOH,EAAQC,EAAMG,GAC1BJ,EAAOK,aAAaJ,EAAMG,GAAU,KACxC,CASA,SAASE,EAAOL,GACRA,EAAKM,YACLN,EAAKM,WAAWC,YAAYP,EAEpC,CACA,SAASQ,EAAaC,EAAYC,GAC9B,IAAK,IAAIhC,EAAI,EAAGA,EAAI+B,EAAWhC,OAAQC,GAAK,EACpC+B,EAAW/B,IACX+B,EAAW/B,GAAGiC,EAAED,EAE5B,CACA,SAASE,EAAQC,GACb,OAAOjE,SAASC,cAAcgE,EAClC,CAgBA,SAASC,EAAYD,GACjB,OAAOjE,SAASmE,gBAAgB,6BAA8BF,EAClE,CACA,SAASG,EAAKC,GACV,OAAOrE,SAASsE,eAAeD,EACnC,CACA,SAASE,IACL,OAAOH,EAAK,IAChB,CACA,SAASI,IACL,OAAOJ,EAAK,GAChB,CAIA,SAASK,EAAOrB,EAAMsB,EAAOC,EAASC,GAElC,OADAxB,EAAKyB,iBAAiBH,EAAOC,EAASC,GAC/B,IAAMxB,EAAK0B,oBAAoBJ,EAAOC,EAASC,EAC1D,CACA,SAASG,EAAgB/F,GACrB,OAAO,SAAU0F,GAGb,OAFAA,EAAMM,iBAEChG,EAAGiG,KAAKC,KAAMR,EAC7B,CACA,CACA,SAASS,EAAiBnG,GACtB,OAAO,SAAU0F,GAGb,OAFAA,EAAMU,kBAECpG,EAAGiG,KAAKC,KAAMR,EAC7B,CACA,CAsBA,SAASW,EAAKjC,EAAMkC,EAAWC,GACd,MAATA,EACAnC,EAAKoC,gBAAgBF,GAChBlC,EAAKqC,aAAaH,KAAeC,GACtCnC,EAAKsC,aAAaJ,EAAWC,EACrC,CAQA,MAAMI,EAAmC,CAAC,QAAS,UACnD,SAASC,EAAexC,EAAMyC,GAE1B,MAAMC,EAAc5G,OAAO6G,0BAA0B3C,EAAK4C,WAC1D,IAAK,MAAMC,KAAOJ,EACS,MAAnBA,EAAWI,GACX7C,EAAKoC,gBAAgBS,GAER,UAARA,EACL7C,EAAK8C,MAAMC,QAAUN,EAAWI,GAEnB,YAARA,EACL7C,EAAKmC,MAAQnC,EAAK6C,GAAOJ,EAAWI,GAE/BH,EAAYG,IAAQH,EAAYG,GAAKG,MAA0D,IAAnDT,EAAiCU,QAAQJ,GAC1F7C,EAAK6C,GAAOJ,EAAWI,GAGvBZ,EAAKjC,EAAM6C,EAAKJ,EAAWI,GAGvC,CACA,SAASK,EAAmBlD,EAAMyC,GAC9B,IAAK,MAAMI,KAAOJ,EACdR,EAAKjC,EAAM6C,EAAKJ,EAAWI,GAEnC,CAoNA,SAASM,EAASnC,EAAMC,GACpBA,EAAO,GAAKA,EACRD,EAAKC,OAASA,IAElBD,EAAKC,KAAOA,EAChB,CAeA,SAASmC,EAAgBC,EAAOlB,GAC5BkB,EAAMlB,MAAiB,MAATA,EAAgB,GAAKA,CACvC,CASA,SAASmB,EAAUtD,EAAM6C,EAAKV,EAAOoB,GACpB,MAATpB,EACAnC,EAAK8C,MAAMU,eAAeX,GAG1B7C,EAAK8C,MAAMW,YAAYZ,EAAKV,EAAOoB,EAAY,YAAc,GAErE,CACA,SAASG,EAAcC,EAAQxB,EAAOyB,GAClC,IAAK,IAAIlF,EAAI,EAAGA,EAAIiF,EAAOnC,QAAQ/C,OAAQC,GAAK,EAAG,CAC/C,MAAMmF,EAASF,EAAOnC,QAAQ9C,GAC9B,GAAImF,EAAOC,UAAY3B,EAEnB,YADA0B,EAAOE,UAAW,EAGzB,CACIH,QAAsBxF,IAAV+D,IACbwB,EAAOK,eAAiB,EAEhC,CAyEA,SAASC,EAAarD,EAASC,EAAMqD,GACjCtD,EAAQuD,UAAUD,EAAS,MAAQ,UAAUrD,EACjD,CA8BA,MAAMuD,EACF,WAAAC,CAAYC,GAAS,GACjBxC,KAAKwC,QAAS,EACdxC,KAAKwC,OAASA,EACdxC,KAAKyC,EAAIzC,KAAK0C,EAAI,IACrB,CACD,CAAAC,CAAEC,GACE5C,KAAK6C,EAAED,EACV,CACD,CAAAE,CAAEF,EAAM3E,EAAQI,EAAS,MAChB2B,KAAKyC,IACFzC,KAAKwC,OACLxC,KAAKyC,EAAIzD,EAAYf,EAAO8E,UAG5B/C,KAAKyC,EAAI3D,EAA6B,KAApBb,EAAO+E,SAAkB,WAAa/E,EAAO8E,UACnE/C,KAAKiD,EAAuB,aAAnBhF,EAAOiF,QAAyBjF,EAASA,EAAOkF,QACzDnD,KAAK2C,EAAEC,IAEX5C,KAAKpD,EAAEyB,EACV,CACD,CAAAwE,CAAED,GACE5C,KAAKyC,EAAEW,UAAYR,EACnB5C,KAAK0C,EAAIW,MAAMC,KAAyB,aAApBtD,KAAKyC,EAAEM,SAA0B/C,KAAKyC,EAAEU,QAAQI,WAAavD,KAAKyC,EAAEc,WAC3F,CACD,CAAA3G,CAAEyB,GACE,IAAK,IAAIzB,EAAI,EAAGA,EAAIoD,KAAK0C,EAAE/F,OAAQC,GAAK,EACpCwB,EAAO4B,KAAKiD,EAAGjD,KAAK0C,EAAE9F,GAAIyB,EAEjC,CACD,CAAAlB,CAAEyF,GACE5C,KAAKnB,IACLmB,KAAK6C,EAAED,GACP5C,KAAKpD,EAAEoD,KAAKxF,EACf,CACD,CAAAqE,GACImB,KAAK0C,EAAEtI,QAAQmE,EAClB,EA8KL,IAAIiF,EACJ,SAASC,EAAsBlI,GAC3BiI,EAAoBjI,CACxB,CACA,SAASmI,IACL,IAAKF,EACD,MAAM,IAAIG,MAAM,oDACpB,OAAOH,CACX,CAoBA,SAASI,EAAQ9J,GACb4J,IAAwBjI,GAAGoI,SAASlI,KAAK7B,EAC7C,CAiBA,SAASgK,EAAUhK,GACf4J,IAAwBjI,GAAGC,WAAWC,KAAK7B,EAC/C,CAaA,SAASiK,IACL,MAAMxI,EAAYmI,IAClB,MAAO,CAACM,EAAMC,GAAUC,cAAa,GAAU,MAC3C,MAAM/I,EAAYI,EAAUE,GAAGN,UAAU6I,GACzC,GAAI7I,EAAW,CAGX,MAAMqE,EArTlB,SAAsBwE,EAAMC,GAAQE,QAAEA,GAAU,EAAKD,WAAEA,GAAa,GAAU,IAC1E,MAAMzB,EAAI3H,SAASsJ,YAAY,eAE/B,OADA3B,EAAE4B,gBAAgBL,EAAMG,EAASD,EAAYD,GACtCxB,CACX,CAiT0B6B,CAAaN,EAAMC,EAAQ,CAAEC,eAI3C,OAHA/I,EAAUe,QAAQ9B,SAAQN,IACtBA,EAAGiG,KAAKxE,EAAWiE,EAAM,KAErBA,EAAM+E,gBACjB,CACD,OAAO,CAAI,CAEnB,CA6CA,SAASC,EAAOjJ,EAAWiE,GACvB,MAAMrE,EAAYI,EAAUE,GAAGN,UAAUqE,EAAMwE,MAC3C7I,GAEAA,EAAUe,QAAQ9B,SAAQN,GAAMA,EAAGiG,KAAKC,KAAMR,IAEtD,CAEA,MAAMiF,EAAmB,GAEnBC,EAAoB,GAC1B,IAAIC,EAAmB,GACvB,MAAMC,EAAkB,GAClBC,EAAmCC,QAAQC,UACjD,IAAIC,GAAmB,EACvB,SAASC,KACAD,IACDA,GAAmB,EACnBH,EAAiBK,KAAKC,IAE9B,CAKA,SAASC,GAAoBtL,GACzB6K,EAAiBhJ,KAAK7B,EAC1B,CACA,SAASuL,GAAmBvL,GACxB8K,EAAgBjJ,KAAK7B,EACzB,CAmBA,MAAMwL,GAAiB,IAAI3H,IAC3B,IAAI4H,GAAW,EACf,SAASJ,KAIL,GAAiB,IAAbI,GACA,OAEJ,MAAMC,EAAkBhC,EACxB,EAAG,CAGC,IACI,KAAO+B,GAAWd,EAAiB9H,QAAQ,CACvC,MAAMpB,EAAYkJ,EAAiBc,IACnCA,KACA9B,EAAsBlI,GACtBkK,GAAOlK,EAAUE,GACpB,CACJ,CACD,MAAOgH,GAIH,MAFAgC,EAAiB9H,OAAS,EAC1B4I,GAAW,EACL9C,CACT,CAID,IAHAgB,EAAsB,MACtBgB,EAAiB9H,OAAS,EAC1B4I,GAAW,EACJb,EAAkB/H,QACrB+H,EAAkBgB,KAAlBhB,GAIJ,IAAK,IAAI9H,EAAI,EAAGA,EAAI+H,EAAiBhI,OAAQC,GAAK,EAAG,CACjD,MAAMpB,EAAWmJ,EAAiB/H,GAC7B0I,GAAe1H,IAAIpC,KAEpB8J,GAAeK,IAAInK,GACnBA,IAEP,CACDmJ,EAAiBhI,OAAS,CAClC,OAAa8H,EAAiB9H,QAC1B,KAAOiI,EAAgBjI,QACnBiI,EAAgBc,KAAhBd,GAEJI,GAAmB,EACnBM,GAAeM,QACfnC,EAAsB+B,EAC1B,CACA,SAASC,GAAOhK,GACZ,GAAoB,OAAhBA,EAAGoK,SAAmB,CACtBpK,EAAGgK,SACHvL,EAAQuB,EAAGqK,eACX,MAAM1J,EAAQX,EAAGW,MACjBX,EAAGW,MAAQ,EAAE,GACbX,EAAGoK,UAAYpK,EAAGoK,SAAS1I,EAAE1B,EAAGK,IAAKM,GACrCX,EAAGsK,aAAa3L,QAAQgL,GAC3B,CACL,CAyBA,MAAMY,GAAW,IAAIrI,IACrB,IAAIsI,GACJ,SAASC,KACLD,GAAS,CACLE,EAAG,EACHxD,EAAG,GACHxF,EAAG8I,GAEX,CACA,SAASG,KACAH,GAAOE,GACRjM,EAAQ+L,GAAOtD,GAEnBsD,GAASA,GAAO9I,CACpB,CACA,SAASkJ,GAAcC,EAAOC,GACtBD,GAASA,EAAM1J,IACfoJ,GAASQ,OAAOF,GAChBA,EAAM1J,EAAE2J,GAEhB,CACA,SAASE,GAAeH,EAAOC,EAAOhI,EAAQ/C,GAC1C,GAAI8K,GAASA,EAAMI,EAAG,CAClB,GAAIV,GAASpI,IAAI0I,GACb,OACJN,GAASL,IAAIW,GACbL,GAAOtD,EAAEhH,MAAK,KACVqK,GAASQ,OAAOF,GACZ9K,IACI+C,GACA+H,EAAMzH,EAAE,GACZrD,IACH,IAEL8K,EAAMI,EAAEH,EACX,MACQ/K,GACLA,GAER,CAkaA,SAASmL,GAAkBC,EAAQC,GAC/B,MAAMpB,EAAS,CAAA,EACTqB,EAAc,CAAA,EACdC,EAAgB,CAAEhL,QAAS,GACjC,IAAIa,EAAIgK,EAAOjK,OACf,KAAOC,KAAK,CACR,MAAM8J,EAAIE,EAAOhK,GACX8F,EAAImE,EAAQjK,GAClB,GAAI8F,EAAG,CACH,IAAK,MAAM3B,KAAO2F,EACR3F,KAAO2B,IACToE,EAAY/F,GAAO,GAE3B,IAAK,MAAMA,KAAO2B,EACTqE,EAAchG,KACf0E,EAAO1E,GAAO2B,EAAE3B,GAChBgG,EAAchG,GAAO,GAG7B6F,EAAOhK,GAAK8F,CACf,MAEG,IAAK,MAAM3B,KAAO2F,EACdK,EAAchG,GAAO,CAGhC,CACD,IAAK,MAAMA,KAAO+F,EACR/F,KAAO0E,IACTA,EAAO1E,QAAOzE,GAEtB,OAAOmJ,CACX,CA0NA,SAASuB,GAAKzL,EAAWwD,EAAMvD,GAC3B,MAAMyL,EAAQ1L,EAAUE,GAAG6B,MAAMyB,QACnBzC,IAAV2K,IACA1L,EAAUE,GAAGyL,MAAMD,GAASzL,EAC5BA,EAASD,EAAUE,GAAGK,IAAImL,IAElC,CACA,SAASE,GAAiBb,GACtBA,GAASA,EAAM3D,GACnB,CAIA,SAASyE,GAAgB7L,EAAW0C,EAAQI,EAAQgJ,GAChD,MAAMxB,SAAEA,EAAQE,aAAEA,GAAiBxK,EAAUE,GAC7CoK,GAAYA,EAAS/C,EAAE7E,EAAQI,GAC1BgJ,GAEDjC,IAAoB,KAChB,MAAMkC,EAAiB/L,EAAUE,GAAGoI,SAAS0D,IAAI1N,GAAK2N,OAAOnN,GAIzDkB,EAAUE,GAAGC,WACbH,EAAUE,GAAGC,WAAWC,QAAQ2L,GAKhCpN,EAAQoN,GAEZ/L,EAAUE,GAAGoI,SAAW,EAAE,IAGlCkC,EAAa3L,QAAQgL,GACzB,CACA,SAASqC,GAAkBlM,EAAWqD,GAClC,MAAMnD,EAAKF,EAAUE,GACD,OAAhBA,EAAGoK,YA9vBX,SAAgC1L,GAC5B,MAAMuN,EAAW,GACXC,EAAU,GAChBhD,EAAiBvK,SAASuI,IAA0B,IAApBxI,EAAIgH,QAAQwB,GAAY+E,EAAS/L,KAAKgH,GAAKgF,EAAQhM,KAAKgH,KACxFgF,EAAQvN,SAASuI,GAAMA,MACvBgC,EAAmB+C,CACvB,CAyvBQE,CAAuBnM,EAAGsK,cAC1B7L,EAAQuB,EAAGC,YACXD,EAAGoK,UAAYpK,EAAGoK,SAAShH,EAAED,GAG7BnD,EAAGC,WAAaD,EAAGoK,SAAW,KAC9BpK,EAAGK,IAAM,GAEjB,CASA,SAAS+L,GAAKtM,EAAWmE,EAASoI,EAAUC,EAAiBC,EAAW1K,EAAO2K,EAAe7L,EAAQ,EAAE,IACpG,MAAM8L,EAAmB1E,EACzBC,EAAsBlI,GACtB,MAAME,EAAKF,EAAUE,GAAK,CACtBoK,SAAU,KACV/J,IAAK,GAELwB,QACAmI,OAAQjM,EACRwO,YACAd,MAAOnN,IAEP8J,SAAU,GACVnI,WAAY,GACZyM,cAAe,GACfrC,cAAe,GACfC,aAAc,GACdqC,QAAS,IAAIC,IAAI3I,EAAQ0I,UAAYF,EAAmBA,EAAiBzM,GAAG2M,QAAU,KAEtFjN,UAAWpB,IACXqC,QACAkM,YAAY,EACZC,KAAM7I,EAAQzB,QAAUiK,EAAiBzM,GAAG8M,MAEhDN,GAAiBA,EAAcxM,EAAG8M,MAClC,IAAIC,GAAQ,EAkBZ,GAjBA/M,EAAGK,IAAMgM,EACHA,EAASvM,EAAWmE,EAAQpC,OAAS,CAAE,GAAE,CAACV,EAAG6L,KAAQ/K,KACnD,MAAM2C,EAAQ3C,EAAKf,OAASe,EAAK,GAAK+K,EAOtC,OANIhN,EAAGK,KAAOkM,EAAUvM,EAAGK,IAAIc,GAAInB,EAAGK,IAAIc,GAAKyD,MACtC5E,EAAG6M,YAAc7M,EAAGyL,MAAMtK,IAC3BnB,EAAGyL,MAAMtK,GAAGyD,GACZmI,GAxCpB,SAAoBjN,EAAWqB,IACI,IAA3BrB,EAAUE,GAAGW,MAAM,KACnBqI,EAAiB9I,KAAKJ,GACtB0J,KACA1J,EAAUE,GAAGW,MAAMsM,KAAK,IAE5BnN,EAAUE,GAAGW,MAAOQ,EAAI,GAAM,IAAO,GAAMA,EAAI,EACnD,CAkCoB+L,CAAWpN,EAAWqB,IAEvB6L,CAAG,IAEZ,GACNhN,EAAGgK,SACH+C,GAAQ,EACRtO,EAAQuB,EAAGqK,eAEXrK,EAAGoK,WAAWkC,GAAkBA,EAAgBtM,EAAGK,KAC/C4D,EAAQzB,OAAQ,CAChB,GAAIyB,EAAQkJ,QAAS,CAEjB,MAAMC,EAvhDlB,SAAkB/J,GACd,OAAOuE,MAAMC,KAAKxE,EAAQyE,WAC9B,CAqhD0BuF,CAASpJ,EAAQzB,QAE/BxC,EAAGoK,UAAYpK,EAAGoK,SAASkD,EAAEF,GAC7BA,EAAMzO,QAAQmE,EACjB,MAGG9C,EAAGoK,UAAYpK,EAAGoK,SAASlD,IAE3BjD,EAAQsJ,OACR3C,GAAc9K,EAAUE,GAAGoK,UAC/BuB,GAAgB7L,EAAWmE,EAAQzB,OAAQyB,EAAQrB,OAAQqB,EAAQ2H,eAEnElC,IACH,CACD1B,EAAsByE,EAC1B,CAoDA,MAAMe,GACF,QAAAC,GACIzB,GAAkBzH,KAAM,GACxBA,KAAKkJ,SAAW1P,CACnB,CACD,GAAA2P,CAAInF,EAAMxI,GACN,IAAKnB,EAAYmB,GACb,OAAOhC,EAEX,MAAM2B,EAAa6E,KAAKvE,GAAGN,UAAU6I,KAAUhE,KAAKvE,GAAGN,UAAU6I,GAAQ,IAEzE,OADA7I,EAAUQ,KAAKH,GACR,KACH,MAAMyL,EAAQ9L,EAAUgG,QAAQ3F,IACjB,IAAXyL,GACA9L,EAAUiO,OAAOnC,EAAO,EAAE,CAErC,CACD,IAAAoC,CAAKC,GAhrET,IAAkBC,EAirENvJ,KAAKwJ,QAjrECD,EAirEkBD,EAhrEG,IAA5BtP,OAAOyD,KAAK8L,GAAK5M,UAirEhBqD,KAAKvE,GAAG6M,YAAa,EACrBtI,KAAKwJ,MAAMF,GACXtJ,KAAKvE,GAAG6M,YAAa,EAE5B,4ECluEIxM,EAAW,wHAApBsC,EAEMH,EAAAwL,EAAApL,iJAFGvC,EAAW,gcCSc4N,EAAA5N,KAAOiD,KAAI,mCAA1BgD,EAAAC,QAAA2H,EAAA7N,KAAOuE,gCAAtBjC,EAAmDH,EAAA8D,EAAA1D,kBAArB,EAAAjC,GAAAsN,KAAAA,EAAA5N,KAAOiD,KAAI,KAAAsC,EAAA4B,EAAAyG,GAA1B,EAAAtN,GAAAuN,KAAAA,EAAA7N,KAAOuE,mFADjBvE,EAAM,wBAAXa,OAAIC,GAAA,oGAD4Cd,EAAS,gFAA7DsC,EAISH,EAAA4D,EAAAxD,oHAJqBhE,EAAAyB,OAAAA,EAAQ,GAAA8N,MAAA5J,KAAA6J,oHAC7B/N,EAAM,WAAXa,OAAIC,GAAA,EAAA,mHAAJD,6BADgDb,EAAS,0FANhDgO,GAAMR,SACNjJ,GAAKiJ,YACLS,GAAQT,aACRU,GAASV,sQFoyBtB,SAAsBzH,GAClB,MAAMoI,EAAkBpI,EAAOqI,cAAc,YAC7C,OAAOD,GAAmBA,EAAgBjI,OAC9C,iZGvyBA5D,EAEMH,EAAAkM,EAAA9L,GADJL,EAAgDmM,EAAAC,+EAJrC,IAAApJ,MAAAA,EAAQ,IAAEsI,6cCGvBlL,EAECH,EAAAkM,EAAA9L,GADEL,EAA8GmM,EAAAC,+EAJpG,IAAApJ,MAAAA,EAAQ,IAAEsI,2JCIjBxN,EAAW,gHADjBsC,EAgBEH,EAAAsD,EAAAlD,wWAfIvC,EAAW,wJAJJuE,GAAKiJ,6oBCDRxN,EAAW,yHAArBsC,EAEOH,EAAAoM,EAAAhM,mHAFGvC,EAAW,wUCGrB,MAAMwO,GAAmB,GAgBzB,SAASC,GAASlK,EAAOmK,EAAQhR,GAC7B,IAAIiR,EACJ,MAAMC,EAAc,IAAI/M,IACxB,SAASuD,EAAIyJ,GACT,GAAIpQ,EAAe8F,EAAOsK,KACtBtK,EAAQsK,EACJF,GAAM,CACN,MAAMG,GAAaN,GAAiB3N,OACpC,IAAK,MAAMkO,KAAcH,EACrBG,EAAW,KACXP,GAAiB3O,KAAKkP,EAAYxK,GAEtC,GAAIuK,EAAW,CACX,IAAK,IAAIhO,EAAI,EAAGA,EAAI0N,GAAiB3N,OAAQC,GAAK,EAC9C0N,GAAiB1N,GAAG,GAAG0N,GAAiB1N,EAAI,IAEhD0N,GAAiB3N,OAAS,CAC7B,CACJ,CAER,CAmBD,MAAO,CAAEuE,MAAKuE,OAlBd,SAAgB3L,GACZoH,EAAIpH,EAAGuG,GACV,EAgBqBpF,UAftB,SAAmBpB,EAAKiR,EAAatR,GACjC,MAAMqR,EAAa,CAAChR,EAAKiR,GAMzB,OALAJ,EAAY/E,IAAIkF,GACS,IAArBH,EAAYK,OACZN,EAAOD,EAAMtJ,IAAQ1H,GAEzBK,EAAIwG,GACG,KACHqK,EAAYlE,OAAOqE,GACM,IAArBH,EAAYK,MAAcN,IAC1BA,IACAA,EAAO,KACV,CAER,EAEL,CACA,SAASO,GAAQC,EAAQnR,EAAIoR,GACzB,MAAMC,GAAU9H,MAAM+H,QAAQH,GACxBI,EAAeF,EACf,CAACF,GACDA,EACAK,EAAOxR,EAAG6C,OAAS,EACzB,OAzDqB6N,EAyDWtJ,IAC5B,IAAIqK,GAAU,EACd,MAAMzB,EAAS,GACf,IAAI0B,EAAU,EACVC,EAAUjS,EACd,MAAMkS,EAAO,KACT,GAAIF,EACA,OAEJC,IACA,MAAMlO,EAASzD,EAAGqR,EAASrB,EAAO,GAAKA,EAAQ5I,GAC3CoK,EACApK,EAAI3D,GAGJkO,EAAUpR,EAAYkD,GAAUA,EAAS/D,CAC5C,EAECmS,EAAgBN,EAAa9D,KAAI,CAACrM,EAAO0B,IAAM3B,EAAUC,GAAQmF,IACnEyJ,EAAOlN,GAAKyD,EACZmL,KAAa,GAAK5O,GACd2O,GACAG,GACH,IACF,KACCF,GAAY,GAAK5O,CAAE,MAIvB,OAFA2O,GAAU,EACVG,IACO,WACHxR,EAAQyR,GACRF,IAIAF,GAAU,CACtB,CAAS,EA5FE,CACHtQ,UAAWsP,GAuDCW,EAvDeV,GAAOvP,WAF1C,IAAyBuP,CA+FzB,CCtGO,MAAM9K,GAAU6K,GAAS,MACnBqB,GAASrB,GAAS,8ECwDrB,MAAAb,GAAA5N,KAAQ+P,KAAKC,WAAW,2BAA6B,6BAA2B,2aAMrEhQ,EAAgB,sEAEP,IAAVA,EAAU,aAAVA,EAAU,mFAQlBgO,OAAA,CAAA,CAAAzJ,MAAO,MAAOtB,KAAM,OACpB,CAAAsB,MAAO,QAAStB,KAAM,uBAHL,IAATjD,EAAS,aAATA,EAAS,sPAVzBsC,EAgBMH,EAAAwL,EAAApL,6CACND,EAESH,EAAA8N,EAAA1N,uCAFqBvC,EAAY,iDAfzBA,EAAgB,2BAEjBA,EAAU,+DAMVA,EAAS,8QAepBA,EAAS,IAAA,qKACVsC,EAESH,EAAA8N,EAAA1N,8EAHRvC,EAAS,IAAA,KAAAuF,EAAA2K,EAAAC,oRAKZ7N,EAAMH,EAAAiO,EAAA7N,mVAPGvC,EAAQ,GAACqQ,WAAWtR,OAAQiB,EAAQ,GAACqQ,WAAWC,4BAAzDzP,OAAIC,GAAA,0QAzBVwB,EAmCMH,EAAAoO,EAAAhO,uBAZJL,EAAMqO,EAAAH,UACNlO,EAUMqO,EAAAC,kNATOxQ,EAAQ,GAACqQ,WAAWtR,OAAQiB,EAAQ,GAACqQ,WAAWC,eAAzDzP,OAAIC,GAAA,EAAA,8GAAJD,OAAIC,EAAA2P,EAAA5P,OAAAC,GAAA,kFAAJD,OAAIC,GAAA,mMArFF,MAAA4P,EAAUC,OAAOD,SAAWC,OAAOC,WAWrCC,QAGEC,EAAqBlN,GAAQzE,WAAU4R,GAAGC,EAAA,EAAKH,EAAWE,KAC1DE,EAAoBnB,GAAO3Q,WAAU4R,GAAkBA,IAC7D/I,GAAS,KACP8I,IACAG,GAAiB,IAEf,IAAAC,EAAY,MACZC,EAAa,GAIR,SAAAC,EAAgBC,OACnBlG,EACJA,EAAQ0F,EAASR,WAAWtR,IAAIsG,QAAQgM,GACpClG,GAAS,EACX0F,EAASR,WAAWtR,IAAIuO,OAAOnC,EAAO,IAEtCA,EAAQ0F,EAASR,WAAWC,MAAMjL,QAAQgM,GACtClG,GAAS,GAAG0F,EAASR,WAAWC,MAAMhD,OAAOnC,EAAO,IAE1DvH,GAAQwB,IAAIyL,YAGLS,IACH,IAAAC,GAAQ,EACK,OAAbL,GAAkB,gCAAoCM,KAAKL,IAC7DI,GAAQ,EACHV,EAASR,WAAWtR,IAAI0S,SAASN,IACpCN,EAASR,WAAWtR,IAAIc,KAAKsR,IAET,SAAbD,IACTK,GAAQ,EACHV,EAASR,WAAWC,MAAMmB,SAASN,IACtCN,EAASR,WAAWC,MAAMzQ,KAAKsR,IAG/BI,IACF3N,GAAQwB,IAAIyL,GACZG,EAAA,EAAAG,EAAa,2CA7BdH,EAAA,EAAAU,EAAgC,OAAbR,EAAqB,yBAA2B,4DA2CpDC,EAAU5M,UACVoC,IACI,UAAVA,EAAE1B,KAAiBqM,GAAY,cAIzBJ,EAAS3M,UAgBe8M,GAAAD,EAAgBC,yICzFhD,IAAAM,EAAA,CAAA3R,KAA0BA,EAAO,0HAA7CsC,EAESH,EAAA8N,EAAA1N,wKAFGvC,EAAW,QAAeA,EAAO,sZCCvCA,EAAW,kYADjBsC,EAWMH,EAAAkM,EAAA9L,GAHJL,EAEEmM,EAAAC,8BATEtO,EAAW,6UCAXA,EAAW,gWADjBsC,EAWMH,EAAAkM,EAAA9L,GAHJL,EAEEmM,EAAAC,8BATEtO,EAAW,qeCMXA,EAAW,4WAPjBsC,EAeMH,EAAAkM,EAAA9L,GANJL,EAEEmM,EAAAuD,GACF1P,EAEEmM,EAAAwD,oLAPE7R,EAAW,mMCDjB,SAAS8R,GAAkBC,GACzB,OAAOA,KAAaA,EAAUlR,OAASF,KAAKqR,UAC9C,CAsHA,SAASC,GAAS/S,GAChB,OAAO,IAAI8J,SAAQkJ,UACjB,IAAIzC,EACA0C,EAAO,IAAIC,eACfD,EAAKE,QAAU,IACfF,EAAKG,UAAY,IAAMrJ,EAAQ,KAC/BkJ,EAAKI,QAAU,IAAMtJ,IACrBkJ,EAAKK,mBAAqB,KACxB,GAAuB,GAAnBL,EAAKM,WACP,GAAmB,KAAfN,EAAKO,OAAe,CACtB,IAAIC,GAAQ,IAAIC,MAAOC,UACvBV,EAAKW,QACL7J,EAAQ0J,EAAQlD,EAC1B,MACUxG,EAAQ,IAAOkJ,EAAKO,OAEvB,EAEHP,EAAKY,KAAK,MAAO,GAAG7T,QAAU,IAAI0T,MAAOC,aAAa,GACtDpD,GAAU,IAAImD,MAAOC,UACrBV,EAAKa,KAAK,KAAK,GAEnB,CAKA,SAASC,GAAK/T,GACZ,OAAO,IAAI8J,SAAQkJ,UACjB,IACIgB,EADAC,EAAU,EAEd,IAAK,IAAIrS,EAAI,EAAGA,EAAI,EAAGA,IAErB,GADAoS,QAAajB,GAAS/S,GACb,GAAL4B,EAAJ,CACA,GAAIoS,GAAQ,IAEV,YADAjK,EAAQiK,GAGVC,GAAWD,CALC,CAOdC,EAAUC,SAASD,EAAU,GAC7BlK,EAAQkK,EAAQ,GAEpB,CA6CO,SAASE,GAAgBC,EAAU1M,GACxC,IAAImL,EAAY,GACZnL,EAAI0M,EAASzS,SAAQ+F,EAAI0M,EAASzS,QACtC,IAAK,IAAIC,EAAI,EAAGA,EAAI8F,EAAG9F,IAAK,CAC1B,MACMyS,EAAiBD,EADF3S,KAAK6S,MAAM7S,KAAKqR,SAAWsB,EAASzS,SAEzDkR,EAAUlS,KAAK0T,EAChB,CACD,OAAOxB,CACT,CA/NApB,OAAOD,QAAUC,OAAOD,SAAWC,OAAOC,OAuR3B,IAAA6C,GAAA,CACb3B,qBACA4B,gBA1QF,SAAyBC,EAAoB5B,GAC3C,MAAM6B,EAAuB7B,EAAU1M,QAAQsO,GAC/C,OAA8B,IAA1BC,EAAoC9B,GAAkBC,GAEnDA,GADoB6B,EAAuB,GAAK7B,EAAUlR,OAEnE,EAsQEgT,aAjQF,SAAsB9U,GACpB,MAAM+U,EAAW/U,EAAI+U,SAASC,QAAQ,MAAO,IAG7C,MAAgB,gBAAZD,GAA8B/U,EAAIiV,KAAKC,SAAS,aAC3C,GAAGlV,EAAImV,aAAanV,EAAIiV,OAAOF,EAAS1T,MAAM,GAAI,KAEvDrB,EAAIoV,UAAYpV,EAAIqV,SAAiB,GAAGrV,EAAImV,aAAanV,EAAIoV,YAAYpV,EAAIqV,YAAYrV,EAAIiV,OAAOF,IAEjG,GAAG/U,EAAImV,aAAanV,EAAIiV,OAAOF,GACxC,EAwPEO,QAnLF,SAAiBzQ,GACf,OAAO,IAAIoF,SAAQC,IACjB,IAAIlK,EACJ,GAA8B,UAA1B6E,EAAQ0Q,eACVvV,EAAM,6EACH,IAA8B,YAA1B6E,EAAQ0Q,eAEZ,OAAOrL,EAAQ,YADlBlK,EAAM,sEACsB,CAC9B,MAAMoT,EAAO,IAAIC,eACjBD,EAAKY,KAAK,MAAOhU,GAAK,GACtBoT,EAAKK,mBAAqB,KACxB,GAAoB,MAAhBL,EAAKO,QAAkBP,EAAKM,YAAcL,eAAemC,KAAM,OAAOtL,EAAQuL,KAAKC,MAAMtC,EAAKuC,cAAa,EAEjHvC,EAAKI,QAAU,IAAMtJ,IACrBkJ,EAAKG,UAAY,IAAMrJ,IACvBkJ,EAAKa,KAAK,KAAK,GAEnB,EAmKE2B,aAvMF,SAAsB/Q,GACpB,OAAO,IAAIoF,SAAQC,IACjB,IAAIlK,EACJ,GAA8B,UAA1B6E,EAAQ0Q,eACVvV,EAAM,kFACH,IAA8B,YAA1B6E,EAAQ0Q,eAEZ,OAAOrL,EAAQ,YADlBlK,EAAM,2EACsB,CAC9B,MAAMoT,EAAO,IAAIC,eACjBD,EAAKY,KAAK,MAAOhU,GAAK,GACtBoT,EAAKK,mBAAqB,KACJ,MAAhBL,EAAKO,QAAkBP,EAAKM,YAAcL,eAAemC,MAAMtL,EAAQuL,KAAKC,MAAMtC,EAAKuC,cAAc,EAE3GvC,EAAKI,QAAU,IAAMtJ,IACrBkJ,EAAKG,UAAY,IAAMrJ,IACvBkJ,EAAKa,KAAK,KAAK,GAEnB,EAuLE4B,UAnOF,WACE,OAAO,IAAI5L,SAAQC,IACjB4L,MAAM,gBACHzL,MAAK0L,GAAYA,EAAS1R,SAC1BgG,MAAK2L,IACJ9L,EAAQuL,KAAKC,MAAMM,GACnB,GACA,GAER,EA2NEC,WAjNF,WACE,OAAO,IAAIhM,SAAQC,GAAWyH,QAAQuE,QAAQxK,MAAMyK,IAAI,WAAW7K,GAAKpB,EAAQoB,EAAEzG,YACpF,EAgNEuR,aA9MF,WACE,OAAO,IAAInM,SAAQC,GAAWyH,QAAQuE,QAAQxK,MAAMyK,IAAI,aAAa7K,GAAKpB,EAAQoB,EAAE+K,WAAa,CAAA,MACnG,EA6MEnC,QACAoC,gBAtHF,SAAyBC,GACvB,MAAMnD,EAAO,IAAIC,eAOjB,GANAD,EAAKY,KACH,MACA,gDAAgDwC,mBAAmBD,0BACnE,GAEFnD,EAAKa,OACc,KAAfb,EAAKO,OAAe,CACtB,MAAMqC,EAAOP,KAAKC,MAAMtC,EAAKuC,cAAc,GAC3C,OAAIK,EACK,CACLS,WAAY,GAAGT,EAAKU,OAAOV,EAAKW,MAChCC,YAAa,GAAGZ,EAAKY,YAAY,MAAMZ,EAAKY,YAAY,MAAMZ,EAAKY,YAAY,MAAMZ,EAAKY,YAAY,MAGnG,CAAE,CACV,CACH,EAqGEC,SAnGF,SAAkB7W,GAChB,IAAI8W,EAAQ,GAGZ,OAFI9W,EAAI+W,aAAahU,IAAI,KAAM+T,EAAQ9W,EAAI+W,aAAaZ,IAAI,KACnDnW,EAAI+W,aAAahU,IAAI,WAAU+T,EAAQ9W,EAAI+W,aAAahU,IAAI,UAC9D+T,CACT,EA+FEE,aA9FF,SAAsBC,GACpB,OAAO,IAAIC,gBAAgBD,GAAOE,UACpC,EA6FEC,iBA3FF,SAA0BpX,GACxB,IAAK0W,EAAKC,EAAKU,GAAQ,CAAC,KAAM,KAAM,MACpC,MAAMC,EAAMtX,EAAI+U,SAASwC,MAAM,8CAQ/B,OAPID,GACD,CAAGX,EAAKD,EAAKW,GAAQC,EACbtX,EAAI+W,aAAahU,IAAI,aAE5B2T,EAAKC,GAAO3W,EAAI+W,aAAaZ,IAAI,UAAUqB,MAAM,KACnDH,EAAOrX,EAAI+W,aAAaZ,IAAI,SAAW,MAElC,CAAEkB,OAAMV,MAAKD,MACtB,EAiFEpC,mBACAnO,MAtDK,SAAetB,EAAS+M,GAC7B,MAAM6F,EASR,SAAsB5S,EAAS+M,GAC7B,MAAM8F,EAAO,CACXrT,KAAM,OACNsT,OAAQ,UACRC,YAAa,UACbC,OAAQ,UACRC,OAAQ,UACRC,UAAW,WAGPC,EAAQ,CACZ3T,KAAM,QACNsT,OAAQ,QACRC,YAAa,UACbC,OAAQ,UACRC,OAAQ,UACRC,UAAW,WAEb,MAAqB,QAAjBlT,EAAQoT,MACHP,EACmB,SAAjB7S,EAAQoT,MACVD,EACEpG,EAAOsG,WAAW,gCAAgCC,QACpDT,EAEAM,CAEX,CApCeI,CAAavT,EAAS+M,GACnC,MAAO,WAAW6F,EAAKpT,uBACVoT,EAAKE,8BACAF,EAAKG,6BACXH,EAAKI,wBACLJ,EAAKK,4BACDL,EAAKM,YACvB,EA+CEM,iBAtEFlF,eAAgCoB,EAAUvU,GACxC,GAAIA,EAAK,CACP,MAAM+B,EAAIwS,EAAS+D,WAAUrL,GAAYjN,EAAIG,KAAKoY,WAAWtL,KACzDlL,GAAK,GAAGwS,EAAShG,OAAOxM,EAAG,EAChC,CACD,MAAMkR,EAASqB,GAAgBC,EAAU,GACnCiE,QAAcvO,QAAQwO,IAAI,IAC3BxF,EAAOvG,KAAIyG,SACL,CAAClG,QAAgBiH,GAAKjH,QAIjC,OADAuL,EAAME,MAAK,CAAC/Y,EAAGC,IAAMD,EAAE,GAAKC,EAAE,KACvB4Y,EAAM,GAAG,EAClB,GC5OA,MAAMG,QAA8ClX,IAAnCkQ,QAAQiH,QAAQC,eAGjC,IAAI9H,GAAQlM,GAEZsO,eAAenG,KACbnI,SAAgB6P,GAAMuB,aACtBlF,SAAe2D,GAAMmB,WACvB,CAKA,SAAS4C,GAAIK,EAASC,EAAUlU,EAASkM,GACvC,IAAIiC,EAAY,GAChB,GAAK+F,EAMMlU,EAAQkU,KACjB/F,EAAYnO,EAAQkU,SANpB,IAAK,MAAMA,KAAYhI,EAAOiI,SAASF,GAASG,UAC1CpU,EAAQkU,IACV/F,EAAUlS,QAAQ+D,EAAQkU,IAMhC,OAAO/F,CACT,CASA,SAASkG,GAAWJ,EAAS9Y,EAAK+Q,EAAQlM,EAASkU,GACjD,IAAII,EAAapI,EAAOiI,SAASF,GAAShM,QACtCiM,MAEA,mBAAoBhI,EAAOiI,SAASF,GAASG,UAAUF,KAC1C,WAAZD,GAAyBjU,EAAgB,OAAEuU,iBAE5CD,EAAaA,EAAWxM,QACtBqF,IAAQjB,EAAOiI,SAASF,GAASG,UAAUF,GAAUM,eAAe3G,SAASyG,EAAW7S,QAAQ0L,OAGpF,YAAZ8G,GAAyBjU,EAAiB,QAAEyU,eAC9CH,EAAaA,EAAW5K,OAAO,KAGnC,IAAK,MAAMgL,KAAgBJ,EAAY,CAErC,GADe,IAAIK,OAAOL,EAAWI,IAC1B9G,KAAKzS,EAAIG,MAAO,OAAO,CACnC,CACD,OAAO,CACT,CAolBA,SAASsZ,GAASzZ,EAAKmJ,EAAMuQ,EAAWC,EAAaC,EAAWC,GAC9D,GAAY,cAAR1Q,GAAgC,aAARA,GAA+B,SAARA,EAAiB,OACpE,IAAIqL,EACAuE,EACJ,GAAKc,GAAuD,GAAnChV,GAAQiV,yBAAoCF,EAArE,CACA,IAAK,MAAMd,KAAW/H,GAAOiI,SAAU,CACrC,IAAKa,IAAqBhV,GAAQiU,GAASiB,QAAS,SACpD,IAAKF,GAAgE,GAA5ChV,GAAQiU,GAASgB,0BAAoCF,EAAW,SAWzF,GATAb,EAAWlU,GAAQiU,GAASC,SAG1BhI,GAAOiI,SAASF,GAASG,UAAUF,GAAUiB,YACrC,cAAR7Q,GACiC,cAAjCtE,GAAQiU,GAASmB,eAEjBlB,EAAWlU,GAAQiU,GAASoB,gBAEzBhB,GAAWJ,EAAS9Y,EAAK+Q,GAAQlM,GAASkU,GAAW,CACxDA,EAAW,KACX,QACD,CAED,GAAY,cAAR5P,GAAwBwQ,GAAgD,aAAjC9U,GAAQiU,GAASmB,cACtDf,GAAWJ,EAASa,EAAa5I,GAAQlM,GAASkU,GACpD,OAIJ,GACEhI,GAAOiI,SAASF,GAASqB,YACzBhR,GAAQtE,GAAQiU,GAASmB,cACQ,QAAjCpV,GAAQiU,GAASmB,aAEjB,MAAwC,SAApCpV,GAAQiU,GAASsB,gBAAmC,cACxD,EAGF,IAAIC,EAAexV,GAAQkU,GAC3B,QAAqBtX,IAAjB4Y,EAA4B,MAEhC,GAAItJ,GAAOiI,SAASF,GAASG,UAAUF,GAAUuB,WAA0C,aAA7BzV,GAAQiU,GAAS7L,SAC7EuH,EAAiB,UAAUuE,uBACtB,IAA4B,IAAxBsB,EAAavY,OACtB,MAAO,oDAAoD0U,mBAAmBuC,UAAiBvC,mBAAmBxW,EAAIG,QAEtHqU,EAAiBE,GAAM3B,kBAAkBsH,EAC1C,CAED,GAAIX,GAAaW,EAAa3H,SAASgH,EAAUa,QAC/C,MAAY,cAARpR,EAA6B,YACrB,KAEd,KACD,CACD,GAAK4P,EAEL,OApoBF,SAAiB/Y,EAAK0Z,EAAWX,EAAUvE,EAAgBrL,GACzD,OAAQ4P,GACN,IAAK,YACH,IAAK,MAAM7S,IAAO,IAAIlG,EAAI+W,aAAanU,QAAqB,MAARsD,GAAalG,EAAI+W,aAAapL,OAAOzF,GACzF,MAAO,GAAGsO,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAASxF,QAAQ,kBAAkByF,GAC/EA,EAAYzF,QAAQ,MAAO,OAE/B,IAAK,QACL,IAAK,UACH,IAAK,MAAM9O,IAAO,IAAIlG,EAAI+W,aAAanU,QAAqB,MAARsD,GAAalG,EAAI+W,aAAapL,OAAOzF,GACzF,MAAO,GAAGsO,KAAkBxU,EAAIwa,SAClC,IAAK,WACL,IAAK,UACH,IAAK,MAAMtU,IAAO,IAAIlG,EAAI+W,aAAanU,QAAqB,MAARsD,GAAalG,EAAI+W,aAAapL,OAAOzF,GACzF,MAAO,GAAGsO,WAAwBxU,EAAIwa,SACxC,IAAK,OAAQ,CACX,MAAME,EAAI1a,EAAI+W,aAAaZ,IAAI,KAC/B,OAAU,OAANuE,EAAmB,GAAGlG,WAAwBgC,mBAAmBkE,KAC9DlG,CACR,CACD,IAAK,SACH,IAAK,MAAMtO,KAAOlG,EAAI+W,aAAanU,OAAmB,KAAPsD,GAAYlG,EAAI+W,aAAapL,OAAOzF,GACnF,MAAO,GAAGsO,eAA4BxU,EAAIwa,SAC5C,IAAK,SAEH,OADAxa,EAAI+W,aAAapL,OAAO,MACjB3L,EAAIG,KAAK6U,QAAQ,gBAAiB,aAC3C,IAAK,WAGL,IAAK,cAEH,OADAhV,EAAI+W,aAAapL,OAAO,MACjB,cAAgB3L,EAAIG,KAC7B,IAAK,WAEH,GADAH,EAAI+W,aAAapL,OAAO,MACpB3L,EAAI+U,SAASwD,WAAW,YAAa,CACvC,MAAMjB,EAAM,sBAAsBqD,KAAK3a,EAAI+U,UAC3C,GAAIuC,EAEF,MAAO,GAAG9C,gBADC8C,EAAI,KAC6BtX,EAAIwa,QAEnD,CACD,MAAI,cAAcG,KAAK3a,EAAI+U,UAAkBP,EACtC,GAAGA,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAEhD,IAAK,QACL,IAAK,YACL,IAAK,WACL,IAAK,SAAU,CACb,MAAMjJ,EAAQvR,EAAI4a,SAASrD,MAAM,0CACjC,GAAIhG,GAASA,EAAMzP,OAAS,EAAG,CAC7B,MAAM+Y,EAAYtJ,EAAM,GACxB,GAAiB,QAAbsJ,IAAwBA,EAAUtC,WAAW,cAC/C,MAAO,GAAG/D,MAAmBqG,IAAY7a,EAAI+U,WAAW/U,EAAIwa,QAE/D,CACD,MAAO,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,YACL,IAAK,kBACH,MAAO,GAAGhG,KAAkBxU,EAAIwa,SAClC,IAAK,OACL,IAAK,QACH,OAAOhG,EACT,IAAK,iBACH,MAAO,GAAGA,KAAkBxU,EAAIwa,OAAOxF,QAAQ,KAAM,UAAUA,QAAQ,KAAM,UAAUA,QAAQ,OAAQ,OACzG,IAAK,MAAO,CACV,GAAI0E,GAAgC,qBAAnBA,EAAUzE,KAA6B,OAAOT,EAE/D,IAAIyC,EAAQ,CAAE6D,OAAQ,UAElBC,EAAY,IAChB,MAAMC,EAAgBtG,GAAM0C,iBAAiBpX,GAK7C,GAJIgb,EAAc3D,MAAQ2D,EAAcrE,KAAOqE,EAActE,MAC3DqE,EAAY,QAAQC,EAAc3D,QAAQ2D,EAAcrE,OAAOqE,EAActE,OAG3E1W,EAAI+U,SAASrC,SAAS,UAAW,CAEnC,MAAMoE,EAAQpC,GAAMmC,SAAS7W,GAC7B,IAAIyW,WAAEA,EAAUG,YAAEA,GAAgBlC,GAAM4B,gBAAgBQ,GAGxD,OAFAG,EAAMgE,KAAOrE,EACbK,EAAMiE,OAASzE,EACR,GAAGjC,uBAAoCE,GAAMsC,aAAaC,IAClE,CAED,GAAIjX,EAAI+U,SAASrC,SAAS,QAAS,CACjC,GAAI1S,EAAI+W,aAAahU,IAAI,cAAe,CACtC,MAAMoY,EAAc,CAClBC,QAAS,mBACTC,QAAS,oBACTC,UAAW,oBACXC,QAAS,oBAEXtE,EAAMuE,OAASL,EAAYnb,EAAI+W,aAAaZ,IAAI,cACjD,CACD,MAAMsF,EAAS,kEAAkEd,KAAK3a,EAAI+U,UACpF2G,EAAS,oBAAoBf,KAAK3a,EAAI+U,UAC5C,GAAI0G,EAAQ,CAEV,MAAMlB,EAAS7F,GAAM4B,gBAAgBqF,mBAAmBF,EAAO,KAAKhF,YAAc,GAC5EmF,EAAclH,GAAM4B,gBAAgBqF,mBAAmBF,EAAO,KAAKhF,YAAc,GACvFQ,EAAM4E,MAAQ,GAAGtB,KAAUqB,GAC5B,MAAM,GAAIF,EAAQ,CAEjB,MAAMnB,EAAS7F,GAAM4B,gBAAgBqF,mBAAmBD,EAAO,KAAKjF,YAAc,GAClFQ,EAAM4E,MAAQ,GAAGtB,IAC3B,KAAe,CAEL,MAAMA,EAAS7F,GAAM4B,gBAAgBtW,EAAI+W,aAAaZ,IAAI,WAAWM,YAAc,GAC7EmF,EAAclH,GAAM4B,gBAAgBtW,EAAI+W,aAAaZ,IAAI,gBAAgBM,YAAc,GAC7FQ,EAAM4E,MAAQ,GAAGtB,KAAUqB,GAC5B,CACD,MAAO,GAAGpH,gBAA6BE,GAAMsC,aAAaC,KAAS8D,GACpE,CAED,MAAMe,EAAa,mBACnB,GAAI9b,EAAI+U,SAASwC,MAAMuE,GAGrB,MAAO,GAAGtH,kBADIxU,EAAI+U,SAASwC,MAAMuE,GAAY,KACIf,IAGnD,GAAI/a,EAAI+W,aAAahU,IAAI,MAAO,CAE9B,MAAOgZ,EAAMC,GAAQhc,EAAI+W,aAAaZ,IAAI,MAAMqB,MAAM,KACtD,MAAO,GAAGhD,kBAA+BuH,OAAUC,GACpD,CAED,GAAIhc,EAAI+W,aAAahU,IAAI,aAAc,CAErC,MAAOgZ,EAAMC,GAAQhc,EAAI+W,aAAaZ,IAAI,aAAaqB,MAAM,KAC7D,MAAO,GAAGhD,kBAA+BuH,OAAUC,GACpD,CAED,MAAMlF,EAAQpC,GAAMmC,SAAS7W,GAC7B,OAAI8W,EAAc,GAAGtC,mBAAgCsC,IAAQiE,KAAarG,GAAMsC,aAAaC,KACtF,GAAGzC,KAAkBuG,KAAarG,GAAMsC,aAAaC,IAC7D,CACD,IAAK,aAAc,CACjB,IAAIgF,EACFC,EAAU,GAcZ,OAbIlc,EAAI4a,SAASrD,MAAM,0CACrB0E,EAAOjc,EAAI4a,SAASrD,MAAM,6CAErB0E,EADO,OAARA,GAAkBA,EACV,IAAIA,IADmB,GAEnCC,EAAUlc,EAAI+U,WAEdkH,EAAOjc,EAAI+U,SAASwC,MAAM,qCACrB0E,GAEHA,EAAO,IAAMA,EAAO,SACpBC,EAAUlc,EAAI+U,SAASwC,MAAM,oCAHpB0E,EAAO,IAMhBjc,EAAIG,KAAKqa,OAAO,0BAA4B,EACvC,GAAGhG,IAAiByH,IAAOC,IAAUlc,EAAIwa,SAC7CxF,QAAQ,wBAAyB,YACjCA,QAAQ,SAAU,IAEhB,GAAGR,IAAiByH,IAAOC,IAAUlc,EAAIwa,QACjD,CACD,IAAK,QACH,OAAIxa,EAAIG,KAAKqa,OAAO,oCAAsC,EACjD,GAAGhG,UAAuBxU,EAAI+U,WAAW/U,EAAIwa,SAC/C,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,SACL,IAAK,YAAa,CAChB,MAAMK,EAAY7a,EAAI4a,SAASrD,MAAM,6CACrC,IAAKsD,EAAW,MAAO,GAAGrG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAC9D,OAAQK,EAAU,IAChB,IAAK,UACH,MAAO,GAAGrG,gBAA6BxU,EAAI+U,WAAW/U,EAAIwa,SAC5D,IAAK,mBACH,MAAO,GAAGhG,yBAAsCxU,EAAI+U,WAAW/U,EAAIwa,SACrE,IAAK,IACH,MAAO,GAAGhG,QAAqBxU,EAAI+U,WAEvC,MAAO,GAAGP,aAA0BxU,EAAI+U,UACzC,CACD,IAAK,SACH,MAAI,yCAAyCtC,KAAKzS,EAAI4a,UAClC,IAAd5a,EAAIwa,OAAqB,GAAGhG,IAAiBxU,EAAI+U,yBAAyB/U,EAAI4a,WACtE,GAAGpG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,uBAAuBxa,EAAI4a,WAEzE,GAAGpG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,UACL,IAAK,SACH,MAAI,yCAAyC/H,KAAKzS,EAAI4a,UAAkBpG,EACjE,GAAGA,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,UAAW,CACd,MAAMlY,EAAItC,EAAI+U,SACd,OAAIzS,EAAEiW,WAAW,cAAgBjW,EAAEiW,WAAW,SAAWjW,EAAEiW,WAAW,UAAYjW,EAAEiW,WAAW,aACtF/D,EAEF,GAAGA,IAAiBlS,GAC5B,CACD,IAAK,OACH,OAAItC,EAAI+U,SAASG,SAAS,WAAmB,GAAGV,IAAiBxU,EAAI+U,WAC9D,GAAGP,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,eACH,MAAO,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,kBACH,OAAKxa,EAAI+U,SAASrC,SAAS,gBAAmB1S,EAAI+U,SAASrC,SAAS,gBAAkC,KAAhB1S,EAAI+U,SAEnF,GAAGP,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SADrChG,EAEX,IAAK,oBAAqB,CACxB,GAAoB,qBAAhBxU,EAAI4a,SAAiC,CACvC,MAAMuB,EAAW,iBAAiBxB,KAAK3a,EAAI+U,UAC3C,OAAIoH,EAAiB,GAAG3H,eAA4B2H,EAAS,KAAKnc,EAAIwa,SAC/D,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,GAAoB,KAAhBxa,EAAI+U,UAAmC,IAAhB/U,EAAI+U,SAE7B,MAAO,GAAGP,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAEhD,MAAMjJ,EAAQvR,EAAIG,KAAKoX,MAAM,mEAC7B,GAAIhG,GAASA,EAAMzP,OAAS,EAC1B,OAAIyP,EAAM,GACD,GAAGiD,cAA2BxU,EAAI4a,WAAW5a,EAAI+U,WAAW/U,EAAIwa,SAGlE,GAAGhG,cADQjD,EAAM,KACyBvR,EAAI+U,WAAW/U,EAAIwa,SAEtE,MAAM4B,EAAmBpc,EAAI4a,SAASrD,MACpC,0HAEF,OAAI6E,EACK,GAAG5H,cAA2B4H,EAAiB,KAAKpc,EAAI+U,WAAW/U,EAAIwa,SAEzE,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,cACH,MAAO,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,WAAY,CACf,IAAI6B,EAAYrc,EAAIiV,KAAKuC,MAAM,KAE/B,MAAoB,aAAhB6E,EAAU,IAAqC,OAAhBA,EAAU,GAEpC,GAAG7H,UADGxU,EAAI4a,SAASpD,MAAM,KAAK,KACGxX,EAAI+U,WAAW/U,EAAIwa,SAASxa,EAAIsc,OAEnE,GAAG9H,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAASxa,EAAIsc,MAC5D,CACD,IAAK,WAAY,CACf,IAAID,EAAYrc,EAAIiV,KAAKuC,MAAM,KAO/B,MALoB,aAAhB6E,EAAU,IAAqC,OAAhBA,EAAU,KACvB,KAAhBA,EAAU,GAAWrc,EAAI+W,aAAa5T,OAAO,eAAgB,sBAC5DnD,EAAI+W,aAAa5T,OAAO,OAAQkZ,EAAU,IAC3B,KAAhBA,EAAU,IAAWrc,EAAI+W,aAAa5T,OAAO,eAAgB,uBAE5D,GAAGqR,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAASxa,EAAIsc,MAC5D,CACD,IAAK,YACL,IAAK,WACH,OAAItc,EAAI+U,SAASwD,WAAW,UAAkB/D,EACvC,GAAGA,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,iBAAkB,CACrB,MAAMjJ,EAAQ,+BAA+BoJ,KAAK3a,EAAI+U,UACtD,GAAIxD,EAAO,CACT,MAAMgL,EAAOhL,EAAM,GACnB,MAAO,GAAGiD,kCAA+CgC,mBAAmB+F,IAC7E,CACD,MAAMb,EAAS,0BAA0Bf,KAAK3a,EAAI+U,UAClD,GAAI2G,EAAQ,CACV,IAAIa,EAAOb,EAAO,GAElB,OADAa,EAAOA,EAAKvH,QAAQ0G,EAAO,GAAIA,EAAO,GAAK,OACpC,0BAA0Ba,GAClC,CACD,MACD,CACD,IAAK,SACH,MAAoB,mBAAhBvc,EAAI4a,SAAsC,GAAGpG,SAAsBxU,EAAI+U,WAAW/U,EAAIwa,SACtE,6BAAhBxa,EAAI4a,SAAgD,GAAGpG,QAAqBxU,EAAI+U,WAAW/U,EAAIwa,SAC5F,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,gBACH,GAAoB,gBAAhBxa,EAAI4a,UAA8C,oBAAhB5a,EAAI4a,UAAkD,UAAhB5a,EAAI4a,SAC9E,MAAO,GAAGpG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,GAAoB,sBAAhBxa,EAAI4a,SAAkC,MAAO,GAAGpG,UAAuBxU,EAAI+U,WAAW/U,EAAIwa,SAChG,IAAK,OACH,GAAoB,gBAAhBxa,EAAI4a,UAA8C,WAAhB5a,EAAI+U,SAAuB,CAC/D,MAAM+B,EAAQ9W,EAAI+W,aAAaZ,IAAI,KACnC,MAAO,GAAG3B,sBAAmCgC,mBAAmBM,IACjE,CACD,GAAI9W,EAAI4a,SAAS1F,SAAS,gBAAiB,CACzC,MACMsH,EADQ,uBAAuB7B,KAAK3a,EAAI4a,UACzB,GACrB,GAAoB,KAAhB5a,EAAI+U,UAAmC,UAAhB/U,EAAI+U,SAC7B,MAAO,GAAGP,qBAAkCgI,IACvC,CACL,MAAMjL,EAAQ,gBAAgBoJ,KAAK3a,EAAI+U,UACvC,GAAIxD,EAGF,MAAO,GAAGiD,wBAAqCgI,UAFlCjL,EAAM,WACNA,EAAM,IAGtB,CACF,CACD,GAAoB,iBAAhBvR,EAAI4a,SAGN,MAAO,GAAGpG,oBAFI,cAAcmG,KAAK3a,EAAI+U,UACjB,KAGtB,GAAoB,iBAAhB/U,EAAI4a,SAA6B,CACnC,MAAMrJ,EAAQ,6BAA6BoJ,KAAK3a,EAAI+U,UACpD,GAAIxD,EAAO,CACT,MAAMkL,EAAYlL,EAAM,GAClBmL,EAASnL,EAAM,GACfoL,EAAOpL,EAAM,GACbqL,EAAQ5c,EAAI+W,aAAaZ,IAAI,SACnC,MAAO,GAAG3B,0BAAuCiI,YAAoBC,UAAeC,WAAcnG,mBAAmBoG,IACtH,CACF,CAEH,IAAK,YACH,MAAoB,gBAAhB5c,EAAI4a,SAAmC,GAAGpG,yBAAsCgC,mBAAmBxW,EAAIG,QACpG,GAAGqU,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,aACH,GAAoB,gBAAhBxa,EAAI4a,SAA4B,MAAO,GAAGpG,iBAA8BgC,mBAAmBxW,EAAIG,QACnG,MAAMoR,EAAQ,iBAAiBoJ,KAAK3a,EAAI+U,UACxC,OAAIxD,EAAc,GAAGiD,IAAiBjD,EAAM,KACrC,GAAGiD,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,aAAc,CACjB,IAAIjL,EAAOvP,EAAI+U,SAEf,MADY,KAARxF,IAAaA,EAAO,IACjB,GAAGiF,KAAkBxU,EAAI4a,WAAWrL,IAAOvP,EAAIwa,QACvD,CACD,IAAK,SAAU,CACb,MAAMjJ,EAAQ,uBAAuBoJ,KAAK3a,EAAI4a,UAC9C,GAAIrJ,EAAO,CACT,MAAMsL,EAAOtL,EAAM,GAEnB,OADAvR,EAAI+W,aAAa5T,OAAO,OAAQ0Z,GACzB,GAAGrI,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,MAAO,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,cACL,IAAK,UACL,IAAK,UAAW,CACd,MAAMjJ,EAAQ,qBAAqBoJ,KAAK3a,EAAI+U,UAC5C,OAAIxD,EAEK,GAAGiD,KADGjD,EAAM,KACgBvR,EAAIwa,SAElC,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,SAAU,CACb,MAAMjJ,EAAQ,qBAAqBoJ,KAAK3a,EAAI+U,UAC5C,GAAIxD,EAAO,CACT,IAAIhC,EAAOgC,EAAM,GAEjB,OADIhC,EAAKgJ,WAAW,WAAUhJ,EAAOA,EAAKyF,QAAQ,OAAQ,QACnD,GAAGR,KAAkBjF,IAAOvP,EAAIwa,QACxC,CACD,MAAO,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,YAMH,OAJAxa,EAAI+W,aAAapL,OAAO,MAEZ,aAARxC,GAAqBnJ,EAAI+W,aAAa5T,OAAO,WAAY,KAEzC,YAAhBnD,EAAI4a,UAA2B5a,EAAI4a,SAAS1F,SAAS,gBAAkBlV,EAAI+U,SAASwD,WAAW,SAE1F,GAAG/D,aADIxU,EAAI+U,SAAS+H,UAAU9c,EAAI+U,SAASgI,YAAY,KAAO,MACxB/c,EAAIwa,OAAOsC,UAAU,KAEhE9c,EAAI4a,SAAS1F,SAAS,gBAAkBlV,EAAI+U,SAASwD,WAAW,cAAsBvY,EAAIG,KACvF,GAAGqU,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAEhD,IAAK,gBACH,MAAoB,YAAhBxa,EAAI4a,UAA2B5a,EAAI4a,SAAS1F,SAAS,gBAAkBlV,EAAI+U,SAASwD,WAAW,SAE1F,kCADOvY,EAAI+U,SAAS+H,UAAU9c,EAAI+U,SAASgI,YAAY,KAAO,KAGhE,cAAgB/c,EAAIG,KAE7B,IAAK,iBACH,MAAoB,YAAhBH,EAAI4a,UAA2B5a,EAAI4a,SAAS1F,SAAS,gBAAkBlV,EAAI+U,SAASwD,WAAW,SAE1F,GAAG/D,aADIxU,EAAI+U,SAAS+H,UAAU9c,EAAI+U,SAASgI,YAAY,KAAO,KAGhE,GAAGvI,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAEhD,IAAK,eAEH,GADAxa,EAAI+W,aAAapL,OAAO,MACJ,YAAhB3L,EAAI4a,UAA2B5a,EAAI4a,SAAS1F,SAAS,gBAAkBlV,EAAI+U,SAASwD,WAAW,SAEjG,MAAO,GAAG/D,WADIxU,EAAI+U,SAAS+H,UAAU9c,EAAI+U,SAASgI,YAAY,KAAO,KAC3B/c,EAAIwa,OAAOxF,QAAQ,IAAK,OAEpE,GAAIhV,EAAI4a,SAAS1F,SAAS,eAAgB,CACxC,GAAIlV,EAAI+U,SAASwD,WAAW,UAAW,CACrC,GAAIvY,EAAI+W,aAAahU,IAAI,KAAM,CAC7B,MAAMia,EAAQhd,EAAI+W,aAAaZ,IAAI,KAEnC,OADAnW,EAAI+W,aAAapL,OAAO,KACjB,GAAG6I,WAAwBwI,IAAQhd,EAAIwa,OAAOxF,QAAQ,IAAK,MACnE,CACD,MAAO,GAAGR,WAAwBxU,EAAIwa,OAAOxF,QAAQ,IAAK,MAC3D,CACD,GAAIhV,EAAI+U,SAASwD,WAAW,YAAa,CACvC,GAAIvY,EAAI+W,aAAahU,IAAI,gBAAiB,CACxC,MAAMyX,EAASxa,EAAI+W,aAAaZ,IAAI,gBAEpC,OADAnW,EAAI+W,aAAapL,OAAO,gBACjB,GAAG6I,YAAyBgG,IAASxa,EAAIwa,OAAOxF,QAAQ,IAAK,MACrE,CACD,MAAO,GAAGR,YAAyBxU,EAAIwa,OAAOxF,QAAQ,IAAK,MAC5D,CACD,GAAIhV,EAAI+U,SAASwD,WAAW,cAC1B,OAAOvY,EAAIG,IAEd,CACD,MAAO,GAAGqU,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAEhD,IAAK,WACH,MAAI,8BAA8BG,KAAK3a,EAAI+U,UAClC,GAAGP,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAEzChG,EAET,IAAK,cAEH,OADAxU,EAAI+W,aAAapL,OAAO,MACpB3L,EAAI+U,SAASwD,WAAW,YAAoB,GAAG/D,iBAA8BgC,mBAAmBxW,EAAIG,QACpGH,EAAI+U,SAASwD,WAAW,UAAkB,GAAG/D,gBAA6BgC,mBAAmBxW,EAAIG,QAC9FqU,EACT,IAAK,iBACH,MAAoB,KAAhBxU,EAAI+U,SAAwB,GAAGP,sBAC/BxU,EAAI+U,SAASwC,MAAM,oBAA4B,GAAG/C,iBAA8BgC,mBAAmBxW,EAAIG,QACvGH,EAAI+U,SAASwC,MAAM,qBAA6B,GAAG/C,gBAA6BgC,mBAAmBxW,EAAIG,QACpGqU,EACT,IAAK,SACL,IAAK,aACH,OAAIxU,EAAI4a,SAASrC,WAAW,UAAkB,GAAG/D,SAAsBxU,EAAI+U,WAAW/U,EAAIwa,SACnF,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAEhD,IAAK,cACH,MAAO,GAAGhG,MAAmBxU,EAAI+U,SAAS1T,MAAM,KAClD,IAAK,UACH,MAAoB,KAAhBrB,EAAI+U,SAAwBP,EACzB,GAAGA,SAAsBgC,mBAAmBxW,EAAIG,QACzD,IAAK,SAAU,CACb,IAAIqa,EAAS,IAAItD,gBAAgBlX,EAAIwa,QAUrC,GARAA,EAAO7O,OAAO,WACd6O,EAAO7O,OAAO,WACd6O,EAAO7O,OAAO,KACd6O,EAAO7O,OAAO,KAEd6O,EAASA,EAAOrD,WACD,KAAXqD,IAAeA,EAAS,IAAIA,KAED,QAA3Bxa,EAAIiV,KAAKuC,MAAM,KAAK,IAA2C,UAA3BxX,EAAIiV,KAAKuC,MAAM,KAAK,GAC1D,IACE,MAAM,CAAGyF,EAAIP,EAAQQ,GAAS1C,EAAOjD,MAAM,0BACrCT,EAAQN,mBAAmB,GAAGyG,KAAMP,KAAUQ,KACpD,MAAO,GAAG1I,QAAqBxU,EAAI+U,WAAW+B,GACxD,CAAU,MACA,MAAO,GAAGtC,QAAqBxU,EAAI+U,WAAWyF,GAC/C,CAEH,OAAIxa,EAAI+U,SAASyC,MAAM,KAAK9E,SAAS,UAC5B,GAAG8B,IAAiBxU,EAAI+U,SAASC,QAAQ,UAAW,MAAMwF,IACnD,QAAZxa,EAAIiV,KAAuB,GAAGT,SAAsBxU,EAAI+U,WACrD,GAAGP,IAAiBxU,EAAI+U,WAAWyF,KAC3C,CACD,IAAK,YAAa,CAChB,GAAoB,kBAAhBxa,EAAI4a,SAA8B,MAAO,GAAGpG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SACpF,GAAIxa,EAAI4a,SAASrC,WAAW,UAAW,MAAO,GAAG/D,gBAA6BxU,EAAI+U,WAAW/U,EAAIwa,SACjG,GAAIxa,EAAI4a,SAASrC,WAAW,UAAW,MAAO,GAAG/D,gBAA6BxU,EAAI+U,WAAW/U,EAAIwa,SAEjG,MAAMlD,EAAM,gCAAgCqD,KAAK3a,EAAI4a,UACrD,GAAItD,EAAK,MAAO,GAAG9C,gBAA6B8C,EAAI,KAAKtX,EAAI+U,WAAW/U,EAAIwa,SAE5E,MAAM2C,EAAY,sCAAsCxC,KAAK3a,EAAI4a,UACjE,GAAIuC,EAAW,CACb,MAAMC,EAAYD,EAAU,GAE5B,OAAInd,EAAI+U,SAASwD,WAAW,SACnB,GAAG/D,KAAkB4I,IAAYpd,EAAI+U,SAAS1T,MAAM,KAAKrB,EAAIwa,SAC1D,GAAGhG,KAAkB4I,IAAYpd,EAAI+U,WAAW/U,EAAIwa,QACjE,CACD,MAAO,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,cACL,IAAK,UACH,GAAIxa,EAAI+U,SAASwD,WAAW,eAI1B,OAHAvY,EAAI+W,aAAa1Q,IAAI,cAAerG,EAAI+W,aAAaZ,IAAI,UACzDnW,EAAI+W,aAAapL,OAAO,SACxB3L,EAAI+W,aAAapL,OAAO,eACjB,GAAG6I,WAAwBxU,EAAIwa,SAExC,GAAIxa,EAAI+U,SAASwD,WAAW,WAAY,OACxC,MAAO,GAAG/D,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,eAEH,OADAxa,EAAI+W,aAAapL,OAAO,MACjB,GAAG6I,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,WAAY,CACf,MAAMlD,EAAM,yCAAyCqD,KAAK3a,EAAI+U,UAC9D,OAAIuC,EAAY,GAAG9C,OAAoB8C,EAAI,KAAKtX,EAAIwa,SAC7C,GAAGhG,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,YAAa,CAChB,GAAIxa,EAAI+U,SAASwD,WAAW,WAAY,MAAO,GAAG/D,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,kBAEtF,MAAM6C,EAAS,yBAAyB1C,KAAK3a,EAAI+U,UACjD,GAAIsI,EAAQ,MAAO,GAAG7I,UAAuB6I,EAAO,MAAMA,EAAO,KAAKrd,EAAIwa,SAE1E,MAAM8C,EAAU,eAAe3C,KAAK3a,EAAI+U,UACxC,GAAIuI,EAAS,MAAO,GAAG9I,kBAA+B8I,EAAQ,gBAE9D,MAAMC,EAAa,4BAA4B5C,KAAK3a,EAAI+U,UACxD,OAAIwI,EAAmB,GAAG/I,kBAA+B+I,EAAW,kBAE7D,GAAG/I,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,QAAS,CACZ,GAAIxa,EAAI+U,SAASwD,WAAW,UAC1B,MAAO,GAAG/D,QAAqBgC,mBAAmBxW,EAAI+W,aAAaZ,IAAI,QAEzE,MAAMqH,EAAa,sBAAsB7C,KAAK3a,EAAI+U,UAClD,OAAIyI,EAAmB,GAAGhJ,kBAA+BgJ,EAAW,KAEhExd,EAAI+U,SAASwD,WAAW,aACnB,GAAG/D,oBAAiCgC,mBAAmBxW,EAAI+W,aAAaZ,IAAI,WAC9E,GAAG3B,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,QAC/C,CACD,IAAK,OACH,OAAIxa,EAAI+U,SAASwD,WAAW,WAAavY,EAAI+U,SAASwD,WAAW,aACxD,GAAG/D,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAE7B,kBAAkBG,KAAK3a,EAAI+U,UACvB,GAAGP,YAAyBxU,EAAI+U,WAAW/U,EAAIwa,SAC/DhG,EAET,IAAK,mBACH,MAAO,gEAET,IAAK,aACH,GAAIxU,EAAI+U,SAASwD,WAAW,UAAYvY,EAAI+U,SAASwD,WAAW,WAE9D,OAAO/D,EAGT,GAAIxU,EAAI+U,SAASwD,WAAW,WAAY,CACtC,IAAKvY,EAAIwa,OACP,OAAOhG,EAGT,IAAIrL,EAAO,GASX,OARInJ,EAAI+U,SAASwD,WAAW,kBAC1BpP,EAAO,SACEnJ,EAAI+U,SAASwD,WAAW,kBACjCpP,EAAO,SACEnJ,EAAI+U,SAASwD,WAAW,mBAAqBvY,EAAI+U,SAASwD,WAAW,mBAC9EpP,EAAO,aAGLA,GACFA,EAAO,SAAWA,EAKb,GAAGqL,WAAwBxU,EAAIwa,SAASrR,KAHtCqL,CAIV,CAED,MAAgB,qBAAZxU,EAAIiV,KACC,GAAGT,OAAoBxU,EAAI+U,WAG7B,GAAGP,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAChD,IAAK,QACL,IAAK,gBACL,IAAK,YACL,IAAK,YACL,IAAK,WACHxa,EAAI+W,aAAapL,OAAO,MAC1B,QACE,MAAO,GAAG6I,IAAiBxU,EAAI+U,WAAW/U,EAAIwa,SAEpD,CAoESiD,CAAQzd,EAAK0Z,EAAWX,EAAUvE,EAAgBrL,EArDuB,CAsDlF,CA4EAgK,eAAeuK,GAAQ1d,GACrB,IAAI6E,QAAgB6P,GAAMuB,aACtBlF,QAAe2D,GAAMmB,YACzB,IAAK,MAAMiD,KAAW/H,EAAOiI,SAAU,CACrC,IAAID,EAAWlU,EAAQiU,GAASC,SAChC,GAAyBtX,MAArBoD,EAAQkU,OAEVlU,EAAQkU,GAAUT,WAAUrL,GAAYjN,EAAIG,KAAKoY,WAAWtL,KAAa,IACxEjN,EAAIG,KAAKoY,WAAW,UAAUQ,qBAGjC,OAAQD,GACN,IAAK,UACL,IAAK,OACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,SACL,IAAK,kBACL,IAAK,QACL,IAAK,UACL,IAAK,SACL,IAAK,YACH,MAAO,GAAG/H,EAAOiI,SAASF,GAAS9Y,MAAMA,EAAI+U,WAAW/U,EAAIwa,SAC9D,IAAK,SAAU,CACb,IAAIjJ,EAAQvR,EAAI+U,SAASwC,MAAM,kCAC/B,OAAIhG,EAAc,WAAWA,EAAM,sBAAsBA,EAAM,UAC/D,CACD,CACD,IAAK,YAAa,CAChB,MAAMsL,EAAO7c,EAAI+W,aAAaZ,IAAI,QAClC,OAAY,MAAR0G,EACK,WAAWA,kBAAqB7c,EAAI+U,WAAW/U,EAAIwa,SAASxa,EAAIsc,OAElE,wBAAwBtc,EAAI+U,WAAW/U,EAAIwa,SAASxa,EAAIsc,MAChE,CACD,IAAK,gBACH,GAAItc,EAAI+U,SAASwD,WAAW,eAC1B,MAAO,4BAA4BvY,EAAI+U,WAAW/U,EAAIwa,SAExD,GAAIxa,EAAI+U,SAASwD,WAAW,cAAe,CACzC,MAAMhH,EAAQ,0BAA0BoJ,KAAK3a,EAAI+U,UACjD,GAAIxD,EACF,OAAIA,EAAM,GAAGmB,SAAS,KACb,WAAWnB,EAAM,KAAKA,EAAM,KAE5B,WAAWA,EAAM,uBAAuBA,EAAM,IAG1D,CACD,OAEF,IAAK,WACH,MAAO,GAAGR,EAAOiI,SAASF,GAAS9Y,OAAOA,EAAIwa,OAAOnZ,MAAM,KAC7D,IAAK,YACH,MAAO,wBAAwBrB,EAAI+U,WAAW/U,EAAIwa,SACpD,IAAK,aACH,GAAgB,cAAZzB,EAA0B,CAC5B,GAAI/Y,EAAI+U,SAASrC,SAAS,OAExB,MAAO,GAAG3B,EAAOiI,SAASF,GAAS9Y,MAAMA,EAAI+U,SAASyC,MAAM,OAAO,KAGrE,GAAoB,WAAhBxX,EAAI+U,SAAuB,CAC7B,IAAI5L,EAAOnJ,EAAI+W,aAAaZ,IAAI,QAChC,OAAQhN,GACN,IAAK,YACHA,EAAO,OACP,MACF,IAAK,SACHA,EAAO,SACP,MACF,IAAK,QACHA,EAAO,SACP,MACF,QACEA,EAAO,GAIX,OADAnJ,EAAI+W,aAAapL,OAAO,QACnBxC,EAGI,GAAG4H,EAAOiI,SAASF,GAAS9Y,cAAcmJ,KAAQnJ,EAAI+W,aAAaI,aAFnE,GAAGpG,EAAOiI,SAASF,GAAS9Y,cAAcA,EAAI+W,aAAaI,YAIrE,CAED,MAAO,GAAGpG,EAAOiI,SAASF,GAAS9Y,MAAMA,EAAI+U,UAC9C,CACH,QACE,OAEL,CAEH,CA92BAnD,OAAOD,QAAUC,OAAOD,SAAWC,OAAOC,OAS1C7E,KACA2E,QAAQuE,QAAQyH,UAAUC,YAAY5Q,IAs2BtC,MAAM6Q,GAAmB,CACvBC,aAAc,CAAC,6BACfC,SAAU,CAAC,uBACXC,MAAO,CAAC,sCACRC,cAAe,CAAC,sCAChBC,UAAW,CAAC,4BACZC,UAAW,CAAC,2BACZC,SAAU,CAAC,wBACXC,SAAU,CAAC,qCACXC,UAAW,CAAC,6BACZC,OAAQ,CAAC,0BACTC,OAAQ,CAAC,sBACTC,QAAS,CAAC,2BACVC,OAAQ,CAAC,sBACTC,UAAW,CAAC,sBACZC,MAAO,CAAC,2BACRC,SAAU,CAAC,wBACXC,OAAQ,CAAC,0BACTC,SAAU,CAAC,4BACXC,gBAAiB,CAAC,+BAClBC,UAAW,CAAC,wBACZC,MAAO,CAAC,0BACRC,QAAS,CAAC,+BACV,OAAQ,CAAC,mBACTC,SAAU,CAAC,qCACXC,MAAO,CAAC,yBACRC,UAAW,CAAC,8BACZC,IAAK,CAAC,iCACNC,WAAY,CAAC,0BACbC,QAAS,CAAC,sBACVC,KAAM,CAAC,sBACPC,aAAc,CAAC,qCACfC,gBAAiB,CAAC,sBAClBC,kBAAmB,CAAC,gCACpBC,KAAM,CAAC,sBACPC,QAAS,CAAC,sBACVC,QAAS,CAAC,sBACVC,KAAM,CAAC,sBACPC,eAAgB,CAAC,+BACjBC,KAAM,CAAC,uBACPC,WAAY,CAAC,uBACbC,UAAW,CAAC,wBACZC,WAAY,CAAC,wBACbC,QAAS,CAAC,gCACVC,QAAS,CAAC,8BAA+B,6BACzCC,YAAa,CAAC,0BACdC,OAAQ,CAAC,wBACTC,gBAAiB,CAAC,0CAClBC,cAAe,CAAC,sBAChBC,YAAa,CAAC,sCACdC,WAAY,CAAC,kCACbC,OAAQ,CAAC,2BACTC,UAAW,CAAC,yBACZC,YAAa,CAAC,sBACdC,eAAgB,CAAC,sBACjBC,YAAa,CAAC,2CACdC,QAAS,CAAC,0BACVC,UAAW,CAAC,wBACZC,OAAQ,CAAC,iCACTC,OAAQ,CAAC,+BACTC,MAAO,CAAC,wBACRC,QAAS,CAAC,sBACVC,YAAa,CAAC,4BACdC,aAAc,CAAC,wBACfC,SAAU,CAAC,8BACXC,UAAW,CAAC,4BACZC,MAAO,CAAC,uBACRC,cAAe,CAAC,sBAChBC,cAAe,CAAC,wCAChBC,KAAM,CAAC,6BACPC,WAAY,CAAC,8BACbC,OAAQ,CAAC,8BACTC,SAAU,CAAC,mCACXC,eAAgB,CAAC,8BACjBC,SAAU,CAAC,yBAGbnP,eAAeoP,KACb,IAAIxR,QAAe2D,GAAMmB,YACrBhR,EAAU,CAAE,EAChB,IAAK,MAAMiU,KAAW/H,EAAOiI,SAAU,CACrCnU,EAAQiU,GAAW,CAAE,EACrB,IAAK,MAAM0J,KAAiBzR,EAAOiI,SAASF,GAASjU,QACnDA,EAAQiU,GAAS0J,GAAiBzR,EAAOiI,SAASF,GAASjU,QAAQ2d,GAErE,IAAK,MAAMzJ,KAAYhI,EAAOiI,SAASF,GAASG,UAC1ClI,EAAOiI,SAASF,GAASG,UAAUF,GAAUsB,eAC/CxV,EAAQkU,GAAY,GAGzB,CAUD,OATAlU,EAAQyM,WAAa,CACnBtR,IAAK,GACLuR,MAAO,IAET1M,EAAQoT,MAAQ,SAChBpT,EAAQ4d,cAAgB,CAAC,UAAW,SAAU,QAAS,SAAU,QAAS,YAAa,QACvF5d,EAAQ0Q,eAAiB,SACzB1Q,EAAQiV,yBAA0B,EAClCjV,EAAU,IAAKA,KAAYgZ,IACpBhZ,CACT,CAwGe,IAAA6d,GAAA,CACbjJ,YACAkJ,cAjXFxP,eAA6BnT,EAAKmJ,EAAMuQ,EAAWC,EAAaC,EAAWC,GAEzE,aADM7M,KACCyM,GAASzZ,EAAKmJ,EAAMuQ,EAAWC,EAAaC,EAAWC,EAChE,EA+WE+I,uBA1WFzP,eAAsCnT,GACpC,MAAM+Q,QAAe2D,GAAMmB,YACrBhR,QAAgB6P,GAAMuB,aAC5B,IAAK,MAAM6C,KAAW/H,EAAOiI,SAAU,CACrC,GAAIE,GAAWJ,EAAS9Y,EAAK+Q,EAAQlM,GACnC,MAAO,CAAEiU,UAASC,SAAU,MAE5B,IAAK,MAAMA,KAAYhI,EAAOiI,SAASF,GAASG,UAAW,CACzD,MACMlX,EADY0W,GAAIK,EAASC,EAAUlU,EAASkM,GAC9BuH,WAAUrL,GAAYjN,EAAIG,KAAKoY,WAAWtL,KAC9D,GAAIlL,GAAK,EACP,MAAO,CAAE+W,UAASC,WAErB,CAEJ,CACH,EA2VE2E,WACAmF,aA3GF,WACE,OAAO,IAAI5Y,SAAQC,IACjByH,QAAQuE,QAAQxK,MAAMX,OAAMoI,UAC1BtO,SAAgB0d,KAChB5Q,QAAQuE,QAAQxK,MAAMrF,IAAI,CAAExB,aAAW,IAAMqF,KAAU,GACvD,GAEN,EAqGE4Y,cAnGF,SAAuBhR,GACrB,OAAO,IAAI7H,SAAQkJ,UACjB,MAAMpC,QAAe2D,GAAMmB,YAC3B,IAAIhR,EAAUiN,SAAmB4C,GAAMuB,aAEvC,MAAM8M,QAAiBR,KAGvB,IAAK,MAAMS,KAAcne,EACvB,GAAMme,KAAcD,GACf,GAA0B,iBAAfC,GAA0C,OAAfA,EACzC,IAAK,MAAMC,KAAiBpe,EAAQme,GAC5BC,KAAiBF,EAASC,WAAqBne,EAAQme,GAAYC,eAHvCpe,EAAQme,GAShDne,EAAQ4d,cAAgB5d,EAAQ4d,cAAc9V,QAAOmM,GAAWA,KAAW/H,EAAOiI,WAGlF,IAAK,MAAOkK,EAAaC,KAAiBhkB,OAAOikB,QAAQL,GACjDG,KAAere,IACnBA,EAAQqe,GAAeC,GAI3B,IAAK,MAAOE,EAAaC,KAAiBnkB,OAAOikB,QAAQrS,EAAOiI,UAAW,CAEnEnU,EAAQwe,GAAatK,YAAYuK,EAAarK,YAClDpU,EAAQwe,GAAeC,EAAaze,SAItC,IAAK,MAAMme,KAAcM,EAAaze,QAC9Bme,KAAcne,EAAQwe,KAC1Bxe,EAAQwe,GAAaL,GAAcM,EAAaze,QAAQme,GAG7D,CAEDrR,QAAQuE,QAAQxK,MAAMX,OAAM,IAAM4G,QAAQuE,QAAQxK,MAAMrF,IAAI,CAAExB,YAAW,IAAMqF,OAAW,GAE9F,EAyDEqZ,QApDFpQ,eAAuBnT,GACrB,MAAMwjB,QAAe9F,GAAQ1d,GAC7B,GAAIwjB,EACF,GAAK7K,GAEE,CACL,IAAI8K,EAAWxjB,SAASC,cAAc,YACtCujB,EAASC,YAAcF,EACvBvjB,SAAS0jB,KAAKrgB,YAAYmgB,GAC1BA,EAASzc,SACT/G,SAAS2jB,YAAY,QACrBH,EAASI,OACT5jB,SAAS0jB,KAAK/f,YAAY6f,EAC3B,MATCK,UAAUC,UAAUC,UAAUR,EAWpC,EAsCES,eAzVF,SAAwBjkB,EAAKkkB,GAC3B,OAAO,IAAIja,SAAQkJ,UACjB,IAAItO,QAAgB6P,GAAMuB,aACtBlF,QAAe2D,GAAMmB,YAGzB,GADqBnB,GAAMI,aAAa9U,GACpCkkB,EAAe,CACjB,MAAMC,EAAgBtf,EAAQA,EAAQqf,GAAenL,UACrD,QAAsBtX,IAAlB0iB,EAA6B,CAC/B,MAAMC,EAAc1P,GAAMC,gBAAgB3U,EAAIua,OAAQ4J,GACtD,GAAIC,EACF,OAAOla,EAAQ,GAAGka,IAAcpkB,EAAI+U,WAAW/U,EAAIwa,SAEtD,CACP,MACM,IAAK,MAAM1B,KAAW/H,EAAOiI,SAAU,CACrC,IAAImL,EAAgBtf,EAAQA,EAAQiU,GAASC,UAC7C,QAAsBtX,IAAlB0iB,EAA6B,SACjC,MAAM/X,EAAQ+X,EAAc7L,WAAUrL,GAAYjN,EAAIG,KAAKoY,WAAWtL,KACtE,GAAIb,EAAQ,EAAG,SAEf,GADA+X,EAAc5V,OAAOnC,EAAO,GACC,IAAzB+X,EAAcriB,OAAc,OAAOoI,IACvC,MAAMka,EAAc1P,GAAMC,gBAAgB3U,EAAIua,OAAQ4J,GACtD,GAAIC,EACF,OAAOla,EAAQ,GAAGka,IAAcpkB,EAAI+U,WAAW/U,EAAIwa,SAEtD,CAEHtQ,GAAS,GAEb,EA4TEma,YAlCF,SAAqBrkB,GACnB,IAAK6E,GAAS,OAAO,EACrB,IAAKA,GAAQyM,WAAY,OAAO,EAChC,IAAIA,EAAazM,GAAQyM,WACzB,GAAIA,GAActR,EAAK,CACrB,GAAIsR,EAAWtR,IACb,IAAK,IAAIskB,KAAQhT,EAAWtR,IAG1B,GAFAskB,EAAO,IAAIC,IAAID,GACfA,EAAOA,EAAKnkB,KAAK6U,QAAQ,aAAc,YACnCsP,GAAQtkB,EAAIG,KACd,OAAO,EAIb,GAAImR,EAAWC,MACb,IAAK,MAAM+S,KAAQhT,EAAWC,MAC5B,GAAI,IAAIiI,OAAO8K,GAAM7R,KAAKzS,EAAIG,MAC5B,OAAO,CAId,CACD,OAAO,CACT,8BCz/BKqkB,GAAAvjB,KAAQ+P,KAAKC,WAAW,mBAAqB,mBAAiB,kDAD7BhR,SAAS0jB,KAAKc,sNAa/CD,GAAAvjB,KAAQ+P,KAAKC,WAAW,mBAAqB,mBAAiB,kDAD7BhR,SAAS0jB,KAAKc,sNAM/CD,GAAAvjB,KAAQ+P,KAAKC,WAAW,yBAA2B,2BAAyB,kDAD3ChR,SAAS0jB,KAAKc,sNAM/CD,GAAAvjB,KAAQ+P,KAAKC,WAAW,2BAA6B,6BAA2B,kDAD/ChR,SAAS0jB,KAAKc,sNAM/CD,GAAAvjB,KAAQ+P,KAAKC,WAAW,kBAAoB,kBAAgB,kDAD5BhR,SAAS0jB,KAAKc,2YAhB/BxjB,EAAc,6EAKdA,EAAkB,6EAKlBA,EAAkB,6EAKlBA,EAAa,uPA5BjCsC,EAgCMH,EAAAwL,EAAApL,uBA3BJL,EAMEyL,EAAAlI,8tBA5EI,MAAAiL,EAAUC,OAAOD,SAAWC,OAAOC,WAWrCC,MAIA4S,EACAC,EAHJ1b,EADoBpE,GAAQzE,WAAU4R,GAAQF,EAAWE,8CAKlD2S,EAAmB,CAClB,MAAAC,MAAaC,WACnBD,EAAOE,WAAWH,EAAoB,IACtCC,EAAOG,OAAM5R,UACP,IAAA7O,EAAOmR,KAAKC,MAAMkP,EAAOliB,QACzB4B,EAAK0gB,SAAWrT,EAAQiH,QAAQqM,cAAcD,SAChDE,MAAM,uDAEFxC,GAAeI,cAAcxe,GACnCO,GAAQwB,UAAUqO,GAAMuB,aAAU,EAEpC2O,EAAOpR,QAAU2R,IACfC,QAAQC,IAAI,QAASF,GACrBD,MAAM,SAAQ,4BAKhBpT,EAASkT,QAAUrT,EAAQiH,QAAQqM,cAAcD,cAC3CM,EAAe7P,KAAK8P,UAAUzT,EAAU,KAAM,MAC9CtO,EAASvD,SAASC,cAAc,KACtCsD,EAAOrD,KAAO,gCAAkCqlB,KAAKF,GACrD9hB,EAAOiiB,SAAoC,yBAAA3T,EAASkT,YAAO,IAAQnR,MAAO6R,cAAc1Q,QAAQ,IAAK,KAAK3T,MAAM,GAAI,UACpHmC,EAAOmiB,0BAIP7T,EAASkT,QAAUrT,EAAQiH,QAAQqM,cAAcD,QACjDrT,EAAQuE,QAAQrF,KAAKxK,IAAG,CAAGxB,QAASiN,sBAIpCH,EAAQuE,QAAQrF,KAAKsF,IAAG,CAAAtR,QAAGA,KAAOsO,cAC5B7O,EAAOgH,EAAEzG,QACTP,EAAK0gB,SAAWrT,EAAQiH,QAAQqM,cAAcD,SAChDE,MAAM,uDAEFxC,GAAeI,cAAcxe,GACnCO,GAAQwB,UAAUqO,GAAMuB,aAAU,4BAK9ByM,GAAeG,eACrBhe,GAAQwB,UAAUqO,GAAMuB,eAKF,IAAAyO,EAAoBiB,gDAQ/BjB,EAAmBkB,wBAClBjB,EAAmBxf,KAAA0gB,wHCvErB5lB,SAAS0jB,KAAKc,KAASxjB,EAAW,mIAAhDsC,EAAsGH,EAAAsD,EAAAlD,4FAA5BhE,EAAAyB,OAAAA,EAAQ,GAAA8N,MAAA5J,KAAA6J,8DAA7C/N,EAAW,iLAJnC6kB,GAAOrX,YACPS,GAAQT,uQC2CT,MAAAI,GAAA5N,KAAQ+P,KAAKC,WAAW,UAAY,SAAO,iLAG7CzL,MAAO,SAAUtB,KAAMjD,EAAQ,GAAA+P,KAAKC,WAAW,SAAW,SAC1DzL,MAAO,QAAStB,KAAMjD,EAAQ,GAAA+P,KAAKC,WAAW,UAAY,UAC1DzL,MAAO,OAAQtB,KAAMjD,EAAQ,GAAA+P,KAAKC,WAAW,SAAW,SAErDzL,MAAAvE,KAASgX,2LAAT,EAAA1W,IAAAwkB,EAAAvgB,MAAAvE,KAASgX,kMASV,MAAApJ,GAAA5N,KAAQ+P,KAAKC,WAAW,yBAA2B,0BAAwB,wKAE1EzL,MAAAvE,KAASsU,uBAEZ,CAAA/P,MAAO,SAAUtB,KAAM,UACvB,CAAAsB,MAAO,WAAYtB,KAAM,aACzBsB,MAAO,UAAWtB,KAAMjD,EAAQ,GAAA+P,KAAKC,WAAW,YAAc,iMAJ3D,EAAA1P,IAAAwkB,EAAAvgB,MAAAvE,KAASsU,2MAcV,MAAA1G,GAAA5N,KAAQ+P,KAAKC,WAAW,4BAA8B,8BAA4B,wKAE/E6U,QAAA7kB,KAAS6Y,6MAAT,EAAAvY,IAAAykB,EAAAF,QAAA7kB,KAAS6Y,8eAUV,MAAAjL,GAAA5N,KAAQ+P,KAAKC,WAAW,kBAAoB,kBAAgB,6LACzB,IAAnBhQ,EAAmB,eAAnBA,EAAmB,qPAAnBA,EAAmB,oYAH1C,IAAAglB,GAAqB,IAArBhlB,MAA0BilB,GAAAjlB,6LA5CjCsC,EAsDMH,EAAAwL,EAAApL,8SAVsB,IAArBvC,iaAtFC,MAAA0Q,EAAUC,OAAOD,SAAWC,OAAOC,WAWrCC,EAEJ7I,EADoBpE,GAAQzE,WAAU4R,GAAGC,EAAA,EAAKH,EAAWE,MAGrD,IAgBAmU,EAhBAC,EAAmB,KACvBzU,EAAQiH,QAAQyN,iBAAgB/a,IACtB,OAAAA,EAAEgb,QACH,cACA,UACA,UACHrU,EAAA,EAAAmU,GAAmB,iBAGnBnU,EAAA,EAAAmU,GAAmB,GAElBA,GACHzU,EAAQ4U,YAAYC,SAAW,CAAAD,YAAc,CAAA,eAAgBjb,GAAM2G,EAAA,EAAAkU,EAAsB7a,8CAKjE,OAArB8a,IAAkD,IAArBA,IAC9BD,EACFxU,EAAQ4U,YAAYE,QAAU,CAAAF,YAAc,CAAA,eAAgBjb,GAAM2G,EAAA,EAAAkU,EAAsB7a,MAExFqG,EAAQ4U,YAAYG,OAAS,CAAAH,aAAc,eAC3CtU,EAAA,EAAAkU,GAAsB,eAeZve,IACRqK,EAAA,EAAAH,EAASmG,MAAQrQ,EAAExE,OAAOyB,QAAQ+C,EAAExE,OAAOyB,QAAQwC,eAAe7B,MAAKsM,GACvEjN,GAAQwB,IAAIyL,EAAQ,EAcZlK,IACRqK,EAAA,EAAAH,EAASyD,eAAiB3N,EAAExE,OAAOyB,QAAQ+C,EAAExE,OAAOyB,QAAQwC,eAAe7B,MAAKsM,GAChFjN,GAAQwB,IAAIyL,EAAQ,EASZlK,IACRqK,EAAA,EAAAH,EAASgI,wBAA0BlS,EAAExE,OAAO0iB,QAAOhU,GACnDjN,GAAQwB,IAAIyL,EAAQ,cAQEqU,EAAmB3gB,oFCrDjD,IAAAxF,GAjCO,SAAwB2mB,GAE7B,GAAsB,oBAAX/U,OAAwB,CACjC,MAAMxR,UAAEA,GAAcsP,GAASiX,GAC/B,MAAO,CAAEvmB,YACV,CAED,MAAMD,EAAOuP,GAASkC,OAAOgV,SAASzmB,MAEhC0mB,EAAoBC,QAAQC,UAC5BC,EAAuBF,QAAQG,aAE/BC,EAAa,IAAM/mB,EAAKkG,IAAIuL,OAAOgV,SAASzmB,MAelD,OAbA2mB,QAAQC,UAAY,KAClBF,EAAkB9X,MAAM5J,KAAM6J,WAC9BkY,GAAY,EAGdJ,QAAQG,aAAe,KACrBD,EAAqBjY,MAAM5J,KAAM6J,WACjCkY,GAAY,EAGdtV,OAAO9M,iBAAiB,WAAYoiB,GACpCtV,OAAO9M,iBAAiB,aAAcoiB,GAE/B,CACL9mB,UAAW+P,GAAQhQ,GAAOgnB,GAAU,IAAI5C,IAAI4C,KAAQ/mB,UAExD,CAGegnB,6BCpCTnmB,EAAO,8lCADbsC,EAYMH,EAAAkM,EAAA9L,GAHJL,EAEQmM,EAAAC,8BAVJtO,EAAO,uVCAPA,EAAO,8ZADbsC,EAUCH,EAAAkM,EAAA9L,GAHEL,EAECmM,EAAAC,8BAREtO,EAAO,sTCAPA,EAAO,6nBADbsC,EAUCH,EAAAkM,EAAA9L,GAHEL,EAECmM,EAAAC,8BAREtO,EAAO,mVCWRujB,GAAAvjB,KAAQ+P,KAAKC,WAAW,YAAc,WAAS,GAI/CoW,GAAApmB,KAAQ+P,KAAKC,WAAW,aAAe,YAAU,GAIjDqW,GAAArmB,KAAQ+P,KAAKC,WAAW,UAAY,SAAO,kDATThR,SAAS0jB,KAAKc,+CAIbxkB,SAAS0jB,KAAKc,+CAIjBxkB,SAAS0jB,KAAKc,kLATvBnf,EAAAiiB,EAAA,QAAAC,EAAa,YAAbvmB,EAAK,GAAAqb,MAAsB,8EAI1BhX,EAAAmiB,EAAA,QAAAC,EAAa,aAAbzmB,EAAK,GAAAqb,MAAuB,4NALzD/Y,EAaMH,EAAAwL,EAAApL,GAZJL,EAGIyL,EAAA2Y,qCACJpkB,EAGIyL,EAAA6Y,qCACJtkB,EAGIyL,EAAA+Y,+CAXsBC,GAAA,EAAArmB,GAAAimB,KAAAA,EAAa,YAAbvmB,EAAK,GAAAqb,MAAsB,4CAI1BsL,GAAA,EAAArmB,GAAAmmB,KAAAA,EAAa,aAAbzmB,EAAK,GAAAqb,MAAuB,8QAbjD,MAAA3K,EAAUC,OAAOD,SAAWC,OAAOC,qFCO3C,MAAMgW,GAAMjmB,KAAKimB,IACXhmB,GAAMD,KAAKC,IACXimB,GAAQlmB,KAAKkmB,MACbrT,GAAQ7S,KAAK6S,MACbsT,GAAeC,IAAM,CACzBC,EAAGD,EACHE,EAAGF,IAECG,GAAkB,CACtBC,KAAM,QACNC,MAAO,OACPC,OAAQ,MACRC,IAAK,UAEDC,GAAuB,CAC3B7Y,MAAO,MACP8Y,IAAK,SAEP,SAASC,GAAM/Y,EAAOnK,EAAOijB,GAC3B,OAAO5mB,GAAI8N,EAAOkY,GAAIriB,EAAOijB,GAC/B,CACA,SAASE,GAASnjB,EAAOojB,GACvB,MAAwB,mBAAVpjB,EAAuBA,EAAMojB,GAASpjB,CACtD,CACA,SAASqjB,GAAQC,GACf,OAAOA,EAAUtR,MAAM,KAAK,EAC9B,CACA,SAASuR,GAAaD,GACpB,OAAOA,EAAUtR,MAAM,KAAK,EAC9B,CACA,SAASwR,GAAgBC,GACvB,MAAgB,MAATA,EAAe,IAAM,GAC9B,CACA,SAASC,GAAcD,GACrB,MAAgB,MAATA,EAAe,SAAW,OACnC,CACA,SAASE,GAAYL,GACnB,MAAO,CAAC,MAAO,UAAUpW,SAASmW,GAAQC,IAAc,IAAM,GAChE,CACA,SAASM,GAAiBN,GACxB,OAAOE,GAAgBG,GAAYL,GACrC,CAkBA,SAASO,GAA8BP,GACrC,OAAOA,EAAU9T,QAAQ,cAAcsU,GAAad,GAAqBc,IAC3E,CA6BA,SAASC,GAAqBT,GAC5B,OAAOA,EAAU9T,QAAQ,0BAA0BwU,GAAQrB,GAAgBqB,IAC7E,CAkBA,SAASC,GAAiBC,GACxB,MAAMzB,EACJA,EAACC,EACDA,EAACyB,MACDA,EAAKC,OACLA,GACEF,EACJ,MAAO,CACLC,QACAC,SACArB,IAAKL,EACLE,KAAMH,EACNI,MAAOJ,EAAI0B,EACXrB,OAAQJ,EAAI0B,EACZ3B,IACAC,IAEJ,CCpIA,SAAS2B,GAA2BC,EAAMhB,EAAWiB,GACnD,IAAIC,UACFA,EAASC,SACTA,GACEH,EACJ,MAAMI,EAAWf,GAAYL,GACvBqB,EAAgBf,GAAiBN,GACjCsB,EAAclB,GAAciB,GAC5BX,EAAOX,GAAQC,GACfuB,EAA0B,MAAbH,EACbI,EAAUN,EAAU/B,EAAI+B,EAAUL,MAAQ,EAAIM,EAASN,MAAQ,EAC/DY,EAAUP,EAAU9B,EAAI8B,EAAUJ,OAAS,EAAIK,EAASL,OAAS,EACjEY,EAAcR,EAAUI,GAAe,EAAIH,EAASG,GAAe,EACzE,IAAIK,EACJ,OAAQjB,GACN,IAAK,MACHiB,EAAS,CACPxC,EAAGqC,EACHpC,EAAG8B,EAAU9B,EAAI+B,EAASL,QAE5B,MACF,IAAK,SACHa,EAAS,CACPxC,EAAGqC,EACHpC,EAAG8B,EAAU9B,EAAI8B,EAAUJ,QAE7B,MACF,IAAK,QACHa,EAAS,CACPxC,EAAG+B,EAAU/B,EAAI+B,EAAUL,MAC3BzB,EAAGqC,GAEL,MACF,IAAK,OACHE,EAAS,CACPxC,EAAG+B,EAAU/B,EAAIgC,EAASN,MAC1BzB,EAAGqC,GAEL,MACF,QACEE,EAAS,CACPxC,EAAG+B,EAAU/B,EACbC,EAAG8B,EAAU9B,GAGnB,OAAQa,GAAaD,IACnB,IAAK,QACH2B,EAAON,IAAkBK,GAAeT,GAAOM,GAAc,EAAI,GACjE,MACF,IAAK,MACHI,EAAON,IAAkBK,GAAeT,GAAOM,GAAc,EAAI,GAGrE,OAAOI,CACT,CAqGAtX,eAAeuX,GAAeC,EAAO9lB,GACnC,IAAI+lB,OACY,IAAZ/lB,IACFA,EAAU,CAAA,GAEZ,MAAMojB,EACJA,EAACC,EACDA,EAAC2C,SACDA,EAAQC,MACRA,EAAKC,SACLA,EAAQC,SACRA,GACEL,GACEM,SACJA,EAAW,oBAAmBC,aAC9BA,EAAe,WAAUC,eACzBA,EAAiB,WAAUC,YAC3BA,GAAc,EAAKC,QACnBA,EAAU,GACR1C,GAAS9jB,EAAS8lB,GAChBW,EDpER,SAA0BD,GACxB,MAA0B,iBAAZA,EAVhB,SAA6BA,GAC3B,MAAO,CACL9C,IAAK,EACLF,MAAO,EACPC,OAAQ,EACRF,KAAM,KACHiD,EAEP,CAEuCE,CAAoBF,GAAW,CAClE9C,IAAK8C,EACLhD,MAAOgD,EACP/C,OAAQ+C,EACRjD,KAAMiD,EAEV,CC6DwBG,CAAiBH,GAEjCpnB,EAAU8mB,EAASK,EADa,aAAnBD,EAAgC,YAAc,WACbA,GAC9CM,EAAqBhC,SAAuBoB,EAASa,gBAAgB,CACzEznB,QAAiH,OAAtG2mB,QAAqD,MAAtBC,EAASc,eAAoB,EAASd,EAASc,UAAU1nB,MAAqB2mB,EAAgC3mB,EAAUA,EAAQ2nB,sBAAyD,MAA/Bf,EAASgB,wBAA6B,EAAShB,EAASgB,mBAAmBd,EAASd,WACxRgB,WACAC,eACAF,cAEItB,EAA0B,aAAnByB,EAAgC,CAC3ClD,IACAC,IACAyB,MAAOmB,EAAMb,SAASN,MACtBC,OAAQkB,EAAMb,SAASL,QACrBkB,EAAMd,UACJ8B,QAAkD,MAA5BjB,EAASkB,qBAA0B,EAASlB,EAASkB,gBAAgBhB,EAASd,WACpG+B,QAA4C,MAAtBnB,EAASc,eAAoB,EAASd,EAASc,UAAUG,WAA+C,MAArBjB,EAASoB,cAAmB,EAASpB,EAASoB,SAASH,KAGlK,CACF7D,EAAG,EACHC,EAAG,GAECgE,EAAoBzC,GAAiBoB,EAASsB,4DAA8DtB,EAASsB,sDAAsD,CAC/KpB,WACArB,OACAoC,eACAd,aACGtB,GACL,MAAO,CACLnB,KAAMkD,EAAmBlD,IAAM2D,EAAkB3D,IAAM+C,EAAc/C,KAAOyD,EAAY9D,EACxFI,QAAS4D,EAAkB5D,OAASmD,EAAmBnD,OAASgD,EAAchD,QAAU0D,EAAY9D,EACpGE,MAAOqD,EAAmBrD,KAAO8D,EAAkB9D,KAAOkD,EAAclD,MAAQ4D,EAAY/D,EAC5FI,OAAQ6D,EAAkB7D,MAAQoD,EAAmBpD,MAAQiD,EAAcjD,OAAS2D,EAAY/D,EAEpG,CCrNA,SAASmE,KACP,MAAyB,oBAAXxa,MAChB,CACA,SAASya,GAAYhpB,GACnB,OAAIipB,GAAOjpB,IACDA,EAAK6E,UAAY,IAAIqkB,cAKxB,WACT,CACA,SAASC,GAAUnpB,GACjB,IAAIopB,EACJ,OAAgB,MAARppB,GAA8D,OAA7CopB,EAAsBppB,EAAKqpB,oBAAyB,EAASD,EAAoBE,cAAgB/a,MAC5H,CACA,SAASia,GAAmBxoB,GAC1B,IAAIymB,EACJ,OAA0F,OAAlFA,GAAQwC,GAAOjpB,GAAQA,EAAKqpB,cAAgBrpB,EAAKpD,WAAa2R,OAAO3R,eAAoB,EAAS6pB,EAAK8C,eACjH,CACA,SAASN,GAAO9mB,GACd,QAAK4mB,OAGE5mB,aAAiBqnB,MAAQrnB,aAAiBgnB,GAAUhnB,GAAOqnB,KACpE,CACA,SAASlB,GAAUnmB,GACjB,QAAK4mB,OAGE5mB,aAAiBsnB,SAAWtnB,aAAiBgnB,GAAUhnB,GAAOsnB,QACvE,CACA,SAASC,GAAcvnB,GACrB,QAAK4mB,OAGE5mB,aAAiBwnB,aAAexnB,aAAiBgnB,GAAUhnB,GAAOwnB,YAC3E,CACA,SAASC,GAAaznB,GACpB,SAAK4mB,MAAqC,oBAAfc,cAGpB1nB,aAAiB0nB,YAAc1nB,aAAiBgnB,GAAUhnB,GAAO0nB,WAC1E,CACA,SAASC,GAAkBlpB,GACzB,MAAMmpB,SACJA,EAAQC,UACRA,EAASC,UACTA,EAASC,QACTA,GACEC,GAAiBvpB,GACrB,MAAO,kCAAkCwO,KAAK2a,EAAWE,EAAYD,KAAe,CAAC,SAAU,YAAY3a,SAAS6a,EACtH,CACA,SAASE,GAAexpB,GACtB,MAAO,CAAC,QAAS,KAAM,MAAMyO,SAAS2Z,GAAYpoB,GACpD,CACA,SAASypB,GAAWzpB,GAClB,MAAO,CAAC,gBAAiB,UAAU0pB,MAAKC,IACtC,IACE,OAAO3pB,EAAQkU,QAAQyV,EACxB,CAAC,MAAOhmB,GACP,OAAO,CACR,IAEL,CACA,SAASimB,GAAkBC,GACzB,MAAMC,EAASC,KACTC,EAAMtC,GAAUmC,GAAgBN,GAAiBM,GAAgBA,EAIvE,MAAO,CAAC,YAAa,YAAa,QAAS,SAAU,eAAeH,MAAKnoB,KAASyoB,EAAIzoB,IAAwB,SAAfyoB,EAAIzoB,QAA+ByoB,EAAIC,eAAsC,WAAtBD,EAAIC,gBAAwCH,KAAWE,EAAIE,gBAAwC,SAAvBF,EAAIE,iBAAuCJ,KAAWE,EAAIthB,QAAwB,SAAfshB,EAAIthB,QAA8B,CAAC,YAAa,YAAa,QAAS,SAAU,cAAe,UAAUghB,MAAKnoB,IAAUyoB,EAAIG,YAAc,IAAI1b,SAASlN,MAAW,CAAC,QAAS,SAAU,SAAU,WAAWmoB,MAAKnoB,IAAUyoB,EAAII,SAAW,IAAI3b,SAASlN,IAC7hB,CAaA,SAASwoB,KACP,QAAmB,oBAARM,MAAwBA,IAAIC,WAChCD,IAAIC,SAAS,0BAA2B,OACjD,CACA,SAASC,GAAsBnrB,GAC7B,MAAO,CAAC,OAAQ,OAAQ,aAAaqP,SAAS2Z,GAAYhpB,GAC5D,CACA,SAASmqB,GAAiBvpB,GACxB,OAAOuoB,GAAUvoB,GAASupB,iBAAiBvpB,EAC7C,CACA,SAASwqB,GAAcxqB,GACrB,OAAI0nB,GAAU1nB,GACL,CACLyqB,WAAYzqB,EAAQyqB,WACpBC,UAAW1qB,EAAQ0qB,WAGhB,CACLD,WAAYzqB,EAAQ2qB,QACpBD,UAAW1qB,EAAQ4qB,QAEvB,CACA,SAASC,GAAczrB,GACrB,GAA0B,SAAtBgpB,GAAYhpB,GACd,OAAOA,EAET,MAAMX,EAENW,EAAK0rB,cAEL1rB,EAAKM,YAELspB,GAAa5pB,IAASA,EAAK4R,MAE3B4W,GAAmBxoB,GACnB,OAAO4pB,GAAavqB,GAAUA,EAAOuS,KAAOvS,CAC9C,CACA,SAASssB,GAA2B3rB,GAClC,MAAMM,EAAamrB,GAAczrB,GACjC,OAAImrB,GAAsB7qB,GACjBN,EAAKqpB,cAAgBrpB,EAAKqpB,cAAc/I,KAAOtgB,EAAKsgB,KAEzDoJ,GAAcppB,IAAewpB,GAAkBxpB,GAC1CA,EAEFqrB,GAA2BrrB,EACpC,CACA,SAASsrB,GAAqB5rB,EAAM6rB,EAAMC,GACxC,IAAIC,OACS,IAATF,IACFA,EAAO,SAEe,IAApBC,IACFA,GAAkB,GAEpB,MAAME,EAAqBL,GAA2B3rB,GAChDisB,EAASD,KAAuE,OAA9CD,EAAuB/rB,EAAKqpB,oBAAyB,EAAS0C,EAAqBzL,MACrH4L,EAAM/C,GAAU6C,GACtB,GAAIC,EAAQ,CACV,MAAME,EAAeC,GAAgBF,GACrC,OAAOL,EAAKQ,OAAOH,EAAKA,EAAII,gBAAkB,GAAIxC,GAAkBkC,GAAsBA,EAAqB,GAAIG,GAAgBL,EAAkBF,GAAqBO,GAAgB,GAC3L,CACD,OAAON,EAAKQ,OAAOL,EAAoBJ,GAAqBI,EAAoB,GAAIF,GACtF,CACA,SAASM,GAAgBF,GACvB,OAAOA,EAAIK,QAAUzwB,OAAO0wB,eAAeN,EAAIK,QAAUL,EAAIC,aAAe,IAC9E,CClJA,SAASM,GAAiB7rB,GACxB,MAAMgqB,EAAMT,GAAiBvpB,GAG7B,IAAI0lB,EAAQoG,WAAW9B,EAAItE,QAAU,EACjCC,EAASmG,WAAW9B,EAAIrE,SAAW,EACvC,MAAMoG,EAAYjD,GAAc9oB,GAC1BgsB,EAAcD,EAAY/rB,EAAQgsB,YAActG,EAChDuG,EAAeF,EAAY/rB,EAAQisB,aAAetG,EAClDuG,EAAiBrI,GAAM6B,KAAWsG,GAAenI,GAAM8B,KAAYsG,EAKzE,OAJIC,IACFxG,EAAQsG,EACRrG,EAASsG,GAEJ,CACLvG,QACAC,SACAwG,EAAGD,EAEP,CAEA,SAASE,GAAcpsB,GACrB,OAAQ0nB,GAAU1nB,GAAoCA,EAAzBA,EAAQ2nB,cACvC,CAEA,SAASK,GAAShoB,GAChB,MAAMqsB,EAAaD,GAAcpsB,GACjC,IAAK8oB,GAAcuD,GACjB,OAAOvI,GAAa,GAEtB,MAAM2B,EAAO4G,EAAWC,yBAClB5G,MACJA,EAAKC,OACLA,EAAMwG,EACNA,GACEN,GAAiBQ,GACrB,IAAIrI,GAAKmI,EAAItI,GAAM4B,EAAKC,OAASD,EAAKC,OAASA,EAC3CzB,GAAKkI,EAAItI,GAAM4B,EAAKE,QAAUF,EAAKE,QAAUA,EAUjD,OANK3B,GAAMuI,OAAOC,SAASxI,KACzBA,EAAI,GAEDC,GAAMsI,OAAOC,SAASvI,KACzBA,EAAI,GAEC,CACLD,IACAC,IAEJ,CAEA,MAAMwI,GAAyB3I,GAAa,GAC5C,SAAS4I,GAAiB1sB,GACxB,MAAMsrB,EAAM/C,GAAUvoB,GACtB,OAAK+pB,MAAeuB,EAAII,eAGjB,CACL1H,EAAGsH,EAAII,eAAeiB,WACtB1I,EAAGqH,EAAII,eAAekB,WAJfH,EAMX,CAWA,SAASH,GAAsBtsB,EAAS6sB,EAAcC,EAAiBjF,QAChD,IAAjBgF,IACFA,GAAe,QAEO,IAApBC,IACFA,GAAkB,GAEpB,MAAMC,EAAa/sB,EAAQssB,wBACrBD,EAAaD,GAAcpsB,GACjC,IAAIgtB,EAAQlJ,GAAa,GACrB+I,IACEhF,EACEH,GAAUG,KACZmF,EAAQhF,GAASH,IAGnBmF,EAAQhF,GAAShoB,IAGrB,MAAMitB,EA7BR,SAAgCjtB,EAASktB,EAASC,GAIhD,YAHgB,IAAZD,IACFA,GAAU,MAEPC,GAAwBD,GAAWC,IAAyB5E,GAAUvoB,KAGpEktB,CACT,CAqBwBE,CAAuBf,EAAYS,EAAiBjF,GAAgB6E,GAAiBL,GAAcvI,GAAa,GACtI,IAAIE,GAAK+I,EAAW5I,KAAO8I,EAAcjJ,GAAKgJ,EAAMhJ,EAChDC,GAAK8I,EAAWzI,IAAM2I,EAAchJ,GAAK+I,EAAM/I,EAC/CyB,EAAQqH,EAAWrH,MAAQsH,EAAMhJ,EACjC2B,EAASoH,EAAWpH,OAASqH,EAAM/I,EACvC,GAAIoI,EAAY,CACd,MAAMf,EAAM/C,GAAU8D,GAChBgB,EAAYxF,GAAgBH,GAAUG,GAAgBU,GAAUV,GAAgBA,EACtF,IAAIyF,EAAahC,EACbiC,EAAgB/B,GAAgB8B,GACpC,KAAOC,GAAiB1F,GAAgBwF,IAAcC,GAAY,CAChE,MAAME,EAAcxF,GAASuF,GACvBE,EAAaF,EAAcjB,wBAC3BtC,EAAMT,GAAiBgE,GACvBpJ,EAAOsJ,EAAWtJ,MAAQoJ,EAAcG,WAAa5B,WAAW9B,EAAI2D,cAAgBH,EAAYxJ,EAChGM,EAAMmJ,EAAWnJ,KAAOiJ,EAAcK,UAAY9B,WAAW9B,EAAI6D,aAAeL,EAAYvJ,EAClGD,GAAKwJ,EAAYxJ,EACjBC,GAAKuJ,EAAYvJ,EACjByB,GAAS8H,EAAYxJ,EACrB2B,GAAU6H,EAAYvJ,EACtBD,GAAKG,EACLF,GAAKK,EACLgJ,EAAa/E,GAAUgF,GACvBA,EAAgB/B,GAAgB8B,EACjC,CACF,CACD,OAAO9H,GAAiB,CACtBE,QACAC,SACA3B,IACAC,KAEJ,CAIA,SAAS6J,GAAoB9tB,EAASylB,GACpC,MAAMsI,EAAavD,GAAcxqB,GAASyqB,WAC1C,OAAKhF,EAGEA,EAAKtB,KAAO4J,EAFVzB,GAAsB1E,GAAmB5nB,IAAUmkB,KAAO4J,CAGrE,CAEA,SAASC,GAAcrF,EAAiBsF,EAAQC,QACrB,IAArBA,IACFA,GAAmB,GAErB,MAAMC,EAAWxF,EAAgB2D,wBAKjC,MAAO,CACLtI,EALQmK,EAAShK,KAAO8J,EAAOxD,YAAcyD,EAAmB,EAElEJ,GAAoBnF,EAAiBwF,IAInClK,EAHQkK,EAAS7J,IAAM2J,EAAOvD,UAKlC,CA6GA,SAAS0D,GAAkCpuB,EAASquB,EAAkBtH,GACpE,IAAItB,EACJ,GAAyB,aAArB4I,EACF5I,EA7CJ,SAAyBzlB,EAAS+mB,GAChC,MAAMuE,EAAM/C,GAAUvoB,GAChB8D,EAAO8jB,GAAmB5nB,GAC1B0rB,EAAiBJ,EAAII,eAC3B,IAAIhG,EAAQ5hB,EAAKwqB,YACb3I,EAAS7hB,EAAKyqB,aACdvK,EAAI,EACJC,EAAI,EACR,GAAIyH,EAAgB,CAClBhG,EAAQgG,EAAehG,MACvBC,EAAS+F,EAAe/F,OACxB,MAAM6I,EAAsBzE,OACvByE,GAAuBA,GAAoC,UAAbzH,KACjD/C,EAAI0H,EAAeiB,WACnB1I,EAAIyH,EAAekB,UAEtB,CACD,MAAO,CACLlH,QACAC,SACA3B,IACAC,IAEJ,CAsBWwK,CAAgBzuB,EAAS+mB,QAC3B,GAAyB,aAArBsH,EACT5I,EAlEJ,SAAyBzlB,GACvB,MAAM8D,EAAO8jB,GAAmB5nB,GAC1BiuB,EAASzD,GAAcxqB,GACvB0f,EAAO1f,EAAQyoB,cAAc/I,KAC7BgG,EAAQ9nB,GAAIkG,EAAK4qB,YAAa5qB,EAAKwqB,YAAa5O,EAAKgP,YAAahP,EAAK4O,aACvE3I,EAAS/nB,GAAIkG,EAAK6qB,aAAc7qB,EAAKyqB,aAAc7O,EAAKiP,aAAcjP,EAAK6O,cACjF,IAAIvK,GAAKiK,EAAOxD,WAAaqD,GAAoB9tB,GACjD,MAAMikB,GAAKgK,EAAOvD,UAIlB,MAHyC,QAArCnB,GAAiB7J,GAAMkP,YACzB5K,GAAKpmB,GAAIkG,EAAKwqB,YAAa5O,EAAK4O,aAAe5I,GAE1C,CACLA,QACAC,SACA3B,IACAC,IAEJ,CAiDW4K,CAAgBjH,GAAmB5nB,SACrC,GAAI0nB,GAAU2G,GACnB5I,EAvBJ,SAAoCzlB,EAAS+mB,GAC3C,MAAMgG,EAAaT,GAAsBtsB,GAAS,EAAmB,UAAb+mB,GAClDzC,EAAMyI,EAAWzI,IAAMtkB,EAAQ4tB,UAC/BzJ,EAAO4I,EAAW5I,KAAOnkB,EAAQ0tB,WACjCV,EAAQlE,GAAc9oB,GAAWgoB,GAAShoB,GAAW8jB,GAAa,GAKxE,MAAO,CACL4B,MALY1lB,EAAQsuB,YAActB,EAAMhJ,EAMxC2B,OALa3lB,EAAQuuB,aAAevB,EAAM/I,EAM1CD,EALQG,EAAO6I,EAAMhJ,EAMrBC,EALQK,EAAM0I,EAAM/I,EAOxB,CAQW6K,CAA2BT,EAAkBtH,OAC/C,CACL,MAAMkG,EAAgBP,GAAiB1sB,GACvCylB,EAAO,CACLzB,EAAGqK,EAAiBrK,EAAIiJ,EAAcjJ,EACtCC,EAAGoK,EAAiBpK,EAAIgJ,EAAchJ,EACtCyB,MAAO2I,EAAiB3I,MACxBC,OAAQ0I,EAAiB1I,OAE5B,CACD,OAAOH,GAAiBC,EAC1B,CACA,SAASsJ,GAAyB/uB,EAASgvB,GACzC,MAAMtvB,EAAamrB,GAAc7qB,GACjC,QAAIN,IAAesvB,IAAatH,GAAUhoB,IAAe6qB,GAAsB7qB,MAG9B,UAA1C6pB,GAAiB7pB,GAAYuvB,UAAwBF,GAAyBrvB,EAAYsvB,GACnG,CA2EA,SAASE,GAA8BlvB,EAAS6nB,EAAcd,GAC5D,MAAMoI,EAA0BrG,GAAcjB,GACxCc,EAAkBf,GAAmBC,GACrCqF,EAAuB,UAAbnG,EACVtB,EAAO6G,GAAsBtsB,GAAS,EAAMktB,EAASrF,GAC3D,IAAIoG,EAAS,CACXxD,WAAY,EACZC,UAAW,GAEb,MAAM0E,EAAUtL,GAAa,GAC7B,GAAIqL,IAA4BA,IAA4BjC,EAI1D,IAHkC,SAA9B9E,GAAYP,IAA4BqB,GAAkBP,MAC5DsF,EAASzD,GAAc3C,IAErBsH,EAAyB,CAC3B,MAAME,EAAa/C,GAAsBzE,GAAc,EAAMqF,EAASrF,GACtEuH,EAAQpL,EAAIqL,EAAWrL,EAAI6D,EAAa6F,WACxC0B,EAAQnL,EAAIoL,EAAWpL,EAAI4D,EAAa+F,SACzC,MAAUjF,IAGTyG,EAAQpL,EAAI8J,GAAoBnF,IAGpC,MAAM2G,GAAa3G,GAAoBwG,GAA4BjC,EAAmDpJ,GAAa,GAAtDkK,GAAcrF,EAAiBsF,GAG5G,MAAO,CACLjK,EAHQyB,EAAKtB,KAAO8J,EAAOxD,WAAa2E,EAAQpL,EAAIsL,EAAWtL,EAI/DC,EAHQwB,EAAKnB,IAAM2J,EAAOvD,UAAY0E,EAAQnL,EAAIqL,EAAWrL,EAI7DyB,MAAOD,EAAKC,MACZC,OAAQF,EAAKE,OAEjB,CAEA,SAAS4J,GAAmBvvB,GAC1B,MAA8C,WAAvCupB,GAAiBvpB,GAASivB,QACnC,CAEA,SAASO,GAAoBxvB,EAASyvB,GACpC,IAAK3G,GAAc9oB,IAAmD,UAAvCupB,GAAiBvpB,GAASivB,SACvD,OAAO,KAET,GAAIQ,EACF,OAAOA,EAASzvB,GAElB,IAAI0vB,EAAkB1vB,EAAQ6nB,aAS9B,OAHID,GAAmB5nB,KAAa0vB,IAClCA,EAAkBA,EAAgBjH,cAAc/I,MAE3CgQ,CACT,CAIA,SAAS5H,GAAgB9nB,EAASyvB,GAChC,MAAMnE,EAAM/C,GAAUvoB,GACtB,GAAIypB,GAAWzpB,GACb,OAAOsrB,EAET,IAAKxC,GAAc9oB,GAAU,CAC3B,IAAI2vB,EAAkB9E,GAAc7qB,GACpC,KAAO2vB,IAAoBpF,GAAsBoF,IAAkB,CACjE,GAAIjI,GAAUiI,KAAqBJ,GAAmBI,GACpD,OAAOA,EAETA,EAAkB9E,GAAc8E,EACjC,CACD,OAAOrE,CACR,CACD,IAAIzD,EAAe2H,GAAoBxvB,EAASyvB,GAChD,KAAO5H,GAAgB2B,GAAe3B,IAAiB0H,GAAmB1H,IACxEA,EAAe2H,GAAoB3H,EAAc4H,GAEnD,OAAI5H,GAAgB0C,GAAsB1C,IAAiB0H,GAAmB1H,KAAkB+B,GAAkB/B,GACzGyD,EAEFzD,GDrXT,SAA4B7nB,GAC1B,IAAI4vB,EAAc/E,GAAc7qB,GAChC,KAAO8oB,GAAc8G,KAAiBrF,GAAsBqF,IAAc,CACxE,GAAIhG,GAAkBgG,GACpB,OAAOA,EACF,GAAInG,GAAWmG,GACpB,OAAO,KAETA,EAAc/E,GAAc+E,EAC7B,CACD,OAAO,IACT,CC0WyBC,CAAmB7vB,IAAYsrB,CACxD,CAqBA,MAAM1E,GAAW,CACfsB,sDAxTF,SAA+DrC,GAC7D,IAAIiB,SACFA,EAAQrB,KACRA,EAAIoC,aACJA,EAAYd,SACZA,GACElB,EACJ,MAAMqH,EAAuB,UAAbnG,EACV4B,EAAkBf,GAAmBC,GACrCiI,IAAWhJ,GAAW2C,GAAW3C,EAASd,UAChD,GAAI6B,IAAiBc,GAAmBmH,GAAY5C,EAClD,OAAOzH,EAET,IAAIwI,EAAS,CACXxD,WAAY,EACZC,UAAW,GAETsC,EAAQlJ,GAAa,GACzB,MAAMsL,EAAUtL,GAAa,GACvBqL,EAA0BrG,GAAcjB,GAC9C,IAAIsH,IAA4BA,IAA4BjC,MACxB,SAA9B9E,GAAYP,IAA4BqB,GAAkBP,MAC5DsF,EAASzD,GAAc3C,IAErBiB,GAAcjB,IAAe,CAC/B,MAAMwH,EAAa/C,GAAsBzE,GACzCmF,EAAQhF,GAASH,GACjBuH,EAAQpL,EAAIqL,EAAWrL,EAAI6D,EAAa6F,WACxC0B,EAAQnL,EAAIoL,EAAWpL,EAAI4D,EAAa+F,SACzC,CAEH,MAAM0B,GAAa3G,GAAoBwG,GAA4BjC,EAAyDpJ,GAAa,GAA5DkK,GAAcrF,EAAiBsF,GAAQ,GACpH,MAAO,CACLvI,MAAOD,EAAKC,MAAQsH,EAAMhJ,EAC1B2B,OAAQF,EAAKE,OAASqH,EAAM/I,EAC5BD,EAAGyB,EAAKzB,EAAIgJ,EAAMhJ,EAAIiK,EAAOxD,WAAauC,EAAMhJ,EAAIoL,EAAQpL,EAAIsL,EAAWtL,EAC3EC,EAAGwB,EAAKxB,EAAI+I,EAAM/I,EAAIgK,EAAOvD,UAAYsC,EAAM/I,EAAImL,EAAQnL,EAAIqL,EAAWrL,EAE9E,EAmRE2D,sBACAH,gBAhJF,SAAyB5B,GACvB,IAAI7lB,QACFA,EAAOgnB,SACPA,EAAQC,aACRA,EAAYF,SACZA,GACElB,EACJ,MAAMkK,EAAwC,sBAAb/I,EAAmCyC,GAAWzpB,GAAW,GAxC5F,SAAqCA,EAASgwB,GAC5C,MAAMC,EAAeD,EAAM9d,IAAIlS,GAC/B,GAAIiwB,EACF,OAAOA,EAET,IAAIxxB,EAASusB,GAAqBhrB,EAAS,IAAI,GAAO0I,QAAOwnB,GAAMxI,GAAUwI,IAA2B,SAApB9H,GAAY8H,KAC5FC,EAAsC,KAC1C,MAAMC,EAAwD,UAAvC7G,GAAiBvpB,GAASivB,SACjD,IAAIW,EAAcQ,EAAiBvF,GAAc7qB,GAAWA,EAG5D,KAAO0nB,GAAUkI,KAAiBrF,GAAsBqF,IAAc,CACpE,MAAMS,EAAgB9G,GAAiBqG,GACjCU,EAA0B1G,GAAkBgG,GAC7CU,GAAsD,UAA3BD,EAAcpB,WAC5CkB,EAAsC,OAEVC,GAAkBE,IAA4BH,GAAuCG,GAAsD,WAA3BD,EAAcpB,UAA2BkB,GAAuC,CAAC,WAAY,SAAS1hB,SAAS0hB,EAAoClB,WAAa/F,GAAkB0G,KAAiBU,GAA2BvB,GAAyB/uB,EAAS4vB,IAG5YnxB,EAASA,EAAOiK,QAAO6nB,GAAYA,IAAaX,IAGhDO,EAAsCE,EAExCT,EAAc/E,GAAc+E,EAC7B,CAED,OADAI,EAAM5tB,IAAIpC,EAASvB,GACZA,CACT,CAWiG+xB,CAA4BxwB,EAASkB,KAAKuvB,IAAM,GAAGhF,OAAOzE,GACnJ0J,EAAoB,IAAIX,EAA0B9I,GAClD0J,EAAwBD,EAAkB,GAC1CE,EAAeF,EAAkBG,QAAO,CAACC,EAASzC,KACtD,MAAM5I,EAAO2I,GAAkCpuB,EAASquB,EAAkBtH,GAK1E,OAJA+J,EAAQxM,IAAM1mB,GAAI6nB,EAAKnB,IAAKwM,EAAQxM,KACpCwM,EAAQ1M,MAAQR,GAAI6B,EAAKrB,MAAO0M,EAAQ1M,OACxC0M,EAAQzM,OAAST,GAAI6B,EAAKpB,OAAQyM,EAAQzM,QAC1CyM,EAAQ3M,KAAOvmB,GAAI6nB,EAAKtB,KAAM2M,EAAQ3M,MAC/B2M,CAAO,GACb1C,GAAkCpuB,EAAS2wB,EAAuB5J,IACrE,MAAO,CACLrB,MAAOkL,EAAaxM,MAAQwM,EAAazM,KACzCwB,OAAQiL,EAAavM,OAASuM,EAAatM,IAC3CN,EAAG4M,EAAazM,KAChBF,EAAG2M,EAAatM,IAEpB,EAyHEwD,mBACAiJ,gBAxBsB7hB,eAAgB7O,GACtC,MAAM2wB,EAAoB9vB,KAAK4mB,iBAAmBA,GAC5CmJ,EAAkB/vB,KAAKgwB,cACvBC,QAA2BF,EAAgB5wB,EAAK2lB,UACtD,MAAO,CACLD,UAAWmJ,GAA8B7uB,EAAK0lB,gBAAiBiL,EAAkB3wB,EAAK2lB,UAAW3lB,EAAK0mB,UACtGf,SAAU,CACRhC,EAAG,EACHC,EAAG,EACHyB,MAAOyL,EAAmBzL,MAC1BC,OAAQwL,EAAmBxL,QAGjC,EAYEyL,eArRF,SAAwBpxB,GACtB,OAAOuE,MAAMC,KAAKxE,EAAQoxB,iBAC5B,EAoREF,cA1HF,SAAuBlxB,GACrB,MAAM0lB,MACJA,EAAKC,OACLA,GACEkG,GAAiB7rB,GACrB,MAAO,CACL0lB,QACAC,SAEJ,EAkHEqC,YACAN,aACA2J,MAdF,SAAerxB,GACb,MAA+C,QAAxCupB,GAAiBvpB,GAAS4uB,SACnC,GAeA,SAAS0C,GAAc51B,EAAGC,GACxB,OAAOD,EAAEsoB,IAAMroB,EAAEqoB,GAAKtoB,EAAEuoB,IAAMtoB,EAAEsoB,GAAKvoB,EAAEgqB,QAAU/pB,EAAE+pB,OAAShqB,EAAEiqB,SAAWhqB,EAAEgqB,MAC7E,CAkGA,SAAS4L,GAAWxL,EAAWC,EAAUrf,EAAQ/F,QAC/B,IAAZA,IACFA,EAAU,CAAA,GAEZ,MAAM4wB,eACJA,GAAiB,EAAIC,eACrBA,GAAiB,EAAIC,cACrBA,EAA0C,mBAAnBC,eAA6BC,YACpDA,EAA8C,mBAAzBC,qBAAmCC,eACxDA,GAAiB,GACflxB,EACEmxB,EAAc3F,GAAcrG,GAC5BiM,EAAYR,GAAkBC,EAAiB,IAAKM,EAAc/G,GAAqB+G,GAAe,MAAQ/G,GAAqBhF,IAAa,GACtJgM,EAAU12B,SAAQi1B,IAChBiB,GAAkBjB,EAAS1vB,iBAAiB,SAAU8F,EAAQ,CAC5DsrB,SAAS,IAEXR,GAAkBlB,EAAS1vB,iBAAiB,SAAU8F,EAAO,IAE/D,MAAMurB,EAAYH,GAAeH,EAlHnC,SAAqB5xB,EAASmyB,GAC5B,IACIC,EADAC,EAAK,KAET,MAAM5oB,EAAOme,GAAmB5nB,GAChC,SAAS2M,IACP,IAAI2lB,EACJC,aAAaH,GACC,OAAbE,EAAMD,IAAeC,EAAIE,aAC1BH,EAAK,IACN,CA2ED,OA1EA,SAASI,EAAQC,EAAMC,QACR,IAATD,IACFA,GAAO,QAES,IAAdC,IACFA,EAAY,GAEdhmB,IACA,MAAMimB,EAA2B5yB,EAAQssB,yBACnCnI,KACJA,EAAIG,IACJA,EAAGoB,MACHA,EAAKC,OACLA,GACEiN,EAIJ,GAHKF,GACHP,KAEGzM,IAAUC,EACb,OAEF,MAKM/kB,EAAU,CACdiyB,YANeriB,GAAM8T,GAIQ,OAHZ9T,GAAM/G,EAAK6kB,aAAenK,EAAOuB,IAGC,OAFjClV,GAAM/G,EAAK8kB,cAAgBjK,EAAMqB,IAEuB,OAD1DnV,GAAM2T,GACyE,KAG/FwO,UAAW/0B,GAAI,EAAGgmB,GAAI,EAAG+O,KAAe,GAE1C,IAAIG,GAAgB,EACpB,SAASC,EAAc5T,GACrB,MAAM6T,EAAQ7T,EAAQ,GAAG8T,kBACzB,GAAID,IAAUL,EAAW,CACvB,IAAKG,EACH,OAAOL,IAEJO,EAOHP,GAAQ,EAAOO,GAJfZ,EAAYc,YAAW,KACrBT,GAAQ,EAAO,KAAK,GACnB,IAIN,CACa,IAAVO,GAAgB1B,GAAcsB,EAA0B5yB,EAAQssB,0BAQlEmG,IAEFK,GAAgB,CACjB,CAID,IACET,EAAK,IAAIR,qBAAqBkB,EAAe,IACxCnyB,EAEH6I,KAAMA,EAAKgf,eAEd,CAAC,MAAO9kB,GACP0uB,EAAK,IAAIR,qBAAqBkB,EAAenyB,EAC9C,CACDyxB,EAAGc,QAAQnzB,EACZ,CACDyyB,EAAQ,GACD9lB,CACT,CA6BiDymB,CAAYrB,EAAaprB,GAAU,KAClF,IAsBI0sB,EAtBAC,GAAkB,EAClBC,EAAiB,KACjB7B,IACF6B,EAAiB,IAAI5B,gBAAe9L,IAClC,IAAK2N,GAAc3N,EACf2N,GAAcA,EAAWr0B,SAAW4yB,GAAewB,IAGrDA,EAAeE,UAAUzN,GACzB0N,qBAAqBJ,GACrBA,EAAiBK,uBAAsB,KACrC,IAAIC,EACkC,OAArCA,EAAkBL,IAA2BK,EAAgBT,QAAQnN,EAAS,KAGnFrf,GAAQ,IAENorB,IAAgBD,GAClByB,EAAeJ,QAAQpB,GAEzBwB,EAAeJ,QAAQnN,IAGzB,IAAI6N,EAAc/B,EAAiBxF,GAAsBvG,GAAa,KAatE,OAZI+L,GAGJ,SAASgC,IACP,MAAMC,EAAczH,GAAsBvG,GACtC8N,IAAgBvC,GAAcuC,EAAaE,IAC7CptB,IAEFktB,EAAcE,EACdV,EAAUM,sBAAsBG,EACjC,CATCA,GAUFntB,IACO,KACL,IAAIqtB,EACJhC,EAAU12B,SAAQi1B,IAChBiB,GAAkBjB,EAASzvB,oBAAoB,SAAU6F,GACzD8qB,GAAkBlB,EAASzvB,oBAAoB,SAAU6F,EAAO,IAErD,MAAburB,GAAqBA,IACkB,OAAtC8B,EAAmBT,IAA2BS,EAAiBxB,aAChEe,EAAiB,KACbzB,GACF4B,qBAAqBL,EACtB,CAEL,CAmBA,MAAMY,GF2GS,SAAUrzB,GAIvB,YAHgB,IAAZA,IACFA,EAAU,GAEL,CACLX,KAAM,SACNW,UACA,QAAM5F,CAAG0rB,GACP,IAAIwN,EAAuBC,EAC3B,MAAMnQ,EACJA,EAACC,EACDA,EAACY,UACDA,EAASuP,eACTA,GACE1N,EACE2N,QA9DZnlB,eAAoCwX,EAAO9lB,GACzC,MAAMikB,UACJA,EAAS+B,SACTA,EAAQE,SACRA,GACEJ,EACEZ,QAA+B,MAAlBc,EAASyK,WAAgB,EAASzK,EAASyK,MAAMvK,EAASd,WACvET,EAAOX,GAAQC,GACfQ,EAAYP,GAAaD,GACzBuB,EAAwC,MAA3BlB,GAAYL,GACzByP,EAAgB,CAAC,OAAQ,OAAO7lB,SAAS8W,IAAS,EAAI,EACtDgP,EAAiBzO,GAAOM,GAAc,EAAI,EAC1CoO,EAAW9P,GAAS9jB,EAAS8lB,GAGnC,IAAI+N,SACFA,EAAQC,UACRA,EAASxO,cACTA,GACsB,iBAAbsO,EAAwB,CACjCC,SAAUD,EACVE,UAAW,EACXxO,cAAe,MACb,CACFuO,SAAUD,EAASC,UAAY,EAC/BC,UAAWF,EAASE,WAAa,EACjCxO,cAAesO,EAAStO,eAK1B,OAHIb,GAAsC,iBAAlBa,IACtBwO,EAA0B,QAAdrP,GAAuC,EAAjBa,EAAqBA,GAElDE,EAAa,CAClBpC,EAAG0Q,EAAYH,EACftQ,EAAGwQ,EAAWH,GACZ,CACFtQ,EAAGyQ,EAAWH,EACdrQ,EAAGyQ,EAAYH,EAEnB,CAwB+BI,CAAqBjO,EAAO9lB,GAIrD,OAAIikB,KAAkE,OAAlDqP,EAAwBE,EAAeH,aAAkB,EAASC,EAAsBrP,YAAgE,OAAjDsP,EAAwBC,EAAeQ,QAAkBT,EAAsBU,gBACjM,GAEF,CACL7Q,EAAGA,EAAIqQ,EAAWrQ,EAClBC,EAAGA,EAAIoQ,EAAWpQ,EAClB5jB,KAAM,IACDg0B,EACHxP,aAGL,EAEL,EE5HMiQ,GFmIQ,SAAUl0B,GAItB,YAHgB,IAAZA,IACFA,EAAU,CAAA,GAEL,CACLX,KAAM,QACNW,UACA,QAAM5F,CAAG0rB,GACP,MAAM1C,EACJA,EAACC,EACDA,EAACY,UACDA,GACE6B,GAEF+N,SAAUM,GAAgB,EAC1BL,UAAWM,GAAiB,EAAKC,QACjCA,EAAU,CACRj6B,GAAI6qB,IACF,IAAI7B,EACFA,EAACC,EACDA,GACE4B,EACJ,MAAO,CACL7B,IACAC,IACD,MAGFiR,GACDxQ,GAAS9jB,EAAS8lB,GAChBF,EAAS,CACbxC,IACAC,KAEIkF,QAAiB1C,GAAeC,EAAOwO,GACvCR,EAAYxP,GAAYN,GAAQC,IAChC4P,EAAW1P,GAAgB2P,GACjC,IAAIS,EAAgB3O,EAAOiO,GACvBW,EAAiB5O,EAAOkO,GAC5B,GAAIK,EAAe,CACjB,MACMM,EAAuB,MAAbZ,EAAmB,SAAW,QAG9CU,EAAgB1Q,GAFJ0Q,EAAgBhM,EAFC,MAAbsL,EAAmB,MAAQ,QAIhBU,EADfA,EAAgBhM,EAASkM,GAEtC,CACD,GAAIL,EAAgB,CAClB,MACMK,EAAwB,MAAdX,EAAoB,SAAW,QAG/CU,EAAiB3Q,GAFL2Q,EAAiBjM,EAFC,MAAduL,EAAoB,MAAQ,QAIhBU,EADhBA,EAAiBjM,EAASkM,GAEvC,CACD,MAAMC,EAAgBL,EAAQj6B,GAAG,IAC5B0rB,EACH+N,CAACA,GAAWU,EACZT,CAACA,GAAYU,IAEf,MAAO,IACFE,EACHj1B,KAAM,CACJ2jB,EAAGsR,EAActR,EAAIA,EACrBC,EAAGqR,EAAcrR,EAAIA,EACrBnO,QAAS,CACP2e,CAACA,GAAWM,EACZL,CAACA,GAAYM,IAIpB,EAEL,EElMMO,GF9RO,SAAU30B,GAIrB,YAHgB,IAAZA,IACFA,EAAU,CAAA,GAEL,CACLX,KAAM,OACNW,UACA,QAAM5F,CAAG0rB,GACP,IAAIyN,EAAuBqB,EAC3B,MAAM3Q,UACJA,EAASuP,eACTA,EAAcvN,MACdA,EAAK4O,iBACLA,EAAgB7O,SAChBA,EAAQE,SACRA,GACEJ,GAEF+N,SAAUM,GAAgB,EAC1BL,UAAWM,GAAiB,EAC5BU,mBAAoBC,EAA2BC,iBAC/CA,EAAmB,UAASC,0BAC5BA,EAA4B,OAAMC,cAClCA,GAAgB,KACbZ,GACDxQ,GAAS9jB,EAAS8lB,GAMtB,GAAsD,OAAjDyN,EAAwBC,EAAeQ,QAAkBT,EAAsBU,gBAClF,MAAO,GAET,MAAMtP,EAAOX,GAAQC,GACfkR,EAAkB7Q,GAAYuQ,GAC9BO,EAAkBpR,GAAQ6Q,KAAsBA,EAChD3P,QAA+B,MAAlBc,EAASyK,WAAgB,EAASzK,EAASyK,MAAMvK,EAASd,WACvE0P,EAAqBC,IAAgCK,IAAoBF,EAAgB,CAACxQ,GAAqBmQ,ID7X3H,SAA+B5Q,GAC7B,MAAMoR,EAAoB3Q,GAAqBT,GAC/C,MAAO,CAACO,GAA8BP,GAAYoR,EAAmB7Q,GAA8B6Q,GACrG,CC0XgJC,CAAsBT,IAC1JU,EAA6D,SAA9BN,GAChCF,GAA+BQ,GAClCT,EAAmB74B,QDxW3B,SAAmCgoB,EAAWiR,EAAelH,EAAW9I,GACtE,MAAMT,EAAYP,GAAaD,GAC/B,IAAIoG,EAnBN,SAAqB1F,EAAM6Q,EAAStQ,GAClC,MAAMuQ,EAAK,CAAC,OAAQ,SACdC,EAAK,CAAC,QAAS,QACfC,EAAK,CAAC,MAAO,UACbC,EAAK,CAAC,SAAU,OACtB,OAAQjR,GACN,IAAK,MACL,IAAK,SACH,OAAIO,EAAYsQ,EAAUE,EAAKD,EACxBD,EAAUC,EAAKC,EACxB,IAAK,OACL,IAAK,QACH,OAAOF,EAAUG,EAAKC,EACxB,QACE,MAAO,GAEb,CAGaC,CAAY7R,GAAQC,GAA0B,UAAd+J,EAAuB9I,GAOlE,OANIT,IACF4F,EAAOA,EAAKxiB,KAAI8c,GAAQA,EAAO,IAAMF,IACjCyQ,IACF7K,EAAOA,EAAKQ,OAAOR,EAAKxiB,IAAI2c,OAGzB6F,CACT,CC8VmCyL,CAA0BjB,EAAkBK,EAAeD,EAA2B/P,IAEnH,MAAM6Q,EAAa,CAAClB,KAAqBC,GACnCvM,QAAiB1C,GAAeC,EAAOwO,GACvC0B,EAAY,GAClB,IAAIC,GAAiE,OAA/CrB,EAAuBpB,EAAemB,WAAgB,EAASC,EAAqBoB,YAAc,GAIxH,GAHI7B,GACF6B,EAAU/5B,KAAKssB,EAAS5D,IAEtByP,EAAgB,CAClB,MAAM8B,EDvZd,SAA2BjS,EAAWgC,EAAOf,QAC/B,IAARA,IACFA,GAAM,GAER,MAAMT,EAAYP,GAAaD,GACzBqB,EAAgBf,GAAiBN,GACjChnB,EAASonB,GAAciB,GAC7B,IAAI6Q,EAAsC,MAAlB7Q,EAAwBb,KAAeS,EAAM,MAAQ,SAAW,QAAU,OAAuB,UAAdT,EAAwB,SAAW,MAI9I,OAHIwB,EAAMd,UAAUloB,GAAUgpB,EAAMb,SAASnoB,KAC3Ck5B,EAAoBzR,GAAqByR,IAEpC,CAACA,EAAmBzR,GAAqByR,GAClD,CC2YsBC,CAAkBnS,EAAWgC,EAAOf,GAClD8Q,EAAU/5B,KAAKssB,EAAS2N,EAAM,IAAK3N,EAAS2N,EAAM,IACnD,CAOD,GANAD,EAAgB,IAAIA,EAAe,CACjChS,YACA+R,eAIGA,EAAUK,OAAM1R,GAAQA,GAAQ,IAAI,CACvC,IAAI2R,EAAuBC,EAC3B,MAAMC,IAA+D,OAAhDF,EAAwB9C,EAAemB,WAAgB,EAAS2B,EAAsB/uB,QAAU,GAAK,EACpHkvB,EAAgBV,EAAWS,GACjC,GAAIC,EAEF,MAAO,CACLh3B,KAAM,CACJ8H,MAAOivB,EACPR,UAAWC,GAEbS,MAAO,CACLzS,UAAWwS,IAOjB,IAAIE,EAAgJ,OAA9HJ,EAAwBN,EAAcnuB,QAAO3I,GAAKA,EAAE62B,UAAU,IAAM,IAAGniB,MAAK,CAAC/Y,EAAGC,IAAMD,EAAEk7B,UAAU,GAAKj7B,EAAEi7B,UAAU,KAAI,SAAc,EAASO,EAAsBtS,UAG1L,IAAK0S,EACH,OAAQ3B,GACN,IAAK,UACH,CACE,IAAI4B,EACJ,MAAM3S,EASmJ,OATtI2S,EAAyBX,EAAcnuB,QAAO3I,IAC/D,GAAIo2B,EAA8B,CAChC,MAAMsB,EAAkBvS,GAAYnlB,EAAE8kB,WACtC,OAAO4S,IAAoB1B,GAGP,MAApB0B,CACD,CACD,OAAO,CAAI,IACVhvB,KAAI1I,GAAK,CAACA,EAAE8kB,UAAW9kB,EAAE62B,UAAUluB,QAAOygB,GAAYA,EAAW,IAAG0H,QAAO,CAAC6G,EAAKvO,IAAauO,EAAMvO,GAAU,MAAK1U,MAAK,CAAC/Y,EAAGC,IAAMD,EAAE,GAAKC,EAAE,KAAI,SAAc,EAAS67B,EAAuB,GAC5L3S,IACF0S,EAAiB1S,GAEnB,KACD,CACH,IAAK,mBACH0S,EAAiB9B,EAIvB,GAAI5Q,IAAc0S,EAChB,MAAO,CACLD,MAAO,CACLzS,UAAW0S,GAIlB,CACD,MAAO,EACR,EAEL,EEgNMI,GAAkB,CAAC5R,EAAWC,EAAUplB,KAI5C,MAAMovB,EAAQ,IAAIzmB,IACZquB,EAAgB,CACpBhR,eACGhmB,GAECi3B,EAAoB,IACrBD,EAAchR,SACjB6J,GAAIT,GAEN,MFvqBsB9gB,OAAO6W,EAAWC,EAAUlZ,KAClD,MAAM+X,UACJA,EAAY,SAAQkC,SACpBA,EAAW,WAAU+Q,WACrBA,EAAa,GAAElR,SACfA,GACE9Z,EACEirB,EAAkBD,EAAWpvB,OAAOsvB,SACpClS,QAA+B,MAAlBc,EAASyK,WAAgB,EAASzK,EAASyK,MAAMrL,IACpE,IAAIa,QAAcD,EAASmK,gBAAgB,CACzChL,YACAC,WACAe,cAEE/C,EACFA,EAACC,EACDA,GACE2B,GAA2BiB,EAAOhC,EAAWiB,GAC7CmS,EAAoBpT,EACpBuP,EAAiB,CAAA,EACjB8D,EAAa,EACjB,IAAK,IAAIp6B,EAAI,EAAGA,EAAIi6B,EAAgBl6B,OAAQC,IAAK,CAC/C,MAAMmC,KACJA,EAAIjF,GACJA,GACE+8B,EAAgBj6B,IAElBkmB,EAAGmU,EACHlU,EAAGmU,EAAK/3B,KACRA,EAAIi3B,MACJA,SACQt8B,EAAG,CACXgpB,IACAC,IACAwR,iBAAkB5Q,EAClBA,UAAWoT,EACXlR,WACAqN,iBACAvN,QACAD,WACAE,SAAU,CACRf,YACAC,cAGJhC,EAAa,MAATmU,EAAgBA,EAAQnU,EAC5BC,EAAa,MAATmU,EAAgBA,EAAQnU,EAC5BmQ,EAAiB,IACZA,EACHn0B,CAACA,GAAO,IACHm0B,EAAen0B,MACfI,IAGHi3B,GAASY,GAAc,KACzBA,IACqB,iBAAVZ,IACLA,EAAMzS,YACRoT,EAAoBX,EAAMzS,WAExByS,EAAMzQ,QACRA,GAAwB,IAAhByQ,EAAMzQ,YAAuBD,EAASmK,gBAAgB,CAC5DhL,YACAC,WACAe,aACGuQ,EAAMzQ,SAGX7C,IACAC,KACE2B,GAA2BiB,EAAOoR,EAAmBnS,KAE3DhoB,GAAK,EAER,CACD,MAAO,CACLkmB,IACAC,IACAY,UAAWoT,EACXlR,WACAqN,iBACD,EEslBMiE,CAAkBtS,EAAWC,EAAU,IACzC4R,EACHhR,SAAUiR,GACV,ECvuBG,SAASS,GAAsBC,GAClC,IAAIC,EACAC,EACJ,MAAMC,EAAiB,CACnBnH,YAAY,GAEhB,IAAI3wB,EAAU23B,EACd,MAAMvmB,EAAc2mB,IACT,IAAKD,KAAoBH,GAAe,CAAE,KAAOI,GAAS,CAAE,IAEjEC,EAAkBC,IAChBL,GAAoBC,IACpB73B,EAAUoR,EAAW6mB,GACrBlB,GAAgBa,EAAkBC,EAAiB73B,GAC9CwF,MAAK2d,IACN7oB,OAAOP,OAAO89B,EAAgBv2B,MAAO,CACjC+sB,SAAUlL,EAAEgD,SACZ5C,KAAM,GAAGJ,EAAEC,MACXM,IAAK,GAAGP,EAAEE,QAEdrjB,GAASk4B,YAAcl4B,EAAQk4B,WAAW/U,EAAE,IAEnD,EA4CCgV,EAA+B35B,IAYjC4F,EAXoB5F,EAAKjD,WAAW68B,SACPx7B,IAArBg7B,GACAA,EAAmBQ,EACnBJ,MAIA19B,OAAOP,OAAO69B,EAAkBQ,GAChCJ,IACH,IAEiB,EAE1B,MAAO,CAxDiBx5B,IACpB,GAAI,cAAeA,EAEf,OADA25B,EAA4B35B,GACrB,GAGPo5B,EAAmBp5B,EACnBw5B,GACH,EAEiB,CAACx5B,EAAM65B,KACzB,IAAIC,EACJT,EAAkBr5B,EAClBwB,EAAUoR,EAAWinB,GACrB/F,YAAW,IAAM0F,EAAeK,IAAiB,GACjDL,EAAeK,GACf,MAAME,EAAoB,KAClBD,IACAA,IACAA,OAAoB17B,EACvB,EAEC47B,EAAiB,EAAC7H,WAAEA,GAAe3wB,GAAW,CAAA,KAChDu4B,KACmB,IAAf5H,I5BwrCZprB,KACOJ,G4BxrCYK,MAAK,IACDizB,GAAYb,EAAkBC,GAAiB,IAAMG,EAAeh4B,KAA0B,IAAf2wB,EAAsB,CAAE,EAAGA,IAGlH,EAGX,OADA2H,EAAoBE,IACb,CACH,MAAAzyB,CAAOsyB,GACHL,EAAeK,GACfC,EAAoBE,EAAeH,EACtC,EACD,OAAAh6B,GACIk6B,GACH,EACJ,EAmBDP,EAER,CC1Fe,SAASlwB,IAAO4wB,YAC3BA,EAAWC,WACXA,EAAUC,MACVA,EAAKC,SACLA,EAAQl4B,MACRA,EAAKm4B,OACLA,EAAMC,QACNA,EAAOC,oBACPA,EAAmBC,WACnBA,EAAUC,4BACVA,EAA2BC,mBAC3BA,EAAkBC,MAClBA,IAEA,GAAIR,GAASF,EAAa,OAAOE,EACjC,IAAKA,EAAO,MAAO,GAEfA,GAASA,EAAM37B,OAAS,GAAyB,iBAAb27B,EAAM,KAC1CA,EAAQM,EAA4BN,IAGxC,IAAIS,EAAgBT,EAAM9wB,QAAQ2X,IAC9B,IAAI6Z,EAAgBL,EAAWxZ,EAAK2Z,GAAQT,EAAYlZ,GAOxD,OANI6Z,GAAiBT,GAAYl4B,GAAO1D,SACpCq8B,GAAiB34B,EAAMmoB,MAAM1F,KAClB4V,GAAsB5V,EAAE0V,KAAYrZ,EAAKqZ,MAIjDQ,CAAa,IAOxB,OAJIP,IACAM,EAAgBF,EAAmBE,IAGhCA,CACX,CCrCe/qB,eAAeirB,IAASC,SAAEA,EAAQd,YAAEA,EAAWQ,4BAAEA,EAA2BP,WAAEA,IACzF,IAAIc,QAAYf,EAAYC,GAAYe,OAAOC,IAC3CpZ,QAAQqZ,KAAK,uCAAwCD,GACrDH,EAAS,QAAS,CAAEl1B,KAAM,cAAeu1B,QAASF,GAAM,IAG5D,GAAIF,IAAQA,EAAIK,UAWZ,OAVIL,GACIA,GAAOA,EAAIx8B,OAAS,GAAuB,iBAAXw8B,EAAI,KACpCA,EAAMP,EAA4BO,IAGtCD,EAAS,SAAU,CAAEZ,MAAOa,KAE5BA,EAAM,GAGH,CACHM,cAAeN,EACfO,SAAS,EACTC,SAAS,EACTC,UAAU,EAGtB,8jBCxBAx7B,EAaMH,EAAAkM,EAAA9L,GAPFL,EAMwDmM,EAAAC,wiBCZ5DhM,EAaMH,EAAAkM,EAAA9L,GALFL,EAIEmM,EAAAC,qaCZNhM,EAUMH,EAAAkM,EAAA9L,GATFL,EAQ6BmM,EAAA0vB,6UC8vBqB/9B,EAAK,iJAlBGA,EAAI,WAASA,EAAC,yMAxChBA,EAAC,oIAtB5Cg+B,EAAAh+B,MAAQ,iBAAci+B,GAAAj+B,2CACtB,OAAAA,MAAQiuB,KAAI,EACPjuB,EAAa,IAACa,OAAS,EAAC,EA0BvBb,EAAc,OAAA,8BAKpB,IAAAk+B,EAAAl+B,MAAQ,gBAAam+B,GAAAn+B,iKA1C9BsC,EA2CMH,EAAAwL,EAAApL,0HAtCSvC,EAAgB,8EAItBA,MAAQ,sRAiCRA,MAAQ,0tBAHLsC,EAAmCH,EAAAwL,EAAApL,8OA3BhCvC,EAAa,yBAAlBa,OAAIC,GAAA,yPAACd,EAAa,YAAlBa,OAAIC,GAAA,EAAA,sHAAJD,OAAIC,EAAA2P,EAAA5P,OAAAC,GAAA,0CAAJD,OAAIC,GAAA,wcAoBW,MAAA8M,EAAA5N,SAAOA,EAAK,KAAA,8CAAZ,SAAAM,EAAA,IAAAsN,KAAAA,EAAA5N,SAAOA,EAAK,KAAA,KAAAuF,EAAA4B,EAAAyG,sNAPOvH,EAAAmK,EAAA,mBAAAxQ,OAAKo+B,aACf/3B,EAAAmK,EAAA,SAAAxQ,EAAa,IAAAA,EAAM,KAAAA,KAAOA,EAAM,MACjCqG,EAAAmK,EAAA,QA3FZ,IA2FwBxQ,EAAC,MACbqG,EAAAmK,EAAA,QAAAxQ,OAAmBA,EAAC,MACfqG,EAAAmK,EAAA,aAAAxQ,OAAKq+B,iCACoB,IAArBr+B,EAAI,MAAEs+B,mGAjBpCh8B,EAsBMH,EAAAoO,EAAAhO,GAdFL,EAaMqO,EAAAC,4DAZkBygB,OAAQjxB,EAAY,IAACA,EAAM,KAAAA,KAAOA,EAAM,KAAGu+B,QAAAv+B,EAAO,8BACnDixB,OAAQjxB,EAAiB,MAAKA,EAAC,KAAEu+B,QAAAv+B,EAAO,6SADvCixB,OAAQjxB,EAAY,IAACA,EAAM,KAAAA,KAAOA,EAAM,KAAGu+B,QAAAv+B,EAAO,2DACnDixB,OAAQjxB,EAAiB,MAAKA,EAAC,KAAEu+B,QAAAv+B,EAAO,2BAEnCqG,EAAAmK,EAAA,mBAAAxQ,OAAKo+B,6CACf/3B,EAAAmK,EAAA,SAAAxQ,EAAa,IAAAA,EAAM,KAAAA,KAAOA,EAAM,sBAEjCqG,EAAAmK,EAAA,QAAAxQ,OAAmBA,EAAC,2BACfqG,EAAAmK,EAAA,aAAAxQ,OAAKq+B,sDACoB,IAArBr+B,EAAI,MAAEs+B,kZAkBjBt+B,EAAa,2BAEnCA,EAAW,2HAFhBsC,EAAgDH,EAAAq8B,EAAAj8B,mBAChDD,EAEOH,EAAAs8B,EAAAl8B,8BAHoBvC,EAAa,iBAEnCA,EAAW,4GAWXA,EAAQ,GAAA,gYA6BA,MAAA4N,EAAA5N,KAAMA,EAAK,KAAA,8CAAX,KAAAM,EAAA,IAAAsN,KAAAA,EAAA5N,KAAMA,EAAK,KAAA,KAAAuF,EAAA4B,EAAAyG,0HAFiC5N,EAAgB,aAArEsC,EAIMH,EAAAwL,EAAApL,2MAJ+CvC,EAAgB,mGA1B9DA,EAAK,wBAAVa,OAAIC,GAAA,oPAACd,EAAK,WAAVa,OAAIC,GAAA,EAAA,sHAAJD,OAAIC,EAAA2P,EAAA5P,OAAAC,GAAA,0CAAJD,OAAIC,GAAA,keAeMwB,EAMMH,EAAAwL,EAAApL,2TAXD,MAAAqL,EAAA5N,OAAKA,EAAK,KAAA,8CAAV,KAAAM,EAAA,IAAAsN,KAAAA,EAAA5N,OAAKA,EAAK,KAAA,KAAAuF,EAAA4B,EAAAyG,8BAIb5N,EAAQ,MAAKA,EAAsB,KAAI0+B,IAASC,GAAA3+B,6MAXxCqG,EAAAsH,EAAA,SAAA3N,QAAgBA,EAAC,oCAFnCsC,EAsBMH,EAAAwL,EAAApL,GAfFL,EAIOyL,EAAAY,+PAEDvO,EAAQ,KAAKA,EAAsB,MAAI0+B,iIAX/Br4B,EAAAsH,EAAA,SAAA3N,QAAgBA,EAAC,mfA8C3CsC,EAIMH,EAAAwL,EAAApL,ohBAIND,EAISH,EAAA8N,EAAA1N,yCAJiDvC,EAAW,4gBAQrEsC,EAIMH,EAAAwL,EAAApL,6YAUND,EAAqEH,EAAA4D,EAAAxD,yRA9IxEvC,EAAQ,IAAA4+B,GAAA5+B,KAgDJA,EAAO,IAAA6+B,GAAA7+B,iDAaPA,EAAQ,KAAA8+B,GAAA9+B,mBAwCEA,EAAU,KACjBA,EAAgB,iBAGPA,EAAe,YACrBA,EAAW,0EAKjBA,EAAO,IAAA++B,GAAA/+B,KAQPA,EAAS,KAAAg/B,GAAAh/B,KAQTA,EAAW,KAAAi/B,GAAAj/B,oJAUmBA,EAAK,GAAGwU,KAAK8P,UAAUtkB,EAAK,IAAI,0CAAnEsC,EAA2EH,EAAA+8B,EAAA38B,qDAAxCvC,EAAK,GAAGwU,KAAK8P,UAAUtkB,EAAK,IAAI,uCAGlE,IAAAm/B,EAAAn/B,SAAcA,EAAK,IAAqB,IAAjBA,EAAM,GAAAa,SAAYokB,GAAAjlB,ohBAxJxBA,EAAgB,IAAA,8BAO/BA,EAAe,oCANTA,EAAQ,8DAGJA,EAAQ,uBACLA,EAAW,iBAClBA,EAAQ,aAPzBsC,EA8JMH,EAAAi9B,EAAA78B,yBAlGFL,EAOOk9B,EAAA7wB,yBAEPrM,EAEMk9B,EAAA5uB,yBAENtO,EAgDMk9B,EAAA7uB,yBAXFrO,EAUiBqO,EAAA2uB,uCAHDl/B,EAAU,WAM9BkC,EAwBMk9B,EAAAC,gJArJer/B,EAAkB,wBAAcA,EAAa,mBAiH9CA,EAAa,gBAChBA,EAAU,iBACTA,EAAW,0CAxGAA,EAAW,2CAInCA,EAAQ,0GAgDJA,EAAO,sIAaPA,EAAQ,uJAwCEA,EAAU,OAAA,CAAAs/B,SAAAC,mBACjBv/B,EAAgB,+BAGPA,EAAe,+BACrBA,EAAW,6DAFNA,EAAU,QAAVA,EAAU,4BAOrBA,EAAO,0GAQPA,EAAS,0GAQTA,EAAW,uPAafA,OAAcA,EAAK,IAAqB,IAAjBA,EAAM,GAAAa,+JAxJZb,EAAgB,IAAA,iEAO/BA,EAAe,qCANTA,EAAQ,0HAGJA,EAAQ,2CACLA,EAAW,qCAClBA,EAAQ,6QA7iBZ,SAAA88B,GAA4B0C,GAC1B,OAAAA,EAAO/zB,KAAK,CAAA4X,EAAMlY,KAEjB,CAAAA,QACA5G,MAAO8e,EACP2Z,SAAU3Z,oFlCK1B,SAAuBoc,GACnB,MAAMh+B,EAAS,CAAA,EACf,IAAK,MAAMwD,KAAOw6B,EACdh+B,EAAOwD,IAAO,EAElB,OAAOxD,CACX,KkCrIU27B,EAAWn1B,IASN,IAAAy3B,UAAAA,EAAY,MAAIlyB,UAEhB9B,EAASi0B,IAAOnyB,YAChB2vB,EAAWyC,IAASpyB,GAEpBwO,GAAAA,EAAK,MAAIxO,GACTvK,KAAAA,EAAO,MAAIuK,GACXqyB,UAAAA,GAAqBryB,GACrB/H,MAAAA,GAAiB+H,GACjBivB,SAAAA,GAAW,GAAKjvB,GAChBsyB,uBAAAA,GAAyB,GAAKtyB,GAC9BuyB,SAAAA,GAAW,GAAKvyB,GAChBqwB,QAAAA,GAAU,GAAKrwB,GACfjJ,MAAAA,EAAQ,MAAIiJ,GACZ+uB,WAAAA,EAAa,IAAE/uB,GACfwyB,YAAAA,EAAc,iBAAexyB,GAC7ByyB,sBAAAA,GAAwB,GAAKzyB,GAC7BgvB,MAAAA,EAAQ,MAAIhvB,GACZwvB,MAAAA,EAAQ,SAAOxvB,GACfqvB,WAAAA,EAAc,CAAAG,EAAOT,EAAYt2B,IAAM,GAAQ+2B,IAAQ1R,cAAc7Z,SAAS8qB,EAAWjR,gBAAW9d,GACpGmvB,QAAAA,GAAmBnvB,eACnB0yB,EAAeC,GAAWA,GAAM3yB,GAChC4yB,sBAAAA,GAAwB,GAAK5yB,GAC7BkvB,OAAAA,EAAS,SAAOlvB,GAChB8uB,YAAAA,GAAuB9uB,GACvB6yB,gBAAAA,EAAkB,IAAE7yB,GACpB8yB,SAAAA,GAAW,GAAK9yB,GAChBovB,oBAAAA,GAAsB,GAAIpvB,GAC1B+yB,SAAAA,GAAW,GAAK/yB,GAChBgzB,kBAAAA,GAAoB,GAAIhzB,GACxBizB,sBAAAA,GAAwB,GAAIjzB,yBAE5BkzB,EAAqB,CAAIC,EAAYtd,KAExC,CAAA9e,MAAOo8B,EACN3D,CAAAA,GAAQ2D,OAQN,IAMPtuB,EAkBAuuB,EACAC,GACAC,GACAC,GAcAC,IAzCOC,WAAAA,IAAa,GAAIzzB,GACjB0zB,YAAAA,GAAc,IAAE1zB,GAChB2zB,UAAAA,IAAY,GAAI3zB,GAChBowB,QAAAA,IAAU,GAAKpwB,GACfswB,SAAAA,IAAW,GAAKtwB,GAGhB4zB,SAAAA,GAAY,CAAApjC,EAAIqjC,EAAO,KAC9B9L,aAAaljB,GACbA,EAAU6jB,WAAWl4B,EAAIqjC,EAAI,MAGtBC,aAAAA,GAAe,KAAG9zB,GAClB+zB,eAAAA,IAAiB,GAAK/zB,mBACtBg0B,GAAe,IAAAh0B,GACfi0B,cAAAA,IAAgB,GAAIj0B,GACpBk0B,YAAAA,IAAc,GAAKl0B,GACnBm0B,WAAAA,GAAa,GAACn0B,GACdo0B,eAAAA,GAAiB,GAACp0B,kBAClBq0B,GAAc,IAAAr0B,GAIrBs0B,MAAAC,GAAmB,IAAEv0B,EAoDhB,SAAAuvB,GAAmByC,SAClBwC,EAAW,GACX7B,EAAM,CAAA,EAEZX,EAAOlhC,SAAS+kB,UACNsd,EAAahE,EAAQtZ,GAEtB2e,EAAYvwB,SAASkvB,KACtBqB,EAAYniC,KAAK8gC,GACjBR,EAAOQ,GAAU,GAEbA,GACAR,EAAOQ,GAAY9gC,KACf3B,OAAOP,OAAO+iC,EAAsBC,EAAYtd,GAAI,CAChDrH,GAAI2kB,EACJvC,aAAa,EACbE,WAAY8B,MAM5BD,EAAOQ,GAAY9gC,KAAK3B,OAAOP,OAAS,CAAA0gC,YAAasC,GAActd,GAAI,UAGrE4e,EAAkB,UAExB/B,EAAY8B,GAAa1jC,SAASqiC,IAC1BR,EAAOQ,IAAasB,EAAmBpiC,QAAQsgC,EAAOQ,GAAU,IAGjEsB,EAwDF,SAAAC,GAAqBC,EAAgB,EAAGC,GAC7CpxB,EAAA,EAAA4wB,GAAiBO,EAAgB,EAAI,EAAIA,IACpCC,GAAezF,GAAWgB,EAAciE,MAAoBjE,EAAciE,IAAgBtD,YAC3F+D,GAAc,GlC+4B1B,IAAsBrkC,YkClzBTskC,KACD,IAAAC,GAAe,KACfh+B,EAAK,OACCi+B,EAAG,GACHC,EAAY,GAElBl+B,EAAMjG,SAASyS,IACNyxB,EAAI/wB,SAASV,EAAI2rB,IAIlB6F,GAAe,GAHfC,EAAI3iC,KAAKkR,EAAI2rB,IACb+F,EAAa5iC,KAAKkR,OAMrBwxB,GAAYvxB,EAAA,EAAEzM,EAAQk+B,UAExBF,EAGF,SAAAG,GAASC,OACVC,EAAUD,EAAYA,EAAUjG,GAAUn4B,EAAMm4B,UAC7CF,EAAMqG,MAAMxf,GAASA,EAAKqZ,KAAYkG,IAclC1wB,eAAA4wB,GAAqBhiC,SAC1BiiC,EAAex+B,EAAMzD,GAEN,IAAjByD,EAAM1D,OACNmQ,EAAA,EAAAzM,OAAQ/D,GAERwQ,EAAA,EAAAzM,EAAQA,EAAMmH,QAAQ2X,GACXA,IAAS0f,KAIxB3F,EAAS,QAAS2F,GA4Fb,SAAAC,GAAYr8B,GACbk3B,GAAWp4B,IAAUzG,UAAUikC,gBAC/Bt8B,GAAGy2B,EAAS,QAASz2B,GACzBlB,GAAOy9B,QACPlyB,EAAA,EAAA6sB,GAAU,IAGC3rB,eAAAixB,GAAWx8B,GAClBy8B,KACAtF,IAAYD,KACZT,EAAS,OAAQz2B,GACjB08B,KACAryB,EAAA,EAAA6sB,GAAU,GACV7sB,EAAA,GAAA4vB,OAAcpgC,GACdiF,GAAOmd,iBAuCNygB,KACD5C,GACAzvB,EAAA,EAAAurB,EAAa,IAEjBvrB,EAAA,EAAA8sB,IAAW,GlC8mBG9/B,GkC7zBNkU,UACRlB,EAAA,GAAA6vB,GAAat8B,GACbyM,EAAA,GAAA8vB,GAAkBvE,GAClBvrB,EAAA,GAAA+vB,GAAgBtE,EAAQ,ElC2zB5B70B,IAAwBjI,GAAGqK,cAAcnK,KAAK7B,IkCzoB9C8J,GAAO,KACCg2B,IAAQ9sB,EAAA,EAAE6sB,GAAU,GACpBA,GAAWp4B,GAAOA,EAAMy9B,OAAK,IA2B1B,IAAAI,WAAAA,GAAct1B,aACJA,gCAGVu1B,GAAY,CAAIvG,EAAOwG,IACgB,uCAAAxG,gBAAoBwG,uCAG3DC,GAAW,8EA2BlB,IAEAC,GAFAzV,GAAO,cAGF0V,KACLpO,aAAamO,IACbA,GAAmBxN,iBACfkN,IAAc,CAAK,GACpB,KASPp7B,GAAS,KACLimB,IAAMxI,QAAM,IAGZ,IAAA2d,IAAc,EAET,SAAAQ,GAAavgB,GACbA,IAA4B,IAApBA,EAAKib,YAlFb,SAAaqE,MACdA,EAAS,CACT3xB,EAAA,EAAAurB,EAAa,IACP,MAAAlZ,EAAOnlB,OAAOP,UAAWglC,GAE3B,GAAAtf,EAAK+a,cAAgB/a,EAAKib,WAAU,OACxCttB,EAAA,EAAAzM,EAAQk4B,EAAYl4B,EAAQA,EAAMkqB,OAAQ,CAAApL,KAAUA,GAAUrS,EAAA,EAAAzM,EAAQ8e,IAEtE6S,YAAU,KACFsK,GAAmB6C,KACvBryB,EAAA,GAAA4vB,OAAcpgC,GACd48B,EAAS,SAAU74B,GACnB64B,EAAS,SAAUuF,EAAS,KAuEpCkB,CAAaxgB,GAGR,SAAAygB,GAAYhjC,GACbsiC,IACJpyB,EAAA,EAAA4wB,GAAiB9gC,GAGZ,SAAAijC,GAAgBC,cACb3gB,EAAIviB,EAAEA,GAAMkjC,MACK,IAArB3gB,GAAMib,kBACN/5B,IAAUk4B,GAAYl4B,EAAMm4B,KAAYrZ,EAAKqZ,GAAgB2G,UAyC5D,SAAiBhgB,GACd,OAAAA,EAAK+a,aAAe/a,EAAKib,YAAejb,EAAKib,aAAejb,EAAK4gB,eAAe,cAzCpFC,CAAiB7gB,KACjBrS,EAAA,EAAA4wB,GAAiB9gC,GACjB8iC,GAAavgB,KAIZ,SAAAgf,GAAc8B,MAKoB,IAJTxG,EAAcjyB,QACvC2X,IAAUnlB,OAAOkmC,OAAO/gB,EAAM,gBAAqC,IAApBA,EAAKib,aAG7Bz9B,OAChB,OAAAmQ,EAAA,EAAA4wB,GAAiB,GAGzBuC,EAAY,GAAKvC,KAAmBjE,EAAc98B,OAAS,EAC3DmQ,EAAA,EAAA4wB,GAAiB,GAEjB5wB,EAAA,EADOmzB,EAAY,GAAwB,IAAnBvC,GACxBA,GAAiBjE,EAAc98B,OAAS,EAExC+gC,IAAkCuC,SAGhCE,EAAQ1G,EAAciE,IAExByC,IAA8B,IAArBA,EAAM/F,aACG,IAAd6F,IAAkC,IAAfA,GAAkB9B,GAAc8B,IAkBzD,MAAAG,GAAeC,GACfC,GAAcD,GAEX,SAAAA,GAAaniC,UAEd,MAAAuH,CAAOq6B,GACCA,EAAK/S,SACL0S,KACAvhC,EAAKqiC,eAAiB,CAAAC,SAAU,OAAQl6B,MAAO,mBAW3Dm6B,GAAe,CACf5a,SAAU,WACVlC,UAAW,eACXiT,YAAa7D,GAAO0K,IAAapJ,KAAQT,MACzCvD,YAAY,GAGT,MAAAqQ,GAAaC,GAAiBC,IAAkBxJ,GAAsBqJ,IAMzE,IAAAI,IAAW,2gEAldA,cA5GA,GAAU,iBAAVxgC,EAAkB,KACrB8e,GAAQmZ,GAAK,IAAQqG,MAAMxf,GAASA,EAAKqZ,KAAYn4B,QACzDA,EAAQ8e,GACH,CAAAqZ,CAAAA,GAASn4B,EACVy4B,MAAOz4B,SAEJk4B,GAAYl1B,MAAM+H,QAAQ/K,IAAUA,EAAM1D,OAAS,OAC1D0D,EAAQA,EAAMkH,KAAK4X,GAA0B,iBAATA,EAAsB,CAAA9e,MAAO8e,EAAM2Z,MAAO3Z,GAASA,KAqGxE2hB,6CAChBxD,IAAoBP,UAhGvBD,GAAmB9iC,OAAOP,QAElBsnC,eAAgB,OAChBC,aAAc,MACdC,YAAa,MACbC,YAAY,EACZC,SAAU,EACVn9B,KAAM,OACN,oBAAqB,QAEzBs5B,KAGAxlB,QACAglB,GAAqB,GAAIhlB,EAAEglB,IAG1BC,SACDD,GAA2B,UAAI,EAAIA,yBA+EpCvE,GAfCl4B,IACIgD,MAAM+H,QAAQ/K,GACdyM,EAAA,EAAAzM,MAAYA,IAEZyM,EAAA,EAAAzM,GAASA,6CAYdw8B,KAAkBtE,GANjBl4B,GAAKyM,EAAA,EAAEzM,EAAQ,yBAOhBk4B,GAAYl4B,GAASA,EAAM1D,OAAS,GAAGyhC,sBACvC/9B,IAjCCk4B,EACIjoB,KAAK8P,UAAU/f,KAAWiQ,KAAK8P,UAAUuc,KACrCyB,MACAlF,EAAS,QAAS74B,GAMzBs8B,IAAcrsB,KAAK8P,UAAU/f,EAAMm4B,MAAaloB,KAAK8P,UAAUuc,GAAWnE,KAC3EU,EAAS,QAAS74B,4CAwBlBA,GAASk4B,GAAYoE,IAAYzD,EAAS,QAAS74B,qBACnDs5B,GAAWp4B,GAAO49B,4CACnB9G,IAAeuE,KAwBbxE,GAAqC,IAAtBC,EAAW17B,UAE3By7B,EACA8E,qBACIpwB,EAAA,EAAA4sB,IAAU,GACN,IAAAP,QAAYF,EAAQ,CACpBC,WACAd,cACAQ,+BACAP,eAGAc,OACAO,GAAUP,EAAIO,SACd5sB,EAAA,EAAA8sB,GAAWA,GAAWT,EAAIS,SAAWvB,EAAW17B,OAAS,GACzDmQ,EAAA,EAAA6sB,EAAUC,IAAYT,EAAIQ,SAC1B7sB,EAAA,GAAAwrB,EAAQG,EAAUI,GAAmBM,EAAIM,eAAiBN,EAAIM,iBAE9D3sB,EAAA,EAAA4sB,IAAU,GACV5sB,EAAA,EAAA6sB,GAAU,GACV7sB,EAAA,EAAA8sB,IAAW,MAEhBwD,KAEHtwB,EAAA,EAAA8sB,IAAW,GAEPrB,GACAzrB,EAAA,GAAA4vB,OAAcpgC,kEAqBzBwQ,EAAA,GAAE2sB,EAAgBjyB,EAAM,CACrB4wB,cACAC,aACAC,QACAC,WACAl4B,QACAm4B,SACAC,UACAK,QACAJ,sBACAC,aACAC,+BACAC,kDAnFIN,GAAYqB,IAAYv5B,GAASo5B,GAQrCuE,GAJmBvE,EAActmB,WAAWvW,GACjCA,EAAE47B,KAAYn4B,EAAMm4B,MAGE,sBAoF9BoB,IAAYrB,GAAUzrB,EAAA,EAAA4wB,GAAiB,qBAEvCrF,GAAYvrB,EAAA,EAAA4wB,GAAiB,sBAlFhCxE,EAAS,YAXIwE,uBAsDd5wB,EAAA,GAAAs0B,EAAW7I,EAAWl4B,GAASA,EAAM1D,OAAS,EAAI0D,2BACpDyM,EAAA,GAAEu0B,EAAmBD,GAAY/I,EAAW17B,OAAS,4CACrDmQ,EAAA,GAAEw0B,EAAYF,GAAYnE,KAAcpB,IAAanC,+CACnD5sB,EAAA,GAAAy0B,EACCxF,GAAyBxD,GAEnBA,GAA8B,IAAlBl4B,GAAO1D,OADnBm/B,EAGAz7B,EACA,GACAy7B,sBACThvB,EAAA,GAAE00B,EAAgBnhC,EAgQV,SAAoBohC,GACrB,IAAAx/B,EAQG,OALHA,EADAw/B,GAAaphC,EAAM1D,OAAS,EACjB0D,EAAMkH,KAAKsb,GAAMA,EAAEiW,KAAQ4I,KAAK,MAEhCrhC,EAAMy4B,GAGdsG,GAAWn9B,GAzQK0/B,CAAoBpJ,GAAY,4BAC1DzrB,EAAA,GAAE80B,aA4QM,IAAAnI,GAA0C,IAAzBA,EAAc98B,aAAqB,OACrDklC,EAAQpI,EAAciE,IACtB,GAAA9D,IAAYiI,EAAK,CACb,IAAAvC,EAAQ7F,EAAgBA,EAAc98B,OAAS,EAC5C,OAAA0iC,GAAawC,EAAM/I,GAAQwG,UAE3BC,KAlREuC,2BAqER,SAAmBxJ,GACnBA,GAA0B,IAAjBA,EAAM37B,SAAgB27B,EAAM9P,MAAMrJ,GAAyB,iBAATA,KAC3D9e,IAAUk4B,GAAWl4B,EAAMmoB,MAAMiW,IAAeA,IAAcA,EAAUjG,KAAYn4B,EAAMm4B,MAE3Fn1B,MAAM+H,QAAQ/K,OACdA,EAAQA,EAAMkH,KAAKk3B,GAAcD,GAASC,IAAcA,SAExDp+B,EAAQm+B,MAAcn+B,IA3E3B0hC,CAAmBzJ,uBACrBxrB,EAAA,GAAE0uB,EAsCKjD,EAAiBl4B,EAAQA,EAAMkH,KAAK4X,GAASA,EAAKqZ,KAAW,KAC1Dn4B,EAAQA,EAAMm4B,GAAUn4B,2CAtC3Bk4B,IAAYoE,IAAet8B,GAAO64B,EAAS,QAAS74B,4BAerDu5B,IAAYH,IAAkBlB,IAAal4B,GAAO29B,6BAWhD,SAAkB1F,GACnBsB,IAAUV,EAAS,SAAUZ,GAXlC0J,CAAkBvI,uCA+WdkC,QAA4Cr/B,IAA/BqhC,IAAgBtN,iBAChCoQ,GAAgBpQ,YAAa,EAAIoQ,0CA/W9B9E,GAAagC,IAAgBiD,GAAe5mC,OAAOP,OAAOgnC,GAAiB9C,4BACjF7wB,EAAA,GAAEutB,IAAYtQ,oCAkXMA,EAAM6P,GAClB,IAAA7P,IAAS6P,EAAkB,OAAA9sB,EAAA,GAAA+zB,IAAW,GAC3C7O,iBACIllB,EAAA,GAAA+zB,IAAW,EAAK,GACjB,GArXJoB,CAAYlY,GAAM6P,2BACdA,IAAY+B,GAAa5R,2BA8VpBvF,GAAUmX,EAAUvQ,6BAC5BrB,GAAK/oB,MAAMwjB,MAAQ+Y,GAAgB/Y,EAAQ,KAAO,OAAMuF,IA/VtBmY,sBACrCp1B,EAAA,GAAEq1B,EAAoBzE,sBAEhBn8B,GAASq4B,KAAaD,GAASmF,sEAsLlC5F,EAAS,QAAS74B,GAClByM,EAAA,EAAAzM,OAAQ/D,GACR6iC,KACAL,sCArHK,SAAcr8B,MACdk3B,EAEG,OADRl3B,EAAEvC,kBACMuC,EAAE1B,SACD,SACD0B,EAAE3C,iBACFq/B,eAEC,WACD18B,EAAE3C,iBAEE85B,GAAQ,IACqB,IAAzBH,EAAc98B,OAAY,YACxBylC,EAAY3I,EAAciE,OAE5Br9B,IAAUk4B,GAAYl4B,EAAMm4B,KAAY4J,EAAU5J,GAAM,CACxD2G,WAGAO,GAAajG,EAAciE,eAKlC,YACDj7B,EAAE3C,iBAEE85B,GACAuE,GAAc,IAEdrxB,EAAA,EAAA8sB,IAAW,GACX9sB,EAAA,GAAA4vB,OAAcpgC,cAIjB,UACDmG,EAAE3C,iBAEE85B,GACAuE,IAAe,IAEfrxB,EAAA,EAAA8sB,IAAW,GACX9sB,EAAA,GAAA4vB,OAAcpgC,cAIjB,MACG,GAAAs9B,IAAYD,EAAO,CAEf,GAAyB,IAAzBF,EAAc98B,QACb0D,GAASA,EAAMm4B,KAAYiB,EAAciE,IAAgBlF,UAEnD2G,KAEX18B,EAAE3C,iBACF4/B,GAAajG,EAAciE,KAC3ByB,eAIH,YACI,IAAA5G,GAAYF,EAAW17B,OAAS,EAAC,OAElC,GAAA47B,GAAYl4B,GAASA,EAAM1D,OAAS,EAAC,CAEjC,GADJiiC,QAAqCtiC,IAAhBogC,EAA4BA,EAAcr8B,EAAM1D,OAAS,GAC1D,IAAhB+/B,QAAqCpgC,IAAhBogC,EAAyB,WAClDA,EAAcr8B,EAAM1D,OAAS+/B,EAAcA,EAAc,OAAIpgC,aAIhE,YACI,IAAA+D,IAAUk4B,GAAYF,EAAW17B,OAAS,EAAC,YAC5BL,IAAhBogC,EACA5vB,EAAA,GAAA4vB,EAAcr8B,EAAM1D,OAAS,GACtB0D,EAAM1D,OAAS+/B,GAA+B,IAAhBA,GACrC5vB,EAAA,GAAA4vB,GAAe,aAGlB,iBACIr8B,IAAUk4B,GAAYF,EAAW17B,OAAS,QAAqBL,IAAhBogC,EAAyB,OACzEA,IAAgBr8B,EAAM1D,OAAS,EAC/BmQ,EAAA,GAAA4vB,OAAcpgC,GACPogC,EAAcr8B,EAAM1D,OAAS,GACpCmQ,EAAA,GAAA4vB,GAAe,0BAyBvBb,EACA,OAAAxD,EAAW17B,OAAS,EAAUmQ,EAAA,EAAA8sB,IAAW,QAC7C9sB,EAAA,EAAA8sB,IAAYA,QAoFP,SAAmBp6B,GACnBo6B,IAAaD,IAAWgC,GAAcA,EAAUta,SAAS7hB,EAAMvB,SAAY8rB,IAAM1I,SAAS7hB,EAAMvB,SACjGghC,YAuDC,SAAa9f,EAAM9e,EAAOm4B,OAC3BD,EACG,OAAAl4B,GAASA,EAAMm4B,KAAYrZ,EAAKqZ,kDArjBd,IAClBiB,wKAsoB6B78B,GAAAgjC,GAAYhjC,GAChBA,GAAAgjC,GAAYhjC,UACIijC,GAAe,CAAG1gB,OAAMviB,8CAdzDmtB,GAAItJ,eA6EwD7jB,GAAAgiC,GAAqBhiC,MAZhDg/B,EAAyBgD,GAAqBhiC,GAAC,2CAmChF2E,EAAKkf,wBACJ4X,EAAUr4B,KAAAK,sDA3GnBs7B,EAASlb,47BC3oBjB,MAAa,WAAb3kB,KAAsBi/B,2PAOGj/B,EAAO,GAACuE,cAAcvE,EAAS,OAAAqE,EAAAkiC,EAAA,MAAAC,GAASniC,EAAAkiC,EAAA,MAAAE,EAAAzmC,KAAQg9B,eAA5E16B,EAAqFH,EAAAokC,EAAAhkC,6CAAzDvC,EAAO,GAACuE,cAAcvE,EAAS,oBAAS,EAAAM,GAAAmmC,KAAAA,EAAAzmC,KAAQg9B,0EANvE,MAAS,QAATh9B,KAAeg/B,+NAGUngC,EAAA0nC,EAAA1oC,IAAA2oC,EAAA,kBAAAxmC,KAAQuE,mBAAKF,EAAAkiC,EAAA,MAAAC,GAAkBniC,EAAAkiC,EAAA,MAAAE,EAAAzmC,KAAQg9B,eAAnE16B,EAA4EH,EAAAokC,EAAAhkC,WAAhD,EAAAjC,IAAAzB,EAAA0nC,EAAA1oC,IAAA2oC,EAAA,kBAAAxmC,KAAQuE,gCAAuB,EAAAjE,GAAAmmC,KAAAA,EAAAzmC,KAAQg9B,oFAFvCn+B,EAAA0nC,EAAA1oC,IAAA2oC,EAAA,kBAAAxmC,KAAQuE,yBAAKF,EAAAkiC,EAAA,MAAAC,GAAwBniC,EAAAkiC,EAAA,MAAAE,EAAAzmC,KAAQg9B,eAAzE16B,EAAkFH,EAAAokC,EAAAhkC,WAAtD,EAAAjC,IAAAzB,EAAA0nC,EAAA1oC,IAAA2oC,EAAA,kBAAAxmC,KAAQuE,sCAA6B,EAAAjE,GAAAmmC,KAAAA,EAAAzmC,KAAQg9B,4DAH1Eh9B,EAAS,IAAAilB,GAAAjlB,oEAATA,EAAS,gIAzBR6Q,EACA61B,WAJOjJ,GAAOjwB,mBACPm5B,GAAen5B,QAKpBsD,EAAqBlN,GAAQzE,WAAU4R,GAAGC,EAAA,EAAKH,EAAWE,KAC1DE,EAAoBnB,GAAO3Q,WAAU4R,GAAGC,EAAA,EAAK01B,EAAU31B,SAMzDiG,SALJhP,GAAS,KACP8I,IACAG,GAAiB,iIAIZJ,IACiB,QAAlBA,EAASmG,MACXhG,EAAA,EAAAgG,EAAQ,QACmB,SAAlBnG,EAASmG,MAClBhG,EAAA,EAAAgG,EAAQ,SACCrG,OAAOsG,WAAW,gCAAgCC,QAC3DlG,EAAA,EAAAgG,EAAQ,QAERhG,EAAA,EAAAgG,EAAQ,yBAGThG,EAAA,EAAA41B,EAAYF,EAAQ3uB,SAAS4uB,GAAiB3uB,UAAUylB,EAAQl5B,OAAOqiC,sICwClE,MAAAh5B,GAAA5N,KAAQ+P,KAAKC,WAAW,iBAAmB,iBAAe,wKAEzDzL,MAAAvE,KAAegZ,gNAAf,GAAA1Y,IAAAwkB,EAAAvgB,MAAAvE,KAAegZ,4fAWd,MAAApL,GAAA5N,KAAQ+P,KAAKC,WAAW,kBAAoB,kBAAgB,uFAa/DuT,EAAAvjB,MAAKg9B,MAAK,mCADYh9B,EAAI,0HAD7BsC,EAGMH,EAAAwL,EAAApL,0EAFmBvC,EAAI,+CAC1B2mB,GAAA,MAAArmB,IAAAijB,KAAAA,EAAAvjB,MAAKg9B,MAAK,KAAAz3B,EAAAshC,EAAAtjB,yHAIVA,EAAAvjB,MAAUg9B,MAAK,mCADOh9B,EAAS,+HADlCsC,EAGMH,EAAAwL,EAAApL,yEAFmBvC,EAAS,+CAC/B2mB,GAAA,KAAArmB,IAAAijB,KAAAA,EAAAvjB,MAAUg9B,MAAK,KAAAz3B,EAAAshC,EAAAtjB,qNAfP,wBAEJhf,MAAAvE,KAAeiZ,oBAKfjZ,EAAmB,oVALnB,GAAAM,IAAAwmC,EAAAviC,MAAAvE,KAAeiZ,6BAKfjZ,EAAmB,0RAX3BA,EAAW,GAACgY,UAAUhY,EAAY,IAAE+Y,YAA6C,cAA/B/Y,EAAc,GAACgZ,cAA4BiM,GAAAjlB,8KAA7FA,EAAW,GAACgY,UAAUhY,EAAY,IAAE+Y,YAA6C,cAA/B/Y,EAAc,GAACgZ,kRA7E9D,MAAAtI,EAAUC,OAAOD,SAAWC,OAAOC,WAUrCC,EACA61B,QAEE51B,EAAqBlN,GAAQzE,WAAU4R,GAAGC,EAAA,EAAKH,EAAWE,KAC1DE,EAAoBnB,GAAO3Q,WAAU4R,GAAGC,EAAA,EAAK01B,EAAU31B,KAC7D/I,GAAS,KACP8I,IACAG,GAAiB,QASfjD,mBANO24B,GAAen5B,EA+BtBu5B,EAAmB,+GA7BpBC,EAAcN,EAAQ3uB,SAAS4uB,kBAC/B31B,EAAA,EAAAi2B,EAAiBp2B,EAAS81B,sBAC1BO,EAAer2B,EAAS81B,GAAiB7uB,0BAGrCkvB,EAAYhvB,UAAUkvB,GAAchuB,eACzClL,EAAM,EACFzJ,MAAO,OAAQtB,KAAMyN,EAAQX,KAAKC,WAAW,SAAW,SACxDzL,MAAO,YAAatB,KAAMyN,EAAQX,KAAKC,WAAW,iBAAmB,kBACrEzL,MAAO,aAActB,KAAMyN,EAAQX,KAAKC,WAAW,oBAAsB,uBAG7Eg3B,EAAYhvB,UAAUkvB,GAAcnuB,YACpC7a,OAAO8P,OAAOg5B,EAAYhvB,WAAW0U,MAAK5U,GAAYA,EAASoB,kBAE/DlL,EAAM,EACFzJ,MAAO,OAAQtB,KAAMyN,EAAQX,KAAKC,WAAW,SAAW,SACxDzL,MAAO,aAActB,KAAMyN,EAAQX,KAAKC,WAAW,oBAAsB,uBAE1C,aAA/Bi3B,EAAejuB,mBACjBiuB,EAAejuB,aAAe,aAAYiuB,GAC1CrjC,GAAQwB,IAAIyL,UAGd7C,EAAM,EAAMzJ,MAAO,aAActB,KAAMyN,EAAQX,KAAKC,WAAW,oBAAsB,2BACrFi3B,EAAejuB,aAAe,aAAYiuB,GAC1CrjC,GAAQwB,IAAIyL,oBAIPm2B,EAAW,KAChBD,EAAmB,cACPI,EAAYC,KAAiBlpC,OAAOikB,QAAQ6kB,EAAYhvB,WAC9DovB,EAAaluB,YAAckuB,EAAahuB,cAC1C2tB,EAAoBlnC,KAAI,CACtB0E,MAAO4iC,EACPnK,MAAOoK,EAAankC,4BAWhB0D,IACRqK,EAAA,EAAAi2B,EAAejuB,aAAerS,EAAExE,OAAOyB,QAAQ+C,EAAExE,OAAOyB,QAAQwC,eAAe7B,MAAK0iC,GACpFrjC,GAAQwB,IAAIyL,EAAQ,EAaTlK,IACTqK,EAAA,EAAAi2B,EAAehuB,cAAgBtS,EAAEwB,OAAO5D,MAAK0iC,GAC7CrjC,GAAQwB,IAAIyL,EAAQ,gHCtFtB7Q,EAAW,qyBADjBsC,EAWCH,EAAAkM,EAAA9L,GAHCL,EAEEmM,EAAAC,8BATEtO,EAAW,6UCAXA,EAAW,6hBADjBsC,EAUCH,EAAAkM,EAAA9L,GAHEL,EAECmM,EAAAC,8BAREtO,EAAW,6jBCgHDA,EAAO,4FAkBPA,EAAW,wLAoChB,IAAAqnC,EAAArnC,KAASA,EAAgB,yBAA9Ba,OAAIC,GAAA,+DA4BD,IAAAkkB,EAAc,aAAdhlB,EAAc,IAA4B,aAAdA,MAAwBi/B,GAAAj/B,iOAlG3DsC,EAAMH,EAAAiO,EAAA7N,YAEND,EAqCMH,EAAAqO,EAAAjO,gEAiBND,EA2HMH,EAAAoO,EAAAhO,4IAnKQvC,EAAO,oFAkBPA,EAAW,+MAoChBqnC,EAAArnC,KAASA,EAAgB,YAA9Ba,OAAIC,GAAA,EAAA,2GAAJD,OAAIC,EAAA2P,EAAA5P,OAAAC,GAAA,YA4Ba,aAAdd,EAAc,IAA4B,aAAdA,4NA5B/Ba,OAAIC,GAAA,8SAnDHyiB,GAAAvjB,MAAQ+P,KAAKC,WAAW,kBAAoB,kBAAgB,kDAD7BhR,SAAS0jB,KAAKc,sNAmB7CD,GAAAvjB,MAAQ+P,KAAKC,WAAW,qBAAuB,sBAAoB,kDADhChR,SAAS0jB,KAAKc,0MAM5C,MAAA5V,GAAA5N,MAAQ+P,KAAKC,WAAW,6BAA+B,+BAA6B,4WAC5F1N,EAWSH,EAAA8N,EAAA1N,uaAKuB,IAAhBvC,EAAgB,aAAhBA,EAAgB,mPAM9BsC,EAESH,EAAA8N,EAAA1N,uCAFSvC,EAAW,0DANfA,EAAgB,sRAgBxBsC,EAAsCH,EAAAoM,EAAAhM,4CAGWvC,EAAS,GAACA,EAAQ,KAAEuE,MAAK,6CAAtDvE,EAAS,GAACA,EAAQ,KAAEsnC,eAAxChlC,EAAkFH,EAAAoM,EAAAhM,kCAAjCvC,EAAS,GAACA,EAAQ,KAAEuE,MAAK,KAAAgB,EAAA4B,EAAAyG,wBAAtD5N,EAAS,GAACA,EAAQ,KAAEsnC,oEALoBtnC,EAAQ,IAAA,GACjEunC,EAAAvnC,MAAiBA,EAAQ,iBAGzBA,EAAS,IAAIA,EAAS,GAACA,EAAQ,MAAA4+B,GAAA5+B,0KAJ3BA,EAAQ,kKADnBsC,EAQOH,EAAAoM,EAAAhM,GAPLL,EAA2EqM,EAAA7P,+DAQ7E4D,EAYSH,EAAA8N,EAAA1N,iFApBuDvC,EAAQ,IAAA,KAAAuF,EAAA2K,EAAAC,uBAA7DnQ,EAAQ,qBACZ,EAAAM,EAAA,KAAAinC,EAAAvnC,MAAiBA,EAAQ,sDAGzBA,EAAS,IAAIA,EAAS,GAACA,EAAQ,kWAkBxCsC,EAAMH,EAAAiO,EAAA7N,qPAID,OAAAvC,KAAUA,EAAgB,KAAKA,EAAU,GAAAA,MAA4B,SAAA,imBACjEwnC,EAAAtpC,OAAOikB,QAAQniB,KAAQynC,+BAA5B5mC,OAAIC,GAAA,wNAAC0mC,EAAAtpC,OAAOikB,QAAQniB,KAAQynC,kBAA5B5mC,OAAIC,GAAA,EAAA,sHAAJD,OAAIC,EAAA2P,EAAA5P,OAAAC,GAAA,0CAAJD,OAAIC,GAAA,gJA4EM,qcAvDDd,EAAS,GAACA,EAAgB,IAAEA,EAAW,0BAA5Ca,OAAIC,GAAA,mOADNwB,EAAMH,EAAAiO,EAAA7N,2KACCvC,EAAS,GAACA,EAAgB,IAAEA,EAAW,aAA5Ca,OAAIC,GAAA,EAAA,sHAAJD,OAAIC,EAAA2P,EAAA5P,OAAAC,GAAA,kFAAJD,OAAIC,GAAA,mNAjBI,MAAA8M,EAAA5N,MAAQiD,KAAI,8CAAZ,EAAA3C,EAAA,IAAAsN,KAAAA,EAAA5N,MAAQiD,KAAI,KAAAsC,EAAA4B,EAAAyG,mWACpBtL,EAaSH,EAAA8N,EAAA1N,2gBAQHD,EAOIH,EAAAzD,EAAA6D,kHAGJD,EAAsCH,EAAAoM,EAAAhM,4CAGWvC,EAAS,GAACA,EAAQ,KAAEuE,MAAK,6CAAtDvE,EAAS,GAACA,EAAQ,KAAEsnC,eAAxChlC,EAAkFH,EAAAoM,EAAAhM,kCAAjCvC,EAAS,GAACA,EAAQ,KAAEuE,MAAK,KAAAgB,EAAA4B,EAAAyG,wBAAtD5N,EAAS,GAACA,EAAQ,KAAEsnC,sNAiB1ChlC,EAYSH,EAAA8N,EAAA1N,0VAzBTD,EAWSH,EAAA8N,EAAA1N,6MA9BqDvC,EAAQ,IAAA,GACjE0nC,EAAA1nC,EAAU,GAAA2nC,WAAWl2B,SAASzR,EAAQ,KAUtC4nC,EAAA5nC,EAAS,GAAAA,EAAkB,IAAAyR,SAASzR,EAAQ,2BAG5CA,EAAS,IAAIA,EAAS,GAACA,EAAQ,MAAA6nC,GAAA7nC,iEAIhC,MAAAunC,IAAAA,GAAAvnC,EAAS,GAAAA,EAAkB,IAAAyR,SAASzR,EAAQ,8JAlBvCA,EAAQ,kGADnBsC,EAkBOH,EAAAoM,EAAAhM,GAjBLL,EAA2EqM,EAAA7P,6IAAbsB,EAAQ,IAAA,KAAAuF,EAAA2K,EAAAC,wBAA7DnQ,EAAQ,qBACZ,GAAAM,EAAA,KAAAonC,EAAA1nC,EAAU,GAAA2nC,WAAWl2B,SAASzR,EAAQ,sDAUtC,GAAAM,EAAA,KAAAsnC,EAAA5nC,EAAS,GAAAA,EAAkB,IAAAyR,SAASzR,EAAQ,sDAG5CA,EAAS,IAAIA,EAAS,GAACA,EAAQ,6dAiCxCsC,EAAMH,EAAAiO,EAAA7N,6MAtELyiB,EAAAhlB,KAAUA,EAAgB,KAAKA,EAAS,GAACA,EAAkB,IAAAA,EAAgB,MAAAA,KAAUA,EAAgB,IAAEA,EAAa,KAAAa,OAAS,GAACk+B,GAAA/+B,uEAA9HA,KAAUA,EAAgB,KAAKA,EAAS,GAACA,EAAkB,IAAAA,EAAgB,MAAAA,KAAUA,EAAgB,IAAEA,EAAa,KAAAa,OAAS,8MAtGvIb,EAAW,IAACgY,UAAUhY,MAAkBoZ,cAAgBpZ,EAAS,IAAIA,EAAS,IAAAilB,GAAAjlB,uEAA9EA,EAAW,IAACgY,UAAUhY,MAAkBoZ,cAAgBpZ,EAAS,IAAIA,EAAS,iNA/F3E,MAAA0Q,EAAUC,OAAOD,SAAWC,OAAOC,WAiBrCC,EACA61B,mBAJOC,GAAen5B,oBACfs6B,GAAgBt6B,QAKrBsD,EAAqBlN,GAAQzE,WAAU4R,GAAGC,EAAA,EAAKH,EAAWE,KAC1DE,EAAoBnB,GAAO3Q,WAAU4R,GAAGC,EAAA,EAAK01B,EAAU31B,SAMzDg3B,EACAC,EANJhgC,GAAS,KACP8I,IACAG,GAAiB,QAmBfmE,EAsCA6yB,EAjDAC,EAAY,YAkDPC,IACD,MAAAn8B,EAAWyH,GAAMI,aAAiB,IAAAyP,IAAI2kB,IACvCp3B,EAASi3B,GAAkBr2B,SAASzF,KACvC6E,EAASi3B,GAAkBjoC,KAAKmM,GAChCgF,EAAA,EAAAi3B,EAAmB,IACnBrkC,GAAQwB,IAAIyL,IAZhB/I,GAAOoK,UACLlB,EAAA,EAAA+2B,QAAkBt0B,GAAMkB,aAAa9D,IACrCG,EAAA,EAAAg3B,QAAkBv0B,GAAMY,QAAQxD,QAChCuE,QAAkB3B,GAAM0B,eAAY,IAalC,IAAAizB,GAAc,EACdC,GAAU,oKA9DXrB,EAAcN,EAAQ3uB,SAAS4uB,2BAKhCuB,EAAY,IACRr3B,EAASi3B,IAAmBI,EAAaroC,QAAQgR,EAASi3B,IAC1DE,GAAaA,EAAUF,IACzBI,EAAaroC,QAAQmoC,EAAUF,GAA4B,cAE7DI,EAAY,IAAA,IAAWrmC,IAAIqmC,wBAKvB9yB,GAAW1E,EAAQuE,QAAQxK,MAAMrF,IAAG,CAAGgQ,wCAGpC,SAAiBpJ,GACpB,GAAAg8B,EAAUF,aACDQ,KAAWN,EAAUF,MAC1BE,EAAUF,GAAkBQ,GAAS72B,SAASzF,GAAQ,OAAU,SAGjE,iBA+CHgF,EAAA,EAAAq3B,GAAU,OACVjzB,EAAS,CAAA,SACHpM,QAAQu/B,WACZL,EAAaz8B,mBACX2J,EAAUpJ,GAAc,CAAAs7B,MAAO,YAAa/iC,MAAO,cAAY6Q,GACzD,MAAAlC,QAAaO,GAAMR,KAAKjH,GAC9BgF,EAAA,EAAAoE,EAAUpJ,GAlDX,SAAUkH,OACb3O,EACA+iC,EAaK,OAZLp0B,EAAO,KACT3O,KAAW2O,MACPA,GAAQ,IAAMo0B,EAAQ,QACjBp0B,GAAQ,MAAMo0B,EAAQ,WACtBp0B,GAAQ,KACjBo0B,EAAQ,MACI,KAARp0B,IAAc3O,EAAQ,WACtB2O,EAAO,MAAM3O,EAAkB,WAAA2O,EAAO,QAE1Co0B,EAAQ,MACR/iC,EAAQ,oBAED,CAAA+iC,QAAO/iC,SAmCcikC,CAAUt1B,GAAIkC,EAAA,KAGxCpE,EAAA,EAAAq3B,GAAU,EAAK,YASfr3B,EAAA,EAAAo3B,GAAc,GACR,MAAA90B,EAAW00B,EAAUF,GAA4B,mBAC5C97B,KAAY6E,EAASi3B,GAAgB,CACxC,MAAAhnC,EAAIwS,EAASjO,QAAQ2G,GACvBlL,GAAK,GAAGwS,EAAShG,OAAOxM,EAAG,GAE3B,MAAAkL,QAAiByH,GAAM2D,iBAAiB9D,GAC9CzC,EAASi3B,GAAkBjoC,KAAKmM,GAChCpI,GAAQwB,IAAIyL,GACZG,EAAA,EAAAo3B,GAAc,EAAK,OAafv3B,EAASi3B,KACX92B,EAAA,EAAAH,EAASi3B,GAAgB,GAAAj3B,GACzBjN,GAAQwB,IAAIyL,iBAYFo3B,EAAgB1jC,UAIhBoC,GAAe,UAAVA,EAAE1B,KAAmBkjC,QAsB5B,MAAAh9B,EAAQ0F,EAASi3B,GAAkBziC,QAAQ2G,GAC7Cb,GAAS,IACX0F,EAASi3B,GAAkBx6B,OAAOnC,EAAO,GACzCvH,GAAQwB,IAAIyL,SAmBJ,GAAAA,EAASi3B,GAAgB,CAChB,IAAA,MAAA97B,KAAYg8B,EAAUF,GAAkBW,GAC5C53B,EAASi3B,GAAkBr2B,SAASzF,IAAW6E,EAASi3B,GAAkBjoC,KAAKmM,GAEtFpI,GAAQwB,IAAIyL,SAoCNA,EAASi3B,KACXj3B,EAASi3B,GAAkBjoC,KAAKmM,GAChCpI,GAAQwB,IAAIyL,SAWR,MAAA1F,EAAQ0F,EAASi3B,GAAkBziC,QAAQ2G,GAC7Cb,GAAS,IACX0F,EAASi3B,GAAkBx6B,OAAOnC,EAAO,GACzCvH,GAAQwB,IAAIyL,+JCtO7B,MAAa,WAAb7Q,KAAsBi/B,2PAOGj/B,EAAO,GAACuE,cAAcvE,EAAS,OAAAqE,EAAAkiC,EAAA,MAAAC,GAASniC,EAAAkiC,EAAA,MAAAE,EAAAzmC,KAAQg9B,eAA5E16B,EAAqFH,EAAAokC,EAAAhkC,6CAAzDvC,EAAO,GAACuE,cAAcvE,EAAS,oBAAS,EAAAM,GAAAmmC,KAAAA,EAAAzmC,KAAQg9B,0EANvE,MAAS,QAATh9B,KAAeg/B,+NAGUngC,EAAA0nC,EAAA1oC,IAAA2oC,EAAA,kBAAAxmC,KAAQuE,mBAAKF,EAAAkiC,EAAA,MAAAC,GAAkBniC,EAAAkiC,EAAA,MAAAE,EAAAzmC,KAAQg9B,eAAnE16B,EAA4EH,EAAAokC,EAAAhkC,WAAhD,EAAAjC,IAAAzB,EAAA0nC,EAAA1oC,IAAA2oC,EAAA,kBAAAxmC,KAAQuE,gCAAuB,EAAAjE,GAAAmmC,KAAAA,EAAAzmC,KAAQg9B,oFAFvCn+B,EAAA0nC,EAAA1oC,IAAA2oC,EAAA,kBAAAxmC,KAAQuE,yBAAKF,EAAAkiC,EAAA,MAAAC,GAAwBniC,EAAAkiC,EAAA,MAAAE,EAAAzmC,KAAQg9B,eAAzE16B,EAAkFH,EAAAokC,EAAAhkC,WAAtD,EAAAjC,IAAAzB,EAAA0nC,EAAA1oC,IAAA2oC,EAAA,kBAAAxmC,KAAQuE,sCAA6B,EAAAjE,GAAAmmC,KAAAA,EAAAzmC,KAAQg9B,4DAH1Eh9B,EAAS,IAAAilB,GAAAjlB,oEAATA,EAAS,gIAzBR6Q,EACA61B,WAHOjJ,GAAOjwB,QAKZsD,EAAqBlN,GAAQzE,WAAU4R,GAAGC,EAAA,EAAKH,EAAWE,KAC1DE,EAAoBnB,GAAO3Q,WAAU4R,GAAGC,EAAA,EAAK01B,EAAU31B,SAMzDiG,SALJhP,GAAS,KACP8I,IACAG,GAAiB,gFAIZJ,IACiB,QAAlBA,EAASmG,MACXhG,EAAA,EAAAgG,EAAQ,QACmB,SAAlBnG,EAASmG,MAClBhG,EAAA,EAAAgG,EAAQ,SACCrG,OAAOsG,WAAW,gCAAgCC,QAC3DlG,EAAA,EAAAgG,EAAQ,QAERhG,EAAA,EAAAgG,EAAQ,yBAGXhG,EAAA,EAAE41B,EAAYF,EAAQ3uB,SAAS0lB,EAAQl5B,OAAOqiC,4HCaxCh5B,GAAA5N,KAAQ+P,KAAKC,WAAW,YAAc,WAAS,8BADzC3L,EAAA3F,EAAA,OAAAgqC,EAAA1oC,KAAYjB,wGAArBuD,EAEIH,EAAAzD,EAAA6D,kBAFK,EAAAjC,EAAA,IAAAooC,KAAAA,EAAA1oC,KAAYjB,mEA0BhBwkB,EAAAvjB,MAAKg9B,MAAK,mCADWh9B,EAAI,oEADhB,UAAYA,EAAS,GAAAA,MAAKuE,OAAOuU,SAAW,wCAAxDxW,EAGMH,EAAAwL,EAAApL,yEAFkBvC,EAAI,iBACzB2mB,GAAA,EAAArmB,EAAA,KAAAijB,KAAAA,EAAAvjB,MAAKg9B,MAAK,KAAAz3B,EAAAshC,EAAAtjB,8BAFD,UAAYvjB,EAAS,GAAAA,MAAKuE,OAAOuU,SAAW,sIAanD,MAAAlL,GAAA5N,KAAQ+P,KAAKC,WAAW,kBAAoB,kBAAgB,6FAF5DuT,EAAAvjB,MAAUg9B,MAAK,mCADMh9B,EAAS,mIAATA,EAAS,iBAC9B2mB,GAAA,WAAArmB,EAAA,KAAAijB,KAAAA,EAAAvjB,MAAUg9B,MAAK,KAAAz3B,EAAAshC,EAAAtjB,+KAFZvjB,EAAoB,KAAA,mEAJnB,UAAYA,EAAQ,GAACA,EAAS,IAACuE,OAAOuU,UAAY9Y,EAAoB,IAAI,6CADnFsC,EAWMH,EAAAwL,EAAApL,qMAVG,UAAYvC,EAAQ,GAACA,EAAS,IAACuE,OAAOuU,UAAY9Y,EAAoB,IAAI,uNAWnFsC,EAA0DH,EAAAwL,EAAApL,sJAlC/C,8BAEJvC,EAAe,kBAWjBw8B,MAAA,IAAAx8B,KAAgByL,IAAGk9B,oXAf5BrmC,EAsCMH,EAAAwL,EAAApL,6DAtCoE,iHAI/DvC,EAAe,IAWjB,IAAAM,EAAA,KAAAwmC,EAAAtK,MAAA,IAAAx8B,KAAgByL,IAAGk9B,8OA6BpB,MAAA/6B,GAAA5N,KAAQ+P,KAAKC,WAAW,WAAa,UAAQ,wKAE1C6U,QAAA7kB,KAAe8Y,+LAAf,EAAAxY,EAAA,KAAAykB,EAAAF,QAAA7kB,KAAe8Y,wMASlB,MAAAlL,GAAA5N,KAAQ+P,KAAKC,WAAW,gBAAkB,iBAAe,wKAEtD6U,QAAA7kB,EAAS,GAAAwhB,cAAc/P,SAASzR,EAAe,2LAA/C,EAAAM,EAAA,KAAAykB,EAAAF,QAAA7kB,EAAS,GAAAwhB,cAAc/P,SAASzR,EAAe,4MAiBnD4N,GAAA5N,KAAQ+P,KAAKC,WAAW,aAAe,YAAU,yCAD3ChQ,EAAe,uGAAxBsC,EAEIH,EAAAzD,EAAA6D,uCAFKvC,EAAe,iDA4BnBujB,EAAAvjB,MAAKg9B,MAAK,mCADYh9B,EAAI,0HAD7BsC,EAGMH,EAAAwL,EAAApL,yEAFmBvC,EAAI,kDAC1B2mB,GAAA,EAAArmB,EAAA,KAAAijB,KAAAA,EAAAvjB,MAAKg9B,MAAK,KAAAz3B,EAAAshC,EAAAtjB,2GAOR,MAAA3V,GAAA5N,KAAQ+P,KAAKC,WAAW,oBAAsB,mBAAiB,6FAF/DuT,EAAAvjB,MAAUg9B,MAAK,mCADOh9B,EAAS,wJAATA,EAAS,kDAC/B2mB,GAAA,WAAArmB,EAAA,KAAAijB,KAAAA,EAAAvjB,MAAUg9B,MAAK,KAAAz3B,EAAAshC,EAAAtjB,6KAFZvjB,EAAqB,KAAA,yGAD7BsC,EAOMH,EAAAwL,EAAApL,iWACND,EAA0DH,EAAAwL,EAAApL,sJAhC/C,kCAGJgC,MAAAvE,KAAe8X,wBAWjB0kB,MAAA,IAAAx8B,KAAgByL,IAAGm9B,oXAhB5BtmC,EAoCMH,EAAAwL,EAAApL,6DApCqE,kGAKhE,EAAAjC,EAAA,KAAAwmC,EAAAviC,MAAAvE,KAAe8X,UAWjB,GAAAxX,EAAA,KAAAwmC,EAAAtK,MAAA,IAAAx8B,KAAgByL,IAAGm9B,8OA0BpB,MAAAh7B,GAAA5N,KAAQ+P,KAAKC,WAAW,+BAAiC,+BAA6B,wKAErFzL,MAAAvE,KAAemZ,wCAMlB5U,MAAO,SAAUtB,KAAMjD,EAAQ,GAAA+P,KAAKC,WAAW,WAAa,WAC5DzL,MAAO,QAAStB,KAAMjD,EAAQ,GAAA+P,KAAKC,WAAW,UAAY,kLAPvD,EAAA1P,EAAA,KAAAwkB,EAAAvgB,MAAAvE,KAAemZ,gNAcd,MAAAvL,GAAA5N,KAAQ+P,KAAKC,WAAW,4BAA8B,8BAA4B,wKAE/E6U,QAAA7kB,KAAe6Y,+MAAf,EAAAvY,EAAA,KAAAykB,EAAAF,QAAA7kB,KAAe6Y,qtBAWlB,MAAAjL,GAAA5N,KAAQ+P,KAAKC,WAAW,mBAAqB,mBAAiB,wKAE3D6U,QAAA7kB,KAAemY,sMAAf,EAAA7X,EAAA,KAAAykB,EAAAF,QAAA7kB,KAAemY,uNASjB0wB,GAAA7oC,EAAQ,GAAA+P,KAAKC,WAAW,eAAY,28BAcrC,MAAApC,GAAA5N,KAAQ+P,KAAKC,WAAW,iBAAmB,qBAAmB,wKAE3D6U,QAAA7kB,KAAeqY,oMAAf,EAAA/X,EAAA,KAAAykB,EAAAF,QAAA7kB,KAAeqY,kpBA7BzB,IAAA2lB,EAAmB,UAAnBh+B,MAA2Bi/B,GAAAj/B,GAyB3B8oC,EAAmB,WAAnB9oC,MAA4BilB,GAAAjlB,gDAeZ8nC,iBAAA9nC,EAAY,GAAAgY,UAAUhY,EAAe,GAAA8X,UAAUiB,YACnC,cAA/B/Y,EAAe,GAAAgZ,aAEXhZ,KAAeiZ,cADfjZ,KAAe8X,6UAvDT9X,EAAQ,GAAC6Y,yBAA2B,uEA/DrC7Y,EAAc,GAAC8Y,SAAW,gEA7EzCxW,EAyMMH,EAAAk9B,EAAA98B,uBAzJJL,EAAMm9B,EAAAjvB,kDA6BNlO,EA2HMm9B,EAAA9uB,+DA5DJrO,EAWMqO,EAAAC,+jBAXMxQ,EAAQ,GAAC6Y,yBAA2B,yEAaxB,UAAnB7Y,2GAyBmB,WAAnBA,uJAegB,GAAAM,EAAA,KAAAyoC,EAAAjB,iBAAA9nC,EAAY,GAAAgY,UAAUhY,EAAe,GAAA8X,UAAUiB,YACnC,cAA/B/Y,EAAe,GAAAgZ,aAEXhZ,KAAeiZ,cADfjZ,KAAe8X,yCAtHV9X,EAAc,GAAC8Y,SAAW,4jBAvDN,MAAA6vB,GAAA,EAAAK,EAAYnxB,MAC1B,CAAAtT,MAAOykC,EAAYhM,MAAOnlB,EAAQ5U,YA6ElBkkC,EAAYrvB,MAAQ,CAC3CvT,MAAO4iC,EACPnK,MAAOllB,EAAS7U,iEAxItB,MAAAyN,EAAUC,OAAOD,SAAWC,OAAOC,WAerCC,EACA61B,QAEE51B,EAAqBlN,GAAQzE,WAAU4R,GAAGC,EAAA,EAAKH,EAAWE,KAC1DE,EAAoBnB,GAAO3Q,WAAU4R,GAAGC,EAAA,GAAK01B,EAAU31B,KAC7D/I,GAAS,KACP8I,IACAG,GAAiB,IAEf,IAAA01B,EAAkBsC,EAAK5tB,KAAK/D,WAAW,cAAgB2xB,EAAK5tB,KAAK9E,MAAM,KAAK,GAAK,UACjF2yB,GAAuB,EACvBC,GAAwB,kDACzBnC,EAAcN,EAAQ3uB,SAAS4uB,qBAC/B31B,EAAA,EAAAi2B,EAAiBp2B,EAAS81B,sBAC5B31B,EAAA,EAAEo4B,EAAkBpC,EAAYhvB,UAAUivB,EAAenvB,UAAU/Y,yBACnEiS,EAAA,EAAEq4B,EAAkBnrC,OAAOikB,QAAQukB,EAAQ3uB,4BAC3C/G,EAAA,EAAEs4B,EAAkBprC,OAAOikB,QAAQ6kB,EAAYhvB,oCAgB/BrR,IACTqK,EAAA,EAAA21B,EAAkBhgC,EAAEwB,OAAO5D,OAC3BoM,OAAOgV,SAAStK,iBAAmB1U,EAAEwB,OAAO5D,QAC5CyM,EAAA,EAAAk4B,GAAuB,EAAK,EAET,IAAAl4B,EAAA,EAAAk4B,GAAuB,GAC3B,IAAAl4B,EAAA,EAAAk4B,GAAuB,GACxB,IAAAl4B,EAAA,EAAAk4B,GAAuB,GAbX,IAAAl4B,EAAA,EAAAk4B,GAAuB,GA+C3CviC,IACRqK,EAAA,EAAAi2B,EAAenuB,QAAUnS,EAAExE,OAAO0iB,QAAOoiB,GACzCrjC,GAAQwB,IAAIyL,EAAQ,EASZlK,OACJA,EAAExE,OAAO0iB,UAAYhU,EAAS2Q,cAAc/P,SAASk1B,GACvD91B,EAAS2Q,cAAc3hB,KAAK8mC,QACnB,GAAA91B,EAAS2Q,cAAc/P,SAASk1B,GAAe,CAClD,MAAAx7B,EAAQ0F,EAAS2Q,cAAcnc,QAAQshC,IAC9B,IAAXx7B,GAAc0F,EAAS2Q,cAAclU,OAAOnC,EAAO,GAEzDvH,GAAQwB,IAAIyL,EAAQ,EAmBPlK,IACTqK,EAAA,EAAAi2B,EAAenvB,SAAWnR,EAAEwB,OAAO5D,MAAK0iC,GACxCrjC,GAAQwB,IAAIyL,GACZG,EAAA,EAAAm4B,GAAwB,EAAK,EAEV,IAAAn4B,EAAA,EAAAk4B,GAAuB,GAC3B,IAAAl4B,EAAA,EAAAm4B,GAAwB,GACzB,IAAAn4B,EAAA,EAAAm4B,GAAwB,GAdZ,IAAAn4B,EAAA,EAAAm4B,GAAwB,GA6C5CxiC,IACRqK,EAAA,EAAAi2B,EAAe9tB,gBAAkBxS,EAAExE,OAAOyB,QAAQ+C,EAAExE,OAAOyB,QAAQwC,eAAe7B,MAAK0iC,GACvFrjC,GAAQwB,IAAIyL,EAAQ,EAcVlK,IACRqK,EAAA,EAAAi2B,EAAepuB,wBAA0BlS,EAAExE,OAAO0iB,QAAOoiB,GACzDrjC,GAAQwB,IAAIyL,EAAQ,EAWZlK,IACRqK,EAAA,EAAAi2B,EAAe9uB,eAAiBxR,EAAExE,OAAO0iB,QAAOoiB,GAChDrjC,GAAQwB,IAAIyL,EAAQ,EAuBZlK,IACRqK,EAAA,EAAAi2B,EAAe5uB,aAAe1R,EAAExE,OAAO0iB,QAAOoiB,GAC9CrjC,GAAQwB,IAAIyL,EAAQ,8JCpK9BvO,EAAiBH,EAAAd,EAAAkB,kHAPT,qBAAAvC,KAAKqb,MAAqB,YAAbrb,EAAK,GAAAqb,MAEd,MAAAksB,IAAAA,IAAAvnC,EAAK,GAAAqb,KAAK/D,WAAW,sBAFW,4C1CmG9C,IAAuB/S,2DACH,OADGA,E0CrGTvE,EAAG,I1CsGU,GAAKuE,G0CtGf,6DAAfjC,EAOMH,EAAAwL,EAAApL,uuBARH,OAAAvC,MAAYA,EAAO,GAAA,+VA7ChB,MAAA0Q,EAAUC,OAAOD,SAAWC,OAAOC,WAYrCC,EACE,MAAAC,EAAqBlN,GAAQzE,WAAU4R,IACvCA,IACFC,EAAA,EAAAH,EAAWE,GACXL,EAAQuE,QAAQxK,MAAMrF,IAAG,CAAGxB,QAASmN,YAIrC21B,QACEz1B,EAAoBnB,GAAO3Q,WAAU4R,GAAGC,EAAA,EAAK01B,EAAU31B,SAiBzD7L,EAfJ8C,GAAS,KACP8I,IACAG,GAAiB,IAGnBnJ,GAAOoK,cACDq3B,QAAa91B,GAAMuB,aAClBu0B,UACG9nB,GAAeG,eACrB2nB,QAAa91B,GAAMuB,cAErBpR,GAAQwB,IAAImkC,GACZz5B,GAAO1K,UAAUqO,GAAMmB,YAAS,IAM5B,MAAA4O,GAAO,KAAM,KAAM,KAAM,KAAM,MAAM/R,SAASf,EAAQX,KAAKy5B,iBAAmB,MAAQ,aAC5FxqC,SAAS0jB,KAAKc,IAAMA,iCAHb3S,GAAQG,EAAA,EAAE9L,EAAQuO,GAAMvO,MAAM2L,EAAUF,sBCtC5C,MAAC84B,GAAM,oEAAQ,CAClBtnC,OAAQnD,SAAS0jB","x_google_ignoreList":[0,7,24,25,26,27,28,29,30,31,32,33,34]} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/index.html b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/options/index.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset='utf-8'> + <meta name='viewport' content='width=device-width,initial-scale=1'> + <link rel="icon" type="image/x-icon" href="../../../assets/images/libredirect.svg"> + <title>Settings</title> + <link rel='stylesheet' href='build/bundle.css'> + <link rel='stylesheet' href='../fonts/styles.css'> + <script defer src='build/bundle.js'></script> +</head> + +<body> +</body> + +</html> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.css b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.css @@ -0,0 +1,6 @@ +div.svelte-j9pcac{justify-content:space-between;display:flex;align-items:center;margin:10px 0} +span.svelte-1auan3b{font-size:18px}span.svelte-1auan3b a{color:var(--text);text-decoration:none}span.svelte-1auan3b a:hover{text-decoration:underline} +input[type="checkbox"].svelte-1i76whx{appearance:none;-moz-appearance:none;-webkit-appearance:none;width:46px;height:24px;background-color:var(--light-grey);border-radius:50px;transition:0.4s;cursor:pointer}input[type="checkbox"].svelte-1i76whx:checked{background-color:var(--active)}input[type="checkbox"].svelte-1i76whx::before{content:"";display:inline-block;width:18px;height:18px;box-sizing:border-box;position:relative;top:3px;left:3.5px;background-color:white;border-radius:50%;transition:0.3s}input[type="checkbox"].svelte-1i76whx:checked::before{left:24px}input[type="checkbox"].rtl.svelte-1i76whx::before{left:auto;right:3.5px}input[type="checkbox"].rtl.svelte-1i76whx:checked::before{left:auto;right:24px} +div.svelte-q238x3{display:flex;align-items:center}.margin{margin-right:5px;margin-left:0}.margin_rtl{margin-right:0;margin-left:5px} +.interactive{transition:0.1s}.interactive:hover{color:var(--active);cursor:pointer}.interactive:active{transform:translateY(1px)}.disabled{cursor:not-allowed;opacity:0.5}.disabled:hover{color:var(--text);cursor:not-allowed}.disabled:active{transform:none}img, svg{margin-right:5px;margin-left:0;height:26px;width:26px;color:var(--text)}.rtl img, .rtl svg{margin-right:0;margin-left:5px}.margin{margin-right:5px;margin-left:0}.margin_rtl{margin-right:0;margin-left:5px} +html, body{min-width:260px;height:min-content;min-height:auto;margin:0;padding:0;box-sizing:border-box}body{margin-top:-20px}div.svelte-7wrfnp{font-weight:bold;height:100%;margin:0;padding:10px;padding-top:20px;font-family:"Inter", sans-serif;font-size:16px;background-color:var(--bg-main);color:var(--text)} diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.js b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.js @@ -0,0 +1,2 @@ +var app=function(){"use strict";function e(){}function t(e,t){for(const n in t)e[n]=t[n];return e}function n(e){return e()}function r(){return Object.create(null)}function s(e){e.forEach(n)}function a(e){return"function"==typeof e}function c(e,t){return e!=e?t==t:e!==t||e&&"object"==typeof e||"function"==typeof e}let o;function i(e,t){return o||(o=document.createElement("a")),o.href=t,e===o.href}function l(e,t,n,r){if(e){const s=u(e,t,n,r);return e[0](s)}}function u(e,n,r,s){return e[1]&&s?t(r.ctx.slice(),e[1](s(n))):r.ctx}function h(e,t,n,r){if(e[2]&&r){const s=e[2](r(n));if(void 0===t.dirty)return s;if("object"==typeof s){const e=[],n=Math.max(t.dirty.length,s.length);for(let r=0;r<n;r+=1)e[r]=t.dirty[r]|s[r];return e}return t.dirty|s}return t.dirty}function p(e,t,n,r,s,a){if(s){const c=u(t,n,r,a);e.p(c,s)}}function $(e){if(e.ctx.length>32){const t=[],n=e.ctx.length/32;for(let e=0;e<n;e++)t[e]=-1;return t}return-1}function m(e){const t={};for(const n in e)"$"!==n[0]&&(t[n]=e[n]);return t}function d(e,t){const n={};t=new Set(t);for(const r in e)t.has(r)||"$"===r[0]||(n[r]=e[r]);return n}function f(e,t){e.appendChild(t)}function g(e,t,n){e.insertBefore(t,n||null)}function w(e){e.parentNode&&e.parentNode.removeChild(e)}function b(e){return document.createElement(e)}function v(e){return document.createElementNS("http://www.w3.org/2000/svg",e)}function x(e){return document.createTextNode(e)}function y(){return x(" ")}function k(){return x("")}function P(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}function I(e,t,n){null==n?e.removeAttribute(t):e.getAttribute(t)!==n&&e.setAttribute(t,n)}const _=["width","height"];function C(e,t){const n=Object.getOwnPropertyDescriptors(e.__proto__);for(const r in t)null==t[r]?e.removeAttribute(r):"style"===r?e.style.cssText=t[r]:"__value"===r?e.value=e[r]=t[r]:n[r]&&n[r].set&&-1===_.indexOf(r)?e[r]=t[r]:I(e,r,t[r])}function q(e,t){for(const n in t)I(e,n,t[n])}function W(e,t,n){e.classList[n?"add":"remove"](t)}let M;function R(e){M=e}function L(){if(!M)throw new Error("Function called outside component initialization");return M}function T(e){L().$$.on_destroy.push(e)}function O(e,t){const n=e.$$.callbacks[t.type];n&&n.slice().forEach((e=>e.call(this,t)))}const S=[],z=[];let A=[];const E=[],U=Promise.resolve();let N=!1;function j(e){A.push(e)}const B=new Set;let D=0;function H(){if(0!==D)return;const e=M;do{try{for(;D<S.length;){const e=S[D];D++,R(e),Z(e.$$)}}catch(e){throw S.length=0,D=0,e}for(R(null),S.length=0,D=0;z.length;)z.pop()();for(let e=0;e<A.length;e+=1){const t=A[e];B.has(t)||(B.add(t),t())}A.length=0}while(S.length);for(;E.length;)E.pop()();N=!1,B.clear(),R(e)}function Z(e){if(null!==e.fragment){e.update(),s(e.before_update);const t=e.dirty;e.dirty=[-1],e.fragment&&e.fragment.p(e.ctx,t),e.after_update.forEach(j)}}const Q=new Set;let G;function Y(){G={r:0,c:[],p:G}}function V(){G.r||s(G.c),G=G.p}function F(e,t){e&&e.i&&(Q.delete(e),e.i(t))}function K(e,t,n,r){if(e&&e.o){if(Q.has(e))return;Q.add(e),G.c.push((()=>{Q.delete(e),r&&(n&&e.d(1),r())})),e.o(t)}else r&&r()}function X(e,t){const n={},r={},s={$$scope:1};let a=e.length;for(;a--;){const c=e[a],o=t[a];if(o){for(const e in c)e in o||(r[e]=1);for(const e in o)s[e]||(n[e]=o[e],s[e]=1);e[a]=o}else for(const e in c)s[e]=1}for(const e in r)e in n||(n[e]=void 0);return n}function J(e){e&&e.c()}function ee(e,t,r,c){const{fragment:o,after_update:i}=e.$$;o&&o.m(t,r),c||j((()=>{const t=e.$$.on_mount.map(n).filter(a);e.$$.on_destroy?e.$$.on_destroy.push(...t):s(t),e.$$.on_mount=[]})),i.forEach(j)}function te(e,t){const n=e.$$;null!==n.fragment&&(!function(e){const t=[],n=[];A.forEach((r=>-1===e.indexOf(r)?t.push(r):n.push(r))),n.forEach((e=>e())),A=t}(n.after_update),s(n.on_destroy),n.fragment&&n.fragment.d(t),n.on_destroy=n.fragment=null,n.ctx=[])}function ne(e,t){-1===e.$$.dirty[0]&&(S.push(e),N||(N=!0,U.then(H)),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<<t%31}function re(t,n,a,c,o,i,l,u=[-1]){const h=M;R(t);const p=t.$$={fragment:null,ctx:[],props:i,update:e,not_equal:o,bound:r(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(n.context||(h?h.$$.context:[])),callbacks:r(),dirty:u,skip_bound:!1,root:n.target||h.$$.root};l&&l(p.root);let $=!1;if(p.ctx=a?a(t,n.props||{},((e,n,...r)=>{const s=r.length?r[0]:n;return p.ctx&&o(p.ctx[e],p.ctx[e]=s)&&(!p.skip_bound&&p.bound[e]&&p.bound[e](s),$&&ne(t,e)),n})):[],p.update(),$=!0,s(p.before_update),p.fragment=!!c&&c(p.ctx),n.target){if(n.hydrate){const e=function(e){return Array.from(e.childNodes)}(n.target);p.fragment&&p.fragment.l(e),e.forEach(w)}else p.fragment&&p.fragment.c();n.intro&&F(t.$$.fragment),ee(t,n.target,n.anchor,n.customElement),H()}R(h)}class se{$destroy(){te(this,1),this.$destroy=e}$on(t,n){if(!a(n))return e;const r=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return r.push(n),()=>{const e=r.indexOf(n);-1!==e&&r.splice(e,1)}}$set(e){var t;this.$$set&&(t=e,0!==Object.keys(t).length)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}function ae(e){return e[~~(e.length*Math.random())]}function ce(e){return new Promise((async t=>{let n,r=new XMLHttpRequest;r.timeout=5e3,r.ontimeout=()=>t(5e3),r.onerror=()=>t(),r.onreadystatechange=()=>{if(2==r.readyState)if(200==r.status){let e=(new Date).getTime();r.abort(),t(e-n)}else t(5e3+r.status)},r.open("GET",`${e}?_=${(new Date).getTime()}`,!0),n=(new Date).getTime(),r.send(null)}))}function oe(e){return new Promise((async t=>{let n,r=0;for(let s=0;s<3;s++)if(n=await ce(e),0!=s){if(n>=5e3)return void t(n);r+=n}r=parseInt(r/3),t(r)}))}function ie(e,t){let n=[];t>e.length&&(t=e.length);for(let r=0;r<t;r++){const t=e[Math.floor(Math.random()*e.length)];n.push(t)}return n}window.browser=window.browser||window.chrome;var le={getRandomInstance:ae,getNextInstance:function(e,t){const n=t.indexOf(e);return-1===n?ae(t):t[(n+1)%t.length]},protocolHost:function(e){const t=e.pathname.replace(/\/$/,"");return"/TekstoLibre"==t&&e.host.endsWith("github.io")?`${e.protocol}//${e.host}${t.slice(0,-1)}`:e.username&&e.password?`${e.protocol}//${e.username}:${e.password}@${e.host}${t}`:`${e.protocol}//${e.host}${t}`},getList:function(e){return new Promise((t=>{let n;if("github"==e.fetchInstances)n="https://raw.githubusercontent.com/libredirect/instances/main/data.json";else{if("codeberg"!=e.fetchInstances)return t("disabled");n="https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json"}const r=new XMLHttpRequest;r.open("GET",n,!0),r.onreadystatechange=()=>{if(200===r.status&&r.readyState==XMLHttpRequest.DONE)return t(JSON.parse(r.responseText))},r.onerror=()=>t(),r.ontimeout=()=>t(),r.send(null)}))},getBlacklist:function(e){return new Promise((t=>{let n;if("github"==e.fetchInstances)n="https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json";else{if("codeberg"!=e.fetchInstances)return t("disabled");n="https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json"}const r=new XMLHttpRequest;r.open("GET",n,!0),r.onreadystatechange=()=>{200===r.status&&r.readyState==XMLHttpRequest.DONE&&t(JSON.parse(r.responseText))},r.onerror=()=>t(),r.ontimeout=()=>t(),r.send(null)}))},getConfig:function(){return new Promise((e=>{fetch("/config.json").then((e=>e.text())).then((t=>{e(JSON.parse(t))}))}))},getOptions:function(){return new Promise((e=>browser.storage.local.get("options",(t=>e(t.options)))))},getPingCache:function(){return new Promise((e=>browser.storage.local.get("pingCache",(t=>e(t.pingCache??{})))))},ping:oe,addressToLatLng:function(e){const t=new XMLHttpRequest;if(t.open("GET",`https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(e)}&format=json&limit=1`,!1),t.send(),200==t.status){const e=JSON.parse(t.responseText)[0];return e?{coordinate:`${e.lat},${e.lon}`,boundingbox:`${e.boundingbox[2]},${e.boundingbox[1]},${e.boundingbox[3]},${e.boundingbox[0]}`}:{}}},getQuery:function(e){let t="";return e.searchParams.has("q")?t=e.searchParams.get("q"):e.searchParams.has("query")&&(t=e.searchParams.has("query")),t},prefsEncoded:function(e){return new URLSearchParams(e).toString()},convertMapCentre:function(e){let[t,n,r]=[null,null,null];const s=e.pathname.match(/@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/);return s?[,n,t,r]=s:e.searchParams.has("center")&&([t,n]=e.searchParams.get("center").split(","),r=e.searchParams.get("zoom")??"17"),{zoom:r,lon:n,lat:t}},randomInstances:ie,style:function(e,t){const n=function(e,t){const n={text:"#fff",bgMain:"#121212",bgSecondary:"#202020",active:"#fbc117",danger:"#f04141",lightGrey:"#c3c3c3"},r={text:"black",bgMain:"white",bgSecondary:"#e4e4e4",active:"#fb9817",danger:"#f04141",lightGrey:"#c3c3c3"};return"dark"==e.theme?n:"light"==e.theme?r:t.matchMedia("(prefers-color-scheme: dark)").matches?n:r}(e,t);return`--text: ${n.text};\n --bg-main: ${n.bgMain};\n --bg-secondary: ${n.bgSecondary};\n --active: ${n.active};\n --danger: ${n.danger};\n --light-grey: ${n.lightGrey};`},autoPickInstance:async function(e,t){if(t){const n=e.findIndex((e=>t.href.startsWith(e)));n>=0&&e.splice(n,1)}const n=ie(e,5),r=await Promise.all([...n.map((async e=>[e,await oe(e)]))]);return r.sort(((e,t)=>e[1]-t[1])),r[0][0]}};const ue=void 0===browser.runtime.getBrowserInfo;let he,pe;async function $e(){pe=await le.getOptions(),he=await le.getConfig()}function me(e,t,n,r){let s=[];if(t)n[t]&&(s=n[t]);else for(const t in r.services[e].frontends)n[t]&&s.push(...n[t]);return s}function de(e,t,n,r,s){let a=n.services[e].targets;s&&(!("excludeTargets"in n.services[e].frontends[s])||"search"===e&&r.search.redirectGoogle||(a=a.filter((t=>!n.services[e].frontends[s].excludeTargets.includes(a.indexOf(t))))),"twitter"===e&&r.twitter.disableTwimg&&(a=a.splice(2)));for(const e in a){if(new RegExp(a[e]).test(t.href))return!0}return!1}function fe(e,t,n,r,s,a){if("main_frame"!=t&&"sub_frame"!=t&&"image"!=t)return;let c,o;if(a||1!=pe.redirectOnlyInIncognito||s){for(const i in he.services){if(!a&&!pe[i].enabled)continue;if(!a&&1==pe[i].redirectOnlyInIncognito&&!s)continue;if(o=pe[i].frontend,he.services[i].frontends[o].desktopApp&&"main_frame"!=t&&"main_frame"!=pe[i].redirectType&&(o=pe[i].embedFrontend),!de(i,e,he,pe,o)){o=null;continue}if("main_frame"!=t&&r&&"sub_frame"==pe[i].redirectType&&de(i,r,he,pe,o))return;if(he.services[i].embeddable&&t!=pe[i].redirectType&&"both"!=pe[i].redirectType)return"block"==pe[i].unsupportedUrls?"CANCEL":void 0;let l=pe[o];if(void 0===l)break;if(he.services[i].frontends[o].localhost&&"localhost"==pe[i].instance)c=`http://${o}.localhost:8080`;else{if(0===l.length)return`https://no-instance.libredirect.invalid?frontend=${encodeURIComponent(o)}&url=${encodeURIComponent(e.href)}`;c=le.getRandomInstance(l)}if(n&&l.includes(n.origin))return"main_frame"==t?"BYPASSTAB":null;break}if(o)return function(e,t,n,r,s){switch(n){case"hyperpipe":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${r}${e.pathname}${e.search}`.replace(/\/search\?q=.*/,(e=>e.replace("?q=","/")));case"searx":case"searxng":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${r}/${e.search}`;case"websurfx":case"whoogle":for(const t of[...e.searchParams.keys()])"q"!==t&&e.searchParams.delete(t);return`${r}/search${e.search}`;case"4get":{const t=e.searchParams.get("q");return null!==t?`${r}/web?s=${encodeURIComponent(t)}`:r}case"librey":for(const t in e.searchParams.keys())"q"!=t&&e.searchParams.delete(t);return`${r}/search.php${e.search}`;case"yattee":return e.searchParams.delete("si"),e.href.replace(/^https?:\/{2}/,"yattee://");case"freetube":case"freetubePwa":return e.searchParams.delete("si"),"freetube://"+e.href;case"poketube":if(e.searchParams.delete("si"),e.pathname.startsWith("/channel")){const t=/\/channel\/(.*)\/?$/.exec(e.pathname);if(t)return`${r}/channel?id=${t[1]}${e.search}`}return/\/@[a-z]+\//.exec(e.pathname)?r:`${r}${e.pathname}${e.search}`;case"small":case"libMedium":case"freedium":case"scribe":{const t=e.hostname.match(/^(link|cdn-images-\d+|.*)\.medium\.com/);if(t&&t.length>1){const n=t[1];if("link"!=n||!n.startsWith("cdn-images"))return`${r}/@${n}${e.pathname}${e.search}`}return`${r}${e.pathname}${e.search}`}case"translite":case"simplyTranslate":return`${r}/${e.search}`;case"send":case"mozhi":return r;case"libreTranslate":return`${r}/${e.search.replace("sl","source").replace("tl","target").replace("text","q")}`;case"osm":{if(t&&"earth.google.com"===t.host)return r;let n={layers:"mapnik"},s="#";const a=le.convertMapCentre(e);if(a.zoom&&a.lon&&a.lat&&(s=`#map=${a.zoom}/${a.lon}/${a.lat}`),e.pathname.includes("/embed")){const t=le.getQuery(e);let{coordinate:s,boundingbox:a}=le.addressToLatLng(t);return n.bbox=a,n.marker=s,`${r}/export/embed.html?${le.prefsEncoded(n)}`}if(e.pathname.includes("/dir")){if(e.searchParams.has("travelmode")){const t={driving:"fossgis_osrm_car",walking:"fossgis_osrm_foot",bicycling:"fossgis_osrm_bike",transit:"fossgis_osrm_car"};n.engine=t[e.searchParams.get("travelmode")]}const t=/\/dir\/([^@/]+)\/([^@/]+)\/@-?\d[0-9.]*,-?\d[0-9.]*,\d{1,2}[.z]/.exec(e.pathname),a=/\/dir\/([^@/]+)\//.exec(e.pathname);if(t){const e=le.addressToLatLng(decodeURIComponent(t[1])).coordinate??"",r=le.addressToLatLng(decodeURIComponent(t[2])).coordinate??"";n.route=`${e};${r}`}else if(a){const e=le.addressToLatLng(decodeURIComponent(a[1])).coordinate??"";n.route=`${e};`}else{const t=le.addressToLatLng(e.searchParams.get("origin")).coordinate??"",r=le.addressToLatLng(e.searchParams.get("destination")).coordinate??"";n.route=`${t};${r}`}return`${r}/directions?${le.prefsEncoded(n)}${s}`}const c=/\/place\/(.*?)\//;if(e.pathname.match(c))return`${r}/search?query=${e.pathname.match(c)[1]}${s}`;if(e.searchParams.has("ll")){const[t,n]=e.searchParams.get("ll").split(",");return`${r}/search?query=${t}%2C${n}`}if(e.searchParams.has("viewpoint")){const[t,n]=e.searchParams.get("viewpoint").split(",");return`${r}/search?query=${t}%2C${n}`}const o=le.getQuery(e);return o?`${r}/search?query="${o}${s}&${le.prefsEncoded(n)}`:`${r}/${s}&${le.prefsEncoded(n)}`}case"breezeWiki":{let t,n="";return e.hostname.match(/^[a-zA-Z0-9-]+\.(?:fandom|wikia)\.com/)?(t=e.hostname.match(/^[a-zA-Z0-9-]+(?=\.(?:fandom|wikia)\.com)/),t="www"!=t&&t?`/${t}`:"",n=e.pathname):(t=e.pathname.match(/(?<=wiki\/w:c:)[a-zA-Z0-9-]+(?=:)/),t?(t="/"+t+"/wiki/",n=e.pathname.match(/(?<=wiki\/w:c:[a-zA-Z0-9-]+:).+/)):t=""),e.href.search(/Special:Search\?query/)>-1?`${r}${t}${n}${e.search}`.replace(/Special:Search\?query/,"search?q").replace(/\/wiki/,""):`${r}${t}${n}${e.search}`}case"rimgo":return e.href.search(/^https?:\/{2}(?:[im]\.)?stack\./)>-1?`${r}/stack${e.pathname}${e.search}`:`${r}${e.pathname}${e.search}`;case"redlib":case"libreddit":{const t=e.hostname.match(/^(?:((?:external-)?preview|i)\.)?redd\.it/);if(!t)return`${r}${e.pathname}${e.search}`;switch(t[1]){case"preview":return`${r}/preview/pre${e.pathname}${e.search}`;case"external-preview":return`${r}/preview/external-pre${e.pathname}${e.search}`;case"i":return`${r}/img${e.pathname}`}return`${r}/comments${e.pathname}`}case"teddit":return/^(?:(?:external-)?preview|i)\.redd\.it/.test(e.hostname)?""==e.search?`${r}${e.pathname}?teddit_proxy=${e.hostname}`:`${r}${e.pathname}${e.search}&teddit_proxy=${e.hostname}`:`${r}${e.pathname}${e.search}`;case"troddit":case"eddrit":return/^(?:(?:external-)?preview|i)\.redd\.it/.test(e.hostname)?r:`${r}${e.pathname}${e.search}`;case"neuters":{const t=e.pathname;return t.startsWith("/article/")||t.startsWith("/pf/")||t.startsWith("/arc/")||t.startsWith("/resizer/")?r:`${r}${t}`}case"dumb":return e.pathname.endsWith("-lyrics")?`${r}${e.pathname}`:`${r}${e.pathname}${e.search}`;case"intellectual":return`${r}${e.pathname}${e.search}`;case"ruralDictionary":return e.pathname.includes("/define.php")||e.pathname.includes("/random.php")||"/"==e.pathname?`${r}${e.pathname}${e.search}`:r;case"anonymousOverflow":{if("stackoverflow.com"==e.hostname){const t=/^\/a\/(\d+)\/?/.exec(e.pathname);return t?`${r}/questions/${t[1]}${e.search}`:`${r}${e.pathname}${e.search}`}if("/"==e.pathname||""==e.pathname)return`${r}${e.pathname}${e.search}`;const t=e.href.match(/https?:\/{2}(?:([a-zA-Z0-9-]+)\.(meta\.)?)?stackexchange\.com\//);if(t&&t.length>1)return t[2]?`${r}/exchange/${e.hostname}${e.pathname}${e.search}`:`${r}/exchange/${t[1]}${e.pathname}${e.search}`;const n=e.hostname.match(/(?:[a-zA-Z]+\.)?(?:askubuntu\.com|mathoverflow\.net|serverfault\.com|stackapps\.com|superuser\.com|stackoverflow\.com)/);return n?`${r}/exchange/${n[0]}${e.pathname}${e.search}`:`${r}${e.pathname}${e.search}`}case"biblioReads":return`${r}${e.pathname}${e.search}`;case"wikimore":{let t=e.host.split(".");return"wikipedia"!=t[0]&&"www"!=t[0]?`${r}/wiki/${e.hostname.split(".")[0]}${e.pathname}${e.search}${e.hash}`:`${r}${e.pathname}${e.search}${e.hash}`}case"wikiless":{let t=e.host.split(".");return"wikipedia"!=t[0]&&"www"!=t[0]&&("m"==t[0]?e.searchParams.append("mobileaction","toggle_view_mobile"):e.searchParams.append("lang",t[0]),"m"==t[1]&&e.searchParams.append("mobileaction","toggle_view_mobile")),`${r}${e.pathname}${e.search}${e.hash}`}case"offtiktok":case"proxiTok":return e.pathname.startsWith("/email")?r:`${r}${e.pathname}${e.search}`;case"waybackClassic":{const t=/^\/\web\/(?:[0-9]+)?\*\/(.*)/.exec(e.pathname);if(t){const e=t[1];return`${r}/cgi-bin/history.cgi?utf8=✓&q=${encodeURIComponent(e)}`}const n=/(^\/\web\/([0-9]+)\/.*)/.exec(e.pathname);if(n){let e=n[1];return e=e.replace(n[2],n[2]+"if_"),`https://web.archive.org${e}`}return}case"gothub":return"gist.github.com"==e.hostname?`${r}/gist${e.pathname}${e.search}`:"raw.githubusercontent.com"==e.hostname?`${r}/raw${e.pathname}${e.search}`:`${r}${e.pathname}${e.search}`;case"mikuInvidious":if("bilibili.com"==e.hostname||"www.bilibili.com"==e.hostname||"b23.tv"==e.hostname)return`${r}${e.pathname}${e.search}`;if("space.bilibili.com"==e.hostname)return`${r}/space${e.pathname}${e.search}`;case"tent":if("bandcamp.com"==e.hostname&&"/search"==e.pathname){const t=e.searchParams.get("q");return`${r}/search.php?query=${encodeURIComponent(t)}`}if(e.hostname.endsWith("bandcamp.com")){const t=/^(.*)\.bandcamp\.com/.exec(e.hostname)[1];if("/"==e.pathname||"/music"==e.pathname)return`${r}/artist.php?name=${t}`;{const n=/^\/(.*)\/(.*)/.exec(e.pathname);if(n)return`${r}/release.php?artist=${t}&type=${n[1]}&name=${n[2]}`}}if("f4.bcbits.com"==e.hostname)return`${r}/image.php?file=${/\/img\/(.*)/.exec(e.pathname)[1]}`;if("t4.bcbits.com"==e.hostname){const t=/\/stream\/(.*)\/(.*)\/(.*)/.exec(e.pathname);if(t){const n=t[1],s=t[2],a=t[3],c=e.searchParams.get("token");return`${r}/audio.php/?directory=${n}&format=${s}&file=${a}&token=${encodeURIComponent(c)}`}}case"binternet":return"i.pinimg.com"==e.hostname?`${r}/image_proxy.php?url=${encodeURIComponent(e.href)}`:`${r}${e.pathname}${e.search}`;case"painterest":if("i.pinimg.com"==e.hostname)return`${r}/_/proxy?url=${encodeURIComponent(e.href)}`;const n=/^\/pin\/[^\/]+/.exec(e.pathname);return n?`${r}${n[0]}`:`${r}${e.pathname}${e.search}`;case"laboratory":{let t=e.pathname;return"/"==t&&(t=""),`${r}/${e.hostname}${t}${e.search}`}case"quetre":{const t=/([a-z]+)\.quora\.com/.exec(e.hostname);if(t){const n=t[1];return e.searchParams.append("lang",n),`${r}${e.pathname}${e.search}`}return`${r}${e.pathname}${e.search}`}case"pixivViewer":case"liteXiv":case"pixivFe":{const t=/\/[a-z]{1,3}\/(.*)/.exec(e.pathname);return t?`${r}/${t[1]}${e.search}`:`${r}${e.pathname}${e.search}`}case"vixipy":{const t=/\/[a-z]{1,3}\/(.*)/.exec(e.pathname);if(t){let n=t[1];return n.startsWith("tags/")&&(n=n.replace(/tags/,"tag")),`${r}/${n}${e.search}`}return`${r}${e.pathname}${e.search}`}case"invidious":return e.searchParams.delete("si"),"sub_frame"==s&&e.searchParams.append("autoplay","0"),"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`${r}/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}&${e.search.substring(1)}`:e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/redirect?")?e.href:`${r}${e.pathname}${e.search}`;case"freetubeMusic":return"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`freetube://youtube.com/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}`:"freetube://"+e.href;case"invidiousMusic":return"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live")?`${r}/watch?v=${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}`:`${r}${e.pathname}${e.search}`;case"materialious":if(e.searchParams.delete("si"),"youtu.be"==e.hostname||e.hostname.endsWith("youtube.com")&&e.pathname.startsWith("/live"))return`${r}/watch/${e.pathname.substring(e.pathname.lastIndexOf("/")+1)}${e.search.replace("?","&")}`;if(e.hostname.endsWith("youtube.com")){if(e.pathname.startsWith("/watch")){if(e.searchParams.has("v")){const t=e.searchParams.get("v");return e.searchParams.delete("v"),`${r}/watch/${t}${e.search.replace("?","&")}`}return`${r}/watch/${e.search.replace("?","&")}`}if(e.pathname.startsWith("/results")){if(e.searchParams.has("search_query")){const t=e.searchParams.get("search_query");return e.searchParams.delete("search_query"),`${r}/search/${t}${e.search.replace("?","&")}`}return`${r}/search/${e.search.replace("?","&")}`}if(e.pathname.startsWith("/redirect?"))return e.href}return`${r}${e.pathname}${e.search}`;case"libremdb":return/\/((?:name|title)\/\w+)\/?$/.exec(e.pathname)?`${r}${e.pathname}${e.search}`:r;case"tuboYoutube":return e.searchParams.delete("si"),e.pathname.startsWith("/channel")?`${r}/channel?url=${encodeURIComponent(e.href)}`:e.pathname.startsWith("/watch")?`${r}/stream?url=${encodeURIComponent(e.href)}`:r;case"tuboSoundcloud":return"/"==e.pathname?`${r}?kiosk?serviceId=1`:e.pathname.match(/^\/[^\/]+(\/$|$)/)?`${r}/channel?url=${encodeURIComponent(e.href)}`:e.pathname.match(/^\/[^\/]+\/[^\/]+/)?`${r}/stream?url=${encodeURIComponent(e.href)}`:r;case"twineo":case"safetwitch":return e.hostname.startsWith("clips.")?`${r}/clip${e.pathname}${e.search}`:`${r}${e.pathname}${e.search}`;case"tekstoLibre":return`${r}/?${e.pathname.slice(1)}`;case"skyview":return"/"==e.pathname?r:`${r}?url=${encodeURIComponent(e.href)}`;case"nitter":{let t=new URLSearchParams(e.search);if(t.delete("ref_src"),t.delete("ref_url"),t.delete("s"),t.delete("t"),t=t.toString(),""!==t&&(t=`?${t}`),"pbs"===e.host.split(".")[0]||"video"===e.host.split(".")[0])try{const[,n,s,a]=t.match(/(.*)\?format=(.*)&(.*)/),c=encodeURIComponent(`${n}.${s}?${a}`);return`${r}/pic${e.pathname}${c}`}catch{return`${r}/pic${e.pathname}${t}`}return e.pathname.split("/").includes("tweets")?`${r}${e.pathname.replace("/tweets","")}${t}`:"t.co"==e.host?`${r}/t.co${e.pathname}`:`${r}${e.pathname}${t}#m`}case"priviblur":{if("www.tumblr.com"==e.hostname)return`${r}${e.pathname}${e.search}`;if(e.hostname.startsWith("assets"))return`${r}/tblr/assets${e.pathname}${e.search}`;if(e.hostname.startsWith("static"))return`${r}/tblr/static${e.pathname}${e.search}`;const t=/^([0-9]+)\.media\.tumblr\.com/.exec(e.hostname);if(t)return`${r}/tblr/media/${t[1]}${e.pathname}${e.search}`;const n=/^(?:www\.)?([a-z\d-]+)\.tumblr\.com/.exec(e.hostname);if(n){const t=n[1];return e.pathname.startsWith("/post")?`${r}/${t}${e.pathname.slice(5)}${e.search}`:`${r}/${t}${e.pathname}${e.search}`}return`${r}${e.pathname}${e.search}`}case"ultimateTab":case"freetar":if(e.pathname.startsWith("/search.php"))return e.searchParams.set("search_term",e.searchParams.get("value")),e.searchParams.delete("value"),e.searchParams.delete("search_type"),`${r}/search${e.search}`;if(e.pathname.startsWith("/artist"))return;return`${r}${e.pathname}${e.search}`;case"ratAintTieba":return e.searchParams.delete("ie"),`${r}${e.pathname}${e.search}`;case"shoelace":{const t=/^\/(?:(?:(?:[^\/])?\/post)|t)\/([^\/])/.exec(e.pathname);return t?`${r}/t/${t[1]}${e.search}`:`${r}${e.pathname}${e.search}`}case"skunkyArt":{if(e.pathname.startsWith("/search"))return`${r}${e.pathname}${e.search}&type=all`;const t=/^\/(.*?)\/art\/(.*)\/?/.exec(e.pathname);if(t)return`${r}/post/${t[1]}/${t[2]}${e.search}`;const n=/^\/([^\/]+)$/.exec(e.pathname);if(n)return`${r}/group_user?q=${n[1]}&type=about`;const s=/^\/(.*?)\/gallery(\/$|$)$/.exec(e.pathname);return s?`${r}/group_user?q=${s[1]}&type=gallery`:`${r}${e.pathname}${e.search}`}case"ytify":{if(e.pathname.startsWith("/watch"))return`${r}/?s=${encodeURIComponent(e.searchParams.get("v"))}`;const t=/\/channel\/([^\/]+)/.exec(e.pathname);return t?`${r}/list?channel=${t[1]}`:e.pathname.startsWith("/playlist")?`${r}/list?playlists=${encodeURIComponent(e.searchParams.get("list"))}`:`${r}${e.pathname}${e.search}`}case"koub":return e.pathname.startsWith("/view/")||e.pathname.startsWith("/stories/")?`${r}${e.pathname}${e.search}`:/^\/([^\/]+)\/?$/.exec(e.pathname)?`${r}/account${e.pathname}${e.search}`:r;case"duckDuckGoAiChat":return"https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=1";case"soundcloak":if(e.pathname.startsWith("/feed")||e.pathname.startsWith("/stream"))return r;if(e.pathname.startsWith("/search")){if(!e.search)return r;let t="";return e.pathname.startsWith("/search/sounds")?t="tracks":e.pathname.startsWith("/search/people")?t="users":(e.pathname.startsWith("/search/albums")||e.pathname.startsWith("/search/sets"))&&(t="playlists"),t?(t="&type="+t,`${r}/search${e.search}${t}`):r}return"on.soundcloud.com"==e.host?`${r}/on${e.pathname}`:`${r}${e.pathname}${e.search}`;case"piped":case"pipedMaterial":case"cloudtube":case"lightTube":case"viewtube":e.searchParams.delete("si");default:return`${r}${e.pathname}${e.search}`}}(e,n,o,c,t)}}async function ge(e){let t=await le.getOptions(),n=await le.getConfig();for(const r in n.services){let s=t[r].frontend;if(null!=t[s]&&(!(t[s].findIndex((t=>e.href.startsWith(t)))<0)||e.href.startsWith(`http://${s}.localhost:8080`)))switch(r){case"youtube":case"imdb":case"imgur":case"tiktok":case"reddit":case"imdb":case"snopes":case"urbanDictionary":case"quora":case"twitter":case"medium":case"pinterest":return`${n.services[r].url}${e.pathname}${e.search}`;case"fandom":{let t=e.pathname.match(/^\/([a-zA-Z0-9-]+)\/wiki\/(.*)/);return t?`https://${t[1]}.fandom.com/wiki/${t[2]}`:void 0}case"wikipedia":{const t=e.searchParams.get("lang");return null!=t?`https://${t}.wikipedia.org${e.pathname}${e.search}${e.hash}`:`https://wikipedia.org${e.pathname}${e.search}${e.hash}`}case"stackOverflow":if(e.pathname.startsWith("/questions/"))return`https://stackoverflow.com${e.pathname}${e.search}`;if(e.pathname.startsWith("/exchange/")){const t=/\/exchange\/(.*?)(\/.*)/.exec(e.pathname);if(t)return t[1].includes(".")?`https://${t[1]}${t[2]}`:`https://${t[1]}.stackexchange.com${t[2]}`}return;case"tekstowo":return`${n.services[r].url}/${e.search.slice(1)}`;case"goodreads":return`https://goodreads.com${e.pathname}${e.search}`;case"soundcloud":if("soundcloak"==s){if(e.pathname.includes("/_/"))return`${n.services[r].url}${e.pathname.split("/_/")[0]}`;if("/search"==e.pathname){let t=e.searchParams.get("type");switch(t){case"playlists":t="sets";break;case"tracks":t="sounds";break;case"users":t="people";break;default:t=""}return e.searchParams.delete("type"),t?`${n.services[r].url}/search/${t}?${e.searchParams.toString()}`:`${n.services[r].url}/search?${e.searchParams.toString()}`}return`${n.services[r].url}${e.pathname}`}default:return}}}window.browser=window.browser||window.chrome,$e(),browser.storage.onChanged.addListener($e);const we={materialious:["https://app.materialio.us"],viewtube:["https://viewtube.io"],piped:["https://pipedapi-libre.kavin.rocks"],pipedMaterial:["https://piped-material.xn--17b.net"],cloudtube:["https://tube.cadence.moe"],lightTube:["https://tube.kuylar.dev"],poketube:["https://poketube.fun"],proxiTok:["https://proxitok.pabloferreiro.es"],offtiktok:["https://www.offtiktok.com"],redlib:["https://safereddit.com"],eddrit:["https://eddrit.com"],troddit:["https://www.troddit.com"],scribe:["https://scribe.rip"],libMedium:["https://md.vern.cc"],small:["https://small.bloat.cat"],freedium:["https://freedium.cfd"],quetre:["https://quetre.iket.me"],libremdb:["https://libremdb.iket.me"],simplyTranslate:["https://simplytranslate.org"],translite:["https://tl.bloat.cat"],mozhi:["https://mozhi.aryak.me"],searxng:["https://nyc1.sx.ggtyler.dev"],"4get":["https://4get.ca"],websurfx:["https://alamin655-spacex.hf.space"],rimgo:["https://rimgo.vern.cc"],hyperpipe:["https://hyperpipe.surge.sh"],osm:["https://www.openstreetmap.org"],breezeWiki:["https://breezewiki.com"],neuters:["https://neuters.de"],dumb:["https://dm.vern.cc"],intellectual:["https://intellectual.insprill.net"],ruralDictionary:["https://rd.vern.cc"],anonymousOverflow:["https://code.whatever.social"],suds:["https://sd.vern.cc"],unfunny:["https://uf.vern.cc"],soprano:["https://sp.vern.cc"],meme:["https://mm.vern.cc"],waybackClassic:["https://wayback-classic.net"],tent:["https://tent.sny.sh"],laboratory:["https://lab.vern.cc"],binternet:["https://bn.bloat.cat"],painterest:["https://pt.bloat.cat"],pixivFe:["https://pixiv.perennialte.ch"],liteXiv:["https://litexiv.465321.best","https://litexiv.bloat.cat"],pixivViewer:["https://pixiv.pictures"],vixipy:["https://vx.maid.zone"],indestructables:["https://indestructables.private.coffee"],destructables:["https://ds.vern.cc"],structables:["https://structables.private.coffee"],safetwitch:["https://safetwitch.drgns.space"],twineo:["https://twineo.exozy.me"],proxigram:["https://ig.opnxng.com"],tuboYoutube:["https://tubo.media"],tuboSoundcloud:["https://tubo.media"],tekstoLibre:["https://davilarek.github.io/TekstoLibre"],skyview:["https://skyview.social"],priviblur:["https://pb.bloat.cat"],nitter:["https://nitter.privacydev.net"],pasted:["https://pasted.drakeerv.com"],pasty:["https://pasty.lus.pm"],freetar:["https://freetar.de"],ultimateTab:["https://ultimate-tab.com"],ratAintTieba:["https://rat.fis.land"],shoelace:["https://shoelace.mint.lgbt"],skunkyArt:["https://skunky.bloat.cat"],ytify:["https://ytify.pp.ua"],nerdsForNerds:["https://nn.vern.cc"],ducksForDucks:["https://ducksforducks.private.coffee"],koub:["https://koub.clovius.club"],soundcloak:["https://soundcloak.fly.dev"],gocook:["https://cook.adminforge.de"],wikimore:["https://wikimore.private.coffee"],libreTranslate:["https://libretranslate.com"],cryptPad:["https://cryptpad.org"]};async function be(){let e=await le.getConfig(),t={};for(const n in e.services){t[n]={};for(const r in e.services[n].options)t[n][r]=e.services[n].options[r];for(const r in e.services[n].frontends)e.services[n].frontends[r].instanceList&&(t[r]=[])}return t.exceptions={url:[],regex:[]},t.theme="detect",t.popupServices=["youtube","tiktok","imgur","reddit","quora","translate","maps"],t.fetchInstances="github",t.redirectOnlyInIncognito=!1,t={...t,...we},t}var ve={redirect:fe,redirectAsync:async function(e,t,n,r,s,a){return await $e(),fe(e,t,n,r,s,a)},computeServiceFrontend:async function(e){const t=await le.getConfig(),n=await le.getOptions();for(const r in t.services){if(de(r,e,t,n))return{service:r,frontend:null};for(const s in t.services[r].frontends){const a=me(r,s,n,t).findIndex((t=>e.href.startsWith(t)));if(a>=0)return{service:r,frontend:s}}}},reverse:ge,initDefaults:function(){return new Promise((e=>{browser.storage.local.clear((async()=>{pe=await be(),browser.storage.local.set({options:pe},(()=>e()))}))}))},processUpdate:function(e){return new Promise((async t=>{const n=await le.getConfig();let r=e??await le.getOptions();const s=await be();for(const e in r)if(e in s){if("object"==typeof e&&null!==e)for(const t in r[e])t in s[e]||delete r[e][t]}else delete r[e];r.popupServices=r.popupServices.filter((e=>e in n.services));for(const[e,t]of Object.entries(s))e in r||(r[e]=t);for(const[e,t]of Object.entries(n.services)){r[e].frontend in t.frontends||(r[e]=t.options);for(const n in t.options)n in r[e]||(r[e][n]=t.options[n])}browser.storage.local.clear((()=>browser.storage.local.set({options:r},(()=>t()))))}))},copyRaw:async function(e){const t=await ge(e);if(t)if(ue){var n=document.createElement("textarea");n.textContent=t,document.body.appendChild(n),n.select(),document.execCommand("copy"),n.blur(),document.body.removeChild(n)}else navigator.clipboard.writeText(t)},switchInstance:function(e,t){return new Promise((async n=>{let r=await le.getOptions(),s=await le.getConfig();if(le.protocolHost(e),t){const s=r[r[t].frontend];if(void 0!==s){const t=le.getNextInstance(e.origin,s);if(t)return n(`${t}${e.pathname}${e.search}`)}}else for(const t in s.services){let s=r[r[t].frontend];if(void 0===s)continue;const a=s.findIndex((t=>e.href.startsWith(t)));if(a<0)continue;if(s.splice(a,1),0===s.length)return n();const c=le.getNextInstance(e.origin,s);if(c)return n(`${c}${e.pathname}${e.search}`)}n()}))},isException:function(e){if(!pe)return!1;if(!pe.exceptions)return!1;let t=pe.exceptions;if(t&&e){if(t.url)for(let n of t.url)if(n=new URL(n),n=n.href.replace(/^http:\/\//,"https://"),n==e.href)return!0;if(t.regex)for(const n of t.regex)if(new RegExp(n).test(e.href))return!0}return!1}};function xe(e){let n,r,s,a;const c=e[2].default,o=l(c,e,e[1],null);let i=[e[0]],u={};for(let e=0;e<i.length;e+=1)u=t(u,i[e]);return{c(){n=b("div"),o&&o.c(),C(n,u),W(n,"svelte-j9pcac",!0)},m(t,c){g(t,n,c),o&&o.m(n,null),r=!0,s||(a=P(n,"click",e[3]),s=!0)},p(e,[t]){o&&o.p&&(!r||2&t)&&p(o,c,e,e[1],r?h(c,e[1],t,null):$(e[1]),null),C(n,u=X(i,[1&t&&e[0]])),W(n,"svelte-j9pcac",!0)},i(e){r||(F(o,e),r=!0)},o(e){K(o,e),r=!1},d(e){e&&w(n),o&&o.d(e),s=!1,a()}}}function ye(e,n,r){let{$$slots:s={},$$scope:a}=n;return e.$$set=e=>{r(0,n=t(t({},n),m(e))),"$$scope"in e&&r(1,a=e.$$scope)},[n=m(n),a,s,function(t){O.call(this,e,t)}]}class ke extends se{constructor(e){super(),re(this,e,ye,xe,c,{})}}function Pe(e){let n,r;const s=e[2].default,a=l(s,e,e[1],null);let c=[e[0]],o={};for(let e=0;e<c.length;e+=1)o=t(o,c[e]);return{c(){n=b("span"),a&&a.c(),C(n,o),W(n,"svelte-1auan3b",!0)},m(e,t){g(e,n,t),a&&a.m(n,null),r=!0},p(e,[t]){a&&a.p&&(!r||2&t)&&p(a,s,e,e[1],r?h(s,e[1],t,null):$(e[1]),null),C(n,o=X(c,[1&t&&e[0]])),W(n,"svelte-1auan3b",!0)},i(e){r||(F(a,e),r=!0)},o(e){K(a,e),r=!1},d(e){e&&w(n),a&&a.d(e)}}}function Ie(e,n,r){const s=[];let a=d(n,s),{$$slots:c={},$$scope:o}=n;return e.$$set=e=>{n=t(t({},n),m(e)),r(0,a=d(n,s)),"$$scope"in e&&r(1,o=e.$$scope)},[a,o,c]}class _e extends se{constructor(e){super(),re(this,e,Ie,Pe,c,{})}}function Ce(t){let n,r;return{c(){n=v("svg"),r=v("path"),I(r,"d","M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"),I(n,"xmlns","http://www.w3.org/2000/svg"),I(n,"height","24px"),I(n,"width","24px"),I(n,"viewBox","0 0 24 24"),I(n,"preserveAspectRatio","xMinYMin meet"),I(n,"fill","currentColor")},m(e,t){g(e,n,t),f(n,r)},p:e,i:e,o:e,d(e){e&&w(n)}}}class qe extends se{constructor(e){super(),re(this,e,null,Ce,c,{})}}function We(t){let n,r;return{c(){n=v("svg"),r=v("path"),I(r,"d","M 17,20 V 11 Q 17,10.175 16.412,9.587 15.825,9 15,9 H 6.8 L 8.4,7.4 7,6 3,10 7,14 8.4,12.6 6.8,11 H 15 v 9 z"),I(r,"id","path2"),I(n,"xmlns","http://www.w3.org/2000/svg"),I(n,"height","24px"),I(n,"width","24px"),I(n,"viewBox","0 0 24 24"),I(n,"preserveAspectRatio","xMinYMin meet"),I(n,"fill","currentColor")},m(e,t){g(e,n,t),f(n,r)},p:e,i:e,o:e,d(e){e&&w(n)}}}class Me extends se{constructor(e){super(),re(this,e,null,We,c,{})}}function Re(t){let n,r;return{c(){n=v("svg"),r=v("path"),I(r,"d","M7 20v-9q0-.825.588-1.413Q8.175 9 9 9h8.2l-1.6-1.6L17 6l4 4-4 4-1.4-1.4 1.6-1.6H9v9Z"),I(n,"xmlns","http://www.w3.org/2000/svg"),I(n,"height","24px"),I(n,"width","24px"),I(n,"viewBox","0 0 24 24"),I(n,"preserveAspectRatio","xMinYMin meet"),I(n,"fill","currentColor")},m(e,t){g(e,n,t),f(n,r)},p:e,i:e,o:e,d(e){e&&w(n)}}}class Le extends se{constructor(e){super(),re(this,e,null,Re,c,{})}}function Te(n){let r,a,c,o,i=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{width:"24px"},{viewBox:"0 0 24 24"},{preserveAspectRatio:"xMinYMin meet"},{fill:"currentColor"}],l={};for(let e=0;e<i.length;e+=1)l=t(l,i[e]);return{c(){r=v("svg"),a=v("path"),I(a,"d","M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"),q(r,l)},m(e,t){g(e,r,t),f(r,a),c||(o=[P(r,"click",n[1]),P(r,"keydown",null)],c=!0)},p(e,[t]){q(r,l=X(i,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{width:"24px"},{viewBox:"0 0 24 24"},{preserveAspectRatio:"xMinYMin meet"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&w(r),c=!1,s(o)}}}function Oe(e,n,r){const s=[];let a=d(n,s);return e.$$set=e=>{n=t(t({},n),m(e)),r(0,a=d(n,s))},[a,function(t){O.call(this,e,t)}]}class Se extends se{constructor(e){super(),re(this,e,Oe,Te,c,{})}}function ze(n){let r,a,c,o,i=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{width:"24px"},{viewBox:"0 0 24 24"},{preserveAspectRatio:"xMinYMin meet"},{fill:"currentColor"}],l={};for(let e=0;e<i.length;e+=1)l=t(l,i[e]);return{c(){r=v("svg"),a=v("path"),I(a,"d","m9.25 22-.4-3.2q-.325-.125-.612-.3-.288-.175-.563-.375L4.7 19.375l-2.75-4.75 2.575-1.95Q4.5 12.5 4.5 12.337v-.675q0-.162.025-.337L1.95 9.375l2.75-4.75 2.975 1.25q.275-.2.575-.375.3-.175.6-.3l.4-3.2h5.5l.4 3.2q.325.125.613.3.287.175.562.375l2.975-1.25 2.75 4.75-2.575 1.95q.025.175.025.337v.675q0 .163-.05.338l2.575 1.95-2.75 4.75-2.95-1.25q-.275.2-.575.375-.3.175-.6.3l-.4 3.2Zm2.8-6.5q1.45 0 2.475-1.025Q15.55 13.45 15.55 12q0-1.45-1.025-2.475Q13.5 8.5 12.05 8.5q-1.475 0-2.488 1.025Q8.55 10.55 8.55 12q0 1.45 1.012 2.475Q10.575 15.5 12.05 15.5Z"),q(r,l)},m(e,t){g(e,r,t),f(r,a),c||(o=[P(r,"click",n[1]),P(r,"keydown",null)],c=!0)},p(e,[t]){q(r,l=X(i,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"24px"},{width:"24px"},{viewBox:"0 0 24 24"},{preserveAspectRatio:"xMinYMin meet"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&w(r),c=!1,s(o)}}}function Ae(e,n,r){const s=[];let a=d(n,s);return e.$$set=e=>{n=t(t({},n),m(e)),r(0,a=d(n,s))},[a,function(t){O.call(this,e,t)}]}class Ee extends se{constructor(e){super(),re(this,e,Ae,ze,c,{})}}const Ue=[];function Ne(t,n=e){let r;const s=new Set;function a(e){if(c(t,e)&&(t=e,r)){const e=!Ue.length;for(const e of s)e[1](),Ue.push(e,t);if(e){for(let e=0;e<Ue.length;e+=2)Ue[e][0](Ue[e+1]);Ue.length=0}}}return{set:a,update:function(e){a(e(t))},subscribe:function(c,o=e){const i=[c,o];return s.add(i),1===s.size&&(r=n(a)||e),c(t),()=>{s.delete(i),0===s.size&&r&&(r(),r=null)}}}}const je=Ne(null),Be=Ne(null),De=Ne("general");function He(n){let r,c,o,i,l=[{class:c=document.body.dir},n[2],{type:"checkbox"}],u={};for(let e=0;e<l.length;e+=1)u=t(u,l[e]);return{c(){r=b("input"),C(r,u),W(r,"svelte-1i76whx",!0)},m(e,t){g(e,r,t),r.autofocus&&r.focus(),r.checked=n[0],o||(i=[P(r,"change",n[3]),P(r,"change",(function(){a(n[1])&&n[1].apply(this,arguments)}))],o=!0)},p(e,[t]){n=e,C(r,u=X(l,[{class:c},4&t&&n[2],{type:"checkbox"}])),1&t&&(r.checked=n[0]),W(r,"svelte-1i76whx",!0)},i:e,o:e,d(e){e&&w(r),o=!1,s(i)}}}function Ze(e,n,r){const s=["checked","onChange"];let a=d(n,s),{checked:c}=n,{onChange:o}=n;return e.$$set=e=>{n=t(t({},n),m(e)),r(2,a=d(n,s)),"checked"in e&&r(0,c=e.checked),"onChange"in e&&r(1,o=e.onChange)},[c,o,a,function(){c=this.checked,r(0,c)}]}class Qe extends se{constructor(e){super(),re(this,e,Ze,He,c,{checked:0,onChange:1})}}function Ge(e){let t;function n(e,t){return"svgMono"==e[2]?Ve:Ye}let r=n(e),s=r(e);return{c(){s.c(),t=k()},m(e,n){s.m(e,n),g(e,t,n)},p(e,a){r===(r=n(e))&&s?s.p(e,a):(s.d(1),s=r(e),s&&(s.c(),s.m(t.parentNode,t)))},d(e){s.d(e),e&&w(t)}}}function Ye(e){let t,n,r;return{c(){t=b("img"),i(t.src,n=`/assets/images/${e[0].value}-icon.${e[2]}`)||I(t,"src",n),I(t,"alt",r=e[0].label)},m(e,n){g(e,t,n)},p(e,s){5&s&&!i(t.src,n=`/assets/images/${e[0].value}-icon.${e[2]}`)&&I(t,"src",n),1&s&&r!==(r=e[0].label)&&I(t,"alt",r)},d(e){e&&w(t)}}}function Ve(e){let t;function n(e,t){return"dark"==e[1]?Ke:Fe}let r=n(e),s=r(e);return{c(){s.c(),t=k()},m(e,n){s.m(e,n),g(e,t,n)},p(e,a){r===(r=n(e))&&s?s.p(e,a):(s.d(1),s=r(e),s&&(s.c(),s.m(t.parentNode,t)))},d(e){s.d(e),e&&w(t)}}}function Fe(e){let t,n,r;return{c(){t=b("img"),i(t.src,n=`/assets/images/${e[0].value}-icon.svg`)||I(t,"src",n),I(t,"alt",r=e[0].label)},m(e,n){g(e,t,n)},p(e,s){1&s&&!i(t.src,n=`/assets/images/${e[0].value}-icon.svg`)&&I(t,"src",n),1&s&&r!==(r=e[0].label)&&I(t,"alt",r)},d(e){e&&w(t)}}}function Ke(e){let t,n,r;return{c(){t=b("img"),i(t.src,n=`/assets/images/${e[0].value}-icon-light.svg`)||I(t,"src",n),I(t,"alt",r=e[0].label)},m(e,n){g(e,t,n)},p(e,s){1&s&&!i(t.src,n=`/assets/images/${e[0].value}-icon-light.svg`)&&I(t,"src",n),1&s&&r!==(r=e[0].label)&&I(t,"alt",r)},d(e){e&&w(t)}}}function Xe(t){let n,r=t[2]&&Ge(t);return{c(){r&&r.c(),n=k()},m(e,t){r&&r.m(e,t),g(e,n,t)},p(e,[t]){e[2]?r?r.p(e,t):(r=Ge(e),r.c(),r.m(n.parentNode,n)):r&&(r.d(1),r=null)},i:e,o:e,d(e){r&&r.d(e),e&&w(n)}}}function Je(e,t,n){let r,s,a,{details:c}=t;const o=je.subscribe((e=>n(3,s=e))),i=Be.subscribe((e=>n(4,a=e)));let l;return T((()=>{o(),i()})),e.$$set=e=>{"details"in e&&n(0,c=e.details)},e.$$.update=()=>{8&e.$$.dirty&&s&&("dark"==s.theme?n(1,l="dark"):"light"==s.theme?n(1,l="light"):window.matchMedia("(prefers-color-scheme: dark)").matches?n(1,l="dark"):n(1,l="light")),17&e.$$.dirty&&n(2,r=a.services[c.value].imageType)},[c,l,r,s,a]}class et extends se{constructor(e){super(),re(this,e,Je,Xe,c,{details:0})}}function tt(e){let t,n=e[3].services[e[0]].name+"";return{c(){t=x(n)},m(e,n){g(e,t,n)},p(e,r){9&r&&n!==(n=e[3].services[e[0]].name+"")&&function(e,t){t=""+t,e.data!==t&&(e.data=t)}(t,n)},d(e){e&&w(t)}}}function nt(e){let t,n,r,a,c,o,i,l,u,h,p,$,m,d;return n=new et({props:{details:{value:e[0],label:e[3].services[e[0]].name}}}),a=new _e({props:{$$slots:{default:[tt]},$$scope:{ctx:e}}}),i=new Qe({props:{class:"margin margin_"+document.body.dir,label:"Enable",checked:e[2][e[0]].enabled,onChange:e[6]}}),u=new Se({props:{class:"interactive"}}),u.$on("click",e[7]),p=new Ee({props:{class:"interactive"}}),p.$on("click",e[8]),{c(){t=b("div"),J(n.$$.fragment),r=y(),J(a.$$.fragment),c=y(),o=b("div"),J(i.$$.fragment),l=y(),J(u.$$.fragment),h=y(),J(p.$$.fragment),I(t,"class","interactive margin margin_"+document.body.dir+" svelte-q238x3"),I(o,"class","svelte-q238x3")},m(s,w){g(s,t,w),ee(n,t,null),f(t,r),ee(a,t,null),g(s,c,w),g(s,o,w),ee(i,o,null),f(o,l),ee(u,o,null),f(o,h),ee(p,o,null),$=!0,m||(d=[P(t,"keydown",null),P(t,"click",e[5])],m=!0)},p(e,t){const r={};9&t&&(r.details={value:e[0],label:e[3].services[e[0]].name}),n.$set(r);const s={};2057&t&&(s.$$scope={dirty:t,ctx:e}),a.$set(s);const c={};5&t&&(c.checked=e[2][e[0]].enabled),5&t&&(c.onChange=e[6]),i.$set(c)},i(e){$||(F(n.$$.fragment,e),F(a.$$.fragment,e),F(i.$$.fragment,e),F(u.$$.fragment,e),F(p.$$.fragment,e),$=!0)},o(e){K(n.$$.fragment,e),K(a.$$.fragment,e),K(i.$$.fragment,e),K(u.$$.fragment,e),K(p.$$.fragment,e),$=!1},d(e){e&&w(t),te(n),te(a),e&&w(c),e&&w(o),te(i),te(u),te(p),m=!1,s(d)}}}function rt(e){let t,n;return t=new ke({props:{$$slots:{default:[nt]},$$scope:{ctx:e}}}),{c(){J(t.$$.fragment)},m(e,r){ee(t,e,r),n=!0},p(e,[n]){const r={};2063&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(F(t.$$.fragment,e),n=!0)},o(e){K(t.$$.fragment,e),n=!1},d(e){te(t,e)}}}function st(e,t,n){const r=window.browser||window.chrome;let s,a;const c=je.subscribe((e=>n(2,s=e))),o=Be.subscribe((e=>n(3,a=e)));T((()=>{c(),o()}));let{serviceKey:i}=t,{url:l}=t;return e.$$set=e=>{"serviceKey"in e&&n(0,i=e.serviceKey),"url"in e&&n(1,l=e.url)},[i,l,s,a,r,()=>r.tabs.create({url:a.services[i].url},(()=>{window.close()})),e=>{n(2,s[i].enabled=e.target.checked,s),je.set(s)},async()=>r.tabs.update({url:await ve.switchInstance(l,i)},(()=>{window.close()})),()=>r.tabs.create({url:r.runtime.getURL(`pages/options/index.html#services:${i}`)},(()=>{window.close()}))]}class at extends se{constructor(e){super(),re(this,e,st,rt,c,{serviceKey:0,url:1})}}function ct(n){let r,s,a=[n[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"20px"},{viewBox:"0 -960 960 960"},{width:"20px"},{fill:"currentColor"}],c={};for(let e=0;e<a.length;e+=1)c=t(c,a[e]);return{c(){r=v("svg"),s=v("path"),I(s,"d","M144-144v-178l342-342-54-53 51-51 72 72 110.22-110.22q4.45-4.45 11.11-7.11Q683-816 691-816t15 2.5q7 2.5 12 7.5l87 88q4.55 5.83 7.27 12.64 2.73 6.8 2.73 14.58t-2.66 14.44q-2.67 6.66-7.11 11.1L696-556l72 73-51 51-54-54-341 342H144Zm72-72h76l320-320-75-76-321 320v76Zm424-385 90-91-38-39-91 90 39 40Zm0 0-39-40 39 40Z"),q(r,c)},m(e,t){g(e,r,t),f(r,s)},p(e,[t]){q(r,c=X(a,[1&t&&e[0],{xmlns:"http://www.w3.org/2000/svg"},{height:"20px"},{viewBox:"0 -960 960 960"},{width:"20px"},{fill:"currentColor"}]))},i:e,o:e,d(e){e&&w(r)}}}function ot(e,n,r){const s=[];let a=d(n,s);return e.$$set=e=>{n=t(t({},n),m(e)),r(0,a=d(n,s))},[a]}class it extends se{constructor(e){super(),re(this,e,ot,ct,c,{})}}function lt(e,t,n){const r=e.slice();return r[21]=t[n],r}function ut(e){let t,n;return t=new ke({props:{class:"interactive",$$slots:{default:[pt]},$$scope:{ctx:e}}}),t.$on("click",e[10]),{c(){J(t.$$.fragment)},m(e,r){ee(t,e,r),n=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(F(t.$$.fragment,e),n=!0)},o(e){K(t.$$.fragment,e),n=!1},d(e){te(t,e)}}}function ht(t){let n,r=(t[8].i18n.getMessage("redirect")||"Redirect")+"";return{c(){n=x(r)},m(e,t){g(e,n,t)},p:e,d(e){e&&w(n)}}}function pt(e){let t,n,r,s;return t=new _e({props:{class:"margin",$$slots:{default:[ht]},$$scope:{ctx:e}}}),r=new Le({}),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function $t(e){let t,n,r,s;const a=[dt,mt],c=[];function o(e,t){return e[0][e[5]].length>1?0:1}return t=o(e),n=c[t]=a[t](e),{c(){n.c(),r=k()},m(e,n){c[t].m(e,n),g(e,r,n),s=!0},p(e,s){let i=t;t=o(e),t===i?c[t].p(e,s):(Y(),K(c[i],1,1,(()=>{c[i]=null})),V(),n=c[t],n?n.p(e,s):(n=c[t]=a[t](e),n.c()),F(n,1),n.m(r.parentNode,r))},i(e){s||(F(n),s=!0)},o(e){K(n),s=!1},d(e){c[t].d(e),e&&w(r)}}}function mt(e){let t,n,r,s;return t=new ke({props:{class:"interactive "+(e[7]?"disabled":""),$$slots:{default:[gt]},$$scope:{ctx:e}}}),t.$on("click",e[13]),r=new ke({props:{class:"interactive "+(e[7]?"disabled":""),$$slots:{default:[bt]},$$scope:{ctx:e}}}),r.$on("click",e[14]),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const s={};128&n&&(s.class="interactive "+(e[7]?"disabled":"")),16777216&n&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const a={};128&n&&(a.class="interactive "+(e[7]?"disabled":"")),16777216&n&&(a.$$scope={dirty:n,ctx:e}),r.$set(a)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function dt(e){let t,n,r,s=e[2]&&vt(e);return n=new ke({props:{class:"interactive",$$slots:{default:[Pt]},$$scope:{ctx:e}}}),n.$on("click",e[12]),{c(){s&&s.c(),t=y(),J(n.$$.fragment)},m(e,a){s&&s.m(e,a),g(e,t,a),ee(n,e,a),r=!0},p(e,r){e[2]?s?(s.p(e,r),4&r&&F(s,1)):(s=vt(e),s.c(),F(s,1),s.m(t.parentNode,t)):s&&(Y(),K(s,1,1,(()=>{s=null})),V());const a={};16777216&r&&(a.$$scope={dirty:r,ctx:e}),n.$set(a)},i(e){r||(F(s),F(n.$$.fragment,e),r=!0)},o(e){K(s),K(n.$$.fragment,e),r=!1},d(e){s&&s.d(e),e&&w(t),te(n,e)}}}function ft(t){let n,r,s,a=(t[8].i18n.getMessage("remove")||"Remove")+"",c=(t[8].i18n.getMessage("autoPickInstance")||"Auto Pick Instance")+"";return{c(){n=x(a),r=x("\n +\n "),s=x(c)},m(e,t){g(e,n,t),g(e,r,t),g(e,s,t)},p:e,d(e){e&&w(n),e&&w(r),e&&w(s)}}}function gt(e){let t,n,r,s;return t=new _e({props:{class:"margin",$$slots:{default:[ft]},$$scope:{ctx:e}}}),r=new it({}),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function wt(t){let n,r=(t[8].i18n.getMessage("autoPickInstance")||"Auto Pick Instance")+"";return{c(){n=x(r)},m(e,t){g(e,n,t)},p:e,d(e){e&&w(n)}}}function bt(e){let t,n,r,s;return t=new _e({props:{class:"margin",$$slots:{default:[wt]},$$scope:{ctx:e}}}),r=new it({}),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function vt(e){let t,n;return t=new ke({props:{class:"interactive",$$slots:{default:[yt]},$$scope:{ctx:e}}}),t.$on("click",e[11]),{c(){J(t.$$.fragment)},m(e,r){ee(t,e,r),n=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){n||(F(t.$$.fragment,e),n=!0)},o(e){K(t.$$.fragment,e),n=!1},d(e){te(t,e)}}}function xt(t){let n,r=(t[8].i18n.getMessage("switchInstance")||"Switch Instance")+"";return{c(){n=x(r)},m(e,t){g(e,n,t)},p:e,d(e){e&&w(n)}}}function yt(e){let t,n,r,s;return t=new _e({props:{class:"margin",$$slots:{default:[xt]},$$scope:{ctx:e}}}),r=new Se({}),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function kt(t){let n,r,s,a=(t[8].i18n.getMessage("remove")||"Remove")+"",c=(t[8].i18n.getMessage("switchInstance")||"Switch Instance")+"";return{c(){n=x(a),r=x("\n +\n "),s=x(c)},m(e,t){g(e,n,t),g(e,r,t),g(e,s,t)},p:e,d(e){e&&w(n),e&&w(r),e&&w(s)}}}function Pt(e){let t,n,r,s;return t=new _e({props:{class:"margin",$$slots:{default:[kt]},$$scope:{ctx:e}}}),r=new Se({}),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function It(e){let t,n,r,s;return t=new ke({props:{class:"interactive",$$slots:{default:[Ct]},$$scope:{ctx:e}}}),t.$on("click",e[15]),r=new ke({props:{class:"interactive",$$slots:{default:[Wt]},$$scope:{ctx:e}}}),r.$on("click",e[16]),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const s={};16777216&n&&(s.$$scope={dirty:n,ctx:e}),t.$set(s);const a={};16777216&n&&(a.$$scope={dirty:n,ctx:e}),r.$set(a)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function _t(t){let n,r=(t[8].i18n.getMessage("copyOriginal")||"Copy Original")+"";return{c(){n=x(r)},m(e,t){g(e,n,t)},p:e,d(e){e&&w(n)}}}function Ct(e){let t,n,r,s;return t=new _e({props:{class:"margin",$$slots:{default:[_t]},$$scope:{ctx:e}}}),r=new qe({}),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function qt(t){let n,r=t[8].i18n.getMessage("redirectToOriginal")+"";return{c(){n=x(r)},m(e,t){g(e,n,t)},p:e,d(e){e&&w(n)}}}function Wt(e){let t,n,r,s;return t=new _e({props:{class:"margin",$$slots:{default:[qt]},$$scope:{ctx:e}}}),r=new Me({}),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function Mt(e){let t;return{c(){t=b("hr")},m(e,n){g(e,t,n)},d(e){e&&w(t)}}}function Rt(e){let t,n,r,s;return t=new at({props:{serviceKey:e[6],url:e[1]}}),{c(){J(t.$$.fragment),n=y(),r=b("hr")},m(e,a){ee(t,e,a),g(e,n,a),g(e,r,a),s=!0},p(e,n){const r={};64&n&&(r.serviceKey=e[6]),2&n&&(r.url=e[1]),t.$set(r)},i(e){s||(F(t.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),e&&w(r)}}}function Lt(e){let t,n;return t=new at({props:{serviceKey:e[21],url:e[1]}}),{c(){J(t.$$.fragment)},m(e,r){ee(t,e,r),n=!0},p(e,n){const r={};1&n&&(r.serviceKey=e[21]),2&n&&(r.url=e[1]),t.$set(r)},i(e){n||(F(t.$$.fragment,e),n=!0)},o(e){K(t.$$.fragment,e),n=!1},d(e){te(t,e)}}}function Tt(e){let t,n,r=e[6]!==e[21]&&Lt(e);return{c(){r&&r.c(),t=k()},m(e,s){r&&r.m(e,s),g(e,t,s),n=!0},p(e,n){e[6]!==e[21]?r?(r.p(e,n),65&n&&F(r,1)):(r=Lt(e),r.c(),F(r,1),r.m(t.parentNode,t)):r&&(Y(),K(r,1,1,(()=>{r=null})),V())},i(e){n||(F(r),n=!0)},o(e){K(r),n=!1},d(e){r&&r.d(e),e&&w(t)}}}function Ot(t){let n,r=t[8].i18n.getMessage("settings")+"";return{c(){n=x(r)},m(e,t){g(e,n,t)},p:e,d(e){e&&w(n)}}}function St(e){let t,n,r,s;return t=new _e({props:{class:"margin",$$slots:{default:[Ot]},$$scope:{ctx:e}}}),r=new Ee({}),{c(){J(t.$$.fragment),n=y(),J(r.$$.fragment)},m(e,a){ee(t,e,a),g(e,n,a),ee(r,e,a),s=!0},p(e,n){const r={};16777216&n&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(F(t.$$.fragment,e),F(r.$$.fragment,e),s=!0)},o(e){K(t.$$.fragment,e),K(r.$$.fragment,e),s=!1},d(e){te(t,e),e&&w(n),te(r,e)}}}function zt(e){let t,n,r,s,a,c,o,i,l,u,h,p=e[4]&&ut(e),$=e[6]&&e[5]&&$t(e),m=e[3]&&It(e),d=(e[4]||e[2]||e[3])&&Mt(),v=e[6]&&Rt(e),x=e[0].popupServices,k=[];for(let t=0;t<x.length;t+=1)k[t]=Tt(lt(e,x,t));const P=e=>K(k[e],1,1,(()=>{k[e]=null}));return u=new ke({props:{class:"interactive",$$slots:{default:[St]},$$scope:{ctx:e}}}),u.$on("click",e[17]),{c(){t=b("div"),p&&p.c(),n=y(),$&&$.c(),r=y(),m&&m.c(),s=y(),d&&d.c(),a=y(),v&&v.c(),c=y();for(let e=0;e<k.length;e+=1)k[e].c();o=y(),i=b("hr"),l=y(),J(u.$$.fragment),I(t,"class",document.body.dir)},m(e,w){g(e,t,w),p&&p.m(t,null),f(t,n),$&&$.m(t,null),f(t,r),m&&m.m(t,null),f(t,s),d&&d.m(t,null),f(t,a),v&&v.m(t,null),f(t,c);for(let e=0;e<k.length;e+=1)k[e]&&k[e].m(t,null);f(t,o),f(t,i),f(t,l),ee(u,t,null),h=!0},p(e,[i]){if(e[4]?p?(p.p(e,i),16&i&&F(p,1)):(p=ut(e),p.c(),F(p,1),p.m(t,n)):p&&(Y(),K(p,1,1,(()=>{p=null})),V()),e[6]&&e[5]?$?($.p(e,i),96&i&&F($,1)):($=$t(e),$.c(),F($,1),$.m(t,r)):$&&(Y(),K($,1,1,(()=>{$=null})),V()),e[3]?m?(m.p(e,i),8&i&&F(m,1)):(m=It(e),m.c(),F(m,1),m.m(t,s)):m&&(Y(),K(m,1,1,(()=>{m=null})),V()),e[4]||e[2]||e[3]?d||(d=Mt(),d.c(),d.m(t,a)):d&&(d.d(1),d=null),e[6]?v?(v.p(e,i),64&i&&F(v,1)):(v=Rt(e),v.c(),F(v,1),v.m(t,c)):v&&(Y(),K(v,1,1,(()=>{v=null})),V()),67&i){let n;for(x=e[0].popupServices,n=0;n<x.length;n+=1){const r=lt(e,x,n);k[n]?(k[n].p(r,i),F(k[n],1)):(k[n]=Tt(r),k[n].c(),F(k[n],1),k[n].m(t,o))}for(Y(),n=x.length;n<k.length;n+=1)P(n);V()}const l={};16777216&i&&(l.$$scope={dirty:i,ctx:e}),u.$set(l)},i(e){if(!h){F(p),F($),F(m),F(v);for(let e=0;e<x.length;e+=1)F(k[e]);F(u.$$.fragment,e),h=!0}},o(e){K(p),K($),K(m),K(v),k=k.filter(Boolean);for(let e=0;e<k.length;e+=1)K(k[e]);K(u.$$.fragment,e),h=!1},d(e){e&&w(t),p&&p.d(),$&&$.d(),m&&m.d(),d&&d.d(),v&&v.d(),function(e,t){for(let n=0;n<e.length;n+=1)e[n]&&e[n].d(t)}(k,e),te(u)}}}function At(e,t,n){const r=window.browser||window.chrome;let s;const a=je.subscribe((e=>n(0,s=e))),c=Be.subscribe((e=>e));let o,i,l,u,h,p;T((()=>{a(),c()})),r.tabs.query({active:!0,currentWindow:!0},(async e=>{e[0].url&&(n(1,o=new URL(e[0].url)),ve.switchInstance(o).then((e=>n(2,i=e))),ve.reverse(o).then((e=>n(3,l=e))),ve.redirectAsync(o,"main_frame",null,null,!1,!0).then((e=>n(4,u=e))),ve.computeServiceFrontend(o).then((e=>n(6,({service:p,frontend:h}=e),p,n(5,h)))))}));let $=!1;async function m(){n(7,$=!0);const e=(await le.getList(s))[h].clearnet,t=await le.autoPickInstance(e,o);s[h].push(t),je.set(s),n(7,$=!1)}return[s,o,i,l,u,h,p,$,r,m,()=>{r.tabs.query({active:!0,currentWindow:!0},(e=>{r.runtime.sendMessage({message:"redirect",tabId:e[0].id},(()=>{r.tabs.update({url:u},(()=>{window.close()}))}))}))},async()=>r.tabs.update({url:i},(()=>{window.close()})),async()=>{const e=s[h].findIndex((e=>o.href.startsWith(e)));s[h].splice(e,1),je.set(s);const t=await ve.switchInstance(o,p);r.tabs.update({url:t},(()=>{window.close()}))},async()=>{const e=s[h].findIndex((e=>o.href.startsWith(e)));s[h].splice(e,1),je.set(s),await m(),r.tabs.update({url:await ve.switchInstance(o,p)},(()=>{window.close()}))},async()=>{await m(),r.tabs.update({url:await ve.switchInstance(o,p)},(()=>{window.close()}))},()=>ve.copyRaw(o),()=>{r.tabs.query({active:!0,currentWindow:!0},(e=>{r.runtime.sendMessage({message:"reverse",tabId:e[0].id},(()=>{r.tabs.update({url:l},(()=>{window.close()}))}))}))},()=>r.tabs.create({url:r.runtime.getURL("pages/options/index.html")},(()=>{window.close()}))]}class Et extends se{constructor(e){super(),re(this,e,At,zt,c,{})}}function Ut(t){let n;return{c(){n=b("p"),n.textContent="Loading..."},m(e,t){g(e,n,t)},p:e,i:e,o:e,d(e){e&&w(n)}}}function Nt(e){let t,n,r;return n=new Et({}),{c(){t=b("div"),J(n.$$.fragment),I(t,"class","main svelte-7wrfnp"),I(t,"dir","auto"),I(t,"style",e[2])},m(e,s){g(e,t,s),ee(n,t,null),r=!0},p(e,n){(!r||4&n)&&I(t,"style",e[2])},i(e){r||(F(n.$$.fragment,e),r=!0)},o(e){K(n.$$.fragment,e),r=!1},d(e){e&&w(t),te(n)}}}function jt(e){let t,n,r,s;const a=[Nt,Ut],c=[];function o(e,t){return e[0]&&e[1]?0:1}return t=o(e),n=c[t]=a[t](e),{c(){n.c(),r=k()},m(e,n){c[t].m(e,n),g(e,r,n),s=!0},p(e,[s]){let i=t;t=o(e),t===i?c[t].p(e,s):(Y(),K(c[i],1,1,(()=>{c[i]=null})),V(),n=c[t],n?n.p(e,s):(n=c[t]=a[t](e),n.c()),F(n,1),n.m(r.parentNode,r))},i(e){s||(F(n),s=!0)},o(e){K(n),s=!1},d(e){c[t].d(e),e&&w(r)}}}function Bt(e,t,n){const r=window.browser||window.chrome;let s;const a=je.subscribe((e=>{e&&(n(0,s=e),r.storage.local.set({options:e}))}));let c;const o=Be.subscribe((e=>n(1,c=e)));var i;let l;return T((()=>{a(),o()})),i=async()=>{let e=await le.getOptions();e||(await ve.initDefaults(),e=await le.getOptions()),je.set(e),Be.set(await le.getConfig())},L().$$.on_mount.push(i),De.subscribe((e=>e)),e.$$.update=()=>{1&e.$$.dirty&&s&&n(2,l=le.style(s,window))},[s,c,l]}const Dt=new class extends se{constructor(e){super(),re(this,e,Bt,jt,c,{})}}({target:document.body});return Dt}(); +//# sourceMappingURL=bundle.js.map diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.js.map b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/build/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundle.js","sources":["../../../../node_modules/svelte/internal/index.mjs","../../../assets/javascripts/utils.js","../../../assets/javascripts/services.js","../../popup_src/components/Row.svelte","../../components/Label.svelte","../../icons/CopyIcon.svelte","../../icons/RedirectToOriginalIcon.svelte","../../icons/RedirectIcon.svelte","../../icons/SwitchInstanceIcon.svelte","../../icons/SettingsIcon.svelte","../../../../node_modules/svelte/store/index.mjs","../../popup_src/stores.js","../../components/Checkbox.svelte","../../popup_src/components/ServiceIcon.svelte","../../popup_src/components/Switch.svelte","../../icons/AutoPickIcon.svelte","../../popup_src/Buttons.svelte","../../popup_src/App.svelte","../../popup_src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\nfunction split_css_unit(value) {\n const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n constructor(options) {\n this.options = options;\n this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n }\n observe(element, listener) {\n this._listeners.set(element, listener);\n this._getObserver().observe(element, this.options);\n return () => {\n this._listeners.delete(element);\n this._observer.unobserve(element); // this line can probably be removed\n };\n }\n _getObserver() {\n var _a;\n return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n var _a;\n for (const entry of entries) {\n ResizeObserverSingleton.entries.set(entry.target, entry);\n (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n }\n }));\n }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n let children = target.childNodes;\n // If target is <head>, there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n return style.sheet;\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction comment(content) {\n return document.createComment(content);\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_immediate_propagation(fn) {\n return function (event) {\n event.stopImmediatePropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data_map(node, data_map) {\n Object.keys(data_map).forEach((key) => {\n set_custom_element_data(node, key, data_map[key]);\n });\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction set_dynamic_element_data(tag) {\n return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction init_binding_group(group) {\n let _inputs;\n return {\n /* push */ p(...inputs) {\n _inputs = inputs;\n _inputs.forEach(input => group.push(input));\n },\n /* remove */ r() {\n _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n }\n };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n let _group = get_binding_group(group);\n let _inputs;\n function get_binding_group(group) {\n for (let i = 0; i < indexes.length; i++) {\n group = group[indexes[i]] = group[indexes[i]] || [];\n }\n return group;\n }\n function push() {\n _inputs.forEach(input => _group.push(input));\n }\n function remove() {\n _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n }\n return {\n /* update */ u(new_indexes) {\n indexes = new_indexes;\n const new_group = get_binding_group(group);\n if (new_group !== _group) {\n remove();\n _group = new_group;\n push();\n }\n },\n /* push */ p(...inputs) {\n _inputs = inputs;\n push();\n },\n /* remove */ r: remove\n };\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n node.data = '' + data;\n return undefined;\n }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable(text, data);\n }\n else {\n set_data(text, data);\n }\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value == null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value, mounting) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n if (!mounting || value !== undefined) {\n select.selectedIndex = -1; // no option should be selected\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked');\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n // see https://github.com/sveltejs/svelte/issues/4233\n fn();\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n const result = [];\n let started = 0;\n for (const node of head.childNodes) {\n if (node.nodeType === 8 /* comment node */) {\n const comment = node.textContent.trim();\n if (comment === `HEAD_${nodeId}_END`) {\n started -= 1;\n result.push(node);\n }\n else if (comment === `HEAD_${nodeId}_START`) {\n started += 1;\n result.push(node);\n }\n }\n else if (started > 0) {\n result.push(node);\n }\n }\n return result;\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n /** #7364 target for <template> may be provided as #document-fragment(11) */\n else\n this.e = element((target.nodeType === 11 ? 'TEMPLATE' : target.nodeName));\n this.t = target.tagName !== 'TEMPLATE' ? target : target.content;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes, is_svg = false) {\n super(is_svg);\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\nfunction construct_svelte_component(component, props) {\n return new component(props);\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n managed_styles.set(doc, info);\n return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n if (!rules[name]) {\n rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n managed_styles.forEach(info => {\n const { ownerNode } = info.stylesheet;\n // there is no ownerNode if it runs on jsdom.\n if (ownerNode)\n detach(ownerNode);\n });\n managed_styles.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs#run-time-svelte-beforeupdate\n */\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs#run-time-svelte-onmount\n */\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n */\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs#run-time-svelte-ondestroy\n */\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * https://svelte.dev/docs#run-time-svelte-createeventdispatcher\n */\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail, { cancelable = false } = {}) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail, { cancelable });\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n return !event.defaultPrevented;\n }\n return true;\n };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-setcontext\n */\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-getcontext\n */\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs#run-time-svelte-getallcontexts\n */\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-hascontext\n */\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nlet render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n// for afterUpdates called during the initial onMount, which are called in\n// reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n// dirty_components array and will cause a reentrant call to flush(). Because\n// the flush index is kept outside the function, the reentrant call will pick\n// up where the earlier call left off and go through all dirty components. The\n// current_component value is saved and restored so that the reentrant call will\n// not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n// callback called a second time; the seen_callbacks set, outside the flush()\n// function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n // Do not reenter flush while dirty components are updated, as this can\n // result in an infinite loop. Instead, let the inner flush handle it.\n // Reentrancy is ok afterwards for bindings etc.\n if (flushidx !== 0) {\n return;\n }\n const saved_component = current_component;\n do {\n // first, call beforeUpdate functions\n // and update components\n try {\n while (flushidx < dirty_components.length) {\n const component = dirty_components[flushidx];\n flushidx++;\n set_current_component(component);\n update(component.$$);\n }\n }\n catch (e) {\n // reset dirty state to not end up in a deadlocked state and then rethrow\n dirty_components.length = 0;\n flushidx = 0;\n throw e;\n }\n set_current_component(null);\n dirty_components.length = 0;\n flushidx = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n seen_callbacks.clear();\n set_current_component(saved_component);\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n */\nfunction flush_render_callbacks(fns) {\n const filtered = [];\n const targets = [];\n render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));\n targets.forEach((c) => c());\n render_callbacks = filtered;\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n else if (callback) {\n callback();\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n const options = { direction: 'in' };\n let config = fn(node, params, options);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config(options);\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n const options = { direction: 'out' };\n let config = fn(node, params, options);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n const options = { direction: 'both' };\n let config = fn(node, params, options);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n const updates = [];\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n // defer updates until all the DOM shuffling is done\n updates.push(() => block.p(child_ctx, dirty));\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n run_all(updates);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\nconst _boolean_attributes = [\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n];\n/**\n * List of HTML boolean attributes (e.g. `<input disabled>`).\n * Source: https://html.spec.whatwg.org/multipage/indices.html\n */\nconst boolean_attributes = new Set([..._boolean_attributes]);\n\n/** regex of all html void element names */\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n const attributes = Object.assign({}, ...args);\n if (attrs_to_add) {\n const classes_to_add = attrs_to_add.classes;\n const styles_to_add = attrs_to_add.styles;\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n if (styles_to_add) {\n if (attributes.style == null) {\n attributes.style = style_object_to_string(styles_to_add);\n }\n else {\n attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n }\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n const style_object = {};\n for (const individual_style of style_attribute.split(';')) {\n const colon_index = individual_style.indexOf(':');\n const name = individual_style.slice(0, colon_index).trim();\n const value = individual_style.slice(colon_index + 1).trim();\n if (!name)\n continue;\n style_object[name] = value;\n }\n for (const name in style_directive) {\n const value = style_directive[name];\n if (value) {\n style_object[name] = value;\n }\n else {\n delete style_object[name];\n }\n }\n return style_object;\n}\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n/**\n * Note: this method is performance sensitive and has been optimized\n * https://github.com/sveltejs/svelte/pull/5701\n */\nfunction escape(value, is_attr = false) {\n const str = String(value);\n const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;\n pattern.lastIndex = 0;\n let escaped = '';\n let last = 0;\n while (pattern.test(str)) {\n const i = pattern.lastIndex - 1;\n const ch = str[i];\n escaped += str.substring(last, i) + (ch === '&' ? '&amp;' : (ch === '\"' ? '&quot;' : '&lt;'));\n last = i + 1;\n }\n return escaped + str.substring(last);\n}\nfunction escape_attribute_value(value) {\n // keep booleans, null, and undefined for the sake of `spread`\n const should_escape = typeof value === 'string' || (value && typeof value === 'object');\n return should_escape ? escape(value, true) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules. Otherwise you may need to fix a <${name}>.`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n const assignment = (boolean && value === true) ? '' : `=\"${escape(value, true)}\"`;\n return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n return Object.keys(style_object)\n .filter(key => style_object[key])\n .map(key => `${key}: ${escape_attribute_value(style_object[key])};`)\n .join(' ');\n}\nfunction add_styles(style_object) {\n const styles = style_object_to_string(style_object);\n return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n // if the component was destroyed immediately\n // it will update the `$$.on_destroy` reference to `null`.\n // the destructured on_destroy may still reference to the old array\n if (component.$$.on_destroy) {\n component.$$.on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n flush_render_callbacks($$.after_update);\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: [],\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n if (has_stop_immediate_propagation)\n modifiers.push('stopImmediatePropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_contenteditable_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_maybe_contenteditable_dev(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable_dev(text, data);\n }\n else {\n set_data_dev(text, data);\n }\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nfunction validate_dynamic_element(tag) {\n const is_string = typeof tag === 'string';\n if (tag && !is_string) {\n throw new Error('<svelte:element> expects \"this\" attribute to be a string.');\n }\n}\nfunction validate_void_dynamic_element(tag) {\n if (tag && is_void(tag)) {\n console.warn(`<svelte:element this=\"${tag}\"> is self-closing and cannot have content.`);\n }\n}\nfunction construct_svelte_component_dev(component, props) {\n const error_message = 'this={...} of <svelte:component> should specify a Svelte component.';\n try {\n const instance = new component(props);\n if (!instance.$$ || !instance.$set || !instance.$on || !instance.$destroy) {\n throw new Error(error_message);\n }\n return instance;\n }\n catch (err) {\n const { message } = err;\n if (typeof message === 'string' && message.indexOf('is not a constructor') !== -1) {\n throw new Error(error_message);\n }\n else {\n throw err;\n }\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, ResizeObserverSingleton, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_iframe_resize_listener, add_location, add_render_callback, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_comment, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, comment, component_subscribe, compute_rest_props, compute_slots, construct_svelte_component, construct_svelte_component_dev, contenteditable_truthy_values, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, flush_render_callbacks, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, head_selector, identity, init, init_binding_group, init_binding_group_dynamic, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, resize_observer_border_box, resize_observer_content_box, resize_observer_device_pixel_content_box, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_custom_element_data_map, set_data, set_data_contenteditable, set_data_contenteditable_dev, set_data_dev, set_data_maybe_contenteditable, set_data_maybe_contenteditable_dev, set_dynamic_element_data, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, split_css_unit, spread, src_url_equal, start_hydrating, stop_immediate_propagation, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","window.browser = window.browser || window.chrome\n\n/**\n * @param {Array.<T>} instances\n * @returns {T}\n */\nfunction getRandomInstance(instances) {\n return instances[~~(instances.length * Math.random())]\n}\n\n/**\n * @param {string} currentInstanceUrl\n * @param {Array.<T>} instances\n * @returns {T}\n */\nfunction getNextInstance(currentInstanceUrl, instances) {\n const currentInstanceIndex = instances.indexOf(currentInstanceUrl)\n if (currentInstanceIndex === -1) return getRandomInstance(instances)\n const nextInstanceIndex = (currentInstanceIndex + 1) % instances.length\n return instances[nextInstanceIndex]\n}\n\n/**\n * @param {URL} url\n */\nfunction protocolHost(url) {\n const pathname = url.pathname.replace(/\\/$/, \"\")\n\n // workaround\n if (pathname == \"/TekstoLibre\" && url.host.endsWith(\"github.io\"))\n return `${url.protocol}//${url.host}${pathname.slice(0, -1)}`\n\n if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}${pathname}`\n\n return `${url.protocol}//${url.host}${pathname}`\n}\n\n/**\n * @typedef FrontendInfo\n * @prop {boolean} instanceList\n * @prop {string} name\n * @prop {string} url\n */\n\n/**\n * @typedef {Object} Service\n * @prop {Object.<string, FrontendInfo>} frontends\n * @prop {Object} options\n */\n\n/**\n * @typedef {Object} Config\n * @prop {Object.<string, Service>} services\n */\n\n/**\n * @returns {Promise<Config>}\n */\nfunction getConfig() {\n return new Promise(resolve => {\n fetch(\"/config.json\")\n .then(response => response.text())\n .then(json => {\n resolve(JSON.parse(json))\n return\n })\n })\n}\n\n/**\n * @typedef {Object} Option\n * @prop {string} frontend\n */\n\n/**\n * @returns {Promise<Object.<string, Option | string[]>>}\n */\nfunction getOptions() {\n return new Promise(resolve => browser.storage.local.get(\"options\", r => resolve(r.options)))\n}\n\nfunction getPingCache() {\n return new Promise(resolve => browser.storage.local.get(\"pingCache\", r => resolve(r.pingCache ?? {})))\n}\n\nfunction getBlacklist(options) {\n return new Promise(resolve => {\n let url\n if (options.fetchInstances == \"github\")\n url = \"https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json\"\n else if (options.fetchInstances == \"codeberg\")\n url = \"https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json\"\n else return resolve(\"disabled\")\n const http = new XMLHttpRequest()\n http.open(\"GET\", url, true)\n http.onreadystatechange = () => {\n if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) resolve(JSON.parse(http.responseText))\n }\n http.onerror = () => resolve()\n http.ontimeout = () => resolve()\n http.send(null)\n })\n}\n\nfunction getList(options) {\n return new Promise(resolve => {\n let url\n if (options.fetchInstances == \"github\")\n url = \"https://raw.githubusercontent.com/libredirect/instances/main/data.json\"\n else if (options.fetchInstances == \"codeberg\")\n url = \"https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json\"\n else return resolve(\"disabled\")\n const http = new XMLHttpRequest()\n http.open(\"GET\", url, true)\n http.onreadystatechange = () => {\n if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) return resolve(JSON.parse(http.responseText))\n }\n http.onerror = () => resolve()\n http.ontimeout = () => resolve()\n http.send(null)\n })\n}\n\n/**\n * @param {string} href\n */\nfunction pingOnce(href) {\n return new Promise(async resolve => {\n let started\n let http = new XMLHttpRequest()\n http.timeout = 5000\n http.ontimeout = () => resolve(5000)\n http.onerror = () => resolve()\n http.onreadystatechange = () => {\n if (http.readyState == 2) {\n if (http.status == 200) {\n let ended = new Date().getTime()\n http.abort()\n resolve(ended - started)\n } else {\n resolve(5000 + http.status)\n }\n }\n }\n http.open(\"GET\", `${href}?_=${new Date().getTime()}`, true)\n started = new Date().getTime()\n http.send(null)\n })\n}\n\n/**\n * @param {string} href\n */\nfunction ping(href) {\n return new Promise(async resolve => {\n let average = 0\n let time\n for (let i = 0; i < 3; i++) {\n time = await pingOnce(href)\n if (i == 0) continue\n if (time >= 5000) {\n resolve(time)\n return\n }\n average += time\n }\n average = parseInt(average / 3)\n resolve(average)\n })\n}\n\nfunction addressToLatLng(address) {\n const http = new XMLHttpRequest()\n http.open(\n \"GET\",\n `https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(address)}&format=json&limit=1`,\n false\n )\n http.send()\n if (http.status == 200) {\n const json = JSON.parse(http.responseText)[0]\n if (json) {\n return {\n coordinate: `${json.lat},${json.lon}`,\n boundingbox: `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}`,\n }\n }\n return {}\n }\n}\n\nfunction getQuery(url) {\n let query = \"\"\n if (url.searchParams.has(\"q\")) query = url.searchParams.get(\"q\")\n else if (url.searchParams.has(\"query\")) query = url.searchParams.has(\"query\")\n return query\n}\nfunction prefsEncoded(prefs) {\n return new URLSearchParams(prefs).toString()\n}\n\nfunction convertMapCentre(url) {\n let [lat, lon, zoom] = [null, null, null]\n const reg = url.pathname.match(/@(-?\\d[0-9.]*),(-?\\d[0-9.]*),(\\d{1,2})[.z]/)\n if (reg) {\n ;[, lon, lat, zoom] = reg\n } else if (url.searchParams.has(\"center\")) {\n // Set map centre if present\n ;[lat, lon] = url.searchParams.get(\"center\").split(\",\")\n zoom = url.searchParams.get(\"zoom\") ?? \"17\"\n }\n return { zoom, lon, lat }\n}\n\nexport function randomInstances(clearnet, n) {\n let instances = []\n if (n > clearnet.length) n = clearnet.length\n for (let i = 0; i < n; i++) {\n const randomNumber = Math.floor(Math.random() * clearnet.length)\n const randomInstance = clearnet[randomNumber]\n instances.push(randomInstance)\n }\n return instances\n}\n\nasync function autoPickInstance(clearnet, url) {\n if (url) {\n const i = clearnet.findIndex(instance => url.href.startsWith(instance))\n if (i >= 0) clearnet.splice(i, 1)\n }\n const random = randomInstances(clearnet, 5)\n const pings = await Promise.all([\n ...random.map(async instance => {\n return [instance, await ping(instance)]\n }),\n ])\n pings.sort((a, b) => a[1] - b[1])\n return pings[0][0]\n}\n\nexport function style(options, window) {\n const vars = cssVariables(options, window)\n return `--text: ${vars.text};\n --bg-main: ${vars.bgMain};\n --bg-secondary: ${vars.bgSecondary};\n --active: ${vars.active};\n --danger: ${vars.danger};\n --light-grey: ${vars.lightGrey};`\n}\n\nfunction cssVariables(options, window) {\n const dark = {\n text: \"#fff\",\n bgMain: \"#121212\",\n bgSecondary: \"#202020\",\n active: \"#fbc117\",\n danger: \"#f04141\",\n lightGrey: \"#c3c3c3\",\n }\n\n const light = {\n text: \"black\",\n bgMain: \"white\",\n bgSecondary: \"#e4e4e4\",\n active: \"#fb9817\",\n danger: \"#f04141\",\n lightGrey: \"#c3c3c3\",\n }\n if (options.theme == \"dark\") {\n return dark\n } else if (options.theme == \"light\") {\n return light\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n return dark\n } else {\n return light\n }\n}\n\nexport default {\n getRandomInstance,\n getNextInstance,\n protocolHost,\n getList,\n getBlacklist,\n getConfig,\n getOptions,\n getPingCache,\n ping,\n addressToLatLng,\n getQuery,\n prefsEncoded,\n convertMapCentre,\n randomInstances,\n style,\n autoPickInstance,\n}\n","import utils from \"./utils.js\"\n\nconst isChrome = browser.runtime.getBrowserInfo === undefined\nwindow.browser = window.browser || window.chrome\n\nlet config, options\n\nasync function init() {\n options = await utils.getOptions()\n config = await utils.getConfig()\n}\n\ninit()\nbrowser.storage.onChanged.addListener(init)\n\nfunction all(service, frontend, options, config) {\n let instances = []\n if (!frontend) {\n for (const frontend in config.services[service].frontends) {\n if (options[frontend]) {\n instances.push(...options[frontend])\n }\n }\n } else if (options[frontend]) {\n instances = options[frontend]\n }\n return instances\n}\n\n/**\n * @param {string} service\n * @param {URL} url\n * @param {{}} config\n * @param {{}} options\n * @param {string} frontend\n */\nfunction regexArray(service, url, config, options, frontend) {\n let targetList = config.services[service].targets\n if (frontend) {\n if (\n \"excludeTargets\" in config.services[service].frontends[frontend] &&\n (service !== \"search\" || !options[\"search\"].redirectGoogle)\n ) {\n targetList = targetList.filter(\n val => !config.services[service].frontends[frontend].excludeTargets.includes(targetList.indexOf(val))\n )\n }\n if (service === \"twitter\" && options[\"twitter\"].disableTwimg) {\n targetList = targetList.splice(2)\n }\n }\n for (const targetString in targetList) {\n const target = new RegExp(targetList[targetString])\n if (target.test(url.href)) return true\n }\n return false\n}\n\n/**\n * @param {URL} url\n * @param {string} frontend\n * @param {string} randomInstance\n * @param {string} type\n * @returns {undefined|string}\n */\nfunction rewrite(url, originUrl, frontend, randomInstance, type) {\n switch (frontend) {\n case \"hyperpipe\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}${url.pathname}${url.search}`.replace(/\\/search\\?q=.*/, searchQuery =>\n searchQuery.replace(\"?q=\", \"/\")\n )\n case \"searx\":\n case \"searxng\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}/${url.search}`\n case \"websurfx\":\n case \"whoogle\":\n for (const key of [...url.searchParams.keys()]) if (key !== \"q\") url.searchParams.delete(key)\n return `${randomInstance}/search${url.search}`\n case \"4get\": {\n const s = url.searchParams.get(\"q\")\n if (s !== null) return `${randomInstance}/web?s=${encodeURIComponent(s)}`\n return randomInstance\n }\n case \"librey\":\n for (const key in url.searchParams.keys()) if (key != \"q\") url.searchParams.delete(key)\n return `${randomInstance}/search.php${url.search}`\n case \"yattee\":\n url.searchParams.delete(\"si\")\n return url.href.replace(/^https?:\\/{2}/, \"yattee://\")\n case \"freetube\":\n url.searchParams.delete(\"si\")\n return \"freetube://\" + url.href\n case \"freetubePwa\":\n url.searchParams.delete(\"si\")\n return \"freetube://\" + url.href\n case \"poketube\": {\n url.searchParams.delete(\"si\")\n if (url.pathname.startsWith(\"/channel\")) {\n const reg = /\\/channel\\/(.*)\\/?$/.exec(url.pathname)\n if (reg) {\n const id = reg[1]\n return `${randomInstance}/channel?id=${id}${url.search}`\n }\n }\n if (/\\/@[a-z]+\\//.exec(url.pathname)) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"small\":\n case \"libMedium\":\n case \"freedium\":\n case \"scribe\": {\n const regex = url.hostname.match(/^(link|cdn-images-\\d+|.*)\\.medium\\.com/)\n if (regex && regex.length > 1) {\n const subdomain = regex[1]\n if (subdomain != \"link\" || !subdomain.startsWith(\"cdn-images\")) {\n return `${randomInstance}/@${subdomain}${url.pathname}${url.search}`\n }\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"translite\":\n case \"simplyTranslate\":\n return `${randomInstance}/${url.search}`\n case \"send\":\n case \"mozhi\":\n return randomInstance\n case \"libreTranslate\":\n return `${randomInstance}/${url.search.replace(\"sl\", \"source\").replace(\"tl\", \"target\").replace(\"text\", \"q\")}`\n case \"osm\": {\n if (originUrl && originUrl.host === \"earth.google.com\") return randomInstance\n\n let prefs = { layers: \"mapnik\" }\n\n let mapCentre = \"#\"\n const mapCentreData = utils.convertMapCentre(url)\n if (mapCentreData.zoom && mapCentreData.lon && mapCentreData.lat) {\n mapCentre = `#map=${mapCentreData.zoom}/${mapCentreData.lon}/${mapCentreData.lat}`\n }\n\n if (url.pathname.includes(\"/embed\")) {\n // https://www.google.com/maps/embed/v1/place?key=AIzaSyD4iE2xVSpkLLOXoyqT-RuPwURN3ddScAI&q=Eiffel+Tower,Paris+France\n const query = utils.getQuery(url)\n let { coordinate, boundingbox } = utils.addressToLatLng(query)\n prefs.bbox = boundingbox\n prefs.marker = coordinate\n return `${randomInstance}/export/embed.html?${utils.prefsEncoded(prefs)}`\n }\n\n if (url.pathname.includes(\"/dir\")) {\n if (url.searchParams.has(\"travelmode\")) {\n const travelModes = {\n driving: \"fossgis_osrm_car\",\n walking: \"fossgis_osrm_foot\",\n bicycling: \"fossgis_osrm_bike\",\n transit: \"fossgis_osrm_car\", // not implemented on OSM, default to car.\n }\n prefs.engine = travelModes[url.searchParams.get(\"travelmode\")]\n }\n const regex1 = /\\/dir\\/([^@/]+)\\/([^@/]+)\\/@-?\\d[0-9.]*,-?\\d[0-9.]*,\\d{1,2}[.z]/.exec(url.pathname)\n const regex2 = /\\/dir\\/([^@/]+)\\//.exec(url.pathname)\n if (regex1) {\n // https://www.google.com/maps/dir/92+Rue+Moncey,+69003+Lyon,+France/M%C3%A9dip%C3%B4le+Lyon-Villeurbanne/@45.760254,4.8486298,13z?travelmode=bicycling\n const origin = utils.addressToLatLng(decodeURIComponent(regex1[1])).coordinate ?? \"\"\n const destination = utils.addressToLatLng(decodeURIComponent(regex1[2])).coordinate ?? \"\"\n prefs.route = `${origin};${destination}`\n } else if (regex2) {\n // https://www.google.com/maps/dir/92+Rue+Moncey,+69003+Lyon,+France/@45.760254,4.8486298,13z?travelmode=bicycling\n const origin = utils.addressToLatLng(decodeURIComponent(regex2[1])).coordinate ?? \"\"\n prefs.route = `${origin};`\n } else {\n // https://www.google.com/maps/dir/?api=1&origin=Space+Needle+Seattle+WA&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling\n const origin = utils.addressToLatLng(url.searchParams.get(\"origin\")).coordinate ?? \"\"\n const destination = utils.addressToLatLng(url.searchParams.get(\"destination\")).coordinate ?? \"\"\n prefs.route = `${origin};${destination}`\n }\n return `${randomInstance}/directions?${utils.prefsEncoded(prefs)}${mapCentre}`\n }\n\n const placeRegex = /\\/place\\/(.*?)\\//\n if (url.pathname.match(placeRegex)) {\n // https://www.google.com/maps/place/H%C3%B4tel+de+Londres+Eiffel/@40.9845265,28.7081268,14z\n const query = url.pathname.match(placeRegex)[1]\n return `${randomInstance}/search?query=${query}${mapCentre}`\n }\n\n if (url.searchParams.has(\"ll\")) {\n // https://maps.google.com/?ll=38.882147,-76.99017\n const [mlat, mlon] = url.searchParams.get(\"ll\").split(\",\")\n return `${randomInstance}/search?query=${mlat}%2C${mlon}`\n }\n\n if (url.searchParams.has(\"viewpoint\")) {\n // https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=48.857832,2.295226&heading=-45&pitch=38&fov=80\n const [mlat, mlon] = url.searchParams.get(\"viewpoint\").split(\",\")\n return `${randomInstance}/search?query=${mlat}%2C${mlon}`\n }\n\n const query = utils.getQuery(url)\n if (query) return `${randomInstance}/search?query=\"${query}${mapCentre}&${utils.prefsEncoded(prefs)}`\n return `${randomInstance}/${mapCentre}&${utils.prefsEncoded(prefs)}`\n }\n case \"breezeWiki\": {\n let wiki,\n urlpath = \"\"\n if (url.hostname.match(/^[a-zA-Z0-9-]+\\.(?:fandom|wikia)\\.com/)) {\n wiki = url.hostname.match(/^[a-zA-Z0-9-]+(?=\\.(?:fandom|wikia)\\.com)/)\n if (wiki == \"www\" || !wiki) wiki = \"\"\n else wiki = `/${wiki}`\n urlpath = url.pathname\n } else {\n wiki = url.pathname.match(/(?<=wiki\\/w:c:)[a-zA-Z0-9-]+(?=:)/)\n if (!wiki) wiki = \"\"\n else {\n wiki = \"/\" + wiki + \"/wiki/\"\n urlpath = url.pathname.match(/(?<=wiki\\/w:c:[a-zA-Z0-9-]+:).+/)\n }\n }\n if (url.href.search(/Special:Search\\?query/) > -1) {\n return `${randomInstance}${wiki}${urlpath}${url.search}`\n .replace(/Special:Search\\?query/, \"search?q\")\n .replace(/\\/wiki/, \"\")\n }\n return `${randomInstance}${wiki}${urlpath}${url.search}`\n }\n case \"rimgo\":\n if (url.href.search(/^https?:\\/{2}(?:[im]\\.)?stack\\./) > -1)\n return `${randomInstance}/stack${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"redlib\":\n case \"libreddit\": {\n const subdomain = url.hostname.match(/^(?:((?:external-)?preview|i)\\.)?redd\\.it/)\n if (!subdomain) return `${randomInstance}${url.pathname}${url.search}`\n switch (subdomain[1]) {\n case \"preview\":\n return `${randomInstance}/preview/pre${url.pathname}${url.search}`\n case \"external-preview\":\n return `${randomInstance}/preview/external-pre${url.pathname}${url.search}`\n case \"i\":\n return `${randomInstance}/img${url.pathname}`\n }\n return `${randomInstance}/comments${url.pathname}`\n }\n case \"teddit\":\n if (/^(?:(?:external-)?preview|i)\\.redd\\.it/.test(url.hostname)) {\n if (url.search == \"\") return `${randomInstance}${url.pathname}?teddit_proxy=${url.hostname}`\n else return `${randomInstance}${url.pathname}${url.search}&teddit_proxy=${url.hostname}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n case \"troddit\":\n case \"eddrit\":\n if (/^(?:(?:external-)?preview|i)\\.redd\\.it/.test(url.hostname)) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"neuters\": {\n const p = url.pathname\n if (p.startsWith(\"/article/\") || p.startsWith(\"/pf/\") || p.startsWith(\"/arc/\") || p.startsWith(\"/resizer/\")) {\n return randomInstance\n }\n return `${randomInstance}${p}`\n }\n case \"dumb\":\n if (url.pathname.endsWith(\"-lyrics\")) return `${randomInstance}${url.pathname}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"intellectual\":\n return `${randomInstance}${url.pathname}${url.search}`\n case \"ruralDictionary\":\n if (!url.pathname.includes(\"/define.php\") && !url.pathname.includes(\"/random.php\") && url.pathname != \"/\")\n return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"anonymousOverflow\": {\n if (url.hostname == \"stackoverflow.com\") {\n const threadID = /^\\/a\\/(\\d+)\\/?/.exec(url.pathname)\n if (threadID) return `${randomInstance}/questions/${threadID[1]}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n if (url.pathname == \"/\" || url.pathname == \"\") {\n // https://stackexchange.com or https://superuser.com\n return `${randomInstance}${url.pathname}${url.search}`\n }\n const regex = url.href.match(/https?:\\/{2}(?:([a-zA-Z0-9-]+)\\.(meta\\.)?)?stackexchange\\.com\\//)\n if (regex && regex.length > 1) {\n if (regex[2]) {\n return `${randomInstance}/exchange/${url.hostname}${url.pathname}${url.search}`\n }\n const subdomain = regex[1]\n return `${randomInstance}/exchange/${subdomain}${url.pathname}${url.search}`\n }\n const notExchangeRegex = url.hostname.match(\n /(?:[a-zA-Z]+\\.)?(?:askubuntu\\.com|mathoverflow\\.net|serverfault\\.com|stackapps\\.com|superuser\\.com|stackoverflow\\.com)/\n )\n if (notExchangeRegex) {\n return `${randomInstance}/exchange/${notExchangeRegex[0]}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"biblioReads\":\n return `${randomInstance}${url.pathname}${url.search}`\n case \"wikimore\": {\n let hostSplit = url.host.split(\".\")\n // wikiless doesn't have mobile view support yet\n if (hostSplit[0] != \"wikipedia\" && hostSplit[0] != \"www\") {\n const lang = url.hostname.split(\".\")[0]\n return `${randomInstance}/wiki/${lang}${url.pathname}${url.search}${url.hash}`\n }\n return `${randomInstance}${url.pathname}${url.search}${url.hash}`\n }\n case \"wikiless\": {\n let hostSplit = url.host.split(\".\")\n // wikiless doesn't have mobile view support yet\n if (hostSplit[0] != \"wikipedia\" && hostSplit[0] != \"www\") {\n if (hostSplit[0] == \"m\") url.searchParams.append(\"mobileaction\", \"toggle_view_mobile\")\n else url.searchParams.append(\"lang\", hostSplit[0])\n if (hostSplit[1] == \"m\") url.searchParams.append(\"mobileaction\", \"toggle_view_mobile\")\n }\n return `${randomInstance}${url.pathname}${url.search}${url.hash}`\n }\n case \"offtiktok\":\n case \"proxiTok\":\n if (url.pathname.startsWith(\"/email\")) return randomInstance\n return `${randomInstance}${url.pathname}${url.search}`\n case \"waybackClassic\": {\n const regex = /^\\/\\web\\/(?:[0-9]+)?\\*\\/(.*)/.exec(url.pathname)\n if (regex) {\n const link = regex[1]\n return `${randomInstance}/cgi-bin/history.cgi?utf8=✓&q=${encodeURIComponent(link)}`\n }\n const regex2 = /(^\\/\\web\\/([0-9]+)\\/.*)/.exec(url.pathname)\n if (regex2) {\n let link = regex2[1]\n link = link.replace(regex2[2], regex2[2] + \"if_\")\n return `https://web.archive.org${link}`\n }\n return\n }\n case \"gothub\":\n if (url.hostname == \"gist.github.com\") return `${randomInstance}/gist${url.pathname}${url.search}`\n if (url.hostname == \"raw.githubusercontent.com\") return `${randomInstance}/raw${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"mikuInvidious\":\n if (url.hostname == \"bilibili.com\" || url.hostname == \"www.bilibili.com\" || url.hostname == \"b23.tv\")\n return `${randomInstance}${url.pathname}${url.search}`\n if (url.hostname == \"space.bilibili.com\") return `${randomInstance}/space${url.pathname}${url.search}`\n case \"tent\": {\n if (url.hostname == \"bandcamp.com\" && url.pathname == \"/search\") {\n const query = url.searchParams.get(\"q\")\n return `${randomInstance}/search.php?query=${encodeURIComponent(query)}`\n }\n if (url.hostname.endsWith(\"bandcamp.com\")) {\n const regex = /^(.*)\\.bandcamp\\.com/.exec(url.hostname)\n const artist = regex[1]\n if (url.pathname == \"/\" || url.pathname == \"/music\") {\n return `${randomInstance}/artist.php?name=${artist}`\n } else {\n const regex = /^\\/(.*)\\/(.*)/.exec(url.pathname)\n if (regex) {\n const type = regex[1]\n const name = regex[2]\n return `${randomInstance}/release.php?artist=${artist}&type=${type}&name=${name}`\n }\n }\n }\n if (url.hostname == \"f4.bcbits.com\") {\n const regex = /\\/img\\/(.*)/.exec(url.pathname)\n const image = regex[1]\n return `${randomInstance}/image.php?file=${image}`\n }\n if (url.hostname == \"t4.bcbits.com\") {\n const regex = /\\/stream\\/(.*)\\/(.*)\\/(.*)/.exec(url.pathname)\n if (regex) {\n const directory = regex[1]\n const format = regex[2]\n const file = regex[3]\n const token = url.searchParams.get(\"token\")\n return `${randomInstance}/audio.php/?directory=${directory}&format=${format}&file=${file}&token=${encodeURIComponent(token)}`\n }\n }\n }\n case \"binternet\":\n if (url.hostname == \"i.pinimg.com\") return `${randomInstance}/image_proxy.php?url=${encodeURIComponent(url.href)}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"painterest\":\n if (url.hostname == \"i.pinimg.com\") return `${randomInstance}/_/proxy?url=${encodeURIComponent(url.href)}`\n const regex = /^\\/pin\\/[^\\/]+/.exec(url.pathname)\n if (regex) return `${randomInstance}${regex[0]}`\n return `${randomInstance}${url.pathname}${url.search}`\n case \"laboratory\": {\n let path = url.pathname\n if (path == \"/\") path = \"\"\n return `${randomInstance}/${url.hostname}${path}${url.search}`\n }\n case \"quetre\": {\n const regex = /([a-z]+)\\.quora\\.com/.exec(url.hostname)\n if (regex) {\n const lang = regex[1]\n url.searchParams.append(\"lang\", lang)\n return `${randomInstance}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"pixivViewer\":\n case \"liteXiv\":\n case \"pixivFe\": {\n const regex = /\\/[a-z]{1,3}\\/(.*)/.exec(url.pathname)\n if (regex) {\n const path = regex[1]\n return `${randomInstance}/${path}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"vixipy\": {\n const regex = /\\/[a-z]{1,3}\\/(.*)/.exec(url.pathname)\n if (regex) {\n let path = regex[1]\n if (path.startsWith(\"tags/\")) path = path.replace(/tags/, \"tag\")\n return `${randomInstance}/${path}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"invidious\": {\n // tracker\n url.searchParams.delete(\"si\")\n\n if (type == \"sub_frame\") url.searchParams.append(\"autoplay\", \"0\")\n\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch?v=${watch}&${url.search.substring(1)}`\n }\n if (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/redirect?\")) return url.href\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"freetubeMusic\": {\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `freetube://youtube.com/watch?v=${watch}`\n }\n return \"freetube://\" + url.href\n }\n case \"invidiousMusic\": {\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch?v=${watch}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"materialious\": {\n url.searchParams.delete(\"si\")\n if (url.hostname == \"youtu.be\" || (url.hostname.endsWith(\"youtube.com\") && url.pathname.startsWith(\"/live\"))) {\n const watch = url.pathname.substring(url.pathname.lastIndexOf(\"/\") + 1)\n return `${randomInstance}/watch/${watch}${url.search.replace(\"?\", \"&\")}`\n }\n if (url.hostname.endsWith(\"youtube.com\")) {\n if (url.pathname.startsWith(\"/watch\")) {\n if (url.searchParams.has(\"v\")) {\n const watch = url.searchParams.get(\"v\")\n url.searchParams.delete(\"v\")\n return `${randomInstance}/watch/${watch}${url.search.replace(\"?\", \"&\")}`\n }\n return `${randomInstance}/watch/${url.search.replace(\"?\", \"&\")}`\n }\n if (url.pathname.startsWith(\"/results\")) {\n if (url.searchParams.has(\"search_query\")) {\n const search = url.searchParams.get(\"search_query\")\n url.searchParams.delete(\"search_query\")\n return `${randomInstance}/search/${search}${url.search.replace(\"?\", \"&\")}`\n }\n return `${randomInstance}/search/${url.search.replace(\"?\", \"&\")}`\n }\n if (url.pathname.startsWith(\"/redirect?\")) {\n return url.href\n }\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"libremdb\": {\n if (/\\/((?:name|title)\\/\\w+)\\/?$/.exec(url.pathname)) {\n return `${randomInstance}${url.pathname}${url.search}`\n }\n return randomInstance\n }\n case \"tuboYoutube\":\n url.searchParams.delete(\"si\")\n if (url.pathname.startsWith(\"/channel\")) return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}`\n if (url.pathname.startsWith(\"/watch\")) return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}`\n return randomInstance\n case \"tuboSoundcloud\":\n if (url.pathname == \"/\") return `${randomInstance}?kiosk?serviceId=1`\n if (url.pathname.match(/^\\/[^\\/]+(\\/$|$)/)) return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}`\n if (url.pathname.match(/^\\/[^\\/]+\\/[^\\/]+/)) return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}`\n return randomInstance\n case \"twineo\":\n case \"safetwitch\":\n if (url.hostname.startsWith(\"clips.\")) return `${randomInstance}/clip${url.pathname}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n\n case \"tekstoLibre\":\n return `${randomInstance}/?${url.pathname.slice(1)}`\n case \"skyview\":\n if (url.pathname == \"/\") return randomInstance\n return `${randomInstance}?url=${encodeURIComponent(url.href)}`\n case \"nitter\": {\n let search = new URLSearchParams(url.search)\n\n search.delete(\"ref_src\")\n search.delete(\"ref_url\")\n search.delete(\"s\") // type of device that shared the link\n search.delete(\"t\") // some sort of tracking ID\n\n search = search.toString()\n if (search !== \"\") search = `?${search}`\n\n if (url.host.split(\".\")[0] === \"pbs\" || url.host.split(\".\")[0] === \"video\") {\n try {\n const [, id, format, extra] = search.match(/(.*)\\?format=(.*)&(.*)/)\n const query = encodeURIComponent(`${id}.${format}?${extra}`)\n return `${randomInstance}/pic${url.pathname}${query}`\n } catch {\n return `${randomInstance}/pic${url.pathname}${search}`\n }\n }\n if (url.pathname.split(\"/\").includes(\"tweets\"))\n return `${randomInstance}${url.pathname.replace(\"/tweets\", \"\")}${search}`\n if (url.host == \"t.co\") return `${randomInstance}/t.co${url.pathname}`\n return `${randomInstance}${url.pathname}${search}#m`\n }\n case \"priviblur\": {\n if (url.hostname == \"www.tumblr.com\") return `${randomInstance}${url.pathname}${url.search}`\n if (url.hostname.startsWith(\"assets\")) return `${randomInstance}/tblr/assets${url.pathname}${url.search}`\n if (url.hostname.startsWith(\"static\")) return `${randomInstance}/tblr/static${url.pathname}${url.search}`\n\n const reg = /^([0-9]+)\\.media\\.tumblr\\.com/.exec(url.hostname) // *.media.tumblr.com\n if (reg) return `${randomInstance}/tblr/media/${reg[1]}${url.pathname}${url.search}`\n\n const blogregex = /^(?:www\\.)?([a-z\\d-]+)\\.tumblr\\.com/.exec(url.hostname) // <blog>.tumblr.com\n if (blogregex) {\n const blog_name = blogregex[1]\n // Under the <blog>.tumblr.com domain posts are under a /post path\n if (url.pathname.startsWith(\"/post\"))\n return `${randomInstance}/${blog_name}${url.pathname.slice(5)}${url.search}`\n else return `${randomInstance}/${blog_name}${url.pathname}${url.search}`\n }\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"ultimateTab\":\n case \"freetar\":\n if (url.pathname.startsWith(\"/search.php\")) {\n url.searchParams.set(\"search_term\", url.searchParams.get(\"value\"))\n url.searchParams.delete(\"value\")\n url.searchParams.delete(\"search_type\")\n return `${randomInstance}/search${url.search}`\n }\n if (url.pathname.startsWith(\"/artist\")) return\n return `${randomInstance}${url.pathname}${url.search}`\n case \"ratAintTieba\":\n url.searchParams.delete(\"ie\")\n return `${randomInstance}${url.pathname}${url.search}`\n case \"shoelace\": {\n const reg = /^\\/(?:(?:(?:[^\\/])?\\/post)|t)\\/([^\\/])/.exec(url.pathname)\n if (reg) return `${randomInstance}/t/${reg[1]}${url.search}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"skunkyArt\": {\n if (url.pathname.startsWith(\"/search\")) return `${randomInstance}${url.pathname}${url.search}&type=all`\n\n const artReg = /^\\/(.*?)\\/art\\/(.*)\\/?/.exec(url.pathname)\n if (artReg) return `${randomInstance}/post/${artReg[1]}/${artReg[2]}${url.search}`\n\n const userReg = /^\\/([^\\/]+)$/.exec(url.pathname)\n if (userReg) return `${randomInstance}/group_user?q=${userReg[1]}&type=about`\n\n const galleryReg = /^\\/(.*?)\\/gallery(\\/$|$)$/.exec(url.pathname)\n if (galleryReg) return `${randomInstance}/group_user?q=${galleryReg[1]}&type=gallery`\n\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"ytify\": {\n if (url.pathname.startsWith(\"/watch\"))\n return `${randomInstance}/?s=${encodeURIComponent(url.searchParams.get(\"v\"))}`\n\n const channelReg = /\\/channel\\/([^\\/]+)/.exec(url.pathname)\n if (channelReg) return `${randomInstance}/list?channel=${channelReg[1]}`\n\n if (url.pathname.startsWith(\"/playlist\"))\n return `${randomInstance}/list?playlists=${encodeURIComponent(url.searchParams.get(\"list\"))}`\n return `${randomInstance}${url.pathname}${url.search}`\n }\n case \"koub\": {\n if (url.pathname.startsWith(\"/view/\") || url.pathname.startsWith(\"/stories/\")) {\n return `${randomInstance}${url.pathname}${url.search}`\n }\n const accountReg = /^\\/([^\\/]+)\\/?$/.exec(url.pathname)\n if (accountReg) return `${randomInstance}/account${url.pathname}${url.search}`\n return randomInstance\n }\n case \"duckDuckGoAiChat\":\n return \"https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=1\"\n\n case \"soundcloak\":\n if (url.pathname.startsWith(\"/feed\") || url.pathname.startsWith(\"/stream\")) {\n // this feature requires authentication and is unsupported, so just redirect to main page\n return randomInstance\n }\n\n if (url.pathname.startsWith(\"/search\")) {\n if (!url.search) {\n return randomInstance\n }\n\n let type = \"\"\n if (url.pathname.startsWith(\"/search/sounds\")) {\n type = \"tracks\"\n } else if (url.pathname.startsWith(\"/search/people\")) {\n type = \"users\"\n } else if (url.pathname.startsWith(\"/search/albums\") || url.pathname.startsWith(\"/search/sets\")) {\n type = \"playlists\"\n }\n\n if (type) {\n type = \"&type=\" + type\n } else {\n return randomInstance // fallback for unsupported search types (searching for anything for example)\n }\n\n return `${randomInstance}/search${url.search}${type}`\n }\n\n if (url.host == \"on.soundcloud.com\") {\n return `${randomInstance}/on${url.pathname}`\n }\n\n return `${randomInstance}${url.pathname}${url.search}`\n case \"piped\":\n case \"pipedMaterial\":\n case \"cloudtube\":\n case \"lightTube\":\n case \"viewtube\":\n url.searchParams.delete(\"si\")\n default:\n return `${randomInstance}${url.pathname}${url.search}`\n }\n}\n\n/**\n * @param {URL} url\n * @param {string} type\n * @param {URL} originUrl\n * @param {URL} documentUrl\n * @param {boolean} incognito\n * @param {boolean} forceRedirection\n * @returns {string | undefined}\n */\nfunction redirect(url, type, originUrl, documentUrl, incognito, forceRedirection) {\n if (type != \"main_frame\" && type != \"sub_frame\" && type != \"image\") return\n let randomInstance\n let frontend\n if (!forceRedirection && options.redirectOnlyInIncognito == true && !incognito) return\n for (const service in config.services) {\n if (!forceRedirection && !options[service].enabled) continue\n if (!forceRedirection && options[service].redirectOnlyInIncognito == true && !incognito) continue\n\n frontend = options[service].frontend\n\n if (\n config.services[service].frontends[frontend].desktopApp &&\n type != \"main_frame\" &&\n options[service].redirectType != \"main_frame\"\n )\n frontend = options[service].embedFrontend\n\n if (!regexArray(service, url, config, options, frontend)) {\n frontend = null\n continue\n }\n\n if (type != \"main_frame\" && documentUrl && options[service].redirectType == \"sub_frame\") {\n if (regexArray(service, documentUrl, config, options, frontend)) {\n return\n }\n }\n\n if (\n config.services[service].embeddable &&\n type != options[service].redirectType &&\n options[service].redirectType != \"both\"\n ) {\n if (options[service].unsupportedUrls == \"block\") return \"CANCEL\"\n return\n }\n\n let instanceList = options[frontend]\n if (instanceList === undefined) break // should not happen if settings are correct\n\n if (config.services[service].frontends[frontend].localhost && options[service].instance == \"localhost\") {\n randomInstance = `http://${frontend}.localhost:8080`\n } else if (instanceList.length === 0) {\n return `https://no-instance.libredirect.invalid?frontend=${encodeURIComponent(frontend)}&url=${encodeURIComponent(url.href)}`\n } else {\n randomInstance = utils.getRandomInstance(instanceList)\n }\n\n if (originUrl && instanceList.includes(originUrl.origin)) {\n if (type == \"main_frame\") return \"BYPASSTAB\"\n else return null\n }\n break\n }\n if (!frontend) return\n\n return rewrite(url, originUrl, frontend, randomInstance, type)\n}\n\n/**\n * @param {URL} url\n * @param {string} type\n * @param {URL} originUrl\n * @param {URL} documentUrl\n * @param {boolean} incognito\n * @param {boolean} forceRedirection\n * @returns {Promise<string | undefined>}\n */\nasync function redirectAsync(url, type, originUrl, documentUrl, incognito, forceRedirection) {\n await init()\n return redirect(url, type, originUrl, documentUrl, incognito, forceRedirection)\n}\n\n/**\n * @param {URL} url\n */\nasync function computeServiceFrontend(url) {\n const config = await utils.getConfig()\n const options = await utils.getOptions()\n for (const service in config.services) {\n if (regexArray(service, url, config, options)) {\n return { service, frontend: null }\n } else {\n for (const frontend in config.services[service].frontends) {\n const instances = all(service, frontend, options, config)\n const i = instances.findIndex(instance => url.href.startsWith(instance))\n if (i >= 0) {\n return { service, frontend }\n }\n }\n }\n }\n}\n\n/**\n * @param {URL} url\n * @param {string} customService\n */\nfunction switchInstance(url, customService) {\n return new Promise(async resolve => {\n let options = await utils.getOptions()\n let config = await utils.getConfig()\n\n const protocolHost = utils.protocolHost(url)\n if (customService) {\n const instancesList = options[options[customService].frontend]\n if (instancesList !== undefined) {\n const newInstance = utils.getNextInstance(url.origin, instancesList)\n if (newInstance) {\n return resolve(`${newInstance}${url.pathname}${url.search}`)\n }\n }\n } else {\n for (const service in config.services) {\n let instancesList = options[options[service].frontend]\n if (instancesList === undefined) continue\n const index = instancesList.findIndex(instance => url.href.startsWith(instance))\n if (index < 0) continue\n instancesList.splice(index, 1)\n if (instancesList.length === 0) return resolve()\n const newInstance = utils.getNextInstance(url.origin, instancesList)\n if (newInstance) {\n return resolve(`${newInstance}${url.pathname}${url.search}`)\n }\n }\n }\n resolve()\n })\n}\n\n/**\n * @param {URL} url\n */\nasync function reverse(url) {\n let options = await utils.getOptions()\n let config = await utils.getConfig()\n for (const service in config.services) {\n let frontend = options[service].frontend\n if (options[frontend] == undefined) continue\n if (\n options[frontend].findIndex(instance => url.href.startsWith(instance)) < 0 &&\n !url.href.startsWith(`http://${frontend}.localhost:8080`)\n )\n continue\n switch (service) {\n case \"youtube\":\n case \"imdb\":\n case \"imgur\":\n case \"tiktok\":\n case \"reddit\":\n case \"imdb\":\n case \"snopes\":\n case \"urbanDictionary\":\n case \"quora\":\n case \"twitter\":\n case \"medium\":\n case \"pinterest\":\n return `${config.services[service].url}${url.pathname}${url.search}`\n case \"fandom\": {\n let regex = url.pathname.match(/^\\/([a-zA-Z0-9-]+)\\/wiki\\/(.*)/)\n if (regex) return `https://${regex[1]}.fandom.com/wiki/${regex[2]}`\n return\n }\n case \"wikipedia\": {\n const lang = url.searchParams.get(\"lang\")\n if (lang != null) {\n return `https://${lang}.wikipedia.org${url.pathname}${url.search}${url.hash}`\n }\n return `https://wikipedia.org${url.pathname}${url.search}${url.hash}`\n }\n case \"stackOverflow\": {\n if (url.pathname.startsWith(\"/questions/\")) {\n return `https://stackoverflow.com${url.pathname}${url.search}`\n }\n if (url.pathname.startsWith(\"/exchange/\")) {\n const regex = /\\/exchange\\/(.*?)(\\/.*)/.exec(url.pathname)\n if (regex) {\n if (regex[1].includes(\".\")) {\n return `https://${regex[1]}${regex[2]}`\n } else {\n return `https://${regex[1]}.stackexchange.com${regex[2]}`\n }\n }\n }\n return\n }\n case \"tekstowo\":\n return `${config.services[service].url}/${url.search.slice(1)}`\n case \"goodreads\":\n return `https://goodreads.com${url.pathname}${url.search}`\n case \"soundcloud\":\n if (frontend == \"soundcloak\") {\n if (url.pathname.includes(\"/_/\")) {\n // soundcloak-specific pages\n return `${config.services[service].url}${url.pathname.split(\"/_/\")[0]}`\n }\n\n if (url.pathname == \"/search\") {\n let type = url.searchParams.get(\"type\")\n switch (type) {\n case \"playlists\":\n type = \"sets\"\n break\n case \"tracks\":\n type = \"sounds\"\n break\n case \"users\":\n type = \"people\"\n break\n default:\n type = \"\"\n }\n\n url.searchParams.delete(\"type\")\n if (!type) {\n return `${config.services[service].url}/search?${url.searchParams.toString()}`\n } else {\n return `${config.services[service].url}/search/${type}?${url.searchParams.toString()}`\n }\n }\n\n return `${config.services[service].url}${url.pathname}`\n }\n default:\n return\n }\n }\n return\n}\n\nconst defaultInstances = {\n materialious: [\"https://app.materialio.us\"],\n viewtube: [\"https://viewtube.io\"],\n piped: [\"https://pipedapi-libre.kavin.rocks\"],\n pipedMaterial: [\"https://piped-material.xn--17b.net\"],\n cloudtube: [\"https://tube.cadence.moe\"],\n lightTube: [\"https://tube.kuylar.dev\"],\n poketube: [\"https://poketube.fun\"],\n proxiTok: [\"https://proxitok.pabloferreiro.es\"],\n offtiktok: [\"https://www.offtiktok.com\"],\n redlib: [\"https://safereddit.com\"],\n eddrit: [\"https://eddrit.com\"],\n troddit: [\"https://www.troddit.com\"],\n scribe: [\"https://scribe.rip\"],\n libMedium: [\"https://md.vern.cc\"],\n small: [\"https://small.bloat.cat\"],\n freedium: [\"https://freedium.cfd\"],\n quetre: [\"https://quetre.iket.me\"],\n libremdb: [\"https://libremdb.iket.me\"],\n simplyTranslate: [\"https://simplytranslate.org\"],\n translite: [\"https://tl.bloat.cat\"],\n mozhi: [\"https://mozhi.aryak.me\"],\n searxng: [\"https://nyc1.sx.ggtyler.dev\"],\n \"4get\": [\"https://4get.ca\"],\n websurfx: [\"https://alamin655-spacex.hf.space\"],\n rimgo: [\"https://rimgo.vern.cc\"],\n hyperpipe: [\"https://hyperpipe.surge.sh\"],\n osm: [\"https://www.openstreetmap.org\"],\n breezeWiki: [\"https://breezewiki.com\"],\n neuters: [\"https://neuters.de\"],\n dumb: [\"https://dm.vern.cc\"],\n intellectual: [\"https://intellectual.insprill.net\"],\n ruralDictionary: [\"https://rd.vern.cc\"],\n anonymousOverflow: [\"https://code.whatever.social\"],\n suds: [\"https://sd.vern.cc\"],\n unfunny: [\"https://uf.vern.cc\"],\n soprano: [\"https://sp.vern.cc\"],\n meme: [\"https://mm.vern.cc\"],\n waybackClassic: [\"https://wayback-classic.net\"],\n tent: [\"https://tent.sny.sh\"],\n laboratory: [\"https://lab.vern.cc\"],\n binternet: [\"https://bn.bloat.cat\"],\n painterest: [\"https://pt.bloat.cat\"],\n pixivFe: [\"https://pixiv.perennialte.ch\"],\n liteXiv: [\"https://litexiv.465321.best\", \"https://litexiv.bloat.cat\"],\n pixivViewer: [\"https://pixiv.pictures\"],\n vixipy: [\"https://vx.maid.zone\"],\n indestructables: [\"https://indestructables.private.coffee\"],\n destructables: [\"https://ds.vern.cc\"],\n structables: [\"https://structables.private.coffee\"],\n safetwitch: [\"https://safetwitch.drgns.space\"],\n twineo: [\"https://twineo.exozy.me\"],\n proxigram: [\"https://ig.opnxng.com\"],\n tuboYoutube: [\"https://tubo.media\"],\n tuboSoundcloud: [\"https://tubo.media\"],\n tekstoLibre: [\"https://davilarek.github.io/TekstoLibre\"],\n skyview: [\"https://skyview.social\"],\n priviblur: [\"https://pb.bloat.cat\"],\n nitter: [\"https://nitter.privacydev.net\"],\n pasted: [\"https://pasted.drakeerv.com\"],\n pasty: [\"https://pasty.lus.pm\"],\n freetar: [\"https://freetar.de\"],\n ultimateTab: [\"https://ultimate-tab.com\"],\n ratAintTieba: [\"https://rat.fis.land\"],\n shoelace: [\"https://shoelace.mint.lgbt\"],\n skunkyArt: [\"https://skunky.bloat.cat\"],\n ytify: [\"https://ytify.pp.ua\"],\n nerdsForNerds: [\"https://nn.vern.cc\"],\n ducksForDucks: [\"https://ducksforducks.private.coffee\"],\n koub: [\"https://koub.clovius.club\"],\n soundcloak: [\"https://soundcloak.fly.dev\"],\n gocook: [\"https://cook.adminforge.de\"],\n wikimore: [\"https://wikimore.private.coffee\"],\n libreTranslate: [\"https://libretranslate.com\"],\n cryptPad: [\"https://cryptpad.org\"],\n}\n\nasync function getDefaults() {\n let config = await utils.getConfig()\n let options = {}\n for (const service in config.services) {\n options[service] = {}\n for (const defaultOption in config.services[service].options) {\n options[service][defaultOption] = config.services[service].options[defaultOption]\n }\n for (const frontend in config.services[service].frontends) {\n if (config.services[service].frontends[frontend].instanceList) {\n options[frontend] = []\n }\n }\n }\n options.exceptions = {\n url: [],\n regex: [],\n }\n options.theme = \"detect\"\n options.popupServices = [\"youtube\", \"tiktok\", \"imgur\", \"reddit\", \"quora\", \"translate\", \"maps\"]\n options.fetchInstances = \"github\"\n options.redirectOnlyInIncognito = false\n options = { ...options, ...defaultInstances }\n return options\n}\n\nfunction initDefaults() {\n return new Promise(resolve => {\n browser.storage.local.clear(async () => {\n options = await getDefaults()\n browser.storage.local.set({ options }, () => resolve())\n })\n })\n}\n\nfunction processUpdate(_options) {\n return new Promise(async resolve => {\n const config = await utils.getConfig()\n let options = _options ?? (await utils.getOptions())\n\n const defaults = await getDefaults()\n\n // Remove any unknown option or subOption\n for (const optionName in options) {\n if (!(optionName in defaults)) delete options[optionName]\n else if (typeof optionName === \"object\" && optionName !== null) {\n for (const subOptionName in options[optionName]) {\n if (!(subOptionName in defaults[optionName])) delete options[optionName][subOptionName]\n }\n }\n }\n\n // Remove any unknwon popupService\n options.popupServices = options.popupServices.filter(service => service in config.services)\n\n // Add missing options\n for (const [defaultName, defaultValue] of Object.entries(defaults)) {\n if (!(defaultName in options)) {\n options[defaultName] = defaultValue\n }\n }\n\n for (const [serviceName, serviceValue] of Object.entries(config.services)) {\n // Reset service options if selected frontend is deprecated\n if (!(options[serviceName].frontend in serviceValue.frontends)) {\n options[serviceName] = serviceValue.options\n }\n\n // Add a default service option if it's not present\n for (const optionName in serviceValue.options) {\n if (!(optionName in options[serviceName])) {\n options[serviceName][optionName] = serviceValue.options[optionName]\n }\n }\n }\n\n browser.storage.local.clear(() => browser.storage.local.set({ options }, () => resolve()))\n })\n}\n\n/**\n * @param {URL} url\n */\nasync function copyRaw(url) {\n const newUrl = await reverse(url)\n if (newUrl) {\n if (!isChrome) {\n navigator.clipboard.writeText(newUrl)\n } else {\n var copyFrom = document.createElement(\"textarea\")\n copyFrom.textContent = newUrl\n document.body.appendChild(copyFrom)\n copyFrom.select()\n document.execCommand(\"copy\")\n copyFrom.blur()\n document.body.removeChild(copyFrom)\n }\n }\n}\n\n/**\n * @param {URL} url\n */\nfunction isException(url) {\n if (!options) return false\n if (!options.exceptions) return false\n let exceptions = options.exceptions\n if (exceptions && url) {\n if (exceptions.url) {\n for (let item of exceptions.url) {\n item = new URL(item)\n item = item.href.replace(/^http:\\/\\//, \"https://\")\n if (item == url.href) {\n return true\n }\n }\n }\n if (exceptions.regex) {\n for (const item of exceptions.regex) {\n if (new RegExp(item).test(url.href)) {\n return true\n }\n }\n }\n }\n return false\n}\n\nexport default {\n redirect,\n redirectAsync,\n computeServiceFrontend,\n reverse,\n initDefaults,\n processUpdate,\n copyRaw,\n switchInstance,\n isException,\n}\n","<div {...$$props} on:click>\n <slot></slot>\n</div>\n\n<style>\n div {\n justify-content: space-between;\n display: flex;\n align-items: center;\n margin: 10px 0;\n }\n</style>\n","<span {...$$restProps}>\n <slot></slot>\n</span>\n\n<style>\n span {\n font-size: 18px;\n }\n\n span :global(a) {\n color: var(--text);\n text-decoration: none;\n }\n\n span :global(a:hover) {\n text-decoration: underline;\n }\n</style>\n","<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n width=\"24px\"\n viewBox=\"0 0 24 24\"\n preserveAspectRatio=\"xMinYMin meet\"\n fill=\"currentColor\"\n>\n <path\n d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\n />\n</svg>\n","<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n width=\"24px\"\n viewBox=\"0 0 24 24\"\n preserveAspectRatio=\"xMinYMin meet\"\n fill=\"currentColor\"\n>\n <path\n d=\"M 17,20 V 11 Q 17,10.175 16.412,9.587 15.825,9 15,9 H 6.8 L 8.4,7.4 7,6 3,10 7,14 8.4,12.6 6.8,11 H 15 v 9 z\"\n id=\"path2\"\n />\n</svg>\n","<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n width=\"24px\"\n viewBox=\"0 0 24 24\"\n preserveAspectRatio=\"xMinYMin meet\"\n fill=\"currentColor\"\n>\n <path d=\"M7 20v-9q0-.825.588-1.413Q8.175 9 9 9h8.2l-1.6-1.6L17 6l4 4-4 4-1.4-1.4 1.6-1.6H9v9Z\" />\n</svg>\n","<svg\n {...$$restProps}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n width=\"24px\"\n viewBox=\"0 0 24 24\"\n preserveAspectRatio=\"xMinYMin meet\"\n fill=\"currentColor\"\n on:click\n on:keydown={null}\n>\n <path\n d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\"\n />\n</svg>\n","<svg\n {...$$restProps}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n width=\"24px\"\n viewBox=\"0 0 24 24\"\n preserveAspectRatio=\"xMinYMin meet\"\n fill=\"currentColor\"\n on:click\n on:keydown={null}\n>\n <path\n d=\"m9.25 22-.4-3.2q-.325-.125-.612-.3-.288-.175-.563-.375L4.7 19.375l-2.75-4.75 2.575-1.95Q4.5 12.5 4.5 12.337v-.675q0-.162.025-.337L1.95 9.375l2.75-4.75 2.975 1.25q.275-.2.575-.375.3-.175.6-.3l.4-3.2h5.5l.4 3.2q.325.125.613.3.287.175.562.375l2.975-1.25 2.75 4.75-2.575 1.95q.025.175.025.337v.675q0 .163-.05.338l2.575 1.95-2.75 4.75-2.95-1.25q-.275.2-.575.375-.3.175-.6.3l-.4 3.2Zm2.8-6.5q1.45 0 2.475-1.025Q15.55 13.45 15.55 12q0-1.45-1.025-2.475Q13.5 8.5 12.05 8.5q-1.475 0-2.488 1.025Q8.55 10.55 8.55 12q0 1.45 1.012 2.475Q10.575 15.5 12.05 15.5Z\"\n />\n</svg>\n","import { noop, safe_not_equal, subscribe, run_all, is_function } from '../internal/index.mjs';\nexport { get_store_value as get } from '../internal/index.mjs';\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n * @param value initial value\n * @param {StartStopNotifier} [start]\n */\nfunction readable(value, start) {\n return {\n subscribe: writable(value, start).subscribe\n };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n * @param {*=}value initial value\n * @param {StartStopNotifier=} start\n */\nfunction writable(value, start = noop) {\n let stop;\n const subscribers = new Set();\n function set(new_value) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) { // store is ready\n const run_queue = !subscriber_queue.length;\n for (const subscriber of subscribers) {\n subscriber[1]();\n subscriber_queue.push(subscriber, value);\n }\n if (run_queue) {\n for (let i = 0; i < subscriber_queue.length; i += 2) {\n subscriber_queue[i][0](subscriber_queue[i + 1]);\n }\n subscriber_queue.length = 0;\n }\n }\n }\n }\n function update(fn) {\n set(fn(value));\n }\n function subscribe(run, invalidate = noop) {\n const subscriber = [run, invalidate];\n subscribers.add(subscriber);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(subscriber);\n if (subscribers.size === 0 && stop) {\n stop();\n stop = null;\n }\n };\n }\n return { set, update, subscribe };\n}\nfunction derived(stores, fn, initial_value) {\n const single = !Array.isArray(stores);\n const stores_array = single\n ? [stores]\n : stores;\n const auto = fn.length < 2;\n return readable(initial_value, (set) => {\n let started = false;\n const values = [];\n let pending = 0;\n let cleanup = noop;\n const sync = () => {\n if (pending) {\n return;\n }\n cleanup();\n const result = fn(single ? values[0] : values, set);\n if (auto) {\n set(result);\n }\n else {\n cleanup = is_function(result) ? result : noop;\n }\n };\n const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => {\n values[i] = value;\n pending &= ~(1 << i);\n if (started) {\n sync();\n }\n }, () => {\n pending |= (1 << i);\n }));\n started = true;\n sync();\n return function stop() {\n run_all(unsubscribers);\n cleanup();\n // We need to set this to false because callbacks can still happen despite having unsubscribed:\n // Callbacks might already be placed in the queue which doesn't know it should no longer\n // invoke this derived store.\n started = false;\n };\n });\n}\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * @param store - store to make readonly\n */\nfunction readonly(store) {\n return {\n subscribe: store.subscribe.bind(store)\n };\n}\n\nexport { derived, readable, readonly, writable };\n","import { writable } from \"svelte/store\"\n\nexport const options = writable(null)\nexport const config = writable(null)\nexport const page = writable(\"general\")\n","<script>\n export let checked\n export let onChange\n</script>\n\n<input class={document.body.dir} {...$$restProps} bind:checked on:change={onChange} type=\"checkbox\" />\n\n<style>\n input[type=\"checkbox\"] {\n appearance: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n width: 46px;\n height: 24px;\n background-color: var(--light-grey);\n border-radius: 50px;\n transition: 0.4s;\n cursor: pointer;\n }\n\n input[type=\"checkbox\"]:checked {\n background-color: var(--active);\n }\n\n input[type=\"checkbox\"]::before {\n content: \"\";\n display: inline-block;\n width: 18px;\n height: 18px;\n box-sizing: border-box;\n position: relative;\n top: 3px;\n left: 3.5px;\n background-color: white;\n border-radius: 50%;\n transition: 0.3s;\n }\n\n input[type=\"checkbox\"]:checked::before {\n left: 24px;\n }\n\n input[type=\"checkbox\"].rtl::before {\n left: auto;\n right: 3.5px;\n }\n\n input[type=\"checkbox\"].rtl:checked::before {\n left: auto;\n right: 24px;\n }\n</style>\n","<script>\n import { onDestroy } from \"svelte\"\n export let details\n import { config, options } from \"../stores\"\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n let theme\n $: if (_options) {\n if (_options.theme == \"dark\") {\n theme = \"dark\"\n } else if (_options.theme == \"light\") {\n theme = \"light\"\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n theme = \"dark\"\n } else {\n theme = \"light\"\n }\n }\n $: imageType = _config.services[details.value].imageType\n</script>\n\n{#if imageType}\n {#if imageType == \"svgMono\"}\n {#if theme == \"dark\"}\n <img src={`/assets/images/${details.value}-icon-light.svg`} alt={details.label} />\n {:else}\n <img src={`/assets/images/${details.value}-icon.svg`} alt={details.label} />\n {/if}\n {:else}\n <img src={`/assets/images/${details.value}-icon.${imageType}`} alt={details.label} />\n {/if}\n{/if}\n","<script>\n const browser = window.browser || window.chrome\n\n import Checkbox from \"../../components/Checkbox.svelte\"\n import Label from \"../../components/Label.svelte\"\n import SwitchInstanceIcon from \"../../icons/SwitchInstanceIcon.svelte\"\n import Row from \"./Row.svelte\"\n import ServiceIcon from \"./ServiceIcon.svelte\"\n import { onDestroy } from \"svelte\"\n import servicesHelper from \"../../../assets/javascripts/services\"\n import { options, config } from \"../stores\"\n import SettingsIcon from \"../../icons/SettingsIcon.svelte\"\n\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n export let serviceKey\n export let url\n</script>\n\n<Row>\n <div\n class=\"interactive margin margin_{document.body.dir}\"\n on:keydown={null}\n on:click={() =>\n browser.tabs.create({ url: _config.services[serviceKey].url }, () => {\n window.close()\n })}\n >\n <ServiceIcon details={{ value: serviceKey, label: _config.services[serviceKey].name }} />\n <Label>{_config.services[serviceKey].name}</Label>\n </div>\n <div>\n <Checkbox\n class=\"margin margin_{document.body.dir}\"\n label=\"Enable\"\n checked={_options[serviceKey].enabled}\n onChange={e => {\n _options[serviceKey].enabled = e.target.checked\n options.set(_options)\n }}\n />\n <SwitchInstanceIcon\n class=\"interactive\"\n on:click={async () =>\n browser.tabs.update({ url: await servicesHelper.switchInstance(url, serviceKey) }, () => {\n window.close()\n })}\n />\n <SettingsIcon\n class=\"interactive\"\n on:click={() =>\n browser.tabs.create({ url: browser.runtime.getURL(`pages/options/index.html#services:${serviceKey}`) }, () => {\n window.close()\n })}\n />\n </div>\n</Row>\n\n<style>\n div {\n display: flex;\n align-items: center;\n }\n\n :global(.margin) {\n margin-right: 5px;\n margin-left: 0;\n }\n :global(.margin_rtl) {\n margin-right: 0;\n margin-left: 5px;\n }\n</style>\n","<svg\n {...$$restProps}\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"20px\"\n viewBox=\"0 -960 960 960\"\n width=\"20px\"\n fill=\"currentColor\"\n ><path\n d=\"M144-144v-178l342-342-54-53 51-51 72 72 110.22-110.22q4.45-4.45 11.11-7.11Q683-816 691-816t15 2.5q7 2.5 12 7.5l87 88q4.55 5.83 7.27 12.64 2.73 6.8 2.73 14.58t-2.66 14.44q-2.67 6.66-7.11 11.1L696-556l72 73-51 51-54-54-341 342H144Zm72-72h76l320-320-75-76-321 320v76Zm424-385 90-91-38-39-91 90 39 40Zm0 0-39-40 39 40Z\"\n /></svg\n>\n","<script>\n const browser = window.browser || window.chrome\n\n import Row from \"./components/Row.svelte\"\n import Label from \"../components/Label.svelte\"\n import CopyIcon from \"../icons/CopyIcon.svelte\"\n import RedirectToOriginalIcon from \"../icons/RedirectToOriginalIcon.svelte\"\n import RedirectIcon from \"../icons/RedirectIcon.svelte\"\n import SwitchInstanceIcon from \"../icons/SwitchInstanceIcon.svelte\"\n import SettingsIcon from \"../icons/SettingsIcon.svelte\"\n import { options, config } from \"./stores\"\n import { onDestroy } from \"svelte\"\n import servicesHelper from \"../../assets/javascripts/services\"\n import Switch from \"./components/Switch.svelte\"\n import AutoPickIcon from \"../icons/AutoPickIcon.svelte\"\n import utils from \"../../assets/javascripts/utils\"\n\n let _options\n let _config\n\n const unsubscribeOptions = options.subscribe(val => (_options = val))\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n let url\n let switchInstance\n let redirectToOriginal\n let redirect\n let frontend\n let service\n browser.tabs.query({ active: true, currentWindow: true }, async tabs => {\n if (tabs[0].url) {\n url = new URL(tabs[0].url)\n servicesHelper.switchInstance(url).then(r => (switchInstance = r))\n servicesHelper.reverse(url).then(r => (redirectToOriginal = r))\n servicesHelper.redirectAsync(url, \"main_frame\", null, null, false, true).then(r => (redirect = r))\n servicesHelper.computeServiceFrontend(url).then(r => ({ service, frontend } = r))\n }\n })\n\n let autoPicking = false\n async function autoPick() {\n autoPicking = true\n const redirects = await utils.getList(_options)\n const clearnet = redirects[frontend][\"clearnet\"]\n const instance = await utils.autoPickInstance(clearnet, url)\n _options[frontend].push(instance)\n options.set(_options)\n autoPicking = false\n }\n</script>\n\n<div class={document.body.dir}>\n {#if redirect}\n <Row\n class=\"interactive\"\n on:click={() => {\n browser.tabs.query({ active: true, currentWindow: true }, tabs => {\n browser.runtime.sendMessage({ message: \"redirect\", tabId: tabs[0].id }, () => {\n browser.tabs.update({ url: redirect }, () => {\n window.close()\n })\n })\n })\n }}\n >\n <Label class=\"margin\">{browser.i18n.getMessage(\"redirect\") || \"Redirect\"}</Label>\n <RedirectIcon />\n </Row>\n {/if}\n\n {#if service && frontend}\n {#if _options[frontend].length > 1}\n {#if switchInstance}\n <Row\n class=\"interactive\"\n on:click={async () =>\n browser.tabs.update({ url: switchInstance }, () => {\n window.close()\n })}\n >\n <Label class=\"margin\">{browser.i18n.getMessage(\"switchInstance\") || \"Switch Instance\"}</Label>\n <SwitchInstanceIcon />\n </Row>\n {/if}\n <Row\n class=\"interactive\"\n on:click={async () => {\n const i = _options[frontend].findIndex(instance => url.href.startsWith(instance))\n _options[frontend].splice(i, 1)\n options.set(_options)\n const newUrl = await servicesHelper.switchInstance(url, service)\n browser.tabs.update({ url: newUrl }, () => {\n window.close()\n })\n }}\n >\n <Label class=\"margin\">\n {browser.i18n.getMessage(\"remove\") || \"Remove\"}\n +\n {browser.i18n.getMessage(\"switchInstance\") || \"Switch Instance\"}\n </Label>\n <SwitchInstanceIcon />\n </Row>\n {:else}\n <Row\n class={\"interactive \" + (autoPicking ? \"disabled\" : \"\")}\n on:click={async () => {\n const i = _options[frontend].findIndex(instance => url.href.startsWith(instance))\n _options[frontend].splice(i, 1)\n options.set(_options)\n await autoPick()\n browser.tabs.update({ url: await servicesHelper.switchInstance(url, service) }, () => {\n window.close()\n })\n }}\n >\n <Label class=\"margin\">\n {browser.i18n.getMessage(\"remove\") || \"Remove\"}\n +\n {browser.i18n.getMessage(\"autoPickInstance\") || \"Auto Pick Instance\"}\n </Label>\n <AutoPickIcon />\n </Row>\n <Row\n class={\"interactive \" + (autoPicking ? \"disabled\" : \"\")}\n on:click={async () => {\n await autoPick()\n browser.tabs.update({ url: await servicesHelper.switchInstance(url, service) }, () => {\n window.close()\n })\n }}\n >\n <Label class=\"margin\">\n {browser.i18n.getMessage(\"autoPickInstance\") || \"Auto Pick Instance\"}\n </Label>\n <AutoPickIcon />\n </Row>\n {/if}\n {/if}\n\n {#if redirectToOriginal}\n <Row class=\"interactive\" on:click={() => servicesHelper.copyRaw(url)}>\n <Label class=\"margin\">{browser.i18n.getMessage(\"copyOriginal\") || \"Copy Original\"}</Label>\n <CopyIcon />\n </Row>\n <Row\n class=\"interactive\"\n on:click={() => {\n browser.tabs.query({ active: true, currentWindow: true }, tabs => {\n browser.runtime.sendMessage({ message: \"reverse\", tabId: tabs[0].id }, () => {\n browser.tabs.update({ url: redirectToOriginal }, () => {\n window.close()\n })\n })\n })\n }}\n >\n <Label class=\"margin\">{browser.i18n.getMessage(\"redirectToOriginal\" || \"Redirect to Original\")}</Label>\n <RedirectToOriginalIcon />\n </Row>\n {/if}\n\n {#if redirect || switchInstance || redirectToOriginal}\n <hr />\n {/if}\n\n {#if service}\n <Switch serviceKey={service} {url} />\n <hr />\n {/if}\n\n {#each _options.popupServices as serviceKey}\n {#if service !== serviceKey}\n <Switch {serviceKey} {url} />\n {/if}\n {/each}\n\n <hr />\n\n <Row\n class=\"interactive\"\n on:click={() =>\n browser.tabs.create({ url: browser.runtime.getURL(\"pages/options/index.html\") }, () => {\n window.close()\n })}\n >\n <Label class=\"margin\">{browser.i18n.getMessage(\"settings\")}</Label>\n <SettingsIcon />\n </Row>\n</div>\n\n<style>\n :global(.interactive) {\n transition: 0.1s;\n }\n :global(.interactive:hover) {\n color: var(--active);\n cursor: pointer;\n }\n :global(.interactive:active) {\n transform: translateY(1px);\n }\n\n :global(.disabled) {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n :global(.disabled:hover) {\n color: var(--text);\n cursor: not-allowed;\n }\n\n :global(.disabled:active) {\n transform: none;\n }\n\n :global(img, svg) {\n margin-right: 5px;\n margin-left: 0;\n height: 26px;\n width: 26px;\n color: var(--text);\n }\n\n :global(.rtl img, .rtl svg) {\n margin-right: 0;\n margin-left: 5px;\n }\n\n :global(.margin) {\n margin-right: 5px;\n margin-left: 0;\n }\n :global(.margin_rtl) {\n margin-right: 0;\n margin-left: 5px;\n }\n</style>\n","<script>\n const browser = window.browser || window.chrome\n\n import utils from \"../../assets/javascripts/utils.js\"\n import { onDestroy } from \"svelte\"\n import servicesHelper from \"../../assets/javascripts/services.js\"\n import { onMount } from \"svelte\"\n import Buttons from \"./Buttons.svelte\"\n\n import { options, config, page } from \"./stores\"\n\n let _options\n const unsubscribeOptions = options.subscribe(val => {\n if (val) {\n _options = val\n browser.storage.local.set({ options: val })\n }\n })\n\n let _config\n const unsubscribeConfig = config.subscribe(val => (_config = val))\n\n onDestroy(() => {\n unsubscribeOptions()\n unsubscribeConfig()\n })\n\n onMount(async () => {\n let opts = await utils.getOptions()\n if (!opts) {\n await servicesHelper.initDefaults()\n opts = await utils.getOptions()\n }\n options.set(opts)\n config.set(await utils.getConfig())\n })\n\n let _page\n page.subscribe(val => (_page = val))\n\n let style\n $: if (_options) style = utils.style(_options, window)\n</script>\n\n{#if _options && _config}\n <div class=\"main\" dir=\"auto\" {style}>\n <Buttons />\n </div>\n{:else}\n <p>Loading...</p>\n{/if}\n\n<style>\n :global(html, body) {\n min-width: 260px;\n height: min-content;\n min-height: auto;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n :global(body) {\n margin-top: -20px;\n }\n\n div {\n font-weight: bold;\n height: 100%;\n margin: 0;\n padding: 10px;\n padding-top: 20px;\n font-family: \"Inter\", sans-serif;\n font-size: 16px;\n background-color: var(--bg-main);\n color: var(--text);\n }\n</style>\n","import App from \"./App.svelte\"\n\nconst app = new App({\n target: document.body,\n})\n\nexport default app\n"],"names":["noop","assign","tar","src","k","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","src_url_equal","element_src","url","document","createElement","href","create_slot","definition","ctx","$$scope","slot_ctx","get_slot_context","slice","get_slot_changes","dirty","lets","undefined","merged","len","Math","max","length","i","update_slot_base","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","p","get_all_dirty_from_scope","exclude_internal_props","props","result","compute_rest_props","keys","rest","Set","has","append","target","node","appendChild","insert","anchor","insertBefore","detach","parentNode","removeChild","element","name","svg_element","createElementNS","text","data","createTextNode","space","empty","listen","event","handler","options","addEventListener","removeEventListener","attr","attribute","value","removeAttribute","getAttribute","setAttribute","always_set_through_set_attribute","set_attributes","attributes","descriptors","getOwnPropertyDescriptors","__proto__","key","style","cssText","set","indexOf","set_svg_attributes","toggle_class","toggle","classList","current_component","set_current_component","component","get_current_component","Error","onDestroy","$$","on_destroy","push","bubble","callbacks","type","call","this","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","add_render_callback","seen_callbacks","flushidx","flush","saved_component","update","e","pop","callback","add","clear","fragment","before_update","after_update","outroing","outros","group_outros","r","c","check_outros","transition_in","block","local","delete","transition_out","o","d","get_spread_update","levels","updates","to_null_out","accounted_for","n","create_component","mount_component","customElement","m","new_on_destroy","on_mount","map","filter","destroy_component","detaching","filtered","targets","flush_render_callbacks","make_dirty","then","fill","init","instance","create_fragment","not_equal","append_styles","parent_component","bound","on_disconnect","context","Map","skip_bound","root","ready","ret","hydrate","nodes","Array","from","childNodes","children","l","intro","SvelteComponent","$destroy","$on","index","splice","$set","$$props","obj","$$set","getRandomInstance","instances","random","pingOnce","async","started","http","XMLHttpRequest","timeout","ontimeout","onerror","onreadystatechange","readyState","status","ended","Date","getTime","abort","open","send","ping","time","average","parseInt","randomInstances","clearnet","randomInstance","floor","window","browser","chrome","utils","getNextInstance","currentInstanceUrl","currentInstanceIndex","protocolHost","pathname","replace","host","endsWith","protocol","username","password","getList","fetchInstances","DONE","JSON","parse","responseText","getBlacklist","getConfig","fetch","response","json","getOptions","storage","get","getPingCache","pingCache","addressToLatLng","address","encodeURIComponent","coordinate","lat","lon","boundingbox","getQuery","query","searchParams","prefsEncoded","prefs","URLSearchParams","toString","convertMapCentre","zoom","reg","match","split","vars","dark","bgMain","bgSecondary","active","danger","lightGrey","light","theme","matchMedia","matches","cssVariables","autoPickInstance","findIndex","startsWith","pings","all","sort","isChrome","runtime","getBrowserInfo","config","service","frontend","services","frontends","regexArray","targetList","redirectGoogle","val","excludeTargets","includes","disableTwimg","targetString","RegExp","test","redirect","originUrl","documentUrl","incognito","forceRedirection","redirectOnlyInIncognito","enabled","desktopApp","redirectType","embedFrontend","embeddable","unsupportedUrls","instanceList","localhost","origin","search","searchQuery","s","exec","regex","hostname","subdomain","layers","mapCentre","mapCentreData","bbox","marker","travelModes","driving","walking","bicycling","transit","engine","regex1","regex2","decodeURIComponent","destination","route","placeRegex","mlat","mlon","wiki","urlpath","threadID","notExchangeRegex","hostSplit","hash","link","artist","directory","format","file","token","path","lang","substring","lastIndexOf","watch","id","extra","blogregex","blog_name","artReg","userReg","galleryReg","channelReg","rewrite","reverse","onChanged","addListener","defaultInstances","materialious","viewtube","piped","pipedMaterial","cloudtube","lightTube","poketube","proxiTok","offtiktok","redlib","eddrit","troddit","scribe","libMedium","small","freedium","quetre","libremdb","simplyTranslate","translite","mozhi","searxng","websurfx","rimgo","hyperpipe","osm","breezeWiki","neuters","dumb","intellectual","ruralDictionary","anonymousOverflow","suds","unfunny","soprano","meme","waybackClassic","tent","laboratory","binternet","painterest","pixivFe","liteXiv","pixivViewer","vixipy","indestructables","destructables","structables","safetwitch","twineo","proxigram","tuboYoutube","tuboSoundcloud","tekstoLibre","skyview","priviblur","nitter","pasted","pasty","freetar","ultimateTab","ratAintTieba","shoelace","skunkyArt","ytify","nerdsForNerds","ducksForDucks","koub","soundcloak","gocook","wikimore","libreTranslate","cryptPad","getDefaults","defaultOption","exceptions","popupServices","servicesHelper","redirectAsync","computeServiceFrontend","initDefaults","processUpdate","_options","defaults","optionName","subOptionName","defaultName","defaultValue","entries","serviceName","serviceValue","copyRaw","newUrl","copyFrom","textContent","body","select","execCommand","blur","navigator","clipboard","writeText","switchInstance","customService","instancesList","newInstance","isException","item","URL","div","span","svg","subscriber_queue","writable","start","stop","subscribers","new_value","run_queue","subscriber","subscribe","invalidate","size","page","dir","input","apply","arguments","checked","onChange","create_if_block_1","img","img_src_value","img_alt_value","label","create_if_block_2","create_if_block","_config","details","unsubscribeOptions","$$invalidate","unsubscribeConfig","imageType","t_value","set_data","t","div0","div1","serviceKey","tabs","close","getURL","i18n","getMessage","class","row0_changes","row1_changes","create_if_block_6","t0_value","t2_value","hr","if_block","create_if_block_7","if_block1","create_if_block_4","create_if_block_3","each_value","each_blocks","iterations","redirectToOriginal","currentWindow","autoPicking","autoPick","sendMessage","message","tabId","opts","app"],"mappings":"gCAAA,SAASA,IAAU,CAEnB,SAASC,EAAOC,EAAKC,GAEjB,IAAK,MAAMC,KAAKD,EACZD,EAAIE,GAAKD,EAAIC,GACjB,OAAOF,CACX,CAWA,SAASG,EAAIC,GACT,OAAOA,GACX,CACA,SAASC,IACL,OAAOC,OAAOC,OAAO,KACzB,CACA,SAASC,EAAQC,GACbA,EAAIC,QAAQP,EAChB,CACA,SAASQ,EAAYC,GACjB,MAAwB,mBAAVA,CAClB,CACA,SAASC,EAAeC,EAAGC,GACvB,OAAOD,GAAKA,EAAIC,GAAKA,EAAID,IAAMC,GAAOD,GAAkB,iBAANA,GAAgC,mBAANA,CAChF,CACA,IAAIE,EACJ,SAASC,EAAcC,EAAaC,GAKhC,OAJKH,IACDA,EAAuBI,SAASC,cAAc,MAElDL,EAAqBM,KAAOH,EACrBD,IAAgBF,EAAqBM,IAChD,CA2BA,SAASC,EAAYC,EAAYC,EAAKC,EAAStB,GAC3C,GAAIoB,EAAY,CACZ,MAAMG,EAAWC,EAAiBJ,EAAYC,EAAKC,EAAStB,GAC5D,OAAOoB,EAAW,GAAGG,EACxB,CACL,CACA,SAASC,EAAiBJ,EAAYC,EAAKC,EAAStB,GAChD,OAAOoB,EAAW,IAAMpB,EAClBL,EAAO2B,EAAQD,IAAII,QAASL,EAAW,GAAGpB,EAAGqB,KAC7CC,EAAQD,GAClB,CACA,SAASK,EAAiBN,EAAYE,EAASK,EAAO3B,GAClD,GAAIoB,EAAW,IAAMpB,EAAI,CACrB,MAAM4B,EAAOR,EAAW,GAAGpB,EAAG2B,IAC9B,QAAsBE,IAAlBP,EAAQK,MACR,OAAOC,EAEX,GAAoB,iBAATA,EAAmB,CAC1B,MAAME,EAAS,GACTC,EAAMC,KAAKC,IAAIX,EAAQK,MAAMO,OAAQN,EAAKM,QAChD,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAKI,GAAK,EAC1BL,EAAOK,GAAKb,EAAQK,MAAMQ,GAAKP,EAAKO,GAExC,OAAOL,CACV,CACD,OAAOR,EAAQK,MAAQC,CAC1B,CACD,OAAON,EAAQK,KACnB,CACA,SAASS,EAAiBC,EAAMC,EAAiBjB,EAAKC,EAASiB,EAAcC,GACzE,GAAID,EAAc,CACd,MAAME,EAAejB,EAAiBc,EAAiBjB,EAAKC,EAASkB,GACrEH,EAAKK,EAAED,EAAcF,EACxB,CACL,CAKA,SAASI,EAAyBrB,GAC9B,GAAIA,EAAQD,IAAIa,OAAS,GAAI,CACzB,MAAMP,EAAQ,GACRO,EAASZ,EAAQD,IAAIa,OAAS,GACpC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAQC,IACxBR,EAAMQ,IAAM,EAEhB,OAAOR,CACV,CACD,OAAQ,CACZ,CACA,SAASiB,EAAuBC,GAC5B,MAAMC,EAAS,CAAA,EACf,IAAK,MAAMhD,KAAK+C,EACC,MAAT/C,EAAE,KACFgD,EAAOhD,GAAK+C,EAAM/C,IAC1B,OAAOgD,CACX,CACA,SAASC,EAAmBF,EAAOG,GAC/B,MAAMC,EAAO,CAAA,EACbD,EAAO,IAAIE,IAAIF,GACf,IAAK,MAAMlD,KAAK+C,EACPG,EAAKG,IAAIrD,IAAe,MAATA,EAAE,KAClBmD,EAAKnD,GAAK+C,EAAM/C,IACxB,OAAOmD,CACX,CA6NA,SAASG,EAAOC,EAAQC,GACpBD,EAAOE,YAAYD,EACvB,CAoDA,SAASE,EAAOH,EAAQC,EAAMG,GAC1BJ,EAAOK,aAAaJ,EAAMG,GAAU,KACxC,CASA,SAASE,EAAOL,GACRA,EAAKM,YACLN,EAAKM,WAAWC,YAAYP,EAEpC,CAOA,SAASQ,EAAQC,GACb,OAAO/C,SAASC,cAAc8C,EAClC,CAgBA,SAASC,EAAYD,GACjB,OAAO/C,SAASiD,gBAAgB,6BAA8BF,EAClE,CACA,SAASG,EAAKC,GACV,OAAOnD,SAASoD,eAAeD,EACnC,CACA,SAASE,IACL,OAAOH,EAAK,IAChB,CACA,SAASI,IACL,OAAOJ,EAAK,GAChB,CAIA,SAASK,EAAOjB,EAAMkB,EAAOC,EAASC,GAElC,OADApB,EAAKqB,iBAAiBH,EAAOC,EAASC,GAC/B,IAAMpB,EAAKsB,oBAAoBJ,EAAOC,EAASC,EAC1D,CAoCA,SAASG,EAAKvB,EAAMwB,EAAWC,GACd,MAATA,EACAzB,EAAK0B,gBAAgBF,GAChBxB,EAAK2B,aAAaH,KAAeC,GACtCzB,EAAK4B,aAAaJ,EAAWC,EACrC,CAQA,MAAMI,EAAmC,CAAC,QAAS,UACnD,SAASC,EAAe9B,EAAM+B,GAE1B,MAAMC,EAAcpF,OAAOqF,0BAA0BjC,EAAKkC,WAC1D,IAAK,MAAMC,KAAOJ,EACS,MAAnBA,EAAWI,GACXnC,EAAK0B,gBAAgBS,GAER,UAARA,EACLnC,EAAKoC,MAAMC,QAAUN,EAAWI,GAEnB,YAARA,EACLnC,EAAKyB,MAAQzB,EAAKmC,GAAOJ,EAAWI,GAE/BH,EAAYG,IAAQH,EAAYG,GAAKG,MAA0D,IAAnDT,EAAiCU,QAAQJ,GAC1FnC,EAAKmC,GAAOJ,EAAWI,GAGvBZ,EAAKvB,EAAMmC,EAAKJ,EAAWI,GAGvC,CACA,SAASK,EAAmBxC,EAAM+B,GAC9B,IAAK,MAAMI,KAAOJ,EACdR,EAAKvB,EAAMmC,EAAKJ,EAAWI,GAEnC,CA+UA,SAASM,EAAajC,EAASC,EAAMiC,GACjClC,EAAQmC,UAAUD,EAAS,MAAQ,UAAUjC,EACjD,CAiPA,IAAImC,EACJ,SAASC,EAAsBC,GAC3BF,EAAoBE,CACxB,CACA,SAASC,IACL,IAAKH,EACD,MAAM,IAAII,MAAM,oDACpB,OAAOJ,CACX,CAuCA,SAASK,EAAUvG,GACfqG,IAAwBG,GAAGC,WAAWC,KAAK1G,EAC/C,CAyEA,SAAS2G,EAAOP,EAAW5B,GACvB,MAAMoC,EAAYR,EAAUI,GAAGI,UAAUpC,EAAMqC,MAC3CD,GAEAA,EAAUnF,QAAQnB,SAAQN,GAAMA,EAAG8G,KAAKC,KAAMvC,IAEtD,CAEA,MAAMwC,EAAmB,GAEnBC,EAAoB,GAC1B,IAAIC,EAAmB,GACvB,MAAMC,EAAkB,GAClBC,EAAmCC,QAAQC,UACjD,IAAIC,GAAmB,EAWvB,SAASC,EAAoBxH,GACzBkH,EAAiBR,KAAK1G,EAC1B,CAsBA,MAAMyH,EAAiB,IAAIvE,IAC3B,IAAIwE,EAAW,EACf,SAASC,IAIL,GAAiB,IAAbD,EACA,OAEJ,MAAME,EAAkB1B,EACxB,EAAG,CAGC,IACI,KAAOwB,EAAWV,EAAiB9E,QAAQ,CACvC,MAAMkE,EAAYY,EAAiBU,GACnCA,IACAvB,EAAsBC,GACtByB,EAAOzB,EAAUI,GACpB,CACJ,CACD,MAAOsB,GAIH,MAFAd,EAAiB9E,OAAS,EAC1BwF,EAAW,EACLI,CACT,CAID,IAHA3B,EAAsB,MACtBa,EAAiB9E,OAAS,EAC1BwF,EAAW,EACJT,EAAkB/E,QACrB+E,EAAkBc,KAAlBd,GAIJ,IAAK,IAAI9E,EAAI,EAAGA,EAAI+E,EAAiBhF,OAAQC,GAAK,EAAG,CACjD,MAAM6F,EAAWd,EAAiB/E,GAC7BsF,EAAetE,IAAI6E,KAEpBP,EAAeQ,IAAID,GACnBA,IAEP,CACDd,EAAiBhF,OAAS,CAClC,OAAa8E,EAAiB9E,QAC1B,KAAOiF,EAAgBjF,QACnBiF,EAAgBY,KAAhBZ,GAEJI,GAAmB,EACnBE,EAAeS,QACf/B,EAAsByB,EAC1B,CACA,SAASC,EAAOrB,GACZ,GAAoB,OAAhBA,EAAG2B,SAAmB,CACtB3B,EAAGqB,SACHzH,EAAQoG,EAAG4B,eACX,MAAMzG,EAAQ6E,EAAG7E,MACjB6E,EAAG7E,MAAQ,EAAE,GACb6E,EAAG2B,UAAY3B,EAAG2B,SAASzF,EAAE8D,EAAGnF,IAAKM,GACrC6E,EAAG6B,aAAa/H,QAAQkH,EAC3B,CACL,CAyBA,MAAMc,EAAW,IAAIpF,IACrB,IAAIqF,EACJ,SAASC,IACLD,EAAS,CACLE,EAAG,EACHC,EAAG,GACHhG,EAAG6F,EAEX,CACA,SAASI,IACAJ,EAAOE,GACRrI,EAAQmI,EAAOG,GAEnBH,EAASA,EAAO7F,CACpB,CACA,SAASkG,EAAcC,EAAOC,GACtBD,GAASA,EAAM1G,IACfmG,EAASS,OAAOF,GAChBA,EAAM1G,EAAE2G,GAEhB,CACA,SAASE,EAAeH,EAAOC,EAAOnF,EAAQqE,GAC1C,GAAIa,GAASA,EAAMI,EAAG,CAClB,GAAIX,EAASnF,IAAI0F,GACb,OACJP,EAASL,IAAIY,GACbN,EAAOG,EAAEhC,MAAK,KACV4B,EAASS,OAAOF,GACZb,IACIrE,GACAkF,EAAMK,EAAE,GACZlB,IACH,IAELa,EAAMI,EAAEH,EACX,MACQd,GACLA,GAER,CAkaA,SAASmB,EAAkBC,EAAQC,GAC/B,MAAMxB,EAAS,CAAA,EACTyB,EAAc,CAAA,EACdC,EAAgB,CAAEjI,QAAS,GACjC,IAAIa,EAAIiH,EAAOlH,OACf,KAAOC,KAAK,CACR,MAAM8G,EAAIG,EAAOjH,GACXqH,EAAIH,EAAQlH,GAClB,GAAIqH,EAAG,CACH,IAAK,MAAM/D,KAAOwD,EACRxD,KAAO+D,IACTF,EAAY7D,GAAO,GAE3B,IAAK,MAAMA,KAAO+D,EACTD,EAAc9D,KACfoC,EAAOpC,GAAO+D,EAAE/D,GAChB8D,EAAc9D,GAAO,GAG7B2D,EAAOjH,GAAKqH,CACf,MAEG,IAAK,MAAM/D,KAAOwD,EACdM,EAAc9D,GAAO,CAGhC,CACD,IAAK,MAAMA,KAAO6D,EACR7D,KAAOoC,IACTA,EAAOpC,QAAO5D,GAEtB,OAAOgG,CACX,CAiOA,SAAS4B,EAAiBZ,GACtBA,GAASA,EAAMH,GACnB,CAIA,SAASgB,GAAgBtD,EAAW/C,EAAQI,EAAQkG,GAChD,MAAMxB,SAAEA,EAAQE,aAAEA,GAAiBjC,EAAUI,GAC7C2B,GAAYA,EAASyB,EAAEvG,EAAQI,GAC1BkG,GAEDnC,GAAoB,KAChB,MAAMqC,EAAiBzD,EAAUI,GAAGsD,SAASC,IAAIhK,GAAKiK,OAAOzJ,GAIzD6F,EAAUI,GAAGC,WACbL,EAAUI,GAAGC,WAAWC,QAAQmD,GAKhCzJ,EAAQyJ,GAEZzD,EAAUI,GAAGsD,SAAW,EAAE,IAGlCzB,EAAa/H,QAAQkH,EACzB,CACA,SAASyC,GAAkB7D,EAAW8D,GAClC,MAAM1D,EAAKJ,EAAUI,GACD,OAAhBA,EAAG2B,YA9vBX,SAAgC9H,GAC5B,MAAM8J,EAAW,GACXC,EAAU,GAChBlD,EAAiB5G,SAASoI,IAA0B,IAApBrI,EAAIwF,QAAQ6C,GAAYyB,EAASzD,KAAKgC,GAAK0B,EAAQ1D,KAAKgC,KACxF0B,EAAQ9J,SAASoI,GAAMA,MACvBxB,EAAmBiD,CACvB,CAyvBQE,CAAuB7D,EAAG6B,cAC1BjI,EAAQoG,EAAGC,YACXD,EAAG2B,UAAY3B,EAAG2B,SAASe,EAAEgB,GAG7B1D,EAAGC,WAAaD,EAAG2B,SAAW,KAC9B3B,EAAGnF,IAAM,GAEjB,CACA,SAASiJ,GAAWlE,EAAWjE,IACI,IAA3BiE,EAAUI,GAAG7E,MAAM,KACnBqF,EAAiBN,KAAKN,GA52BrBmB,IACDA,GAAmB,EACnBH,EAAiBmD,KAAK5C,IA42BtBvB,EAAUI,GAAG7E,MAAM6I,KAAK,IAE5BpE,EAAUI,GAAG7E,MAAOQ,EAAI,GAAM,IAAO,GAAMA,EAAI,EACnD,CACA,SAASsI,GAAKrE,EAAW1B,EAASgG,EAAUC,EAAiBC,EAAW/H,EAAOgI,EAAelJ,EAAQ,EAAE,IACpG,MAAMmJ,EAAmB5E,EACzBC,EAAsBC,GACtB,MAAMI,EAAKJ,EAAUI,GAAK,CACtB2B,SAAU,KACV9G,IAAK,GAELwB,QACAgF,OAAQnI,EACRkL,YACAG,MAAO9K,IAEP6J,SAAU,GACVrD,WAAY,GACZuE,cAAe,GACf5C,cAAe,GACfC,aAAc,GACd4C,QAAS,IAAIC,IAAIxG,EAAQuG,UAAYH,EAAmBA,EAAiBtE,GAAGyE,QAAU,KAEtFrE,UAAW3G,IACX0B,QACAwJ,YAAY,EACZC,KAAM1G,EAAQrB,QAAUyH,EAAiBtE,GAAG4E,MAEhDP,GAAiBA,EAAcrE,EAAG4E,MAClC,IAAIC,GAAQ,EAkBZ,GAjBA7E,EAAGnF,IAAMqJ,EACHA,EAAStE,EAAW1B,EAAQ7B,OAAS,CAAE,GAAE,CAACV,EAAGmJ,KAAQrI,KACnD,MAAM8B,EAAQ9B,EAAKf,OAASe,EAAK,GAAKqI,EAOtC,OANI9E,EAAGnF,KAAOuJ,EAAUpE,EAAGnF,IAAIc,GAAIqE,EAAGnF,IAAIc,GAAK4C,MACtCyB,EAAG2E,YAAc3E,EAAGuE,MAAM5I,IAC3BqE,EAAGuE,MAAM5I,GAAG4C,GACZsG,GACAf,GAAWlE,EAAWjE,IAEvBmJ,CAAG,IAEZ,GACN9E,EAAGqB,SACHwD,GAAQ,EACRjL,EAAQoG,EAAG4B,eAEX5B,EAAG2B,WAAWwC,GAAkBA,EAAgBnE,EAAGnF,KAC/CqD,EAAQrB,OAAQ,CAChB,GAAIqB,EAAQ6G,QAAS,CAEjB,MAAMC,EAvhDlB,SAAkB1H,GACd,OAAO2H,MAAMC,KAAK5H,EAAQ6H,WAC9B,CAqhD0BC,CAASlH,EAAQrB,QAE/BmD,EAAG2B,UAAY3B,EAAG2B,SAAS0D,EAAEL,GAC7BA,EAAMlL,QAAQqD,EACjB,MAGG6C,EAAG2B,UAAY3B,EAAG2B,SAASO,IAE3BhE,EAAQoH,OACRlD,EAAcxC,EAAUI,GAAG2B,UAC/BuB,GAAgBtD,EAAW1B,EAAQrB,OAAQqB,EAAQjB,OAAQiB,EAAQiF,eAEnEhC,GACH,CACDxB,EAAsB2E,EAC1B,CAoDA,MAAMiB,GACF,QAAAC,GACI/B,GAAkBlD,KAAM,GACxBA,KAAKiF,SAAWtM,CACnB,CACD,GAAAuM,CAAIpF,EAAMmB,GACN,IAAKzH,EAAYyH,GACb,OAAOtI,EAEX,MAAMkH,EAAaG,KAAKP,GAAGI,UAAUC,KAAUE,KAAKP,GAAGI,UAAUC,GAAQ,IAEzE,OADAD,EAAUF,KAAKsB,GACR,KACH,MAAMkE,EAAQtF,EAAUf,QAAQmC,IACjB,IAAXkE,GACAtF,EAAUuF,OAAOD,EAAO,EAAE,CAErC,CACD,IAAAE,CAAKC,GAhrET,IAAkBC,EAirENvF,KAAKwF,QAjrECD,EAirEkBD,EAhrEG,IAA5BnM,OAAO8C,KAAKsJ,GAAKpK,UAirEhB6E,KAAKP,GAAG2E,YAAa,EACrBpE,KAAKwF,MAAMF,GACXtF,KAAKP,GAAG2E,YAAa,EAE5B,EC5tEL,SAASqB,GAAkBC,GACzB,OAAOA,KAAaA,EAAUvK,OAASF,KAAK0K,UAC9C,CAsHA,SAASC,GAASzL,GAChB,OAAO,IAAImG,SAAQuF,UACjB,IAAIC,EACAC,EAAO,IAAIC,eACfD,EAAKE,QAAU,IACfF,EAAKG,UAAY,IAAM3F,EAAQ,KAC/BwF,EAAKI,QAAU,IAAM5F,IACrBwF,EAAKK,mBAAqB,KACxB,GAAuB,GAAnBL,EAAKM,WACP,GAAmB,KAAfN,EAAKO,OAAe,CACtB,IAAIC,GAAQ,IAAIC,MAAOC,UACvBV,EAAKW,QACLnG,EAAQgG,EAAQT,EAC1B,MACUvF,EAAQ,IAAOwF,EAAKO,OAEvB,EAEHP,EAAKY,KAAK,MAAO,GAAGxM,QAAU,IAAIqM,MAAOC,aAAa,GACtDX,GAAU,IAAIU,MAAOC,UACrBV,EAAKa,KAAK,KAAK,GAEnB,CAKA,SAASC,GAAK1M,GACZ,OAAO,IAAImG,SAAQuF,UACjB,IACIiB,EADAC,EAAU,EAEd,IAAK,IAAI3L,EAAI,EAAGA,EAAI,EAAGA,IAErB,GADA0L,QAAalB,GAASzL,GACb,GAALiB,EAAJ,CACA,GAAI0L,GAAQ,IAEV,YADAvG,EAAQuG,GAGVC,GAAWD,CALC,CAOdC,EAAUC,SAASD,EAAU,GAC7BxG,EAAQwG,EAAQ,GAEpB,CA6CO,SAASE,GAAgBC,EAAUzE,GACxC,IAAIiD,EAAY,GACZjD,EAAIyE,EAAS/L,SAAQsH,EAAIyE,EAAS/L,QACtC,IAAK,IAAIC,EAAI,EAAGA,EAAIqH,EAAGrH,IAAK,CAC1B,MACM+L,EAAiBD,EADFjM,KAAKmM,MAAMnM,KAAK0K,SAAWuB,EAAS/L,SAEzDuK,EAAU/F,KAAKwH,EAChB,CACD,OAAOzB,CACT,CA/NA2B,OAAOC,QAAUD,OAAOC,SAAWD,OAAOE,OAuR3B,IAAAC,GAAA,CACb/B,qBACAgC,gBA1QF,SAAyBC,EAAoBhC,GAC3C,MAAMiC,EAAuBjC,EAAU5G,QAAQ4I,GAC/C,OAA8B,IAA1BC,EAAoClC,GAAkBC,GAEnDA,GADoBiC,EAAuB,GAAKjC,EAAUvK,OAEnE,EAsQEyM,aAjQF,SAAsB5N,GACpB,MAAM6N,EAAW7N,EAAI6N,SAASC,QAAQ,MAAO,IAG7C,MAAgB,gBAAZD,GAA8B7N,EAAI+N,KAAKC,SAAS,aAC3C,GAAGhO,EAAIiO,aAAajO,EAAI+N,OAAOF,EAASnN,MAAM,GAAI,KAEvDV,EAAIkO,UAAYlO,EAAImO,SAAiB,GAAGnO,EAAIiO,aAAajO,EAAIkO,YAAYlO,EAAImO,YAAYnO,EAAI+N,OAAOF,IAEjG,GAAG7N,EAAIiO,aAAajO,EAAI+N,OAAOF,GACxC,EAwPEO,QAnLF,SAAiBzK,GACf,OAAO,IAAI2C,SAAQC,IACjB,IAAIvG,EACJ,GAA8B,UAA1B2D,EAAQ0K,eACVrO,EAAM,6EACH,IAA8B,YAA1B2D,EAAQ0K,eAEZ,OAAO9H,EAAQ,YADlBvG,EAAM,sEACsB,CAC9B,MAAM+L,EAAO,IAAIC,eACjBD,EAAKY,KAAK,MAAO3M,GAAK,GACtB+L,EAAKK,mBAAqB,KACxB,GAAoB,MAAhBL,EAAKO,QAAkBP,EAAKM,YAAcL,eAAesC,KAAM,OAAO/H,EAAQgI,KAAKC,MAAMzC,EAAK0C,cAAa,EAEjH1C,EAAKI,QAAU,IAAM5F,IACrBwF,EAAKG,UAAY,IAAM3F,IACvBwF,EAAKa,KAAK,KAAK,GAEnB,EAmKE8B,aAvMF,SAAsB/K,GACpB,OAAO,IAAI2C,SAAQC,IACjB,IAAIvG,EACJ,GAA8B,UAA1B2D,EAAQ0K,eACVrO,EAAM,kFACH,IAA8B,YAA1B2D,EAAQ0K,eAEZ,OAAO9H,EAAQ,YADlBvG,EAAM,2EACsB,CAC9B,MAAM+L,EAAO,IAAIC,eACjBD,EAAKY,KAAK,MAAO3M,GAAK,GACtB+L,EAAKK,mBAAqB,KACJ,MAAhBL,EAAKO,QAAkBP,EAAKM,YAAcL,eAAesC,MAAM/H,EAAQgI,KAAKC,MAAMzC,EAAK0C,cAAc,EAE3G1C,EAAKI,QAAU,IAAM5F,IACrBwF,EAAKG,UAAY,IAAM3F,IACvBwF,EAAKa,KAAK,KAAK,GAEnB,EAuLE+B,UAnOF,WACE,OAAO,IAAIrI,SAAQC,IACjBqI,MAAM,gBACHpF,MAAKqF,GAAYA,EAAS1L,SAC1BqG,MAAKsF,IACJvI,EAAQgI,KAAKC,MAAMM,GACnB,GACA,GAER,EA2NEC,WAjNF,WACE,OAAO,IAAIzI,SAAQC,GAAW+G,QAAQ0B,QAAQjH,MAAMkH,IAAI,WAAWvH,GAAKnB,EAAQmB,EAAE/D,YACpF,EAgNEuL,aA9MF,WACE,OAAO,IAAI5I,SAAQC,GAAW+G,QAAQ0B,QAAQjH,MAAMkH,IAAI,aAAavH,GAAKnB,EAAQmB,EAAEyH,WAAa,CAAA,MACnG,EA6MEtC,QACAuC,gBAtHF,SAAyBC,GACvB,MAAMtD,EAAO,IAAIC,eAOjB,GANAD,EAAKY,KACH,MACA,gDAAgD2C,mBAAmBD,0BACnE,GAEFtD,EAAKa,OACc,KAAfb,EAAKO,OAAe,CACtB,MAAMwC,EAAOP,KAAKC,MAAMzC,EAAK0C,cAAc,GAC3C,OAAIK,EACK,CACLS,WAAY,GAAGT,EAAKU,OAAOV,EAAKW,MAChCC,YAAa,GAAGZ,EAAKY,YAAY,MAAMZ,EAAKY,YAAY,MAAMZ,EAAKY,YAAY,MAAMZ,EAAKY,YAAY,MAGnG,CAAE,CACV,CACH,EAqGEC,SAnGF,SAAkB3P,GAChB,IAAI4P,EAAQ,GAGZ,OAFI5P,EAAI6P,aAAazN,IAAI,KAAMwN,EAAQ5P,EAAI6P,aAAaZ,IAAI,KACnDjP,EAAI6P,aAAazN,IAAI,WAAUwN,EAAQ5P,EAAI6P,aAAazN,IAAI,UAC9DwN,CACT,EA+FEE,aA9FF,SAAsBC,GACpB,OAAO,IAAIC,gBAAgBD,GAAOE,UACpC,EA6FEC,iBA3FF,SAA0BlQ,GACxB,IAAKwP,EAAKC,EAAKU,GAAQ,CAAC,KAAM,KAAM,MACpC,MAAMC,EAAMpQ,EAAI6N,SAASwC,MAAM,8CAQ/B,OAPID,GACD,CAAGX,EAAKD,EAAKW,GAAQC,EACbpQ,EAAI6P,aAAazN,IAAI,aAE5BoN,EAAKC,GAAOzP,EAAI6P,aAAaZ,IAAI,UAAUqB,MAAM,KACnDH,EAAOnQ,EAAI6P,aAAaZ,IAAI,SAAW,MAElC,CAAEkB,OAAMV,MAAKD,MACtB,EAiFEvC,mBACAtI,MAtDK,SAAehB,EAAS0J,GAC7B,MAAMkD,EASR,SAAsB5M,EAAS0J,GAC7B,MAAMmD,EAAO,CACXrN,KAAM,OACNsN,OAAQ,UACRC,YAAa,UACbC,OAAQ,UACRC,OAAQ,UACRC,UAAW,WAGPC,EAAQ,CACZ3N,KAAM,QACNsN,OAAQ,QACRC,YAAa,UACbC,OAAQ,UACRC,OAAQ,UACRC,UAAW,WAEb,MAAqB,QAAjBlN,EAAQoN,MACHP,EACmB,SAAjB7M,EAAQoN,MACVD,EACEzD,EAAO2D,WAAW,gCAAgCC,QACpDT,EAEAM,CAEX,CApCeI,CAAavN,EAAS0J,GACnC,MAAO,WAAWkD,EAAKpN,uBACVoN,EAAKE,8BACAF,EAAKG,6BACXH,EAAKI,wBACLJ,EAAKK,4BACDL,EAAKM,YACvB,EA+CEM,iBAtEFtF,eAAgCqB,EAAUlN,GACxC,GAAIA,EAAK,CACP,MAAMoB,EAAI8L,EAASkE,WAAUzH,GAAY3J,EAAIG,KAAKkR,WAAW1H,KACzDvI,GAAK,GAAG8L,EAAS9B,OAAOhK,EAAG,EAChC,CACD,MAAMuK,EAASsB,GAAgBC,EAAU,GACnCoE,QAAchL,QAAQiL,IAAI,IAC3B5F,EAAO3C,KAAI6C,SACL,CAAClC,QAAgBkD,GAAKlD,QAIjC,OADA2H,EAAME,MAAK,CAAC7R,EAAGC,IAAMD,EAAE,GAAKC,EAAE,KACvB0R,EAAM,GAAG,EAClB,GC5OA,MAAMG,QAA8C3Q,IAAnCwM,QAAQoE,QAAQC,eAGjC,IAAIC,GAAQjO,GAEZkI,eAAenC,KACb/F,SAAgB6J,GAAMuB,aACtB6C,SAAepE,GAAMmB,WACvB,CAKA,SAAS4C,GAAIM,EAASC,EAAUnO,EAASiO,GACvC,IAAIlG,EAAY,GAChB,GAAKoG,EAMMnO,EAAQmO,KACjBpG,EAAY/H,EAAQmO,SANpB,IAAK,MAAMA,KAAYF,EAAOG,SAASF,GAASG,UAC1CrO,EAAQmO,IACVpG,EAAU/F,QAAQhC,EAAQmO,IAMhC,OAAOpG,CACT,CASA,SAASuG,GAAWJ,EAAS7R,EAAK4R,EAAQjO,EAASmO,GACjD,IAAII,EAAaN,EAAOG,SAASF,GAASxI,QACtCyI,MAEA,mBAAoBF,EAAOG,SAASF,GAASG,UAAUF,KAC1C,WAAZD,GAAyBlO,EAAgB,OAAEwO,iBAE5CD,EAAaA,EAAWjJ,QACtBmJ,IAAQR,EAAOG,SAASF,GAASG,UAAUF,GAAUO,eAAeC,SAASJ,EAAWpN,QAAQsN,OAGpF,YAAZP,GAAyBlO,EAAiB,QAAE4O,eAC9CL,EAAaA,EAAW9G,OAAO,KAGnC,IAAK,MAAMoH,KAAgBN,EAAY,CAErC,GADe,IAAIO,OAAOP,EAAWM,IAC1BE,KAAK1S,EAAIG,MAAO,OAAO,CACnC,CACD,OAAO,CACT,CAolBA,SAASwS,GAAS3S,EAAK8F,EAAM8M,EAAWC,EAAaC,EAAWC,GAC9D,GAAY,cAARjN,GAAgC,aAARA,GAA+B,SAARA,EAAiB,OACpE,IAAIqH,EACA2E,EACJ,GAAKiB,GAAuD,GAAnCpP,GAAQqP,yBAAoCF,EAArE,CACA,IAAK,MAAMjB,KAAWD,GAAOG,SAAU,CACrC,IAAKgB,IAAqBpP,GAAQkO,GAASoB,QAAS,SACpD,IAAKF,GAAgE,GAA5CpP,GAAQkO,GAASmB,0BAAoCF,EAAW,SAWzF,GATAhB,EAAWnO,GAAQkO,GAASC,SAG1BF,GAAOG,SAASF,GAASG,UAAUF,GAAUoB,YACrC,cAARpN,GACiC,cAAjCnC,GAAQkO,GAASsB,eAEjBrB,EAAWnO,GAAQkO,GAASuB,gBAEzBnB,GAAWJ,EAAS7R,EAAK4R,GAAQjO,GAASmO,GAAW,CACxDA,EAAW,KACX,QACD,CAED,GAAY,cAARhM,GAAwB+M,GAAgD,aAAjClP,GAAQkO,GAASsB,cACtDlB,GAAWJ,EAASgB,EAAajB,GAAQjO,GAASmO,GACpD,OAIJ,GACEF,GAAOG,SAASF,GAASwB,YACzBvN,GAAQnC,GAAQkO,GAASsB,cACQ,QAAjCxP,GAAQkO,GAASsB,aAEjB,MAAwC,SAApCxP,GAAQkO,GAASyB,gBAAmC,cACxD,EAGF,IAAIC,EAAe5P,GAAQmO,GAC3B,QAAqBhR,IAAjByS,EAA4B,MAEhC,GAAI3B,GAAOG,SAASF,GAASG,UAAUF,GAAU0B,WAA0C,aAA7B7P,GAAQkO,GAASlI,SAC7EwD,EAAiB,UAAU2E,uBACtB,IAA4B,IAAxByB,EAAapS,OACtB,MAAO,oDAAoDmO,mBAAmBwC,UAAiBxC,mBAAmBtP,EAAIG,QAEtHgN,EAAiBK,GAAM/B,kBAAkB8H,EAC1C,CAED,GAAIX,GAAaW,EAAajB,SAASM,EAAUa,QAC/C,MAAY,cAAR3N,EAA6B,YACrB,KAEd,KACD,CACD,GAAKgM,EAEL,OApoBF,SAAiB9R,EAAK4S,EAAWd,EAAU3E,EAAgBrH,GACzD,OAAQgM,GACN,IAAK,YACH,IAAK,MAAMpN,IAAO,IAAI1E,EAAI6P,aAAa5N,QAAqB,MAARyC,GAAa1E,EAAI6P,aAAa7H,OAAOtD,GACzF,MAAO,GAAGyI,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAAS5F,QAAQ,kBAAkB6F,GAC/EA,EAAY7F,QAAQ,MAAO,OAE/B,IAAK,QACL,IAAK,UACH,IAAK,MAAMpJ,IAAO,IAAI1E,EAAI6P,aAAa5N,QAAqB,MAARyC,GAAa1E,EAAI6P,aAAa7H,OAAOtD,GACzF,MAAO,GAAGyI,KAAkBnN,EAAI0T,SAClC,IAAK,WACL,IAAK,UACH,IAAK,MAAMhP,IAAO,IAAI1E,EAAI6P,aAAa5N,QAAqB,MAARyC,GAAa1E,EAAI6P,aAAa7H,OAAOtD,GACzF,MAAO,GAAGyI,WAAwBnN,EAAI0T,SACxC,IAAK,OAAQ,CACX,MAAME,EAAI5T,EAAI6P,aAAaZ,IAAI,KAC/B,OAAU,OAAN2E,EAAmB,GAAGzG,WAAwBmC,mBAAmBsE,KAC9DzG,CACR,CACD,IAAK,SACH,IAAK,MAAMzI,KAAO1E,EAAI6P,aAAa5N,OAAmB,KAAPyC,GAAY1E,EAAI6P,aAAa7H,OAAOtD,GACnF,MAAO,GAAGyI,eAA4BnN,EAAI0T,SAC5C,IAAK,SAEH,OADA1T,EAAI6P,aAAa7H,OAAO,MACjBhI,EAAIG,KAAK2N,QAAQ,gBAAiB,aAC3C,IAAK,WAGL,IAAK,cAEH,OADA9N,EAAI6P,aAAa7H,OAAO,MACjB,cAAgBhI,EAAIG,KAC7B,IAAK,WAEH,GADAH,EAAI6P,aAAa7H,OAAO,MACpBhI,EAAI6N,SAASwD,WAAW,YAAa,CACvC,MAAMjB,EAAM,sBAAsByD,KAAK7T,EAAI6N,UAC3C,GAAIuC,EAEF,MAAO,GAAGjD,gBADCiD,EAAI,KAC6BpQ,EAAI0T,QAEnD,CACD,MAAI,cAAcG,KAAK7T,EAAI6N,UAAkBV,EACtC,GAAGA,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAEhD,IAAK,QACL,IAAK,YACL,IAAK,WACL,IAAK,SAAU,CACb,MAAMI,EAAQ9T,EAAI+T,SAAS1D,MAAM,0CACjC,GAAIyD,GAASA,EAAM3S,OAAS,EAAG,CAC7B,MAAM6S,EAAYF,EAAM,GACxB,GAAiB,QAAbE,IAAwBA,EAAU3C,WAAW,cAC/C,MAAO,GAAGlE,MAAmB6G,IAAYhU,EAAI6N,WAAW7N,EAAI0T,QAE/D,CACD,MAAO,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,YACL,IAAK,kBACH,MAAO,GAAGvG,KAAkBnN,EAAI0T,SAClC,IAAK,OACL,IAAK,QACH,OAAOvG,EACT,IAAK,iBACH,MAAO,GAAGA,KAAkBnN,EAAI0T,OAAO5F,QAAQ,KAAM,UAAUA,QAAQ,KAAM,UAAUA,QAAQ,OAAQ,OACzG,IAAK,MAAO,CACV,GAAI8E,GAAgC,qBAAnBA,EAAU7E,KAA6B,OAAOZ,EAE/D,IAAI4C,EAAQ,CAAEkE,OAAQ,UAElBC,EAAY,IAChB,MAAMC,EAAgB3G,GAAM0C,iBAAiBlQ,GAK7C,GAJImU,EAAchE,MAAQgE,EAAc1E,KAAO0E,EAAc3E,MAC3D0E,EAAY,QAAQC,EAAchE,QAAQgE,EAAc1E,OAAO0E,EAAc3E,OAG3ExP,EAAI6N,SAASyE,SAAS,UAAW,CAEnC,MAAM1C,EAAQpC,GAAMmC,SAAS3P,GAC7B,IAAIuP,WAAEA,EAAUG,YAAEA,GAAgBlC,GAAM4B,gBAAgBQ,GAGxD,OAFAG,EAAMqE,KAAO1E,EACbK,EAAMsE,OAAS9E,EACR,GAAGpC,uBAAoCK,GAAMsC,aAAaC,IAClE,CAED,GAAI/P,EAAI6N,SAASyE,SAAS,QAAS,CACjC,GAAItS,EAAI6P,aAAazN,IAAI,cAAe,CACtC,MAAMkS,EAAc,CAClBC,QAAS,mBACTC,QAAS,oBACTC,UAAW,oBACXC,QAAS,oBAEX3E,EAAM4E,OAASL,EAAYtU,EAAI6P,aAAaZ,IAAI,cACjD,CACD,MAAM2F,EAAS,kEAAkEf,KAAK7T,EAAI6N,UACpFgH,EAAS,oBAAoBhB,KAAK7T,EAAI6N,UAC5C,GAAI+G,EAAQ,CAEV,MAAMnB,EAASjG,GAAM4B,gBAAgB0F,mBAAmBF,EAAO,KAAKrF,YAAc,GAC5EwF,EAAcvH,GAAM4B,gBAAgB0F,mBAAmBF,EAAO,KAAKrF,YAAc,GACvFQ,EAAMiF,MAAQ,GAAGvB,KAAUsB,GAC5B,MAAM,GAAIF,EAAQ,CAEjB,MAAMpB,EAASjG,GAAM4B,gBAAgB0F,mBAAmBD,EAAO,KAAKtF,YAAc,GAClFQ,EAAMiF,MAAQ,GAAGvB,IAC3B,KAAe,CAEL,MAAMA,EAASjG,GAAM4B,gBAAgBpP,EAAI6P,aAAaZ,IAAI,WAAWM,YAAc,GAC7EwF,EAAcvH,GAAM4B,gBAAgBpP,EAAI6P,aAAaZ,IAAI,gBAAgBM,YAAc,GAC7FQ,EAAMiF,MAAQ,GAAGvB,KAAUsB,GAC5B,CACD,MAAO,GAAG5H,gBAA6BK,GAAMsC,aAAaC,KAASmE,GACpE,CAED,MAAMe,EAAa,mBACnB,GAAIjV,EAAI6N,SAASwC,MAAM4E,GAGrB,MAAO,GAAG9H,kBADInN,EAAI6N,SAASwC,MAAM4E,GAAY,KACIf,IAGnD,GAAIlU,EAAI6P,aAAazN,IAAI,MAAO,CAE9B,MAAO8S,EAAMC,GAAQnV,EAAI6P,aAAaZ,IAAI,MAAMqB,MAAM,KACtD,MAAO,GAAGnD,kBAA+B+H,OAAUC,GACpD,CAED,GAAInV,EAAI6P,aAAazN,IAAI,aAAc,CAErC,MAAO8S,EAAMC,GAAQnV,EAAI6P,aAAaZ,IAAI,aAAaqB,MAAM,KAC7D,MAAO,GAAGnD,kBAA+B+H,OAAUC,GACpD,CAED,MAAMvF,EAAQpC,GAAMmC,SAAS3P,GAC7B,OAAI4P,EAAc,GAAGzC,mBAAgCyC,IAAQsE,KAAa1G,GAAMsC,aAAaC,KACtF,GAAG5C,KAAkB+G,KAAa1G,GAAMsC,aAAaC,IAC7D,CACD,IAAK,aAAc,CACjB,IAAIqF,EACFC,EAAU,GAcZ,OAbIrV,EAAI+T,SAAS1D,MAAM,0CACrB+E,EAAOpV,EAAI+T,SAAS1D,MAAM,6CAErB+E,EADO,OAARA,GAAkBA,EACV,IAAIA,IADmB,GAEnCC,EAAUrV,EAAI6N,WAEduH,EAAOpV,EAAI6N,SAASwC,MAAM,qCACrB+E,GAEHA,EAAO,IAAMA,EAAO,SACpBC,EAAUrV,EAAI6N,SAASwC,MAAM,oCAHpB+E,EAAO,IAMhBpV,EAAIG,KAAKuT,OAAO,0BAA4B,EACvC,GAAGvG,IAAiBiI,IAAOC,IAAUrV,EAAI0T,SAC7C5F,QAAQ,wBAAyB,YACjCA,QAAQ,SAAU,IAEhB,GAAGX,IAAiBiI,IAAOC,IAAUrV,EAAI0T,QACjD,CACD,IAAK,QACH,OAAI1T,EAAIG,KAAKuT,OAAO,oCAAsC,EACjD,GAAGvG,UAAuBnN,EAAI6N,WAAW7N,EAAI0T,SAC/C,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,SACL,IAAK,YAAa,CAChB,MAAMM,EAAYhU,EAAI+T,SAAS1D,MAAM,6CACrC,IAAK2D,EAAW,MAAO,GAAG7G,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAC9D,OAAQM,EAAU,IAChB,IAAK,UACH,MAAO,GAAG7G,gBAA6BnN,EAAI6N,WAAW7N,EAAI0T,SAC5D,IAAK,mBACH,MAAO,GAAGvG,yBAAsCnN,EAAI6N,WAAW7N,EAAI0T,SACrE,IAAK,IACH,MAAO,GAAGvG,QAAqBnN,EAAI6N,WAEvC,MAAO,GAAGV,aAA0BnN,EAAI6N,UACzC,CACD,IAAK,SACH,MAAI,yCAAyC6E,KAAK1S,EAAI+T,UAClC,IAAd/T,EAAI0T,OAAqB,GAAGvG,IAAiBnN,EAAI6N,yBAAyB7N,EAAI+T,WACtE,GAAG5G,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,uBAAuB1T,EAAI+T,WAEzE,GAAG5G,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,UACL,IAAK,SACH,MAAI,yCAAyChB,KAAK1S,EAAI+T,UAAkB5G,EACjE,GAAGA,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,UAAW,CACd,MAAM/R,EAAI3B,EAAI6N,SACd,OAAIlM,EAAE0P,WAAW,cAAgB1P,EAAE0P,WAAW,SAAW1P,EAAE0P,WAAW,UAAY1P,EAAE0P,WAAW,aACtFlE,EAEF,GAAGA,IAAiBxL,GAC5B,CACD,IAAK,OACH,OAAI3B,EAAI6N,SAASG,SAAS,WAAmB,GAAGb,IAAiBnN,EAAI6N,WAC9D,GAAGV,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,eACH,MAAO,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,kBACH,OAAK1T,EAAI6N,SAASyE,SAAS,gBAAmBtS,EAAI6N,SAASyE,SAAS,gBAAkC,KAAhBtS,EAAI6N,SAEnF,GAAGV,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SADrCvG,EAEX,IAAK,oBAAqB,CACxB,GAAoB,qBAAhBnN,EAAI+T,SAAiC,CACvC,MAAMuB,EAAW,iBAAiBzB,KAAK7T,EAAI6N,UAC3C,OAAIyH,EAAiB,GAAGnI,eAA4BmI,EAAS,KAAKtV,EAAI0T,SAC/D,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,GAAoB,KAAhB1T,EAAI6N,UAAmC,IAAhB7N,EAAI6N,SAE7B,MAAO,GAAGV,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAEhD,MAAMI,EAAQ9T,EAAIG,KAAKkQ,MAAM,mEAC7B,GAAIyD,GAASA,EAAM3S,OAAS,EAC1B,OAAI2S,EAAM,GACD,GAAG3G,cAA2BnN,EAAI+T,WAAW/T,EAAI6N,WAAW7N,EAAI0T,SAGlE,GAAGvG,cADQ2G,EAAM,KACyB9T,EAAI6N,WAAW7N,EAAI0T,SAEtE,MAAM6B,EAAmBvV,EAAI+T,SAAS1D,MACpC,0HAEF,OAAIkF,EACK,GAAGpI,cAA2BoI,EAAiB,KAAKvV,EAAI6N,WAAW7N,EAAI0T,SAEzE,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,cACH,MAAO,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,WAAY,CACf,IAAI8B,EAAYxV,EAAI+N,KAAKuC,MAAM,KAE/B,MAAoB,aAAhBkF,EAAU,IAAqC,OAAhBA,EAAU,GAEpC,GAAGrI,UADGnN,EAAI+T,SAASzD,MAAM,KAAK,KACGtQ,EAAI6N,WAAW7N,EAAI0T,SAAS1T,EAAIyV,OAEnE,GAAGtI,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAAS1T,EAAIyV,MAC5D,CACD,IAAK,WAAY,CACf,IAAID,EAAYxV,EAAI+N,KAAKuC,MAAM,KAO/B,MALoB,aAAhBkF,EAAU,IAAqC,OAAhBA,EAAU,KACvB,KAAhBA,EAAU,GAAWxV,EAAI6P,aAAaxN,OAAO,eAAgB,sBAC5DrC,EAAI6P,aAAaxN,OAAO,OAAQmT,EAAU,IAC3B,KAAhBA,EAAU,IAAWxV,EAAI6P,aAAaxN,OAAO,eAAgB,uBAE5D,GAAG8K,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAAS1T,EAAIyV,MAC5D,CACD,IAAK,YACL,IAAK,WACH,OAAIzV,EAAI6N,SAASwD,WAAW,UAAkBlE,EACvC,GAAGA,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,iBAAkB,CACrB,MAAMI,EAAQ,+BAA+BD,KAAK7T,EAAI6N,UACtD,GAAIiG,EAAO,CACT,MAAM4B,EAAO5B,EAAM,GACnB,MAAO,GAAG3G,kCAA+CmC,mBAAmBoG,IAC7E,CACD,MAAMb,EAAS,0BAA0BhB,KAAK7T,EAAI6N,UAClD,GAAIgH,EAAQ,CACV,IAAIa,EAAOb,EAAO,GAElB,OADAa,EAAOA,EAAK5H,QAAQ+G,EAAO,GAAIA,EAAO,GAAK,OACpC,0BAA0Ba,GAClC,CACD,MACD,CACD,IAAK,SACH,MAAoB,mBAAhB1V,EAAI+T,SAAsC,GAAG5G,SAAsBnN,EAAI6N,WAAW7N,EAAI0T,SACtE,6BAAhB1T,EAAI+T,SAAgD,GAAG5G,QAAqBnN,EAAI6N,WAAW7N,EAAI0T,SAC5F,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,gBACH,GAAoB,gBAAhB1T,EAAI+T,UAA8C,oBAAhB/T,EAAI+T,UAAkD,UAAhB/T,EAAI+T,SAC9E,MAAO,GAAG5G,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,GAAoB,sBAAhB1T,EAAI+T,SAAkC,MAAO,GAAG5G,UAAuBnN,EAAI6N,WAAW7N,EAAI0T,SAChG,IAAK,OACH,GAAoB,gBAAhB1T,EAAI+T,UAA8C,WAAhB/T,EAAI6N,SAAuB,CAC/D,MAAM+B,EAAQ5P,EAAI6P,aAAaZ,IAAI,KACnC,MAAO,GAAG9B,sBAAmCmC,mBAAmBM,IACjE,CACD,GAAI5P,EAAI+T,SAAS/F,SAAS,gBAAiB,CACzC,MACM2H,EADQ,uBAAuB9B,KAAK7T,EAAI+T,UACzB,GACrB,GAAoB,KAAhB/T,EAAI6N,UAAmC,UAAhB7N,EAAI6N,SAC7B,MAAO,GAAGV,qBAAkCwI,IACvC,CACL,MAAM7B,EAAQ,gBAAgBD,KAAK7T,EAAI6N,UACvC,GAAIiG,EAGF,MAAO,GAAG3G,wBAAqCwI,UAFlC7B,EAAM,WACNA,EAAM,IAGtB,CACF,CACD,GAAoB,iBAAhB9T,EAAI+T,SAGN,MAAO,GAAG5G,oBAFI,cAAc0G,KAAK7T,EAAI6N,UACjB,KAGtB,GAAoB,iBAAhB7N,EAAI+T,SAA6B,CACnC,MAAMD,EAAQ,6BAA6BD,KAAK7T,EAAI6N,UACpD,GAAIiG,EAAO,CACT,MAAM8B,EAAY9B,EAAM,GAClB+B,EAAS/B,EAAM,GACfgC,EAAOhC,EAAM,GACbiC,EAAQ/V,EAAI6P,aAAaZ,IAAI,SACnC,MAAO,GAAG9B,0BAAuCyI,YAAoBC,UAAeC,WAAcxG,mBAAmByG,IACtH,CACF,CAEH,IAAK,YACH,MAAoB,gBAAhB/V,EAAI+T,SAAmC,GAAG5G,yBAAsCmC,mBAAmBtP,EAAIG,QACpG,GAAGgN,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,aACH,GAAoB,gBAAhB1T,EAAI+T,SAA4B,MAAO,GAAG5G,iBAA8BmC,mBAAmBtP,EAAIG,QACnG,MAAM2T,EAAQ,iBAAiBD,KAAK7T,EAAI6N,UACxC,OAAIiG,EAAc,GAAG3G,IAAiB2G,EAAM,KACrC,GAAG3G,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,aAAc,CACjB,IAAIsC,EAAOhW,EAAI6N,SAEf,MADY,KAARmI,IAAaA,EAAO,IACjB,GAAG7I,KAAkBnN,EAAI+T,WAAWiC,IAAOhW,EAAI0T,QACvD,CACD,IAAK,SAAU,CACb,MAAMI,EAAQ,uBAAuBD,KAAK7T,EAAI+T,UAC9C,GAAID,EAAO,CACT,MAAMmC,EAAOnC,EAAM,GAEnB,OADA9T,EAAI6P,aAAaxN,OAAO,OAAQ4T,GACzB,GAAG9I,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,MAAO,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,cACL,IAAK,UACL,IAAK,UAAW,CACd,MAAMI,EAAQ,qBAAqBD,KAAK7T,EAAI6N,UAC5C,OAAIiG,EAEK,GAAG3G,KADG2G,EAAM,KACgB9T,EAAI0T,SAElC,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,SAAU,CACb,MAAMI,EAAQ,qBAAqBD,KAAK7T,EAAI6N,UAC5C,GAAIiG,EAAO,CACT,IAAIkC,EAAOlC,EAAM,GAEjB,OADIkC,EAAK3E,WAAW,WAAU2E,EAAOA,EAAKlI,QAAQ,OAAQ,QACnD,GAAGX,KAAkB6I,IAAOhW,EAAI0T,QACxC,CACD,MAAO,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,YAMH,OAJA1T,EAAI6P,aAAa7H,OAAO,MAEZ,aAARlC,GAAqB9F,EAAI6P,aAAaxN,OAAO,WAAY,KAEzC,YAAhBrC,EAAI+T,UAA2B/T,EAAI+T,SAAS/F,SAAS,gBAAkBhO,EAAI6N,SAASwD,WAAW,SAE1F,GAAGlE,aADInN,EAAI6N,SAASqI,UAAUlW,EAAI6N,SAASsI,YAAY,KAAO,MACxBnW,EAAI0T,OAAOwC,UAAU,KAEhElW,EAAI+T,SAAS/F,SAAS,gBAAkBhO,EAAI6N,SAASwD,WAAW,cAAsBrR,EAAIG,KACvF,GAAGgN,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAEhD,IAAK,gBACH,MAAoB,YAAhB1T,EAAI+T,UAA2B/T,EAAI+T,SAAS/F,SAAS,gBAAkBhO,EAAI6N,SAASwD,WAAW,SAE1F,kCADOrR,EAAI6N,SAASqI,UAAUlW,EAAI6N,SAASsI,YAAY,KAAO,KAGhE,cAAgBnW,EAAIG,KAE7B,IAAK,iBACH,MAAoB,YAAhBH,EAAI+T,UAA2B/T,EAAI+T,SAAS/F,SAAS,gBAAkBhO,EAAI6N,SAASwD,WAAW,SAE1F,GAAGlE,aADInN,EAAI6N,SAASqI,UAAUlW,EAAI6N,SAASsI,YAAY,KAAO,KAGhE,GAAGhJ,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAEhD,IAAK,eAEH,GADA1T,EAAI6P,aAAa7H,OAAO,MACJ,YAAhBhI,EAAI+T,UAA2B/T,EAAI+T,SAAS/F,SAAS,gBAAkBhO,EAAI6N,SAASwD,WAAW,SAEjG,MAAO,GAAGlE,WADInN,EAAI6N,SAASqI,UAAUlW,EAAI6N,SAASsI,YAAY,KAAO,KAC3BnW,EAAI0T,OAAO5F,QAAQ,IAAK,OAEpE,GAAI9N,EAAI+T,SAAS/F,SAAS,eAAgB,CACxC,GAAIhO,EAAI6N,SAASwD,WAAW,UAAW,CACrC,GAAIrR,EAAI6P,aAAazN,IAAI,KAAM,CAC7B,MAAMgU,EAAQpW,EAAI6P,aAAaZ,IAAI,KAEnC,OADAjP,EAAI6P,aAAa7H,OAAO,KACjB,GAAGmF,WAAwBiJ,IAAQpW,EAAI0T,OAAO5F,QAAQ,IAAK,MACnE,CACD,MAAO,GAAGX,WAAwBnN,EAAI0T,OAAO5F,QAAQ,IAAK,MAC3D,CACD,GAAI9N,EAAI6N,SAASwD,WAAW,YAAa,CACvC,GAAIrR,EAAI6P,aAAazN,IAAI,gBAAiB,CACxC,MAAMsR,EAAS1T,EAAI6P,aAAaZ,IAAI,gBAEpC,OADAjP,EAAI6P,aAAa7H,OAAO,gBACjB,GAAGmF,YAAyBuG,IAAS1T,EAAI0T,OAAO5F,QAAQ,IAAK,MACrE,CACD,MAAO,GAAGX,YAAyBnN,EAAI0T,OAAO5F,QAAQ,IAAK,MAC5D,CACD,GAAI9N,EAAI6N,SAASwD,WAAW,cAC1B,OAAOrR,EAAIG,IAEd,CACD,MAAO,GAAGgN,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAEhD,IAAK,WACH,MAAI,8BAA8BG,KAAK7T,EAAI6N,UAClC,GAAGV,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAEzCvG,EAET,IAAK,cAEH,OADAnN,EAAI6P,aAAa7H,OAAO,MACpBhI,EAAI6N,SAASwD,WAAW,YAAoB,GAAGlE,iBAA8BmC,mBAAmBtP,EAAIG,QACpGH,EAAI6N,SAASwD,WAAW,UAAkB,GAAGlE,gBAA6BmC,mBAAmBtP,EAAIG,QAC9FgN,EACT,IAAK,iBACH,MAAoB,KAAhBnN,EAAI6N,SAAwB,GAAGV,sBAC/BnN,EAAI6N,SAASwC,MAAM,oBAA4B,GAAGlD,iBAA8BmC,mBAAmBtP,EAAIG,QACvGH,EAAI6N,SAASwC,MAAM,qBAA6B,GAAGlD,gBAA6BmC,mBAAmBtP,EAAIG,QACpGgN,EACT,IAAK,SACL,IAAK,aACH,OAAInN,EAAI+T,SAAS1C,WAAW,UAAkB,GAAGlE,SAAsBnN,EAAI6N,WAAW7N,EAAI0T,SACnF,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAEhD,IAAK,cACH,MAAO,GAAGvG,MAAmBnN,EAAI6N,SAASnN,MAAM,KAClD,IAAK,UACH,MAAoB,KAAhBV,EAAI6N,SAAwBV,EACzB,GAAGA,SAAsBmC,mBAAmBtP,EAAIG,QACzD,IAAK,SAAU,CACb,IAAIuT,EAAS,IAAI1D,gBAAgBhQ,EAAI0T,QAUrC,GARAA,EAAO1L,OAAO,WACd0L,EAAO1L,OAAO,WACd0L,EAAO1L,OAAO,KACd0L,EAAO1L,OAAO,KAEd0L,EAASA,EAAOzD,WACD,KAAXyD,IAAeA,EAAS,IAAIA,KAED,QAA3B1T,EAAI+N,KAAKuC,MAAM,KAAK,IAA2C,UAA3BtQ,EAAI+N,KAAKuC,MAAM,KAAK,GAC1D,IACE,MAAM,CAAG+F,EAAIR,EAAQS,GAAS5C,EAAOrD,MAAM,0BACrCT,EAAQN,mBAAmB,GAAG+G,KAAMR,KAAUS,KACpD,MAAO,GAAGnJ,QAAqBnN,EAAI6N,WAAW+B,GACxD,CAAU,MACA,MAAO,GAAGzC,QAAqBnN,EAAI6N,WAAW6F,GAC/C,CAEH,OAAI1T,EAAI6N,SAASyC,MAAM,KAAKgC,SAAS,UAC5B,GAAGnF,IAAiBnN,EAAI6N,SAASC,QAAQ,UAAW,MAAM4F,IACnD,QAAZ1T,EAAI+N,KAAuB,GAAGZ,SAAsBnN,EAAI6N,WACrD,GAAGV,IAAiBnN,EAAI6N,WAAW6F,KAC3C,CACD,IAAK,YAAa,CAChB,GAAoB,kBAAhB1T,EAAI+T,SAA8B,MAAO,GAAG5G,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SACpF,GAAI1T,EAAI+T,SAAS1C,WAAW,UAAW,MAAO,GAAGlE,gBAA6BnN,EAAI6N,WAAW7N,EAAI0T,SACjG,GAAI1T,EAAI+T,SAAS1C,WAAW,UAAW,MAAO,GAAGlE,gBAA6BnN,EAAI6N,WAAW7N,EAAI0T,SAEjG,MAAMtD,EAAM,gCAAgCyD,KAAK7T,EAAI+T,UACrD,GAAI3D,EAAK,MAAO,GAAGjD,gBAA6BiD,EAAI,KAAKpQ,EAAI6N,WAAW7N,EAAI0T,SAE5E,MAAM6C,EAAY,sCAAsC1C,KAAK7T,EAAI+T,UACjE,GAAIwC,EAAW,CACb,MAAMC,EAAYD,EAAU,GAE5B,OAAIvW,EAAI6N,SAASwD,WAAW,SACnB,GAAGlE,KAAkBqJ,IAAYxW,EAAI6N,SAASnN,MAAM,KAAKV,EAAI0T,SAC1D,GAAGvG,KAAkBqJ,IAAYxW,EAAI6N,WAAW7N,EAAI0T,QACjE,CACD,MAAO,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,cACL,IAAK,UACH,GAAI1T,EAAI6N,SAASwD,WAAW,eAI1B,OAHArR,EAAI6P,aAAahL,IAAI,cAAe7E,EAAI6P,aAAaZ,IAAI,UACzDjP,EAAI6P,aAAa7H,OAAO,SACxBhI,EAAI6P,aAAa7H,OAAO,eACjB,GAAGmF,WAAwBnN,EAAI0T,SAExC,GAAI1T,EAAI6N,SAASwD,WAAW,WAAY,OACxC,MAAO,GAAGlE,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,eAEH,OADA1T,EAAI6P,aAAa7H,OAAO,MACjB,GAAGmF,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,WAAY,CACf,MAAMtD,EAAM,yCAAyCyD,KAAK7T,EAAI6N,UAC9D,OAAIuC,EAAY,GAAGjD,OAAoBiD,EAAI,KAAKpQ,EAAI0T,SAC7C,GAAGvG,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,YAAa,CAChB,GAAI1T,EAAI6N,SAASwD,WAAW,WAAY,MAAO,GAAGlE,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,kBAEtF,MAAM+C,EAAS,yBAAyB5C,KAAK7T,EAAI6N,UACjD,GAAI4I,EAAQ,MAAO,GAAGtJ,UAAuBsJ,EAAO,MAAMA,EAAO,KAAKzW,EAAI0T,SAE1E,MAAMgD,EAAU,eAAe7C,KAAK7T,EAAI6N,UACxC,GAAI6I,EAAS,MAAO,GAAGvJ,kBAA+BuJ,EAAQ,gBAE9D,MAAMC,EAAa,4BAA4B9C,KAAK7T,EAAI6N,UACxD,OAAI8I,EAAmB,GAAGxJ,kBAA+BwJ,EAAW,kBAE7D,GAAGxJ,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,QAAS,CACZ,GAAI1T,EAAI6N,SAASwD,WAAW,UAC1B,MAAO,GAAGlE,QAAqBmC,mBAAmBtP,EAAI6P,aAAaZ,IAAI,QAEzE,MAAM2H,EAAa,sBAAsB/C,KAAK7T,EAAI6N,UAClD,OAAI+I,EAAmB,GAAGzJ,kBAA+ByJ,EAAW,KAEhE5W,EAAI6N,SAASwD,WAAW,aACnB,GAAGlE,oBAAiCmC,mBAAmBtP,EAAI6P,aAAaZ,IAAI,WAC9E,GAAG9B,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,QAC/C,CACD,IAAK,OACH,OAAI1T,EAAI6N,SAASwD,WAAW,WAAarR,EAAI6N,SAASwD,WAAW,aACxD,GAAGlE,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAE7B,kBAAkBG,KAAK7T,EAAI6N,UACvB,GAAGV,YAAyBnN,EAAI6N,WAAW7N,EAAI0T,SAC/DvG,EAET,IAAK,mBACH,MAAO,gEAET,IAAK,aACH,GAAInN,EAAI6N,SAASwD,WAAW,UAAYrR,EAAI6N,SAASwD,WAAW,WAE9D,OAAOlE,EAGT,GAAInN,EAAI6N,SAASwD,WAAW,WAAY,CACtC,IAAKrR,EAAI0T,OACP,OAAOvG,EAGT,IAAIrH,EAAO,GASX,OARI9F,EAAI6N,SAASwD,WAAW,kBAC1BvL,EAAO,SACE9F,EAAI6N,SAASwD,WAAW,kBACjCvL,EAAO,SACE9F,EAAI6N,SAASwD,WAAW,mBAAqBrR,EAAI6N,SAASwD,WAAW,mBAC9EvL,EAAO,aAGLA,GACFA,EAAO,SAAWA,EAKb,GAAGqH,WAAwBnN,EAAI0T,SAAS5N,KAHtCqH,CAIV,CAED,MAAgB,qBAAZnN,EAAI+N,KACC,GAAGZ,OAAoBnN,EAAI6N,WAG7B,GAAGV,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAChD,IAAK,QACL,IAAK,gBACL,IAAK,YACL,IAAK,YACL,IAAK,WACH1T,EAAI6P,aAAa7H,OAAO,MAC1B,QACE,MAAO,GAAGmF,IAAiBnN,EAAI6N,WAAW7N,EAAI0T,SAEpD,CAoESmD,CAAQ7W,EAAK4S,EAAWd,EAAU3E,EAAgBrH,EArDuB,CAsDlF,CA4EA+F,eAAeiL,GAAQ9W,GACrB,IAAI2D,QAAgB6J,GAAMuB,aACtB6C,QAAepE,GAAMmB,YACzB,IAAK,MAAMkD,KAAWD,EAAOG,SAAU,CACrC,IAAID,EAAWnO,EAAQkO,GAASC,SAChC,GAAyBhR,MAArB6C,EAAQmO,OAEVnO,EAAQmO,GAAUV,WAAUzH,GAAY3J,EAAIG,KAAKkR,WAAW1H,KAAa,IACxE3J,EAAIG,KAAKkR,WAAW,UAAUS,qBAGjC,OAAQD,GACN,IAAK,UACL,IAAK,OACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,SACL,IAAK,kBACL,IAAK,QACL,IAAK,UACL,IAAK,SACL,IAAK,YACH,MAAO,GAAGD,EAAOG,SAASF,GAAS7R,MAAMA,EAAI6N,WAAW7N,EAAI0T,SAC9D,IAAK,SAAU,CACb,IAAII,EAAQ9T,EAAI6N,SAASwC,MAAM,kCAC/B,OAAIyD,EAAc,WAAWA,EAAM,sBAAsBA,EAAM,UAC/D,CACD,CACD,IAAK,YAAa,CAChB,MAAMmC,EAAOjW,EAAI6P,aAAaZ,IAAI,QAClC,OAAY,MAARgH,EACK,WAAWA,kBAAqBjW,EAAI6N,WAAW7N,EAAI0T,SAAS1T,EAAIyV,OAElE,wBAAwBzV,EAAI6N,WAAW7N,EAAI0T,SAAS1T,EAAIyV,MAChE,CACD,IAAK,gBACH,GAAIzV,EAAI6N,SAASwD,WAAW,eAC1B,MAAO,4BAA4BrR,EAAI6N,WAAW7N,EAAI0T,SAExD,GAAI1T,EAAI6N,SAASwD,WAAW,cAAe,CACzC,MAAMyC,EAAQ,0BAA0BD,KAAK7T,EAAI6N,UACjD,GAAIiG,EACF,OAAIA,EAAM,GAAGxB,SAAS,KACb,WAAWwB,EAAM,KAAKA,EAAM,KAE5B,WAAWA,EAAM,uBAAuBA,EAAM,IAG1D,CACD,OAEF,IAAK,WACH,MAAO,GAAGlC,EAAOG,SAASF,GAAS7R,OAAOA,EAAI0T,OAAOhT,MAAM,KAC7D,IAAK,YACH,MAAO,wBAAwBV,EAAI6N,WAAW7N,EAAI0T,SACpD,IAAK,aACH,GAAgB,cAAZ5B,EAA0B,CAC5B,GAAI9R,EAAI6N,SAASyE,SAAS,OAExB,MAAO,GAAGV,EAAOG,SAASF,GAAS7R,MAAMA,EAAI6N,SAASyC,MAAM,OAAO,KAGrE,GAAoB,WAAhBtQ,EAAI6N,SAAuB,CAC7B,IAAI/H,EAAO9F,EAAI6P,aAAaZ,IAAI,QAChC,OAAQnJ,GACN,IAAK,YACHA,EAAO,OACP,MACF,IAAK,SACHA,EAAO,SACP,MACF,IAAK,QACHA,EAAO,SACP,MACF,QACEA,EAAO,GAIX,OADA9F,EAAI6P,aAAa7H,OAAO,QACnBlC,EAGI,GAAG8L,EAAOG,SAASF,GAAS7R,cAAc8F,KAAQ9F,EAAI6P,aAAaI,aAFnE,GAAG2B,EAAOG,SAASF,GAAS7R,cAAcA,EAAI6P,aAAaI,YAIrE,CAED,MAAO,GAAG2B,EAAOG,SAASF,GAAS7R,MAAMA,EAAI6N,UAC9C,CACH,QACE,OAEL,CAEH,CA92BAR,OAAOC,QAAUD,OAAOC,SAAWD,OAAOE,OAS1C7D,KACA4D,QAAQ0B,QAAQ+H,UAAUC,YAAYtN,IAs2BtC,MAAMuN,GAAmB,CACvBC,aAAc,CAAC,6BACfC,SAAU,CAAC,uBACXC,MAAO,CAAC,sCACRC,cAAe,CAAC,sCAChBC,UAAW,CAAC,4BACZC,UAAW,CAAC,2BACZC,SAAU,CAAC,wBACXC,SAAU,CAAC,qCACXC,UAAW,CAAC,6BACZC,OAAQ,CAAC,0BACTC,OAAQ,CAAC,sBACTC,QAAS,CAAC,2BACVC,OAAQ,CAAC,sBACTC,UAAW,CAAC,sBACZC,MAAO,CAAC,2BACRC,SAAU,CAAC,wBACXC,OAAQ,CAAC,0BACTC,SAAU,CAAC,4BACXC,gBAAiB,CAAC,+BAClBC,UAAW,CAAC,wBACZC,MAAO,CAAC,0BACRC,QAAS,CAAC,+BACV,OAAQ,CAAC,mBACTC,SAAU,CAAC,qCACXC,MAAO,CAAC,yBACRC,UAAW,CAAC,8BACZC,IAAK,CAAC,iCACNC,WAAY,CAAC,0BACbC,QAAS,CAAC,sBACVC,KAAM,CAAC,sBACPC,aAAc,CAAC,qCACfC,gBAAiB,CAAC,sBAClBC,kBAAmB,CAAC,gCACpBC,KAAM,CAAC,sBACPC,QAAS,CAAC,sBACVC,QAAS,CAAC,sBACVC,KAAM,CAAC,sBACPC,eAAgB,CAAC,+BACjBC,KAAM,CAAC,uBACPC,WAAY,CAAC,uBACbC,UAAW,CAAC,wBACZC,WAAY,CAAC,wBACbC,QAAS,CAAC,gCACVC,QAAS,CAAC,8BAA+B,6BACzCC,YAAa,CAAC,0BACdC,OAAQ,CAAC,wBACTC,gBAAiB,CAAC,0CAClBC,cAAe,CAAC,sBAChBC,YAAa,CAAC,sCACdC,WAAY,CAAC,kCACbC,OAAQ,CAAC,2BACTC,UAAW,CAAC,yBACZC,YAAa,CAAC,sBACdC,eAAgB,CAAC,sBACjBC,YAAa,CAAC,2CACdC,QAAS,CAAC,0BACVC,UAAW,CAAC,wBACZC,OAAQ,CAAC,iCACTC,OAAQ,CAAC,+BACTC,MAAO,CAAC,wBACRC,QAAS,CAAC,sBACVC,YAAa,CAAC,4BACdC,aAAc,CAAC,wBACfC,SAAU,CAAC,8BACXC,UAAW,CAAC,4BACZC,MAAO,CAAC,uBACRC,cAAe,CAAC,sBAChBC,cAAe,CAAC,wCAChBC,KAAM,CAAC,6BACPC,WAAY,CAAC,8BACbC,OAAQ,CAAC,8BACTC,SAAU,CAAC,mCACXC,eAAgB,CAAC,8BACjBC,SAAU,CAAC,yBAGb7P,eAAe8P,KACb,IAAI/J,QAAepE,GAAMmB,YACrBhL,EAAU,CAAE,EAChB,IAAK,MAAMkO,KAAWD,EAAOG,SAAU,CACrCpO,EAAQkO,GAAW,CAAE,EACrB,IAAK,MAAM+J,KAAiBhK,EAAOG,SAASF,GAASlO,QACnDA,EAAQkO,GAAS+J,GAAiBhK,EAAOG,SAASF,GAASlO,QAAQiY,GAErE,IAAK,MAAM9J,KAAYF,EAAOG,SAASF,GAASG,UAC1CJ,EAAOG,SAASF,GAASG,UAAUF,GAAUyB,eAC/C5P,EAAQmO,GAAY,GAGzB,CAUD,OATAnO,EAAQkY,WAAa,CACnB7b,IAAK,GACL8T,MAAO,IAETnQ,EAAQoN,MAAQ,SAChBpN,EAAQmY,cAAgB,CAAC,UAAW,SAAU,QAAS,SAAU,QAAS,YAAa,QACvFnY,EAAQ0K,eAAiB,SACzB1K,EAAQqP,yBAA0B,EAClCrP,EAAU,IAAKA,KAAYsT,IACpBtT,CACT,CAwGe,IAAAoY,GAAA,CACbpJ,YACAqJ,cAjXFnQ,eAA6B7L,EAAK8F,EAAM8M,EAAWC,EAAaC,EAAWC,GAEzE,aADMrJ,KACCiJ,GAAS3S,EAAK8F,EAAM8M,EAAWC,EAAaC,EAAWC,EAChE,EA+WEkJ,uBA1WFpQ,eAAsC7L,GACpC,MAAM4R,QAAepE,GAAMmB,YACrBhL,QAAgB6J,GAAMuB,aAC5B,IAAK,MAAM8C,KAAWD,EAAOG,SAAU,CACrC,GAAIE,GAAWJ,EAAS7R,EAAK4R,EAAQjO,GACnC,MAAO,CAAEkO,UAASC,SAAU,MAE5B,IAAK,MAAMA,KAAYF,EAAOG,SAASF,GAASG,UAAW,CACzD,MACM5Q,EADYmQ,GAAIM,EAASC,EAAUnO,EAASiO,GAC9BR,WAAUzH,GAAY3J,EAAIG,KAAKkR,WAAW1H,KAC9D,GAAIvI,GAAK,EACP,MAAO,CAAEyQ,UAASC,WAErB,CAEJ,CACH,EA2VEgF,WACAoF,aA3GF,WACE,OAAO,IAAI5V,SAAQC,IACjB+G,QAAQ0B,QAAQjH,MAAMZ,OAAM0E,UAC1BlI,SAAgBgY,KAChBrO,QAAQ0B,QAAQjH,MAAMlD,IAAI,CAAAlB,QAAEA,KAAW,IAAM4C,KAAU,GACvD,GAEN,EAqGE4V,cAnGF,SAAuBC,GACrB,OAAO,IAAI9V,SAAQuF,UACjB,MAAM+F,QAAepE,GAAMmB,YAC3B,IAAIhL,EAAUyY,SAAmB5O,GAAMuB,aAEvC,MAAMsN,QAAiBV,KAGvB,IAAK,MAAMW,KAAc3Y,EACvB,GAAM2Y,KAAcD,GACf,GAA0B,iBAAfC,GAA0C,OAAfA,EACzC,IAAK,MAAMC,KAAiB5Y,EAAQ2Y,GAC5BC,KAAiBF,EAASC,WAAqB3Y,EAAQ2Y,GAAYC,eAHvC5Y,EAAQ2Y,GAShD3Y,EAAQmY,cAAgBnY,EAAQmY,cAAc7S,QAAO4I,GAAWA,KAAWD,EAAOG,WAGlF,IAAK,MAAOyK,EAAaC,KAAiBtd,OAAOud,QAAQL,GACjDG,KAAe7Y,IACnBA,EAAQ6Y,GAAeC,GAI3B,IAAK,MAAOE,EAAaC,KAAiBzd,OAAOud,QAAQ9K,EAAOG,UAAW,CAEnEpO,EAAQgZ,GAAa7K,YAAY8K,EAAa5K,YAClDrO,EAAQgZ,GAAeC,EAAajZ,SAItC,IAAK,MAAM2Y,KAAcM,EAAajZ,QAC9B2Y,KAAc3Y,EAAQgZ,KAC1BhZ,EAAQgZ,GAAaL,GAAcM,EAAajZ,QAAQ2Y,GAG7D,CAEDhP,QAAQ0B,QAAQjH,MAAMZ,OAAM,IAAMmG,QAAQ0B,QAAQjH,MAAMlD,IAAI,CAAElB,YAAW,IAAM4C,OAAW,GAE9F,EAyDEsW,QApDFhR,eAAuB7L,GACrB,MAAM8c,QAAehG,GAAQ9W,GAC7B,GAAI8c,EACF,GAAKrL,GAEE,CACL,IAAIsL,EAAW9c,SAASC,cAAc,YACtC6c,EAASC,YAAcF,EACvB7c,SAASgd,KAAKza,YAAYua,GAC1BA,EAASG,SACTjd,SAASkd,YAAY,QACrBJ,EAASK,OACTnd,SAASgd,KAAKna,YAAYia,EAC3B,MATCM,UAAUC,UAAUC,UAAUT,EAWpC,EAsCEU,eAzVF,SAAwBxd,EAAKyd,GAC3B,OAAO,IAAInX,SAAQuF,UACjB,IAAIlI,QAAgB6J,GAAMuB,aACtB6C,QAAepE,GAAMmB,YAGzB,GADqBnB,GAAMI,aAAa5N,GACpCyd,EAAe,CACjB,MAAMC,EAAgB/Z,EAAQA,EAAQ8Z,GAAe3L,UACrD,QAAsBhR,IAAlB4c,EAA6B,CAC/B,MAAMC,EAAcnQ,GAAMC,gBAAgBzN,EAAIyT,OAAQiK,GACtD,GAAIC,EACF,OAAOpX,EAAQ,GAAGoX,IAAc3d,EAAI6N,WAAW7N,EAAI0T,SAEtD,CACP,MACM,IAAK,MAAM7B,KAAWD,EAAOG,SAAU,CACrC,IAAI2L,EAAgB/Z,EAAQA,EAAQkO,GAASC,UAC7C,QAAsBhR,IAAlB4c,EAA6B,SACjC,MAAMvS,EAAQuS,EAActM,WAAUzH,GAAY3J,EAAIG,KAAKkR,WAAW1H,KACtE,GAAIwB,EAAQ,EAAG,SAEf,GADAuS,EAActS,OAAOD,EAAO,GACC,IAAzBuS,EAAcvc,OAAc,OAAOoF,IACvC,MAAMoX,EAAcnQ,GAAMC,gBAAgBzN,EAAIyT,OAAQiK,GACtD,GAAIC,EACF,OAAOpX,EAAQ,GAAGoX,IAAc3d,EAAI6N,WAAW7N,EAAI0T,SAEtD,CAEHnN,GAAS,GAEb,EA4TEqX,YAlCF,SAAqB5d,GACnB,IAAK2D,GAAS,OAAO,EACrB,IAAKA,GAAQkY,WAAY,OAAO,EAChC,IAAIA,EAAalY,GAAQkY,WACzB,GAAIA,GAAc7b,EAAK,CACrB,GAAI6b,EAAW7b,IACb,IAAK,IAAI6d,KAAQhC,EAAW7b,IAG1B,GAFA6d,EAAO,IAAIC,IAAID,GACfA,EAAOA,EAAK1d,KAAK2N,QAAQ,aAAc,YACnC+P,GAAQ7d,EAAIG,KACd,OAAO,EAIb,GAAI0b,EAAW/H,MACb,IAAK,MAAM+J,KAAQhC,EAAW/H,MAC5B,GAAI,IAAIrB,OAAOoL,GAAMnL,KAAK1S,EAAIG,MAC5B,OAAO,CAId,CACD,OAAO,CACT,6EC9jCSG,EAAO,uHAAhBmC,EAEMH,EAAAyb,EAAArb,gJAFGpC,EAAO,yZCANA,EAAW,yHAArBmC,EAEOH,EAAA0b,EAAAtb,kHAFGpC,EAAW,ssBCArBmC,EAWMH,EAAA2b,EAAAvb,GAHJL,EAEE4b,EAAAjI,keCVJvT,EAYMH,EAAA2b,EAAAvb,GAJJL,EAGE4b,EAAAjI,wbCXJvT,EASMH,EAAA2b,EAAAvb,GADJL,EAAiG4b,EAAAjI,iICP7F1V,EAAW,meADjBmC,EAcMH,EAAA2b,EAAAvb,GAHJL,EAEE4b,EAAAjI,0CAJU,uCARR1V,EAAW,+ZCAXA,EAAW,syBADjBmC,EAcMH,EAAA2b,EAAAvb,GAHJL,EAEE4b,EAAAjI,0CAJU,uCARR1V,EAAW,iYCEjB,MAAM4d,GAAmB,GAgBzB,SAASC,GAASna,EAAOoa,EAAQzf,GAC7B,IAAI0f,EACJ,MAAMC,EAAc,IAAInc,IACxB,SAAS0C,EAAI0Z,GACT,GAAI7e,EAAesE,EAAOua,KACtBva,EAAQua,EACJF,GAAM,CACN,MAAMG,GAAaN,GAAiB/c,OACpC,IAAK,MAAMsd,KAAcH,EACrBG,EAAW,KACXP,GAAiBvY,KAAK8Y,EAAYza,GAEtC,GAAIwa,EAAW,CACX,IAAK,IAAIpd,EAAI,EAAGA,EAAI8c,GAAiB/c,OAAQC,GAAK,EAC9C8c,GAAiB9c,GAAG,GAAG8c,GAAiB9c,EAAI,IAEhD8c,GAAiB/c,OAAS,CAC7B,CACJ,CAER,CAmBD,MAAO,CAAE0D,MAAKiC,OAlBd,SAAgB7H,GACZ4F,EAAI5F,EAAG+E,GACV,EAgBqB0a,UAftB,SAAmB1f,EAAK2f,EAAahgB,GACjC,MAAM8f,EAAa,CAACzf,EAAK2f,GAMzB,OALAL,EAAYpX,IAAIuX,GACS,IAArBH,EAAYM,OACZP,EAAOD,EAAMvZ,IAAQlG,GAEzBK,EAAIgF,GACG,KACHsa,EAAYtW,OAAOyW,GACM,IAArBH,EAAYM,MAAcP,IAC1BA,IACAA,EAAO,KACV,CAER,EAEL,CCzDO,MAAM1a,GAAUwa,GAAS,MACnBvM,GAASuM,GAAS,MAClBU,GAAOV,GAAS,kDCCfle,SAASgd,KAAK6B,KAASxe,EAAW,mIAAhDmC,EAAsGH,EAAAyc,EAAArc,4FAA5BlD,EAAAc,OAAAA,EAAQ,GAAA0e,MAAAhZ,KAAAiZ,6DAA7C3e,EAAW,iLAJnC4e,GAAO5T,YACP6T,GAAQ7T,6RC4Bd,MAAa,WAAbhL,KAAsB8e,2PAOG9e,EAAO,GAAC0D,cAAc1D,EAAS,OAAAwD,EAAAub,EAAA,MAAAC,GAASxb,EAAAub,EAAA,MAAAE,EAAAjf,KAAQkf,eAA5E/c,EAAqFH,EAAA+c,EAAA3c,6CAAzDpC,EAAO,GAAC0D,cAAc1D,EAAS,oBAAS,EAAAM,GAAA2e,KAAAA,EAAAjf,KAAQkf,0EANvE,MAAS,QAATlf,KAAemf,+NAGU3f,EAAAuf,EAAAvgB,IAAAwgB,EAAA,kBAAAhf,KAAQ0D,mBAAKF,EAAAub,EAAA,MAAAC,GAAkBxb,EAAAub,EAAA,MAAAE,EAAAjf,KAAQkf,eAAnE/c,EAA4EH,EAAA+c,EAAA3c,WAAhD,EAAA9B,IAAAd,EAAAuf,EAAAvgB,IAAAwgB,EAAA,kBAAAhf,KAAQ0D,gCAAuB,EAAApD,GAAA2e,KAAAA,EAAAjf,KAAQkf,oFAFvC1f,EAAAuf,EAAAvgB,IAAAwgB,EAAA,kBAAAhf,KAAQ0D,yBAAKF,EAAAub,EAAA,MAAAC,GAAwBxb,EAAAub,EAAA,MAAAE,EAAAjf,KAAQkf,eAAzE/c,EAAkFH,EAAA+c,EAAA3c,WAAtD,EAAA9B,IAAAd,EAAAuf,EAAAvgB,IAAAwgB,EAAA,kBAAAhf,KAAQ0D,sCAA6B,EAAApD,GAAA2e,KAAAA,EAAAjf,KAAQkf,4DAH1Elf,EAAS,IAAAof,GAAApf,oEAATA,EAAS,gIAzBR8b,EACAuD,WAHOC,GAAOtU,QAKZuU,EAAqBlc,GAAQ+a,WAAUtM,GAAG0N,EAAA,EAAK1D,EAAWhK,KAC1D2N,EAAoBnO,GAAO8M,WAAUtM,GAAG0N,EAAA,EAAKH,EAAUvN,SAMzDrB,SALJvL,GAAS,KACPqa,IACAE,GAAiB,gFAIZ3D,IACiB,QAAlBA,EAASrL,MACX+O,EAAA,EAAA/O,EAAQ,QACmB,SAAlBqL,EAASrL,MAClB+O,EAAA,EAAA/O,EAAQ,SACC1D,OAAO2D,WAAW,gCAAgCC,QAC3D6O,EAAA,EAAA/O,EAAQ,QAER+O,EAAA,EAAA/O,EAAQ,yBAGX+O,EAAA,EAAEE,EAAYL,EAAQ5N,SAAS6N,EAAQ5b,OAAOgc,kHCWrC,MAAAC,EAAA3f,EAAQ,GAAAyR,SAASzR,MAAY0C,KAAI,8CAAjC,EAAApC,GAAAqf,KAAAA,EAAA3f,EAAQ,GAAAyR,SAASzR,MAAY0C,KAAI,Kd0sB7C,SAAkBG,EAAMC,GACpBA,EAAO,GAAKA,EACRD,EAAKC,OAASA,IAElBD,EAAKC,KAAOA,EAChB,Cc/sB6C8c,CAAAC,EAAAF,mGADjBjc,MAAO1D,EAAU,GAAEkf,MAAOlf,EAAO,GAACyR,SAASzR,MAAY0C,4GAKvD/C,SAASgd,KAAK6B,2BAE3Bxe,EAAQ,GAACA,EAAU,IAAE2S,kUAdEhT,SAASgd,KAAK6B,IAAG,uDADrDrc,EAUMH,EAAA8d,EAAA1d,6CACND,EAwBMH,EAAA+d,EAAA3d,kFAjCQ,mEAMYsB,MAAO1D,EAAU,GAAEkf,MAAOlf,EAAO,GAACyR,SAASzR,MAAY0C,qGAOpE1C,EAAQ,GAACA,EAAU,IAAE2S,wnBA1C5B,MAAA3F,EAAUD,OAAOC,SAAWD,OAAOE,WAYrC6O,EACAuD,QAEEE,EAAqBlc,GAAQ+a,WAAUtM,GAAG0N,EAAA,EAAK1D,EAAWhK,KAC1D2N,EAAoBnO,GAAO8M,WAAUtM,GAAG0N,EAAA,EAAKH,EAAUvN,KAC7D5M,GAAS,KACPqa,IACAE,GAAiB,mBAGRO,GAAUhV,OACVtL,GAAGsL,+FAQV,IAAAgC,EAAQiT,KAAKnhB,OAAS,CAAAY,IAAK2f,EAAQ5N,SAASuO,GAAYtgB,MAAG,KACzDqN,OAAOmT,OAAK,IAWJzZ,QACRqV,EAASkE,GAAYrN,QAAUlM,EAAEzE,OAAO4c,QAAO9C,GAC/CzY,GAAQkB,IAAIuX,EAAQ,WAMpB9O,EAAQiT,KAAKzZ,QAAS9G,UAAW+b,GAAeyB,eAAexd,EAAKsgB,UAClEjT,OAAOmT,OAAK,QAMdlT,EAAQiT,KAAKnhB,QAASY,IAAKsN,EAAQoE,QAAQ+O,4CAA4CH,YACrFjT,OAAOmT,OAAK,mHC3DhBlgB,EAAW,6hBADjBmC,EAUCH,EAAA2b,EAAAvb,GAHEL,EAEC4b,EAAAjI,6BARE1V,EAAW,qsBCoEY,MAAA2f,GAAA3f,KAAQogB,KAAKC,WAAW,aAAe,YAAU,shBAMrE,OAAArgB,EAAS,GAAAA,EAAU,IAAAa,OAAS,EAAC,2VAkCvByf,MAAA,gBAAkBtgB,EAAc,GAAA,WAAa,oFAmB7CsgB,MAAA,gBAAkBtgB,EAAc,GAAA,WAAa,6KAnB7C,IAAAM,IAAAigB,EAAAD,MAAA,gBAAkBtgB,EAAc,GAAA,WAAa,kEAmB7C,IAAAM,IAAAkgB,EAAAF,MAAA,gBAAkBtgB,EAAc,GAAA,WAAa,yNApDjDA,EAAc,IAAAygB,GAAAzgB,uMAAdA,EAAc,qSA6Cd,UAAA0gB,GAAA1gB,KAAQogB,KAAKC,WAAW,WAAa,UAAQ,GAE7CM,GAAA3gB,KAAQogB,KAAKC,WAAW,qBAAuB,sBAAoB,yBAFrB,shBAgB9C,MAAAV,GAAA3f,KAAQogB,KAAKC,WAAW,qBAAuB,sBAAoB,0yBArD7C,MAAAV,GAAA3f,KAAQogB,KAAKC,WAAW,mBAAqB,mBAAiB,qeAiBpF,UAAAK,GAAA1gB,KAAQogB,KAAKC,WAAW,WAAa,UAAQ,GAE7CM,GAAA3gB,KAAQogB,KAAKC,WAAW,mBAAqB,mBAAiB,yBAFhB,gmCA6C5B,MAAAV,GAAA3f,KAAQogB,KAAKC,WAAW,iBAAmB,iBAAe,qeAe1D,MAAAV,EAAA3f,KAAQogB,KAAKC,WAAW,sBAA8C,wgBAM/Fle,EAAMH,EAAA4e,EAAAxe,iFAIcpC,EAAO,gFAC3BmC,EAAMH,EAAA4e,EAAAxe,+CADcpC,EAAO,2aAKtB6gB,EAAA7gB,OAAYA,EAAU,KAAAof,GAAApf,uEAAtBA,OAAYA,EAAU,4LAcJ,MAAA2f,EAAA3f,EAAQ,GAAAogB,KAAKC,WAAW,YAAU,igBAtItDrgB,EAAQ,IAAA8gB,GAAA9gB,GAkBR+gB,EAAA/gB,MAAWA,EAAQ,IAAAghB,GAAAhhB,KAsEnBA,EAAkB,IAAAihB,GAAAjhB,MAsBlBA,EAAQ,IAAIA,EAAc,IAAIA,EAAkB,KAAAmf,OAIhDnf,EAAO,IAAA8e,GAAA9e,GAKLkhB,EAAAlhB,KAASwb,mCAAd3a,OAAIC,GAAA,4VAxHInB,SAASgd,KAAK6B,aAA1Brc,EA0IMH,EAAAyb,EAAArb,yKAZJL,EAAM0b,EAAAmD,yCA7HD5gB,EAAQ,kGAkBRA,MAAWA,EAAQ,kGAsEnBA,EAAkB,iGAsBlBA,EAAQ,IAAIA,EAAc,IAAIA,EAAkB,iDAIhDA,EAAO,kHAKLkhB,EAAAlhB,KAASwb,sBAAd3a,OAAIC,GAAA,EAAA,wGAAJD,OAAIC,EAAAqgB,EAAAtgB,OAAAC,GAAA,yHAAJD,OAAIC,GAAA,wMhBuPR,SAAsBsgB,EAAYvY,GAC9B,IAAK,IAAI/H,EAAI,EAAGA,EAAIsgB,EAAWvgB,OAAQC,GAAK,EACpCsgB,EAAWtgB,IACXsgB,EAAWtgB,GAAG+G,EAAEgB,EAE5B,kCgB1aQ,MAAAmE,EAAUD,OAAOC,SAAWD,OAAOE,WAgBrC6O,QAGEyD,EAAqBlc,GAAQ+a,WAAUtM,GAAG0N,EAAA,EAAK1D,EAAWhK,KAC1D2N,EAAoBnO,GAAO8M,WAAUtM,GAAkBA,QAMzDpS,EACAwd,EACAmE,EACAhP,EACAb,EACAD,EAVJrM,GAAS,KACPqa,IACAE,GAAiB,IASnBzS,EAAQiT,KAAK3Q,MAAQ,CAAAe,QAAQ,EAAMiR,eAAe,cAC5CrB,EAAK,GAAGvgB,MACV8f,EAAA,EAAA9f,MAAU8d,IAAIyC,EAAK,GAAGvgB,MACtB+b,GAAeyB,eAAexd,GAAKwJ,MAAK9B,GAACoY,EAAA,EAAKtC,EAAiB9V,KAC/DqU,GAAejF,QAAQ9W,GAAKwJ,MAAK9B,GAACoY,EAAA,EAAK6B,EAAqBja,KAC5DqU,GAAeC,cAAchc,EAAK,aAAc,KAAM,MAAM,GAAO,GAAMwJ,MAAK9B,GAACoY,EAAA,EAAKnN,EAAWjL,KAC/FqU,GAAeE,uBAAuBjc,GAAKwJ,MAAK9B,GAAQoY,EAAA,IAAAjO,UAASC,YAAapK,GAACmK,EAAAiO,EAAA,EAAAhO,UAI/E,IAAA+P,GAAc,iBACHC,IACbhC,EAAA,EAAA+B,GAAc,GACR,MACA3U,SADkBM,GAAMY,QAAQgO,IACXtK,GAAoB,SACzCnI,QAAiB6D,GAAM2D,iBAAiBjE,EAAUlN,GACxDoc,EAAStK,GAAUnM,KAAKgE,GACxBhG,GAAQkB,IAAIuX,GACZ0D,EAAA,EAAA+B,GAAc,mCASVvU,EAAQiT,KAAK3Q,MAAQ,CAAAe,QAAQ,EAAMiR,eAAe,IAAQrB,IACxDjT,EAAQoE,QAAQqQ,aAAcC,QAAS,WAAYC,MAAO1B,EAAK,GAAGlK,KAAE,KAClE/I,EAAQiT,KAAKzZ,OAAS,CAAA9G,IAAK2S,IAAQ,KACjCtF,OAAOmT,OAAK,WAiBd3U,SAAAyB,EAAQiT,KAAKzZ,OAAS,CAAA9G,IAAKwd,IAAc,KACvCnQ,OAAOmT,OAAK,cAUV,MAAApf,EAAIgb,EAAStK,GAAUV,WAAUzH,GAAY3J,EAAIG,KAAKkR,WAAW1H,KACvEyS,EAAStK,GAAU1G,OAAOhK,EAAG,GAC7BuC,GAAQkB,IAAIuX,GACN,MAAAU,QAAef,GAAeyB,eAAexd,EAAK6R,GACxDvE,EAAQiT,KAAKzZ,OAAS,CAAA9G,IAAK8c,IAAM,KAC/BzP,OAAOmT,OAAK,eAeR,MAAApf,EAAIgb,EAAStK,GAAUV,WAAUzH,GAAY3J,EAAIG,KAAKkR,WAAW1H,KACvEyS,EAAStK,GAAU1G,OAAOhK,EAAG,GAC7BuC,GAAQkB,IAAIuX,SACN0F,IACNxU,EAAQiT,KAAKzZ,QAAS9G,UAAW+b,GAAeyB,eAAexd,EAAK6R,UAClExE,OAAOmT,OAAK,qBAcRsB,IACNxU,EAAQiT,KAAKzZ,QAAS9G,UAAW+b,GAAeyB,eAAexd,EAAK6R,UAClExE,OAAOmT,OAAK,SAaqBzE,GAAec,QAAQ7c,QAO5DsN,EAAQiT,KAAK3Q,MAAQ,CAAAe,QAAQ,EAAMiR,eAAe,IAAQrB,IACxDjT,EAAQoE,QAAQqQ,aAAcC,QAAS,UAAWC,MAAO1B,EAAK,GAAGlK,KAAE,KACjE/I,EAAQiT,KAAKzZ,OAAS,CAAA9G,IAAK2hB,IAAkB,KAC3CtU,OAAOmT,OAAK,eA+BpBlT,EAAQiT,KAAKnhB,QAASY,IAAKsN,EAAQoE,QAAQ+O,OAAO,mCAChDpT,OAAOmT,OAAK,mJC1IlB/d,EAAiBH,EAAAX,EAAAe,2LAJjBD,EAEMH,EAAAyb,EAAArb,iNAHH,OAAApC,MAAYA,EAAO,GAAA,6TA3ChB,MAAAgN,EAAUD,OAAOC,SAAWD,OAAOE,WAUrC6O,EACE,MAAAyD,EAAqBlc,GAAQ+a,WAAUtM,IACvCA,IACF0N,EAAA,EAAA1D,EAAWhK,GACX9E,EAAQ0B,QAAQjH,MAAMlD,IAAG,CAAGlB,QAASyO,YAIrCuN,QACEI,EAAoBnO,GAAO8M,WAAUtM,GAAG0N,EAAA,EAAKH,EAAUvN,KjBqmC/D,IAAiBnT,MiBjlCX0F,SAlBJa,GAAS,KACPqa,IACAE,GAAiB,IjBimCJ9gB,EiB9lCR4M,cACDqW,QAAa1U,GAAMuB,aAClBmT,UACGnG,GAAeG,eACrBgG,QAAa1U,GAAMuB,cAErBpL,GAAQkB,IAAIqd,GACZtQ,GAAO/M,UAAU2I,GAAMmB,YAAS,EjBwlChCrJ,IAAwBG,GAAGsD,SAASpD,KAAK1G,GiBplC3C4f,GAAKH,WAAUtM,GAAgBA,mCAGxBgK,GAAQ0D,EAAA,EAAEnb,EAAQ6I,GAAM7I,MAAMyX,EAAU/O,kBCvC5C,MAAC8U,GAAM,oEAAQ,CAClB7f,OAAQrC,SAASgd","x_google_ignoreList":[0,10]} +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/index.html b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/pages/popup/index.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset='utf-8'> + <meta name='viewport' content='width=device-width,initial-scale=1'> + <link rel="icon" type="image/x-icon" href="../../../assets/images/libredirect.svg"> + <title>Settings</title> + <link rel='stylesheet' href='build/bundle.css'> + <link rel='stylesheet' href='../fonts/styles.css'> + <script defer src='build/bundle.js'></script> +</head> + +<body> +</body> + +</html> +\ No newline at end of file diff --git a/data/extensions/7esoorv3@alefvanoon.anonaddy.me/updates/updates.xml b/data/extensions/7esoorv3@alefvanoon.anonaddy.me/updates/updates.xml @@ -0,0 +1,6 @@ +<?xml version='1.0' encoding='UTF-8'?> +<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'> + <app appid='oladmjdebphlnjjcnomfhhbfdldiimaf'> + <updatecheck codebase='https://github.com/libredirect/libredirect/releases/download/v3.2.0/libredirect-3.2.0.crx' version='3.2.0' /> + </app> +</gupdate> diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/cose.manifest b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/cose.manifest @@ -0,0 +1,137 @@ +Manifest-Version: 1.0 + +Name: bundle.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PY5wNcArdIAD2nK4Dh5zga11nCo= +SHA256-Digest: s6fI2KZ67T6DWhemP4A41og9KqbyZF1ibKL90db3PGE= + +Name: manifest.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wCGdz91EnD1SMJtaueaYOid6aq0= +SHA256-Digest: wAjq7aq3LoE5GBwvhtM2S6m7eHwUNuk17NrPulGKzUM= + +Name: common/pattern_utils.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: tksSJk5+tTH9EPRHveXWcQLQasQ= +SHA256-Digest: qYPJnlgXiU4mqNh2AuwFXU6bCwFnVpZgCWH1p9If9Mc= + +Name: common/license_definitions.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: L75MS8yrqhw+f5rnAokuSpBCzn4= +SHA256-Digest: TzyEeprYDmHVgqVryo/HqmkZRvAl6K/glfFIUfhg7kw= + +Name: common/fname_data.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jq9YJ+695dacLhTc/PeLv/q/ZNc= +SHA256-Digest: dHE8MO6HJ95u4fAUcD+z64kXxSs4yopRxC5FKhyH5zU= + +Name: common/debug.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: tuyQoLerC7uG2Sm4fPy+iOHCIz8= +SHA256-Digest: xBJ7o0qr23+bNRmPItKYgnKCEFKg5lme8AkW1oWKppQ= + +Name: common/Test.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vcjjROLgBC4613FPab/FFghFP/E= +SHA256-Digest: kRRBvCl7OsQ3WFlsNcO7ER3KlR5k9yJ1nvxlqTik7cs= + +Name: common/checks.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 5pkcaLFV6WatdmjajuOhDMY4rG0= +SHA256-Digest: PfCrIUlJZlPSBS3DvwV5u/NvbViRMNW1KFbXO/CBYiw= + +Name: common/Storage.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8qL8gYXwPOy/9O+TtuQcsalQ6Dc= +SHA256-Digest: N2Jewna8j5H9/jg2MNuMSq9WbnYtoDjihZcdpOEcZJ8= + +Name: content/dialog.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: okq2m3So2NJ21mnToCkVzAyTzhw= +SHA256-Digest: AgEeTDzYIgN8yZUFHrM/J7ZUJA9a/q7ofOV6FIzQUHw= + +Name: content/overlay.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HiornR2qULIjaGkBgK9+4mo6zhE= +SHA256-Digest: QpbfWaEXXtxpCOA7o11c0plSmemhdrEp/AJF8uegrME= + +Name: content/externalLicenseChecker.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oEfxR3QHQdaZLOGDI07NSoWzCCc= +SHA256-Digest: SLyZEsZWTs19zA/Ozt8dHJCY0xaX3T+0MTmtEp772jw= + +Name: content/contactFinder.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 504SqJllyv+PlUAHh22CYi7Kea8= +SHA256-Digest: w22Jr0CHOtQAge2oh0wEASdhby0vw+30Zjtbhkgss8U= + +Name: html/librejs-title.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4wV1hpHAYZrwT7thfw9W3ih9nUI= +SHA256-Digest: kXQZs049GoebbjgWwvRx/lBKFzTvi8J2dKE8PJC3pX0= + +Name: html/fastclick.js.LICENSE.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 3NW2tDCV2ekDU6KLCcsmnejUg44= +SHA256-Digest: WlJkIStdkPCxwO5I5JifqzzUw+tbwt64+8VHemoLD+Q= + +Name: html/fastclick.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8aHH1XH34m7iZq9mLol4ZdleOPg= +SHA256-Digest: fEdtr0rFy3SBgL/Xnc2wssOUUoFfBx6T05RGg2i0tM8= + +Name: html/common.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: VxWUQ31bhir4PZrxeCczHaTFB/Q= +SHA256-Digest: XtMPewrOTJxncjL2YsgherVtMMFCHAv211GoiErGwgU= + +Name: html/README +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: KSboZB1+wr79Fe37Ilvk9wHbFUI= +SHA256-Digest: woimzHpj0kwEyX4pkh/OEWZg+nZMy//j3FFaxIUUSqE= + +Name: html/background-panel.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: I7A+/TQ6qxT/KL1l28vAX/Hk6Vc= +SHA256-Digest: 8QXq/xEzAlvUjmlnoLZsSUNRzJVMlXfxvHXg+CjQCeo= + +Name: html/mobile.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Rlsaps0mwLl0HJwPkcAwP10WUds= +SHA256-Digest: DjCIuaq2tQRZSL8nZCAZo3XhZyT0H8oNsVoUBwbSK2Q= + +Name: html/display_panel/content/main_panel.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: O82uqXfzRlRx34uSKSjXHmTAMTg= +SHA256-Digest: EMiM3Q3G7JDvUcfRQk0Vj/Aa3D/hzY1d+GqH9pAsxHQ= + +Name: html/display_panel/content/panel-styles.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: f2hf4t1D4PAI9c2BbxoBQd9kcko= +SHA256-Digest: xD1r4fotCgzI4D6L2wvcPgmQYnu2CtmkpH4oVeK6Ci0= + +Name: html/display_panel/content/display-panel.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: u8VzSDA0kDQQXfsD6UD158yJolg= +SHA256-Digest: XvtYXtpNj6tzZFz5HHVk94N6mwvJ+dL0Efpd+bmicWE= + +Name: html/preferences_panel/preferences_panel.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: p4bT3dvEpLwlx+HSbEjaN/m/sWM= +SHA256-Digest: 5ulelouZj4FWFWe6RKw5CEOOMcrY8M8uc+O5xLM5mTg= + +Name: html/preferences_panel/prefs.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: N4XJ2uubM7Ml2KRGHim2/JtebHw= +SHA256-Digest: I58QSjVZ2zDQcw9ZtmqknHRIPo8/IYCYNmekNg/GSkM= + +Name: html/preferences_panel/pref.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vdLhVkb7iHVcGbg0B5Wx97w7Y9E= +SHA256-Digest: KJogHfMXaOzOMvREEn/LhMUgaECHdMUfsvfU8Zxo0yk= + +Name: icons/librejs.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q9vvlNA4dFCgNvsckbkM3AcbqC4= +SHA256-Digest: iZ50DcoVMy8qEArQPbLCQyuf/vGeVkTS6Ja8K/E1nvU= + diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/cose.sig b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/cose.sig Binary files differ. diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/manifest.mf b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/manifest.mf @@ -0,0 +1,147 @@ +Manifest-Version: 1.0 + +Name: bundle.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PY5wNcArdIAD2nK4Dh5zga11nCo= +SHA256-Digest: s6fI2KZ67T6DWhemP4A41og9KqbyZF1ibKL90db3PGE= + +Name: manifest.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wCGdz91EnD1SMJtaueaYOid6aq0= +SHA256-Digest: wAjq7aq3LoE5GBwvhtM2S6m7eHwUNuk17NrPulGKzUM= + +Name: common/pattern_utils.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: tksSJk5+tTH9EPRHveXWcQLQasQ= +SHA256-Digest: qYPJnlgXiU4mqNh2AuwFXU6bCwFnVpZgCWH1p9If9Mc= + +Name: common/license_definitions.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: L75MS8yrqhw+f5rnAokuSpBCzn4= +SHA256-Digest: TzyEeprYDmHVgqVryo/HqmkZRvAl6K/glfFIUfhg7kw= + +Name: common/fname_data.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jq9YJ+695dacLhTc/PeLv/q/ZNc= +SHA256-Digest: dHE8MO6HJ95u4fAUcD+z64kXxSs4yopRxC5FKhyH5zU= + +Name: common/debug.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: tuyQoLerC7uG2Sm4fPy+iOHCIz8= +SHA256-Digest: xBJ7o0qr23+bNRmPItKYgnKCEFKg5lme8AkW1oWKppQ= + +Name: common/Test.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vcjjROLgBC4613FPab/FFghFP/E= +SHA256-Digest: kRRBvCl7OsQ3WFlsNcO7ER3KlR5k9yJ1nvxlqTik7cs= + +Name: common/checks.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 5pkcaLFV6WatdmjajuOhDMY4rG0= +SHA256-Digest: PfCrIUlJZlPSBS3DvwV5u/NvbViRMNW1KFbXO/CBYiw= + +Name: common/Storage.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8qL8gYXwPOy/9O+TtuQcsalQ6Dc= +SHA256-Digest: N2Jewna8j5H9/jg2MNuMSq9WbnYtoDjihZcdpOEcZJ8= + +Name: content/dialog.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: okq2m3So2NJ21mnToCkVzAyTzhw= +SHA256-Digest: AgEeTDzYIgN8yZUFHrM/J7ZUJA9a/q7ofOV6FIzQUHw= + +Name: content/overlay.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HiornR2qULIjaGkBgK9+4mo6zhE= +SHA256-Digest: QpbfWaEXXtxpCOA7o11c0plSmemhdrEp/AJF8uegrME= + +Name: content/externalLicenseChecker.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oEfxR3QHQdaZLOGDI07NSoWzCCc= +SHA256-Digest: SLyZEsZWTs19zA/Ozt8dHJCY0xaX3T+0MTmtEp772jw= + +Name: content/contactFinder.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 504SqJllyv+PlUAHh22CYi7Kea8= +SHA256-Digest: w22Jr0CHOtQAge2oh0wEASdhby0vw+30Zjtbhkgss8U= + +Name: html/librejs-title.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4wV1hpHAYZrwT7thfw9W3ih9nUI= +SHA256-Digest: kXQZs049GoebbjgWwvRx/lBKFzTvi8J2dKE8PJC3pX0= + +Name: html/fastclick.js.LICENSE.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 3NW2tDCV2ekDU6KLCcsmnejUg44= +SHA256-Digest: WlJkIStdkPCxwO5I5JifqzzUw+tbwt64+8VHemoLD+Q= + +Name: html/fastclick.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8aHH1XH34m7iZq9mLol4ZdleOPg= +SHA256-Digest: fEdtr0rFy3SBgL/Xnc2wssOUUoFfBx6T05RGg2i0tM8= + +Name: html/common.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: VxWUQ31bhir4PZrxeCczHaTFB/Q= +SHA256-Digest: XtMPewrOTJxncjL2YsgherVtMMFCHAv211GoiErGwgU= + +Name: html/README +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: KSboZB1+wr79Fe37Ilvk9wHbFUI= +SHA256-Digest: woimzHpj0kwEyX4pkh/OEWZg+nZMy//j3FFaxIUUSqE= + +Name: html/background-panel.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: I7A+/TQ6qxT/KL1l28vAX/Hk6Vc= +SHA256-Digest: 8QXq/xEzAlvUjmlnoLZsSUNRzJVMlXfxvHXg+CjQCeo= + +Name: html/mobile.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Rlsaps0mwLl0HJwPkcAwP10WUds= +SHA256-Digest: DjCIuaq2tQRZSL8nZCAZo3XhZyT0H8oNsVoUBwbSK2Q= + +Name: html/display_panel/content/main_panel.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: O82uqXfzRlRx34uSKSjXHmTAMTg= +SHA256-Digest: EMiM3Q3G7JDvUcfRQk0Vj/Aa3D/hzY1d+GqH9pAsxHQ= + +Name: html/display_panel/content/panel-styles.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: f2hf4t1D4PAI9c2BbxoBQd9kcko= +SHA256-Digest: xD1r4fotCgzI4D6L2wvcPgmQYnu2CtmkpH4oVeK6Ci0= + +Name: html/display_panel/content/display-panel.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: u8VzSDA0kDQQXfsD6UD158yJolg= +SHA256-Digest: XvtYXtpNj6tzZFz5HHVk94N6mwvJ+dL0Efpd+bmicWE= + +Name: html/preferences_panel/preferences_panel.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: p4bT3dvEpLwlx+HSbEjaN/m/sWM= +SHA256-Digest: 5ulelouZj4FWFWe6RKw5CEOOMcrY8M8uc+O5xLM5mTg= + +Name: html/preferences_panel/prefs.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: N4XJ2uubM7Ml2KRGHim2/JtebHw= +SHA256-Digest: I58QSjVZ2zDQcw9ZtmqknHRIPo8/IYCYNmekNg/GSkM= + +Name: html/preferences_panel/pref.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vdLhVkb7iHVcGbg0B5Wx97w7Y9E= +SHA256-Digest: KJogHfMXaOzOMvREEn/LhMUgaECHdMUfsvfU8Zxo0yk= + +Name: icons/librejs.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q9vvlNA4dFCgNvsckbkM3AcbqC4= +SHA256-Digest: iZ50DcoVMy8qEArQPbLCQyuf/vGeVkTS6Ja8K/E1nvU= + +Name: META-INF/cose.manifest +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: yDADf2wkPCCFioJk2alq9/ZnL4w= +SHA256-Digest: ROldUBx5VGLIWpYENeK9dkakBYTE70U3TTFbqRGZtXM= + +Name: META-INF/cose.sig +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sfzJLkS1WXA73PQxT6ZuZ+4gt+U= +SHA256-Digest: uOTLvSqEVP0gP0KUVDjlmFlMuvU0IlfGezDN+TUl55o= + diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/mozilla.rsa b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/mozilla.rsa Binary files differ. diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/mozilla.sf b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/META-INF/mozilla.sf @@ -0,0 +1,4 @@ +Signature-Version: 1.0 +SHA1-Digest-Manifest: o88Sl4XaPgbvnq/pk8fUx96fdR8= +SHA256-Digest-Manifest: BHDk1+Y5OkPbjfUAstcgyxu7TJW24Kk7T5vQCP1Yx9k= + diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/bundle.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/bundle.js @@ -0,0 +1,9046 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +/** + Singleton to handle external licenses, e.g. WebLabels +*/ + +'use strict'; + +const licenses = require('../common/license_definitions.json') +const licensesByLabel = new Map(Object.entries(licenses).map(([id, license]) => + [ + [license.identifier.toUpperCase(), license], + [id.toUpperCase(), license], + [license.licenseName.toUpperCase(), license] + ]).flat()); +const licensesByUrl = new Map(Object.values(licenses).map(license => + license.canonicalUrl.map(url => [url, license])).flat()); +for (const [id, license] of Object.entries(licenses)) { + if (!license.identifier) { + license.identifier = id; + } +} + +const cachedHrefs = new Map(); + +const ExternalLicenses = { + purgeCache(tabId) { + cachedHrefs.delete(tabId); + }, + + /** + * Checks external script using web labels + * + * If the script cannot be found in the web labels table, returns null. + * + * If the script can be found in the web labels table, and at least + * one of its licenses can be found in our free license DB, returns + * "free". + * + * Otherwise returns "nonfree". + */ + async check(script) { + const { url, tabId, frameId, documentUrl } = script; + const tabCache = cachedHrefs.get(tabId); + const frameCache = tabCache && tabCache.get(frameId); + const cache = frameCache && frameCache.get(documentUrl); + const scriptInfo = await browser.tabs.sendMessage(tabId, { + action: 'checkLicensedScript', + url, + cache, + }, { frameId }); + + if (!(scriptInfo && scriptInfo.licenseLinks.length)) { + return null; + } + scriptInfo.licenses = new Set(scriptInfo.licenseLinks.map( + ({ label, url }) => { + const uLabel = label.trim().toUpperCase(); + const license = licensesByLabel.get(uLabel) || licensesByUrl.get(url) || + licensesByLabel.get(uLabel.replace(/^GNU-|-(?:OR-LATER|ONLY)$/, '')); + return license ? [license] : []; + }).flat()); + scriptInfo.free = scriptInfo.licenses.size > 0; + return scriptInfo; + }, + + /** + * moves / creates external license references before any script in the page + * if needed, to have them ready when the first script load is triggered. + * It also caches the external licens href by page URL, to help not actually + * modify the rendered HTML but rather feed the content script on demand. + * Returns true if the document has been actually modified, false otherwise. + */ + optimizeDocument(doc, cachePointer) { + const cache = {}; + const { tabId, frameId, documentUrl } = cachePointer; + const frameCache = cachedHrefs.get(tabId) || new Map(); + cachedHrefs.set(tabId, frameCache); + frameCache.set(frameId, new Map([[documentUrl, cache]])); + + const link = doc.querySelector('link[rel="jslicense"], link[data-jslicense="1"], a[rel="jslicense"], a[data-jslicense="1"]'); + if (link) { + const href = link.getAttribute('href'); + cache.webLabels = { href }; + const move = (link) => !!doc.head.insertBefore(link, doc.head.firstChild); + if (link.parentNode === doc.head) { + // TODO: eliminate let + let node = link.previousElementSibling; + for (; node; node = node.previousElementSibling) { + if (node.tagName.toUpperCase() === 'SCRIPT') { + return move(link); + } + } + } else { // the reference is only in the body + if (link.tagName.toUpperCase() === 'A') { + const newLink = doc.createElement('link'); + newLink.rel = 'jslicense'; + newLink.setAttribute('href', href); + return move(newLink); + } + return move(link); + } + } + + return false; + } +}; + + +module.exports = { ExternalLicenses }; + +},{"../common/license_definitions.json":10}],2:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +/* + A class to manage whitelist/blacklist operations +*/ + +const { ListStore } = require('../common/Storage'); + +class ListManager { + constructor(whitelist, blacklist, builtInHashes) { + this.lists = { whitelist, blacklist }; + this.builtInHashes = new Set(builtInHashes); + } + + static async move(fromList, toList, ...keys) { + await Promise.all([fromList.remove(...keys), toList.store(...keys)]); + } + + async whitelist(...keys) { + await ListManager.move(this.lists.blacklist, this.lists.whitelist, ...keys); + } + async blacklist(...keys) { + await ListManager.move(this.lists.whitelist, this.lists.blacklist, ...keys); + } + async forget(...keys) { + await Promise.all(Object.values(this.lists).map(async l => await l.remove(...keys))); + } + /* key is a string representing either a URL or an optional path + with a trailing (hash). + Returns "blacklisted", "whitelisted" or defValue + */ + getStatus(key, defValue = 'unknown') { + const { blacklist, whitelist } = this.lists; + const inline = ListStore.inlineItem(key); + if (inline) { + return blacklist.contains(inline) + ? 'blacklisted' + : whitelist.contains(inline) ? 'whitelisted' + : defValue; + } + + const match = key.match(/\(([^)]+)\)(?=[^()]*$)/); + if (!match) { + const url = ListStore.urlItem(key); + const site = ListStore.siteItem(key); + return (blacklist.contains(url) || ListManager.siteMatch(site, blacklist) + ? 'blacklisted' + : whitelist.contains(url) || ListManager.siteMatch(site, whitelist) + ? 'whitelisted' : defValue + ); + } + + const [hashItem, srcHash] = match; // (hash), hash + return blacklist.contains(hashItem) ? 'blacklisted' + : this.builtInHashes.has(srcHash) || whitelist.contains(hashItem) + ? 'whitelisted' + : defValue; + } + + /* + Matches by whole site ("http://some.domain.com/*") supporting also + wildcarded subdomains ("https://*.domain.com/*"). + */ + static siteMatch(url, list) { + const site = ListStore.siteItem(url); + if (list.contains(site)) return site; + // TODO: get rid of let + for (let replaced = site.replace(/^([\w-]+:\/\/)?(\w)/, '$1*.$2'); ;) { + if (list.contains(replaced)) return replaced; + const oldKey = replaced; + replaced = replaced.replace(/(?:\*\.)*\w+(?=\.)/, '*'); + if (oldKey === replaced) return null; + } + } +} + +module.exports = { ListManager }; + +},{"../common/Storage":5}],3:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +/** + This class parses HTTP response headers to extract both the + MIME Content-type and the character set to be used, if specified, + to parse textual data through a decoder. +*/ + +const BOM = [0xEF, 0xBB, 0xBF]; +const DECODER_PARAMS = { stream: true }; + +class ResponseMetaData { + constructor(request) { + let { responseHeaders } = request; + this.headers = {}; + for (let h of responseHeaders) { + if (/^\s*Content-(Type|Disposition)\s*$/i.test(h.name)) { + let propertyName = h.name.split('-')[1].trim(); + propertyName = `content${propertyName.charAt(0).toUpperCase()}${propertyName.substring(1).toLowerCase()}`; + this[propertyName] = h.value; + this.headers[propertyName] = h; + } + } + this.computedCharset = ''; + } + + get charset() { + let charset = ''; + if (this.contentType) { + let m = this.contentType.match(/;\s*charset\s*=\s*(\S+)/); + if (m) { + charset = m[1]; + } + } + Object.defineProperty(this, 'charset', { value: charset, writable: false, configurable: true }); + return this.computedCharset = charset; + } + + decode(data) { + let charset = this.charset; + let decoder = this.createDecoder(); + let text = decoder.decode(data, DECODER_PARAMS); + if (!charset && /html/i.test(this.contentType)) { + // missing HTTP charset, sniffing in content... + + if (data[0] === BOM[0] && data[1] === BOM[1] && data[2] === BOM[2]) { + // forced UTF-8, nothing to do + return text; + } + + // let's try figuring out the charset from <meta> tags + let parser = new DOMParser(); + let doc = parser.parseFromString(text, 'text/html'); + let meta = doc.querySelectorAll('meta[charset], meta[http-equiv="content-type"], meta[content*="charset"]'); + for (let m of meta) { + charset = m.getAttribute('charset'); + if (!charset) { + let match = m.getAttribute('content').match(/;\s*charset\s*=\s*([\w-]+)/i) + if (match) charset = match[1]; + } + if (charset) { + decoder = this.createDecoder(charset, null); + if (decoder) { + this.computedCharset = charset; + return decoder.decode(data, DECODER_PARAMS); + } + } + } + } + return text; + } + + createDecoder(charset = this.charset, def = 'latin1') { + if (charset) { + try { + return new TextDecoder(charset); + } catch (e) { + console.error(e); + } + } + return def ? new TextDecoder(def) : null; + } +} +ResponseMetaData.UTF8BOM = new Uint8Array(BOM); + +module.exports = { ResponseMetaData }; + +},{}],4:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +/** + An abstraction layer over the StreamFilter API, allowing its clients to process + only the "interesting" HTML and script requests and leaving the other alone +*/ + +const { ResponseMetaData } = require('./ResponseMetaData'); + +const listeners = new WeakMap(); +const webRequestEvent = browser.webRequest.onHeadersReceived; +// Some hardcoded return values for the onHeadersReceived callback. +const BLOCKING_RESPONSES = { + ACCEPT: {}, // Do nothing + REJECT: { cancel: true }, // Cancel the request. See docs of BlockingResponse +}; + +class ResponseProcessor { + + static install(handler, types = ['main_frame', 'sub_frame', 'script']) { + if (listeners.has(handler)) return false; + const listener = + async request => await new ResponseTextFilter(request).process(handler); + listeners.set(handler, listener); + webRequestEvent.addListener( + listener, + { urls: ['<all_urls>'], types }, + ['blocking', 'responseHeaders'] + ); + return true; + } + + static uninstall(handler) { + const listener = listeners.get(handler); + if (listener) { + webRequestEvent.removeListener(listener); + } + } +} + +class ResponseTextFilter { + constructor(request) { + this.request = request; + const { type, statusCode } = request; + const md = this.metaData = new ResponseMetaData(request); + this.canProcess = // we want to process html documents and scripts only + (statusCode < 300 || statusCode >= 400) && // skip redirections + !md.disposition && // skip forced downloads + (type === 'script' || /\bhtml\b/i.test(md.contentType)); + } + + async process(handler) { + if (!this.canProcess) return BlockingResponses.ACCEPT; + const { metaData, request } = this; + const response = { request, metaData }; // we keep it around allowing callbacks to store state + + if (typeof handler.pre !== 'function' || typeof handler.post !== 'function') { + throw new Error('handler should have a pre and post function.'); + } + + // If can determine without checking and filtering response + // payload then return. + const res = await handler.pre(response); + if (res) return res; + + const { requestId } = request; + // create a filter to modify response data, see + // Mozilla/Add-ons/WebExtensions/API/webRequest/filterResponseData + const filter = browser.webRequest.filterResponseData(requestId); + let buffer = []; + + filter.ondata = event => { + buffer.push(event.data); + }; + + filter.onstop = async _ => { + // concatenate chunks + const size = buffer.reduce((sum, chunk) => sum + chunk.byteLength, 0) + let allBytes = new Uint8Array(size); + let pos = 0; + for (const chunk of buffer) { + allBytes.set(new Uint8Array(chunk), pos); + pos += chunk.byteLength; + } + buffer = null; // allow garbage collection + if (allBytes.indexOf(0) !== -1) { + console.debug('Warning: zeroes in bytestream, probable cached encoding mismatch.', request); + if (request.type === 'script') { + console.debug('It\'s a script, trying to refetch it.'); + response.text = await (await fetch(request.url, { cache: 'reload', credentials: 'include' })).text(); + } else { + console.debug('It\'s a %s, trying to decode it as UTF-16.', request.type); + response.text = new TextDecoder('utf-16be').decode(allBytes, { stream: true }); + } + } else { + response.text = metaData.decode(allBytes); + } + let editedText = null; + try { + editedText = await handler.post(response); + } catch (e) { + console.error(e); + } + if (editedText !== null && editedText !== response.text) { + // we changed the content, let's re-encode + const encoded = new TextEncoder().encode(editedText); + // pre-pending the UTF-8 BOM will force the charset per HTML 5 specs + allBytes = new Uint8Array(encoded.byteLength + 3); + allBytes.set(ResponseMetaData.UTF8BOM, 0); // UTF-8 BOM + allBytes.set(encoded, 3); + } + filter.write(allBytes); + filter.close(); + } + + // Accepting the filtered payload. + return BLOCKING_RESPONSES.ACCEPT; + } +} + +module.exports = { ResponseProcessor, BLOCKING_RESPONSES }; + +},{"./ResponseMetaData":3}],5:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +/** + A tiny wrapper around extensions storage API, supporting CSV serialization for + retro-compatibility +*/ +'use strict'; + + +const Storage = { + ARRAY: { + async load(key, array = undefined) { + const result = array === undefined ? + (await browser.storage.local.get(key))[key] : array; + return result ? new Set(result) : new Set(); + }, + async save(key, list) { + return await browser.storage.local.set({ [key]: [...list] }); + }, + }, + + CSV: { + async load(key) { + const csv = (await browser.storage.local.get(key))[key]; + return csv ? new Set(csv.split(/\s*,\s*/)) : new Set(); + }, + + async save(key, list) { + return await browser.storage.local.set({ [key]: [...list].join(',') }); + } + } +}; + +/** + A class to hold and persist blacklists and whitelists +*/ + +class ListStore { + constructor(key, storage = Storage.ARRAY) { + this.key = key; + this.storage = storage; + this.items = new Set(); + browser.storage.onChanged.addListener(changes => { + if (!this.saving && this.key in changes) { + this.load(changes[this.key].newValue); + } + }); + } + + static inlineItem(url) { + // here we simplify and hash inline script references + return url.startsWith('inline:') ? url + : url.startsWith('view-source:') + && url.replace(/^view-source:[\w-+]+:\/+([^/]+).*#line\d+/, 'inline://$1#') + .replace(/\n[^]*/, s => s.replace(/\s+/g, ' ').substring(0, 16) + '…' + hash(s.trim())); + } + static hashItem(hash) { + return hash.startsWith('(') ? hash : `(${hash})`; + } + static urlItem(url) { + const queryPos = url.indexOf('?'); + return queryPos === -1 ? url : url.substring(0, queryPos); + } + static siteItem(url) { + if (url.endsWith('/*')) return url; + try { + return `${new URL(url).origin}/*`; + } catch (e) { + return `${url}/*`; + } + } + + async save() { + this._saving = true; + try { + return await this.storage.save(this.key, this.items); + } finally { + this._saving = false; + } + } + + async load(values = undefined) { + try { + this.items = await this.storage.load(this.key, values); + } catch (e) { + console.error(e); + } + return this.items; + } + + async store(...items) { + const size = this.items.size; + const changed = items.reduce((current, item) => size !== this.items.add(item).size || current, false); + changed && await this.save(); + } + + async remove(...items) { + const changed = items.reduce((current, item) => this.items.delete(item) || current, false); + changed && await this.save(); + } + + contains(item) { + return this.items.has(item); + } +} + +function hash(source) { + const shaObj = new jssha('SHA-256', 'TEXT') + shaObj.update(source); + return shaObj.getHash('HEX'); +} + +if (typeof module === 'object') { + module.exports = { ListStore, Storage, hash }; + // TODO: eliminate the var + var jssha = require('jssha'); +} + +},{"jssha":14}],6:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +'use strict'; +const Test = (() => { + const RUNNER_URL = browser.runtime.getURL('/test/SpecRunner.html'); + return { + /* + returns RUNNER_URL if it's a test-enabled build or an about:debugging + temporary extension session, null otherwise + */ + async getURL() { + try { + await fetch(RUNNER_URL); + return RUNNER_URL; + } catch (e) { + return null; + } + }, + + async getTab(activate = false) { + const url = await this.getURL(); + const tab = url ? (await browser.tabs.query({ url }))[0] || + (await browser.tabs.create({ url })) + : null; + if (tab && activate) { + await browser.tabs.update(tab.id, { active: true }); + } + return tab; + } + }; +})(); +if (typeof module === 'object') { + module.exports = Test; +} + +},{}],7:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* * +* Copyright (C) 2018 Nathan Nichols +* Copyright (C) 2022 Yuchen Pei +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +const acorn = require('acorn'); +const licenses = require('./license_definitions.json'); +const { patternUtils } = require('./pattern_utils.js'); +const { makeDebugLogger } = require('./debug.js'); +const fnameData = require('./fname_data.json').fname_data; + +const LIC_RE = /@licstartThefollowingistheentirelicensenoticefortheJavaScriptcodeinthis(?:page|file)(.*)?@licendTheaboveistheentirelicensenoticefortheJavaScriptcodeinthis(?:page|file)/mi; + +/* + NONTRIVIAL THINGS: + - Fetch + - XMLhttpRequest + - eval() + - ? + JAVASCRIPT CAN BE FOUND IN: + - Event handlers (onclick, onload, onsubmit, etc.) + - <script>JS</script> + - <script src="/JS.js"></script> + WAYS TO DETERMINE PASS/FAIL: + - "// @license [magnet link] [identifier]" then "// @license-end" (may also use /* comments) + - Automatic whitelist: (http://bzr.savannah.gnu.org/lh/librejs/dev/annotate/head:/data/script_libraries/script-libraries.json_ +*/ +// These are objects that it will search for in an initial regex pass over non-free scripts. +const RESERVED_OBJECTS = [ + //"document", + //"window", + 'fetch', + 'XMLHttpRequest', + 'chrome', // only on chrome + 'browser', // only on firefox + 'eval' +]; +const LOOPKEYS = new Set(['for', 'if', 'while', 'switch']); +const OPERATORS = new Set(['||', '&&', '=', '==', '++', '--', '+=', '-=', '*']); +// @license match, second and third capture groups are canonicalUrl +// and license name +// Caveat: will not work in a commented out star comments: +// '// /* @license */ ... /* @license-end */' will be checked, though +// the whole thing is a comment +const OPENING_LICENSE_RE1 = /^\s*\/\/\s*@license\s+(\S+)\s+(\S+).*$/mi; +const OPENING_LICENSE_RE2 = /\/\*\s*?@license\s+(\S+)\s+([^/*]+).*\*\//mi; +const CLOSING_LICENSE_RE1 = /^\s*\/\/\s*@license-end\s*/mi; +const CLOSING_LICENSE_RE2 = /\/\*\s*@license-end\s*\*\//mi; +/** +* If this is true, it evaluates entire scripts instead of returning as soon as it encounters a violation. +* +* Also, it controls whether or not this part of the code logs to the console. +* +*/ +const DEBUG = false; // debug the JS evaluation +const PRINT_DEBUG = false; +const dbg_print = makeDebugLogger('checks.js', PRINT_DEBUG, Date.now()); + +/** + * stripLicenseToRegexp + * + * Removes all non-alphanumeric characters except for the + * special tokens, and replace the text values that are + * hardcoded in license_definitions.js. Puts the result in + * the regex field of the fragments. + * + */ +const stripLicenseToRegexp = function(license) { + for (const frag of license.licenseFragments) { + frag.regex = patternUtils.removeNonalpha(frag.text); + frag.regex = new RegExp( + patternUtils.replaceTokens(frag.regex), ''); + } +}; + +const init = function() { + console.log('initializing regexes'); + for (const key in licenses) { + stripLicenseToRegexp(licenses[key]); + } +} + +/** +* +* Takes in the declaration that has been preprocessed and +* tests it against regexes in licenses. +*/ +const searchTable = function(strippedComment) { + const stripped = patternUtils.removeNonalpha(strippedComment); + // looking up license + for (const key in licenses) { + const license = licenses[key]; + for (const frag of license.licenseFragments) { + if (frag.regex.test(stripped)) { + return license.licenseName; + } + } + } + console.log('No global license found.'); + return null; +} + +/** + * Checks whether licenseText, modulo whitespace, starts with + * a @licstart .. @licend with a free license, returns the license name + * if so, and null otherwise. + */ +const checkLicenseText = function(licenseText) { + if (licenseText === undefined || licenseText === null) { + return null; + } + // remove whitespace + const stripped = patternUtils.removeWhitespace(licenseText); + // Search for @licstart/@licend + const matches = stripped.match(LIC_RE); + return matches && searchTable(matches[0]); +}; + +//************************this part can be tested in the HTML file index.html's script test.js**************************** + +/** + * Checks whether script is trivial by analysing its tokens. + * + * Returns an array of + * [flag (boolean, true if trivial), reason (string, human readable report)]. + */ +function fullEvaluate(script) { + if (script === undefined || script == '') { + return [true, 'Harmless null script']; + } + + let tokens; + + try { + tokens = acorn.tokenizer(script); + } catch (e) { + console.warn('Tokenizer could not be initiated (probably invalid code)'); + return [false, 'Tokenizer could not be initiated (probably invalid code)']; + } + try { + var toke = tokens.getToken(); + } catch (e) { + console.log(script); + console.log(e); + console.warn('couldn\'t get first token (probably invalid code)'); + console.warn('Continuing evaluation'); + } + + let amtloops = 0; + let definesFunctions = false; + + /** + * Given the end of an identifer token, it tests for parentheses + */ + function is_bsn(end) { + let i = 0; + while (script.charAt(end + i).match(/\s/g) !== null) { + i++; + if (i >= script.length - 1) { + return false; + } + } + return script.charAt(end + i) == '['; + } + + function evaluateByTokenValue(toke) { + const value = toke.value; + if (OPERATORS.has(value)) { + // It's just an operator. Javascript doesn't have operator overloading so it must be some + // kind of primitive (I.e. a number) + } else { + const status = fnameData[value]; + if (status === true) { // is the identifier banned? + dbg_print('%c NONTRIVIAL: nontrivial token: \'' + value + '\'', 'color:red'); + if (DEBUG == false) { + return [false, 'NONTRIVIAL: nontrivial token: \'' + value + '\'']; + } + } else if (status === false || status === undefined) {// is the identifier not banned or user defined? + // Is there bracket suffix notation? + if (is_bsn(toke.end)) { + dbg_print('%c NONTRIVIAL: Bracket suffix notation on variable \'' + value + '\'', 'color:red'); + if (DEBUG == false) { + return [false, '%c NONTRIVIAL: Bracket suffix notation on variable \'' + value + '\'']; + } + } + } else { + dbg_print('trivial token:' + value); + } + } + return [true, '']; + } + + function evaluateByTokenTypeKeyword(keyword) { + if (toke.type.keyword == 'function') { + dbg_print('%c NOTICE: Function declaration.', 'color:green'); + definesFunctions = true; + } + + if (LOOPKEYS.has(keyword)) { + amtloops++; + if (amtloops > 3) { + dbg_print('%c NONTRIVIAL: Too many loops/conditionals.', 'color:red'); + if (DEBUG == false) { + return [false, 'NONTRIVIAL: Too many loops/conditionals.']; + } + } + } + return [true, '']; + } + + while (toke !== undefined && toke.type != acorn.tokTypes.eof) { + if (toke.type.keyword !== undefined) { + //dbg_print("Keyword:"); + //dbg_print(toke); + + // This type of loop detection ignores functional loop alternatives and ternary operators + const tokeTypeRes = evaluateByTokenTypeKeyword(toke.type.keyword); + if (tokeTypeRes[0] === false) { + return tokeTypeRes; + } + } else if (toke.value !== undefined) { + const tokeValRes = evaluateByTokenValue(toke); + if (tokeValRes[0] === false) { + return tokeValRes; + } + } + // If not a keyword or an identifier it's some kind of operator, field parenthesis, brackets + try { + toke = tokens.getToken(); + } catch (e) { + dbg_print('Denied script because it cannot be parsed.'); + return [false, 'NONTRIVIAL: Cannot be parsed. This could mean it is a 404 error.']; + } + } + + dbg_print('%cAppears to be trivial.', 'color:green;'); + if (definesFunctions === true) + return [true, 'Script appears to be trivial but defines functions.']; + else + return [true, 'Script appears to be trivial.']; +} + + +//**************************************************************************************************** +/** +* This is the entry point for full code evaluation for triviality. +* +* Performs the initial pass on code to see if it needs to be completely parsed +* +* This can only determine if a script is bad, not if it's good +* +* If it passes the intitial pass, it runs the full pass and returns the result + +* It returns an array of [flag (boolean, false if "bad"), reason (string, human readable report)] +* +*/ +function evaluate(script, name) { + const reservedResult = evaluateForReservedObj(script, name); + if (reservedResult[0] === true) { + dbg_print('%c pass', 'color:green;'); + } else { + return reservedResult; + } + + return fullEvaluate(script); +} + +function evaluateForReservedObj(script, name) { + function reservedObjectRegex(object) { + const arithOperators = '\\+\\-\\*\\/\\%\\='; + return new RegExp('(?:[^\\w\\d]|^|(?:' + arithOperators + '))' + object + '(?:\\s*?(?:[\\;\\,\\.\\(\\[])\\s*?)', 'g'); + } + const mlComment = /\/\*([\s\S]+?)\*\//g; + const ilComment = /\/\/.+/gm; + const temp = script.replace(/'.+?'+/gm, '\'string\'').replace(/".+?"+/gm, '"string"').replace(mlComment, '').replace(ilComment, ''); + dbg_print('%c ------evaluation results for ' + name + '------', 'color:white'); + dbg_print('Script accesses reserved objects?'); + + // This is where individual "passes" are made over the code + for (const reserved of RESERVED_OBJECTS) { + if (reservedObjectRegex(reserved).exec(temp) != null) { + dbg_print('%c fail', 'color:red;'); + return [false, 'Script uses a reserved object (' + reserved + ')']; + } + } + return [true, 'Reserved object not found.']; +} + +/** + * Checks whether url is the magnet link of a license. + * + * Returns the licenseName if so, otherwise returns null. If a key is + * supplied, checks for the license with the key only. + */ +function checkMagnet(url, key = null) { + const fixedUrl = url.replace(/&amp;/g, '&'); + // Match by magnet link + const checkLicenseMagnet = license => { + for (const cUrl of license.canonicalUrl) { + if (cUrl.startsWith('magnet:') && fixedUrl === cUrl) { + return license.licenseName; + } + } + return null; + } + + if (key) { + try { + return checkLicenseMagnet(licenses[key]); + } catch (error) { + return null; + } + } else { + for (const key in licenses) { + const result = checkLicenseMagnet(licenses[key]); + if (result) return result; + } + return null; + } +} + + +/** + * + * Evaluates the content of a script for licenses and triviality + * scriptSrc: content of the script; name: script name; external: + * whether the script is external + * + * Returns + * [ + * true (accepted) or false (denied), + * edited content, + * reason text + * ] + */ +function checkScriptSource(scriptSrc, name, external = false) { + let inSrc = scriptSrc.trim(); + if (!inSrc) return [true, scriptSrc, 'Empty source.']; + + // Check for @licstart .. @licend method + const license = checkLicenseText(scriptSrc); + if (license) { + return [true, scriptSrc, `Licensed under: ${license}`]; + } + + let outSrc = ''; + let reason = ''; + let partsDenied = false; + let partsAccepted = false; + + function checkTriviality(s) { + if (!patternUtils.removeJsComments(s).trim()) { + return true; // empty, ignore it + } + const [trivial, message] = external ? + [false, 'External script with no known license'] + : evaluate(s, name); + if (trivial) { + partsAccepted = true; + outSrc += s; + } else { + partsDenied = true; + if (s.startsWith('javascript:')) + outSrc += `# LIBREJS BLOCKED: ${message}`; + else + outSrc += `/*\nLIBREJS BLOCKED: ${message}\n*/`; + } + reason += `\n${message}`; + } + + // Consume inSrc by checking licenses in all @license / @license-end + // blocks and triviality outside these blocks + while (inSrc) { + const openingMatch1 = OPENING_LICENSE_RE1.exec(inSrc); + const openingMatch2 = OPENING_LICENSE_RE2.exec(inSrc); + const openingMatch = + (openingMatch1 && openingMatch2) ? + (openingMatch1.index < openingMatch2.index ? openingMatch1 + : openingMatch2) + : (openingMatch1 || openingMatch2); + const openingIndex = openingMatch ? openingMatch.index : inSrc.length; + // checks the triviality of the code before the license tag, if any + checkTriviality(inSrc.substring(0, openingIndex)); + inSrc = inSrc.substring(openingIndex); + if (!inSrc) break; + + // checks the remaining part, that starts with an @license + const closureMatch1 = CLOSING_LICENSE_RE1.exec(inSrc); + const closureMatch2 = CLOSING_LICENSE_RE2.exec(inSrc); + const closureMatch = + (closureMatch1 && closureMatch2) ? + (closureMatch1.index < closureMatch2.index ? closureMatch1 + : closureMatch2) + : (closureMatch1 || closureMatch2); + if (!closureMatch) { + const msg = 'ERROR: @license with no @license-end'; + return [false, `\n/*\n ${msg} \n*/\n`, msg]; + } + const closureEndIndex = closureMatch.index + closureMatch[0].length; + + if (!(Array.isArray(openingMatch) && openingMatch.length >= 3)) { + return [false, 'Malformed or unrecognized license tag.']; + } + const licenseName = checkMagnet(openingMatch[1]); + let message; + if (licenseName) { + outSrc += inSrc.substr(0, closureEndIndex); + partsAccepted = true; + message = `Recognized license: "${licenseName}".` + } else { + outSrc += `\n/*\n${message}\n*/\n`; + partsDenied = true; + message = `Unrecognized license tag: "${openingMatch[0]}"`; + } + reason += `\n${message}`; + + // trim off everything we just evaluated + inSrc = inSrc.substring(closureEndIndex).trim(); + } + + if (partsDenied) { + if (partsAccepted) { + reason = `Some parts of the script have been disabled (check the source for details).\n^--- ${reason}`; + } + return [false, outSrc, reason]; + } + + return [true, scriptSrc, reason]; +} + +module.exports = { init, checkLicenseText, checkMagnet, checkScriptSource }; + +},{"./debug.js":8,"./fname_data.json":9,"./license_definitions.json":10,"./pattern_utils.js":11,"acorn":13}],8:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* * +* Copyright (C) 2017, 2018 Nathan Nichols +* Copyright (C) 2018 Ruben Rodriguez <ruben@gnu.org> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +const makeDebugLogger = (origin, enabled, time) => { + return (a, b) => { + if (enabled) { + console.log('[' + origin + '] Time spent so far: ' + (Date.now() - time) / 1000 + ' seconds'); + if (b === undefined) { + console.log(a); + } else { + console.log(a, b); + } + } + } +} + +module.exports = { makeDebugLogger }; + +},{}],9:[function(require,module,exports){ +module.exports={ + "fname_data": { + "WebGLShader": true, + "WebGLShaderPrecisionFormat": true, + "WebGLQuery": true, + "WebGLRenderbuffer": true, + "WebGLSampler": true, + "WebGLUniformLocation": true, + "WebGLFramebuffer": true, + "WebGLProgram": true, + "WebGLContextEvent": true, + "WebGL2RenderingContext": true, + "WebGLTexture": true, + "WebGLRenderingContext": true, + "WebGLVertexArrayObject": true, + "WebGLActiveInfo": true, + "WebGLTransformFeedback": true, + "WebGLSync": true, + "WebGLBuffer": true, + "cat_svg": true, + "SVGPoint": true, + "SVGEllipseElement": true, + "SVGRadialGradientElement": true, + "SVGComponentTransferFunctionElement": true, + "SVGPathSegCurvetoQuadraticAbs": true, + "SVGAnimatedNumberList": true, + "SVGPathSegCurvetoQuadraticSmoothRel": true, + "SVGFEColorMatrixElement": true, + "SVGPathSegLinetoHorizontalAbs": true, + "SVGLinearGradientElement": true, + "SVGStyleElement": true, + "SVGPathSegMovetoRel": true, + "SVGStopElement": true, + "SVGPathSegLinetoRel": true, + "SVGFEConvolveMatrixElement": true, + "SVGAnimatedAngle": true, + "SVGPathSegLinetoAbs": true, + "SVGPreserveAspectRatio": true, + "SVGFEOffsetElement": true, + "SVGFEImageElement": true, + "SVGFEDiffuseLightingElement": true, + "SVGAnimatedNumber": true, + "SVGTextElement": true, + "SVGFESpotLightElement": true, + "SVGFEMorphologyElement": true, + "SVGAngle": true, + "SVGScriptElement": true, + "SVGFEDropShadowElement": true, + "SVGPathSegArcRel": true, + "SVGNumber": true, + "SVGPathSegLinetoHorizontalRel": true, + "SVGFEFuncBElement": true, + "SVGClipPathElement": true, + "SVGPathSeg": true, + "SVGUseElement": true, + "SVGPathSegArcAbs": true, + "SVGPathSegCurvetoQuadraticSmoothAbs": true, + "SVGRect": true, + "SVGAnimatedPreserveAspectRatio": true, + "SVGImageElement": true, + "SVGAnimatedEnumeration": true, + "SVGAnimatedLengthList": true, + "SVGFEFloodElement": true, + "SVGFECompositeElement": true, + "SVGAElement": true, + "SVGAnimatedBoolean": true, + "SVGMaskElement": true, + "SVGFilterElement": true, + "SVGPathSegLinetoVerticalRel": true, + "SVGAnimatedInteger": true, + "SVGTSpanElement": true, + "SVGMarkerElement": true, + "SVGStringList": true, + "SVGTransform": true, + "SVGTitleElement": true, + "SVGFEBlendElement": true, + "SVGTextPositioningElement": true, + "SVGFEFuncGElement": true, + "SVGFEPointLightElement": true, + "SVGAnimateElement": true, + "SVGPolylineElement": true, + "SVGDefsElement": true, + "SVGPathSegList": true, + "SVGAnimatedTransformList": true, + "SVGPathSegClosePath": true, + "SVGGradientElement": true, + "SVGSwitchElement": true, + "SVGViewElement": true, + "SVGUnitTypes": true, + "SVGPathSegMovetoAbs": true, + "SVGSymbolElement": true, + "SVGFEFuncAElement": true, + "SVGAnimatedString": true, + "SVGFEMergeElement": true, + "SVGPathSegLinetoVerticalAbs": true, + "SVGAnimationElement": true, + "SVGPathSegCurvetoCubicAbs": true, + "SVGLength": true, + "SVGTextPathElement": true, + "SVGPolygonElement": true, + "SVGAnimatedRect": true, + "SVGPathSegCurvetoCubicRel": true, + "SVGFEFuncRElement": true, + "SVGLengthList": true, + "SVGTextContentElement": true, + "SVGFETurbulenceElement": true, + "SVGMatrix": true, + "SVGZoomAndPan": true, + "SVGMetadataElement": true, + "SVGFEDistantLightElement": true, + "SVGAnimateMotionElement": true, + "SVGDescElement": true, + "SVGPathSegCurvetoCubicSmoothRel": true, + "SVGFESpecularLightingElement": true, + "SVGFEGaussianBlurElement": true, + "SVGFEComponentTransferElement": true, + "SVGNumberList": true, + "SVGTransformList": true, + "SVGForeignObjectElement": true, + "SVGRectElement": true, + "SVGFEDisplacementMapElement": true, + "SVGAnimateTransformElement": true, + "SVGAnimatedLength": true, + "SVGPointList": true, + "SVGPatternElement": true, + "SVGPathSegCurvetoCubicSmoothAbs": true, + "SVGCircleElement": true, + "SVGSetElement": true, + "SVGFETileElement": true, + "SVGMPathElement": true, + "SVGFEMergeNodeElement": true, + "SVGPathSegCurvetoQuadraticRel": true, + "SVGElement": true, + "SVGGraphicsElement": true, + "SVGSVGElement": true, + "SVGGElement": true, + "SVGGeometryElement": true, + "SVGPathElement": true, + "SVGLineElement": true, + "cat_html": true, + "HTMLTimeElement": true, + "HTMLPictureElement": true, + "HTMLMenuItemElement": true, + "HTMLFormElement": true, + "HTMLOptionElement": true, + "HTMLCanvasElement": true, + "HTMLTableSectionElement": true, + "HTMLSelectElement": true, + "HTMLUListElement": true, + "HTMLMetaElement": true, + "HTMLLinkElement": true, + "HTMLBaseElement": true, + "HTMLDataListElement": true, + "HTMLInputElement": true, + "HTMLMeterElement": true, + "HTMLSourceElement": true, + "HTMLTrackElement": true, + "HTMLTableColElement": true, + "HTMLFieldSetElement": true, + "HTMLDirectoryElement": true, + "HTMLTableCellElement": true, + "HTMLStyleElement": true, + "HTMLAudioElement": true, + "HTMLLegendElement": true, + "HTMLOListElement": true, + "HTMLEmbedElement": true, + "HTMLQuoteElement": true, + "HTMLMenuElement": true, + "HTMLHeadElement": true, + "HTMLUnknownElement": true, + "HTMLBRElement": true, + "HTMLProgressElement": true, + "HTMLMediaElement": true, + "HTMLFormControlsCollection": true, + "HTMLCollection": true, + "HTMLLIElement": true, + "HTMLDetailsElement": true, + "HTMLObjectElement": true, + "HTMLHeadingElement": true, + "HTMLTableCaptionElement": true, + "HTMLPreElement": true, + "HTMLAllCollection": true, + "HTMLFrameSetElement": true, + "HTMLFontElement": true, + "HTMLFrameElement": true, + "HTMLAnchorElement": true, + "HTMLOptGroupElement": true, + "HTMLVideoElement": true, + "HTMLModElement": true, + "HTMLBodyElement": true, + "HTMLTableElement": true, + "HTMLButtonElement": true, + "HTMLTableRowElement": true, + "HTMLAreaElement": true, + "HTMLDataElement": true, + "HTMLParamElement": true, + "HTMLLabelElement": true, + "HTMLTemplateElement": true, + "HTMLOptionsCollection": true, + "HTMLIFrameElement": true, + "HTMLTitleElement": true, + "HTMLMapElement": true, + "HTMLOutputElement": true, + "HTMLDListElement": true, + "HTMLParagraphElement": true, + "HTMLHRElement": true, + "HTMLImageElement": true, + "HTMLDocument": true, + "HTMLElement": true, + "HTMLScriptElement": true, + "HTMLHtmlElement": true, + "HTMLTextAreaElement": true, + "HTMLDivElement": true, + "HTMLSpanElement": true, + "cat_css": true, + "CSSStyleRule": true, + "CSSFontFaceRule": true, + "CSSPrimitiveValue": true, + "CSSStyleDeclaration": true, + "CSSStyleSheet": true, + "CSSPageRule": true, + "CSSSupportsRule": true, + "CSSMozDocumentRule": true, + "CSSKeyframeRule": true, + "CSSGroupingRule": true, + "CSS2Properties": true, + "CSSFontFeatureValuesRule": true, + "CSSRuleList": true, + "CSSPseudoElement": true, + "CSSMediaRule": true, + "CSSCounterStyleRule": true, + "CSSImportRule": true, + "CSSTransition": true, + "CSSAnimation": true, + "CSSValue": true, + "CSSNamespaceRule": true, + "CSSRule": true, + "CSS": true, + "CSSKeyframesRule": true, + "CSSConditionRule": true, + "CSSValueList": true, + "cat_event": true, + "ondevicemotion": true, + "ondeviceorientation": true, + "onabsolutedeviceorientation": true, + "ondeviceproximity": true, + "onuserproximity": true, + "ondevicelight": true, + "onvrdisplayconnect": true, + "onvrdisplaydisconnect": true, + "onvrdisplayactivate": true, + "onvrdisplaydeactivate": true, + "onvrdisplaypresentchange": true, + "onabort": true, + "onblur": true, + "onfocus": true, + "onauxclick": true, + "oncanplay": true, + "oncanplaythrough": true, + "onchange": true, + "onclick": true, + "onclose": true, + "oncontextmenu": true, + "ondblclick": true, + "ondrag": true, + "ondragend": true, + "ondragenter": true, + "ondragexit": true, + "ondragleave": true, + "ondragover": true, + "ondragstart": true, + "ondrop": true, + "ondurationchange": true, + "onemptied": true, + "onended": true, + "oninput": true, + "oninvalid": true, + "onkeydown": true, + "onkeypress": true, + "onkeyup": true, + "onload": true, + "onloadeddata": true, + "onloadedmetadata": true, + "onloadend": true, + "onloadstart": true, + "onmousedown": true, + "onmouseenter": true, + "onmouseleave": true, + "onmousemove": true, + "onmouseout": true, + "onmouseover": true, + "onmouseup": true, + "onwheel": true, + "onpause": true, + "onplay": true, + "onplaying": true, + "onprogress": true, + "onratechange": true, + "onreset": true, + "onresize": true, + "onscroll": true, + "onseeked": true, + "onseeking": true, + "onselect": true, + "onshow": true, + "onstalled": true, + "onsubmit": true, + "onsuspend": true, + "ontimeupdate": true, + "onvolumechange": true, + "onwaiting": true, + "onselectstart": true, + "ontoggle": true, + "onpointercancel": true, + "onpointerdown": true, + "onpointerup": true, + "onpointermove": true, + "onpointerout": true, + "onpointerover": true, + "onpointerenter": true, + "onpointerleave": true, + "ongotpointercapture": true, + "onlostpointercapture": true, + "onmozfullscreenchange": true, + "onmozfullscreenerror": true, + "onanimationcancel": true, + "onanimationend": true, + "onanimationiteration": true, + "onanimationstart": true, + "ontransitioncancel": true, + "ontransitionend": true, + "ontransitionrun": true, + "ontransitionstart": true, + "onwebkitanimationend": true, + "onwebkitanimationiteration": true, + "onwebkitanimationstart": true, + "onwebkittransitionend": true, + "onerror": false, + "onafterprint": true, + "onbeforeprint": true, + "onbeforeunload": true, + "onhashchange": true, + "onlanguagechange": true, + "onmessage": true, + "onmessageerror": true, + "onoffline": true, + "ononline": true, + "onpagehide": true, + "onpageshow": true, + "onpopstate": true, + "onstorage": true, + "onunload": true, + "cat_rtc": true, + "RTCDTMFSender": true, + "RTCStatsReport": true, + "RTCTrackEvent": true, + "RTCDataChannelEvent": true, + "RTCPeerConnectionIceEvent": true, + "RTCCertificate": true, + "RTCDTMFToneChangeEvent": true, + "RTCPeerConnection": true, + "RTCIceCandidate": true, + "RTCRtpReceiver": true, + "RTCRtpSender": true, + "RTCSessionDescription": true, + "cat_vr": true, + "VRStageParameters": true, + "VRFrameData": true, + "VRDisplay": true, + "VRDisplayEvent": true, + "VRFieldOfView": true, + "VRDisplayCapabilities": true, + "VREyeParameters": true, + "VRPose": true, + "cat_dom": true, + "DOMStringMap": true, + "DOMRectReadOnly": true, + "DOMException": true, + "DOMRect": true, + "DOMMatrix": true, + "DOMMatrixReadOnly": true, + "DOMPointReadOnly": true, + "DOMPoint": true, + "DOMQuad": true, + "DOMRequest": true, + "DOMParser": true, + "DOMTokenList": true, + "DOMStringList": true, + "DOMImplementation": true, + "DOMError": true, + "DOMRectList": true, + "DOMCursor": true, + "cat_idb": true, + "IDBFileRequest": true, + "IDBTransaction": true, + "IDBCursor": true, + "IDBFileHandle": true, + "IDBMutableFile": true, + "IDBKeyRange": true, + "IDBVersionChangeEvent": true, + "IDBObjectStore": true, + "IDBFactory": true, + "IDBCursorWithValue": true, + "IDBOpenDBRequest": true, + "IDBRequest": true, + "IDBIndex": true, + "IDBDatabase": true, + "cat_audio": true, + "AudioContext": true, + "AudioBuffer": true, + "AudioBufferSourceNode": true, + "Audio": true, + "MediaElementAudioSourceNode": true, + "AudioNode": true, + "BaseAudioContext": true, + "AudioListener": true, + "MediaStreamAudioSourceNode": true, + "OfflineAudioContext": true, + "AudioDestinationNode": true, + "AudioParam": true, + "MediaStreamAudioDestinationNode": true, + "OfflineAudioCompletionEvent": true, + "AudioStreamTrack": true, + "AudioScheduledSourceNode": true, + "AudioProcessingEvent": true, + "cat_gamepad": true, + "GamepadButton": true, + "GamepadHapticActuator": true, + "GamepadAxisMoveEvent": true, + "GamepadPose": true, + "GamepadEvent": true, + "Gamepad": true, + "GamepadButtonEvent": true, + "cat_media": true, + "MediaKeys": true, + "MediaKeyError": true, + "MediaSource": true, + "MediaDevices": true, + "MediaKeyStatusMap": true, + "MediaStreamTrackEvent": true, + "MediaRecorder": true, + "MediaQueryListEvent": true, + "MediaStream": true, + "MediaEncryptedEvent": true, + "MediaStreamTrack": true, + "MediaError": true, + "MediaStreamEvent": true, + "MediaQueryList": true, + "MediaKeySystemAccess": true, + "MediaDeviceInfo": true, + "MediaKeySession": true, + "MediaList": true, + "MediaRecorderErrorEvent": true, + "MediaKeyMessageEvent": true, + "cat_event2": true, + "SpeechSynthesisErrorEvent": true, + "BeforeUnloadEvent": true, + "CustomEvent": true, + "PageTransitionEvent": true, + "PopupBlockedEvent": true, + "CloseEvent": true, + "ProgressEvent": true, + "MutationEvent": true, + "MessageEvent": true, + "FocusEvent": true, + "TrackEvent": true, + "DeviceMotionEvent": true, + "TimeEvent": true, + "PointerEvent": true, + "UserProximityEvent": true, + "StorageEvent": true, + "DragEvent": true, + "MouseScrollEvent": true, + "EventSource": true, + "PopStateEvent": true, + "DeviceProximityEvent": true, + "SpeechSynthesisEvent": true, + "XMLHttpRequestEventTarget": true, + "ClipboardEvent": true, + "AnimationPlaybackEvent": true, + "DeviceLightEvent": true, + "BlobEvent": true, + "MouseEvent": true, + "WheelEvent": true, + "InputEvent": true, + "HashChangeEvent": true, + "DeviceOrientationEvent": true, + "CompositionEvent": true, + "KeyEvent": true, + "ScrollAreaEvent": true, + "KeyboardEvent": true, + "TransitionEvent": true, + "ErrorEvent": true, + "AnimationEvent": true, + "FontFaceSetLoadEvent": true, + "EventTarget": true, + "captureEvents": true, + "releaseEvents": true, + "Event": true, + "UIEvent": true, + "cat_other": false, + "undefined": false, + "Array": false, + "Boolean": false, + "JSON": false, + "Date": false, + "Math": false, + "Number": false, + "String": false, + "RegExp": false, + "Error": false, + "InternalError": false, + "EvalError": false, + "RangeError": false, + "ReferenceError": false, + "SyntaxError": false, + "TypeError": false, + "URIError": false, + "ArrayBuffer": true, + "Int8Array": true, + "Uint8Array": true, + "Int16Array": true, + "Uint16Array": true, + "Int32Array": true, + "Uint32Array": true, + "Float32Array": true, + "Float64Array": true, + "Uint8ClampedArray": true, + "Proxy": true, + "WeakMap": true, + "Map": true, + "Set": true, + "DataView": false, + "Symbol": false, + "SharedArrayBuffer": true, + "Intl": false, + "TypedObject": true, + "Reflect": true, + "SIMD": true, + "WeakSet": true, + "Atomics": true, + "Promise": true, + "WebAssembly": true, + "NaN": false, + "Infinity": false, + "isNaN": false, + "isFinite": false, + "parseFloat": false, + "parseInt": false, + "escape": false, + "unescape": false, + "decodeURI": false, + "encodeURI": false, + "decodeURIComponent": false, + "encodeURIComponent": false, + "uneval": false, + "BatteryManager": true, + "CanvasGradient": true, + "TextDecoder": true, + "Plugin": true, + "PushManager": true, + "ChannelMergerNode": true, + "PerformanceResourceTiming": true, + "ServiceWorker": true, + "TextTrackCueList": true, + "PerformanceEntry": true, + "TextTrackList": true, + "StyleSheet": true, + "PerformanceMeasure": true, + "DesktopNotificationCenter": true, + "Comment": true, + "DelayNode": true, + "XPathResult": true, + "CDATASection": true, + "MessageChannel": true, + "BiquadFilterNode": true, + "SpeechSynthesisUtterance": true, + "Crypto": true, + "Navigator": true, + "FileList": true, + "URLSearchParams": false, + "ServiceWorkerContainer": true, + "ValidityState": true, + "ProcessingInstruction": true, + "AbortSignal": true, + "FontFace": true, + "FileReader": true, + "Worker": true, + "External": true, + "ImageBitmap": true, + "TimeRanges": true, + "Option": true, + "TextTrack": true, + "Image": true, + "AnimationTimeline": true, + "VideoPlaybackQuality": true, + "VTTCue": true, + "Storage": true, + "XPathExpression": true, + "CharacterData": false, + "TextMetrics": true, + "AnimationEffectReadOnly": true, + "PerformanceTiming": false, + "PerformanceMark": true, + "ImageBitmapRenderingContext": true, + "Headers": true, + "Range": false, + "Rect": true, + "AnimationEffectTimingReadOnly": true, + "KeyframeEffect": true, + "Permissions": true, + "TextEncoder": true, + "ImageData": true, + "SpeechSynthesisVoice": true, + "StorageManager": true, + "TextTrackCue": true, + "WebSocket": true, + "DocumentType": true, + "XPathEvaluator": true, + "PerformanceNavigationTiming": true, + "IdleDeadline": true, + "FileSystem": true, + "FileSystemFileEntry": true, + "CacheStorage": true, + "MimeType": true, + "PannerNode": true, + "NodeFilter": true, + "StereoPannerNode": true, + "console": false, + "DynamicsCompressorNode": true, + "PaintRequest": true, + "RGBColor": true, + "FontFaceSet": false, + "PaintRequestList": true, + "FileSystemEntry": true, + "XMLDocument": false, + "SourceBuffer": false, + "Screen": true, + "NamedNodeMap": false, + "History": true, + "Response": true, + "AnimationEffectTiming": true, + "ServiceWorkerRegistration": true, + "CanvasRenderingContext2D": true, + "ScriptProcessorNode": true, + "FileSystemDirectoryReader": true, + "MimeTypeArray": true, + "CanvasCaptureMediaStream": true, + "Directory": true, + "mozRTCPeerConnection": true, + "PerformanceObserverEntryList": true, + "PushSubscriptionOptions": true, + "Text": false, + "IntersectionObserverEntry": true, + "SubtleCrypto": true, + "Animation": true, + "DataTransfer": true, + "TreeWalker": true, + "XMLHttpRequest": true, + "LocalMediaStream": true, + "ConvolverNode": true, + "WaveShaperNode": true, + "DataTransferItemList": false, + "Request": true, + "SourceBufferList": false, + "XSLTProcessor": true, + "XMLHttpRequestUpload": true, + "SharedWorker": true, + "Notification": false, + "DataTransferItem": true, + "AnalyserNode": true, + "mozRTCIceCandidate": true, + "PerformanceObserver": true, + "OfflineResourceList": true, + "FileSystemDirectoryEntry": true, + "DesktopNotification": false, + "DataChannel": true, + "IIRFilterNode": true, + "ChannelSplitterNode": true, + "File": true, + "ConstantSourceNode": true, + "CryptoKey": true, + "GainNode": true, + "AbortController": true, + "Attr": true, + "SpeechSynthesis": true, + "PushSubscription": false, + "XMLStylesheetProcessingInstruction": false, + "NodeIterator": true, + "VideoStreamTrack": true, + "XMLSerializer": true, + "CaretPosition": true, + "FormData": true, + "CanvasPattern": true, + "mozRTCSessionDescription": true, + "Path2D": true, + "PerformanceNavigation": true, + "URL": false, + "PluginArray": true, + "MutationRecord": true, + "WebKitCSSMatrix": true, + "PeriodicWave": true, + "DocumentFragment": true, + "DocumentTimeline": false, + "ScreenOrientation": true, + "BroadcastChannel": true, + "PermissionStatus": true, + "IntersectionObserver": true, + "Blob": true, + "MessagePort": true, + "BarProp": true, + "OscillatorNode": true, + "Cache": true, + "RadioNodeList": true, + "KeyframeEffectReadOnly": true, + "InstallTrigger": true, + "Function": true, + "Object": false, + "eval": true, + "Window": false, + "close": false, + "stop": false, + "focus": false, + "blur": false, + "open": true, + "alert": false, + "confirm": false, + "prompt": false, + "print": false, + "postMessage": true, + "getSelection": true, + "getComputedStyle": true, + "matchMedia": true, + "moveTo": false, + "moveBy": false, + "resizeTo": false, + "resizeBy": false, + "scroll": false, + "scrollTo": false, + "scrollBy": false, + "requestAnimationFrame": true, + "cancelAnimationFrame": true, + "getDefaultComputedStyle": false, + "scrollByLines": false, + "scrollByPages": false, + "sizeToContent": false, + "updateCommands": true, + "find": false, + "dump": true, + "setResizable": false, + "requestIdleCallback": false, + "cancelIdleCallback": false, + "btoa": true, + "atob": true, + "setTimeout": true, + "clearTimeout": true, + "setInterval": true, + "clearInterval": true, + "createImageBitmap": true, + "fetch": true, + "self": true, + "name": false, + "history": true, + "locationbar": true, + "menubar": true, + "personalbar": true, + "scrollbars": true, + "statusbar": true, + "toolbar": true, + "status": true, + "closed": true, + "frames": true, + "length": false, + "opener": true, + "parent": true, + "frameElement": true, + "navigator": true, + "external": true, + "applicationCache": true, + "screen": true, + "innerWidth": true, + "innerHeight": true, + "scrollX": true, + "pageXOffset": true, + "scrollY": true, + "pageYOffset": true, + "screenX": true, + "screenY": true, + "outerWidth": true, + "outerHeight": true, + "performance": true, + "mozInnerScreenX": true, + "mozInnerScreenY": true, + "devicePixelRatio": true, + "scrollMaxX": true, + "scrollMaxY": true, + "fullScreen": false, + "mozPaintCount": true, + "sidebar": false, + "crypto": true, + "speechSynthesis": true, + "localStorage": true, + "origin": true, + "isSecureContext": false, + "indexedDB": true, + "caches": true, + "sessionStorage": true, + "window": false, + "document": true, + "location": false, + "top": false, + "netscape": true, + "Node": true, + "Document": true, + "Performance": false, + "startProfiling": true, + "stopProfiling": true, + "pauseProfilers": true, + "resumeProfilers": true, + "dumpProfile": true, + "getMaxGCPauseSinceClear": true, + "clearMaxGCPauseAccumulator": true, + "Location": true, + "StyleSheetList": false, + "Selection": false, + "Element": true, + "AnonymousContent": false, + "MutationObserver": true, + "NodeList": true, + "StopIteration": true + } +} + +},{}],10:[function(require,module,exports){ +module.exports={ + "AGPL-3.0": { + "licenseName": "GNU AFFERO GENERAL PUBLIC LICENSE version 3", + "identifier": "AGPL-3.0", + "canonicalUrl": [ + "http://www.gnu.org/licenses/agpl-3.0.html", + "magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt" + ], + "licenseFragments": [ + { + "text": "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", + "type": "short" + } + ] + }, + "Apache-2.0": { + "licenseName": "Apache License, Version 2.0", + "identifier": "Apache-2.0", + "canonicalUrl": [ + "http://www.apache.org/licenses/LICENSE-2.0", + "magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt" + ], + "licenseFragments": [ + { + "text": "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0", + "type": "short" + } + ] + }, + "Artistic-2.0": { + "licenseName": "Artistic License 2.0", + "identifier": "Artistic-2.0", + "canonicalUrl": [ + "http://www.perlfoundation.org/artistic_license_2_0", + "magnet:?xt=urn:btih:54fd2283f9dbdf29466d2df1a98bf8f65cafe314&dn=artistic-2.0.txt" + ], + "licenseFragments": [] + }, + "BSD-2-Clause": { + "licenseName": "BSD 2-Clause License", + "identifier": "BSD-2-Clause", + "canonicalUrl": [ + "http://www.freebsd.org/copyright/freebsd-license.html", + "magnet:?xt=urn:btih:87f119ba0b429ba17a44b4bffcab33165ebdacc0&dn=freebsd.txt" + ], + "licenseFragments": [ + { + "text": "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.", + "type": "short" + } + ] + }, + "BSD-3-Clause": { + "licenseName": "BSD 3-Clause License", + "identifier": "BSD-3-Clause", + "canonicalUrl": [ + "http://opensource.org/licenses/BSD-3-Clause", + "magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt" + ], + "licenseFragments": [ + { + "text": "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.", + "type": "short" + } + ] + }, + "BSL-1.0": { + "licenseName": "Boost Software License 1.0", + "identifier": "BSL-1.0", + "canonicalUrl": [ + "http://www.boost.org/LICENSE_1_0.txt", + "magnet:?xt=urn:btih:89a97c535628232f2f3888c2b7b8ffd4c078cec0&dn=Boost-1.0.txt" + ], + "licenseFragments": [ + { + "text": "Boost Software License <VERSION> <DATE> Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the \"Software\") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following", + "type": "short" + } + ] + }, + "CC-BY-1.0": { + "licenseName": "Creative Commons Attribution 1.0 Generic", + "identifier": "CC-BY-1.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/1.0/" + ], + "licenseFragments": [] + }, + "CC-BY-2.0": { + "licenseName": "Creative Commons Attribution 2.0 Generic", + "identifier": "CC-BY-2.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/2.0/" + ], + "licenseFragments": [] + }, + "CC-BY-2.5": { + "licenseName": "Creative Commons Attribution 2.5 Generic", + "identifier": "CC-BY-2.5", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/2.5/" + ], + "licenseFragments": [] + }, + "CC-BY-3.0": { + "licenseName": "Creative Commons Attribution 3.0 Unported", + "identifier": "CC-BY-3.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/3.0/" + ], + "licenseFragments": [] + }, + "CC-BY-4.0": { + "licenseName": "Creative Commons Attribution 4.0 International", + "identifier": "CC-BY-4.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/4.0/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-1.0": { + "licenseName": "Creative Commons Attribution-ShareAlike 1.0 Generic", + "identifier": "CC-BY-SA-1.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/1.0/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-2.0": { + "licenseName": "Creative Commons Attribution-ShareAlike 2.0 Generic", + "identifier": "CC-BY-SA-2.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/2.0/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-2.5": { + "licenseName": "Creative Commons Attribution-ShareAlike 2.5 Generic", + "identifier": "CC-BY-SA-2.5", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/2.5/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-3.0": { + "licenseName": "Creative Commons Attribution-ShareAlike 3.0 Unported", + "identifier": "CC-BY-SA-3.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/3.0/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-4.0": { + "licenseName": "Creative Commons Attribution-ShareAlike 4.0 International", + "identifier": "CC-BY-SA-4.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/4.0/" + ], + "licenseFragments": [] + }, + "CC0-1.0": { + "licenseName": "Creative Commons CC0 1.0 Universal", + "identifier": "CC0-1.0", + "canonicalUrl": [ + "http://creativecommons.org/publicdomain/zero/1.0/legalcode", + "magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt" + ], + "licenseFragments": [] + }, + "CECILL-2.0": { + "licenseName": "CeCILL Free Software License Agreement v2.0", + "identifier": "CECILL-2.0", + "canonicalUrl": [ + "https://www.cecill.info/licences/Licence_CeCILL_V2-en.txt", + "magnet:?xt=urn:btih:dda0473d240d7febeac8fa265da27286ead0b1ce&dn=cecill-2.0.txt" + ], + "licenseFragments": [] + }, + "CPAL-1.0": { + "licenseName": "Common Public Attribution License Version 1.0 (CPAL)", + "identifier": "CPAL-1.0", + "canonicalUrl": [ + "http://opensource.org/licenses/cpal_1.0", + "magnet:?xt=urn:btih:84143bc45939fc8fa42921d619a95462c2031c5c&dn=cpal-1.0.txt" + ], + "licenseFragments": [ + { + "text": "The contents of this file are subject to the Common Public Attribution License Version 1.0", + "type": "short" + }, + { + "text": "The term \"External Deployment\" means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2.", + "type": "short" + } + ] + }, + "EPL-1.0": { + "licenseName": "Eclipse Public License Version 1.0", + "identifier": "EPL-1.0", + "canonicalUrl": [ + "http://www.eclipse.org/legal/epl-v10.html", + "magnet:?xt=urn:btih:4c6a2ad0018cd461e9b0fc44e1b340d2c1828b22&dn=epl-1.0.txt" + ], + "licenseFragments": [ + { + "text": "THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.", + "type": "short" + } + ] + }, + "Expat": { + "licenseName": "Expat License (sometimes called MIT Licensed)", + "identifier": "Expat", + "canonicalUrl": [ + "http://www.jclark.com/xml/copying.txt", + "magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt" + ], + "licenseFragments": [ + { + "text": "Copyright <YEAR> <NAME> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "type": "short" + } + ] + }, + "FreeBSD": { + "licenseName": "FreeBSD License", + "identifier": "FreeBSD", + "canonicalUrl": [ + "http://www.freebsd.org/copyright/freebsd-license.html", + "magnet:?xt=urn:btih:87f119ba0b429ba17a44b4bffcab33165ebdacc0&dn=freebsd.txt" + ], + "licenseFragments": [ + { + "text": "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.", + "type": "short" + } + ] + }, + "GNU-All-Permissive": { + "licenseName": "GNU All-Permissive License", + "identifier": "GNU-All-Permissive", + "canonicalUrl": [], + "licenseFragments": [ + { + "text": "Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty.", + "type": "short" + } + ] + }, + "GPL-2.0": { + "licenseName": "GNU General Public License (GPL) version 2", + "identifier": "GPL-2.0", + "canonicalUrl": [ + "http://www.gnu.org/licenses/gpl-2.0.html", + "magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt" + ], + "licenseFragments": [ + { + "text": "<THISPROGRAM> is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.", + "type": "short" + }, + { + "text": "Alternatively, the contents of this file may be used under the terms of either the GNU General Public License Version 2 or later (the \"GPL\"), or the GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"), in which case the provisions of the GPL or the LGPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of either the GPL or the LGPL, and not to allow others to use your version of this file under the terms of the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL or the LGPL. If you do not delete the provisions above, a recipient may use your version of this file under the terms of any one of the MPL, the GPL or the LGPL.", + "type": "short" + } + ] + }, + "GPL-3.0": { + "licenseName": "GNU General Public License (GPL) version 3", + "identifier": "GPL-3.0", + "canonicalUrl": [ + "http://www.gnu.org/licenses/gpl-3.0.html", + "magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt" + ], + "licenseFragments": [ + { + "text": "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License (GNU GPL) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The code is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. As additional permission under GNU GPL version 3 section 7, you may distribute non-source (e.g., minimized or compacted) forms of that code without the copy of the GNU GPL normally required by section 4, provided you include this license notice and a URL through which recipients can access the Corresponding Source.", + "type": "short" + }, + { + "text": "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", + "type": "short" + } + ] + }, + "ISC": { + "licenseName": "The ISC License", + "identifier": "ISC", + "canonicalUrl": [ + "https://www.isc.org/downloads/software-support-policy/isc-license/", + "magnet:?xt=urn:btih:b8999bbaf509c08d127678643c515b9ab0836bae&dn=ISC.txt" + ], + "licenseFragments": [ + { + "text": "Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", + "type": "short" + }, + { + "text": "Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", + "type": "short" + } + ] + }, + "jQueryTools": { + "licenseName": "jQuery Tools", + "identifier": "jQueryTools", + "canonicalUrl": [], + "licenseFragments": [ + { + "text": "NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.", + "type": "short" + } + ] + }, + "LGPL-2.1": { + "licenseName": "GNU Lesser General Public License, version 2.1", + "identifier": "LGPL-2.1", + "canonicalUrl": [ + "http://www.gnu.org/licenses/lgpl-2.1.html", + "magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt" + ], + "licenseFragments": [ + { + "text": "<THISLIBRARY> is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.", + "type": "short" + } + ] + }, + "LGPL-3.0": { + "licenseName": "GNU Lesser General Public License, version 3", + "identifier": "LGPL-3.0", + "canonicalUrl": [ + "http://www.gnu.org/licenses/lgpl-3.0.html", + "magnet:?xt=urn:btih:0ef1b8170b3b615170ff270def6427c317705f85&dn=lgpl-3.0.txt" + ], + "licenseFragments": [ + { + "text": "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", + "type": "short" + } + ] + }, + "MPL-2.0": { + "licenseName": "Mozilla Public License Version 2.0", + "identifier": "MPL-2.0", + "canonicalUrl": [ + "http://www.mozilla.org/MPL/2.0", + "magnet:?xt=urn:btih:3877d6d54b3accd4bc32f8a48bf32ebc0901502a&dn=mpl-2.0.txt" + ], + "licenseFragments": [ + { + "text": "This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.", + "type": "short" + } + ] + }, + "PublicDomain": { + "licenseName": "Public Domain", + "identifier": "PublicDomain", + "canonicalUrl": [ + "magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt" + ], + "licenseFragments": [] + }, + "Unlicense": { + "licenseName": "Unlicense", + "identifier": "Unlicense", + "canonicalUrl": [ + "http://unlicense.org/UNLICENSE", + "magnet:?xt=urn:btih:5ac446d35272cc2e4e85e4325b146d0b7ca8f50c&dn=unlicense.txt" + ], + "licenseFragments": [ + { + "text": "This is free and unencumbered software released into the public domain.", + "type": "short" + } + ] + }, + "UPL": { + "licenseName": "Universal Permissive License", + "identifier": "UPL-1.0", + "canonicalUrl": [ + "https://oss.oracle.com/licenses/upl/", + "magnet:?xt=urn:btih:478974f4d41c3fa84c4befba25f283527fad107d&dn=upl-1.0.txt" + ], + "licenseFragments": [ + { + "text": "The Universal Permissive License (UPL), Version 1.0", + "type": "short" + } + ] + }, + "WTFPL": { + "licenseName": "Do What The F*ck You Want To Public License (WTFPL)", + "identifier": "WTFPL", + "canonicalUrl": [ + "http://www.wtfpl.net/txt/copying/", + "magnet:?xt=urn:btih:723febf9f6185544f57f0660a41489c7d6b4931b&dn=wtfpl.txt" + ], + "licenseFragments": [ + { + "text": "DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE", + "type": "short" + }, + { + "text": "0. You just DO WHAT THE FUCK YOU WANT TO.", + "type": "short" + } + ] + }, + "X11": { + "licenseName": "X11 License", + "identifier": "X11", + "canonicalUrl": [ + "magnet:?xt=urn:btih:5305d91886084f776adcf57509a648432709a7c7&dn=x11.txt" + ], + "licenseFragments": [ + { + "text": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "type": "short" + } + ] + }, + "XFree86-1.1": { + "licenseName": "XFree86 1.1 License", + "identifier": "XFree86-1.1", + "canonicalUrl": [ + "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3", + "http://www.xfree86.org/current/LICENSE4.html", + "magnet:?xt=urn:btih:12f2ec9e8de2a3b0002a33d518d6010cc8ab2ae9&dn=xfree86.txt" + ], + "licenseFragments": [ + { + "text": "All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution, and in the same place and form as other copyright, license and disclaimer information.\n3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: \"This product includes software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and its contributors\", in the same place and form as other third-party acknowledgments. Alternately, this acknowledgment may appear in the software itself, in the same form and location as other such third-party acknowledgments.4. Except as contained in this notice, the name of The XFree86 Project, Inc shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The XFree86 Project, Inc.", + "type": "short" + } + ] + }, + "Zlib": { + "licenseName": "zlib License", + "canonicalUrl": [ + "https://www.zlib.net/zlib_license.html", + "https://spdx.org/licenses/Zlib.txt", + "magnet:?xt=urn:btih:922bd98043fa3daf4f9417e3e8fec8406b1961a3&dn=zlib.txt" + ], + "identifier": "Zlib", + "licenseFragments": [] + } +} + +},{}],11:[function(require,module,exports){ +/** + * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. + * * + * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros + * Copyright (C) 2014, 2015 Nik Nyby + * Copyright (C) 2022 Yuchen Pei + * + * This file is part of GNU LibreJS. + * + * GNU LibreJS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNU LibreJS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. + */ + +exports.patternUtils = { + /** + * removeNonalpha + * + * Remove all nonalphanumeric values, except for + * < and >, since they are what we use for tokens. + * + */ + removeNonalpha: function(str) { + return str.replace(/[^a-z0-9<>@]+/gi, ''); + }, + + removeWhitespace: function(str) { + return str.replace(/\/\//gmi, '').replace(/\*/gmi, '').replace(/\s+/gmi, ''); + }, + + replaceTokens: function(str) { + return str.replace(/<.*?>/gi, '.*?'); + }, + + removeJsComments: function(str) { + const ml_comments = /\/\*.*?(\*\/)/g; + const il_comments = /\/\/.*/gm; + return str.replace(ml_comments, '').replace(il_comments, ''); + } +}; + +},{}],12:[function(require,module,exports){ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* * +* Copyright (C) 2017, 2018 Nathan Nichols +* Copyright (C) 2018 Ruben Rodriguez <ruben@gnu.org> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +const checkLib = require('./common/checks.js'); +const { ResponseProcessor, BLOCKING_RESPONSES } = require('./bg/ResponseProcessor'); +const { Storage, ListStore, hash } = require('./common/Storage'); +const { ListManager } = require('./bg/ListManager'); +const { ExternalLicenses } = require('./bg/ExternalLicenses'); +const { makeDebugLogger } = require('./common/debug.js'); + +const PRINT_DEBUG = false; +const dbgPrint = makeDebugLogger('main_background.js', PRINT_DEBUG, Date.now()); + +/* +* +* Called when something changes the persistent data of the add-on. +* +* The only things that should need to change this data are: +* a) The "Whitelist this page" button +* b) The options screen +* +* When the actual blocking is implemented, this will need to comminicate +* with its code to update accordingly +* +*/ +function optionsListener(changes, area) { + dbgPrint('Items updated in area' + area + ': '); + dbgPrint(Object.keys(changes).join(',')); +} + +const activeMessagePorts = {}; +const activityReports = {}; + +async function createReport(initializer) { + if (!(initializer && (initializer.url || initializer.tabId))) { + throw new Error('createReport() needs an URL or a tabId at least'); + } + let template = { + 'accepted': [], + 'blocked': [], + 'blacklisted': [], + 'whitelisted': [], + 'unknown': [], + }; + template = Object.assign(template, initializer); + let [url] = (template.url || (await browser.tabs.get(initializer.tabId)).url).split('#'); + template.url = url; + template.site = ListStore.siteItem(url); + template.siteStatus = listManager.getStatus(template.site); + const list = { 'whitelisted': whitelist, 'blacklisted': blacklist }[template.siteStatus]; + if (list) { + template.listedSite = ListManager.siteMatch(template.site, list); + } + return template; +} + +/** +* Executes the "Display this report in new tab" function +* by opening a new tab with whatever HTML is in the popup +* at the moment. +*/ +async function openReportInTab(data) { + const popupURL = await browser.browserAction.getPopup({}); + const tab = await browser.tabs.create({ url: `${popupURL}#fromTab=${data.tabId}` }); + activityReports[tab.id] = await createReport(data); +} + +/** +* Clears local storage (the persistent data) +*/ +function debugDeleteLocal() { + browser.storage.local.clear(); + dbgPrint('Local storage cleared'); +} + +/** +* +* Prints local storage (the persistent data) as well as the temporary popup object +* +*/ +function debugPrintLocal() { + function storageGot(items) { + console.log('%c Local storage: ', 'color: red;'); + for (const i in items) { + console.log('%c ' + i + ' = ' + items[i], 'color: blue;'); + } + } + console.log('%c Variable \'activityReports\': ', 'color: red;'); + console.log(activityReports); + browser.storage.local.get(storageGot); +} + +/** +* +* +* Sends a message to the content script that sets the popup entries for a tab. +* +* var example_blocked_info = { +* "accepted": [["REASON 1","SOURCE 1"],["REASON 2","SOURCE 2"]], +* "blocked": [["REASON 1","SOURCE 1"],["REASON 2","SOURCE 2"]], +* "url": "example.com" +* } +* +* NOTE: This WILL break if you provide inconsistent URLs to it. +* Make sure it will use the right URL when refering to a certain script. +* +*/ +async function updateReport(tabId, oldReport, updateUI = false) { + const { url } = oldReport; + const newReport = await createReport({ url, tabId }); + for (const property of Object.keys(oldReport)) { + const entries = oldReport[property]; + if (!Array.isArray(entries)) continue; + const defValue = property === 'accepted' || property === 'blocked' ? property : 'unknown'; + for (const script of entries) { + const status = listManager.getStatus(script[0], defValue); + if (Array.isArray(newReport[status])) newReport[status].push(script); + } + } + activityReports[tabId] = newReport; + if (browser.sessions) browser.sessions.setTabValue(tabId, url, newReport); + dbgPrint(newReport); + if (updateUI && activeMessagePorts[tabId]) { + dbgPrint(`[TABID: ${tabId}] Sending script blocking report directly to browser action.`); + activeMessagePorts[tabId].postMessage({ show_info: newReport }); + } +} + +/** Updates the report for tab with tabId with action. + * + * This is what you call when a page gets changed to update the info + * box. + * + * Sends a message to the content script that adds a popup entry for + * a tab. + * + * The action argument is an object with two properties: one named of + * "accepted","blocked", "whitelisted", "blacklisted", whose value is + * the array [scriptName, reason], and another named "url". Example: + * action = + * { + * "accepted": ["jquery.js (someHash)", "Whitelisted by user"], + * "url": "https://example.com/js/jquery.js" + * } + * + * Overrides the action type with the white/blacklist status for + * scriptName, if any. Then add the entry if scriptName is not + * already in the entries associated with the action type. + * + * Returns one of "whitelisted", "blacklisted", "blocked", "accepted" + * or "unknown" + * + * NOTE: This WILL break if you provide inconsistent URLs to it. + * Make sure it will use the right URL when refering to a certain + * script. + * + */ +async function addReportEntry(tabId, action) { + + const actionPair = Object.entries(action).find( + ([k, _]) => ['accepted', 'blocked', 'whitelisted', 'blacklisted'].indexOf(k) != -1); + if (!actionPair) { + console.debug('Wrong action', action); + return 'unknown'; + } + const [actionType, actionValue] = actionPair; + const scriptName = actionValue[0]; + + const report = activityReports[tabId] || (activityReports[tabId] = await createReport({ tabId })); + let entryType; + // Update the report if the scriptName is new for the entryType. + try { + entryType = listManager.getStatus(scriptName, actionType); + const entries = report[entryType]; + if (!entries.find(e => e[0] === scriptName)) { + dbgPrint(activityReports); + dbgPrint(activityReports[tabId]); + dbgPrint(entryType); + entries.push(actionValue); + } + } catch (e) { + console.error('action %o, type %s, entryType %s', action, actionType, entryType, e); + entryType = 'unknown'; + } + + // Refresh the main panel script list. + if (activeMessagePorts[tabId]) { + activeMessagePorts[tabId].postMessage({ show_info: report }); + } + + if (browser.sessions) browser.sessions.setTabValue(tabId, report.url, report); + updateBadge(tabId, report); + return entryType; +} + + +function getDomain(url) { + let domain = url.replace('http://', '').replace('https://', '').split(/[/?#]/)[0]; + if (url.indexOf('http://') == 0) { + domain = 'http://' + domain; + } + else if (url.indexOf('https://') == 0) { + domain = 'https://' + domain; + } + domain = domain + '/'; + domain = domain.replace(/ /g, ''); + return domain; +} + +/** + * + * This is the callback where the content scripts of the browser action + * will contact the background script. + * + */ +async function connected(p) { + if (p.name === 'contact_finder') { + // style the contact finder panel + await browser.tabs.insertCSS(p.sender.tab.id, { + file: '/content/dialog.css', + cssOrigin: 'user', + matchAboutBlank: true, + allFrames: true + }); + + // Send a message back with the relevant settings + p.postMessage(await browser.storage.local.get(['pref_subject', 'pref_body'])); + return; + } + p.onMessage.addListener(async function(m) { + let update = false; + let contactFinder = false; + + for (const action of ['whitelist', 'blacklist', 'forget']) { + if (m[action]) { + let [key] = m[action]; + if (m.site) { + key = ListStore.siteItem(m.site); + } else { + key = ListStore.inlineItem(key) || key; + } + await listManager[action](key); + update = true; + } + } + + if (m.report_tab) { + openReportInTab(m.report_tab); + } + // a debug feature + if (m['printlocalstorage'] !== undefined) { + console.log('Print local storage'); + debugPrintLocal(); + } + // invoke_contact_finder + if (m['invoke_contact_finder'] !== undefined) { + contactFinder = true; + await injectContactFinder(); + } + // a debug feature (maybe give the user an option to do this?) + if (m['deletelocalstorage'] !== undefined) { + console.log('Delete local storage'); + debugDeleteLocal(); + } + + const tabs = await browser.tabs.query({ active: true, currentWindow: true }); + + if (contactFinder) { + const tab = tabs.pop(); + dbgPrint(`[TABID:${tab.id}] Injecting contact finder`); + } + if (update || m.update && activityReports[m.tabId]) { + const tabId = 'tabId' in m ? m.tabId : tabs.pop().id; + dbgPrint(`%c updating tab ${tabId}`, 'color: red;'); + activeMessagePorts[tabId] = p; + await updateReport(tabId, activityReports[tabId], true); + } else { + for (const tab of tabs) { + if (activityReports[tab.id]) { + // If we have some data stored here for this tabID, send it + dbgPrint(`[TABID: ${tab.id}] Sending stored data associated with browser action'`); + p.postMessage({ 'show_info': activityReports[tab.id] }); + } else { + // create a new entry + const report = activityReports[tab.id] = await createReport({ 'url': tab.url, tabId: tab.id }); + p.postMessage({ show_info: report }); + dbgPrint(`[TABID: ${tab.id}] No data found, creating a new entry for this window.`); + } + } + } + }); +} + +/** +* Loads the contact finder on the given tab ID. +*/ +async function injectContactFinder(tabId) { + await Promise.all([ + browser.tabs.insertCSS(tabId, { file: '/content/overlay.css', cssOrigin: 'user' }), + browser.tabs.executeScript(tabId, { file: '/content/contactFinder.js' }), + ]); +} + +/** +* The callback for tab closings. +* +* Delete the info we are storing about this tab if there is any. +* +*/ +function deleteRemovedTabInfo(tab_id, _) { + dbgPrint('[TABID:' + tab_id + ']' + 'Deleting stored info about closed tab'); + if (activityReports[tab_id] !== undefined) { + delete activityReports[tab_id]; + } + if (activeMessagePorts[tab_id] !== undefined) { + delete activeMessagePorts[tab_id]; + } + ExternalLicenses.purgeCache(tab_id); +} + +/** +* Called when the tab gets updated / activated +* +* Here we check if new tab's url matches activityReports[tabId].url, and if +* it doesn't we use the session cached value (if any). +* +*/ + +async function onTabUpdated(tabId, _, tab) { + const [url] = tab.url.split('#'); + const report = activityReports[tabId]; + if (!(report && report.url === url)) { + const cache = browser.sessions && + await browser.sessions.getTabValue(tabId, url) || null; + // on session restore tabIds may change + if (cache && cache.tabId !== tabId) cache.tabId = tabId; + updateBadge(tabId, activityReports[tabId] = cache); + } +} + +async function onTabActivated({ tabId }) { + await onTabUpdated(tabId, {}, await browser.tabs.get(tabId)); +} + +/* *********************************************************************************************** */ +// TODO: Test if this script is being loaded from another domain compared to activityReports[tabid]["url"] + +/** + * Checks script and updates the report entry accordingly. + * + * Asynchronous function, returns the final edited script as a string, + * or unedited script if passAccWlist is true and the script is + * accepted or whitelisted. + */ +async function checkScriptAndUpdateReport(scriptSrc, url, tabId, whitelisted, isExternal = false, passAccWlist = false) { + const scriptName = url.split('/').pop(); + if (whitelisted) { + if (tabId !== -1) { + const site = ListManager.siteMatch(url, whitelist); + // Accept without reading script, it was explicitly whitelisted + const reason = site + ? `All ${site} whitelisted by user` + : 'Address whitelisted by user'; + addReportEntry(tabId, { 'whitelisted': [site || url, reason], url }); + } + if (scriptSrc.startsWith('javascript:') || passAccWlist) + return scriptSrc; + else + return `/* LibreJS: script whitelisted by user preference. */\n${scriptSrc}`; + } + + const [accepted, editedSource, reason] = listManager.builtInHashes.has(hash(scriptSrc)) ? [true, scriptSrc, 'Common script known to be free software.'] : checkLib.checkScriptSource(scriptSrc, scriptName, isExternal); + + if (tabId < 0) { + return editedSource; + } + + const domain = getDomain(url); + const report = activityReports[tabId] || (activityReports[tabId] = await createReport({ tabId })); + updateBadge(tabId, report, !accepted); + const actionType = await addReportEntry(tabId, { 'url': domain, [accepted ? 'accepted' : 'blocked']: [url, reason] }); + switch (actionType) { + case 'blacklisted': { + const edited = `/* LibreJS: script ${actionType} by user. */`; + return scriptSrc.startsWith('javascript:') + ? `javascript:void(${encodeURIComponent(edited)})` : edited; + } + case 'whitelisted': + case 'accepted': + { + return (scriptSrc.startsWith('javascript:') || passAccWlist) + ? scriptSrc : `/* LibreJS: script ${actionType} by user. */\n${scriptSrc}`; + } + // blocked + default: { + return scriptSrc.startsWith('javascript:') + ? `javascript:void(/* ${editedSource} */)` + : `/* LibreJS: script ${actionType}. */\n${editedSource}`; + } + } +} + +// Updates the extension icon in the toolbar. +function updateBadge(tabId, report = null, forceRed = false) { + const blockedCount = report ? report.blocked.length + report.blacklisted.length : 0; + const [text, color] = blockedCount > 0 || forceRed + ? [blockedCount && blockedCount.toString() || '!', 'red'] : ['✓', 'green'] + const { browserAction } = browser; + if ('setBadgeText' in browserAction) { + browserAction.setBadgeText({ text, tabId }); + browserAction.setBadgeBackgroundColor({ color, tabId }); + } else { + // Mobile + browserAction.setTitle({ title: `LibreJS (${text})`, tabId }); + } +} + +// TODO: is this the only way google analytics can show up? +function blockGoogleAnalytics(request) { + const { url } = request; + const res = {}; + if (url === 'https://www.google-analytics.com/analytics.js' || + /^https:\/\/www\.google\.com\/analytics\/[^#]/.test(url) + ) { + res.cancel = true; + } + return res; +} + +async function blockBlacklistedScripts(request) { + const { tabId, documentUrl } = request; + const url = ListStore.urlItem(request.url); + const status = listManager.getStatus(url); + if (status !== 'blacklisted') return {}; + const blacklistedSite = ListManager.siteMatch(url, blacklist); + await addReportEntry(tabId, { + url: documentUrl, + 'blacklisted': [url, /\*/.test(blacklistedSite) ? `User blacklisted ${blacklistedSite}` : 'Blacklisted by user'] + }); + return BLOCKING_RESPONSES.REJECT; +} + +/** + * An onHeadersReceived handler. See bg/ResponseProcessor.js for how + * it is used. + * + * This listener gets called as soon as we've got all the HTTP + * headers, can guess content type and encoding, and therefore + * correctly parse HTML documents and external script inclusions in + * search of non-free JavaScript + */ +const ResponseHandler = { + /** + * Checks black/whitelists and web labels. Returns a + * BlockingResponse (if we can determine) or null (if further work + * is needed). + * + * Enforce white/black lists for url/site early (hashes will be + * handled later) + */ + async pre(response) { + const { request } = response; + const { type, tabId, frameId, documentUrl } = request; + const fullUrl = request.url; + const url = ListStore.urlItem(fullUrl); + const site = ListStore.siteItem(url); + const blacklistedSite = ListManager.siteMatch(site, blacklist); + const blacklisted = blacklistedSite || blacklist.contains(url); + const topUrl = type === 'sub_frame' && request.frameAncestors && request.frameAncestors.pop() || documentUrl; + + if (blacklisted) { + if (type === 'script') { + // this shouldn't happen, because we intercept earlier in blockBlacklistedScripts() + return BLOCKING_RESPONSES.REJECT; + } + // we handle the page change here too, since we won't call editHtml() + if (type === 'main_frame') { + activityReports[tabId] = await createReport({ url: fullUrl, tabId }); + // Go on without parsing the page: it was explicitly blacklisted + const reason = blacklistedSite + ? `All ${blacklistedSite} blacklisted by user` + : 'Address blacklisted by user'; + await addReportEntry(tabId, { 'blacklisted': [blacklistedSite || url, reason], url: fullUrl }); + } + // use CSP to restrict JavaScript execution in the page + request.responseHeaders.unshift({ + name: 'Content-security-policy', + value: 'script-src \'none\';' + }); + // let's skip the inline script parsing, since we block by CSP + return { responseHeaders: request.responseHeaders }; + } else { + const whitelistedSite = ListManager.siteMatch(site, whitelist); + const whitelisted = response.whitelisted = whitelistedSite || whitelist.contains(url); + if (type === 'script') { + if (whitelisted) { + // accept the script and stop processing + addReportEntry(tabId, { + url: topUrl, + 'whitelisted': [url, whitelistedSite ? `User whitelisted ${whitelistedSite}` : 'Whitelisted by user'] + }); + return BLOCKING_RESPONSES.ACCEPT; + } else { + // Check the web labels + const scriptInfo = await ExternalLicenses.check({ url: fullUrl, tabId, frameId, documentUrl }); + if (scriptInfo) { + const [verdict, ret] = scriptInfo.free ? ['accepted', BLOCKING_RESPONSES.ACCEPT] : ['blocked', BLOCKING_RESPONSES.REJECT]; + const licenseIds = [...scriptInfo.licenses].map(l => l.identifier).sort().join(', '); + const msg = licenseIds + ? `Free license${scriptInfo.licenses.size > 1 ? 's' : ''} (${licenseIds})` + : 'Unknown license(s)'; + addReportEntry(tabId, { url, [verdict]: [url, msg] }); + return ret; + } + } + } + } + // it's a page (it's too early to report) or an unknown script: + // let's keep processing + return null; + }, + + /** + * Here we do the heavylifting, analyzing unknown scripts + */ + async post(response) { + const { type } = response.request; + const handler = type === 'script' ? handleScript : handleHtml; + return await handler(response, response.whitelisted); + } +} + +/** +* Here we handle external script requests +*/ +async function handleScript(response, whitelisted) { + const { text, request } = response; + const { url, tabId } = request; + return await checkScriptAndUpdateReport(text, ListStore.urlItem(url), tabId, whitelisted, isExternal = true, passAccWlist = true); +} + +/** +* Serializes HTMLDocument objects including the root element and +* the DOCTYPE declaration +*/ +function doc2HTML(doc) { + let s = doc.documentElement.outerHTML; + if (doc.doctype) { + const dt = doc.doctype; + let sDoctype = `<!DOCTYPE ${dt.name || 'html'}`; + if (dt.publicId) sDoctype += ` PUBLIC "${dt.publicId}"`; + if (dt.systemId) sDoctype += ` "${dt.systemId}"`; + s = `${sDoctype}>\n${s}`; + } + return s; +} + +/** +* Shortcut to create a correctly namespaced DOM HTML elements +*/ +function createHTMLElement(doc, name) { + return doc.createElementNS('http://www.w3.org/1999/xhtml', name); +} + +/** +* Replace any element with a span having the same content (useful to force +* NOSCRIPT elements to visible the same way as NoScript and uBlock do) +*/ +function forceElement(doc, element) { + const replacement = createHTMLElement(doc, 'span'); + replacement.innerHTML = element.innerHTML; + element.replaceWith(replacement); + return replacement; +} + +/** + * Forces displaying any noscript element not having the "data-librejs-nodisplay" attribute on pages. + * returns number of elements forced, mutates doc. +*/ +function forceNoscriptElements(doc) { + let shown = 0; + // inspired by NoScript's onScriptDisabled.js + for (const noscript of doc.querySelectorAll('noscript:not([data-librejs-nodisplay])')) { + const replacement = forceElement(doc, noscript); + // emulate meta-refresh + const meta = replacement.querySelector('meta[http-equiv="refresh"]'); + if (meta) { + doc.head.appendChild(meta); + } + shown++; + } + return shown; +} + +/** +* Forces displaying any element having the "data-librejs-display" attribute. +*/ +function showConditionalElements(doc) { + let shown = 0; + for (const element of document.querySelectorAll('[data-librejs-display]')) { + forceElement(doc, element); + shown++; + } + return shown; +} + +/** +* Tests to see if the intrinsic events on the page are free or not. +* returns true if they are, false if they're not +*/ +function readMetadata(metaElement) { + + if (metaElement === undefined || metaElement === null) { + return false; + } + + console.log('metadata found'); + + let metadata = {}; + + try { + metadata = JSON.parse(metaElement.innerHTML); + } catch (error) { + console.log('Could not parse metadata on page.') + return false; + } + + const licenseStr = metadata['intrinsic-events']; + if (licenseStr === undefined) { + console.log('No intrinsic events license'); + return false; + } + console.log(licenseStr); + + const parts = licenseStr.split(' '); + if (parts.length != 2) { + console.log('invalid (>2 tokens)'); + return false; + } + + if (checkLib.checkMagnet(parts[0])) { + return true; + } else { + console.log('invalid (doesn\'t match licenses or key didn\'t exist)'); + return false; + } +} +/** + * Reads/changes the HTML of a page and the scripts within it. + * Returns string or null. + */ +async function editHtml(html, documentUrl, tabId, frameId, whitelisted) { + const htmlDoc = new DOMParser().parseFromString(html, 'text/html'); + // moves external licenses reference, if any, before any <SCRIPT> element + ExternalLicenses.optimizeDocument(htmlDoc, { tabId, frameId, documentUrl }); + const url = ListStore.urlItem(documentUrl); + + if (whitelisted) { // don't bother rewriting + await checkScriptAndUpdateReport(html, url, tabId, whitelisted); // generates whitelisted report + return null; + } + if (checkFullHtml(html, documentUrl, url, tabId, htmlDoc)) return null; + const dejaVu = new Map(); // deduplication map & edited script cache + let modified = await checkIntrinsicEvents(html, documentUrl, tabId, htmlDoc, dejaVu); + let modifiedInline = await checkInlineScripts(html, documentUrl, tabId, htmlDoc, dejaVu); + + modified = showConditionalElements(htmlDoc) > 0 || modified || modifiedInline; + if (modified) { + if (modifiedInline) { + forceNoscriptElements(htmlDoc); + } + return doc2HTML(htmlDoc); + } + return null; +} + +/** + * Checks LibreJS-info element (undocumented) or licensing js in + * entire html using @licstart/@licend ("JavaScript embedded on your + * page..." in + * https://www.gnu.org/software/librejs/free-your-javascript.html) + * Returns true if handled, false otherwise. + */ +function checkFullHtml(html, documentUrl, url, tabId, htmlDoc) { + const firstInlineScript = Array.from(htmlDoc.scripts).find(script => script && !script.src); + const firstScriptSrc = firstInlineScript ? firstInlineScript.textContent : ''; + const licenseName = checkLib.checkLicenseText(firstScriptSrc); + const metaElement = htmlDoc.getElementById('LibreJS-info'); + if (readMetadata(metaElement) || licenseName) { + console.log('Valid license for the whole page found (LibreJS-info or @licstart/@licend)'); + const [line, extras] = metaElement ? + [findLine(/id\s*=\s*['"]?LibreJS-info\b/gi, html), '(0)'] : + [html.substring(0, html.indexOf(firstScriptSrc)).split(/\n/).length, + '\n' + firstScriptSrc]; + let viewUrl = line ? `view-source:${documentUrl}#line${line}(<${metaElement ? metaElement.tagName : 'SCRIPT'}>)${extras}` : url; + addReportEntry(tabId, { url, 'accepted': [viewUrl, `Global license for the page: ${licenseName}`] }); + return true; + } + return false; +} + +/** + * Checks intrinsic events, i.e. in event handlers or the href + * attribute. + * Returns true if htmlDoc is modified, false otherwise. + * Mutates htmlDoc and dejaVu. + */ +async function checkIntrinsicEvents(html, documentUrl, tabId, htmlDoc, dejaVu) { + let modified = false; + const intrinsicFinder = /<[a-z][^>]*\b(on\w+|href\s*=\s*['"]?javascript:)/gi; + for (const element of htmlDoc.querySelectorAll('*')) { + let line = -1; + for (const attr of element.attributes) { + let { name, value } = attr; + value = value.trim(); + if (name.startsWith('on') || (name === 'href' && value.toLowerCase().startsWith('javascript:'))) { + if (line === -1) { + line = findLine(intrinsicFinder, html); + } + try { + const key = `<${element.tagName} ${name}="${value}">`; + let edited; + if (dejaVu.has(key)) { + edited = dejaVu.get(key); + } else { + const url = `view-source:${documentUrl}#line${line}(<${element.tagName} ${name}>)\n${value.trim()}`; + if (name === 'href') value = decodeURIComponent(value); + edited = await checkScriptAndUpdateReport(value, url, tabId, whitelist.contains(url)); + dejaVu.set(key, edited); + } + if (edited && edited !== value) { + modified = true; + attr.value = edited; + } + } catch (e) { + console.error(e); + } + } + } + } + return modified; +} + +/** + * Checks inline scripts. + * Mutates dejaVu and htmlDoc. + */ +async function checkInlineScripts(html, documentUrl, tabId, htmlDoc, dejaVu) { + let modifiedInline = false; + const scriptFinder = /<script\b/ig; + for (const script of htmlDoc.scripts) { + const line = findLine(scriptFinder, html); + if (!script.src && !(script.type && script.type !== 'text/javascript')) { + const source = script.textContent.trim(); + let editedSource; + if (dejaVu.has(source)) { + editedSource = dejaVu.get(source); + } else { + const url = `view-source:${documentUrl}#line${line}(<SCRIPT>)\n${source}`; + const edited = await checkScriptAndUpdateReport(source, url, tabId, false); + editedSource = edited.trim(); + dejaVu.set(url, editedSource); + } + if (editedSource) { + if (source !== editedSource) { + script.textContent = editedSource; + modifiedInline = true; + } + } + } + } + return modifiedInline; +} + +/** + * Returns the line of next match for finder. + * May mutate finder if it is stateful. + */ +const findLine = (finder, html) => finder.test(html) && html.substring(0, finder.lastIndex).split(/\n/).length || 0; + + +/** +* Here we handle html document responses +*/ +async function handleHtml(response, whitelisted) { + const { text, request } = response; + const { url, tabId, frameId, type } = request; + if (type === 'main_frame') { + activityReports[tabId] = await createReport({ url, tabId }); + updateBadge(tabId); + } + return await editHtml(text, url, tabId, frameId, whitelisted); +} + +const whitelist = new ListStore('pref_whitelist', Storage.CSV); +const blacklist = new ListStore('pref_blacklist', Storage.CSV); +const listManager = new ListManager(whitelist, blacklist, + // built-in whitelist of script hashes, e.g. jQuery + Object.values(require('./utilities/hash_script/whitelist').whitelist) + .reduce((a, b) => a.concat(b)) // as a flat array + .map(script => script.hash) +); + + +async function initDefaults() { + const defaults = { + pref_subject: 'Issues with Javascript on your website', + pref_body: `Please consider using a free license for the Javascript on your website. + +[Message generated by LibreJS. See https://www.gnu.org/software/librejs/ for more information] +` + }; + const keys = Object.keys(defaults); + const prefs = await browser.storage.local.get(keys); + let changed = false; + for (let k of keys) { + if (!(k in prefs)) { + prefs[k] = defaults[k]; + changed = true; + } + } + if (changed) { + await browser.storage.local.set(prefs); + } +} + +/** +* Initializes various add-on functions +* only meant to be called once when the script starts +*/ +async function initAddon() { + await initDefaults(); + await whitelist.load(); + browser.runtime.onConnect.addListener(connected); + browser.storage.onChanged.addListener(optionsListener); + browser.tabs.onRemoved.addListener(deleteRemovedTabInfo); + browser.tabs.onUpdated.addListener(onTabUpdated); + browser.tabs.onActivated.addListener(onTabActivated); + // Prevents Google Analytics from being loaded from Google servers + const all_types = [ + 'beacon', 'csp_report', 'font', 'image', 'imageset', 'main_frame', 'media', + 'object', 'object_subrequest', 'ping', 'script', 'stylesheet', 'sub_frame', + 'web_manifest', 'websocket', 'xbl', 'xml_dtd', 'xmlhttprequest', 'xslt', + 'other' + ]; + browser.webRequest.onBeforeRequest.addListener(blockGoogleAnalytics, + { urls: ['<all_urls>'], types: all_types }, + ['blocking'] + ); + browser.webRequest.onBeforeRequest.addListener(blockBlacklistedScripts, + { urls: ['<all_urls>'], types: ['script'] }, + ['blocking'] + ); + browser.webRequest.onResponseStarted.addListener(request => { + const { tabId } = request; + const report = activityReports[tabId]; + if (report) { + updateBadge(tabId, activityReports[tabId]); + } + }, { urls: ['<all_urls>'], types: ['main_frame'] }); + + // Analyzes all the html documents and external scripts as they're loaded + ResponseProcessor.install(ResponseHandler); + + checkLib.init(); + + const Test = require('./common/Test'); + if (Test.getURL()) { + // export testable functions to the global scope + this.LibreJS = { + editHtml, + handleScript, + ExternalLicenses, + ListManager, ListStore, Storage, + }; + // create or focus the autotest tab if it's a debugging session + if ((await browser.management.getSelf()).installType === 'development') { + Test.getTab(true); + } + } +} + +initAddon(); + +},{"./bg/ExternalLicenses":1,"./bg/ListManager":2,"./bg/ResponseProcessor":4,"./common/Storage":5,"./common/Test":6,"./common/checks.js":7,"./common/debug.js":8,"./utilities/hash_script/whitelist":15}],13:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.acorn = {})); +})(this, (function (exports) { 'use strict'; + + // This file was generated. Do not modify manually! + var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 154, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 19306, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 262, 6, 10, 9, 357, 0, 62, 13, 1495, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + + // This file was generated. Do not modify manually! + var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 190, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1070, 4050, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 46, 2, 18, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 482, 44, 11, 6, 17, 0, 322, 29, 19, 43, 1269, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4152, 8, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938]; + + // This file was generated. Do not modify manually! + var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; + + // This file was generated. Do not modify manually! + var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; + + // These are a run-length and offset encoded representation of the + + // Reserved word lists for various dialects of the language + + var reservedWords = { + 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", + 5: "class enum extends super const export import", + 6: "enum", + strict: "implements interface let package private protected public static yield", + strictBind: "eval arguments" + }; + + // And the keywords + + var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"; + + var keywords$1 = { + 5: ecma5AndLessKeywords, + "5module": ecma5AndLessKeywords + " export import", + 6: ecma5AndLessKeywords + " const class extends export import super" + }; + + var keywordRelationalOperator = /^in(stanceof)?$/; + + // ## Character categories + + var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); + var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + + // This has a complexity linear to the value of the code. The + // assumption is that looking up astral identifier characters is + // rare. + function isInAstralSet(code, set) { + var pos = 0x10000; + for (var i = 0; i < set.length; i += 2) { + pos += set[i]; + if (pos > code) { return false } + pos += set[i + 1]; + if (pos >= code) { return true } + } + } + + // Test whether a given character code starts an identifier. + + function isIdentifierStart(code, astral) { + if (code < 65) { return code === 36 } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) + } + + // Test whether a given character is part of an identifier. + + function isIdentifierChar(code, astral) { + if (code < 48) { return code === 36 } + if (code < 58) { return true } + if (code < 65) { return false } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) + } + + // ## Token types + + // The assignment of fine-grained, information-carrying type objects + // allows the tokenizer to store the information it has about a + // token in a way that is very cheap for the parser to look up. + + // All token type variables start with an underscore, to make them + // easy to recognize. + + // The `beforeExpr` property is used to disambiguate between regular + // expressions and divisions. It is set on all token types that can + // be followed by an expression (thus, a slash after them would be a + // regular expression). + // + // The `startsExpr` property is used to check if the token ends a + // `yield` expression. It is set on all token types that either can + // directly start an expression (like a quotation mark) or can + // continue an expression (like the body of a string). + // + // `isLoop` marks a keyword as starting a loop, which is important + // to know when parsing a label, in order to allow or disallow + // continue jumps to that label. + + var TokenType = function TokenType(label, conf) { + if ( conf === void 0 ) conf = {}; + + this.label = label; + this.keyword = conf.keyword; + this.beforeExpr = !!conf.beforeExpr; + this.startsExpr = !!conf.startsExpr; + this.isLoop = !!conf.isLoop; + this.isAssign = !!conf.isAssign; + this.prefix = !!conf.prefix; + this.postfix = !!conf.postfix; + this.binop = conf.binop || null; + this.updateContext = null; + }; + + function binop(name, prec) { + return new TokenType(name, {beforeExpr: true, binop: prec}) + } + var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true}; + + // Map keyword names to token types. + + var keywords = {}; + + // Succinct definitions of keyword token types + function kw(name, options) { + if ( options === void 0 ) options = {}; + + options.keyword = name; + return keywords[name] = new TokenType(name, options) + } + + var types$1 = { + num: new TokenType("num", startsExpr), + regexp: new TokenType("regexp", startsExpr), + string: new TokenType("string", startsExpr), + name: new TokenType("name", startsExpr), + privateId: new TokenType("privateId", startsExpr), + eof: new TokenType("eof"), + + // Punctuation token types. + bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}), + bracketR: new TokenType("]"), + braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}), + braceR: new TokenType("}"), + parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}), + parenR: new TokenType(")"), + comma: new TokenType(",", beforeExpr), + semi: new TokenType(";", beforeExpr), + colon: new TokenType(":", beforeExpr), + dot: new TokenType("."), + question: new TokenType("?", beforeExpr), + questionDot: new TokenType("?."), + arrow: new TokenType("=>", beforeExpr), + template: new TokenType("template"), + invalidTemplate: new TokenType("invalidTemplate"), + ellipsis: new TokenType("...", beforeExpr), + backQuote: new TokenType("`", startsExpr), + dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}), + + // Operators. These carry several kinds of properties to help the + // parser use them properly (the presence of these properties is + // what categorizes them as operators). + // + // `binop`, when present, specifies that this operator is a binary + // operator, and will refer to its precedence. + // + // `prefix` and `postfix` mark the operator as a prefix or postfix + // unary operator. + // + // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as + // binary operators with a very low precedence, that should result + // in AssignmentExpression nodes. + + eq: new TokenType("=", {beforeExpr: true, isAssign: true}), + assign: new TokenType("_=", {beforeExpr: true, isAssign: true}), + incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}), + prefix: new TokenType("!/~", {beforeExpr: true, prefix: true, startsExpr: true}), + logicalOR: binop("||", 1), + logicalAND: binop("&&", 2), + bitwiseOR: binop("|", 3), + bitwiseXOR: binop("^", 4), + bitwiseAND: binop("&", 5), + equality: binop("==/!=/===/!==", 6), + relational: binop("</>/<=/>=", 7), + bitShift: binop("<</>>/>>>", 8), + plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}), + modulo: binop("%", 10), + star: binop("*", 10), + slash: binop("/", 10), + starstar: new TokenType("**", {beforeExpr: true}), + coalesce: binop("??", 1), + + // Keyword token types. + _break: kw("break"), + _case: kw("case", beforeExpr), + _catch: kw("catch"), + _continue: kw("continue"), + _debugger: kw("debugger"), + _default: kw("default", beforeExpr), + _do: kw("do", {isLoop: true, beforeExpr: true}), + _else: kw("else", beforeExpr), + _finally: kw("finally"), + _for: kw("for", {isLoop: true}), + _function: kw("function", startsExpr), + _if: kw("if"), + _return: kw("return", beforeExpr), + _switch: kw("switch"), + _throw: kw("throw", beforeExpr), + _try: kw("try"), + _var: kw("var"), + _const: kw("const"), + _while: kw("while", {isLoop: true}), + _with: kw("with"), + _new: kw("new", {beforeExpr: true, startsExpr: true}), + _this: kw("this", startsExpr), + _super: kw("super", startsExpr), + _class: kw("class", startsExpr), + _extends: kw("extends", beforeExpr), + _export: kw("export"), + _import: kw("import", startsExpr), + _null: kw("null", startsExpr), + _true: kw("true", startsExpr), + _false: kw("false", startsExpr), + _in: kw("in", {beforeExpr: true, binop: 7}), + _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}), + _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}), + _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}), + _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true}) + }; + + // Matches a whole line break (where CRLF is considered a single + // line break). Used to count lines. + + var lineBreak = /\r\n?|\n|\u2028|\u2029/; + var lineBreakG = new RegExp(lineBreak.source, "g"); + + function isNewLine(code) { + return code === 10 || code === 13 || code === 0x2028 || code === 0x2029 + } + + function nextLineBreak(code, from, end) { + if ( end === void 0 ) end = code.length; + + for (var i = from; i < end; i++) { + var next = code.charCodeAt(i); + if (isNewLine(next)) + { return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1 } + } + return -1 + } + + var nonASCIIwhitespace = /[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/; + + var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; + + var ref = Object.prototype; + var hasOwnProperty = ref.hasOwnProperty; + var toString = ref.toString; + + var hasOwn = Object.hasOwn || (function (obj, propName) { return ( + hasOwnProperty.call(obj, propName) + ); }); + + var isArray = Array.isArray || (function (obj) { return ( + toString.call(obj) === "[object Array]" + ); }); + + function wordsRegexp(words) { + return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$") + } + + function codePointToString(code) { + // UTF-16 Decoding + if (code <= 0xFFFF) { return String.fromCharCode(code) } + code -= 0x10000; + return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00) + } + + var loneSurrogate = /(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/; + + // These are used when `options.locations` is on, for the + // `startLoc` and `endLoc` properties. + + var Position = function Position(line, col) { + this.line = line; + this.column = col; + }; + + Position.prototype.offset = function offset (n) { + return new Position(this.line, this.column + n) + }; + + var SourceLocation = function SourceLocation(p, start, end) { + this.start = start; + this.end = end; + if (p.sourceFile !== null) { this.source = p.sourceFile; } + }; + + // The `getLineInfo` function is mostly useful when the + // `locations` option is off (for performance reasons) and you + // want to find the line/column position for a given character + // offset. `input` should be the code string that the offset refers + // into. + + function getLineInfo(input, offset) { + for (var line = 1, cur = 0;;) { + var nextBreak = nextLineBreak(input, cur, offset); + if (nextBreak < 0) { return new Position(line, offset - cur) } + ++line; + cur = nextBreak; + } + } + + // A second argument must be given to configure the parser process. + // These options are recognized (only `ecmaVersion` is required): + + var defaultOptions = { + // `ecmaVersion` indicates the ECMAScript version to parse. Must be + // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 + // (2019), 11 (2020), 12 (2021), 13 (2022), or `"latest"` (the + // latest version the library supports). This influences support + // for strict mode, the set of reserved words, and support for + // new syntax features. + ecmaVersion: null, + // `sourceType` indicates the mode the code should be parsed in. + // Can be either `"script"` or `"module"`. This influences global + // strict mode and parsing of `import` and `export` declarations. + sourceType: "script", + // `onInsertedSemicolon` can be a callback that will be called + // when a semicolon is automatically inserted. It will be passed + // the position of the comma as an offset, and if `locations` is + // enabled, it is given the location as a `{line, column}` object + // as second argument. + onInsertedSemicolon: null, + // `onTrailingComma` is similar to `onInsertedSemicolon`, but for + // trailing commas. + onTrailingComma: null, + // By default, reserved words are only enforced if ecmaVersion >= 5. + // Set `allowReserved` to a boolean value to explicitly turn this on + // an off. When this option has the value "never", reserved words + // and keywords can also not be used as property names. + allowReserved: null, + // When enabled, a return at the top level is not considered an + // error. + allowReturnOutsideFunction: false, + // When enabled, import/export statements are not constrained to + // appearing at the top of the program, and an import.meta expression + // in a script isn't considered an error. + allowImportExportEverywhere: false, + // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022. + // When enabled, await identifiers are allowed to appear at the top-level scope, + // but they are still not allowed in non-async functions. + allowAwaitOutsideFunction: null, + // When enabled, super identifiers are not constrained to + // appearing in methods and do not raise an error when they appear elsewhere. + allowSuperOutsideMethod: null, + // When enabled, hashbang directive in the beginning of file + // is allowed and treated as a line comment. + allowHashBang: false, + // When `locations` is on, `loc` properties holding objects with + // `start` and `end` properties in `{line, column}` form (with + // line being 1-based and column 0-based) will be attached to the + // nodes. + locations: false, + // A function can be passed as `onToken` option, which will + // cause Acorn to call that function with object in the same + // format as tokens returned from `tokenizer().getToken()`. Note + // that you are not allowed to call the parser from the + // callback—that will corrupt its internal state. + onToken: null, + // A function can be passed as `onComment` option, which will + // cause Acorn to call that function with `(block, text, start, + // end)` parameters whenever a comment is skipped. `block` is a + // boolean indicating whether this is a block (`/* */`) comment, + // `text` is the content of the comment, and `start` and `end` are + // character offsets that denote the start and end of the comment. + // When the `locations` option is on, two more parameters are + // passed, the full `{line, column}` locations of the start and + // end of the comments. Note that you are not allowed to call the + // parser from the callback—that will corrupt its internal state. + onComment: null, + // Nodes have their start and end characters offsets recorded in + // `start` and `end` properties (directly on the node, rather than + // the `loc` object, which holds line/column data. To also add a + // [semi-standardized][range] `range` property holding a `[start, + // end]` array with the same numbers, set the `ranges` option to + // `true`. + // + // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678 + ranges: false, + // It is possible to parse multiple files into a single AST by + // passing the tree produced by parsing the first file as + // `program` option in subsequent parses. This will add the + // toplevel forms of the parsed file to the `Program` (top) node + // of an existing parse tree. + program: null, + // When `locations` is on, you can pass this to record the source + // file in every node's `loc` object. + sourceFile: null, + // This value, if given, is stored in every node, whether + // `locations` is on or off. + directSourceFile: null, + // When enabled, parenthesized expressions are represented by + // (non-standard) ParenthesizedExpression nodes + preserveParens: false + }; + + // Interpret and default an options object + + var warnedAboutEcmaVersion = false; + + function getOptions(opts) { + var options = {}; + + for (var opt in defaultOptions) + { options[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; } + + if (options.ecmaVersion === "latest") { + options.ecmaVersion = 1e8; + } else if (options.ecmaVersion == null) { + if (!warnedAboutEcmaVersion && typeof console === "object" && console.warn) { + warnedAboutEcmaVersion = true; + console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future."); + } + options.ecmaVersion = 11; + } else if (options.ecmaVersion >= 2015) { + options.ecmaVersion -= 2009; + } + + if (options.allowReserved == null) + { options.allowReserved = options.ecmaVersion < 5; } + + if (isArray(options.onToken)) { + var tokens = options.onToken; + options.onToken = function (token) { return tokens.push(token); }; + } + if (isArray(options.onComment)) + { options.onComment = pushComment(options, options.onComment); } + + return options + } + + function pushComment(options, array) { + return function(block, text, start, end, startLoc, endLoc) { + var comment = { + type: block ? "Block" : "Line", + value: text, + start: start, + end: end + }; + if (options.locations) + { comment.loc = new SourceLocation(this, startLoc, endLoc); } + if (options.ranges) + { comment.range = [start, end]; } + array.push(comment); + } + } + + // Each scope gets a bitset that may contain these flags + var + SCOPE_TOP = 1, + SCOPE_FUNCTION = 2, + SCOPE_ASYNC = 4, + SCOPE_GENERATOR = 8, + SCOPE_ARROW = 16, + SCOPE_SIMPLE_CATCH = 32, + SCOPE_SUPER = 64, + SCOPE_DIRECT_SUPER = 128, + SCOPE_CLASS_STATIC_BLOCK = 256, + SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK; + + function functionFlags(async, generator) { + return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0) + } + + // Used in checkLVal* and declareName to determine the type of a binding + var + BIND_NONE = 0, // Not a binding + BIND_VAR = 1, // Var-style binding + BIND_LEXICAL = 2, // Let- or const-style binding + BIND_FUNCTION = 3, // Function declaration + BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding + BIND_OUTSIDE = 5; // Special case for function names as bound inside the function + + var Parser = function Parser(options, input, startPos) { + this.options = options = getOptions(options); + this.sourceFile = options.sourceFile; + this.keywords = wordsRegexp(keywords$1[options.ecmaVersion >= 6 ? 6 : options.sourceType === "module" ? "5module" : 5]); + var reserved = ""; + if (options.allowReserved !== true) { + reserved = reservedWords[options.ecmaVersion >= 6 ? 6 : options.ecmaVersion === 5 ? 5 : 3]; + if (options.sourceType === "module") { reserved += " await"; } + } + this.reservedWords = wordsRegexp(reserved); + var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict; + this.reservedWordsStrict = wordsRegexp(reservedStrict); + this.reservedWordsStrictBind = wordsRegexp(reservedStrict + " " + reservedWords.strictBind); + this.input = String(input); + + // Used to signal to callers of `readWord1` whether the word + // contained any escape sequences. This is needed because words with + // escape sequences must not be interpreted as keywords. + this.containsEsc = false; + + // Set up token state + + // The current position of the tokenizer in the input. + if (startPos) { + this.pos = startPos; + this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; + this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + } else { + this.pos = this.lineStart = 0; + this.curLine = 1; + } + + // Properties of the current token: + // Its type + this.type = types$1.eof; + // For tokens that include more information than their type, the value + this.value = null; + // Its start and end offset + this.start = this.end = this.pos; + // And, if locations are used, the {line, column} object + // corresponding to those offsets + this.startLoc = this.endLoc = this.curPosition(); + + // Position information for the previous token + this.lastTokEndLoc = this.lastTokStartLoc = null; + this.lastTokStart = this.lastTokEnd = this.pos; + + // The context stack is used to superficially track syntactic + // context to predict whether a regular expression is allowed in a + // given position. + this.context = this.initialContext(); + this.exprAllowed = true; + + // Figure out if it's a module code. + this.inModule = options.sourceType === "module"; + this.strict = this.inModule || this.strictDirective(this.pos); + + // Used to signify the start of a potential arrow function + this.potentialArrowAt = -1; + this.potentialArrowInForAwait = false; + + // Positions to delayed-check that yield/await does not exist in default parameters. + this.yieldPos = this.awaitPos = this.awaitIdentPos = 0; + // Labels in scope. + this.labels = []; + // Thus-far undefined exports. + this.undefinedExports = Object.create(null); + + // If enabled, skip leading hashbang line. + if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!") + { this.skipLineComment(2); } + + // Scope tracking for duplicate variable names (see scope.js) + this.scopeStack = []; + this.enterScope(SCOPE_TOP); + + // For RegExp validation + this.regexpState = null; + + // The stack of private names. + // Each element has two properties: 'declared' and 'used'. + // When it exited from the outermost class definition, all used private names must be declared. + this.privateNameStack = []; + }; + + var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } }; + + Parser.prototype.parse = function parse () { + var node = this.options.program || this.startNode(); + this.nextToken(); + return this.parseTopLevel(node) + }; + + prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 }; + + prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit }; + + prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit }; + + prototypeAccessors.canAwait.get = function () { + for (var i = this.scopeStack.length - 1; i >= 0; i--) { + var scope = this.scopeStack[i]; + if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false } + if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 } + } + return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction + }; + + prototypeAccessors.allowSuper.get = function () { + var ref = this.currentThisScope(); + var flags = ref.flags; + var inClassFieldInit = ref.inClassFieldInit; + return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod + }; + + prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 }; + + prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) }; + + prototypeAccessors.allowNewDotTarget.get = function () { + var ref = this.currentThisScope(); + var flags = ref.flags; + var inClassFieldInit = ref.inClassFieldInit; + return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit + }; + + prototypeAccessors.inClassStaticBlock.get = function () { + return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0 + }; + + Parser.extend = function extend () { + var plugins = [], len = arguments.length; + while ( len-- ) plugins[ len ] = arguments[ len ]; + + var cls = this; + for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); } + return cls + }; + + Parser.parse = function parse (input, options) { + return new this(options, input).parse() + }; + + Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) { + var parser = new this(options, input, pos); + parser.nextToken(); + return parser.parseExpression() + }; + + Parser.tokenizer = function tokenizer (input, options) { + return new this(options, input) + }; + + Object.defineProperties( Parser.prototype, prototypeAccessors ); + + var pp$9 = Parser.prototype; + + // ## Parser utilities + + var literal = /^(?:'((?:\\.|[^'\\])*?)'|"((?:\\.|[^"\\])*?)")/; + pp$9.strictDirective = function(start) { + if (this.options.ecmaVersion < 5) { return false } + for (;;) { + // Try to find string literal. + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + var match = literal.exec(this.input.slice(start)); + if (!match) { return false } + if ((match[1] || match[2]) === "use strict") { + skipWhiteSpace.lastIndex = start + match[0].length; + var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length; + var next = this.input.charAt(end); + return next === ";" || next === "}" || + (lineBreak.test(spaceAfter[0]) && + !(/[(`.[+\-/*%<>=,?^&]/.test(next) || next === "!" && this.input.charAt(end + 1) === "=")) + } + start += match[0].length; + + // Skip semicolon, if any. + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + if (this.input[start] === ";") + { start++; } + } + }; + + // Predicate that tests whether the next token is of the given + // type, and if yes, consumes it as a side effect. + + pp$9.eat = function(type) { + if (this.type === type) { + this.next(); + return true + } else { + return false + } + }; + + // Tests whether parsed token is a contextual keyword. + + pp$9.isContextual = function(name) { + return this.type === types$1.name && this.value === name && !this.containsEsc + }; + + // Consumes contextual keyword if possible. + + pp$9.eatContextual = function(name) { + if (!this.isContextual(name)) { return false } + this.next(); + return true + }; + + // Asserts that following token is given contextual keyword. + + pp$9.expectContextual = function(name) { + if (!this.eatContextual(name)) { this.unexpected(); } + }; + + // Test whether a semicolon can be inserted at the current position. + + pp$9.canInsertSemicolon = function() { + return this.type === types$1.eof || + this.type === types$1.braceR || + lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) + }; + + pp$9.insertSemicolon = function() { + if (this.canInsertSemicolon()) { + if (this.options.onInsertedSemicolon) + { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); } + return true + } + }; + + // Consume a semicolon, or, failing that, see if we are allowed to + // pretend that there is a semicolon at this position. + + pp$9.semicolon = function() { + if (!this.eat(types$1.semi) && !this.insertSemicolon()) { this.unexpected(); } + }; + + pp$9.afterTrailingComma = function(tokType, notNext) { + if (this.type === tokType) { + if (this.options.onTrailingComma) + { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); } + if (!notNext) + { this.next(); } + return true + } + }; + + // Expect a token of a given type. If found, consume it, otherwise, + // raise an unexpected token error. + + pp$9.expect = function(type) { + this.eat(type) || this.unexpected(); + }; + + // Raise an unexpected token error. + + pp$9.unexpected = function(pos) { + this.raise(pos != null ? pos : this.start, "Unexpected token"); + }; + + var DestructuringErrors = function DestructuringErrors() { + this.shorthandAssign = + this.trailingComma = + this.parenthesizedAssign = + this.parenthesizedBind = + this.doubleProto = + -1; + }; + + pp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) { + if (!refDestructuringErrors) { return } + if (refDestructuringErrors.trailingComma > -1) + { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); } + var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; + if (parens > -1) { this.raiseRecoverable(parens, "Parenthesized pattern"); } + }; + + pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) { + if (!refDestructuringErrors) { return false } + var shorthandAssign = refDestructuringErrors.shorthandAssign; + var doubleProto = refDestructuringErrors.doubleProto; + if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 } + if (shorthandAssign >= 0) + { this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); } + if (doubleProto >= 0) + { this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); } + }; + + pp$9.checkYieldAwaitInDefaultParams = function() { + if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos)) + { this.raise(this.yieldPos, "Yield expression cannot be a default value"); } + if (this.awaitPos) + { this.raise(this.awaitPos, "Await expression cannot be a default value"); } + }; + + pp$9.isSimpleAssignTarget = function(expr) { + if (expr.type === "ParenthesizedExpression") + { return this.isSimpleAssignTarget(expr.expression) } + return expr.type === "Identifier" || expr.type === "MemberExpression" + }; + + var pp$8 = Parser.prototype; + + // ### Statement parsing + + // Parse a program. Initializes the parser, reads any number of + // statements, and wraps them in a Program node. Optionally takes a + // `program` argument. If present, the statements will be appended + // to its body instead of creating a new node. + + pp$8.parseTopLevel = function(node) { + var exports = Object.create(null); + if (!node.body) { node.body = []; } + while (this.type !== types$1.eof) { + var stmt = this.parseStatement(null, true, exports); + node.body.push(stmt); + } + if (this.inModule) + { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1) + { + var name = list[i]; + + this.raiseRecoverable(this.undefinedExports[name].start, ("Export '" + name + "' is not defined")); + } } + this.adaptDirectivePrologue(node.body); + this.next(); + node.sourceType = this.options.sourceType; + return this.finishNode(node, "Program") + }; + + var loopLabel = {kind: "loop"}, switchLabel = {kind: "switch"}; + + pp$8.isLet = function(context) { + if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + // For ambiguous cases, determine if a LexicalDeclaration (or only a + // Statement) is allowed here. If context is not empty then only a Statement + // is allowed. However, `let [` is an explicit negative lookahead for + // ExpressionStatement, so special-case it first. + if (nextCh === 91 || nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '[', '/', astral + if (context) { return false } + + if (nextCh === 123) { return true } // '{' + if (isIdentifierStart(nextCh, true)) { + var pos = next + 1; + while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; } + if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } + var ident = this.input.slice(next, pos); + if (!keywordRelationalOperator.test(ident)) { return true } + } + return false + }; + + // check 'async [no LineTerminator here] function' + // - 'async /*foo*/ function' is OK. + // - 'async /*\n*/ function' is invalid. + pp$8.isAsyncFunction = function() { + if (this.options.ecmaVersion < 8 || !this.isContextual("async")) + { return false } + + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, after; + return !lineBreak.test(this.input.slice(this.pos, next)) && + this.input.slice(next, next + 8) === "function" && + (next + 8 === this.input.length || + !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00)) + }; + + // Parse a single statement. + // + // If expecting a statement and finding a slash operator, parse a + // regular expression literal. This is to handle cases like + // `if (foo) /blah/.exec(foo)`, where looking at the previous token + // does not help. + + pp$8.parseStatement = function(context, topLevel, exports) { + var starttype = this.type, node = this.startNode(), kind; + + if (this.isLet(context)) { + starttype = types$1._var; + kind = "let"; + } + + // Most types of statements are recognized by the keyword they + // start with. Many are trivial to parse, some require a bit of + // complexity. + + switch (starttype) { + case types$1._break: case types$1._continue: return this.parseBreakContinueStatement(node, starttype.keyword) + case types$1._debugger: return this.parseDebuggerStatement(node) + case types$1._do: return this.parseDoStatement(node) + case types$1._for: return this.parseForStatement(node) + case types$1._function: + // Function as sole body of either an if statement or a labeled statement + // works, but not when it is part of a labeled statement that is the sole + // body of an if statement. + if ((context && (this.strict || context !== "if" && context !== "label")) && this.options.ecmaVersion >= 6) { this.unexpected(); } + return this.parseFunctionStatement(node, false, !context) + case types$1._class: + if (context) { this.unexpected(); } + return this.parseClass(node, true) + case types$1._if: return this.parseIfStatement(node) + case types$1._return: return this.parseReturnStatement(node) + case types$1._switch: return this.parseSwitchStatement(node) + case types$1._throw: return this.parseThrowStatement(node) + case types$1._try: return this.parseTryStatement(node) + case types$1._const: case types$1._var: + kind = kind || this.value; + if (context && kind !== "var") { this.unexpected(); } + return this.parseVarStatement(node, kind) + case types$1._while: return this.parseWhileStatement(node) + case types$1._with: return this.parseWithStatement(node) + case types$1.braceL: return this.parseBlock(true, node) + case types$1.semi: return this.parseEmptyStatement(node) + case types$1._export: + case types$1._import: + if (this.options.ecmaVersion > 10 && starttype === types$1._import) { + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + if (nextCh === 40 || nextCh === 46) // '(' or '.' + { return this.parseExpressionStatement(node, this.parseExpression()) } + } + + if (!this.options.allowImportExportEverywhere) { + if (!topLevel) + { this.raise(this.start, "'import' and 'export' may only appear at the top level"); } + if (!this.inModule) + { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); } + } + return starttype === types$1._import ? this.parseImport(node) : this.parseExport(node, exports) + + // If the statement does not start with a statement keyword or a + // brace, it's an ExpressionStatement or LabeledStatement. We + // simply start parsing an expression, and afterwards, if the + // next token is a colon and the expression was a simple + // Identifier node, we switch to interpreting it as a label. + default: + if (this.isAsyncFunction()) { + if (context) { this.unexpected(); } + this.next(); + return this.parseFunctionStatement(node, true, !context) + } + + var maybeName = this.value, expr = this.parseExpression(); + if (starttype === types$1.name && expr.type === "Identifier" && this.eat(types$1.colon)) + { return this.parseLabeledStatement(node, maybeName, expr, context) } + else { return this.parseExpressionStatement(node, expr) } + } + }; + + pp$8.parseBreakContinueStatement = function(node, keyword) { + var isBreak = keyword === "break"; + this.next(); + if (this.eat(types$1.semi) || this.insertSemicolon()) { node.label = null; } + else if (this.type !== types$1.name) { this.unexpected(); } + else { + node.label = this.parseIdent(); + this.semicolon(); + } + + // Verify that there is an actual destination to break or + // continue to. + var i = 0; + for (; i < this.labels.length; ++i) { + var lab = this.labels[i]; + if (node.label == null || lab.name === node.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) { break } + if (node.label && isBreak) { break } + } + } + if (i === this.labels.length) { this.raise(node.start, "Unsyntactic " + keyword); } + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") + }; + + pp$8.parseDebuggerStatement = function(node) { + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement") + }; + + pp$8.parseDoStatement = function(node) { + this.next(); + this.labels.push(loopLabel); + node.body = this.parseStatement("do"); + this.labels.pop(); + this.expect(types$1._while); + node.test = this.parseParenExpression(); + if (this.options.ecmaVersion >= 6) + { this.eat(types$1.semi); } + else + { this.semicolon(); } + return this.finishNode(node, "DoWhileStatement") + }; + + // Disambiguating between a `for` and a `for`/`in` or `for`/`of` + // loop is non-trivial. Basically, we have to parse the init `var` + // statement or expression, disallowing the `in` operator (see + // the second parameter to `parseExpression`), and then check + // whether the next token is `in` or `of`. When there is no init + // part (semicolon immediately after the opening parenthesis), it + // is a regular `for` loop. + + pp$8.parseForStatement = function(node) { + this.next(); + var awaitAt = (this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual("await")) ? this.lastTokStart : -1; + this.labels.push(loopLabel); + this.enterScope(0); + this.expect(types$1.parenL); + if (this.type === types$1.semi) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, null) + } + var isLet = this.isLet(); + if (this.type === types$1._var || this.type === types$1._const || isLet) { + var init$1 = this.startNode(), kind = isLet ? "let" : this.value; + this.next(); + this.parseVar(init$1, true, kind); + this.finishNode(init$1, "VariableDeclaration"); + if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types$1._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + return this.parseForIn(node, init$1) + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init$1) + } + var startsWithLet = this.isContextual("let"), isForOf = false; + var refDestructuringErrors = new DestructuringErrors; + var init = this.parseExpression(awaitAt > -1 ? "await" : true, refDestructuringErrors); + if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types$1._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + if (startsWithLet && isForOf) { this.raise(init.start, "The left-hand side of a for-of loop may not start with 'let'."); } + this.toAssignable(init, false, refDestructuringErrors); + this.checkLValPattern(init); + return this.parseForIn(node, init) + } else { + this.checkExpressionErrors(refDestructuringErrors, true); + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init) + }; + + pp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) { + this.next(); + return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync) + }; + + pp$8.parseIfStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + // allow function declarations in branches, but only in non-strict mode + node.consequent = this.parseStatement("if"); + node.alternate = this.eat(types$1._else) ? this.parseStatement("if") : null; + return this.finishNode(node, "IfStatement") + }; + + pp$8.parseReturnStatement = function(node) { + if (!this.inFunction && !this.options.allowReturnOutsideFunction) + { this.raise(this.start, "'return' outside of function"); } + this.next(); + + // In `return` (and `break`/`continue`), the keywords with + // optional arguments, we eagerly look for a semicolon or the + // possibility to insert one. + + if (this.eat(types$1.semi) || this.insertSemicolon()) { node.argument = null; } + else { node.argument = this.parseExpression(); this.semicolon(); } + return this.finishNode(node, "ReturnStatement") + }; + + pp$8.parseSwitchStatement = function(node) { + this.next(); + node.discriminant = this.parseParenExpression(); + node.cases = []; + this.expect(types$1.braceL); + this.labels.push(switchLabel); + this.enterScope(0); + + // Statements under must be grouped (by label) in SwitchCase + // nodes. `cur` is used to keep the node that we are currently + // adding statements to. + + var cur; + for (var sawDefault = false; this.type !== types$1.braceR;) { + if (this.type === types$1._case || this.type === types$1._default) { + var isCase = this.type === types$1._case; + if (cur) { this.finishNode(cur, "SwitchCase"); } + node.cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + if (isCase) { + cur.test = this.parseExpression(); + } else { + if (sawDefault) { this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); } + sawDefault = true; + cur.test = null; + } + this.expect(types$1.colon); + } else { + if (!cur) { this.unexpected(); } + cur.consequent.push(this.parseStatement(null)); + } + } + this.exitScope(); + if (cur) { this.finishNode(cur, "SwitchCase"); } + this.next(); // Closing brace + this.labels.pop(); + return this.finishNode(node, "SwitchStatement") + }; + + pp$8.parseThrowStatement = function(node) { + this.next(); + if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) + { this.raise(this.lastTokEnd, "Illegal newline after throw"); } + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement") + }; + + // Reused empty array added for node fields that are always empty. + + var empty$1 = []; + + pp$8.parseTryStatement = function(node) { + this.next(); + node.block = this.parseBlock(); + node.handler = null; + if (this.type === types$1._catch) { + var clause = this.startNode(); + this.next(); + if (this.eat(types$1.parenL)) { + clause.param = this.parseBindingAtom(); + var simple = clause.param.type === "Identifier"; + this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0); + this.checkLValPattern(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL); + this.expect(types$1.parenR); + } else { + if (this.options.ecmaVersion < 10) { this.unexpected(); } + clause.param = null; + this.enterScope(0); + } + clause.body = this.parseBlock(false); + this.exitScope(); + node.handler = this.finishNode(clause, "CatchClause"); + } + node.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null; + if (!node.handler && !node.finalizer) + { this.raise(node.start, "Missing catch or finally clause"); } + return this.finishNode(node, "TryStatement") + }; + + pp$8.parseVarStatement = function(node, kind) { + this.next(); + this.parseVar(node, false, kind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration") + }; + + pp$8.parseWhileStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + this.labels.push(loopLabel); + node.body = this.parseStatement("while"); + this.labels.pop(); + return this.finishNode(node, "WhileStatement") + }; + + pp$8.parseWithStatement = function(node) { + if (this.strict) { this.raise(this.start, "'with' in strict mode"); } + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement("with"); + return this.finishNode(node, "WithStatement") + }; + + pp$8.parseEmptyStatement = function(node) { + this.next(); + return this.finishNode(node, "EmptyStatement") + }; + + pp$8.parseLabeledStatement = function(node, maybeName, expr, context) { + for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1) + { + var label = list[i$1]; + + if (label.name === maybeName) + { this.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } } + var kind = this.type.isLoop ? "loop" : this.type === types$1._switch ? "switch" : null; + for (var i = this.labels.length - 1; i >= 0; i--) { + var label$1 = this.labels[i]; + if (label$1.statementStart === node.start) { + // Update information about previous labels on this node + label$1.statementStart = this.start; + label$1.kind = kind; + } else { break } + } + this.labels.push({name: maybeName, kind: kind, statementStart: this.start}); + node.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label"); + this.labels.pop(); + node.label = expr; + return this.finishNode(node, "LabeledStatement") + }; + + pp$8.parseExpressionStatement = function(node, expr) { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") + }; + + // Parse a semicolon-enclosed block of statements, handling `"use + // strict"` declarations when `allowStrict` is true (used for + // function bodies). + + pp$8.parseBlock = function(createNewLexicalScope, node, exitStrict) { + if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true; + if ( node === void 0 ) node = this.startNode(); + + node.body = []; + this.expect(types$1.braceL); + if (createNewLexicalScope) { this.enterScope(0); } + while (this.type !== types$1.braceR) { + var stmt = this.parseStatement(null); + node.body.push(stmt); + } + if (exitStrict) { this.strict = false; } + this.next(); + if (createNewLexicalScope) { this.exitScope(); } + return this.finishNode(node, "BlockStatement") + }; + + // Parse a regular `for` loop. The disambiguation code in + // `parseStatement` will already have parsed the init statement or + // expression. + + pp$8.parseFor = function(node, init) { + node.init = init; + this.expect(types$1.semi); + node.test = this.type === types$1.semi ? null : this.parseExpression(); + this.expect(types$1.semi); + node.update = this.type === types$1.parenR ? null : this.parseExpression(); + this.expect(types$1.parenR); + node.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node, "ForStatement") + }; + + // Parse a `for`/`in` and `for`/`of` loop, which are almost + // same from parser's perspective. + + pp$8.parseForIn = function(node, init) { + var isForIn = this.type === types$1._in; + this.next(); + + if ( + init.type === "VariableDeclaration" && + init.declarations[0].init != null && + ( + !isForIn || + this.options.ecmaVersion < 8 || + this.strict || + init.kind !== "var" || + init.declarations[0].id.type !== "Identifier" + ) + ) { + this.raise( + init.start, + ((isForIn ? "for-in" : "for-of") + " loop variable declaration may not have an initializer") + ); + } + node.left = init; + node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign(); + this.expect(types$1.parenR); + node.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node, isForIn ? "ForInStatement" : "ForOfStatement") + }; + + // Parse a list of variable declarations. + + pp$8.parseVar = function(node, isFor, kind) { + node.declarations = []; + node.kind = kind; + for (;;) { + var decl = this.startNode(); + this.parseVarId(decl, kind); + if (this.eat(types$1.eq)) { + decl.init = this.parseMaybeAssign(isFor); + } else if (kind === "const" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of")))) { + this.unexpected(); + } else if (decl.id.type !== "Identifier" && !(isFor && (this.type === types$1._in || this.isContextual("of")))) { + this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value"); + } else { + decl.init = null; + } + node.declarations.push(this.finishNode(decl, "VariableDeclarator")); + if (!this.eat(types$1.comma)) { break } + } + return node + }; + + pp$8.parseVarId = function(decl, kind) { + decl.id = this.parseBindingAtom(); + this.checkLValPattern(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); + }; + + var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4; + + // Parse a function declaration or literal (depending on the + // `statement & FUNC_STATEMENT`). + + // Remove `allowExpressionBody` for 7.0.0, as it is only called with false + pp$8.parseFunction = function(node, statement, allowExpressionBody, isAsync, forInit) { + this.initFunction(node); + if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) { + if (this.type === types$1.star && (statement & FUNC_HANGING_STATEMENT)) + { this.unexpected(); } + node.generator = this.eat(types$1.star); + } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + if (statement & FUNC_STATEMENT) { + node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types$1.name ? null : this.parseIdent(); + if (node.id && !(statement & FUNC_HANGING_STATEMENT)) + // If it is a regular function declaration in sloppy mode, then it is + // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding + // mode depends on properties of the current scope (see + // treatFunctionsAsVar). + { this.checkLValSimple(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); } + } + + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(node.async, node.generator)); + + if (!(statement & FUNC_STATEMENT)) + { node.id = this.type === types$1.name ? this.parseIdent() : null; } + + this.parseFunctionParams(node); + this.parseFunctionBody(node, allowExpressionBody, false, forInit); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, (statement & FUNC_STATEMENT) ? "FunctionDeclaration" : "FunctionExpression") + }; + + pp$8.parseFunctionParams = function(node) { + this.expect(types$1.parenL); + node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + }; + + // Parse a class declaration or literal (depending on the + // `isStatement` parameter). + + pp$8.parseClass = function(node, isStatement) { + this.next(); + + // ecma-262 14.6 Class Definitions + // A class definition is always strict mode code. + var oldStrict = this.strict; + this.strict = true; + + this.parseClassId(node, isStatement); + this.parseClassSuper(node); + var privateNameMap = this.enterClassBody(); + var classBody = this.startNode(); + var hadConstructor = false; + classBody.body = []; + this.expect(types$1.braceL); + while (this.type !== types$1.braceR) { + var element = this.parseClassElement(node.superClass !== null); + if (element) { + classBody.body.push(element); + if (element.type === "MethodDefinition" && element.kind === "constructor") { + if (hadConstructor) { this.raise(element.start, "Duplicate constructor in the same class"); } + hadConstructor = true; + } else if (element.key && element.key.type === "PrivateIdentifier" && isPrivateNameConflicted(privateNameMap, element)) { + this.raiseRecoverable(element.key.start, ("Identifier '#" + (element.key.name) + "' has already been declared")); + } + } + } + this.strict = oldStrict; + this.next(); + node.body = this.finishNode(classBody, "ClassBody"); + this.exitClassBody(); + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") + }; + + pp$8.parseClassElement = function(constructorAllowsSuper) { + if (this.eat(types$1.semi)) { return null } + + var ecmaVersion = this.options.ecmaVersion; + var node = this.startNode(); + var keyName = ""; + var isGenerator = false; + var isAsync = false; + var kind = "method"; + var isStatic = false; + + if (this.eatContextual("static")) { + // Parse static init block + if (ecmaVersion >= 13 && this.eat(types$1.braceL)) { + this.parseClassStaticBlock(node); + return node + } + if (this.isClassElementNameStart() || this.type === types$1.star) { + isStatic = true; + } else { + keyName = "static"; + } + } + node.static = isStatic; + if (!keyName && ecmaVersion >= 8 && this.eatContextual("async")) { + if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) { + isAsync = true; + } else { + keyName = "async"; + } + } + if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) { + isGenerator = true; + } + if (!keyName && !isAsync && !isGenerator) { + var lastValue = this.value; + if (this.eatContextual("get") || this.eatContextual("set")) { + if (this.isClassElementNameStart()) { + kind = lastValue; + } else { + keyName = lastValue; + } + } + } + + // Parse element name + if (keyName) { + // 'async', 'get', 'set', or 'static' were not a keyword contextually. + // The last token is any of those. Make it the element name. + node.computed = false; + node.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc); + node.key.name = keyName; + this.finishNode(node.key, "Identifier"); + } else { + this.parseClassElementName(node); + } + + // Parse element value + if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== "method" || isGenerator || isAsync) { + var isConstructor = !node.static && checkKeyName(node, "constructor"); + var allowsDirectSuper = isConstructor && constructorAllowsSuper; + // Couldn't move this check into the 'parseClassMethod' method for backward compatibility. + if (isConstructor && kind !== "method") { this.raise(node.key.start, "Constructor can't have get/set modifier"); } + node.kind = isConstructor ? "constructor" : kind; + this.parseClassMethod(node, isGenerator, isAsync, allowsDirectSuper); + } else { + this.parseClassField(node); + } + + return node + }; + + pp$8.isClassElementNameStart = function() { + return ( + this.type === types$1.name || + this.type === types$1.privateId || + this.type === types$1.num || + this.type === types$1.string || + this.type === types$1.bracketL || + this.type.keyword + ) + }; + + pp$8.parseClassElementName = function(element) { + if (this.type === types$1.privateId) { + if (this.value === "constructor") { + this.raise(this.start, "Classes can't have an element named '#constructor'"); + } + element.computed = false; + element.key = this.parsePrivateIdent(); + } else { + this.parsePropertyName(element); + } + }; + + pp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) { + // Check key and flags + var key = method.key; + if (method.kind === "constructor") { + if (isGenerator) { this.raise(key.start, "Constructor can't be a generator"); } + if (isAsync) { this.raise(key.start, "Constructor can't be an async method"); } + } else if (method.static && checkKeyName(method, "prototype")) { + this.raise(key.start, "Classes may not have a static property named prototype"); + } + + // Parse value + var value = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper); + + // Check value + if (method.kind === "get" && value.params.length !== 0) + { this.raiseRecoverable(value.start, "getter should have no params"); } + if (method.kind === "set" && value.params.length !== 1) + { this.raiseRecoverable(value.start, "setter should have exactly one param"); } + if (method.kind === "set" && value.params[0].type === "RestElement") + { this.raiseRecoverable(value.params[0].start, "Setter cannot use rest params"); } + + return this.finishNode(method, "MethodDefinition") + }; + + pp$8.parseClassField = function(field) { + if (checkKeyName(field, "constructor")) { + this.raise(field.key.start, "Classes can't have a field named 'constructor'"); + } else if (field.static && checkKeyName(field, "prototype")) { + this.raise(field.key.start, "Classes can't have a static field named 'prototype'"); + } + + if (this.eat(types$1.eq)) { + // To raise SyntaxError if 'arguments' exists in the initializer. + var scope = this.currentThisScope(); + var inClassFieldInit = scope.inClassFieldInit; + scope.inClassFieldInit = true; + field.value = this.parseMaybeAssign(); + scope.inClassFieldInit = inClassFieldInit; + } else { + field.value = null; + } + this.semicolon(); + + return this.finishNode(field, "PropertyDefinition") + }; + + pp$8.parseClassStaticBlock = function(node) { + node.body = []; + + var oldLabels = this.labels; + this.labels = []; + this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER); + while (this.type !== types$1.braceR) { + var stmt = this.parseStatement(null); + node.body.push(stmt); + } + this.next(); + this.exitScope(); + this.labels = oldLabels; + + return this.finishNode(node, "StaticBlock") + }; + + pp$8.parseClassId = function(node, isStatement) { + if (this.type === types$1.name) { + node.id = this.parseIdent(); + if (isStatement) + { this.checkLValSimple(node.id, BIND_LEXICAL, false); } + } else { + if (isStatement === true) + { this.unexpected(); } + node.id = null; + } + }; + + pp$8.parseClassSuper = function(node) { + node.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(false) : null; + }; + + pp$8.enterClassBody = function() { + var element = {declared: Object.create(null), used: []}; + this.privateNameStack.push(element); + return element.declared + }; + + pp$8.exitClassBody = function() { + var ref = this.privateNameStack.pop(); + var declared = ref.declared; + var used = ref.used; + var len = this.privateNameStack.length; + var parent = len === 0 ? null : this.privateNameStack[len - 1]; + for (var i = 0; i < used.length; ++i) { + var id = used[i]; + if (!hasOwn(declared, id.name)) { + if (parent) { + parent.used.push(id); + } else { + this.raiseRecoverable(id.start, ("Private field '#" + (id.name) + "' must be declared in an enclosing class")); + } + } + } + }; + + function isPrivateNameConflicted(privateNameMap, element) { + var name = element.key.name; + var curr = privateNameMap[name]; + + var next = "true"; + if (element.type === "MethodDefinition" && (element.kind === "get" || element.kind === "set")) { + next = (element.static ? "s" : "i") + element.kind; + } + + // `class { get #a(){}; static set #a(_){} }` is also conflict. + if ( + curr === "iget" && next === "iset" || + curr === "iset" && next === "iget" || + curr === "sget" && next === "sset" || + curr === "sset" && next === "sget" + ) { + privateNameMap[name] = "true"; + return false + } else if (!curr) { + privateNameMap[name] = next; + return false + } else { + return true + } + } + + function checkKeyName(node, name) { + var computed = node.computed; + var key = node.key; + return !computed && ( + key.type === "Identifier" && key.name === name || + key.type === "Literal" && key.value === name + ) + } + + // Parses module export declaration. + + pp$8.parseExport = function(node, exports) { + this.next(); + // export * from '...' + if (this.eat(types$1.star)) { + if (this.options.ecmaVersion >= 11) { + if (this.eatContextual("as")) { + node.exported = this.parseModuleExportName(); + this.checkExport(exports, node.exported, this.lastTokStart); + } else { + node.exported = null; + } + } + this.expectContextual("from"); + if (this.type !== types$1.string) { this.unexpected(); } + node.source = this.parseExprAtom(); + this.semicolon(); + return this.finishNode(node, "ExportAllDeclaration") + } + if (this.eat(types$1._default)) { // export default ... + this.checkExport(exports, "default", this.lastTokStart); + var isAsync; + if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { this.next(); } + node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync); + } else if (this.type === types$1._class) { + var cNode = this.startNode(); + node.declaration = this.parseClass(cNode, "nullableID"); + } else { + node.declaration = this.parseMaybeAssign(); + this.semicolon(); + } + return this.finishNode(node, "ExportDefaultDeclaration") + } + // export var|const|let|function|class ... + if (this.shouldParseExportStatement()) { + node.declaration = this.parseStatement(null); + if (node.declaration.type === "VariableDeclaration") + { this.checkVariableExport(exports, node.declaration.declarations); } + else + { this.checkExport(exports, node.declaration.id, node.declaration.id.start); } + node.specifiers = []; + node.source = null; + } else { // export { x, y as z } [from '...'] + node.declaration = null; + node.specifiers = this.parseExportSpecifiers(exports); + if (this.eatContextual("from")) { + if (this.type !== types$1.string) { this.unexpected(); } + node.source = this.parseExprAtom(); + } else { + for (var i = 0, list = node.specifiers; i < list.length; i += 1) { + // check for keywords used as local names + var spec = list[i]; + + this.checkUnreserved(spec.local); + // check if export is defined + this.checkLocalExport(spec.local); + + if (spec.local.type === "Literal") { + this.raise(spec.local.start, "A string literal cannot be used as an exported binding without `from`."); + } + } + + node.source = null; + } + this.semicolon(); + } + return this.finishNode(node, "ExportNamedDeclaration") + }; + + pp$8.checkExport = function(exports, name, pos) { + if (!exports) { return } + if (typeof name !== "string") + { name = name.type === "Identifier" ? name.name : name.value; } + if (hasOwn(exports, name)) + { this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); } + exports[name] = true; + }; + + pp$8.checkPatternExport = function(exports, pat) { + var type = pat.type; + if (type === "Identifier") + { this.checkExport(exports, pat, pat.start); } + else if (type === "ObjectPattern") + { for (var i = 0, list = pat.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this.checkPatternExport(exports, prop); + } } + else if (type === "ArrayPattern") + { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) { + var elt = list$1[i$1]; + + if (elt) { this.checkPatternExport(exports, elt); } + } } + else if (type === "Property") + { this.checkPatternExport(exports, pat.value); } + else if (type === "AssignmentPattern") + { this.checkPatternExport(exports, pat.left); } + else if (type === "RestElement") + { this.checkPatternExport(exports, pat.argument); } + else if (type === "ParenthesizedExpression") + { this.checkPatternExport(exports, pat.expression); } + }; + + pp$8.checkVariableExport = function(exports, decls) { + if (!exports) { return } + for (var i = 0, list = decls; i < list.length; i += 1) + { + var decl = list[i]; + + this.checkPatternExport(exports, decl.id); + } + }; + + pp$8.shouldParseExportStatement = function() { + return this.type.keyword === "var" || + this.type.keyword === "const" || + this.type.keyword === "class" || + this.type.keyword === "function" || + this.isLet() || + this.isAsyncFunction() + }; + + // Parses a comma-separated list of module exports. + + pp$8.parseExportSpecifiers = function(exports) { + var nodes = [], first = true; + // export { x, y as z } [from '...'] + this.expect(types$1.braceL); + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { break } + } else { first = false; } + + var node = this.startNode(); + node.local = this.parseModuleExportName(); + node.exported = this.eatContextual("as") ? this.parseModuleExportName() : node.local; + this.checkExport( + exports, + node.exported, + node.exported.start + ); + nodes.push(this.finishNode(node, "ExportSpecifier")); + } + return nodes + }; + + // Parses import declaration. + + pp$8.parseImport = function(node) { + this.next(); + // import '...' + if (this.type === types$1.string) { + node.specifiers = empty$1; + node.source = this.parseExprAtom(); + } else { + node.specifiers = this.parseImportSpecifiers(); + this.expectContextual("from"); + node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected(); + } + this.semicolon(); + return this.finishNode(node, "ImportDeclaration") + }; + + // Parses a comma-separated list of module imports. + + pp$8.parseImportSpecifiers = function() { + var nodes = [], first = true; + if (this.type === types$1.name) { + // import defaultObj, { x, y as z } from '...' + var node = this.startNode(); + node.local = this.parseIdent(); + this.checkLValSimple(node.local, BIND_LEXICAL); + nodes.push(this.finishNode(node, "ImportDefaultSpecifier")); + if (!this.eat(types$1.comma)) { return nodes } + } + if (this.type === types$1.star) { + var node$1 = this.startNode(); + this.next(); + this.expectContextual("as"); + node$1.local = this.parseIdent(); + this.checkLValSimple(node$1.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier")); + return nodes + } + this.expect(types$1.braceL); + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { break } + } else { first = false; } + + var node$2 = this.startNode(); + node$2.imported = this.parseModuleExportName(); + if (this.eatContextual("as")) { + node$2.local = this.parseIdent(); + } else { + this.checkUnreserved(node$2.imported); + node$2.local = node$2.imported; + } + this.checkLValSimple(node$2.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$2, "ImportSpecifier")); + } + return nodes + }; + + pp$8.parseModuleExportName = function() { + if (this.options.ecmaVersion >= 13 && this.type === types$1.string) { + var stringLiteral = this.parseLiteral(this.value); + if (loneSurrogate.test(stringLiteral.value)) { + this.raise(stringLiteral.start, "An export name cannot include a lone surrogate."); + } + return stringLiteral + } + return this.parseIdent(true) + }; + + // Set `ExpressionStatement#directive` property for directive prologues. + pp$8.adaptDirectivePrologue = function(statements) { + for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) { + statements[i].directive = statements[i].expression.raw.slice(1, -1); + } + }; + pp$8.isDirectiveCandidate = function(statement) { + return ( + statement.type === "ExpressionStatement" && + statement.expression.type === "Literal" && + typeof statement.expression.value === "string" && + // Reject parenthesized strings. + (this.input[statement.start] === "\"" || this.input[statement.start] === "'") + ) + }; + + var pp$7 = Parser.prototype; + + // Convert existing expression atom to assignable pattern + // if possible. + + pp$7.toAssignable = function(node, isBinding, refDestructuringErrors) { + if (this.options.ecmaVersion >= 6 && node) { + switch (node.type) { + case "Identifier": + if (this.inAsync && node.name === "await") + { this.raise(node.start, "Cannot use 'await' as identifier inside an async function"); } + break + + case "ObjectPattern": + case "ArrayPattern": + case "AssignmentPattern": + case "RestElement": + break + + case "ObjectExpression": + node.type = "ObjectPattern"; + if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + this.toAssignable(prop, isBinding); + // Early error: + // AssignmentRestProperty[Yield, Await] : + // `...` DestructuringAssignmentTarget[Yield, Await] + // + // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|. + if ( + prop.type === "RestElement" && + (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern") + ) { + this.raise(prop.argument.start, "Unexpected token"); + } + } + break + + case "Property": + // AssignmentProperty has type === "Property" + if (node.kind !== "init") { this.raise(node.key.start, "Object pattern can't contain getter or setter"); } + this.toAssignable(node.value, isBinding); + break + + case "ArrayExpression": + node.type = "ArrayPattern"; + if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + this.toAssignableList(node.elements, isBinding); + break + + case "SpreadElement": + node.type = "RestElement"; + this.toAssignable(node.argument, isBinding); + if (node.argument.type === "AssignmentPattern") + { this.raise(node.argument.start, "Rest elements cannot have a default value"); } + break + + case "AssignmentExpression": + if (node.operator !== "=") { this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); } + node.type = "AssignmentPattern"; + delete node.operator; + this.toAssignable(node.left, isBinding); + break + + case "ParenthesizedExpression": + this.toAssignable(node.expression, isBinding, refDestructuringErrors); + break + + case "ChainExpression": + this.raiseRecoverable(node.start, "Optional chaining cannot appear in left-hand side"); + break + + case "MemberExpression": + if (!isBinding) { break } + + default: + this.raise(node.start, "Assigning to rvalue"); + } + } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + return node + }; + + // Convert list of expression atoms to binding list. + + pp$7.toAssignableList = function(exprList, isBinding) { + var end = exprList.length; + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + if (elt) { this.toAssignable(elt, isBinding); } + } + if (end) { + var last = exprList[end - 1]; + if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") + { this.unexpected(last.argument.start); } + } + return exprList + }; + + // Parses spread element. + + pp$7.parseSpread = function(refDestructuringErrors) { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeAssign(false, refDestructuringErrors); + return this.finishNode(node, "SpreadElement") + }; + + pp$7.parseRestBinding = function() { + var node = this.startNode(); + this.next(); + + // RestElement inside of a function parameter must be an identifier + if (this.options.ecmaVersion === 6 && this.type !== types$1.name) + { this.unexpected(); } + + node.argument = this.parseBindingAtom(); + + return this.finishNode(node, "RestElement") + }; + + // Parses lvalue (assignable) atom. + + pp$7.parseBindingAtom = function() { + if (this.options.ecmaVersion >= 6) { + switch (this.type) { + case types$1.bracketL: + var node = this.startNode(); + this.next(); + node.elements = this.parseBindingList(types$1.bracketR, true, true); + return this.finishNode(node, "ArrayPattern") + + case types$1.braceL: + return this.parseObj(true) + } + } + return this.parseIdent() + }; + + pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma) { + var elts = [], first = true; + while (!this.eat(close)) { + if (first) { first = false; } + else { this.expect(types$1.comma); } + if (allowEmpty && this.type === types$1.comma) { + elts.push(null); + } else if (allowTrailingComma && this.afterTrailingComma(close)) { + break + } else if (this.type === types$1.ellipsis) { + var rest = this.parseRestBinding(); + this.parseBindingListItem(rest); + elts.push(rest); + if (this.type === types$1.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); } + this.expect(close); + break + } else { + var elem = this.parseMaybeDefault(this.start, this.startLoc); + this.parseBindingListItem(elem); + elts.push(elem); + } + } + return elts + }; + + pp$7.parseBindingListItem = function(param) { + return param + }; + + // Parses assignment pattern around given atom if possible. + + pp$7.parseMaybeDefault = function(startPos, startLoc, left) { + left = left || this.parseBindingAtom(); + if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { return left } + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.right = this.parseMaybeAssign(); + return this.finishNode(node, "AssignmentPattern") + }; + + // The following three functions all verify that a node is an lvalue — + // something that can be bound, or assigned to. In order to do so, they perform + // a variety of checks: + // + // - Check that none of the bound/assigned-to identifiers are reserved words. + // - Record name declarations for bindings in the appropriate scope. + // - Check duplicate argument names, if checkClashes is set. + // + // If a complex binding pattern is encountered (e.g., object and array + // destructuring), the entire pattern is recursively checked. + // + // There are three versions of checkLVal*() appropriate for different + // circumstances: + // + // - checkLValSimple() shall be used if the syntactic construct supports + // nothing other than identifiers and member expressions. Parenthesized + // expressions are also correctly handled. This is generally appropriate for + // constructs for which the spec says + // + // > It is a Syntax Error if AssignmentTargetType of [the production] is not + // > simple. + // + // It is also appropriate for checking if an identifier is valid and not + // defined elsewhere, like import declarations or function/class identifiers. + // + // Examples where this is used include: + // a += …; + // import a from '…'; + // where a is the node to be checked. + // + // - checkLValPattern() shall be used if the syntactic construct supports + // anything checkLValSimple() supports, as well as object and array + // destructuring patterns. This is generally appropriate for constructs for + // which the spec says + // + // > It is a Syntax Error if [the production] is neither an ObjectLiteral nor + // > an ArrayLiteral and AssignmentTargetType of [the production] is not + // > simple. + // + // Examples where this is used include: + // (a = …); + // const a = …; + // try { … } catch (a) { … } + // where a is the node to be checked. + // + // - checkLValInnerPattern() shall be used if the syntactic construct supports + // anything checkLValPattern() supports, as well as default assignment + // patterns, rest elements, and other constructs that may appear within an + // object or array destructuring pattern. + // + // As a special case, function parameters also use checkLValInnerPattern(), + // as they also support defaults and rest constructs. + // + // These functions deliberately support both assignment and binding constructs, + // as the logic for both is exceedingly similar. If the node is the target of + // an assignment, then bindingType should be set to BIND_NONE. Otherwise, it + // should be set to the appropriate BIND_* constant, like BIND_VAR or + // BIND_LEXICAL. + // + // If the function is called with a non-BIND_NONE bindingType, then + // additionally a checkClashes object may be specified to allow checking for + // duplicate argument names. checkClashes is ignored if the provided construct + // is an assignment (i.e., bindingType is BIND_NONE). + + pp$7.checkLValSimple = function(expr, bindingType, checkClashes) { + if ( bindingType === void 0 ) bindingType = BIND_NONE; + + var isBind = bindingType !== BIND_NONE; + + switch (expr.type) { + case "Identifier": + if (this.strict && this.reservedWordsStrictBind.test(expr.name)) + { this.raiseRecoverable(expr.start, (isBind ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); } + if (isBind) { + if (bindingType === BIND_LEXICAL && expr.name === "let") + { this.raiseRecoverable(expr.start, "let is disallowed as a lexically bound name"); } + if (checkClashes) { + if (hasOwn(checkClashes, expr.name)) + { this.raiseRecoverable(expr.start, "Argument name clash"); } + checkClashes[expr.name] = true; + } + if (bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); } + } + break + + case "ChainExpression": + this.raiseRecoverable(expr.start, "Optional chaining cannot appear in left-hand side"); + break + + case "MemberExpression": + if (isBind) { this.raiseRecoverable(expr.start, "Binding member expression"); } + break + + case "ParenthesizedExpression": + if (isBind) { this.raiseRecoverable(expr.start, "Binding parenthesized expression"); } + return this.checkLValSimple(expr.expression, bindingType, checkClashes) + + default: + this.raise(expr.start, (isBind ? "Binding" : "Assigning to") + " rvalue"); + } + }; + + pp$7.checkLValPattern = function(expr, bindingType, checkClashes) { + if ( bindingType === void 0 ) bindingType = BIND_NONE; + + switch (expr.type) { + case "ObjectPattern": + for (var i = 0, list = expr.properties; i < list.length; i += 1) { + var prop = list[i]; + + this.checkLValInnerPattern(prop, bindingType, checkClashes); + } + break + + case "ArrayPattern": + for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) { + var elem = list$1[i$1]; + + if (elem) { this.checkLValInnerPattern(elem, bindingType, checkClashes); } + } + break + + default: + this.checkLValSimple(expr, bindingType, checkClashes); + } + }; + + pp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) { + if ( bindingType === void 0 ) bindingType = BIND_NONE; + + switch (expr.type) { + case "Property": + // AssignmentProperty has type === "Property" + this.checkLValInnerPattern(expr.value, bindingType, checkClashes); + break + + case "AssignmentPattern": + this.checkLValPattern(expr.left, bindingType, checkClashes); + break + + case "RestElement": + this.checkLValPattern(expr.argument, bindingType, checkClashes); + break + + default: + this.checkLValPattern(expr, bindingType, checkClashes); + } + }; + + // The algorithm used to determine whether a regexp can appear at a + + var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) { + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; + this.generator = !!generator; + }; + + var types = { + b_stat: new TokContext("{", false), + b_expr: new TokContext("{", true), + b_tmpl: new TokContext("${", false), + p_stat: new TokContext("(", false), + p_expr: new TokContext("(", true), + q_tmpl: new TokContext("`", true, true, function (p) { return p.tryReadTemplateToken(); }), + f_stat: new TokContext("function", false), + f_expr: new TokContext("function", true), + f_expr_gen: new TokContext("function", true, false, null, true), + f_gen: new TokContext("function", false, false, null, true) + }; + + var pp$6 = Parser.prototype; + + pp$6.initialContext = function() { + return [types.b_stat] + }; + + pp$6.curContext = function() { + return this.context[this.context.length - 1] + }; + + pp$6.braceIsBlock = function(prevType) { + var parent = this.curContext(); + if (parent === types.f_expr || parent === types.f_stat) + { return true } + if (prevType === types$1.colon && (parent === types.b_stat || parent === types.b_expr)) + { return !parent.isExpr } + + // The check for `tt.name && exprAllowed` detects whether we are + // after a `yield` or `of` construct. See the `updateContext` for + // `tt.name`. + if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed) + { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) } + if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow) + { return true } + if (prevType === types$1.braceL) + { return parent === types.b_stat } + if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name) + { return false } + return !this.exprAllowed + }; + + pp$6.inGeneratorContext = function() { + for (var i = this.context.length - 1; i >= 1; i--) { + var context = this.context[i]; + if (context.token === "function") + { return context.generator } + } + return false + }; + + pp$6.updateContext = function(prevType) { + var update, type = this.type; + if (type.keyword && prevType === types$1.dot) + { this.exprAllowed = false; } + else if (update = type.updateContext) + { update.call(this, prevType); } + else + { this.exprAllowed = type.beforeExpr; } + }; + + // Used to handle egde case when token context could not be inferred correctly in tokenize phase + pp$6.overrideContext = function(tokenCtx) { + if (this.curContext() !== tokenCtx) { + this.context[this.context.length - 1] = tokenCtx; + } + }; + + // Token-specific context update code + + types$1.parenR.updateContext = types$1.braceR.updateContext = function() { + if (this.context.length === 1) { + this.exprAllowed = true; + return + } + var out = this.context.pop(); + if (out === types.b_stat && this.curContext().token === "function") { + out = this.context.pop(); + } + this.exprAllowed = !out.isExpr; + }; + + types$1.braceL.updateContext = function(prevType) { + this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr); + this.exprAllowed = true; + }; + + types$1.dollarBraceL.updateContext = function() { + this.context.push(types.b_tmpl); + this.exprAllowed = true; + }; + + types$1.parenL.updateContext = function(prevType) { + var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while; + this.context.push(statementParens ? types.p_stat : types.p_expr); + this.exprAllowed = true; + }; + + types$1.incDec.updateContext = function() { + // tokExprAllowed stays unchanged + }; + + types$1._function.updateContext = types$1._class.updateContext = function(prevType) { + if (prevType.beforeExpr && prevType !== types$1._else && + !(prevType === types$1.semi && this.curContext() !== types.p_stat) && + !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) && + !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types.b_stat)) + { this.context.push(types.f_expr); } + else + { this.context.push(types.f_stat); } + this.exprAllowed = false; + }; + + types$1.backQuote.updateContext = function() { + if (this.curContext() === types.q_tmpl) + { this.context.pop(); } + else + { this.context.push(types.q_tmpl); } + this.exprAllowed = false; + }; + + types$1.star.updateContext = function(prevType) { + if (prevType === types$1._function) { + var index = this.context.length - 1; + if (this.context[index] === types.f_expr) + { this.context[index] = types.f_expr_gen; } + else + { this.context[index] = types.f_gen; } + } + this.exprAllowed = true; + }; + + types$1.name.updateContext = function(prevType) { + var allowed = false; + if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) { + if (this.value === "of" && !this.exprAllowed || + this.value === "yield" && this.inGeneratorContext()) + { allowed = true; } + } + this.exprAllowed = allowed; + }; + + // A recursive descent parser operates by defining functions for all + + var pp$5 = Parser.prototype; + + // Check if property name clashes with already added. + // Object/class getters and setters are not allowed to clash — + // either with each other or with an init property — and in + // strict mode, init properties are also not allowed to be repeated. + + pp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) { + if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement") + { return } + if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) + { return } + var key = prop.key; + var name; + switch (key.type) { + case "Identifier": name = key.name; break + case "Literal": name = String(key.value); break + default: return + } + var kind = prop.kind; + if (this.options.ecmaVersion >= 6) { + if (name === "__proto__" && kind === "init") { + if (propHash.proto) { + if (refDestructuringErrors) { + if (refDestructuringErrors.doubleProto < 0) { + refDestructuringErrors.doubleProto = key.start; + } + } else { + this.raiseRecoverable(key.start, "Redefinition of __proto__ property"); + } + } + propHash.proto = true; + } + return + } + name = "$" + name; + var other = propHash[name]; + if (other) { + var redefinition; + if (kind === "init") { + redefinition = this.strict && other.init || other.get || other.set; + } else { + redefinition = other.init || other[kind]; + } + if (redefinition) + { this.raiseRecoverable(key.start, "Redefinition of property"); } + } else { + other = propHash[name] = { + init: false, + get: false, + set: false + }; + } + other[kind] = true; + }; + + // ### Expression parsing + + // These nest, from the most general expression type at the top to + // 'atomic', nondivisible expression types at the bottom. Most of + // the functions will simply let the function(s) below them parse, + // and, *if* the syntactic construct they handle is present, wrap + // the AST node that the inner parser gave them in another node. + + // Parse a full expression. The optional arguments are used to + // forbid the `in` operator (in for loops initalization expressions) + // and provide reference for storing '=' operator inside shorthand + // property assignment in contexts where both object expression + // and object pattern might appear (so it's possible to raise + // delayed syntax error at correct position). + + pp$5.parseExpression = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeAssign(forInit, refDestructuringErrors); + if (this.type === types$1.comma) { + var node = this.startNodeAt(startPos, startLoc); + node.expressions = [expr]; + while (this.eat(types$1.comma)) { node.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); } + return this.finishNode(node, "SequenceExpression") + } + return expr + }; + + // Parse an assignment expression. This includes applications of + // operators like `+=`. + + pp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) { + if (this.isContextual("yield")) { + if (this.inGenerator) { return this.parseYield(forInit) } + // The tokenizer will assume an expression is allowed after + // `yield`, but this isn't that kind of yield + else { this.exprAllowed = false; } + } + + var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1; + if (refDestructuringErrors) { + oldParenAssign = refDestructuringErrors.parenthesizedAssign; + oldTrailingComma = refDestructuringErrors.trailingComma; + oldDoubleProto = refDestructuringErrors.doubleProto; + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1; + } else { + refDestructuringErrors = new DestructuringErrors; + ownDestructuringErrors = true; + } + + var startPos = this.start, startLoc = this.startLoc; + if (this.type === types$1.parenL || this.type === types$1.name) { + this.potentialArrowAt = this.start; + this.potentialArrowInForAwait = forInit === "await"; + } + var left = this.parseMaybeConditional(forInit, refDestructuringErrors); + if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); } + if (this.type.isAssign) { + var node = this.startNodeAt(startPos, startLoc); + node.operator = this.value; + if (this.type === types$1.eq) + { left = this.toAssignable(left, false, refDestructuringErrors); } + if (!ownDestructuringErrors) { + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1; + } + if (refDestructuringErrors.shorthandAssign >= left.start) + { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly + if (this.type === types$1.eq) + { this.checkLValPattern(left); } + else + { this.checkLValSimple(left); } + node.left = left; + this.next(); + node.right = this.parseMaybeAssign(forInit); + if (oldDoubleProto > -1) { refDestructuringErrors.doubleProto = oldDoubleProto; } + return this.finishNode(node, "AssignmentExpression") + } else { + if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); } + } + if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; } + if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; } + return left + }; + + // Parse a ternary conditional (`?:`) operator. + + pp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprOps(forInit, refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + if (this.eat(types$1.question)) { + var node = this.startNodeAt(startPos, startLoc); + node.test = expr; + node.consequent = this.parseMaybeAssign(); + this.expect(types$1.colon); + node.alternate = this.parseMaybeAssign(forInit); + return this.finishNode(node, "ConditionalExpression") + } + return expr + }; + + // Start the precedence parser. + + pp$5.parseExprOps = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit) + }; + + // Parse binary operators with the operator precedence parsing + // algorithm. `left` is the left-hand side of the operator. + // `minPrec` provides context that allows the function to stop and + // defer further parser to one of its callers when it encounters an + // operator that has a lower precedence than the set it is parsing. + + pp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) { + var prec = this.type.binop; + if (prec != null && (!forInit || this.type !== types$1._in)) { + if (prec > minPrec) { + var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND; + var coalesce = this.type === types$1.coalesce; + if (coalesce) { + // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions. + // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error. + prec = types$1.logicalAND.binop; + } + var op = this.value; + this.next(); + var startPos = this.start, startLoc = this.startLoc; + var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit); + var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce); + if ((logical && this.type === types$1.coalesce) || (coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND))) { + this.raiseRecoverable(this.start, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses"); + } + return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, forInit) + } + } + return left + }; + + pp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) { + if (right.type === "PrivateIdentifier") { this.raise(right.start, "Private identifier can only be left side of binary expression"); } + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.operator = op; + node.right = right; + return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression") + }; + + // Parse unary operators, both prefix and postfix. + + pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) { + var startPos = this.start, startLoc = this.startLoc, expr; + if (this.isContextual("await") && this.canAwait) { + expr = this.parseAwait(forInit); + sawUnary = true; + } else if (this.type.prefix) { + var node = this.startNode(), update = this.type === types$1.incDec; + node.operator = this.value; + node.prefix = true; + this.next(); + node.argument = this.parseMaybeUnary(null, true, update, forInit); + this.checkExpressionErrors(refDestructuringErrors, true); + if (update) { this.checkLValSimple(node.argument); } + else if (this.strict && node.operator === "delete" && + node.argument.type === "Identifier") + { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); } + else if (node.operator === "delete" && isPrivateFieldAccess(node.argument)) + { this.raiseRecoverable(node.start, "Private fields can not be deleted"); } + else { sawUnary = true; } + expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } else if (!sawUnary && this.type === types$1.privateId) { + if (forInit || this.privateNameStack.length === 0) { this.unexpected(); } + expr = this.parsePrivateIdent(); + // only could be private fields in 'in', such as #x in obj + if (this.type !== types$1._in) { this.unexpected(); } + } else { + expr = this.parseExprSubscripts(refDestructuringErrors, forInit); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + while (this.type.postfix && !this.canInsertSemicolon()) { + var node$1 = this.startNodeAt(startPos, startLoc); + node$1.operator = this.value; + node$1.prefix = false; + node$1.argument = expr; + this.checkLValSimple(expr); + this.next(); + expr = this.finishNode(node$1, "UpdateExpression"); + } + } + + if (!incDec && this.eat(types$1.starstar)) { + if (sawUnary) + { this.unexpected(this.lastTokStart); } + else + { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), "**", false) } + } else { + return expr + } + }; + + function isPrivateFieldAccess(node) { + return ( + node.type === "MemberExpression" && node.property.type === "PrivateIdentifier" || + node.type === "ChainExpression" && isPrivateFieldAccess(node.expression) + ) + } + + // Parse call, dot, and `[]`-subscript expressions. + + pp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprAtom(refDestructuringErrors, forInit); + if (expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")") + { return expr } + var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit); + if (refDestructuringErrors && result.type === "MemberExpression") { + if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; } + if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; } + if (refDestructuringErrors.trailingComma >= result.start) { refDestructuringErrors.trailingComma = -1; } + } + return result + }; + + pp$5.parseSubscripts = function(base, startPos, startLoc, noCalls, forInit) { + var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" && + this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 && + this.potentialArrowAt === base.start; + var optionalChained = false; + + while (true) { + var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit); + + if (element.optional) { optionalChained = true; } + if (element === base || element.type === "ArrowFunctionExpression") { + if (optionalChained) { + var chainNode = this.startNodeAt(startPos, startLoc); + chainNode.expression = element; + element = this.finishNode(chainNode, "ChainExpression"); + } + return element + } + + base = element; + } + }; + + pp$5.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) { + var optionalSupported = this.options.ecmaVersion >= 11; + var optional = optionalSupported && this.eat(types$1.questionDot); + if (noCalls && optional) { this.raise(this.lastTokStart, "Optional chaining cannot appear in the callee of new expressions"); } + + var computed = this.eat(types$1.bracketL); + if (computed || (optional && this.type !== types$1.parenL && this.type !== types$1.backQuote) || this.eat(types$1.dot)) { + var node = this.startNodeAt(startPos, startLoc); + node.object = base; + if (computed) { + node.property = this.parseExpression(); + this.expect(types$1.bracketR); + } else if (this.type === types$1.privateId && base.type !== "Super") { + node.property = this.parsePrivateIdent(); + } else { + node.property = this.parseIdent(this.options.allowReserved !== "never"); + } + node.computed = !!computed; + if (optionalSupported) { + node.optional = optional; + } + base = this.finishNode(node, "MemberExpression"); + } else if (!noCalls && this.eat(types$1.parenL)) { + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors); + if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types$1.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + if (this.awaitIdentPos > 0) + { this.raise(this.awaitIdentPos, "Cannot use 'await' as identifier inside an async function"); } + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit) + } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos; + var node$1 = this.startNodeAt(startPos, startLoc); + node$1.callee = base; + node$1.arguments = exprList; + if (optionalSupported) { + node$1.optional = optional; + } + base = this.finishNode(node$1, "CallExpression"); + } else if (this.type === types$1.backQuote) { + if (optional || optionalChained) { + this.raise(this.start, "Optional chaining cannot appear in the tag of tagged template expressions"); + } + var node$2 = this.startNodeAt(startPos, startLoc); + node$2.tag = base; + node$2.quasi = this.parseTemplate({isTagged: true}); + base = this.finishNode(node$2, "TaggedTemplateExpression"); + } + return base + }; + + // Parse an atomic expression — either a single token that is an + // expression, an expression started by a keyword like `function` or + // `new`, or an expression wrapped in punctuation like `()`, `[]`, + // or `{}`. + + pp$5.parseExprAtom = function(refDestructuringErrors, forInit) { + // If a division operator appears in an expression position, the + // tokenizer got confused, and we force it to read a regexp instead. + if (this.type === types$1.slash) { this.readRegexp(); } + + var node, canBeArrow = this.potentialArrowAt === this.start; + switch (this.type) { + case types$1._super: + if (!this.allowSuper) + { this.raise(this.start, "'super' keyword outside a method"); } + node = this.startNode(); + this.next(); + if (this.type === types$1.parenL && !this.allowDirectSuper) + { this.raise(node.start, "super() call outside constructor of a subclass"); } + // The `super` keyword can appear at below: + // SuperProperty: + // super [ Expression ] + // super . IdentifierName + // SuperCall: + // super ( Arguments ) + if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL) + { this.unexpected(); } + return this.finishNode(node, "Super") + + case types$1._this: + node = this.startNode(); + this.next(); + return this.finishNode(node, "ThisExpression") + + case types$1.name: + var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc; + var id = this.parseIdent(false); + if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types$1._function)) { + this.overrideContext(types.f_expr); + return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit) + } + if (canBeArrow && !this.canInsertSemicolon()) { + if (this.eat(types$1.arrow)) + { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit) } + if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types$1.name && !containsEsc && + (!this.potentialArrowInForAwait || this.value !== "of" || this.containsEsc)) { + id = this.parseIdent(false); + if (this.canInsertSemicolon() || !this.eat(types$1.arrow)) + { this.unexpected(); } + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit) + } + } + return id + + case types$1.regexp: + var value = this.value; + node = this.parseLiteral(value.value); + node.regex = {pattern: value.pattern, flags: value.flags}; + return node + + case types$1.num: case types$1.string: + return this.parseLiteral(this.value) + + case types$1._null: case types$1._true: case types$1._false: + node = this.startNode(); + node.value = this.type === types$1._null ? null : this.type === types$1._true; + node.raw = this.type.keyword; + this.next(); + return this.finishNode(node, "Literal") + + case types$1.parenL: + var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit); + if (refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr)) + { refDestructuringErrors.parenthesizedAssign = start; } + if (refDestructuringErrors.parenthesizedBind < 0) + { refDestructuringErrors.parenthesizedBind = start; } + } + return expr + + case types$1.bracketL: + node = this.startNode(); + this.next(); + node.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors); + return this.finishNode(node, "ArrayExpression") + + case types$1.braceL: + this.overrideContext(types.b_expr); + return this.parseObj(false, refDestructuringErrors) + + case types$1._function: + node = this.startNode(); + this.next(); + return this.parseFunction(node, 0) + + case types$1._class: + return this.parseClass(this.startNode(), false) + + case types$1._new: + return this.parseNew() + + case types$1.backQuote: + return this.parseTemplate() + + case types$1._import: + if (this.options.ecmaVersion >= 11) { + return this.parseExprImport() + } else { + return this.unexpected() + } + + default: + this.unexpected(); + } + }; + + pp$5.parseExprImport = function() { + var node = this.startNode(); + + // Consume `import` as an identifier for `import.meta`. + // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`. + if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword import"); } + var meta = this.parseIdent(true); + + switch (this.type) { + case types$1.parenL: + return this.parseDynamicImport(node) + case types$1.dot: + node.meta = meta; + return this.parseImportMeta(node) + default: + this.unexpected(); + } + }; + + pp$5.parseDynamicImport = function(node) { + this.next(); // skip `(` + + // Parse node.source. + node.source = this.parseMaybeAssign(); + + // Verify ending. + if (!this.eat(types$1.parenR)) { + var errorPos = this.start; + if (this.eat(types$1.comma) && this.eat(types$1.parenR)) { + this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); + } else { + this.unexpected(errorPos); + } + } + + return this.finishNode(node, "ImportExpression") + }; + + pp$5.parseImportMeta = function(node) { + this.next(); // skip `.` + + var containsEsc = this.containsEsc; + node.property = this.parseIdent(true); + + if (node.property.name !== "meta") + { this.raiseRecoverable(node.property.start, "The only valid meta property for import is 'import.meta'"); } + if (containsEsc) + { this.raiseRecoverable(node.start, "'import.meta' must not contain escaped characters"); } + if (this.options.sourceType !== "module" && !this.options.allowImportExportEverywhere) + { this.raiseRecoverable(node.start, "Cannot use 'import.meta' outside a module"); } + + return this.finishNode(node, "MetaProperty") + }; + + pp$5.parseLiteral = function(value) { + var node = this.startNode(); + node.value = value; + node.raw = this.input.slice(this.start, this.end); + if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, ""); } + this.next(); + return this.finishNode(node, "Literal") + }; + + pp$5.parseParenExpression = function() { + this.expect(types$1.parenL); + var val = this.parseExpression(); + this.expect(types$1.parenR); + return val + }; + + pp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) { + var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8; + if (this.options.ecmaVersion >= 6) { + this.next(); + + var innerStartPos = this.start, innerStartLoc = this.startLoc; + var exprList = [], first = true, lastIsComma = false; + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart; + this.yieldPos = 0; + this.awaitPos = 0; + // Do not save awaitIdentPos to allow checking awaits nested in parameters + while (this.type !== types$1.parenR) { + first ? first = false : this.expect(types$1.comma); + if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) { + lastIsComma = true; + break + } else if (this.type === types$1.ellipsis) { + spreadStart = this.start; + exprList.push(this.parseParenItem(this.parseRestBinding())); + if (this.type === types$1.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); } + break + } else { + exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem)); + } + } + var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc; + this.expect(types$1.parenR); + + if (canBeArrow && !this.canInsertSemicolon() && this.eat(types$1.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.parseParenArrowList(startPos, startLoc, exprList, forInit) + } + + if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); } + if (spreadStart) { this.unexpected(spreadStart); } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + } else { + val = this.parseParenExpression(); + } + + if (this.options.preserveParens) { + var par = this.startNodeAt(startPos, startLoc); + par.expression = val; + return this.finishNode(par, "ParenthesizedExpression") + } else { + return val + } + }; + + pp$5.parseParenItem = function(item) { + return item + }; + + pp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit) + }; + + // New's precedence is slightly tricky. It must allow its argument to + // be a `[]` or dot subscript expression, but not a call — at least, + // not without wrapping it in parentheses. Thus, it uses the noCalls + // argument to parseSubscripts to prevent it from consuming the + // argument list. + + var empty = []; + + pp$5.parseNew = function() { + if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); } + var node = this.startNode(); + var meta = this.parseIdent(true); + if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) { + node.meta = meta; + var containsEsc = this.containsEsc; + node.property = this.parseIdent(true); + if (node.property.name !== "target") + { this.raiseRecoverable(node.property.start, "The only valid meta property for new is 'new.target'"); } + if (containsEsc) + { this.raiseRecoverable(node.start, "'new.target' must not contain escaped characters"); } + if (!this.allowNewDotTarget) + { this.raiseRecoverable(node.start, "'new.target' can only be used in functions and class static block"); } + return this.finishNode(node, "MetaProperty") + } + var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types$1._import; + node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true, false); + if (isImport && node.callee.type === "ImportExpression") { + this.raise(startPos, "Cannot use new with import()"); + } + if (this.eat(types$1.parenL)) { node.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); } + else { node.arguments = empty; } + return this.finishNode(node, "NewExpression") + }; + + // Parse template expression. + + pp$5.parseTemplateElement = function(ref) { + var isTagged = ref.isTagged; + + var elem = this.startNode(); + if (this.type === types$1.invalidTemplate) { + if (!isTagged) { + this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); + } + elem.value = { + raw: this.value, + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"), + cooked: this.value + }; + } + this.next(); + elem.tail = this.type === types$1.backQuote; + return this.finishNode(elem, "TemplateElement") + }; + + pp$5.parseTemplate = function(ref) { + if ( ref === void 0 ) ref = {}; + var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false; + + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement({isTagged: isTagged}); + node.quasis = [curElt]; + while (!curElt.tail) { + if (this.type === types$1.eof) { this.raise(this.pos, "Unterminated template literal"); } + this.expect(types$1.dollarBraceL); + node.expressions.push(this.parseExpression()); + this.expect(types$1.braceR); + node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged})); + } + this.next(); + return this.finishNode(node, "TemplateLiteral") + }; + + pp$5.isAsyncProp = function(prop) { + return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && + (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types$1.star)) && + !lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) + }; + + // Parse an object literal or binding pattern. + + pp$5.parseObj = function(isPattern, refDestructuringErrors) { + var node = this.startNode(), first = true, propHash = {}; + node.properties = []; + this.next(); + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { break } + } else { first = false; } + + var prop = this.parseProperty(isPattern, refDestructuringErrors); + if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); } + node.properties.push(prop); + } + return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression") + }; + + pp$5.parseProperty = function(isPattern, refDestructuringErrors) { + var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc; + if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) { + if (isPattern) { + prop.argument = this.parseIdent(false); + if (this.type === types$1.comma) { + this.raise(this.start, "Comma is not permitted after the rest element"); + } + return this.finishNode(prop, "RestElement") + } + // To disallow parenthesized identifier via `this.toAssignable()`. + if (this.type === types$1.parenL && refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0) { + refDestructuringErrors.parenthesizedAssign = this.start; + } + if (refDestructuringErrors.parenthesizedBind < 0) { + refDestructuringErrors.parenthesizedBind = this.start; + } + } + // Parse argument. + prop.argument = this.parseMaybeAssign(false, refDestructuringErrors); + // To disallow trailing comma via `this.toAssignable()`. + if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) { + refDestructuringErrors.trailingComma = this.start; + } + // Finish + return this.finishNode(prop, "SpreadElement") + } + if (this.options.ecmaVersion >= 6) { + prop.method = false; + prop.shorthand = false; + if (isPattern || refDestructuringErrors) { + startPos = this.start; + startLoc = this.startLoc; + } + if (!isPattern) + { isGenerator = this.eat(types$1.star); } + } + var containsEsc = this.containsEsc; + this.parsePropertyName(prop); + if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star); + this.parsePropertyName(prop, refDestructuringErrors); + } else { + isAsync = false; + } + this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc); + return this.finishNode(prop, "Property") + }; + + pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) { + if ((isGenerator || isAsync) && this.type === types$1.colon) + { this.unexpected(); } + + if (this.eat(types$1.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors); + prop.kind = "init"; + } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) { + if (isPattern) { this.unexpected(); } + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (!isPattern && !containsEsc && + this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && + (prop.key.name === "get" || prop.key.name === "set") && + (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) { + if (isGenerator || isAsync) { this.unexpected(); } + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + var paramCount = prop.kind === "get" ? 0 : 1; + if (prop.value.params.length !== paramCount) { + var start = prop.value.start; + if (prop.kind === "get") + { this.raiseRecoverable(start, "getter should have no params"); } + else + { this.raiseRecoverable(start, "setter should have exactly one param"); } + } else { + if (prop.kind === "set" && prop.value.params[0].type === "RestElement") + { this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); } + } + } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { + if (isGenerator || isAsync) { this.unexpected(); } + this.checkUnreserved(prop.key); + if (prop.key.name === "await" && !this.awaitIdentPos) + { this.awaitIdentPos = startPos; } + prop.kind = "init"; + if (isPattern) { + prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key)); + } else if (this.type === types$1.eq && refDestructuringErrors) { + if (refDestructuringErrors.shorthandAssign < 0) + { refDestructuringErrors.shorthandAssign = this.start; } + prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key)); + } else { + prop.value = this.copyNode(prop.key); + } + prop.shorthand = true; + } else { this.unexpected(); } + }; + + pp$5.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(types$1.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(types$1.bracketR); + return prop.key + } else { + prop.computed = false; + } + } + return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never") + }; + + // Initialize empty function node. + + pp$5.initFunction = function(node) { + node.id = null; + if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; } + if (this.options.ecmaVersion >= 8) { node.async = false; } + }; + + // Parse object or class method. + + pp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) { + var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + + this.initFunction(node); + if (this.options.ecmaVersion >= 6) + { node.generator = isGenerator; } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0)); + + this.expect(types$1.parenL); + node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + this.parseFunctionBody(node, false, true, false); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, "FunctionExpression") + }; + + // Parse arrow function expression with given parameters. + + pp$5.parseArrowExpression = function(node, params, isAsync, forInit) { + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + + this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW); + this.initFunction(node); + if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; } + + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + + node.params = this.toAssignableList(params, true); + this.parseFunctionBody(node, true, false, forInit); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, "ArrowFunctionExpression") + }; + + // Parse function body and check parameters. + + pp$5.parseFunctionBody = function(node, isArrowFunction, isMethod, forInit) { + var isExpression = isArrowFunction && this.type !== types$1.braceL; + var oldStrict = this.strict, useStrict = false; + + if (isExpression) { + node.body = this.parseMaybeAssign(forInit); + node.expression = true; + this.checkParams(node, false); + } else { + var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params); + if (!oldStrict || nonSimple) { + useStrict = this.strictDirective(this.end); + // If this is a strict mode function, verify that argument names + // are not repeated, and it does not try to bind the words `eval` + // or `arguments`. + if (useStrict && nonSimple) + { this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list"); } + } + // Start a new scope with regard to labels and the `inFunction` + // flag (restore them to their old value afterwards). + var oldLabels = this.labels; + this.labels = []; + if (useStrict) { this.strict = true; } + + // Add the params to varDeclaredNames to ensure that an error is thrown + // if a let/const declaration in the function clashes with one of the params. + this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params)); + // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval' + if (this.strict && node.id) { this.checkLValSimple(node.id, BIND_OUTSIDE); } + node.body = this.parseBlock(false, undefined, useStrict && !oldStrict); + node.expression = false; + this.adaptDirectivePrologue(node.body.body); + this.labels = oldLabels; + } + this.exitScope(); + }; + + pp$5.isSimpleParamList = function(params) { + for (var i = 0, list = params; i < list.length; i += 1) + { + var param = list[i]; + + if (param.type !== "Identifier") { return false + } } + return true + }; + + // Checks function params for various disallowed patterns such as using "eval" + // or "arguments" and duplicate parameters. + + pp$5.checkParams = function(node, allowDuplicates) { + var nameHash = Object.create(null); + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash); + } + }; + + // Parses a comma-separated list of expressions, and returns them as + // an array. `close` is the token type that ends the list, and + // `allowEmpty` can be turned on to allow subsequent commas with + // nothing in between them to be parsed as `null` (which is needed + // for array literals). + + pp$5.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) { + var elts = [], first = true; + while (!this.eat(close)) { + if (!first) { + this.expect(types$1.comma); + if (allowTrailingComma && this.afterTrailingComma(close)) { break } + } else { first = false; } + + var elt = (void 0); + if (allowEmpty && this.type === types$1.comma) + { elt = null; } + else if (this.type === types$1.ellipsis) { + elt = this.parseSpread(refDestructuringErrors); + if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0) + { refDestructuringErrors.trailingComma = this.start; } + } else { + elt = this.parseMaybeAssign(false, refDestructuringErrors); + } + elts.push(elt); + } + return elts + }; + + pp$5.checkUnreserved = function(ref) { + var start = ref.start; + var end = ref.end; + var name = ref.name; + + if (this.inGenerator && name === "yield") + { this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); } + if (this.inAsync && name === "await") + { this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); } + if (this.currentThisScope().inClassFieldInit && name === "arguments") + { this.raiseRecoverable(start, "Cannot use 'arguments' in class field initializer"); } + if (this.inClassStaticBlock && (name === "arguments" || name === "await")) + { this.raise(start, ("Cannot use " + name + " in class static initialization block")); } + if (this.keywords.test(name)) + { this.raise(start, ("Unexpected keyword '" + name + "'")); } + if (this.options.ecmaVersion < 6 && + this.input.slice(start, end).indexOf("\\") !== -1) { return } + var re = this.strict ? this.reservedWordsStrict : this.reservedWords; + if (re.test(name)) { + if (!this.inAsync && name === "await") + { this.raiseRecoverable(start, "Cannot use keyword 'await' outside an async function"); } + this.raiseRecoverable(start, ("The keyword '" + name + "' is reserved")); + } + }; + + // Parse the next token as an identifier. If `liberal` is true (used + // when parsing properties), it will also convert keywords into + // identifiers. + + pp$5.parseIdent = function(liberal, isBinding) { + var node = this.startNode(); + if (this.type === types$1.name) { + node.name = this.value; + } else if (this.type.keyword) { + node.name = this.type.keyword; + + // To fix https://github.com/acornjs/acorn/issues/575 + // `class` and `function` keywords push new context into this.context. + // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name. + // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword + if ((node.name === "class" || node.name === "function") && + (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { + this.context.pop(); + } + } else { + this.unexpected(); + } + this.next(!!liberal); + this.finishNode(node, "Identifier"); + if (!liberal) { + this.checkUnreserved(node); + if (node.name === "await" && !this.awaitIdentPos) + { this.awaitIdentPos = node.start; } + } + return node + }; + + pp$5.parsePrivateIdent = function() { + var node = this.startNode(); + if (this.type === types$1.privateId) { + node.name = this.value; + } else { + this.unexpected(); + } + this.next(); + this.finishNode(node, "PrivateIdentifier"); + + // For validating existence + if (this.privateNameStack.length === 0) { + this.raise(node.start, ("Private field '#" + (node.name) + "' must be declared in an enclosing class")); + } else { + this.privateNameStack[this.privateNameStack.length - 1].used.push(node); + } + + return node + }; + + // Parses yield expression inside generator. + + pp$5.parseYield = function(forInit) { + if (!this.yieldPos) { this.yieldPos = this.start; } + + var node = this.startNode(); + this.next(); + if (this.type === types$1.semi || this.canInsertSemicolon() || (this.type !== types$1.star && !this.type.startsExpr)) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(types$1.star); + node.argument = this.parseMaybeAssign(forInit); + } + return this.finishNode(node, "YieldExpression") + }; + + pp$5.parseAwait = function(forInit) { + if (!this.awaitPos) { this.awaitPos = this.start; } + + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeUnary(null, true, false, forInit); + return this.finishNode(node, "AwaitExpression") + }; + + var pp$4 = Parser.prototype; + + // This function is used to raise exceptions on parse errors. It + // takes an offset integer (into the current `input`) to indicate + // the location of the error, attaches the position to the end + // of the error message, and then raises a `SyntaxError` with that + // message. + + pp$4.raise = function(pos, message) { + var loc = getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; err.loc = loc; err.raisedAt = this.pos; + throw err + }; + + pp$4.raiseRecoverable = pp$4.raise; + + pp$4.curPosition = function() { + if (this.options.locations) { + return new Position(this.curLine, this.pos - this.lineStart) + } + }; + + var pp$3 = Parser.prototype; + + var Scope = function Scope(flags) { + this.flags = flags; + // A list of var-declared names in the current lexical scope + this.var = []; + // A list of lexically-declared names in the current lexical scope + this.lexical = []; + // A list of lexically-declared FunctionDeclaration names in the current lexical scope + this.functions = []; + // A switch to disallow the identifier reference 'arguments' + this.inClassFieldInit = false; + }; + + // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names. + + pp$3.enterScope = function(flags) { + this.scopeStack.push(new Scope(flags)); + }; + + pp$3.exitScope = function() { + this.scopeStack.pop(); + }; + + // The spec says: + // > At the top level of a function, or script, function declarations are + // > treated like var declarations rather than like lexical declarations. + pp$3.treatFunctionsAsVarInScope = function(scope) { + return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP) + }; + + pp$3.declareName = function(name, bindingType, pos) { + var redeclared = false; + if (bindingType === BIND_LEXICAL) { + var scope = this.currentScope(); + redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1; + scope.lexical.push(name); + if (this.inModule && (scope.flags & SCOPE_TOP)) + { delete this.undefinedExports[name]; } + } else if (bindingType === BIND_SIMPLE_CATCH) { + var scope$1 = this.currentScope(); + scope$1.lexical.push(name); + } else if (bindingType === BIND_FUNCTION) { + var scope$2 = this.currentScope(); + if (this.treatFunctionsAsVar) + { redeclared = scope$2.lexical.indexOf(name) > -1; } + else + { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; } + scope$2.functions.push(name); + } else { + for (var i = this.scopeStack.length - 1; i >= 0; --i) { + var scope$3 = this.scopeStack[i]; + if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) || + !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) { + redeclared = true; + break + } + scope$3.var.push(name); + if (this.inModule && (scope$3.flags & SCOPE_TOP)) + { delete this.undefinedExports[name]; } + if (scope$3.flags & SCOPE_VAR) { break } + } + } + if (redeclared) { this.raiseRecoverable(pos, ("Identifier '" + name + "' has already been declared")); } + }; + + pp$3.checkLocalExport = function(id) { + // scope.functions must be empty as Module code is always strict. + if (this.scopeStack[0].lexical.indexOf(id.name) === -1 && + this.scopeStack[0].var.indexOf(id.name) === -1) { + this.undefinedExports[id.name] = id; + } + }; + + pp$3.currentScope = function() { + return this.scopeStack[this.scopeStack.length - 1] + }; + + pp$3.currentVarScope = function() { + for (var i = this.scopeStack.length - 1;; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR) { return scope } + } + }; + + // Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`. + pp$3.currentThisScope = function() { + for (var i = this.scopeStack.length - 1;; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope } + } + }; + + var Node = function Node(parser, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + if (parser.options.locations) + { this.loc = new SourceLocation(parser, loc); } + if (parser.options.directSourceFile) + { this.sourceFile = parser.options.directSourceFile; } + if (parser.options.ranges) + { this.range = [pos, 0]; } + }; + + // Start an AST node, attaching a start offset. + + var pp$2 = Parser.prototype; + + pp$2.startNode = function() { + return new Node(this, this.start, this.startLoc) + }; + + pp$2.startNodeAt = function(pos, loc) { + return new Node(this, pos, loc) + }; + + // Finish an AST node, adding `type` and `end` properties. + + function finishNodeAt(node, type, pos, loc) { + node.type = type; + node.end = pos; + if (this.options.locations) + { node.loc.end = loc; } + if (this.options.ranges) + { node.range[1] = pos; } + return node + } + + pp$2.finishNode = function(node, type) { + return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc) + }; + + // Finish node at given position + + pp$2.finishNodeAt = function(node, type, pos, loc) { + return finishNodeAt.call(this, node, type, pos, loc) + }; + + pp$2.copyNode = function(node) { + var newNode = new Node(this, node.start, this.startLoc); + for (var prop in node) { newNode[prop] = node[prop]; } + return newNode + }; + + // This file contains Unicode properties extracted from the ECMAScript + // specification. The lists are extracted like so: + // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText) + + // #table-binary-unicode-properties + var ecma9BinaryProperties = "ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS"; + var ecma10BinaryProperties = ecma9BinaryProperties + " Extended_Pictographic"; + var ecma11BinaryProperties = ecma10BinaryProperties; + var ecma12BinaryProperties = ecma11BinaryProperties + " EBase EComp EMod EPres ExtPict"; + var ecma13BinaryProperties = ecma12BinaryProperties; + var unicodeBinaryProperties = { + 9: ecma9BinaryProperties, + 10: ecma10BinaryProperties, + 11: ecma11BinaryProperties, + 12: ecma12BinaryProperties, + 13: ecma13BinaryProperties + }; + + // #table-unicode-general-category-values + var unicodeGeneralCategoryValues = "Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu"; + + // #table-unicode-script-values + var ecma9ScriptValues = "Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb"; + var ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd"; + var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"; + var ecma12ScriptValues = ecma11ScriptValues + " Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi"; + var ecma13ScriptValues = ecma12ScriptValues + " Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith"; + var unicodeScriptValues = { + 9: ecma9ScriptValues, + 10: ecma10ScriptValues, + 11: ecma11ScriptValues, + 12: ecma12ScriptValues, + 13: ecma13ScriptValues + }; + + var data = {}; + function buildUnicodeData(ecmaVersion) { + var d = data[ecmaVersion] = { + binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + " " + unicodeGeneralCategoryValues), + nonBinary: { + General_Category: wordsRegexp(unicodeGeneralCategoryValues), + Script: wordsRegexp(unicodeScriptValues[ecmaVersion]) + } + }; + d.nonBinary.Script_Extensions = d.nonBinary.Script; + + d.nonBinary.gc = d.nonBinary.General_Category; + d.nonBinary.sc = d.nonBinary.Script; + d.nonBinary.scx = d.nonBinary.Script_Extensions; + } + + for (var i = 0, list = [9, 10, 11, 12, 13]; i < list.length; i += 1) { + var ecmaVersion = list[i]; + + buildUnicodeData(ecmaVersion); + } + + var pp$1 = Parser.prototype; + + var RegExpValidationState = function RegExpValidationState(parser) { + this.parser = parser; + this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : "") + (parser.options.ecmaVersion >= 13 ? "d" : ""); + this.unicodeProperties = data[parser.options.ecmaVersion >= 13 ? 13 : parser.options.ecmaVersion]; + this.source = ""; + this.flags = ""; + this.start = 0; + this.switchU = false; + this.switchN = false; + this.pos = 0; + this.lastIntValue = 0; + this.lastStringValue = ""; + this.lastAssertionIsQuantifiable = false; + this.numCapturingParens = 0; + this.maxBackReference = 0; + this.groupNames = []; + this.backReferenceNames = []; + }; + + RegExpValidationState.prototype.reset = function reset (start, pattern, flags) { + var unicode = flags.indexOf("u") !== -1; + this.start = start | 0; + this.source = pattern + ""; + this.flags = flags; + this.switchU = unicode && this.parser.options.ecmaVersion >= 6; + this.switchN = unicode && this.parser.options.ecmaVersion >= 9; + }; + + RegExpValidationState.prototype.raise = function raise (message) { + this.parser.raiseRecoverable(this.start, ("Invalid regular expression: /" + (this.source) + "/: " + message)); + }; + + // If u flag is given, this returns the code point at the index (it combines a surrogate pair). + // Otherwise, this returns the code unit of the index (can be a part of a surrogate pair). + RegExpValidationState.prototype.at = function at (i, forceU) { + if ( forceU === void 0 ) forceU = false; + + var s = this.source; + var l = s.length; + if (i >= l) { + return -1 + } + var c = s.charCodeAt(i); + if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) { + return c + } + var next = s.charCodeAt(i + 1); + return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c + }; + + RegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) { + if ( forceU === void 0 ) forceU = false; + + var s = this.source; + var l = s.length; + if (i >= l) { + return l + } + var c = s.charCodeAt(i), next; + if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l || + (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) { + return i + 1 + } + return i + 2 + }; + + RegExpValidationState.prototype.current = function current (forceU) { + if ( forceU === void 0 ) forceU = false; + + return this.at(this.pos, forceU) + }; + + RegExpValidationState.prototype.lookahead = function lookahead (forceU) { + if ( forceU === void 0 ) forceU = false; + + return this.at(this.nextIndex(this.pos, forceU), forceU) + }; + + RegExpValidationState.prototype.advance = function advance (forceU) { + if ( forceU === void 0 ) forceU = false; + + this.pos = this.nextIndex(this.pos, forceU); + }; + + RegExpValidationState.prototype.eat = function eat (ch, forceU) { + if ( forceU === void 0 ) forceU = false; + + if (this.current(forceU) === ch) { + this.advance(forceU); + return true + } + return false + }; + + /** + * Validate the flags part of a given RegExpLiteral. + * + * @param {RegExpValidationState} state The state to validate RegExp. + * @returns {void} + */ + pp$1.validateRegExpFlags = function(state) { + var validFlags = state.validFlags; + var flags = state.flags; + + for (var i = 0; i < flags.length; i++) { + var flag = flags.charAt(i); + if (validFlags.indexOf(flag) === -1) { + this.raise(state.start, "Invalid regular expression flag"); + } + if (flags.indexOf(flag, i + 1) > -1) { + this.raise(state.start, "Duplicate regular expression flag"); + } + } + }; + + /** + * Validate the pattern part of a given RegExpLiteral. + * + * @param {RegExpValidationState} state The state to validate RegExp. + * @returns {void} + */ + pp$1.validateRegExpPattern = function(state) { + this.regexp_pattern(state); + + // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of + // parsing contains a |GroupName|, reparse with the goal symbol + // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError* + // exception if _P_ did not conform to the grammar, if any elements of _P_ + // were not matched by the parse, or if any Early Error conditions exist. + if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) { + state.switchN = true; + this.regexp_pattern(state); + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern + pp$1.regexp_pattern = function(state) { + state.pos = 0; + state.lastIntValue = 0; + state.lastStringValue = ""; + state.lastAssertionIsQuantifiable = false; + state.numCapturingParens = 0; + state.maxBackReference = 0; + state.groupNames.length = 0; + state.backReferenceNames.length = 0; + + this.regexp_disjunction(state); + + if (state.pos !== state.source.length) { + // Make the same messages as V8. + if (state.eat(0x29 /* ) */)) { + state.raise("Unmatched ')'"); + } + if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) { + state.raise("Lone quantifier brackets"); + } + } + if (state.maxBackReference > state.numCapturingParens) { + state.raise("Invalid escape"); + } + for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) { + var name = list[i]; + + if (state.groupNames.indexOf(name) === -1) { + state.raise("Invalid named capture referenced"); + } + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction + pp$1.regexp_disjunction = function(state) { + this.regexp_alternative(state); + while (state.eat(0x7C /* | */)) { + this.regexp_alternative(state); + } + + // Make the same message as V8. + if (this.regexp_eatQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + if (state.eat(0x7B /* { */)) { + state.raise("Lone quantifier brackets"); + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative + pp$1.regexp_alternative = function(state) { + while (state.pos < state.source.length && this.regexp_eatTerm(state)) + { } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term + pp$1.regexp_eatTerm = function(state) { + if (this.regexp_eatAssertion(state)) { + // Handle `QuantifiableAssertion Quantifier` alternative. + // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion + // is a QuantifiableAssertion. + if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) { + // Make the same message as V8. + if (state.switchU) { + state.raise("Invalid quantifier"); + } + } + return true + } + + if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) { + this.regexp_eatQuantifier(state); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion + pp$1.regexp_eatAssertion = function(state) { + var start = state.pos; + state.lastAssertionIsQuantifiable = false; + + // ^, $ + if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) { + return true + } + + // \b \B + if (state.eat(0x5C /* \ */)) { + if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) { + return true + } + state.pos = start; + } + + // Lookahead / Lookbehind + if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) { + var lookbehind = false; + if (this.options.ecmaVersion >= 9) { + lookbehind = state.eat(0x3C /* < */); + } + if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) { + this.regexp_disjunction(state); + if (!state.eat(0x29 /* ) */)) { + state.raise("Unterminated group"); + } + state.lastAssertionIsQuantifiable = !lookbehind; + return true + } + } + + state.pos = start; + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier + pp$1.regexp_eatQuantifier = function(state, noError) { + if ( noError === void 0 ) noError = false; + + if (this.regexp_eatQuantifierPrefix(state, noError)) { + state.eat(0x3F /* ? */); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix + pp$1.regexp_eatQuantifierPrefix = function(state, noError) { + return ( + state.eat(0x2A /* * */) || + state.eat(0x2B /* + */) || + state.eat(0x3F /* ? */) || + this.regexp_eatBracedQuantifier(state, noError) + ) + }; + pp$1.regexp_eatBracedQuantifier = function(state, noError) { + var start = state.pos; + if (state.eat(0x7B /* { */)) { + var min = 0, max = -1; + if (this.regexp_eatDecimalDigits(state)) { + min = state.lastIntValue; + if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) { + max = state.lastIntValue; + } + if (state.eat(0x7D /* } */)) { + // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term + if (max !== -1 && max < min && !noError) { + state.raise("numbers out of order in {} quantifier"); + } + return true + } + } + if (state.switchU && !noError) { + state.raise("Incomplete quantifier"); + } + state.pos = start; + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Atom + pp$1.regexp_eatAtom = function(state) { + return ( + this.regexp_eatPatternCharacters(state) || + state.eat(0x2E /* . */) || + this.regexp_eatReverseSolidusAtomEscape(state) || + this.regexp_eatCharacterClass(state) || + this.regexp_eatUncapturingGroup(state) || + this.regexp_eatCapturingGroup(state) + ) + }; + pp$1.regexp_eatReverseSolidusAtomEscape = function(state) { + var start = state.pos; + if (state.eat(0x5C /* \ */)) { + if (this.regexp_eatAtomEscape(state)) { + return true + } + state.pos = start; + } + return false + }; + pp$1.regexp_eatUncapturingGroup = function(state) { + var start = state.pos; + if (state.eat(0x28 /* ( */)) { + if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) { + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + return true + } + state.raise("Unterminated group"); + } + state.pos = start; + } + return false + }; + pp$1.regexp_eatCapturingGroup = function(state) { + if (state.eat(0x28 /* ( */)) { + if (this.options.ecmaVersion >= 9) { + this.regexp_groupSpecifier(state); + } else if (state.current() === 0x3F /* ? */) { + state.raise("Invalid group"); + } + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + state.numCapturingParens += 1; + return true + } + state.raise("Unterminated group"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom + pp$1.regexp_eatExtendedAtom = function(state) { + return ( + state.eat(0x2E /* . */) || + this.regexp_eatReverseSolidusAtomEscape(state) || + this.regexp_eatCharacterClass(state) || + this.regexp_eatUncapturingGroup(state) || + this.regexp_eatCapturingGroup(state) || + this.regexp_eatInvalidBracedQuantifier(state) || + this.regexp_eatExtendedPatternCharacter(state) + ) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier + pp$1.regexp_eatInvalidBracedQuantifier = function(state) { + if (this.regexp_eatBracedQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter + pp$1.regexp_eatSyntaxCharacter = function(state) { + var ch = state.current(); + if (isSyntaxCharacter(ch)) { + state.lastIntValue = ch; + state.advance(); + return true + } + return false + }; + function isSyntaxCharacter(ch) { + return ( + ch === 0x24 /* $ */ || + ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ || + ch === 0x2E /* . */ || + ch === 0x3F /* ? */ || + ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ || + ch >= 0x7B /* { */ && ch <= 0x7D /* } */ + ) + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter + // But eat eager. + pp$1.regexp_eatPatternCharacters = function(state) { + var start = state.pos; + var ch = 0; + while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) { + state.advance(); + } + return state.pos !== start + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter + pp$1.regexp_eatExtendedPatternCharacter = function(state) { + var ch = state.current(); + if ( + ch !== -1 && + ch !== 0x24 /* $ */ && + !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) && + ch !== 0x2E /* . */ && + ch !== 0x3F /* ? */ && + ch !== 0x5B /* [ */ && + ch !== 0x5E /* ^ */ && + ch !== 0x7C /* | */ + ) { + state.advance(); + return true + } + return false + }; + + // GroupSpecifier :: + // [empty] + // `?` GroupName + pp$1.regexp_groupSpecifier = function(state) { + if (state.eat(0x3F /* ? */)) { + if (this.regexp_eatGroupName(state)) { + if (state.groupNames.indexOf(state.lastStringValue) !== -1) { + state.raise("Duplicate capture group name"); + } + state.groupNames.push(state.lastStringValue); + return + } + state.raise("Invalid group"); + } + }; + + // GroupName :: + // `<` RegExpIdentifierName `>` + // Note: this updates `state.lastStringValue` property with the eaten name. + pp$1.regexp_eatGroupName = function(state) { + state.lastStringValue = ""; + if (state.eat(0x3C /* < */)) { + if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) { + return true + } + state.raise("Invalid capture group name"); + } + return false + }; + + // RegExpIdentifierName :: + // RegExpIdentifierStart + // RegExpIdentifierName RegExpIdentifierPart + // Note: this updates `state.lastStringValue` property with the eaten name. + pp$1.regexp_eatRegExpIdentifierName = function(state) { + state.lastStringValue = ""; + if (this.regexp_eatRegExpIdentifierStart(state)) { + state.lastStringValue += codePointToString(state.lastIntValue); + while (this.regexp_eatRegExpIdentifierPart(state)) { + state.lastStringValue += codePointToString(state.lastIntValue); + } + return true + } + return false + }; + + // RegExpIdentifierStart :: + // UnicodeIDStart + // `$` + // `_` + // `\` RegExpUnicodeEscapeSequence[+U] + pp$1.regexp_eatRegExpIdentifierStart = function(state) { + var start = state.pos; + var forceU = this.options.ecmaVersion >= 11; + var ch = state.current(forceU); + state.advance(forceU); + + if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierStart(ch)) { + state.lastIntValue = ch; + return true + } + + state.pos = start; + return false + }; + function isRegExpIdentifierStart(ch) { + return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ + } + + // RegExpIdentifierPart :: + // UnicodeIDContinue + // `$` + // `_` + // `\` RegExpUnicodeEscapeSequence[+U] + // <ZWNJ> + // <ZWJ> + pp$1.regexp_eatRegExpIdentifierPart = function(state) { + var start = state.pos; + var forceU = this.options.ecmaVersion >= 11; + var ch = state.current(forceU); + state.advance(forceU); + + if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierPart(ch)) { + state.lastIntValue = ch; + return true + } + + state.pos = start; + return false + }; + function isRegExpIdentifierPart(ch) { + return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* <ZWNJ> */ || ch === 0x200D /* <ZWJ> */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape + pp$1.regexp_eatAtomEscape = function(state) { + if ( + this.regexp_eatBackReference(state) || + this.regexp_eatCharacterClassEscape(state) || + this.regexp_eatCharacterEscape(state) || + (state.switchN && this.regexp_eatKGroupName(state)) + ) { + return true + } + if (state.switchU) { + // Make the same message as V8. + if (state.current() === 0x63 /* c */) { + state.raise("Invalid unicode escape"); + } + state.raise("Invalid escape"); + } + return false + }; + pp$1.regexp_eatBackReference = function(state) { + var start = state.pos; + if (this.regexp_eatDecimalEscape(state)) { + var n = state.lastIntValue; + if (state.switchU) { + // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape + if (n > state.maxBackReference) { + state.maxBackReference = n; + } + return true + } + if (n <= state.numCapturingParens) { + return true + } + state.pos = start; + } + return false + }; + pp$1.regexp_eatKGroupName = function(state) { + if (state.eat(0x6B /* k */)) { + if (this.regexp_eatGroupName(state)) { + state.backReferenceNames.push(state.lastStringValue); + return true + } + state.raise("Invalid named reference"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape + pp$1.regexp_eatCharacterEscape = function(state) { + return ( + this.regexp_eatControlEscape(state) || + this.regexp_eatCControlLetter(state) || + this.regexp_eatZero(state) || + this.regexp_eatHexEscapeSequence(state) || + this.regexp_eatRegExpUnicodeEscapeSequence(state, false) || + (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) || + this.regexp_eatIdentityEscape(state) + ) + }; + pp$1.regexp_eatCControlLetter = function(state) { + var start = state.pos; + if (state.eat(0x63 /* c */)) { + if (this.regexp_eatControlLetter(state)) { + return true + } + state.pos = start; + } + return false + }; + pp$1.regexp_eatZero = function(state) { + if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) { + state.lastIntValue = 0; + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape + pp$1.regexp_eatControlEscape = function(state) { + var ch = state.current(); + if (ch === 0x74 /* t */) { + state.lastIntValue = 0x09; /* \t */ + state.advance(); + return true + } + if (ch === 0x6E /* n */) { + state.lastIntValue = 0x0A; /* \n */ + state.advance(); + return true + } + if (ch === 0x76 /* v */) { + state.lastIntValue = 0x0B; /* \v */ + state.advance(); + return true + } + if (ch === 0x66 /* f */) { + state.lastIntValue = 0x0C; /* \f */ + state.advance(); + return true + } + if (ch === 0x72 /* r */) { + state.lastIntValue = 0x0D; /* \r */ + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter + pp$1.regexp_eatControlLetter = function(state) { + var ch = state.current(); + if (isControlLetter(ch)) { + state.lastIntValue = ch % 0x20; + state.advance(); + return true + } + return false + }; + function isControlLetter(ch) { + return ( + (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) || + (ch >= 0x61 /* a */ && ch <= 0x7A /* z */) + ) + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence + pp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) { + if ( forceU === void 0 ) forceU = false; + + var start = state.pos; + var switchU = forceU || state.switchU; + + if (state.eat(0x75 /* u */)) { + if (this.regexp_eatFixedHexDigits(state, 4)) { + var lead = state.lastIntValue; + if (switchU && lead >= 0xD800 && lead <= 0xDBFF) { + var leadSurrogateEnd = state.pos; + if (state.eat(0x5C /* \ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) { + var trail = state.lastIntValue; + if (trail >= 0xDC00 && trail <= 0xDFFF) { + state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; + return true + } + } + state.pos = leadSurrogateEnd; + state.lastIntValue = lead; + } + return true + } + if ( + switchU && + state.eat(0x7B /* { */) && + this.regexp_eatHexDigits(state) && + state.eat(0x7D /* } */) && + isValidUnicode(state.lastIntValue) + ) { + return true + } + if (switchU) { + state.raise("Invalid unicode escape"); + } + state.pos = start; + } + + return false + }; + function isValidUnicode(ch) { + return ch >= 0 && ch <= 0x10FFFF + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape + pp$1.regexp_eatIdentityEscape = function(state) { + if (state.switchU) { + if (this.regexp_eatSyntaxCharacter(state)) { + return true + } + if (state.eat(0x2F /* / */)) { + state.lastIntValue = 0x2F; /* / */ + return true + } + return false + } + + var ch = state.current(); + if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) { + state.lastIntValue = ch; + state.advance(); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape + pp$1.regexp_eatDecimalEscape = function(state) { + state.lastIntValue = 0; + var ch = state.current(); + if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) { + do { + state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */); + state.advance(); + } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape + pp$1.regexp_eatCharacterClassEscape = function(state) { + var ch = state.current(); + + if (isCharacterClassEscape(ch)) { + state.lastIntValue = -1; + state.advance(); + return true + } + + if ( + state.switchU && + this.options.ecmaVersion >= 9 && + (ch === 0x50 /* P */ || ch === 0x70 /* p */) + ) { + state.lastIntValue = -1; + state.advance(); + if ( + state.eat(0x7B /* { */) && + this.regexp_eatUnicodePropertyValueExpression(state) && + state.eat(0x7D /* } */) + ) { + return true + } + state.raise("Invalid property name"); + } + + return false + }; + function isCharacterClassEscape(ch) { + return ( + ch === 0x64 /* d */ || + ch === 0x44 /* D */ || + ch === 0x73 /* s */ || + ch === 0x53 /* S */ || + ch === 0x77 /* w */ || + ch === 0x57 /* W */ + ) + } + + // UnicodePropertyValueExpression :: + // UnicodePropertyName `=` UnicodePropertyValue + // LoneUnicodePropertyNameOrValue + pp$1.regexp_eatUnicodePropertyValueExpression = function(state) { + var start = state.pos; + + // UnicodePropertyName `=` UnicodePropertyValue + if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) { + var name = state.lastStringValue; + if (this.regexp_eatUnicodePropertyValue(state)) { + var value = state.lastStringValue; + this.regexp_validateUnicodePropertyNameAndValue(state, name, value); + return true + } + } + state.pos = start; + + // LoneUnicodePropertyNameOrValue + if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) { + var nameOrValue = state.lastStringValue; + this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue); + return true + } + return false + }; + pp$1.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) { + if (!hasOwn(state.unicodeProperties.nonBinary, name)) + { state.raise("Invalid property name"); } + if (!state.unicodeProperties.nonBinary[name].test(value)) + { state.raise("Invalid property value"); } + }; + pp$1.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) { + if (!state.unicodeProperties.binary.test(nameOrValue)) + { state.raise("Invalid property name"); } + }; + + // UnicodePropertyName :: + // UnicodePropertyNameCharacters + pp$1.regexp_eatUnicodePropertyName = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyNameCharacter(ch = state.current())) { + state.lastStringValue += codePointToString(ch); + state.advance(); + } + return state.lastStringValue !== "" + }; + function isUnicodePropertyNameCharacter(ch) { + return isControlLetter(ch) || ch === 0x5F /* _ */ + } + + // UnicodePropertyValue :: + // UnicodePropertyValueCharacters + pp$1.regexp_eatUnicodePropertyValue = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyValueCharacter(ch = state.current())) { + state.lastStringValue += codePointToString(ch); + state.advance(); + } + return state.lastStringValue !== "" + }; + function isUnicodePropertyValueCharacter(ch) { + return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch) + } + + // LoneUnicodePropertyNameOrValue :: + // UnicodePropertyValueCharacters + pp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state) { + return this.regexp_eatUnicodePropertyValue(state) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass + pp$1.regexp_eatCharacterClass = function(state) { + if (state.eat(0x5B /* [ */)) { + state.eat(0x5E /* ^ */); + this.regexp_classRanges(state); + if (state.eat(0x5D /* ] */)) { + return true + } + // Unreachable since it threw "unterminated regular expression" error before. + state.raise("Unterminated character class"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges + // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges + // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash + pp$1.regexp_classRanges = function(state) { + while (this.regexp_eatClassAtom(state)) { + var left = state.lastIntValue; + if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) { + var right = state.lastIntValue; + if (state.switchU && (left === -1 || right === -1)) { + state.raise("Invalid character class"); + } + if (left !== -1 && right !== -1 && left > right) { + state.raise("Range out of order in character class"); + } + } + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash + pp$1.regexp_eatClassAtom = function(state) { + var start = state.pos; + + if (state.eat(0x5C /* \ */)) { + if (this.regexp_eatClassEscape(state)) { + return true + } + if (state.switchU) { + // Make the same message as V8. + var ch$1 = state.current(); + if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) { + state.raise("Invalid class escape"); + } + state.raise("Invalid escape"); + } + state.pos = start; + } + + var ch = state.current(); + if (ch !== 0x5D /* ] */) { + state.lastIntValue = ch; + state.advance(); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape + pp$1.regexp_eatClassEscape = function(state) { + var start = state.pos; + + if (state.eat(0x62 /* b */)) { + state.lastIntValue = 0x08; /* <BS> */ + return true + } + + if (state.switchU && state.eat(0x2D /* - */)) { + state.lastIntValue = 0x2D; /* - */ + return true + } + + if (!state.switchU && state.eat(0x63 /* c */)) { + if (this.regexp_eatClassControlLetter(state)) { + return true + } + state.pos = start; + } + + return ( + this.regexp_eatCharacterClassEscape(state) || + this.regexp_eatCharacterEscape(state) + ) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter + pp$1.regexp_eatClassControlLetter = function(state) { + var ch = state.current(); + if (isDecimalDigit(ch) || ch === 0x5F /* _ */) { + state.lastIntValue = ch % 0x20; + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence + pp$1.regexp_eatHexEscapeSequence = function(state) { + var start = state.pos; + if (state.eat(0x78 /* x */)) { + if (this.regexp_eatFixedHexDigits(state, 2)) { + return true + } + if (state.switchU) { + state.raise("Invalid escape"); + } + state.pos = start; + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits + pp$1.regexp_eatDecimalDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isDecimalDigit(ch = state.current())) { + state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */); + state.advance(); + } + return state.pos !== start + }; + function isDecimalDigit(ch) { + return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits + pp$1.regexp_eatHexDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isHexDigit(ch = state.current())) { + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return state.pos !== start + }; + function isHexDigit(ch) { + return ( + (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) || + (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) || + (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) + ) + } + function hexToInt(ch) { + if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) { + return 10 + (ch - 0x41 /* A */) + } + if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) { + return 10 + (ch - 0x61 /* a */) + } + return ch - 0x30 /* 0 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence + // Allows only 0-377(octal) i.e. 0-255(decimal). + pp$1.regexp_eatLegacyOctalEscapeSequence = function(state) { + if (this.regexp_eatOctalDigit(state)) { + var n1 = state.lastIntValue; + if (this.regexp_eatOctalDigit(state)) { + var n2 = state.lastIntValue; + if (n1 <= 3 && this.regexp_eatOctalDigit(state)) { + state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue; + } else { + state.lastIntValue = n1 * 8 + n2; + } + } else { + state.lastIntValue = n1; + } + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit + pp$1.regexp_eatOctalDigit = function(state) { + var ch = state.current(); + if (isOctalDigit(ch)) { + state.lastIntValue = ch - 0x30; /* 0 */ + state.advance(); + return true + } + state.lastIntValue = 0; + return false + }; + function isOctalDigit(ch) { + return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit + // And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence + pp$1.regexp_eatFixedHexDigits = function(state, length) { + var start = state.pos; + state.lastIntValue = 0; + for (var i = 0; i < length; ++i) { + var ch = state.current(); + if (!isHexDigit(ch)) { + state.pos = start; + return false + } + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return true + }; + + // Object type used to represent tokens. Note that normally, tokens + // simply exist as properties on the parser object. This is only + // used for the onToken callback and the external tokenizer. + + var Token = function Token(p) { + this.type = p.type; + this.value = p.value; + this.start = p.start; + this.end = p.end; + if (p.options.locations) + { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); } + if (p.options.ranges) + { this.range = [p.start, p.end]; } + }; + + // ## Tokenizer + + var pp = Parser.prototype; + + // Move to the next token + + pp.next = function(ignoreEscapeSequenceInKeyword) { + if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc) + { this.raiseRecoverable(this.start, "Escape sequence in keyword " + this.type.keyword); } + if (this.options.onToken) + { this.options.onToken(new Token(this)); } + + this.lastTokEnd = this.end; + this.lastTokStart = this.start; + this.lastTokEndLoc = this.endLoc; + this.lastTokStartLoc = this.startLoc; + this.nextToken(); + }; + + pp.getToken = function() { + this.next(); + return new Token(this) + }; + + // If we're in an ES6 environment, make parsers iterable + if (typeof Symbol !== "undefined") + { pp[Symbol.iterator] = function() { + var this$1$1 = this; + + return { + next: function () { + var token = this$1$1.getToken(); + return { + done: token.type === types$1.eof, + value: token + } + } + } + }; } + + // Toggle strict mode. Re-reads the next number or string to please + // pedantic tests (`"use strict"; 010;` should fail). + + // Read a single token, updating the parser object's token-related + // properties. + + pp.nextToken = function() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) { this.skipSpace(); } + + this.start = this.pos; + if (this.options.locations) { this.startLoc = this.curPosition(); } + if (this.pos >= this.input.length) { return this.finishToken(types$1.eof) } + + if (curContext.override) { return curContext.override(this) } + else { this.readToken(this.fullCharCodeAtPos()); } + }; + + pp.readToken = function(code) { + // Identifier or keyword. '\uXXXX' sequences are allowed in + // identifiers, so '\' also dispatches to that. + if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */) + { return this.readWord() } + + return this.getTokenFromCode(code) + }; + + pp.fullCharCodeAtPos = function() { + var code = this.input.charCodeAt(this.pos); + if (code <= 0xd7ff || code >= 0xdc00) { return code } + var next = this.input.charCodeAt(this.pos + 1); + return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00 + }; + + pp.skipBlockComment = function() { + var startLoc = this.options.onComment && this.curPosition(); + var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); + if (end === -1) { this.raise(this.pos - 2, "Unterminated comment"); } + this.pos = end + 2; + if (this.options.locations) { + for (var nextBreak = (void 0), pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1;) { + ++this.curLine; + pos = this.lineStart = nextBreak; + } + } + if (this.options.onComment) + { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos, + startLoc, this.curPosition()); } + }; + + pp.skipLineComment = function(startSkip) { + var start = this.pos; + var startLoc = this.options.onComment && this.curPosition(); + var ch = this.input.charCodeAt(this.pos += startSkip); + while (this.pos < this.input.length && !isNewLine(ch)) { + ch = this.input.charCodeAt(++this.pos); + } + if (this.options.onComment) + { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos, + startLoc, this.curPosition()); } + }; + + // Called at the start of the parse and after every token. Skips + // whitespace and comments, and. + + pp.skipSpace = function() { + loop: while (this.pos < this.input.length) { + var ch = this.input.charCodeAt(this.pos); + switch (ch) { + case 32: case 160: // ' ' + ++this.pos; + break + case 13: + if (this.input.charCodeAt(this.pos + 1) === 10) { + ++this.pos; + } + case 10: case 8232: case 8233: + ++this.pos; + if (this.options.locations) { + ++this.curLine; + this.lineStart = this.pos; + } + break + case 47: // '/' + switch (this.input.charCodeAt(this.pos + 1)) { + case 42: // '*' + this.skipBlockComment(); + break + case 47: + this.skipLineComment(2); + break + default: + break loop + } + break + default: + if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this.pos; + } else { + break loop + } + } + } + }; + + // Called at the end of every token. Sets `end`, `val`, and + // maintains `context` and `exprAllowed`, and skips the space after + // the token, so that the next one's `start` will point at the + // right position. + + pp.finishToken = function(type, val) { + this.end = this.pos; + if (this.options.locations) { this.endLoc = this.curPosition(); } + var prevType = this.type; + this.type = type; + this.value = val; + + this.updateContext(prevType); + }; + + // ### Token reading + + // This is the function that is called to fetch the next token. It + // is somewhat obscure, because it works in character codes rather + // than characters, and because operator parsing has been inlined + // into it. + // + // All in the name of speed. + // + pp.readToken_dot = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next >= 48 && next <= 57) { return this.readNumber(true) } + var next2 = this.input.charCodeAt(this.pos + 2); + if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.' + this.pos += 3; + return this.finishToken(types$1.ellipsis) + } else { + ++this.pos; + return this.finishToken(types$1.dot) + } + }; + + pp.readToken_slash = function() { // '/' + var next = this.input.charCodeAt(this.pos + 1); + if (this.exprAllowed) { ++this.pos; return this.readRegexp() } + if (next === 61) { return this.finishOp(types$1.assign, 2) } + return this.finishOp(types$1.slash, 1) + }; + + pp.readToken_mult_modulo_exp = function(code) { // '%*' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + var tokentype = code === 42 ? types$1.star : types$1.modulo; + + // exponentiation operator ** and **= + if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) { + ++size; + tokentype = types$1.starstar; + next = this.input.charCodeAt(this.pos + 2); + } + + if (next === 61) { return this.finishOp(types$1.assign, size + 1) } + return this.finishOp(tokentype, size) + }; + + pp.readToken_pipe_amp = function(code) { // '|&' + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (this.options.ecmaVersion >= 12) { + var next2 = this.input.charCodeAt(this.pos + 2); + if (next2 === 61) { return this.finishOp(types$1.assign, 3) } + } + return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2) + } + if (next === 61) { return this.finishOp(types$1.assign, 2) } + return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1) + }; + + pp.readToken_caret = function() { // '^' + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { return this.finishOp(types$1.assign, 2) } + return this.finishOp(types$1.bitwiseXOR, 1) + }; + + pp.readToken_plus_min = function(code) { // '+-' + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 && + (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) { + // A `-->` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types$1.incDec, 2) + } + if (next === 61) { return this.finishOp(types$1.assign, 2) } + return this.finishOp(types$1.plusMin, 1) + }; + + pp.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types$1.assign, size + 1) } + return this.finishOp(types$1.bitShift, size) + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { + // `<!--`, an XML-style comment that should be interpreted as a line comment + this.skipLineComment(4); + this.skipSpace(); + return this.nextToken() + } + if (next === 61) { size = 2; } + return this.finishOp(types$1.relational, size) + }; + + pp.readToken_eq_excl = function(code) { // '=!' + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { return this.finishOp(types$1.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) } + if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { // '=>' + this.pos += 2; + return this.finishToken(types$1.arrow) + } + return this.finishOp(code === 61 ? types$1.eq : types$1.prefix, 1) + }; + + pp.readToken_question = function() { // '?' + var ecmaVersion = this.options.ecmaVersion; + if (ecmaVersion >= 11) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 46) { + var next2 = this.input.charCodeAt(this.pos + 2); + if (next2 < 48 || next2 > 57) { return this.finishOp(types$1.questionDot, 2) } + } + if (next === 63) { + if (ecmaVersion >= 12) { + var next2$1 = this.input.charCodeAt(this.pos + 2); + if (next2$1 === 61) { return this.finishOp(types$1.assign, 3) } + } + return this.finishOp(types$1.coalesce, 2) + } + } + return this.finishOp(types$1.question, 1) + }; + + pp.readToken_numberSign = function() { // '#' + var ecmaVersion = this.options.ecmaVersion; + var code = 35; // '#' + if (ecmaVersion >= 13) { + ++this.pos; + code = this.fullCharCodeAtPos(); + if (isIdentifierStart(code, true) || code === 92 /* '\' */) { + return this.finishToken(types$1.privateId, this.readWord1()) + } + } + + this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'"); + }; + + pp.getTokenFromCode = function(code) { + switch (code) { + // The interpretation of a dot depends on whether it is followed + // by a digit or another two dots. + case 46: // '.' + return this.readToken_dot() + + // Punctuation tokens. + case 40: ++this.pos; return this.finishToken(types$1.parenL) + case 41: ++this.pos; return this.finishToken(types$1.parenR) + case 59: ++this.pos; return this.finishToken(types$1.semi) + case 44: ++this.pos; return this.finishToken(types$1.comma) + case 91: ++this.pos; return this.finishToken(types$1.bracketL) + case 93: ++this.pos; return this.finishToken(types$1.bracketR) + case 123: ++this.pos; return this.finishToken(types$1.braceL) + case 125: ++this.pos; return this.finishToken(types$1.braceR) + case 58: ++this.pos; return this.finishToken(types$1.colon) + + case 96: // '`' + if (this.options.ecmaVersion < 6) { break } + ++this.pos; + return this.finishToken(types$1.backQuote) + + case 48: // '0' + var next = this.input.charCodeAt(this.pos + 1); + if (next === 120 || next === 88) { return this.readRadixNumber(16) } // '0x', '0X' - hex number + if (this.options.ecmaVersion >= 6) { + if (next === 111 || next === 79) { return this.readRadixNumber(8) } // '0o', '0O' - octal number + if (next === 98 || next === 66) { return this.readRadixNumber(2) } // '0b', '0B' - binary number + } + + // Anything else beginning with a digit is an integer, octal + // number, or float. + case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9 + return this.readNumber(false) + + // Quotes produce strings. + case 34: case 39: // '"', "'" + return this.readString(code) + + // Operators are parsed inline in tiny state machines. '=' (61) is + // often referred to. `finishOp` simply skips the amount of + // characters it is given as second argument, and returns a token + // of the type given by its first argument. + case 47: // '/' + return this.readToken_slash() + + case 37: case 42: // '%*' + return this.readToken_mult_modulo_exp(code) + + case 124: case 38: // '|&' + return this.readToken_pipe_amp(code) + + case 94: // '^' + return this.readToken_caret() + + case 43: case 45: // '+-' + return this.readToken_plus_min(code) + + case 60: case 62: // '<>' + return this.readToken_lt_gt(code) + + case 61: case 33: // '=!' + return this.readToken_eq_excl(code) + + case 63: // '?' + return this.readToken_question() + + case 126: // '~' + return this.finishOp(types$1.prefix, 1) + + case 35: // '#' + return this.readToken_numberSign() + } + + this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'"); + }; + + pp.finishOp = function(type, size) { + var str = this.input.slice(this.pos, this.pos + size); + this.pos += size; + return this.finishToken(type, str) + }; + + pp.readRegexp = function() { + var escaped, inClass, start = this.pos; + for (;;) { + if (this.pos >= this.input.length) { this.raise(start, "Unterminated regular expression"); } + var ch = this.input.charAt(this.pos); + if (lineBreak.test(ch)) { this.raise(start, "Unterminated regular expression"); } + if (!escaped) { + if (ch === "[") { inClass = true; } + else if (ch === "]" && inClass) { inClass = false; } + else if (ch === "/" && !inClass) { break } + escaped = ch === "\\"; + } else { escaped = false; } + ++this.pos; + } + var pattern = this.input.slice(start, this.pos); + ++this.pos; + var flagsStart = this.pos; + var flags = this.readWord1(); + if (this.containsEsc) { this.unexpected(flagsStart); } + + // Validate pattern + var state = this.regexpState || (this.regexpState = new RegExpValidationState(this)); + state.reset(start, pattern, flags); + this.validateRegExpFlags(state); + this.validateRegExpPattern(state); + + // Create Literal#value property value. + var value = null; + try { + value = new RegExp(pattern, flags); + } catch (e) { + // ESTree requires null if it failed to instantiate RegExp object. + // https://github.com/estree/estree/blob/a27003adf4fd7bfad44de9cef372a2eacd527b1c/es5.md#regexpliteral + } + + return this.finishToken(types$1.regexp, {pattern: pattern, flags: flags, value: value}) + }; + + // Read an integer in the given radix. Return null if zero digits + // were read, the integer value otherwise. When `len` is given, this + // will return `null` unless the integer has exactly `len` digits. + + pp.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) { + // `len` is used for character escape sequences. In that case, disallow separators. + var allowSeparators = this.options.ecmaVersion >= 12 && len === undefined; + + // `maybeLegacyOctalNumericLiteral` is true if it doesn't have prefix (0x,0o,0b) + // and isn't fraction part nor exponent part. In that case, if the first digit + // is zero then disallow separators. + var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48; + + var start = this.pos, total = 0, lastCode = 0; + for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) { + var code = this.input.charCodeAt(this.pos), val = (void 0); + + if (allowSeparators && code === 95) { + if (isLegacyOctalNumericLiteral) { this.raiseRecoverable(this.pos, "Numeric separator is not allowed in legacy octal numeric literals"); } + if (lastCode === 95) { this.raiseRecoverable(this.pos, "Numeric separator must be exactly one underscore"); } + if (i === 0) { this.raiseRecoverable(this.pos, "Numeric separator is not allowed at the first of digits"); } + lastCode = code; + continue + } + + if (code >= 97) { val = code - 97 + 10; } // a + else if (code >= 65) { val = code - 65 + 10; } // A + else if (code >= 48 && code <= 57) { val = code - 48; } // 0-9 + else { val = Infinity; } + if (val >= radix) { break } + lastCode = code; + total = total * radix + val; + } + + if (allowSeparators && lastCode === 95) { this.raiseRecoverable(this.pos - 1, "Numeric separator is not allowed at the last of digits"); } + if (this.pos === start || len != null && this.pos - start !== len) { return null } + + return total + }; + + function stringToNumber(str, isLegacyOctalNumericLiteral) { + if (isLegacyOctalNumericLiteral) { + return parseInt(str, 8) + } + + // `parseFloat(value)` stops parsing at the first numeric separator then returns a wrong value. + return parseFloat(str.replace(/_/g, "")) + } + + function stringToBigInt(str) { + if (typeof BigInt !== "function") { + return null + } + + // `BigInt(value)` throws syntax error if the string contains numeric separators. + return BigInt(str.replace(/_/g, "")) + } + + pp.readRadixNumber = function(radix) { + var start = this.pos; + this.pos += 2; // 0x + var val = this.readInt(radix); + if (val == null) { this.raise(this.start + 2, "Expected number in radix " + radix); } + if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) { + val = stringToBigInt(this.input.slice(start, this.pos)); + ++this.pos; + } else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); } + return this.finishToken(types$1.num, val) + }; + + // Read an integer, octal integer, or floating-point number. + + pp.readNumber = function(startsWithDot) { + var start = this.pos; + if (!startsWithDot && this.readInt(10, undefined, true) === null) { this.raise(start, "Invalid number"); } + var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48; + if (octal && this.strict) { this.raise(start, "Invalid number"); } + var next = this.input.charCodeAt(this.pos); + if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) { + var val$1 = stringToBigInt(this.input.slice(start, this.pos)); + ++this.pos; + if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); } + return this.finishToken(types$1.num, val$1) + } + if (octal && /[89]/.test(this.input.slice(start, this.pos))) { octal = false; } + if (next === 46 && !octal) { // '.' + ++this.pos; + this.readInt(10); + next = this.input.charCodeAt(this.pos); + } + if ((next === 69 || next === 101) && !octal) { // 'eE' + next = this.input.charCodeAt(++this.pos); + if (next === 43 || next === 45) { ++this.pos; } // '+-' + if (this.readInt(10) === null) { this.raise(start, "Invalid number"); } + } + if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); } + + var val = stringToNumber(this.input.slice(start, this.pos), octal); + return this.finishToken(types$1.num, val) + }; + + // Read a string value, interpreting backslash-escapes. + + pp.readCodePoint = function() { + var ch = this.input.charCodeAt(this.pos), code; + + if (ch === 123) { // '{' + if (this.options.ecmaVersion < 6) { this.unexpected(); } + var codePos = ++this.pos; + code = this.readHexChar(this.input.indexOf("}", this.pos) - this.pos); + ++this.pos; + if (code > 0x10FFFF) { this.invalidStringToken(codePos, "Code point out of bounds"); } + } else { + code = this.readHexChar(4); + } + return code + }; + + pp.readString = function(quote) { + var out = "", chunkStart = ++this.pos; + for (;;) { + if (this.pos >= this.input.length) { this.raise(this.start, "Unterminated string constant"); } + var ch = this.input.charCodeAt(this.pos); + if (ch === quote) { break } + if (ch === 92) { // '\' + out += this.input.slice(chunkStart, this.pos); + out += this.readEscapedChar(false); + chunkStart = this.pos; + } else if (ch === 0x2028 || ch === 0x2029) { + if (this.options.ecmaVersion < 10) { this.raise(this.start, "Unterminated string constant"); } + ++this.pos; + if (this.options.locations) { + this.curLine++; + this.lineStart = this.pos; + } + } else { + if (isNewLine(ch)) { this.raise(this.start, "Unterminated string constant"); } + ++this.pos; + } + } + out += this.input.slice(chunkStart, this.pos++); + return this.finishToken(types$1.string, out) + }; + + // Reads template string tokens. + + var INVALID_TEMPLATE_ESCAPE_ERROR = {}; + + pp.tryReadTemplateToken = function() { + this.inTemplateElement = true; + try { + this.readTmplToken(); + } catch (err) { + if (err === INVALID_TEMPLATE_ESCAPE_ERROR) { + this.readInvalidTemplateToken(); + } else { + throw err + } + } + + this.inTemplateElement = false; + }; + + pp.invalidStringToken = function(position, message) { + if (this.inTemplateElement && this.options.ecmaVersion >= 9) { + throw INVALID_TEMPLATE_ESCAPE_ERROR + } else { + this.raise(position, message); + } + }; + + pp.readTmplToken = function() { + var out = "", chunkStart = this.pos; + for (;;) { + if (this.pos >= this.input.length) { this.raise(this.start, "Unterminated template"); } + var ch = this.input.charCodeAt(this.pos); + if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { // '`', '${' + if (this.pos === this.start && (this.type === types$1.template || this.type === types$1.invalidTemplate)) { + if (ch === 36) { + this.pos += 2; + return this.finishToken(types$1.dollarBraceL) + } else { + ++this.pos; + return this.finishToken(types$1.backQuote) + } + } + out += this.input.slice(chunkStart, this.pos); + return this.finishToken(types$1.template, out) + } + if (ch === 92) { // '\' + out += this.input.slice(chunkStart, this.pos); + out += this.readEscapedChar(true); + chunkStart = this.pos; + } else if (isNewLine(ch)) { + out += this.input.slice(chunkStart, this.pos); + ++this.pos; + switch (ch) { + case 13: + if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } + case 10: + out += "\n"; + break + default: + out += String.fromCharCode(ch); + break + } + if (this.options.locations) { + ++this.curLine; + this.lineStart = this.pos; + } + chunkStart = this.pos; + } else { + ++this.pos; + } + } + }; + + // Reads a template token to search for the end, without validating any escape sequences + pp.readInvalidTemplateToken = function() { + for (; this.pos < this.input.length; this.pos++) { + switch (this.input[this.pos]) { + case "\\": + ++this.pos; + break + + case "$": + if (this.input[this.pos + 1] !== "{") { + break + } + + // falls through + case "`": + return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos)) + + // no default + } + } + this.raise(this.start, "Unterminated template"); + }; + + // Used to read escaped characters + + pp.readEscapedChar = function(inTemplate) { + var ch = this.input.charCodeAt(++this.pos); + ++this.pos; + switch (ch) { + case 110: return "\n" // 'n' -> '\n' + case 114: return "\r" // 'r' -> '\r' + case 120: return String.fromCharCode(this.readHexChar(2)) // 'x' + case 117: return codePointToString(this.readCodePoint()) // 'u' + case 116: return "\t" // 't' -> '\t' + case 98: return "\b" // 'b' -> '\b' + case 118: return "\u000b" // 'v' -> '\u000b' + case 102: return "\f" // 'f' -> '\f' + case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } // '\r\n' + case 10: // ' \n' + if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; } + return "" + case 56: + case 57: + if (this.strict) { + this.invalidStringToken( + this.pos - 1, + "Invalid escape sequence" + ); + } + if (inTemplate) { + var codePos = this.pos - 1; + + this.invalidStringToken( + codePos, + "Invalid escape sequence in template string" + ); + + return null + } + default: + if (ch >= 48 && ch <= 55) { + var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0]; + var octal = parseInt(octalStr, 8); + if (octal > 255) { + octalStr = octalStr.slice(0, -1); + octal = parseInt(octalStr, 8); + } + this.pos += octalStr.length - 1; + ch = this.input.charCodeAt(this.pos); + if ((octalStr !== "0" || ch === 56 || ch === 57) && (this.strict || inTemplate)) { + this.invalidStringToken( + this.pos - 1 - octalStr.length, + inTemplate + ? "Octal literal in template string" + : "Octal literal in strict mode" + ); + } + return String.fromCharCode(octal) + } + if (isNewLine(ch)) { + // Unicode new line characters after \ get removed from output in both + // template literals and strings + return "" + } + return String.fromCharCode(ch) + } + }; + + // Used to read character escape sequences ('\x', '\u', '\U'). + + pp.readHexChar = function(len) { + var codePos = this.pos; + var n = this.readInt(16, len); + if (n === null) { this.invalidStringToken(codePos, "Bad character escape sequence"); } + return n + }; + + // Read an identifier, and return it as a string. Sets `this.containsEsc` + // to whether the word contained a '\u' escape. + // + // Incrementally adds only escaped chars, adding other chunks as-is + // as a micro-optimization. + + pp.readWord1 = function() { + this.containsEsc = false; + var word = "", first = true, chunkStart = this.pos; + var astral = this.options.ecmaVersion >= 6; + while (this.pos < this.input.length) { + var ch = this.fullCharCodeAtPos(); + if (isIdentifierChar(ch, astral)) { + this.pos += ch <= 0xffff ? 1 : 2; + } else if (ch === 92) { // "\" + this.containsEsc = true; + word += this.input.slice(chunkStart, this.pos); + var escStart = this.pos; + if (this.input.charCodeAt(++this.pos) !== 117) // "u" + { this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX"); } + ++this.pos; + var esc = this.readCodePoint(); + if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral)) + { this.invalidStringToken(escStart, "Invalid Unicode escape"); } + word += codePointToString(esc); + chunkStart = this.pos; + } else { + break + } + first = false; + } + return word + this.input.slice(chunkStart, this.pos) + }; + + // Read an identifier or keyword token. Will check for reserved + // words when necessary. + + pp.readWord = function() { + var word = this.readWord1(); + var type = types$1.name; + if (this.keywords.test(word)) { + type = keywords[word]; + } + return this.finishToken(type, word) + }; + + // Acorn is a tiny, fast JavaScript parser written in JavaScript. + + var version = "8.7.1"; + + Parser.acorn = { + Parser: Parser, + version: version, + defaultOptions: defaultOptions, + Position: Position, + SourceLocation: SourceLocation, + getLineInfo: getLineInfo, + Node: Node, + TokenType: TokenType, + tokTypes: types$1, + keywordTypes: keywords, + TokContext: TokContext, + tokContexts: types, + isIdentifierChar: isIdentifierChar, + isIdentifierStart: isIdentifierStart, + Token: Token, + isNewLine: isNewLine, + lineBreak: lineBreak, + lineBreakG: lineBreakG, + nonASCIIwhitespace: nonASCIIwhitespace + }; + + // The main exported interface (under `self.acorn` when in the + // browser) is a `parse` function that takes a code string and + // returns an abstract syntax tree as specified by [Mozilla parser + // API][api]. + // + // [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API + + function parse(input, options) { + return Parser.parse(input, options) + } + + // This function tries to parse a single expression at a given + // offset in a string. Useful for parsing mixed-language formats + // that embed JavaScript expressions. + + function parseExpressionAt(input, pos, options) { + return Parser.parseExpressionAt(input, pos, options) + } + + // Acorn is organized as a tokenizer and a recursive-descent parser. + // The `tokenizer` export provides an interface to the tokenizer. + + function tokenizer(input, options) { + return Parser.tokenizer(input, options) + } + + exports.Node = Node; + exports.Parser = Parser; + exports.Position = Position; + exports.SourceLocation = SourceLocation; + exports.TokContext = TokContext; + exports.Token = Token; + exports.TokenType = TokenType; + exports.defaultOptions = defaultOptions; + exports.getLineInfo = getLineInfo; + exports.isIdentifierChar = isIdentifierChar; + exports.isIdentifierStart = isIdentifierStart; + exports.isNewLine = isNewLine; + exports.keywordTypes = keywords; + exports.lineBreak = lineBreak; + exports.lineBreakG = lineBreakG; + exports.nonASCIIwhitespace = nonASCIIwhitespace; + exports.parse = parse; + exports.parseExpressionAt = parseExpressionAt; + exports.tokContexts = types; + exports.tokTypes = types$1; + exports.tokenizer = tokenizer; + exports.version = version; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); + +},{}],14:[function(require,module,exports){ +/** + * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202, + * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1. + * + * Copyright 2008-2023 Brian Turek, 1998-2009 Paul Johnston & Contributors + * Distributed under the BSD License + * See http://caligatio.github.com/jsSHA/ for more information + * + * Two ECMAScript polyfill functions carry the following license: + * + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, + * INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + * MERCHANTABLITY OR NON-INFRINGEMENT. + * + * See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. + */ +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).jsSHA=r()}(this,(function(){"use strict";var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="ARRAYBUFFER not supported by this environment",t="UINT8ARRAY not supported by this environment";function e(n,r,t,e){var i,o,u,f=r||[0],s=(t=t||0)>>>3,w=-1===e?3:0;for(i=0;i<n.length;i+=1)o=(u=i+s)>>>2,f.length<=o&&f.push(0),f[o]|=n[i]<<8*(w+e*(u%4));return{value:f,binLen:8*n.length+t}}function i(i,o,u){switch(o){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(i){case"HEX":return function(n,r,t){return function(n,r,t,e){var i,o,u,f;if(0!=n.length%2)throw new Error("String of HEX type must be in byte increments");var s=r||[0],w=(t=t||0)>>>3,a=-1===e?3:0;for(i=0;i<n.length;i+=2){if(o=parseInt(n.substr(i,2),16),isNaN(o))throw new Error("String of HEX type contains invalid characters");for(u=(f=(i>>>1)+w)>>>2;s.length<=u;)s.push(0);s[u]|=o<<8*(a+e*(f%4))}return{value:s,binLen:4*n.length+t}}(n,r,t,u)};case"TEXT":return function(n,r,t){return function(n,r,t,e,i){var o,u,f,s,w,a,h,c,v=0,A=t||[0],E=(e=e||0)>>>3;if("UTF8"===r)for(h=-1===i?3:0,f=0;f<n.length;f+=1)for(u=[],128>(o=n.charCodeAt(f))?u.push(o):2048>o?(u.push(192|o>>>6),u.push(128|63&o)):55296>o||57344<=o?u.push(224|o>>>12,128|o>>>6&63,128|63&o):(f+=1,o=65536+((1023&o)<<10|1023&n.charCodeAt(f)),u.push(240|o>>>18,128|o>>>12&63,128|o>>>6&63,128|63&o)),s=0;s<u.length;s+=1){for(w=(a=v+E)>>>2;A.length<=w;)A.push(0);A[w]|=u[s]<<8*(h+i*(a%4)),v+=1}else for(h=-1===i?2:0,c="UTF16LE"===r&&1!==i||"UTF16LE"!==r&&1===i,f=0;f<n.length;f+=1){for(o=n.charCodeAt(f),!0===c&&(o=(s=255&o)<<8|o>>>8),w=(a=v+E)>>>2;A.length<=w;)A.push(0);A[w]|=o<<8*(h+i*(a%4)),v+=2}return{value:A,binLen:8*v+e}}(n,o,r,t,u)};case"B64":return function(r,t,e){return function(r,t,e,i){var o,u,f,s,w,a,h=0,c=t||[0],v=(e=e||0)>>>3,A=-1===i?3:0,E=r.indexOf("=");if(-1===r.search(/^[a-zA-Z0-9=+/]+$/))throw new Error("Invalid character in base-64 string");if(r=r.replace(/=/g,""),-1!==E&&E<r.length)throw new Error("Invalid '=' found in base-64 string");for(o=0;o<r.length;o+=4){for(s=r.substr(o,4),f=0,u=0;u<s.length;u+=1)f|=n.indexOf(s.charAt(u))<<18-6*u;for(u=0;u<s.length-1;u+=1){for(w=(a=h+v)>>>2;c.length<=w;)c.push(0);c[w]|=(f>>>16-8*u&255)<<8*(A+i*(a%4)),h+=1}}return{value:c,binLen:8*h+e}}(r,t,e,u)};case"BYTES":return function(n,r,t){return function(n,r,t,e){var i,o,u,f,s=r||[0],w=(t=t||0)>>>3,a=-1===e?3:0;for(o=0;o<n.length;o+=1)i=n.charCodeAt(o),u=(f=o+w)>>>2,s.length<=u&&s.push(0),s[u]|=i<<8*(a+e*(f%4));return{value:s,binLen:8*n.length+t}}(n,r,t,u)};case"ARRAYBUFFER":try{new ArrayBuffer(0)}catch(n){throw new Error(r)}return function(n,r,t){return function(n,r,t,i){return e(new Uint8Array(n),r,t,i)}(n,r,t,u)};case"UINT8ARRAY":try{new Uint8Array(0)}catch(n){throw new Error(t)}return function(n,r,t){return e(n,r,t,u)};default:throw new Error("format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY")}}function o(e,i,o,u){switch(e){case"HEX":return function(n){return function(n,r,t,e){var i,o,u="0123456789abcdef",f="",s=r/8,w=-1===t?3:0;for(i=0;i<s;i+=1)o=n[i>>>2]>>>8*(w+t*(i%4)),f+=u.charAt(o>>>4&15)+u.charAt(15&o);return e.outputUpper?f.toUpperCase():f}(n,i,o,u)};case"B64":return function(r){return function(r,t,e,i){var o,u,f,s,w,a="",h=t/8,c=-1===e?3:0;for(o=0;o<h;o+=3)for(s=o+1<h?r[o+1>>>2]:0,w=o+2<h?r[o+2>>>2]:0,f=(r[o>>>2]>>>8*(c+e*(o%4))&255)<<16|(s>>>8*(c+e*((o+1)%4))&255)<<8|w>>>8*(c+e*((o+2)%4))&255,u=0;u<4;u+=1)a+=8*o+6*u<=t?n.charAt(f>>>6*(3-u)&63):i.b64Pad;return a}(r,i,o,u)};case"BYTES":return function(n){return function(n,r,t){var e,i,o="",u=r/8,f=-1===t?3:0;for(e=0;e<u;e+=1)i=n[e>>>2]>>>8*(f+t*(e%4))&255,o+=String.fromCharCode(i);return o}(n,i,o)};case"ARRAYBUFFER":try{new ArrayBuffer(0)}catch(n){throw new Error(r)}return function(n){return function(n,r,t){var e,i=r/8,o=new ArrayBuffer(i),u=new Uint8Array(o),f=-1===t?3:0;for(e=0;e<i;e+=1)u[e]=n[e>>>2]>>>8*(f+t*(e%4))&255;return o}(n,i,o)};case"UINT8ARRAY":try{new Uint8Array(0)}catch(n){throw new Error(t)}return function(n){return function(n,r,t){var e,i=r/8,o=-1===t?3:0,u=new Uint8Array(i);for(e=0;e<i;e+=1)u[e]=n[e>>>2]>>>8*(o+t*(e%4))&255;return u}(n,i,o)};default:throw new Error("format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY")}}var u=4294967296,f=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],w=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],a="Chosen SHA variant is not supported",h="Cannot set numRounds with MAC";function c(n,r){var t,e,i=n.binLen>>>3,o=r.binLen>>>3,u=i<<3,f=4-i<<3;if(i%4!=0){for(t=0;t<o;t+=4)e=i+t>>>2,n.value[e]|=r.value[t>>>2]<<u,n.value.push(0),n.value[e+1]|=r.value[t>>>2]>>>f;return(n.value.length<<2)-4>=o+i&&n.value.pop(),{value:n.value,binLen:n.binLen+r.binLen}}return{value:n.value.concat(r.value),binLen:n.binLen+r.binLen}}function v(n){var r={outputUpper:!1,b64Pad:"=",outputLen:-1},t=n||{},e="Output length must be a multiple of 8";if(r.outputUpper=t.outputUpper||!1,t.b64Pad&&(r.b64Pad=t.b64Pad),t.outputLen){if(t.outputLen%8!=0)throw new Error(e);r.outputLen=t.outputLen}else if(t.shakeLen){if(t.shakeLen%8!=0)throw new Error(e);r.outputLen=t.shakeLen}if("boolean"!=typeof r.outputUpper)throw new Error("Invalid outputUpper formatting option");if("string"!=typeof r.b64Pad)throw new Error("Invalid b64Pad formatting option");return r}function A(n,r,t,e){var o=n+" must include a value and format";if(!r){if(!e)throw new Error(o);return e}if(void 0===r.value||!r.format)throw new Error(o);return i(r.format,r.encoding||"UTF8",t)(r.value)}var E=function(){function n(n,r,t){var e=t||{};if(this.t=r,this.i=e.encoding||"UTF8",this.numRounds=e.numRounds||1,isNaN(this.numRounds)||this.numRounds!==parseInt(this.numRounds,10)||1>this.numRounds)throw new Error("numRounds must a integer >= 1");this.o=n,this.u=[],this.h=0,this.v=!1,this.A=0,this.l=!1,this.S=[],this.H=[]}return n.prototype.update=function(n){var r,t=0,e=this.p>>>5,i=this.m(n,this.u,this.h),o=i.binLen,u=i.value,f=o>>>5;for(r=0;r<f;r+=e)t+this.p<=o&&(this.U=this.R(u.slice(r,r+e),this.U),t+=this.p);return this.A+=t,this.u=u.slice(t>>>5),this.h=o%this.p,this.v=!0,this},n.prototype.getHash=function(n,r){var t,e,i=this.T,u=v(r);if(this.C){if(-1===u.outputLen)throw new Error("Output length must be specified in options");i=u.outputLen}var f=o(n,i,this.F,u);if(this.l&&this.K)return f(this.K(u));for(e=this.g(this.u.slice(),this.h,this.A,this.L(this.U),i),t=1;t<this.numRounds;t+=1)this.C&&i%32!=0&&(e[e.length-1]&=16777215>>>24-i%32),e=this.g(e,i,0,this.B(this.o),i);return f(e)},n.prototype.setHMACKey=function(n,r,t){if(!this.k)throw new Error("Variant does not support HMAC");if(this.v)throw new Error("Cannot set MAC key after calling update");var e=i(r,(t||{}).encoding||"UTF8",this.F);this.Y(e(n))},n.prototype.Y=function(n){var r,t=this.p>>>3,e=t/4-1;if(1!==this.numRounds)throw new Error(h);if(this.l)throw new Error("MAC key already set");for(t<n.binLen/8&&(n.value=this.g(n.value,n.binLen,0,this.B(this.o),this.T));n.value.length<=e;)n.value.push(0);for(r=0;r<=e;r+=1)this.S[r]=909522486^n.value[r],this.H[r]=1549556828^n.value[r];this.U=this.R(this.S,this.U),this.A=this.p,this.l=!0},n.prototype.getHMAC=function(n,r){var t=v(r);return o(n,this.T,this.F,t)(this.N())},n.prototype.N=function(){var n;if(!this.l)throw new Error("Cannot call getHMAC without first setting MAC key");var r=this.g(this.u.slice(),this.h,this.A,this.L(this.U),this.T);return n=this.R(this.H,this.B(this.o)),n=this.g(r,this.T,this.p,n,this.T)},n}(),l=function(n,r){return l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,r){n.__proto__=r}||function(n,r){for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(n[t]=r[t])},l(n,r)};function b(n,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function t(){this.constructor=n}l(n,r),n.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}function S(n,r){return n<<r|n>>>32-r}function H(n,r){return n>>>r|n<<32-r}function d(n,r){return n>>>r}function p(n,r,t){return n^r^t}function y(n,r,t){return n&r^~n&t}function m(n,r,t){return n&r^n&t^r&t}function U(n){return H(n,2)^H(n,13)^H(n,22)}function R(n,r){var t=(65535&n)+(65535&r);return(65535&(n>>>16)+(r>>>16)+(t>>>16))<<16|65535&t}function T(n,r,t,e){var i=(65535&n)+(65535&r)+(65535&t)+(65535&e);return(65535&(n>>>16)+(r>>>16)+(t>>>16)+(e>>>16)+(i>>>16))<<16|65535&i}function C(n,r,t,e,i){var o=(65535&n)+(65535&r)+(65535&t)+(65535&e)+(65535&i);return(65535&(n>>>16)+(r>>>16)+(t>>>16)+(e>>>16)+(i>>>16)+(o>>>16))<<16|65535&o}function F(n){return H(n,7)^H(n,18)^d(n,3)}function K(n){return H(n,6)^H(n,11)^H(n,25)}function g(n){return[1732584193,4023233417,2562383102,271733878,3285377520]}function L(n,r){var t,e,i,o,u,f,s,w=[];for(t=r[0],e=r[1],i=r[2],o=r[3],u=r[4],s=0;s<80;s+=1)w[s]=s<16?n[s]:S(w[s-3]^w[s-8]^w[s-14]^w[s-16],1),f=s<20?C(S(t,5),y(e,i,o),u,1518500249,w[s]):s<40?C(S(t,5),p(e,i,o),u,1859775393,w[s]):s<60?C(S(t,5),m(e,i,o),u,2400959708,w[s]):C(S(t,5),p(e,i,o),u,3395469782,w[s]),u=o,o=i,i=S(e,30),e=t,t=f;return r[0]=R(t,r[0]),r[1]=R(e,r[1]),r[2]=R(i,r[2]),r[3]=R(o,r[3]),r[4]=R(u,r[4]),r}function B(n,r,t,e){for(var i,o=15+(r+65>>>9<<4),f=r+t;n.length<=o;)n.push(0);for(n[r>>>5]|=128<<24-r%32,n[o]=4294967295&f,n[o-1]=f/u|0,i=0;i<n.length;i+=16)e=L(n.slice(i,i+16),e);return e}"function"==typeof SuppressedError&&SuppressedError;var k=function(n){function r(r,t,e){var o=this;if("SHA-1"!==r)throw new Error(a);var u=e||{};return(o=n.call(this,r,t,e)||this).k=!0,o.K=o.N,o.F=-1,o.m=i(o.t,o.i,o.F),o.R=L,o.L=function(n){return n.slice()},o.B=g,o.g=B,o.U=[1732584193,4023233417,2562383102,271733878,3285377520],o.p=512,o.T=160,o.C=!1,u.hmacKey&&o.Y(A("hmacKey",u.hmacKey,o.F)),o}return b(r,n),r}(E);function Y(n){return"SHA-224"==n?s.slice():w.slice()}function N(n,r){var t,e,i,o,u,s,w,a,h,c,v,A,E=[];for(t=r[0],e=r[1],i=r[2],o=r[3],u=r[4],s=r[5],w=r[6],a=r[7],v=0;v<64;v+=1)E[v]=v<16?n[v]:T(H(A=E[v-2],17)^H(A,19)^d(A,10),E[v-7],F(E[v-15]),E[v-16]),h=C(a,K(u),y(u,s,w),f[v],E[v]),c=R(U(t),m(t,e,i)),a=w,w=s,s=u,u=R(o,h),o=i,i=e,e=t,t=R(h,c);return r[0]=R(t,r[0]),r[1]=R(e,r[1]),r[2]=R(i,r[2]),r[3]=R(o,r[3]),r[4]=R(u,r[4]),r[5]=R(s,r[5]),r[6]=R(w,r[6]),r[7]=R(a,r[7]),r}var I=function(n){function r(r,t,e){var o=this;if("SHA-224"!==r&&"SHA-256"!==r)throw new Error(a);var f=e||{};return(o=n.call(this,r,t,e)||this).K=o.N,o.k=!0,o.F=-1,o.m=i(o.t,o.i,o.F),o.R=N,o.L=function(n){return n.slice()},o.B=Y,o.g=function(n,t,e,i){return function(n,r,t,e,i){for(var o,f=15+(r+65>>>9<<4),s=r+t;n.length<=f;)n.push(0);for(n[r>>>5]|=128<<24-r%32,n[f]=4294967295&s,n[f-1]=s/u|0,o=0;o<n.length;o+=16)e=N(n.slice(o,o+16),e);return"SHA-224"===i?[e[0],e[1],e[2],e[3],e[4],e[5],e[6]]:e}(n,t,e,i,r)},o.U=Y(r),o.p=512,o.T="SHA-224"===r?224:256,o.C=!1,f.hmacKey&&o.Y(A("hmacKey",f.hmacKey,o.F)),o}return b(r,n),r}(E),M=function(n,r){this.I=n,this.M=r};function X(n,r){var t;return r>32?(t=64-r,new M(n.M<<r|n.I>>>t,n.I<<r|n.M>>>t)):0!==r?(t=32-r,new M(n.I<<r|n.M>>>t,n.M<<r|n.I>>>t)):n}function z(n,r){var t;return r<32?(t=32-r,new M(n.I>>>r|n.M<<t,n.M>>>r|n.I<<t)):(t=64-r,new M(n.M>>>r|n.I<<t,n.I>>>r|n.M<<t))}function O(n,r){return new M(n.I>>>r,n.M>>>r|n.I<<32-r)}function j(n,r,t){return new M(n.I&r.I^~n.I&t.I,n.M&r.M^~n.M&t.M)}function _(n,r,t){return new M(n.I&r.I^n.I&t.I^r.I&t.I,n.M&r.M^n.M&t.M^r.M&t.M)}function x(n){var r=z(n,28),t=z(n,34),e=z(n,39);return new M(r.I^t.I^e.I,r.M^t.M^e.M)}function P(n,r){var t,e;t=(65535&n.M)+(65535&r.M);var i=(65535&(e=(n.M>>>16)+(r.M>>>16)+(t>>>16)))<<16|65535&t;return t=(65535&n.I)+(65535&r.I)+(e>>>16),e=(n.I>>>16)+(r.I>>>16)+(t>>>16),new M((65535&e)<<16|65535&t,i)}function V(n,r,t,e){var i,o;i=(65535&n.M)+(65535&r.M)+(65535&t.M)+(65535&e.M);var u=(65535&(o=(n.M>>>16)+(r.M>>>16)+(t.M>>>16)+(e.M>>>16)+(i>>>16)))<<16|65535&i;return i=(65535&n.I)+(65535&r.I)+(65535&t.I)+(65535&e.I)+(o>>>16),o=(n.I>>>16)+(r.I>>>16)+(t.I>>>16)+(e.I>>>16)+(i>>>16),new M((65535&o)<<16|65535&i,u)}function Z(n,r,t,e,i){var o,u;o=(65535&n.M)+(65535&r.M)+(65535&t.M)+(65535&e.M)+(65535&i.M);var f=(65535&(u=(n.M>>>16)+(r.M>>>16)+(t.M>>>16)+(e.M>>>16)+(i.M>>>16)+(o>>>16)))<<16|65535&o;return o=(65535&n.I)+(65535&r.I)+(65535&t.I)+(65535&e.I)+(65535&i.I)+(u>>>16),u=(n.I>>>16)+(r.I>>>16)+(t.I>>>16)+(e.I>>>16)+(i.I>>>16)+(o>>>16),new M((65535&u)<<16|65535&o,f)}function q(n,r){return new M(n.I^r.I,n.M^r.M)}function D(n){var r=z(n,1),t=z(n,8),e=O(n,7);return new M(r.I^t.I^e.I,r.M^t.M^e.M)}function G(n){var r=z(n,14),t=z(n,18),e=z(n,41);return new M(r.I^t.I^e.I,r.M^t.M^e.M)}var J=[new M(f[0],3609767458),new M(f[1],602891725),new M(f[2],3964484399),new M(f[3],2173295548),new M(f[4],4081628472),new M(f[5],3053834265),new M(f[6],2937671579),new M(f[7],3664609560),new M(f[8],2734883394),new M(f[9],1164996542),new M(f[10],1323610764),new M(f[11],3590304994),new M(f[12],4068182383),new M(f[13],991336113),new M(f[14],633803317),new M(f[15],3479774868),new M(f[16],2666613458),new M(f[17],944711139),new M(f[18],2341262773),new M(f[19],2007800933),new M(f[20],1495990901),new M(f[21],1856431235),new M(f[22],3175218132),new M(f[23],2198950837),new M(f[24],3999719339),new M(f[25],766784016),new M(f[26],2566594879),new M(f[27],3203337956),new M(f[28],1034457026),new M(f[29],2466948901),new M(f[30],3758326383),new M(f[31],168717936),new M(f[32],1188179964),new M(f[33],1546045734),new M(f[34],1522805485),new M(f[35],2643833823),new M(f[36],2343527390),new M(f[37],1014477480),new M(f[38],1206759142),new M(f[39],344077627),new M(f[40],1290863460),new M(f[41],3158454273),new M(f[42],3505952657),new M(f[43],106217008),new M(f[44],3606008344),new M(f[45],1432725776),new M(f[46],1467031594),new M(f[47],851169720),new M(f[48],3100823752),new M(f[49],1363258195),new M(f[50],3750685593),new M(f[51],3785050280),new M(f[52],3318307427),new M(f[53],3812723403),new M(f[54],2003034995),new M(f[55],3602036899),new M(f[56],1575990012),new M(f[57],1125592928),new M(f[58],2716904306),new M(f[59],442776044),new M(f[60],593698344),new M(f[61],3733110249),new M(f[62],2999351573),new M(f[63],3815920427),new M(3391569614,3928383900),new M(3515267271,566280711),new M(3940187606,3454069534),new M(4118630271,4000239992),new M(116418474,1914138554),new M(174292421,2731055270),new M(289380356,3203993006),new M(460393269,320620315),new M(685471733,587496836),new M(852142971,1086792851),new M(1017036298,365543100),new M(1126000580,2618297676),new M(1288033470,3409855158),new M(1501505948,4234509866),new M(1607167915,987167468),new M(1816402316,1246189591)];function Q(n){return"SHA-384"===n?[new M(3418070365,s[0]),new M(1654270250,s[1]),new M(2438529370,s[2]),new M(355462360,s[3]),new M(1731405415,s[4]),new M(41048885895,s[5]),new M(3675008525,s[6]),new M(1203062813,s[7])]:[new M(w[0],4089235720),new M(w[1],2227873595),new M(w[2],4271175723),new M(w[3],1595750129),new M(w[4],2917565137),new M(w[5],725511199),new M(w[6],4215389547),new M(w[7],327033209)]}function W(n,r){var t,e,i,o,u,f,s,w,a,h,c,v,A,E,l,b,S=[];for(t=r[0],e=r[1],i=r[2],o=r[3],u=r[4],f=r[5],s=r[6],w=r[7],c=0;c<80;c+=1)c<16?(v=2*c,S[c]=new M(n[v],n[v+1])):S[c]=V((A=S[c-2],E=void 0,l=void 0,b=void 0,E=z(A,19),l=z(A,61),b=O(A,6),new M(E.I^l.I^b.I,E.M^l.M^b.M)),S[c-7],D(S[c-15]),S[c-16]),a=Z(w,G(u),j(u,f,s),J[c],S[c]),h=P(x(t),_(t,e,i)),w=s,s=f,f=u,u=P(o,a),o=i,i=e,e=t,t=P(a,h);return r[0]=P(t,r[0]),r[1]=P(e,r[1]),r[2]=P(i,r[2]),r[3]=P(o,r[3]),r[4]=P(u,r[4]),r[5]=P(f,r[5]),r[6]=P(s,r[6]),r[7]=P(w,r[7]),r}var $=function(n){function r(r,t,e){var o=this;if("SHA-384"!==r&&"SHA-512"!==r)throw new Error(a);var f=e||{};return(o=n.call(this,r,t,e)||this).K=o.N,o.k=!0,o.F=-1,o.m=i(o.t,o.i,o.F),o.R=W,o.L=function(n){return n.slice()},o.B=Q,o.g=function(n,t,e,i){return function(n,r,t,e,i){for(var o,f=31+(r+129>>>10<<5),s=r+t;n.length<=f;)n.push(0);for(n[r>>>5]|=128<<24-r%32,n[f]=4294967295&s,n[f-1]=s/u|0,o=0;o<n.length;o+=32)e=W(n.slice(o,o+32),e);return"SHA-384"===i?[e[0].I,e[0].M,e[1].I,e[1].M,e[2].I,e[2].M,e[3].I,e[3].M,e[4].I,e[4].M,e[5].I,e[5].M]:[e[0].I,e[0].M,e[1].I,e[1].M,e[2].I,e[2].M,e[3].I,e[3].M,e[4].I,e[4].M,e[5].I,e[5].M,e[6].I,e[6].M,e[7].I,e[7].M]}(n,t,e,i,r)},o.U=Q(r),o.p=1024,o.T="SHA-384"===r?384:512,o.C=!1,f.hmacKey&&o.Y(A("hmacKey",f.hmacKey,o.F)),o}return b(r,n),r}(E),nn=[new M(0,1),new M(0,32898),new M(2147483648,32906),new M(2147483648,2147516416),new M(0,32907),new M(0,2147483649),new M(2147483648,2147516545),new M(2147483648,32777),new M(0,138),new M(0,136),new M(0,2147516425),new M(0,2147483658),new M(0,2147516555),new M(2147483648,139),new M(2147483648,32905),new M(2147483648,32771),new M(2147483648,32770),new M(2147483648,128),new M(0,32778),new M(2147483648,2147483658),new M(2147483648,2147516545),new M(2147483648,32896),new M(0,2147483649),new M(2147483648,2147516424)],rn=[[0,36,3,41,18],[1,44,10,45,2],[62,6,43,15,61],[28,55,25,21,56],[27,20,39,8,14]];function tn(n){var r,t=[];for(r=0;r<5;r+=1)t[r]=[new M(0,0),new M(0,0),new M(0,0),new M(0,0),new M(0,0)];return t}function en(n){var r,t=[];for(r=0;r<5;r+=1)t[r]=n[r].slice();return t}function on(n,r){var t,e,i,o,u,f,s,w,a,h=[],c=[];if(null!==n)for(e=0;e<n.length;e+=2)r[(e>>>1)%5][(e>>>1)/5|0]=q(r[(e>>>1)%5][(e>>>1)/5|0],new M(n[e+1],n[e]));for(t=0;t<24;t+=1){for(o=tn(),e=0;e<5;e+=1)h[e]=(u=r[e][0],f=r[e][1],s=r[e][2],w=r[e][3],a=r[e][4],new M(u.I^f.I^s.I^w.I^a.I,u.M^f.M^s.M^w.M^a.M));for(e=0;e<5;e+=1)c[e]=q(h[(e+4)%5],X(h[(e+1)%5],1));for(e=0;e<5;e+=1)for(i=0;i<5;i+=1)r[e][i]=q(r[e][i],c[e]);for(e=0;e<5;e+=1)for(i=0;i<5;i+=1)o[i][(2*e+3*i)%5]=X(r[e][i],rn[e][i]);for(e=0;e<5;e+=1)for(i=0;i<5;i+=1)r[e][i]=q(o[e][i],new M(~o[(e+1)%5][i].I&o[(e+2)%5][i].I,~o[(e+1)%5][i].M&o[(e+2)%5][i].M));r[0][0]=q(r[0][0],nn[t])}return r}function un(n){var r,t,e=0,i=[0,0],o=[4294967295&n,n/u&2097151];for(r=6;r>=0;r--)0===(t=o[r>>2]>>>8*r&255)&&0===e||(i[e+1>>2]|=t<<8*(e+1),e+=1);return e=0!==e?e:1,i[0]|=e,{value:e+1>4?i:[i[0]],binLen:8+8*e}}function fn(n){return c(un(n.binLen),n)}function sn(n,r){var t,e=un(r),i=r>>>2,o=(i-(e=c(e,n)).value.length%i)%i;for(t=0;t<o;t++)e.value.push(0);return e.value}var wn=function(n){function r(r,t,e){var o=this,u=6,f=0,s=e||{};if(1!==(o=n.call(this,r,t,e)||this).numRounds){if(s.kmacKey||s.hmacKey)throw new Error(h);if("CSHAKE128"===o.o||"CSHAKE256"===o.o)throw new Error("Cannot set numRounds for CSHAKE variants")}switch(o.F=1,o.m=i(o.t,o.i,o.F),o.R=on,o.L=en,o.B=tn,o.U=tn(),o.C=!1,r){case"SHA3-224":o.p=f=1152,o.T=224,o.k=!0,o.K=o.N;break;case"SHA3-256":o.p=f=1088,o.T=256,o.k=!0,o.K=o.N;break;case"SHA3-384":o.p=f=832,o.T=384,o.k=!0,o.K=o.N;break;case"SHA3-512":o.p=f=576,o.T=512,o.k=!0,o.K=o.N;break;case"SHAKE128":u=31,o.p=f=1344,o.T=-1,o.C=!0,o.k=!1,o.K=null;break;case"SHAKE256":u=31,o.p=f=1088,o.T=-1,o.C=!0,o.k=!1,o.K=null;break;case"KMAC128":u=4,o.p=f=1344,o.X(e),o.T=-1,o.C=!0,o.k=!1,o.K=o.O;break;case"KMAC256":u=4,o.p=f=1088,o.X(e),o.T=-1,o.C=!0,o.k=!1,o.K=o.O;break;case"CSHAKE128":o.p=f=1344,u=o.j(e),o.T=-1,o.C=!0,o.k=!1,o.K=null;break;case"CSHAKE256":o.p=f=1088,u=o.j(e),o.T=-1,o.C=!0,o.k=!1,o.K=null;break;default:throw new Error(a)}return o.g=function(n,r,t,e,i){return function(n,r,t,e,i,o,u){var f,s,w=0,a=[],h=i>>>5,c=r>>>5;for(f=0;f<c&&r>=i;f+=h)e=on(n.slice(f,f+h),e),r-=i;for(n=n.slice(f),r%=i;n.length<h;)n.push(0);for(n[(f=r>>>3)>>2]^=o<<f%4*8,n[h-1]^=2147483648,e=on(n,e);32*a.length<u&&(s=e[w%5][w/5|0],a.push(s.M),!(32*a.length>=u));)a.push(s.I),0==64*(w+=1)%i&&(on(null,e),w=0);return a}(n,r,0,e,f,u,i)},s.hmacKey&&o.Y(A("hmacKey",s.hmacKey,o.F)),o}return b(r,n),r.prototype.j=function(n,r){var t=function(n){var r=n||{};return{funcName:A("funcName",r.funcName,1,{value:[],binLen:0}),customization:A("Customization",r.customization,1,{value:[],binLen:0})}}(n||{});r&&(t.funcName=r);var e=c(fn(t.funcName),fn(t.customization));if(0!==t.customization.binLen||0!==t.funcName.binLen){for(var i=sn(e,this.p>>>3),o=0;o<i.length;o+=this.p>>>5)this.U=this.R(i.slice(o,o+(this.p>>>5)),this.U),this.A+=this.p;return 4}return 31},r.prototype.X=function(n){var r=function(n){var r=n||{};return{kmacKey:A("kmacKey",r.kmacKey,1),funcName:{value:[1128353099],binLen:32},customization:A("Customization",r.customization,1,{value:[],binLen:0})}}(n||{});this.j(n,r.funcName);for(var t=sn(fn(r.kmacKey),this.p>>>3),e=0;e<t.length;e+=this.p>>>5)this.U=this.R(t.slice(e,e+(this.p>>>5)),this.U),this.A+=this.p;this.l=!0},r.prototype.O=function(n){var r=c({value:this.u.slice(),binLen:this.h},function(n){var r,t,e=0,i=[0,0],o=[4294967295&n,n/u&2097151];for(r=6;r>=0;r--)0==(t=o[r>>2]>>>8*r&255)&&0===e||(i[e>>2]|=t<<8*e,e+=1);return i[(e=0!==e?e:1)>>2]|=e<<8*e,{value:e+1>4?i:[i[0]],binLen:8+8*e}}(n.outputLen));return this.g(r.value,r.binLen,this.A,this.L(this.U),n.outputLen)},r}(E);return function(){function n(n,r,t){if("SHA-1"==n)this._=new k(n,r,t);else if("SHA-224"==n||"SHA-256"==n)this._=new I(n,r,t);else if("SHA-384"==n||"SHA-512"==n)this._=new $(n,r,t);else{if("SHA3-224"!=n&&"SHA3-256"!=n&&"SHA3-384"!=n&&"SHA3-512"!=n&&"SHAKE128"!=n&&"SHAKE256"!=n&&"CSHAKE128"!=n&&"CSHAKE256"!=n&&"KMAC128"!=n&&"KMAC256"!=n)throw new Error(a);this._=new wn(n,r,t)}}return n.prototype.update=function(n){return this._.update(n),this},n.prototype.getHash=function(n,r){return this._.getHash(n,r)},n.prototype.setHMACKey=function(n,r,t){this._.setHMACKey(n,r,t)},n.prototype.getHMAC=function(n,r){return this._.getHMAC(n,r)},n}()})); + + +},{}],15:[function(require,module,exports){ +module.exports = { + whitelist: {"jquery":[{"filename":"core.js","version":"3.3.1","hash":"6026ca247eaee2c88fa54964d77d2e76efc97a974a5695e3744cb38defb3d691"},{"filename":"jquery.js","version":"3.3.1","hash":"d8aa24ecc6cecb1a60515bc093f1c9da38a0392612d9ab8ae0f7f36e6eee1fad"},{"filename":"jquery.min.js","version":"3.3.1","hash":"160a426ff2894252cd7cebbdd6d6b7da8fcd319c65b70468f10b6690c45d02ef"},{"filename":"jquery.slim.js","version":"3.3.1","hash":"7cd5c914895c6b4e4120ed98e73875c6b4a12b7304fbf9586748fe0a1c57d830"},{"filename":"jquery.slim.min.js","version":"3.3.1","hash":"dde76b9b2b90d30eb97fc81f06caa8c338c97b688cea7d2729c88f529f32fbb1"},{"filename":"core.js","version":"3.3.0","hash":"58db1cc9582b20320c552043b5880b40c8eaec3e6d4b46994222862a049330a1"},{"filename":"jquery.js","version":"3.3.0","hash":"4c5592b8326dea44be86e57ebd59725758ccdddc0675e356a9ece14f15c1fd7f"},{"filename":"jquery.min.js","version":"3.3.0","hash":"453432f153a63654fa6f63c846eaf7ee9e8910165413ba3cc0f80cbeed7c302e"},{"filename":"jquery.slim.js","version":"3.3.0","hash":"ec89a3d1f2cab57e4d144092d6e9a8429ecd0b594482be270536ac366ee004b6"},{"filename":"jquery.slim.min.js","version":"3.3.0","hash":"00c83723bc9aefa38b3c3f4cf8c93b92aac0dbd1d49ff16e1817d3ffd51ff65b"},{"filename":"core.js","version":"3.2.1","hash":"052b1b5ec0c4ae78aafc7a6e8542c5a2bf31d42a40dac3cfc102e512812b8bed"},{"filename":"jquery.js","version":"3.2.1","hash":"0d9027289ffa5d9f6c8b4e0782bb31bbff2cef5ee3708ccbcb7a22df9128bb21"},{"filename":"jquery.min.js","version":"3.2.1","hash":"87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de"},{"filename":"jquery.slim.js","version":"3.2.1","hash":"b40f32d17aa2c27a7098e225dd218070597646fc478c0f2aa74fb5b821a64668"},{"filename":"jquery.slim.min.js","version":"3.2.1","hash":"9365920887b11b33a3dc4ba28a0f93951f200341263e3b9cefd384798e4be398"},{"filename":"core.js","version":"3.2.0","hash":"7c5c8f96ac182ed4d2c9ac74fda37941745f2793814fbd8b28624a9a720f9d39"},{"filename":"jquery.js","version":"3.2.0","hash":"c0f149348165558e3d07e0ae008ac3afddf65d26fa264dc9d4cdb6337136ca54"},{"filename":"jquery.min.js","version":"3.2.0","hash":"2405bdf4c255a4904671bcc4b97938033d39b3f5f20dd068985a8d94cde273e2"},{"filename":"jquery.slim.js","version":"3.2.0","hash":"f18ac10930e84233b80814f5595bcc1f6ffad74047d038d997114e08880aec03"},{"filename":"jquery.slim.min.js","version":"3.2.0","hash":"a8b02fd240408a170764b2377efdd621329e46c517dbb85deaea4105ad0c4a8c"},{"filename":"core.js","version":"3.1.1","hash":"4a4dec7ca8f2567b4327c82b873c8d7dd774f74b9009d2ff65431a8154693dea"},{"filename":"jquery.js","version":"3.1.1","hash":"d7a71d3dd740e95755227ba6446a3a21b8af6c4444f29ec2411dc7cd306e10b0"},{"filename":"jquery.min.js","version":"3.1.1","hash":"85556761a8800d14ced8fcd41a6b8b26bf012d44a318866c0d81a62092efd9bf"},{"filename":"jquery.slim.js","version":"3.1.1","hash":"e62fe6437d3433befd3763950eb975ea56e88705cd51dccbfd1d9a5545f25d60"},{"filename":"jquery.slim.min.js","version":"3.1.1","hash":"fd222b36abfc87a406283b8da0b180e22adeb7e9327ac0a41c6cd5514574b217"},{"filename":"core.js","version":"3.1.0","hash":"55994528e7efe901e92a76761a54ba0c3ae3f1f8d1c3a4da9a23a3e4a06d0eaa"},{"filename":"jquery.js","version":"3.1.0","hash":"b25a2092f0752b754e933008f10213c55dd5ce93a791e355b0abed9182cc8df9"},{"filename":"jquery.min.js","version":"3.1.0","hash":"702b9e051e82b32038ffdb33a4f7eb5f7b38f4cf6f514e4182d8898f4eb0b7fb"},{"filename":"jquery.slim.js","version":"3.1.0","hash":"2faa690232fa8e0b5199f8ae8a0784139030348da91ff5fd2016cfc9a9c9799c"},{"filename":"jquery.slim.min.js","version":"3.1.0","hash":"711a568e848ec3929cc8839a64da388ba7d9f6d28f85861bea2e53f51495246f"},{"filename":"core.js","version":"3.0.0-rc1","hash":"11853583eb5ce8ab1aacc380430145de705cdfff0e72c54d3dca17d01466999b"},{"filename":"jquery.js","version":"3.0.0-rc1","hash":"65ded5fa34aa91b976dae0af5888ce4c06fed34271f3665b2924505b704025c7"},{"filename":"jquery.min.js","version":"3.0.0-rc1","hash":"df68e90250b9a60fc184ef194d1769d3af8aa67396cc064281cb77e2ef6bf876"},{"filename":"jquery.slim.js","version":"3.0.0-rc1","hash":"c96eeff335114aa55df0328bbe5f9202ed7a3266b6e81fcd357cd17837fa9756"},{"filename":"jquery.slim.min.js","version":"3.0.0-rc1","hash":"e92bbd6e77604b75e910952f20f3c95ce29050c7b1137dc1edddad000c236b5d"},{"filename":"jquery.js","version":"3.0.0-beta1","hash":"78f27c3d7cb5d766466703adc7f7ad7706b7fb05514eec39be0aa253449bd0f8"},{"filename":"jquery.min.js","version":"3.0.0-beta1","hash":"b72a0aa436a8a8965041beda30577232677ef6588bb933b5bebed2de02c04dc8"},{"filename":"jquery.slim.js","version":"3.0.0-beta1","hash":"4db510700e5773fc7065f36363affd4885c9d9ef257fd7757744f91ac9da5671"},{"filename":"jquery.slim.min.js","version":"3.0.0-beta1","hash":"4c369c555423651822c2f7772d5e0b9a56a2372a92657bd2a696fe539b24be9e"},{"filename":"jquery.js","version":"3.0.0-alpha1","hash":"10b3ccff4cf14cdb5e7c31b2d323be750a13125cea8ded9ca5c1da4150a69238"},{"filename":"jquery.min.js","version":"3.0.0-alpha1","hash":"19e065eaadf26f58c0e1081a2e0e64450eec2983eebb08f998ecaacac8642a47"},{"filename":"core.js","version":"3.0.0","hash":"bad41b5e9f7c6b952b3a840b84ce2e97e3029bd2b2773c58a69a33e73217d1e4"},{"filename":"jquery.js","version":"3.0.0","hash":"8eb3cb67ef2f0f1b76167135cef6570a409c79b23f0bc0ede71c9a4018f1408a"},{"filename":"jquery.min.js","version":"3.0.0","hash":"266bcea0bb58b26aa5b16c5aee60d22ccc1ae9d67daeb21db6bad56119c3447d"},{"filename":"jquery.slim.js","version":"3.0.0","hash":"1a9ea1a741fe03b6b1835b44ac2b9c59e39cdfc8abb64556a546c16528fc2828"},{"filename":"jquery.slim.min.js","version":"3.0.0","hash":"45fe0169d7f20adb2f1e63bcf4151971b62f34dbd9bce4f4f002df133bc2b03d"},{"filename":"jquery.js","version":"2.2.4","hash":"893e90f6230962e42231635df650f20544ad22affc3ee396df768eaa6bc5a6a2"},{"filename":"jquery.min.js","version":"2.2.4","hash":"05b85d96f41fff14d8f608dad03ab71e2c1017c2da0914d7c59291bad7a54f8e"},{"filename":"jquery.js","version":"2.2.3","hash":"95a5d6b46c9da70a89f0903e5fdc769a2c266a22a19fcb5598e5448a044db4fe"},{"filename":"jquery.min.js","version":"2.2.3","hash":"6b6de0d4db7876d1183a3edb47ebd3bbbf93f153f5de1ba6645049348628109a"},{"filename":"jquery.slim.js","version":"2.2.3","hash":"4db510700e5773fc7065f36363affd4885c9d9ef257fd7757744f91ac9da5671"},{"filename":"jquery.slim.min.js","version":"2.2.3","hash":"4c369c555423651822c2f7772d5e0b9a56a2372a92657bd2a696fe539b24be9e"},{"filename":"jquery.js","version":"2.2.2","hash":"e3fcd40aa8aad24ab1859232a781b41a4f803ad089b18d53034d24e4296c6581"},{"filename":"jquery.min.js","version":"2.2.2","hash":"dfa729d82a3effadab1000181cb99108f232721e3b0af74cfae4c12704b35a32"},{"filename":"jquery.slim.js","version":"2.2.2","hash":"4db510700e5773fc7065f36363affd4885c9d9ef257fd7757744f91ac9da5671"},{"filename":"jquery.slim.min.js","version":"2.2.2","hash":"4c369c555423651822c2f7772d5e0b9a56a2372a92657bd2a696fe539b24be9e"},{"filename":"jquery.js","version":"2.2.1","hash":"78d714ccede3b2fd179492ef7851246c1f1b03bfc2ae83693559375e99a7c077"},{"filename":"jquery.min.js","version":"2.2.1","hash":"82f420005cd31fab6b4ab016a07d623e8f5773de90c526777de5ba91e9be3b4d"},{"filename":"jquery.slim.js","version":"2.2.1","hash":"4db510700e5773fc7065f36363affd4885c9d9ef257fd7757744f91ac9da5671"},{"filename":"jquery.slim.min.js","version":"2.2.1","hash":"4c369c555423651822c2f7772d5e0b9a56a2372a92657bd2a696fe539b24be9e"},{"filename":"jquery.js","version":"2.2.0","hash":"a18aa92dea997bd71eb540d5f931620591e9dee27e5f817978bb385bab924d21"},{"filename":"jquery.min.js","version":"2.2.0","hash":"8a102873a33f24f7eb22221e6b23c4f718e29f85168ecc769a35bfaed9b12cce"},{"filename":"jquery.js","version":"2.1.4","hash":"b2215cce5830e2350b9d420271d9bd82340f664c3f60f0ea850f7e9c0392704e"},{"filename":"jquery.min.js","version":"2.1.4","hash":"22642f202577f0ba2f22cbe56b6cf291a09374487567cd3563e0d2a29f75c0c5"},{"filename":"jquery.js","version":"2.1.3","hash":"828cbbcacb430f9c5b5d27fe9302f8795eb338f2421010f5141882125226f94f"},{"filename":"jquery.min.js","version":"2.1.3","hash":"2051d61446d4dbffb03727031022a08c84528ab44d203a7669c101e5fbdd5515"},{"filename":"jquery.js","version":"2.1.2","hash":"07cb07bdfba40ceff869b329eb48eeede41740ba6ce833dd3830bd0af49e4898"},{"filename":"jquery.min.js","version":"2.1.2","hash":"64c51d974a342e9df3ed548082a4ad7816d407b8c36b67356dde9e487b819cbe"},{"filename":"jquery.js","version":"2.1.1-rc2","hash":"dc0083a233768ed8554d770d9d4eed91c0e27de031b3d9cbdcecabc034265010"},{"filename":"jquery.min.js","version":"2.1.1-rc2","hash":"293c9966a4fea0fed0adc1aae242bb37e428e649337dcab65d9af5934a7cc775"},{"filename":"jquery.js","version":"2.1.1-rc1","hash":"5adbbda8312291291162ab054df8927291426dbfb550099945ece85b49707290"},{"filename":"jquery.min.js","version":"2.1.1-rc1","hash":"d246298c351558d4847d237bb2d052f22001ca24ea4a32c28de378c95af523c8"},{"filename":"jquery.js","version":"2.1.1-beta1","hash":"e96b9e8d7a12b381d2ed1efd785faef3c7bad0ea03edf42fb15c9fde533e761f"},{"filename":"jquery.min.js","version":"2.1.1-beta1","hash":"5aed44447956d7933861d56003dbd0f95504d79e19d094edacbe4a55e6cf8736"},{"filename":"jquery.js","version":"2.1.1","hash":"140ff438eaaede046f1ceba27579d16dc980595709391873fa9bf74d7dbe53ac"},{"filename":"jquery.min.js","version":"2.1.1","hash":"c0d4098bc8b34c6f87a3d7723988ae81214a53a0bb4a1d4d36a67640f98ed079"},{"filename":"jquery.js","version":"2.1.0-rc1","hash":"88d96de8ccf65e57a3f28134616e3abfe0af2b3712302beb0a73f77f6b873fd0"},{"filename":"jquery.min.js","version":"2.1.0-rc1","hash":"11f94218bacdd4dbdc5c1736ca7aa1f27bb9632bc0a1696175b408da8dcf16b3"},{"filename":"jquery.js","version":"2.1.0-beta3","hash":"8eb83f00967dd0e18877b71349f5a3641b1046a1667c54e602a5682ac0f07ab9"},{"filename":"jquery.min.js","version":"2.1.0-beta3","hash":"7ebd0c0a5a088da45a5ec48f4379dbe457129f2cbe434f2e045ef838136746a9"},{"filename":"jquery.js","version":"2.1.0-beta2","hash":"97efd5af482f4e74c37c04970421fdbd17388fd605d992a2aa0077d388b32b6d"},{"filename":"jquery.min.js","version":"2.1.0-beta2","hash":"22966516a31e64225df5e08e35f0fadb27d29a8fb2618ddca17ec171215fc323"},{"filename":"jquery.js","version":"2.1.0","hash":"0fa7752926a95e3ab6b5f67a21ef40628ce4447c81ddf4f6cacf663b6fb85af7"},{"filename":"jquery.min.js","version":"2.1.0","hash":"f284353a7cc4d97f6fe20a5155131bd43587a0f1c98a56eeaf52cff72910f47d"},{"filename":"jquery.js","version":"2.0.3","hash":"9427fe2df51f7d4c6bf35f96d19169714d0b432b99dc18f41760d0342c538122"},{"filename":"jquery.min.js","version":"2.0.3","hash":"a57b5242b9a9adc4c1ef846c365147b89c472b9cd770face331efcb965346b25"},{"filename":"jquery.js","version":"2.0.2","hash":"d2ed0720108a75db0d53248ba8e36332658064c4189714d16c0f117efb42016d"},{"filename":"jquery.min.js","version":"2.0.2","hash":"9d7d1c727e1cd32745764098a76e5d3d5fb7acd3b6527c5aacd85b7c6f8ce341"},{"filename":"jquery.js","version":"2.0.1","hash":"820fb338fe8c7478a1b820e2708b4fd306a68825de1194803e7a93fbc2177a16"},{"filename":"jquery.min.js","version":"2.0.1","hash":"4e1354fc542b617c58cbba3aeb5116a528cf08bb1299f5dc7f3bc77a3b902b68"},{"filename":"jquery.js","version":"2.0.0","hash":"896e379d334cf0b16c78d9962a1579147156d4a72355032fce0de5f673d4e287"},{"filename":"jquery.min.js","version":"2.0.0","hash":"d482871a5e948cb4884fa0972ea98a81abca057b6bd3f8c995a18c12487e761c"},{"filename":"jquery.js","version":"1.12.4","hash":"430f36f9b5f21aae8cc9dca6a81c4d3d84da5175eaedcf2fdc2c226302cb3575"},{"filename":"jquery.min.js","version":"1.12.4","hash":"668b046d12db350ccba6728890476b3efee53b2f42dbb84743e5e9f1ae0cc404"},{"filename":"jquery.js","version":"1.12.3","hash":"d5732912d03878a5cd3695dc275a6630fb3c255fa7c0b744ab08897824049327"},{"filename":"jquery.min.js","version":"1.12.3","hash":"69a3831c082fc105b56c53865cc797fa90b83d920fb2f9f6875b00ad83a18174"},{"filename":"jquery.slim.js","version":"1.12.3","hash":"4db510700e5773fc7065f36363affd4885c9d9ef257fd7757744f91ac9da5671"},{"filename":"jquery.slim.min.js","version":"1.12.3","hash":"4c369c555423651822c2f7772d5e0b9a56a2372a92657bd2a696fe539b24be9e"},{"filename":"jquery.js","version":"1.12.2","hash":"5540b2af46570795610626e8d8391356176ca639b1520c4319a2d0c7ba9bef16"},{"filename":"jquery.min.js","version":"1.12.2","hash":"95914789b5f3307a3718679e867d61b9d4c03f749cd2e2970570331d7d6c8ed9"},{"filename":"jquery.slim.js","version":"1.12.2","hash":"4db510700e5773fc7065f36363affd4885c9d9ef257fd7757744f91ac9da5671"},{"filename":"jquery.slim.min.js","version":"1.12.2","hash":"4c369c555423651822c2f7772d5e0b9a56a2372a92657bd2a696fe539b24be9e"},{"filename":"jquery.js","version":"1.12.1","hash":"56e843a66b2bf7188ac2f4c81df61608843ce144bd5aa66c2df4783fba85e8ef"},{"filename":"jquery.min.js","version":"1.12.1","hash":"2359d383bf2d4ab65ebf7923bdf74ce40e4093f6e58251b395a64034b3c39772"},{"filename":"jquery.slim.js","version":"1.12.1","hash":"4db510700e5773fc7065f36363affd4885c9d9ef257fd7757744f91ac9da5671"},{"filename":"jquery.slim.min.js","version":"1.12.1","hash":"4c369c555423651822c2f7772d5e0b9a56a2372a92657bd2a696fe539b24be9e"},{"filename":"jquery.js","version":"1.12.0","hash":"c85537acad72f0d7d409dfc1e2d2daa59032f71d29642a8b64b9852f70166fbb"},{"filename":"jquery.min.js","version":"1.12.0","hash":"5f1ab65fe2ad6b381a1ae036716475bf78c9b2e309528cf22170c1ddeefddcbf"},{"filename":"jquery.js","version":"1.11.3","hash":"2065aecca0fb9b0567358d352ed5f1ab72fce139bf449b4d09805f5d9c3725ed"},{"filename":"jquery.min.js","version":"1.11.3","hash":"aec3d419d50f05781a96f223e18289aeb52598b5db39be82a7b71dc67d6a7947"},{"filename":"jquery.js","version":"1.11.2","hash":"58c27035b7a2e589df397e5d7e05424b90b8c1aaaf73eff47d5ed6daecb70f25"},{"filename":"jquery.min.js","version":"1.11.2","hash":"d4ec583c7604001f87233d1fe0076cbd909f15a5f8c6b4c3f5dd81b462d79d32"},{"filename":"jquery.js","version":"1.11.1-rc2","hash":"648dbce0f3731ebce091c283b52f60b100d73807501eea1a99f7b23140bfcefa"},{"filename":"jquery.min.js","version":"1.11.1-rc2","hash":"06d766022172da3774651a3ccfeef893185f9ba46823bcbfcba744ab5e25a4bf"},{"filename":"jquery.js","version":"1.11.1-rc1","hash":"8241d4982de8a6fea3e0ebc47e99445337675a777054c09221f670adb3748995"},{"filename":"jquery.min.js","version":"1.11.1-rc1","hash":"a581c274adebdbc44022e45d9febf0b92c572481c58bfe562b3d74d5e8972c5a"},{"filename":"jquery.js","version":"1.11.1-beta1","hash":"0aab28e2fd1f61b6282132553325bd890fef40989b698311c5b00b7b38a1e19d"},{"filename":"jquery.min.js","version":"1.11.1-beta1","hash":"99ec4d1ab56cf49ee4c202cc41509ada5eeb334694815f75675792433828a527"},{"filename":"jquery.js","version":"1.11.1","hash":"3029834a820c79c154c377f52e2719fc3ff2a27600a07ae089ea7fde9087f6bc"},{"filename":"jquery.min.js","version":"1.11.1","hash":"540bc6dec1dd4b92ea4d3fb903f69eabf6d919afd48f4e312b163c28cff0f441"},{"filename":"jquery.js","version":"1.11.0-rc1","hash":"84792d2b1ab8a2d57dcc113abb910b4c31dda357a7acd3b46ed282dd03f15d25"},{"filename":"jquery.min.js","version":"1.11.0-rc1","hash":"5f58804382f5258bb6b187c1b5af1ec0b8ccbe2c904a5163580371352ca63424"},{"filename":"jquery.js","version":"1.11.0-beta3","hash":"847a61382a55d0c0e5244d0621f1e0674292dee6b850640c669fd1516ec9f4f5"},{"filename":"jquery.min.js","version":"1.11.0-beta3","hash":"51fc79c1828a885f3776e35d56a22895e3656d014b502b869bd05f891bd91602"},{"filename":"jquery.js","version":"1.11.0","hash":"ce0343e1d6f489768eeefe022c12181c6a0822e756239851310acf076d23d10c"},{"filename":"jquery.min.js","version":"1.11.0","hash":"b294e973896f8f874e90a8eb1a8908ac790980d034c4c4bdf0fc3d37b8abf682"},{"filename":"jquery.js","version":"1.10.2","hash":"8ade6740a1d3cfedf81e28d9250929341207b23a55f1be90ccc26cf6d98e052a"},{"filename":"jquery.min.js","version":"1.10.2","hash":"89a15e9c40bc6b14809f236ee8cd3ed1ea42393c1f6ca55c7855cd779b3f922e"},{"filename":"jquery.js","version":"1.10.1","hash":"ebaded49db62a60060caa2577f2a4ec1ff68726bc40861bc65d977abeb64fa7d"},{"filename":"jquery.min.js","version":"1.10.1","hash":"8bf150f6b29d6c9337de6c945a8f63c929b203442040688878bc2753fe13e007"},{"filename":"jquery.js","version":"1.10.0","hash":"8aa0f84b5331efcc3cb72c7d504c2bc6ebd861da003d72c33df99ce650d4531d"},{"filename":"jquery.min.js","version":"1.10.0","hash":"1e80de36726582824df3f9a7eb6ecdfe9827fc5a7c69f597b1502ebc13950ecd"},{"filename":"jquery.js","version":"1.9.1","hash":"7bd80d06c01c0340c1b9159b9b4a197db882ca18cbac8e9b9aa025e68f998d40"},{"filename":"jquery.min.js","version":"1.9.1","hash":"c12f6098e641aaca96c60215800f18f5671039aecf812217fab3c0d152f6adb4"},{"filename":"jquery.js","version":"1.9.0","hash":"4d7b01c2f6043bcee83a33d0f627dc6fbc27dc8aeb5bdd5d863e84304b512ef3"},{"filename":"jquery.min.js","version":"1.9.0","hash":"7fa0d5c3f538c76f878e012ac390597faecaabfe6fb9d459b919258e76c5df8e"},{"filename":"jquery.js","version":"1.8.3","hash":"756d7dfac4a35bb57543f677283d6c682e8d704e5350884b27325badd2b3c4a7"},{"filename":"jquery.min.js","version":"1.8.3","hash":"61c6caebd23921741fb5ffe6603f16634fca9840c2bf56ac8201e9264d6daccf"},{"filename":"jquery.js","version":"1.8.2","hash":"ba8f203a9ebbe5771f49bcbe0804079240c7225f4be6ab424769bfbfb35ebc35"},{"filename":"jquery.min.js","version":"1.8.2","hash":"f23d4b309b72743aa8afe1f8c98a25b3ee31246fa572c66d9d8cb1982cae4fbc"},{"filename":"jquery.js","version":"1.8.1","hash":"7614fc75c4fcf6f32f7307f37550440e12adefb9289226acb79020c66faeffea"},{"filename":"jquery.min.js","version":"1.8.1","hash":"a1305347219d673cc973172494248e557ce8eccaf65af995c07c9d7daed4475d"},{"filename":"jquery-1.8.0.js","version":"1.8.0","hash":"04ee795a1a5a908ee339e145ae6c6b394d1dc0d971fd0896e3cb776660adba2e"},{"filename":"jquery-1.8.0.min.js","version":"1.8.0","hash":"d73e2e1bff9c55b85284ff287cb20dc29ad9165ec09091a0597b61199f330805"},{"filename":"jquery.js","version":"1.8.0","hash":"04ee795a1a5a908ee339e145ae6c6b394d1dc0d971fd0896e3cb776660adba2e"},{"filename":"jquery.min.js","version":"1.8.0","hash":"d73e2e1bff9c55b85284ff287cb20dc29ad9165ec09091a0597b61199f330805"},{"filename":"jquery.min.js","version":"1.7.2","hash":"47b68dce8cb6805ad5b3ea4d27af92a241f4e29a5c12a274c852e4346a0500b4"},{"filename":"jquery.min.js","version":"1.7.1","hash":"88171413fc76dda23ab32baa17b11e4fff89141c633ece737852445f1ba6c1bd"},{"filename":"jquery.min.js","version":"1.7","hash":"ff4e4975ef403004f8fe8e59008db7ad47f54b10d84c72eb90e728d1ec9157ce"},{"filename":"jquery.js","version":"1.6.4","hash":"54964f8b580ad795a962fb27066715d3281ae1ad13a28bf8aedd5d8859ebae37"},{"filename":"jquery.min.js","version":"1.6.4","hash":"951d6bae39eb172f57a88bd686f7a921cf060fd21f59648f0d20b6a8f98fc5a5"},{"filename":"jquery.js","version":"1.6.3","hash":"9baa10e1c5630c3dcd9bb46bf00913cc94b3855d58c9459ae9848339c566e97b"},{"filename":"jquery.min.js","version":"1.6.3","hash":"d3f3779f5113da6da957c4d81481146a272c31aefe0d3e4b64414fd686fd9744"},{"filename":"jquery.js","version":"1.6.2","hash":"a57292619d14eb8cbd923bde9f28cf994ac66abc48f7c975b769328ff33bddc9"},{"filename":"jquery.min.js","version":"1.6.2","hash":"fefb084f14120d777c7857ba78603e8531a0778b2e639df7622513c70567afa0"},{"filename":"jquery.js","version":"1.6.1","hash":"0eef76a9583a6c7a1eb764d33fe376bfe1861df79fab82c2c3f5d16183e82016"},{"filename":"jquery.min.js","version":"1.6.1","hash":"c784376960f3163dc760bc019e72e5fed78203745a5510c69992a39d1d8fe776"},{"filename":"jquery.js","version":"1.5.1","hash":"e2ea0a6ca6b984a9405a759d24cf3c51eb3164e5c43e95c3e9a59b316be7b3b9"},{"filename":"jquery.min.js","version":"1.5.1","hash":"764b9e9f3ad386aaa5cdeae9368353994de61c0bede087c8f7e3579cb443de3b"},{"filename":"jquery.js","version":"1.4.4","hash":"b31cd094af7950b3a461dc78161fd2faf01faa9d0ed8c1c072790f83ab26d482"},{"filename":"jquery.min.js","version":"1.4.4","hash":"517364f2d45162fb5037437b5b6cb953d00d9b2b3b79ba87d9fe57ea6ee6070c"},{"filename":"jquery.js","version":"1.4.3","hash":"0e3303a3a0cec95ebc8c3cc3e19fc71c99487faa286b05d01a3eb8cca4d90bc7"},{"filename":"jquery.min.js","version":"1.4.3","hash":"f800b399e5c7a5254fc66bb407117fe38dbde0528780e68c9f7c87d299f8486a"},{"filename":"jquery.js","version":"1.4.2","hash":"95c023c80dfe0d30304c58244878995061f87801a66daa5d6bf4f2512be0e6f9"},{"filename":"jquery.min.js","version":"1.4.2","hash":"e23a2a4e2d7c2b41ebcdd8ffc0679df7140eb7f52e1eebabf827a88182643c59"},{"filename":"jquery.js","version":"1.4.1","hash":"9edc9f813781eca2aad6de78ef85cdbe92ee32bb0a56791be4da0fa7b472c1d8"},{"filename":"jquery.min.js","version":"1.4.1","hash":"2cec78f739fbddfed852cd7934d2530e7cc4c8f14b38673b03ba5fb880ad4cc7"},{"filename":"jquery.js","version":"1.4.0","hash":"882927b9aadb2504b5c6a823bd8c8c516f21dec6e441fe2c8fa228e35951bcc8"},{"filename":"jquery.min.js","version":"1.4.0","hash":"89abaf1e2471b00525b0694048e179c0f39a2674e3bcb34460ea6bc4801882be"},{"filename":"jquery.js","version":"1.3.2","hash":"74537639fa585509395c0d3b9a5601dd1e4ca036961c53dc5ab0e87386aa9be1"},{"filename":"jquery.min.js","version":"1.3.2","hash":"c8370a2d050359e9d505acc411e6f457a49b21360a21e6cbc9229bad3a767899"},{"filename":"jquery.js","version":"1.3.1","hash":"0ae058559b3e65d6cc5674fe3ff01581da5ae62387bb0dfa2923997a52093a06"},{"filename":"jquery.min.js","version":"1.3.1","hash":"17ec1f16efac893b9bd89bba5f13cb1e0bf938bdc9cece6cae3ed77f18fa6fd7"},{"filename":"jquery.js","version":"1.3.0","hash":"a7756f21ff6c558f983d5376072174af546e8d07f8bebe1e6f760b2f4b53012d"},{"filename":"jquery.min.js","version":"1.3.0","hash":"900191a443115d8b48a9d68d3062e8b3d7129727951b8617465b485baf253006"},{"filename":"jquery.js","version":"1.2.6","hash":"3cc5c121471323b25de45fcab48631d4a09c78e76af21c10d747352682605587"},{"filename":"jquery.min.js","version":"1.2.6","hash":"d548530775a6286f49ba66e0715876b4ec5985966b0291c21568fecfc4178e8d"},{"filename":"jquery.js","version":"1.2.3","hash":"d977fc32dd4bdb0479604abf078f1045b0e922666313f2f42cd71ce7835e0061"},{"filename":"jquery.min.js","version":"1.2.3","hash":"f1c4a0a7b5dead231fc9b42f06965a036ab7a2a788768847eb81e1528d6402ad"}]} +}; + +},{}]},{},[12]); diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/Storage.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/Storage.js @@ -0,0 +1,137 @@ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +/** + A tiny wrapper around extensions storage API, supporting CSV serialization for + retro-compatibility +*/ +'use strict'; + + +const Storage = { + ARRAY: { + async load(key, array = undefined) { + const result = array === undefined ? + (await browser.storage.local.get(key))[key] : array; + return result ? new Set(result) : new Set(); + }, + async save(key, list) { + return await browser.storage.local.set({ [key]: [...list] }); + }, + }, + + CSV: { + async load(key) { + const csv = (await browser.storage.local.get(key))[key]; + return csv ? new Set(csv.split(/\s*,\s*/)) : new Set(); + }, + + async save(key, list) { + return await browser.storage.local.set({ [key]: [...list].join(',') }); + } + } +}; + +/** + A class to hold and persist blacklists and whitelists +*/ + +class ListStore { + constructor(key, storage = Storage.ARRAY) { + this.key = key; + this.storage = storage; + this.items = new Set(); + browser.storage.onChanged.addListener(changes => { + if (!this.saving && this.key in changes) { + this.load(changes[this.key].newValue); + } + }); + } + + static inlineItem(url) { + // here we simplify and hash inline script references + return url.startsWith('inline:') ? url + : url.startsWith('view-source:') + && url.replace(/^view-source:[\w-+]+:\/+([^/]+).*#line\d+/, 'inline://$1#') + .replace(/\n[^]*/, s => s.replace(/\s+/g, ' ').substring(0, 16) + '…' + hash(s.trim())); + } + static hashItem(hash) { + return hash.startsWith('(') ? hash : `(${hash})`; + } + static urlItem(url) { + const queryPos = url.indexOf('?'); + return queryPos === -1 ? url : url.substring(0, queryPos); + } + static siteItem(url) { + if (url.endsWith('/*')) return url; + try { + return `${new URL(url).origin}/*`; + } catch (e) { + return `${url}/*`; + } + } + + async save() { + this._saving = true; + try { + return await this.storage.save(this.key, this.items); + } finally { + this._saving = false; + } + } + + async load(values = undefined) { + try { + this.items = await this.storage.load(this.key, values); + } catch (e) { + console.error(e); + } + return this.items; + } + + async store(...items) { + const size = this.items.size; + const changed = items.reduce((current, item) => size !== this.items.add(item).size || current, false); + changed && await this.save(); + } + + async remove(...items) { + const changed = items.reduce((current, item) => this.items.delete(item) || current, false); + changed && await this.save(); + } + + contains(item) { + return this.items.has(item); + } +} + +function hash(source) { + const shaObj = new jssha('SHA-256', 'TEXT') + shaObj.update(source); + return shaObj.getHash('HEX'); +} + +if (typeof module === 'object') { + module.exports = { ListStore, Storage, hash }; + // TODO: eliminate the var + var jssha = require('jssha'); +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/Test.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/Test.js @@ -0,0 +1,54 @@ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +'use strict'; +const Test = (() => { + const RUNNER_URL = browser.runtime.getURL('/test/SpecRunner.html'); + return { + /* + returns RUNNER_URL if it's a test-enabled build or an about:debugging + temporary extension session, null otherwise + */ + async getURL() { + try { + await fetch(RUNNER_URL); + return RUNNER_URL; + } catch (e) { + return null; + } + }, + + async getTab(activate = false) { + const url = await this.getURL(); + const tab = url ? (await browser.tabs.query({ url }))[0] || + (await browser.tabs.create({ url })) + : null; + if (tab && activate) { + await browser.tabs.update(tab.id, { active: true }); + } + return tab; + } + }; +})(); +if (typeof module === 'object') { + module.exports = Test; +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/checks.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/checks.js @@ -0,0 +1,448 @@ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* * +* Copyright (C) 2018 Nathan Nichols +* Copyright (C) 2022 Yuchen Pei +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +const acorn = require('acorn'); +const licenses = require('./license_definitions.json'); +const { patternUtils } = require('./pattern_utils.js'); +const { makeDebugLogger } = require('./debug.js'); +const fnameData = require('./fname_data.json').fname_data; + +const LIC_RE = /@licstartThefollowingistheentirelicensenoticefortheJavaScriptcodeinthis(?:page|file)(.*)?@licendTheaboveistheentirelicensenoticefortheJavaScriptcodeinthis(?:page|file)/mi; + +/* + NONTRIVIAL THINGS: + - Fetch + - XMLhttpRequest + - eval() + - ? + JAVASCRIPT CAN BE FOUND IN: + - Event handlers (onclick, onload, onsubmit, etc.) + - <script>JS</script> + - <script src="/JS.js"></script> + WAYS TO DETERMINE PASS/FAIL: + - "// @license [magnet link] [identifier]" then "// @license-end" (may also use /* comments) + - Automatic whitelist: (http://bzr.savannah.gnu.org/lh/librejs/dev/annotate/head:/data/script_libraries/script-libraries.json_ +*/ +// These are objects that it will search for in an initial regex pass over non-free scripts. +const RESERVED_OBJECTS = [ + //"document", + //"window", + 'fetch', + 'XMLHttpRequest', + 'chrome', // only on chrome + 'browser', // only on firefox + 'eval' +]; +const LOOPKEYS = new Set(['for', 'if', 'while', 'switch']); +const OPERATORS = new Set(['||', '&&', '=', '==', '++', '--', '+=', '-=', '*']); +// @license match, second and third capture groups are canonicalUrl +// and license name +// Caveat: will not work in a commented out star comments: +// '// /* @license */ ... /* @license-end */' will be checked, though +// the whole thing is a comment +const OPENING_LICENSE_RE1 = /^\s*\/\/\s*@license\s+(\S+)\s+(\S+).*$/mi; +const OPENING_LICENSE_RE2 = /\/\*\s*?@license\s+(\S+)\s+([^/*]+).*\*\//mi; +const CLOSING_LICENSE_RE1 = /^\s*\/\/\s*@license-end\s*/mi; +const CLOSING_LICENSE_RE2 = /\/\*\s*@license-end\s*\*\//mi; +/** +* If this is true, it evaluates entire scripts instead of returning as soon as it encounters a violation. +* +* Also, it controls whether or not this part of the code logs to the console. +* +*/ +const DEBUG = false; // debug the JS evaluation +const PRINT_DEBUG = false; +const dbg_print = makeDebugLogger('checks.js', PRINT_DEBUG, Date.now()); + +/** + * stripLicenseToRegexp + * + * Removes all non-alphanumeric characters except for the + * special tokens, and replace the text values that are + * hardcoded in license_definitions.js. Puts the result in + * the regex field of the fragments. + * + */ +const stripLicenseToRegexp = function(license) { + for (const frag of license.licenseFragments) { + frag.regex = patternUtils.removeNonalpha(frag.text); + frag.regex = new RegExp( + patternUtils.replaceTokens(frag.regex), ''); + } +}; + +const init = function() { + console.log('initializing regexes'); + for (const key in licenses) { + stripLicenseToRegexp(licenses[key]); + } +} + +/** +* +* Takes in the declaration that has been preprocessed and +* tests it against regexes in licenses. +*/ +const searchTable = function(strippedComment) { + const stripped = patternUtils.removeNonalpha(strippedComment); + // looking up license + for (const key in licenses) { + const license = licenses[key]; + for (const frag of license.licenseFragments) { + if (frag.regex.test(stripped)) { + return license.licenseName; + } + } + } + console.log('No global license found.'); + return null; +} + +/** + * Checks whether licenseText, modulo whitespace, starts with + * a @licstart .. @licend with a free license, returns the license name + * if so, and null otherwise. + */ +const checkLicenseText = function(licenseText) { + if (licenseText === undefined || licenseText === null) { + return null; + } + // remove whitespace + const stripped = patternUtils.removeWhitespace(licenseText); + // Search for @licstart/@licend + const matches = stripped.match(LIC_RE); + return matches && searchTable(matches[0]); +}; + +//************************this part can be tested in the HTML file index.html's script test.js**************************** + +/** + * Checks whether script is trivial by analysing its tokens. + * + * Returns an array of + * [flag (boolean, true if trivial), reason (string, human readable report)]. + */ +function fullEvaluate(script) { + if (script === undefined || script == '') { + return [true, 'Harmless null script']; + } + + let tokens; + + try { + tokens = acorn.tokenizer(script); + } catch (e) { + console.warn('Tokenizer could not be initiated (probably invalid code)'); + return [false, 'Tokenizer could not be initiated (probably invalid code)']; + } + try { + var toke = tokens.getToken(); + } catch (e) { + console.log(script); + console.log(e); + console.warn('couldn\'t get first token (probably invalid code)'); + console.warn('Continuing evaluation'); + } + + let amtloops = 0; + let definesFunctions = false; + + /** + * Given the end of an identifer token, it tests for parentheses + */ + function is_bsn(end) { + let i = 0; + while (script.charAt(end + i).match(/\s/g) !== null) { + i++; + if (i >= script.length - 1) { + return false; + } + } + return script.charAt(end + i) == '['; + } + + function evaluateByTokenValue(toke) { + const value = toke.value; + if (OPERATORS.has(value)) { + // It's just an operator. Javascript doesn't have operator overloading so it must be some + // kind of primitive (I.e. a number) + } else { + const status = fnameData[value]; + if (status === true) { // is the identifier banned? + dbg_print('%c NONTRIVIAL: nontrivial token: \'' + value + '\'', 'color:red'); + if (DEBUG == false) { + return [false, 'NONTRIVIAL: nontrivial token: \'' + value + '\'']; + } + } else if (status === false || status === undefined) {// is the identifier not banned or user defined? + // Is there bracket suffix notation? + if (is_bsn(toke.end)) { + dbg_print('%c NONTRIVIAL: Bracket suffix notation on variable \'' + value + '\'', 'color:red'); + if (DEBUG == false) { + return [false, '%c NONTRIVIAL: Bracket suffix notation on variable \'' + value + '\'']; + } + } + } else { + dbg_print('trivial token:' + value); + } + } + return [true, '']; + } + + function evaluateByTokenTypeKeyword(keyword) { + if (toke.type.keyword == 'function') { + dbg_print('%c NOTICE: Function declaration.', 'color:green'); + definesFunctions = true; + } + + if (LOOPKEYS.has(keyword)) { + amtloops++; + if (amtloops > 3) { + dbg_print('%c NONTRIVIAL: Too many loops/conditionals.', 'color:red'); + if (DEBUG == false) { + return [false, 'NONTRIVIAL: Too many loops/conditionals.']; + } + } + } + return [true, '']; + } + + while (toke !== undefined && toke.type != acorn.tokTypes.eof) { + if (toke.type.keyword !== undefined) { + //dbg_print("Keyword:"); + //dbg_print(toke); + + // This type of loop detection ignores functional loop alternatives and ternary operators + const tokeTypeRes = evaluateByTokenTypeKeyword(toke.type.keyword); + if (tokeTypeRes[0] === false) { + return tokeTypeRes; + } + } else if (toke.value !== undefined) { + const tokeValRes = evaluateByTokenValue(toke); + if (tokeValRes[0] === false) { + return tokeValRes; + } + } + // If not a keyword or an identifier it's some kind of operator, field parenthesis, brackets + try { + toke = tokens.getToken(); + } catch (e) { + dbg_print('Denied script because it cannot be parsed.'); + return [false, 'NONTRIVIAL: Cannot be parsed. This could mean it is a 404 error.']; + } + } + + dbg_print('%cAppears to be trivial.', 'color:green;'); + if (definesFunctions === true) + return [true, 'Script appears to be trivial but defines functions.']; + else + return [true, 'Script appears to be trivial.']; +} + + +//**************************************************************************************************** +/** +* This is the entry point for full code evaluation for triviality. +* +* Performs the initial pass on code to see if it needs to be completely parsed +* +* This can only determine if a script is bad, not if it's good +* +* If it passes the intitial pass, it runs the full pass and returns the result + +* It returns an array of [flag (boolean, false if "bad"), reason (string, human readable report)] +* +*/ +function evaluate(script, name) { + const reservedResult = evaluateForReservedObj(script, name); + if (reservedResult[0] === true) { + dbg_print('%c pass', 'color:green;'); + } else { + return reservedResult; + } + + return fullEvaluate(script); +} + +function evaluateForReservedObj(script, name) { + function reservedObjectRegex(object) { + const arithOperators = '\\+\\-\\*\\/\\%\\='; + return new RegExp('(?:[^\\w\\d]|^|(?:' + arithOperators + '))' + object + '(?:\\s*?(?:[\\;\\,\\.\\(\\[])\\s*?)', 'g'); + } + const mlComment = /\/\*([\s\S]+?)\*\//g; + const ilComment = /\/\/.+/gm; + const temp = script.replace(/'.+?'+/gm, '\'string\'').replace(/".+?"+/gm, '"string"').replace(mlComment, '').replace(ilComment, ''); + dbg_print('%c ------evaluation results for ' + name + '------', 'color:white'); + dbg_print('Script accesses reserved objects?'); + + // This is where individual "passes" are made over the code + for (const reserved of RESERVED_OBJECTS) { + if (reservedObjectRegex(reserved).exec(temp) != null) { + dbg_print('%c fail', 'color:red;'); + return [false, 'Script uses a reserved object (' + reserved + ')']; + } + } + return [true, 'Reserved object not found.']; +} + +/** + * Checks whether url is the magnet link of a license. + * + * Returns the licenseName if so, otherwise returns null. If a key is + * supplied, checks for the license with the key only. + */ +function checkMagnet(url, key = null) { + const fixedUrl = url.replace(/&amp;/g, '&'); + // Match by magnet link + const checkLicenseMagnet = license => { + for (const cUrl of license.canonicalUrl) { + if (cUrl.startsWith('magnet:') && fixedUrl === cUrl) { + return license.licenseName; + } + } + return null; + } + + if (key) { + try { + return checkLicenseMagnet(licenses[key]); + } catch (error) { + return null; + } + } else { + for (const key in licenses) { + const result = checkLicenseMagnet(licenses[key]); + if (result) return result; + } + return null; + } +} + + +/** + * + * Evaluates the content of a script for licenses and triviality + * scriptSrc: content of the script; name: script name; external: + * whether the script is external + * + * Returns + * [ + * true (accepted) or false (denied), + * edited content, + * reason text + * ] + */ +function checkScriptSource(scriptSrc, name, external = false) { + let inSrc = scriptSrc.trim(); + if (!inSrc) return [true, scriptSrc, 'Empty source.']; + + // Check for @licstart .. @licend method + const license = checkLicenseText(scriptSrc); + if (license) { + return [true, scriptSrc, `Licensed under: ${license}`]; + } + + let outSrc = ''; + let reason = ''; + let partsDenied = false; + let partsAccepted = false; + + function checkTriviality(s) { + if (!patternUtils.removeJsComments(s).trim()) { + return true; // empty, ignore it + } + const [trivial, message] = external ? + [false, 'External script with no known license'] + : evaluate(s, name); + if (trivial) { + partsAccepted = true; + outSrc += s; + } else { + partsDenied = true; + if (s.startsWith('javascript:')) + outSrc += `# LIBREJS BLOCKED: ${message}`; + else + outSrc += `/*\nLIBREJS BLOCKED: ${message}\n*/`; + } + reason += `\n${message}`; + } + + // Consume inSrc by checking licenses in all @license / @license-end + // blocks and triviality outside these blocks + while (inSrc) { + const openingMatch1 = OPENING_LICENSE_RE1.exec(inSrc); + const openingMatch2 = OPENING_LICENSE_RE2.exec(inSrc); + const openingMatch = + (openingMatch1 && openingMatch2) ? + (openingMatch1.index < openingMatch2.index ? openingMatch1 + : openingMatch2) + : (openingMatch1 || openingMatch2); + const openingIndex = openingMatch ? openingMatch.index : inSrc.length; + // checks the triviality of the code before the license tag, if any + checkTriviality(inSrc.substring(0, openingIndex)); + inSrc = inSrc.substring(openingIndex); + if (!inSrc) break; + + // checks the remaining part, that starts with an @license + const closureMatch1 = CLOSING_LICENSE_RE1.exec(inSrc); + const closureMatch2 = CLOSING_LICENSE_RE2.exec(inSrc); + const closureMatch = + (closureMatch1 && closureMatch2) ? + (closureMatch1.index < closureMatch2.index ? closureMatch1 + : closureMatch2) + : (closureMatch1 || closureMatch2); + if (!closureMatch) { + const msg = 'ERROR: @license with no @license-end'; + return [false, `\n/*\n ${msg} \n*/\n`, msg]; + } + const closureEndIndex = closureMatch.index + closureMatch[0].length; + + if (!(Array.isArray(openingMatch) && openingMatch.length >= 3)) { + return [false, 'Malformed or unrecognized license tag.']; + } + const licenseName = checkMagnet(openingMatch[1]); + let message; + if (licenseName) { + outSrc += inSrc.substr(0, closureEndIndex); + partsAccepted = true; + message = `Recognized license: "${licenseName}".` + } else { + outSrc += `\n/*\n${message}\n*/\n`; + partsDenied = true; + message = `Unrecognized license tag: "${openingMatch[0]}"`; + } + reason += `\n${message}`; + + // trim off everything we just evaluated + inSrc = inSrc.substring(closureEndIndex).trim(); + } + + if (partsDenied) { + if (partsAccepted) { + reason = `Some parts of the script have been disabled (check the source for details).\n^--- ${reason}`; + } + return [false, outSrc, reason]; + } + + return [true, scriptSrc, reason]; +} + +module.exports = { init, checkLicenseText, checkMagnet, checkScriptSource }; diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/debug.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/debug.js @@ -0,0 +1,37 @@ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* * +* Copyright (C) 2017, 2018 Nathan Nichols +* Copyright (C) 2018 Ruben Rodriguez <ruben@gnu.org> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +const makeDebugLogger = (origin, enabled, time) => { + return (a, b) => { + if (enabled) { + console.log('[' + origin + '] Time spent so far: ' + (Date.now() - time) / 1000 + ' seconds'); + if (b === undefined) { + console.log(a); + } else { + console.log(a, b); + } + } + } +} + +module.exports = { makeDebugLogger }; diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/fname_data.json b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/fname_data.json @@ -0,0 +1,832 @@ +{ + "fname_data": { + "WebGLShader": true, + "WebGLShaderPrecisionFormat": true, + "WebGLQuery": true, + "WebGLRenderbuffer": true, + "WebGLSampler": true, + "WebGLUniformLocation": true, + "WebGLFramebuffer": true, + "WebGLProgram": true, + "WebGLContextEvent": true, + "WebGL2RenderingContext": true, + "WebGLTexture": true, + "WebGLRenderingContext": true, + "WebGLVertexArrayObject": true, + "WebGLActiveInfo": true, + "WebGLTransformFeedback": true, + "WebGLSync": true, + "WebGLBuffer": true, + "cat_svg": true, + "SVGPoint": true, + "SVGEllipseElement": true, + "SVGRadialGradientElement": true, + "SVGComponentTransferFunctionElement": true, + "SVGPathSegCurvetoQuadraticAbs": true, + "SVGAnimatedNumberList": true, + "SVGPathSegCurvetoQuadraticSmoothRel": true, + "SVGFEColorMatrixElement": true, + "SVGPathSegLinetoHorizontalAbs": true, + "SVGLinearGradientElement": true, + "SVGStyleElement": true, + "SVGPathSegMovetoRel": true, + "SVGStopElement": true, + "SVGPathSegLinetoRel": true, + "SVGFEConvolveMatrixElement": true, + "SVGAnimatedAngle": true, + "SVGPathSegLinetoAbs": true, + "SVGPreserveAspectRatio": true, + "SVGFEOffsetElement": true, + "SVGFEImageElement": true, + "SVGFEDiffuseLightingElement": true, + "SVGAnimatedNumber": true, + "SVGTextElement": true, + "SVGFESpotLightElement": true, + "SVGFEMorphologyElement": true, + "SVGAngle": true, + "SVGScriptElement": true, + "SVGFEDropShadowElement": true, + "SVGPathSegArcRel": true, + "SVGNumber": true, + "SVGPathSegLinetoHorizontalRel": true, + "SVGFEFuncBElement": true, + "SVGClipPathElement": true, + "SVGPathSeg": true, + "SVGUseElement": true, + "SVGPathSegArcAbs": true, + "SVGPathSegCurvetoQuadraticSmoothAbs": true, + "SVGRect": true, + "SVGAnimatedPreserveAspectRatio": true, + "SVGImageElement": true, + "SVGAnimatedEnumeration": true, + "SVGAnimatedLengthList": true, + "SVGFEFloodElement": true, + "SVGFECompositeElement": true, + "SVGAElement": true, + "SVGAnimatedBoolean": true, + "SVGMaskElement": true, + "SVGFilterElement": true, + "SVGPathSegLinetoVerticalRel": true, + "SVGAnimatedInteger": true, + "SVGTSpanElement": true, + "SVGMarkerElement": true, + "SVGStringList": true, + "SVGTransform": true, + "SVGTitleElement": true, + "SVGFEBlendElement": true, + "SVGTextPositioningElement": true, + "SVGFEFuncGElement": true, + "SVGFEPointLightElement": true, + "SVGAnimateElement": true, + "SVGPolylineElement": true, + "SVGDefsElement": true, + "SVGPathSegList": true, + "SVGAnimatedTransformList": true, + "SVGPathSegClosePath": true, + "SVGGradientElement": true, + "SVGSwitchElement": true, + "SVGViewElement": true, + "SVGUnitTypes": true, + "SVGPathSegMovetoAbs": true, + "SVGSymbolElement": true, + "SVGFEFuncAElement": true, + "SVGAnimatedString": true, + "SVGFEMergeElement": true, + "SVGPathSegLinetoVerticalAbs": true, + "SVGAnimationElement": true, + "SVGPathSegCurvetoCubicAbs": true, + "SVGLength": true, + "SVGTextPathElement": true, + "SVGPolygonElement": true, + "SVGAnimatedRect": true, + "SVGPathSegCurvetoCubicRel": true, + "SVGFEFuncRElement": true, + "SVGLengthList": true, + "SVGTextContentElement": true, + "SVGFETurbulenceElement": true, + "SVGMatrix": true, + "SVGZoomAndPan": true, + "SVGMetadataElement": true, + "SVGFEDistantLightElement": true, + "SVGAnimateMotionElement": true, + "SVGDescElement": true, + "SVGPathSegCurvetoCubicSmoothRel": true, + "SVGFESpecularLightingElement": true, + "SVGFEGaussianBlurElement": true, + "SVGFEComponentTransferElement": true, + "SVGNumberList": true, + "SVGTransformList": true, + "SVGForeignObjectElement": true, + "SVGRectElement": true, + "SVGFEDisplacementMapElement": true, + "SVGAnimateTransformElement": true, + "SVGAnimatedLength": true, + "SVGPointList": true, + "SVGPatternElement": true, + "SVGPathSegCurvetoCubicSmoothAbs": true, + "SVGCircleElement": true, + "SVGSetElement": true, + "SVGFETileElement": true, + "SVGMPathElement": true, + "SVGFEMergeNodeElement": true, + "SVGPathSegCurvetoQuadraticRel": true, + "SVGElement": true, + "SVGGraphicsElement": true, + "SVGSVGElement": true, + "SVGGElement": true, + "SVGGeometryElement": true, + "SVGPathElement": true, + "SVGLineElement": true, + "cat_html": true, + "HTMLTimeElement": true, + "HTMLPictureElement": true, + "HTMLMenuItemElement": true, + "HTMLFormElement": true, + "HTMLOptionElement": true, + "HTMLCanvasElement": true, + "HTMLTableSectionElement": true, + "HTMLSelectElement": true, + "HTMLUListElement": true, + "HTMLMetaElement": true, + "HTMLLinkElement": true, + "HTMLBaseElement": true, + "HTMLDataListElement": true, + "HTMLInputElement": true, + "HTMLMeterElement": true, + "HTMLSourceElement": true, + "HTMLTrackElement": true, + "HTMLTableColElement": true, + "HTMLFieldSetElement": true, + "HTMLDirectoryElement": true, + "HTMLTableCellElement": true, + "HTMLStyleElement": true, + "HTMLAudioElement": true, + "HTMLLegendElement": true, + "HTMLOListElement": true, + "HTMLEmbedElement": true, + "HTMLQuoteElement": true, + "HTMLMenuElement": true, + "HTMLHeadElement": true, + "HTMLUnknownElement": true, + "HTMLBRElement": true, + "HTMLProgressElement": true, + "HTMLMediaElement": true, + "HTMLFormControlsCollection": true, + "HTMLCollection": true, + "HTMLLIElement": true, + "HTMLDetailsElement": true, + "HTMLObjectElement": true, + "HTMLHeadingElement": true, + "HTMLTableCaptionElement": true, + "HTMLPreElement": true, + "HTMLAllCollection": true, + "HTMLFrameSetElement": true, + "HTMLFontElement": true, + "HTMLFrameElement": true, + "HTMLAnchorElement": true, + "HTMLOptGroupElement": true, + "HTMLVideoElement": true, + "HTMLModElement": true, + "HTMLBodyElement": true, + "HTMLTableElement": true, + "HTMLButtonElement": true, + "HTMLTableRowElement": true, + "HTMLAreaElement": true, + "HTMLDataElement": true, + "HTMLParamElement": true, + "HTMLLabelElement": true, + "HTMLTemplateElement": true, + "HTMLOptionsCollection": true, + "HTMLIFrameElement": true, + "HTMLTitleElement": true, + "HTMLMapElement": true, + "HTMLOutputElement": true, + "HTMLDListElement": true, + "HTMLParagraphElement": true, + "HTMLHRElement": true, + "HTMLImageElement": true, + "HTMLDocument": true, + "HTMLElement": true, + "HTMLScriptElement": true, + "HTMLHtmlElement": true, + "HTMLTextAreaElement": true, + "HTMLDivElement": true, + "HTMLSpanElement": true, + "cat_css": true, + "CSSStyleRule": true, + "CSSFontFaceRule": true, + "CSSPrimitiveValue": true, + "CSSStyleDeclaration": true, + "CSSStyleSheet": true, + "CSSPageRule": true, + "CSSSupportsRule": true, + "CSSMozDocumentRule": true, + "CSSKeyframeRule": true, + "CSSGroupingRule": true, + "CSS2Properties": true, + "CSSFontFeatureValuesRule": true, + "CSSRuleList": true, + "CSSPseudoElement": true, + "CSSMediaRule": true, + "CSSCounterStyleRule": true, + "CSSImportRule": true, + "CSSTransition": true, + "CSSAnimation": true, + "CSSValue": true, + "CSSNamespaceRule": true, + "CSSRule": true, + "CSS": true, + "CSSKeyframesRule": true, + "CSSConditionRule": true, + "CSSValueList": true, + "cat_event": true, + "ondevicemotion": true, + "ondeviceorientation": true, + "onabsolutedeviceorientation": true, + "ondeviceproximity": true, + "onuserproximity": true, + "ondevicelight": true, + "onvrdisplayconnect": true, + "onvrdisplaydisconnect": true, + "onvrdisplayactivate": true, + "onvrdisplaydeactivate": true, + "onvrdisplaypresentchange": true, + "onabort": true, + "onblur": true, + "onfocus": true, + "onauxclick": true, + "oncanplay": true, + "oncanplaythrough": true, + "onchange": true, + "onclick": true, + "onclose": true, + "oncontextmenu": true, + "ondblclick": true, + "ondrag": true, + "ondragend": true, + "ondragenter": true, + "ondragexit": true, + "ondragleave": true, + "ondragover": true, + "ondragstart": true, + "ondrop": true, + "ondurationchange": true, + "onemptied": true, + "onended": true, + "oninput": true, + "oninvalid": true, + "onkeydown": true, + "onkeypress": true, + "onkeyup": true, + "onload": true, + "onloadeddata": true, + "onloadedmetadata": true, + "onloadend": true, + "onloadstart": true, + "onmousedown": true, + "onmouseenter": true, + "onmouseleave": true, + "onmousemove": true, + "onmouseout": true, + "onmouseover": true, + "onmouseup": true, + "onwheel": true, + "onpause": true, + "onplay": true, + "onplaying": true, + "onprogress": true, + "onratechange": true, + "onreset": true, + "onresize": true, + "onscroll": true, + "onseeked": true, + "onseeking": true, + "onselect": true, + "onshow": true, + "onstalled": true, + "onsubmit": true, + "onsuspend": true, + "ontimeupdate": true, + "onvolumechange": true, + "onwaiting": true, + "onselectstart": true, + "ontoggle": true, + "onpointercancel": true, + "onpointerdown": true, + "onpointerup": true, + "onpointermove": true, + "onpointerout": true, + "onpointerover": true, + "onpointerenter": true, + "onpointerleave": true, + "ongotpointercapture": true, + "onlostpointercapture": true, + "onmozfullscreenchange": true, + "onmozfullscreenerror": true, + "onanimationcancel": true, + "onanimationend": true, + "onanimationiteration": true, + "onanimationstart": true, + "ontransitioncancel": true, + "ontransitionend": true, + "ontransitionrun": true, + "ontransitionstart": true, + "onwebkitanimationend": true, + "onwebkitanimationiteration": true, + "onwebkitanimationstart": true, + "onwebkittransitionend": true, + "onerror": false, + "onafterprint": true, + "onbeforeprint": true, + "onbeforeunload": true, + "onhashchange": true, + "onlanguagechange": true, + "onmessage": true, + "onmessageerror": true, + "onoffline": true, + "ononline": true, + "onpagehide": true, + "onpageshow": true, + "onpopstate": true, + "onstorage": true, + "onunload": true, + "cat_rtc": true, + "RTCDTMFSender": true, + "RTCStatsReport": true, + "RTCTrackEvent": true, + "RTCDataChannelEvent": true, + "RTCPeerConnectionIceEvent": true, + "RTCCertificate": true, + "RTCDTMFToneChangeEvent": true, + "RTCPeerConnection": true, + "RTCIceCandidate": true, + "RTCRtpReceiver": true, + "RTCRtpSender": true, + "RTCSessionDescription": true, + "cat_vr": true, + "VRStageParameters": true, + "VRFrameData": true, + "VRDisplay": true, + "VRDisplayEvent": true, + "VRFieldOfView": true, + "VRDisplayCapabilities": true, + "VREyeParameters": true, + "VRPose": true, + "cat_dom": true, + "DOMStringMap": true, + "DOMRectReadOnly": true, + "DOMException": true, + "DOMRect": true, + "DOMMatrix": true, + "DOMMatrixReadOnly": true, + "DOMPointReadOnly": true, + "DOMPoint": true, + "DOMQuad": true, + "DOMRequest": true, + "DOMParser": true, + "DOMTokenList": true, + "DOMStringList": true, + "DOMImplementation": true, + "DOMError": true, + "DOMRectList": true, + "DOMCursor": true, + "cat_idb": true, + "IDBFileRequest": true, + "IDBTransaction": true, + "IDBCursor": true, + "IDBFileHandle": true, + "IDBMutableFile": true, + "IDBKeyRange": true, + "IDBVersionChangeEvent": true, + "IDBObjectStore": true, + "IDBFactory": true, + "IDBCursorWithValue": true, + "IDBOpenDBRequest": true, + "IDBRequest": true, + "IDBIndex": true, + "IDBDatabase": true, + "cat_audio": true, + "AudioContext": true, + "AudioBuffer": true, + "AudioBufferSourceNode": true, + "Audio": true, + "MediaElementAudioSourceNode": true, + "AudioNode": true, + "BaseAudioContext": true, + "AudioListener": true, + "MediaStreamAudioSourceNode": true, + "OfflineAudioContext": true, + "AudioDestinationNode": true, + "AudioParam": true, + "MediaStreamAudioDestinationNode": true, + "OfflineAudioCompletionEvent": true, + "AudioStreamTrack": true, + "AudioScheduledSourceNode": true, + "AudioProcessingEvent": true, + "cat_gamepad": true, + "GamepadButton": true, + "GamepadHapticActuator": true, + "GamepadAxisMoveEvent": true, + "GamepadPose": true, + "GamepadEvent": true, + "Gamepad": true, + "GamepadButtonEvent": true, + "cat_media": true, + "MediaKeys": true, + "MediaKeyError": true, + "MediaSource": true, + "MediaDevices": true, + "MediaKeyStatusMap": true, + "MediaStreamTrackEvent": true, + "MediaRecorder": true, + "MediaQueryListEvent": true, + "MediaStream": true, + "MediaEncryptedEvent": true, + "MediaStreamTrack": true, + "MediaError": true, + "MediaStreamEvent": true, + "MediaQueryList": true, + "MediaKeySystemAccess": true, + "MediaDeviceInfo": true, + "MediaKeySession": true, + "MediaList": true, + "MediaRecorderErrorEvent": true, + "MediaKeyMessageEvent": true, + "cat_event2": true, + "SpeechSynthesisErrorEvent": true, + "BeforeUnloadEvent": true, + "CustomEvent": true, + "PageTransitionEvent": true, + "PopupBlockedEvent": true, + "CloseEvent": true, + "ProgressEvent": true, + "MutationEvent": true, + "MessageEvent": true, + "FocusEvent": true, + "TrackEvent": true, + "DeviceMotionEvent": true, + "TimeEvent": true, + "PointerEvent": true, + "UserProximityEvent": true, + "StorageEvent": true, + "DragEvent": true, + "MouseScrollEvent": true, + "EventSource": true, + "PopStateEvent": true, + "DeviceProximityEvent": true, + "SpeechSynthesisEvent": true, + "XMLHttpRequestEventTarget": true, + "ClipboardEvent": true, + "AnimationPlaybackEvent": true, + "DeviceLightEvent": true, + "BlobEvent": true, + "MouseEvent": true, + "WheelEvent": true, + "InputEvent": true, + "HashChangeEvent": true, + "DeviceOrientationEvent": true, + "CompositionEvent": true, + "KeyEvent": true, + "ScrollAreaEvent": true, + "KeyboardEvent": true, + "TransitionEvent": true, + "ErrorEvent": true, + "AnimationEvent": true, + "FontFaceSetLoadEvent": true, + "EventTarget": true, + "captureEvents": true, + "releaseEvents": true, + "Event": true, + "UIEvent": true, + "cat_other": false, + "undefined": false, + "Array": false, + "Boolean": false, + "JSON": false, + "Date": false, + "Math": false, + "Number": false, + "String": false, + "RegExp": false, + "Error": false, + "InternalError": false, + "EvalError": false, + "RangeError": false, + "ReferenceError": false, + "SyntaxError": false, + "TypeError": false, + "URIError": false, + "ArrayBuffer": true, + "Int8Array": true, + "Uint8Array": true, + "Int16Array": true, + "Uint16Array": true, + "Int32Array": true, + "Uint32Array": true, + "Float32Array": true, + "Float64Array": true, + "Uint8ClampedArray": true, + "Proxy": true, + "WeakMap": true, + "Map": true, + "Set": true, + "DataView": false, + "Symbol": false, + "SharedArrayBuffer": true, + "Intl": false, + "TypedObject": true, + "Reflect": true, + "SIMD": true, + "WeakSet": true, + "Atomics": true, + "Promise": true, + "WebAssembly": true, + "NaN": false, + "Infinity": false, + "isNaN": false, + "isFinite": false, + "parseFloat": false, + "parseInt": false, + "escape": false, + "unescape": false, + "decodeURI": false, + "encodeURI": false, + "decodeURIComponent": false, + "encodeURIComponent": false, + "uneval": false, + "BatteryManager": true, + "CanvasGradient": true, + "TextDecoder": true, + "Plugin": true, + "PushManager": true, + "ChannelMergerNode": true, + "PerformanceResourceTiming": true, + "ServiceWorker": true, + "TextTrackCueList": true, + "PerformanceEntry": true, + "TextTrackList": true, + "StyleSheet": true, + "PerformanceMeasure": true, + "DesktopNotificationCenter": true, + "Comment": true, + "DelayNode": true, + "XPathResult": true, + "CDATASection": true, + "MessageChannel": true, + "BiquadFilterNode": true, + "SpeechSynthesisUtterance": true, + "Crypto": true, + "Navigator": true, + "FileList": true, + "URLSearchParams": false, + "ServiceWorkerContainer": true, + "ValidityState": true, + "ProcessingInstruction": true, + "AbortSignal": true, + "FontFace": true, + "FileReader": true, + "Worker": true, + "External": true, + "ImageBitmap": true, + "TimeRanges": true, + "Option": true, + "TextTrack": true, + "Image": true, + "AnimationTimeline": true, + "VideoPlaybackQuality": true, + "VTTCue": true, + "Storage": true, + "XPathExpression": true, + "CharacterData": false, + "TextMetrics": true, + "AnimationEffectReadOnly": true, + "PerformanceTiming": false, + "PerformanceMark": true, + "ImageBitmapRenderingContext": true, + "Headers": true, + "Range": false, + "Rect": true, + "AnimationEffectTimingReadOnly": true, + "KeyframeEffect": true, + "Permissions": true, + "TextEncoder": true, + "ImageData": true, + "SpeechSynthesisVoice": true, + "StorageManager": true, + "TextTrackCue": true, + "WebSocket": true, + "DocumentType": true, + "XPathEvaluator": true, + "PerformanceNavigationTiming": true, + "IdleDeadline": true, + "FileSystem": true, + "FileSystemFileEntry": true, + "CacheStorage": true, + "MimeType": true, + "PannerNode": true, + "NodeFilter": true, + "StereoPannerNode": true, + "console": false, + "DynamicsCompressorNode": true, + "PaintRequest": true, + "RGBColor": true, + "FontFaceSet": false, + "PaintRequestList": true, + "FileSystemEntry": true, + "XMLDocument": false, + "SourceBuffer": false, + "Screen": true, + "NamedNodeMap": false, + "History": true, + "Response": true, + "AnimationEffectTiming": true, + "ServiceWorkerRegistration": true, + "CanvasRenderingContext2D": true, + "ScriptProcessorNode": true, + "FileSystemDirectoryReader": true, + "MimeTypeArray": true, + "CanvasCaptureMediaStream": true, + "Directory": true, + "mozRTCPeerConnection": true, + "PerformanceObserverEntryList": true, + "PushSubscriptionOptions": true, + "Text": false, + "IntersectionObserverEntry": true, + "SubtleCrypto": true, + "Animation": true, + "DataTransfer": true, + "TreeWalker": true, + "XMLHttpRequest": true, + "LocalMediaStream": true, + "ConvolverNode": true, + "WaveShaperNode": true, + "DataTransferItemList": false, + "Request": true, + "SourceBufferList": false, + "XSLTProcessor": true, + "XMLHttpRequestUpload": true, + "SharedWorker": true, + "Notification": false, + "DataTransferItem": true, + "AnalyserNode": true, + "mozRTCIceCandidate": true, + "PerformanceObserver": true, + "OfflineResourceList": true, + "FileSystemDirectoryEntry": true, + "DesktopNotification": false, + "DataChannel": true, + "IIRFilterNode": true, + "ChannelSplitterNode": true, + "File": true, + "ConstantSourceNode": true, + "CryptoKey": true, + "GainNode": true, + "AbortController": true, + "Attr": true, + "SpeechSynthesis": true, + "PushSubscription": false, + "XMLStylesheetProcessingInstruction": false, + "NodeIterator": true, + "VideoStreamTrack": true, + "XMLSerializer": true, + "CaretPosition": true, + "FormData": true, + "CanvasPattern": true, + "mozRTCSessionDescription": true, + "Path2D": true, + "PerformanceNavigation": true, + "URL": false, + "PluginArray": true, + "MutationRecord": true, + "WebKitCSSMatrix": true, + "PeriodicWave": true, + "DocumentFragment": true, + "DocumentTimeline": false, + "ScreenOrientation": true, + "BroadcastChannel": true, + "PermissionStatus": true, + "IntersectionObserver": true, + "Blob": true, + "MessagePort": true, + "BarProp": true, + "OscillatorNode": true, + "Cache": true, + "RadioNodeList": true, + "KeyframeEffectReadOnly": true, + "InstallTrigger": true, + "Function": true, + "Object": false, + "eval": true, + "Window": false, + "close": false, + "stop": false, + "focus": false, + "blur": false, + "open": true, + "alert": false, + "confirm": false, + "prompt": false, + "print": false, + "postMessage": true, + "getSelection": true, + "getComputedStyle": true, + "matchMedia": true, + "moveTo": false, + "moveBy": false, + "resizeTo": false, + "resizeBy": false, + "scroll": false, + "scrollTo": false, + "scrollBy": false, + "requestAnimationFrame": true, + "cancelAnimationFrame": true, + "getDefaultComputedStyle": false, + "scrollByLines": false, + "scrollByPages": false, + "sizeToContent": false, + "updateCommands": true, + "find": false, + "dump": true, + "setResizable": false, + "requestIdleCallback": false, + "cancelIdleCallback": false, + "btoa": true, + "atob": true, + "setTimeout": true, + "clearTimeout": true, + "setInterval": true, + "clearInterval": true, + "createImageBitmap": true, + "fetch": true, + "self": true, + "name": false, + "history": true, + "locationbar": true, + "menubar": true, + "personalbar": true, + "scrollbars": true, + "statusbar": true, + "toolbar": true, + "status": true, + "closed": true, + "frames": true, + "length": false, + "opener": true, + "parent": true, + "frameElement": true, + "navigator": true, + "external": true, + "applicationCache": true, + "screen": true, + "innerWidth": true, + "innerHeight": true, + "scrollX": true, + "pageXOffset": true, + "scrollY": true, + "pageYOffset": true, + "screenX": true, + "screenY": true, + "outerWidth": true, + "outerHeight": true, + "performance": true, + "mozInnerScreenX": true, + "mozInnerScreenY": true, + "devicePixelRatio": true, + "scrollMaxX": true, + "scrollMaxY": true, + "fullScreen": false, + "mozPaintCount": true, + "sidebar": false, + "crypto": true, + "speechSynthesis": true, + "localStorage": true, + "origin": true, + "isSecureContext": false, + "indexedDB": true, + "caches": true, + "sessionStorage": true, + "window": false, + "document": true, + "location": false, + "top": false, + "netscape": true, + "Node": true, + "Document": true, + "Performance": false, + "startProfiling": true, + "stopProfiling": true, + "pauseProfilers": true, + "resumeProfilers": true, + "dumpProfile": true, + "getMaxGCPauseSinceClear": true, + "clearMaxGCPauseAccumulator": true, + "Location": true, + "StyleSheetList": false, + "Selection": false, + "Element": true, + "AnonymousContent": false, + "MutationObserver": true, + "NodeList": true, + "StopIteration": true + } +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/license_definitions.json b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/license_definitions.json @@ -0,0 +1,449 @@ +{ + "AGPL-3.0": { + "licenseName": "GNU AFFERO GENERAL PUBLIC LICENSE version 3", + "identifier": "AGPL-3.0", + "canonicalUrl": [ + "http://www.gnu.org/licenses/agpl-3.0.html", + "magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt" + ], + "licenseFragments": [ + { + "text": "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", + "type": "short" + } + ] + }, + "Apache-2.0": { + "licenseName": "Apache License, Version 2.0", + "identifier": "Apache-2.0", + "canonicalUrl": [ + "http://www.apache.org/licenses/LICENSE-2.0", + "magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt" + ], + "licenseFragments": [ + { + "text": "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0", + "type": "short" + } + ] + }, + "Artistic-2.0": { + "licenseName": "Artistic License 2.0", + "identifier": "Artistic-2.0", + "canonicalUrl": [ + "http://www.perlfoundation.org/artistic_license_2_0", + "magnet:?xt=urn:btih:54fd2283f9dbdf29466d2df1a98bf8f65cafe314&dn=artistic-2.0.txt" + ], + "licenseFragments": [] + }, + "BSD-2-Clause": { + "licenseName": "BSD 2-Clause License", + "identifier": "BSD-2-Clause", + "canonicalUrl": [ + "http://www.freebsd.org/copyright/freebsd-license.html", + "magnet:?xt=urn:btih:87f119ba0b429ba17a44b4bffcab33165ebdacc0&dn=freebsd.txt" + ], + "licenseFragments": [ + { + "text": "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.", + "type": "short" + } + ] + }, + "BSD-3-Clause": { + "licenseName": "BSD 3-Clause License", + "identifier": "BSD-3-Clause", + "canonicalUrl": [ + "http://opensource.org/licenses/BSD-3-Clause", + "magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt" + ], + "licenseFragments": [ + { + "text": "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.", + "type": "short" + } + ] + }, + "BSL-1.0": { + "licenseName": "Boost Software License 1.0", + "identifier": "BSL-1.0", + "canonicalUrl": [ + "http://www.boost.org/LICENSE_1_0.txt", + "magnet:?xt=urn:btih:89a97c535628232f2f3888c2b7b8ffd4c078cec0&dn=Boost-1.0.txt" + ], + "licenseFragments": [ + { + "text": "Boost Software License <VERSION> <DATE> Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the \"Software\") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following", + "type": "short" + } + ] + }, + "CC-BY-1.0": { + "licenseName": "Creative Commons Attribution 1.0 Generic", + "identifier": "CC-BY-1.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/1.0/" + ], + "licenseFragments": [] + }, + "CC-BY-2.0": { + "licenseName": "Creative Commons Attribution 2.0 Generic", + "identifier": "CC-BY-2.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/2.0/" + ], + "licenseFragments": [] + }, + "CC-BY-2.5": { + "licenseName": "Creative Commons Attribution 2.5 Generic", + "identifier": "CC-BY-2.5", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/2.5/" + ], + "licenseFragments": [] + }, + "CC-BY-3.0": { + "licenseName": "Creative Commons Attribution 3.0 Unported", + "identifier": "CC-BY-3.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/3.0/" + ], + "licenseFragments": [] + }, + "CC-BY-4.0": { + "licenseName": "Creative Commons Attribution 4.0 International", + "identifier": "CC-BY-4.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by/4.0/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-1.0": { + "licenseName": "Creative Commons Attribution-ShareAlike 1.0 Generic", + "identifier": "CC-BY-SA-1.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/1.0/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-2.0": { + "licenseName": "Creative Commons Attribution-ShareAlike 2.0 Generic", + "identifier": "CC-BY-SA-2.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/2.0/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-2.5": { + "licenseName": "Creative Commons Attribution-ShareAlike 2.5 Generic", + "identifier": "CC-BY-SA-2.5", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/2.5/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-3.0": { + "licenseName": "Creative Commons Attribution-ShareAlike 3.0 Unported", + "identifier": "CC-BY-SA-3.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/3.0/" + ], + "licenseFragments": [] + }, + "CC-BY-SA-4.0": { + "licenseName": "Creative Commons Attribution-ShareAlike 4.0 International", + "identifier": "CC-BY-SA-4.0", + "canonicalUrl": [ + "https://creativecommons.org/licenses/by-sa/4.0/" + ], + "licenseFragments": [] + }, + "CC0-1.0": { + "licenseName": "Creative Commons CC0 1.0 Universal", + "identifier": "CC0-1.0", + "canonicalUrl": [ + "http://creativecommons.org/publicdomain/zero/1.0/legalcode", + "magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt" + ], + "licenseFragments": [] + }, + "CECILL-2.0": { + "licenseName": "CeCILL Free Software License Agreement v2.0", + "identifier": "CECILL-2.0", + "canonicalUrl": [ + "https://www.cecill.info/licences/Licence_CeCILL_V2-en.txt", + "magnet:?xt=urn:btih:dda0473d240d7febeac8fa265da27286ead0b1ce&dn=cecill-2.0.txt" + ], + "licenseFragments": [] + }, + "CPAL-1.0": { + "licenseName": "Common Public Attribution License Version 1.0 (CPAL)", + "identifier": "CPAL-1.0", + "canonicalUrl": [ + "http://opensource.org/licenses/cpal_1.0", + "magnet:?xt=urn:btih:84143bc45939fc8fa42921d619a95462c2031c5c&dn=cpal-1.0.txt" + ], + "licenseFragments": [ + { + "text": "The contents of this file are subject to the Common Public Attribution License Version 1.0", + "type": "short" + }, + { + "text": "The term \"External Deployment\" means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2.", + "type": "short" + } + ] + }, + "EPL-1.0": { + "licenseName": "Eclipse Public License Version 1.0", + "identifier": "EPL-1.0", + "canonicalUrl": [ + "http://www.eclipse.org/legal/epl-v10.html", + "magnet:?xt=urn:btih:4c6a2ad0018cd461e9b0fc44e1b340d2c1828b22&dn=epl-1.0.txt" + ], + "licenseFragments": [ + { + "text": "THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.", + "type": "short" + } + ] + }, + "Expat": { + "licenseName": "Expat License (sometimes called MIT Licensed)", + "identifier": "Expat", + "canonicalUrl": [ + "http://www.jclark.com/xml/copying.txt", + "magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt" + ], + "licenseFragments": [ + { + "text": "Copyright <YEAR> <NAME> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "type": "short" + } + ] + }, + "FreeBSD": { + "licenseName": "FreeBSD License", + "identifier": "FreeBSD", + "canonicalUrl": [ + "http://www.freebsd.org/copyright/freebsd-license.html", + "magnet:?xt=urn:btih:87f119ba0b429ba17a44b4bffcab33165ebdacc0&dn=freebsd.txt" + ], + "licenseFragments": [ + { + "text": "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.", + "type": "short" + } + ] + }, + "GNU-All-Permissive": { + "licenseName": "GNU All-Permissive License", + "identifier": "GNU-All-Permissive", + "canonicalUrl": [], + "licenseFragments": [ + { + "text": "Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty.", + "type": "short" + } + ] + }, + "GPL-2.0": { + "licenseName": "GNU General Public License (GPL) version 2", + "identifier": "GPL-2.0", + "canonicalUrl": [ + "http://www.gnu.org/licenses/gpl-2.0.html", + "magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt" + ], + "licenseFragments": [ + { + "text": "<THISPROGRAM> is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.", + "type": "short" + }, + { + "text": "Alternatively, the contents of this file may be used under the terms of either the GNU General Public License Version 2 or later (the \"GPL\"), or the GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"), in which case the provisions of the GPL or the LGPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of either the GPL or the LGPL, and not to allow others to use your version of this file under the terms of the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL or the LGPL. If you do not delete the provisions above, a recipient may use your version of this file under the terms of any one of the MPL, the GPL or the LGPL.", + "type": "short" + } + ] + }, + "GPL-3.0": { + "licenseName": "GNU General Public License (GPL) version 3", + "identifier": "GPL-3.0", + "canonicalUrl": [ + "http://www.gnu.org/licenses/gpl-3.0.html", + "magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt" + ], + "licenseFragments": [ + { + "text": "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License (GNU GPL) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The code is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. As additional permission under GNU GPL version 3 section 7, you may distribute non-source (e.g., minimized or compacted) forms of that code without the copy of the GNU GPL normally required by section 4, provided you include this license notice and a URL through which recipients can access the Corresponding Source.", + "type": "short" + }, + { + "text": "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", + "type": "short" + } + ] + }, + "ISC": { + "licenseName": "The ISC License", + "identifier": "ISC", + "canonicalUrl": [ + "https://www.isc.org/downloads/software-support-policy/isc-license/", + "magnet:?xt=urn:btih:b8999bbaf509c08d127678643c515b9ab0836bae&dn=ISC.txt" + ], + "licenseFragments": [ + { + "text": "Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", + "type": "short" + }, + { + "text": "Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", + "type": "short" + } + ] + }, + "jQueryTools": { + "licenseName": "jQuery Tools", + "identifier": "jQueryTools", + "canonicalUrl": [], + "licenseFragments": [ + { + "text": "NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.", + "type": "short" + } + ] + }, + "LGPL-2.1": { + "licenseName": "GNU Lesser General Public License, version 2.1", + "identifier": "LGPL-2.1", + "canonicalUrl": [ + "http://www.gnu.org/licenses/lgpl-2.1.html", + "magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt" + ], + "licenseFragments": [ + { + "text": "<THISLIBRARY> is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.", + "type": "short" + } + ] + }, + "LGPL-3.0": { + "licenseName": "GNU Lesser General Public License, version 3", + "identifier": "LGPL-3.0", + "canonicalUrl": [ + "http://www.gnu.org/licenses/lgpl-3.0.html", + "magnet:?xt=urn:btih:0ef1b8170b3b615170ff270def6427c317705f85&dn=lgpl-3.0.txt" + ], + "licenseFragments": [ + { + "text": "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", + "type": "short" + } + ] + }, + "MPL-2.0": { + "licenseName": "Mozilla Public License Version 2.0", + "identifier": "MPL-2.0", + "canonicalUrl": [ + "http://www.mozilla.org/MPL/2.0", + "magnet:?xt=urn:btih:3877d6d54b3accd4bc32f8a48bf32ebc0901502a&dn=mpl-2.0.txt" + ], + "licenseFragments": [ + { + "text": "This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.", + "type": "short" + } + ] + }, + "PublicDomain": { + "licenseName": "Public Domain", + "identifier": "PublicDomain", + "canonicalUrl": [ + "magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt" + ], + "licenseFragments": [] + }, + "Unlicense": { + "licenseName": "Unlicense", + "identifier": "Unlicense", + "canonicalUrl": [ + "http://unlicense.org/UNLICENSE", + "magnet:?xt=urn:btih:5ac446d35272cc2e4e85e4325b146d0b7ca8f50c&dn=unlicense.txt" + ], + "licenseFragments": [ + { + "text": "This is free and unencumbered software released into the public domain.", + "type": "short" + } + ] + }, + "UPL": { + "licenseName": "Universal Permissive License", + "identifier": "UPL-1.0", + "canonicalUrl": [ + "https://oss.oracle.com/licenses/upl/", + "magnet:?xt=urn:btih:478974f4d41c3fa84c4befba25f283527fad107d&dn=upl-1.0.txt" + ], + "licenseFragments": [ + { + "text": "The Universal Permissive License (UPL), Version 1.0", + "type": "short" + } + ] + }, + "WTFPL": { + "licenseName": "Do What The F*ck You Want To Public License (WTFPL)", + "identifier": "WTFPL", + "canonicalUrl": [ + "http://www.wtfpl.net/txt/copying/", + "magnet:?xt=urn:btih:723febf9f6185544f57f0660a41489c7d6b4931b&dn=wtfpl.txt" + ], + "licenseFragments": [ + { + "text": "DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE", + "type": "short" + }, + { + "text": "0. You just DO WHAT THE FUCK YOU WANT TO.", + "type": "short" + } + ] + }, + "X11": { + "licenseName": "X11 License", + "identifier": "X11", + "canonicalUrl": [ + "magnet:?xt=urn:btih:5305d91886084f776adcf57509a648432709a7c7&dn=x11.txt" + ], + "licenseFragments": [ + { + "text": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "type": "short" + } + ] + }, + "XFree86-1.1": { + "licenseName": "XFree86 1.1 License", + "identifier": "XFree86-1.1", + "canonicalUrl": [ + "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3", + "http://www.xfree86.org/current/LICENSE4.html", + "magnet:?xt=urn:btih:12f2ec9e8de2a3b0002a33d518d6010cc8ab2ae9&dn=xfree86.txt" + ], + "licenseFragments": [ + { + "text": "All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution, and in the same place and form as other copyright, license and disclaimer information.\n3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: \"This product includes software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and its contributors\", in the same place and form as other third-party acknowledgments. Alternately, this acknowledgment may appear in the software itself, in the same form and location as other such third-party acknowledgments.4. Except as contained in this notice, the name of The XFree86 Project, Inc shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The XFree86 Project, Inc.", + "type": "short" + } + ] + }, + "Zlib": { + "licenseName": "zlib License", + "canonicalUrl": [ + "https://www.zlib.net/zlib_license.html", + "https://spdx.org/licenses/Zlib.txt", + "magnet:?xt=urn:btih:922bd98043fa3daf4f9417e3e8fec8406b1961a3&dn=zlib.txt" + ], + "identifier": "Zlib", + "licenseFragments": [] + } +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/pattern_utils.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/common/pattern_utils.js @@ -0,0 +1,49 @@ +/** + * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. + * * + * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros + * Copyright (C) 2014, 2015 Nik Nyby + * Copyright (C) 2022 Yuchen Pei + * + * This file is part of GNU LibreJS. + * + * GNU LibreJS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNU LibreJS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. + */ + +exports.patternUtils = { + /** + * removeNonalpha + * + * Remove all nonalphanumeric values, except for + * < and >, since they are what we use for tokens. + * + */ + removeNonalpha: function(str) { + return str.replace(/[^a-z0-9<>@]+/gi, ''); + }, + + removeWhitespace: function(str) { + return str.replace(/\/\//gmi, '').replace(/\*/gmi, '').replace(/\s+/gmi, ''); + }, + + replaceTokens: function(str) { + return str.replace(/<.*?>/gi, '.*?'); + }, + + removeJsComments: function(str) { + const ml_comments = /\/\*.*?(\*\/)/g; + const il_comments = /\/\/.*/gm; + return str.replace(ml_comments, '').replace(il_comments, ''); + } +}; diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/contactFinder.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/contactFinder.js @@ -0,0 +1,259 @@ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* * +* Copyright (C) 2017 Nathan Nichols, Loic J. Duros, Nik Nyby +* Copyright (C) 2018 Giorgio Maone +* Copyright (C) 2022 Yuchen Pei +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +// TO TEST THE CONTACT FINDER: +// - open the manifest.json +// - add a comma after the closing bracket of the key "background" +// - Copy and paste this after it: +/* + "content_scripts": [{ + "matches": ["<all_urls>"], + "js": ["/content/contactFinder.js"], + "css": ["/content/contactFinder.css"] + }] +*/ +// Now, the contact finder will load on every page and you can test it where ever you want. + + +//********************************************************************************************* +(() => { + function debug(format, ...args) { + console.debug(`LibreJS - ${format}`, ...args); + } + + debug("Injecting contact finder in %s", document.URL); + + /** + * contactSearchStrings + * Contains arrays of strings classified by language + * and by degree of certainty. + */ + const CONTACT_FRAGS = + [ + // de + { + 'certain': [ + '^[\\s]*Kontakt os[\\s]*$', + '^[\\s]*Email Os[\\s]*$', + '^[\\s]*Kontakt[\\s]*$' + ], + 'probable': ['^[\\s]Kontakt', '^[\\s]*Email'], + 'uncertain': [ + '^[\\s]*Om Us', + '^[\\s]*Om', + 'Hvem vi er' + ] + }, + // en + { + 'certain': [ + '^[\\s]*Contact Us[\\s]*$', + '^[\\s]*Email Us[\\s]*$', + '^[\\s]*Contact[\\s]*$', + '^[\\s]*Feedback[\\s]*$', + '^[\\s]*Web.?site Feedback[\\s]*$' + ], + 'probable': ['^[\\s]*Contact', '^[\\s]*Email'], + 'uncertain': [ + '^[\\s]*About Us', + '^[\\s]*About', + 'Who we are', + 'Who I am', + 'Company Info', + 'Customer Service' + ] + }, + // es + { + 'certain': [ + '^[\\s]*contáctenos[\\s]*$', + '^[\\s]*Email[\\s]*$' + ], + 'probable': ['^[\\s]contáctenos', '^[\\s]*Email'], + 'uncertain': [ + 'Acerca de nosotros' + ] + }, + // fr + { + 'certain': [ + '^[\\s]*Contactez nous[\\s]*$', + '^[\\s]*(Nous )?contacter[\\s]*$', + '^[\\s]*Email[\\s]*$', + '^[\\s]*Contact[\\s]*$', + '^[\\s]*Commentaires[\\s]*$' + ], + 'probable': ['^[\\s]Contact', '^[\\s]*Email'], + 'uncertain': [ + '^[\\s]*(A|À) propos', + 'Qui nous sommes', + 'Qui suis(-| )?je', + 'Info', + 'Service Client(e|è)le' + ] + } + ]; + + const CONTACT_LINK_LIMIT = 5; + + // Taken from http://emailregex.com/ + const EMAIL_REGEX = + new RegExp(/(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/g); + //********************************************************************************************* + + function findMatch(link, frag) { + const result = (link.innerText.match(new RegExp(frag, "g")) || []).filter(x => typeof x == "string"); + if (result.length) return true; + return false; + } + + /** + * Tests all links on the page for regexes under a certain certainty level. + * + * Will return either all regex matches from the selected certainty level, + * up to a limit. + * + * certainty can be "certain" > "probable" > "uncertain" + */ + function attempt(certainty, limit) { + // There needs to be some kind of max so that people can't troll by for example leaving a comment with a bunch of emails + // to cause LibreJS users to slow down. + const matches = []; + const links = Array.from(document.links).filter(link => (typeof (link.innerText) === "string" || typeof (link.href) === "string")); + for (const link of links) { + for (const byLevel of CONTACT_FRAGS) { + for (const frag of byLevel[certainty]) { + findMatch(link, frag) && matches.push(link); + if (matches.length >= limit) return { 'fail': false, 'result': [link] }; + } + } + } + return { "fail": matches.length === 0, "result": matches }; + } + + /** + * "LibreJS detects contact pages and email addresses that are likely to be owned by the + * maintainer of the site." + */ + function findContacts() { + for (const type of ["certain", "probable", "uncertain"]) { + const attempted = attempt(type, CONTACT_LINK_LIMIT); + if (!attempted["fail"]) { + return [type, attempted["result"]]; + } + } + return null; + } + + + function createWidget(id, tag, parent = document.body) { + const oldWidget = document.getElementById(id); + if (oldWidget) oldWidget.remove(); + const widget = parent.appendChild(document.createElement(tag)); + widget.id = id; + return widget; + } + + /** + * + * Creates the contact finder / complain UI as a semi-transparent overlay + * + */ + + function main() { + const overlay = createWidget("_LibreJS_overlay", "div"); + const frame = createWidget("_LibreJS_frame", "iframe"); + + const close = () => { + frame.remove(); + overlay.remove(); + }; + + // Clicking the "outer area" closes the dialog. + overlay.addEventListener("click", close); + + const initFrame = prefs => { + debug("initFrame"); + const contentDoc = frame.contentWindow.document; + + const addText = (text, tag, wherein) => { + el = wherein.appendChild(contentDoc.createElement(tag)); + el.textContent = text; + } + + // Header of the dialog + const { body } = contentDoc; + body.id = "_LibreJS_dialog"; + addText('LibreJS Complaint', 'h1', body); + const closeButton = body.appendChild(contentDoc.createElement('button')); + closeButton.classList.toggle('close', true); + closeButton.textContent = 'x'; + closeButton.addEventListener("click", close); + + const content = body.appendChild(contentDoc.createElement("div")); + content.id = "content"; + + // Add list of contact links + const res = findContacts(); + if (!res) { + content.classList.toggle("_LibreJS_fail", true); + addText('Could not guess any contact page for this site.', 'div', content); + } else { + addText('Contact info guessed for this site', 'h3', content); + addText(res[0] + ':', 'span', content); + const list = content.appendChild(contentDoc.createElement("ul")); + for (const link of res[1]) { + const a = contentDoc.createElement("a"); + a.href = link.href; + a.textContent = link.textContent; + list.appendChild(contentDoc.createElement("li")).appendChild(a); + } + } + + // Add list of emails + const emails = (document.documentElement.textContent.match(EMAIL_REGEX) || []).filter(e => !!e); + if (emails.length) { + addText("Possible email addresses:", 'h5', content); + const list = content.appendChild(contentDoc.createElement("ul")); + for (const recipient of emails.slice(0, 10)) { + const a = contentDoc.createElement("a"); + a.href = `mailto:${recipient}?subject=${encodeURIComponent(prefs["pref_subject"]) + }&body=${encodeURIComponent(prefs["pref_body"]) + }`; + a.textContent = recipient; + list.appendChild(contentDoc.createElement("li")).appendChild(a); + } + } + + // contentDoc.querySelectorAll(".close, a").forEach(makeCloser); + debug("frame initialized"); + } + + frame.addEventListener("load", _ => { + debug("frame loaded"); + browser.runtime.connect({ name: "contact_finder" }).onMessage.addListener(initFrame); + }); + } + + main(); +})(); diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/dialog.css b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/dialog.css @@ -0,0 +1,91 @@ +#_LibreJS_dialog { + font-family: sans-serif; + font-size: 1.2em; + color: #000; + background-color: #eee; + margin: 0; + padding: 0; + text-align: center; +} +#_LibreJS_dialog .close { + -moz-appearance: none; + border: 0; + position: fixed; + top: .2em; + right: .2em; + font-size: 1em; + font-weight: bold; + text-transform: uppercase; + color: white; + background: black; + border-radius: 1em; + cursor: pointer; + display: block; + width: 1.5em; + height: 1.5em; + text-align: center; + vertical-align: middle; + padding: 0; +} +#_LibreJS_dialog .close:hover { + background: #800; +} + + #_LibreJS_dialog h1, #_LibreJS_dialog h2, #_LibreJS_dialog h3 { + font-family: sans-serif; + color: #000; + font-weight: bold; + text-align: center; + border: none; + padding: .2em; + margin: .2em; + display: block; +} + +#_LibreJS_dialog a { + text-decoration: none; + color: #048; + border: none; +} + +#_LibreJS_dialog a:hover { + text-decoration: none; + color: #06c; + border-bottom: 1px solid #048; +} + +#_LibreJS_dialog h1 { + font-size: 1.5em; + background: #666; + color: white; + position: fixed; + top: 0; + left: 0; + width: 100%; + margin: 0; + padding: .2em; +} + +#_LibreJS_dialog h3 { + font-size: 1.2em !important +} + +#_LibreJS_dialog h4 { + font-size: 1em; +} + +#_LibreJS_dialog #content { + position: fixed; + overflow: auto; + top: 2.5em; + bottom: 0; + left: 0; + right: 0; + width: 100%; +} + +#_LibreJS_dialog #content ul { + list-style: none; + margin: 0; + padding: 0; +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js @@ -0,0 +1,105 @@ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ +"use strict"; +{ + // Find and fetch the url to the web labels table, and returns the + // license info in the table as a map from the script url to + // { script: {url, label}, + // licenseLinks: [{url, label}], + // sources: [{url, label}] } + // + // see https://www.gnu.org/software/librejs/free-your-javascript.html#step3 + const fetchWebLabels = async args => { + const { map, cache } = args; + const link = document.querySelector(`link[rel="jslicense"], link[data-jslicense="1"], a[rel="jslicense"], a[data-jslicense="1"]`); + const webLabelsUrl = link ? link.href : cache.webLabels && new URL(cache.webLabels.href, document.baseURI); + if (webLabelsUrl) try { + const response = await fetch(webLabelsUrl); + if (!response.ok) throw `${response.status} ${response.statusText}`; + const doc = new DOMParser().parseFromString( + await response.text(), + 'text/html' + ); + // Sets the base url to be the url of the weblabel page if it + // does not exist. Otherwise relative links on the weblabels + // page will use the base of the current page. + if (!doc.querySelector("base")) { + doc.head.appendChild(doc.createElement("base")).href = webLabelsUrl; + } + const link = a => ({ url: a.href, label: a.textContent }); + const firstLink = parent => link(parent.querySelector("a")); + const allLinks = parent => Array.prototype.map.call(parent.querySelectorAll("a"), link); + for (const row of doc.querySelectorAll("table#jslicense-labels1 > tbody > tr")) { + try { + const cols = row.querySelectorAll("td"); + const script = firstLink(cols[0]); + const licenseLinks = allLinks(cols[1]); + const sources = cols[2] ? allLinks(cols[2]) : []; + map.set(script.url, { script, licenseLinks, sources }); + } catch (e) { + console.error("LibreJS: error parsing Web Labels at %s, row %s", webLabelsUrl, row.innerHTML, e); + } + } + } catch (e) { + console.error("Error fetching Web Labels at %o", link, e); + } + return map; + } + + const fetchLicenseInfo = async cache => { + const map = new Map(); + const args = { map, cache }; + // in the fetchXxx methods we add to a map whatever license(s) + // URLs and source code references we can find in various formats + // (WebLabels is currently the only implementation), keyed by script URLs. + await Promise.all([ + fetchWebLabels(args), + // fetchXmlSpdx(args), + // fetchTxtSpdx(args), + // ... + ]); + return map; + } + + const handlers = { + // Look up the script url in the web labels and return it if found, + // otherwise return undefined. The found value is of the format + // { script: {url, label}, + // licenseLinks: [{url, label}], + // sources: [{url, label}] } + async checkLicensedScript(m) { + const { url, cache } = m; + const licensedScripts = await fetchLicenseInfo(cache); + return licensedScripts.get(url) || licensedScripts.get(url.replace(/\?.*/, '')); + } + } + + browser.runtime.onMessage.addListener(async m => { + if (m.action in handlers) try { + debug("Received message", m); + const result = await handlers[m.action](m); + return result; + } catch (e) { + console.error(e); + } + }); +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/overlay.css b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/overlay.css @@ -0,0 +1,28 @@ +#_LibreJS_overlay { + z-index: 2147483647 !important; + background-color: #000; + opacity: 0.7 !important; + display: block !important; + position: fixed !important; + margin: 0 !important; + padding: 0 !important; + top: 0 !important; + bottom: 0 !important; + left: 0 !important; + right: 0 !important; +} + +#_LibreJS_frame { + width: 60% !important; + height: 80% !important; + top: 10% !important; + bottom: 10% !important; + left: 20% !important; + right: 20% !important; + overflow: auto !important; + position: fixed !important; + display:inline-block !important; + border: 2px solid #444 !important; + z-index: 2147483647 !important; + background: #eee; +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/README b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/README @@ -0,0 +1,21 @@ +/** + * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. + * * + * Copyright (C) 2011, 2012, 2014 Loic J. Duros + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +All images in this directory are free, released under the GPLv3 or later. +\ No newline at end of file diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/background-panel.png b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/background-panel.png Binary files differ. diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/common.css b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/common.css @@ -0,0 +1,52 @@ +html { + padding:0px; + margin:0px; + color:#000 !important; + background:url('background-panel.png') !important; + font-family: sans-serif; +} +body { + padding: 0; + font-size: 12px; + margin: 1em; + color:#000; +} + +.mobile body { + font-size: 6mm; + width: auto; + max-width: auto; +} + +.mobile button { + font-size: 1.5em +} + +div.libre { + position: relative; +} + +.libre { + width:230px; + height:104px; + display:block; +} +h1.libre { + font-size:1.5em; + font-weight:normal; + padding:0; + font-weight:bold; + background:url('librejs-title.png') no-repeat top left; + text-indent:-1000px; + position: relative; +} +h1.libre span { + font-family: sans-serif; + position: absolute; + bottom: 32px; + padding: 0 16px; + left: 230px; + display: block; + text-indent: 0; + vertical-align: bottom; +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/display-panel.html b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/display-panel.html @@ -0,0 +1,113 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"/> +<title>Display JS Monitoring Panel</title> +<link rel="stylesheet" type="text/css" href="./panel-styles.css"/> + +<!-- /** + * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. + * * + * Copyright (C) 2011, 2012, 2014 Loic J. Duros + * Copyright (C) 2017, 2018 NateN1222 <nathannichols454@gmail.com> + * Copyright (C) 2018 Ruben Rodriguez <ruben@gnu.org> + * Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +--> +<script src="/html/mobile.js"></script> +</head> + +<body> + <div id="header"> + <div class="title-area"> + <div> + <a class="libre" + id="ljs-settings" + href= href="https://www.gnu.org/software/librejs/" + title="LibreJS Page Settings"> + <h1 class="libre">LibreJS</h1> + </a> + </div> + </div> + <div id="buttons" class="title-area"> + <div> + <a target="_blank" href="https://www.gnu.org/software/librejs/" + id="librejs-web-link">gnu.org/software/librejs</a> + </div> + <div> + <strong>LibreJS <span id="version"></span></strong> + </div> + <button id="complain">Complain to site owner</button> + <button id="report-tab">Show this report in a new tab</button> + <button id="open-options">Settings...</button> + <button id="autotest">Automated self test...</button> + </div> + </div> + <div id="info"> + <div id="site"> + <h2 class="site">This whole site <span></span></h2> + <div class="status"></div> + <div class="buttons"> + <button class="whitelist" name="*">Whitelist</button> + <button class="blacklist" name="*">Blacklist</button> + <button class="forget" name="*">Forget</button> + <button id="reload" class="reload">Reload</button> + </div> + </div> + <div id="unknown" class="unknown-js"> + <h2></h2> + <p id="must-reload"> + LibreJS will decide whether blocking these scripts next time this page is loaded. <button class="reload" id="reload-now">Reload it now</button> + </p> + <ul> + <li id="li-template"> + <button class="toggle-source show" title="Show code inline">Show</button> + <button class="toggle-source hide" title="Hide code inline">Hide</button> + <a class="script-url" href="#" target="librejs_viewsource"></a>: + <pre class="source"></pre> + <p class="reason"></p> + <div class="buttons"> + <button class="whitelist">Whitelist</button> + <button class="blacklist">Blacklist</button> + <button class="forget">Forget</button> + <button class="forget" name="*">Forget <span class="domain"></span></button> + </div> + + </li> + </ul> + </div> + <div id="whitelisted" class="accepted-js"> + <h2></h2> + <ul></ul> + </div> + <div id="accepted" class="accepted-js"> + <h2></h2> + <ul></ul> + </div> + <div id="blocked" class="blocked-js"> + <h2></h2> + <ul></ul> + </div> + <div id="blacklisted" class="blocked-js"> + <h2></h2> + <ul></ul> + </div> + </div> +</body> +<script src="/common/Test.js"></script> +<script src="main_panel.js"></script> +</html> diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/main_panel.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/main_panel.js @@ -0,0 +1,231 @@ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* * +* Copyright (C) 2017, 2018 NateN1222 <nathannichols454@gmail.com> +* Copyright (C) 2018 Ruben Rodriguez <ruben@gnu.org> +* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +var fromTab = window.location.hash.match(/^#fromTab=(\d+)/) && RegExp.$1; +if (fromTab) { + let browserStyle = document.createElement("link"); + browserStyle.rel = "stylesheet"; + browserStyle.href = "chrome://browser/content/extension.css"; + document.head.appendChild(browserStyle); + document.documentElement.classList.add("tab"); +} + +var myPort = browser.runtime.connect({ name: "port-from-cs" }); +var currentReport; + +// Sends a message that tells the background script the window is open +myPort.postMessage({ "update": true, tabId: parseInt(currentReport && currentReport.tabId || fromTab) || "" }); + +// Display the actual extension version Number +document.querySelector("#version").textContent = browser.runtime.getManifest().version; + +// Enable autotest button if this is a test-enabled build / session +(async () => { + if (await Test.getURL()) { + let button = document.querySelector("#autotest"); + button.style.display = "block"; + button.onclick = async () => { + await Test.getTab(true); + close(); + } + } +})(); + +var liTemplate = document.querySelector("#li-template"); +liTemplate.remove(); + +document.querySelector("#info").addEventListener("click", e => { + let button = e.target; + if (button.tagName === "A") { + setTimeout(close, 100); + return; + } + if (button.tagName !== "BUTTON") button = button.closest("button"); + if (button.matches(".toggle-source")) { + let parent = button.parentNode; + if (!parent.querySelector(".source").textContent) { + parent.querySelector("a").click(); + } else { + parent.classList.toggle("visible"); + } + return; + } + if (!button.matches(".buttons > button")) return; + let domain = button.querySelector(".domain"); + + let li = button.closest("li"); + let entry = li && li._scriptEntry || [currentReport.url, "Page's site"]; + let action = button.className; + let site = domain ? domain.textContent : button.name === "*" ? currentReport.site : ""; + + if (site) { + ([action] = action.split("-")); + } + myPort.postMessage({ [action]: entry, site, tabId: currentReport.tabId }); +}); + +document.querySelector("#report-tab").onclick = e => { + myPort.postMessage({ report_tab: currentReport }); + close(); +} + +document.querySelector("#complain").onclick = e => { + myPort.postMessage({ invoke_contact_finder: currentReport }); + close(); +} + +document.querySelector("#open-options").onclick = e => { + browser.runtime.openOptionsPage(); + close(); +} + +document.body.addEventListener("click", async e => { + if (!e.target.matches(".reload")) return; + let { tabId } = currentReport; + if (tabId) { + await browser.tabs.reload(tabId); + myPort.postMessage({ "update": true, tabId }); + } +}); + +/* +* Takes in the [[file_id, reason],...] array and the group name for one group +* of scripts found in this tab, rendering it as a list with management buttons. +* Groups are "unknown", "blacklisted", "whitelisted", "accepted", and "blocked". +*/ +function createList(data, group) { + var { url } = data; + let entries = data[group]; + let container = document.getElementById(group); + let heading = container.querySelector("h2"); + var list = container.querySelector("ul"); + list.classList.toggle(group, true); + if (Array.isArray(entries) && entries.length) { + heading.innerHTML = `<span class="type-name">${group}</span> scripts in ${url}:`; + container.classList.remove("empty"); + } else { + // default message + list.innerHTML = `<li>No <span class="type-name">${group}</span> scripts on this page.</li>` + entries = data[group] = []; + container.classList.add("empty"); + } + // generate list + let viewSourceToHuman = /^view-source:(.*)#line(\d+)\(([^)]*)\)[^]*/; + for (let entry of entries) { + let [scriptId, reason] = entry; + let li = liTemplate.cloneNode(true); + let a = li.querySelector("a"); + a.href = scriptId.split("(")[0]; + if (scriptId.startsWith("view-source:")) { + a.target = "LibreJS-ViewSource"; + let source = scriptId.match(/\n([^]*)/); + if (source) { + li.querySelector(".source").textContent = source[1]; + li.querySelector(".toggle-source").style.display = "inline"; + } + scriptId = scriptId.replace(viewSourceToHuman, "$3 at line $2 of $1"); + } + a.textContent = scriptId; + li.querySelector(".reason").textContent = reason; + let bySite = !!reason.match(/https?:\/\/[^/]+\/\*/); + li.classList.toggle("by-site", bySite); + if (bySite) { + let domain = li.querySelector(".forget .domain"); + if (domain) domain.textContent = RegExp.lastMatch; + } + li._scriptEntry = entry; + list.appendChild(li); + } + +} + +/** +* Updates scripts lists and buttons to act on them. +* If return_HTML is true, it returns the HTML of the popup window without updating it. +* example report argument: +* { +* "accepted": [["FILENAME 1","REASON 1"],["FILENAME 2","REASON 2"]], +* "blocked": [["FILENAME 1","REASON 1"],["FILENAME 2","REASON 2"]], +* "whitelisted": [["FILENAME 1","REASON 1"],["FILENAME 2","REASON 2"]], +* "blacklisted": [["FILENAME 1","REASON 1"],["FILENAME 2","REASON 2"]], +* "unknown": [["FILENAME 1","REASON 1"],["FILENAME 2","REASON 2"]], +* "url":"example.com" +* }; +* +*/ +function refreshUI(report) { + currentReport = report; + let { siteStatus, listedSite } = report; + document.querySelector("#site").className = siteStatus || ""; + document.querySelector("#site h2").textContent = + `This site ${report.site}`; + + for (let toBeErased of document.querySelectorAll("#info h2:not(.site) > *, #info ul > *")) { + toBeErased.remove(); + } + + let scriptsCount = 0; + for (let group of ["unknown", "accepted", "whitelisted", "blocked", "blacklisted"]) { + if (group in report) createList(report, group); + scriptsCount += report[group].length; + } + + for (let b of document.querySelectorAll(`.forget, .whitelist, .blacklist`)) { + b.disabled = false; + } + for (let b of document.querySelectorAll( + `.unknown .forget, .accepted .forget, .blocked .forget, + .whitelisted .whitelist, .blacklisted .blacklist` + )) { + b.disabled = true; + } + + if (siteStatus && siteStatus !== "unknown") { + let siteContainer = document.querySelector("#site"); + let statusLabel = siteStatus; + if (listedSite && listedSite !== report.site) { + statusLabel += ` via ${listedSite}`; + siteContainer.querySelector(".forget").disabled = true; + } + let status = siteContainer.querySelector(".status"); + status.classList.add(siteStatus); + status.textContent = statusLabel; + } else { + document.querySelector("#site .status").textContent = ""; + } + + let noscript = scriptsCount === 0; + document.body.classList.toggle("empty", noscript); +} + +myPort.onMessage.addListener(m => { + if (m.show_info) { + refreshUI(m.show_info); + } +}); + +function print_local_storage() { + myPort.postMessage({ "printlocalstorage": true }); +} +function delete_local_storage() { + myPort.postMessage({ "deletelocalstorage": true }); +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/panel-styles.css b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/display_panel/content/panel-styles.css @@ -0,0 +1,182 @@ +/** + * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. + * * + * Copyright (C) 2011, 2012, 2014 Loic J. Duros + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +@import url("/html/common.css"); + +body { + max-width: 600px; + min-width: 500px; + -moz-user-select: text !important; +} +#header{ +display: block; +width: 100% +} + +h2 { + font-size: 1.4em; + font-weight:bold; + font-family:arial; + border-bottom:.2em solid #444; + padding-bottom:0; + margin:.8em 0 0 0; + line-height:140%; +} +code { + font-size: 1.2em; + margin:0; + padding:0; +} +ul { + margin:0; + padding:0; + list-style:none; +} +#info li { + padding: .3em; + border-bottom:.1em solid #CCC; + margin:0; + overflow: hidden; +} + +#info ul ul { + margin: .4em; + list-style:disc; +} +#info ul ul li { + padding: .5em; + border-bottom:0; +} +#info { + clear:both; +} + +#info .type-name { + text-transform: uppercase; + font-weight: bold; +} + +#info .accepted-js .type-name { + color: #080; +} + +#info .blocked-js .type-name { + color: #800; +} + +#info .unknown-js .type-name { + color: #008; +} + +#info .unknown-js .reason { + display: none; +} + +.by-site button.forget, button.forget[name="*"] { + display: none; +} + +.by-site button.forget[name="*"], #site .forget[name="*"] { + display: initial; +} + +.status { + margin: .2em; +} + +button.whitelist, .status.whitelisted { + color: #080; +} +button.blacklist, .status.blacklisted { + color: #800; +} +button.forget { + color: #008; +} + +button:disabled { + color: #888 !important; +} + +button.toggle-source { + color: #004; + width: 5em; + text-align:center; +} + +pre.source { + display: none; + background: white; + border: 1px solid #444; + padding: .5em; + overflow: auto; + max-height: 20em; + white-space: pre-wrap; +} + +button.hide { display: none } +.visible > button.show { display: none !important} +.visible > pre.source { display: block } +.visible > button.hide { display: initial } + +span.accepted, span.blocked { + color:#008e00; + font-size:145%; + font-variant:small-caps; + font-weight:bold; +} + +span.blocked { + color:#8e0000; +} + +.title-area { + width: 50%; + float:left !important; + text-align: center !important; +} + +.title-area #librejs-web-link { + font-size: 1.2em; +} + +#librejs-web-labels-pages>ul { + margin-top: .5em; + font-size: 1.2em; + list-style-type: disc; +} + + +.empty #site, .unknown-js.empty { + display: none; +} + +.tab #must-reload, .tab #buttons, +.empty #complain, .empty #report-tab, #autotest { + display: none; +} + +#buttons button { + width: 100%; + text-align: center; +} + +.mobile #report-tab { + display: none; +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/fastclick.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/fastclick.js @@ -0,0 +1,841 @@ +; (function() { + 'use strict'; + + /** + * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs. + * + * @codingstandard ftlabs-jsv2 + * @copyright The Financial Times Limited [All Rights Reserved] + * @license MIT License (see LICENSE.txt) + */ + + /*jslint browser:true, node:true*/ + /*global define, Event, Node*/ + + + /** + * Instantiate fast-clicking listeners on the specified layer. + * + * @constructor + * @param {Element} layer The layer to listen on + * @param {Object} [options={}] The options to override the defaults + */ + function FastClick(layer, options) { + var oldOnClick; + + options = options || {}; + + /** + * Whether a click is currently being tracked. + * + * @type boolean + */ + this.trackingClick = false; + + + /** + * Timestamp for when click tracking started. + * + * @type number + */ + this.trackingClickStart = 0; + + + /** + * The element being tracked for a click. + * + * @type EventTarget + */ + this.targetElement = null; + + + /** + * X-coordinate of touch start event. + * + * @type number + */ + this.touchStartX = 0; + + + /** + * Y-coordinate of touch start event. + * + * @type number + */ + this.touchStartY = 0; + + + /** + * ID of the last touch, retrieved from Touch.identifier. + * + * @type number + */ + this.lastTouchIdentifier = 0; + + + /** + * Touchmove boundary, beyond which a click will be cancelled. + * + * @type number + */ + this.touchBoundary = options.touchBoundary || 10; + + + /** + * The FastClick layer. + * + * @type Element + */ + this.layer = layer; + + /** + * The minimum time between tap(touchstart and touchend) events + * + * @type number + */ + this.tapDelay = options.tapDelay || 200; + + /** + * The maximum time for a tap + * + * @type number + */ + this.tapTimeout = options.tapTimeout || 700; + + if (FastClick.notNeeded(layer)) { + return; + } + + // Some old versions of Android don't have Function.prototype.bind + function bind(method, context) { + return function() { return method.apply(context, arguments); }; + } + + + var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel']; + var context = this; + for (var i = 0, l = methods.length; i < l; i++) { + context[methods[i]] = bind(context[methods[i]], context); + } + + // Set up event handlers as required + if (deviceIsAndroid) { + layer.addEventListener('mouseover', this.onMouse, true); + layer.addEventListener('mousedown', this.onMouse, true); + layer.addEventListener('mouseup', this.onMouse, true); + } + + layer.addEventListener('click', this.onClick, true); + layer.addEventListener('touchstart', this.onTouchStart, false); + layer.addEventListener('touchmove', this.onTouchMove, false); + layer.addEventListener('touchend', this.onTouchEnd, false); + layer.addEventListener('touchcancel', this.onTouchCancel, false); + + // Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) + // which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick + // layer when they are cancelled. + if (!Event.prototype.stopImmediatePropagation) { + layer.removeEventListener = function(type, callback, capture) { + var rmv = Node.prototype.removeEventListener; + if (type === 'click') { + rmv.call(layer, type, callback.hijacked || callback, capture); + } else { + rmv.call(layer, type, callback, capture); + } + }; + + layer.addEventListener = function(type, callback, capture) { + var adv = Node.prototype.addEventListener; + if (type === 'click') { + adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) { + if (!event.propagationStopped) { + callback(event); + } + }), capture); + } else { + adv.call(layer, type, callback, capture); + } + }; + } + + // If a handler is already declared in the element's onclick attribute, it will be fired before + // FastClick's onClick handler. Fix this by pulling out the user-defined handler function and + // adding it as listener. + if (typeof layer.onclick === 'function') { + + // Android browser on at least 3.2 requires a new reference to the function in layer.onclick + // - the old one won't work if passed to addEventListener directly. + oldOnClick = layer.onclick; + layer.addEventListener('click', function(event) { + oldOnClick(event); + }, false); + layer.onclick = null; + } + } + + /** + * Windows Phone 8.1 fakes user agent string to look like Android and iPhone. + * + * @type boolean + */ + var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0; + + /** + * Android requires exceptions. + * + * @type boolean + */ + var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone; + + + /** + * iOS requires exceptions. + * + * @type boolean + */ + var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone; + + + /** + * iOS 4 requires an exception for select elements. + * + * @type boolean + */ + var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent); + + + /** + * iOS 6.0-7.* requires the target element to be manually derived + * + * @type boolean + */ + var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent); + + /** + * BlackBerry requires exceptions. + * + * @type boolean + */ + var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0; + + /** + * Determine whether a given element requires a native click. + * + * @param {EventTarget|Element} target Target DOM element + * @returns {boolean} Returns true if the element needs a native click + */ + FastClick.prototype.needsClick = function(target) { + switch (target.nodeName.toLowerCase()) { + + // Don't send a synthetic click to disabled inputs (issue #62) + case 'button': + case 'select': + case 'textarea': + if (target.disabled) { + return true; + } + + break; + case 'input': + + // File inputs need real clicks on iOS 6 due to a browser bug (issue #68) + if ((deviceIsIOS && target.type === 'file') || target.disabled) { + return true; + } + + break; + case 'label': + case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames + case 'video': + return true; + } + + return (/\bneedsclick\b/).test(target.className); + }; + + + /** + * Determine whether a given element requires a call to focus to simulate click into element. + * + * @param {EventTarget|Element} target Target DOM element + * @returns {boolean} Returns true if the element requires a call to focus to simulate native click. + */ + FastClick.prototype.needsFocus = function(target) { + switch (target.nodeName.toLowerCase()) { + case 'textarea': + return true; + case 'select': + return !deviceIsAndroid; + case 'input': + switch (target.type) { + case 'button': + case 'checkbox': + case 'file': + case 'image': + case 'radio': + case 'submit': + return false; + } + + // No point in attempting to focus disabled inputs + return !target.disabled && !target.readOnly; + default: + return (/\bneedsfocus\b/).test(target.className); + } + }; + + + /** + * Send a click event to the specified element. + * + * @param {EventTarget|Element} targetElement + * @param {Event} event + */ + FastClick.prototype.sendClick = function(targetElement, event) { + var clickEvent, touch; + + // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24) + if (document.activeElement && document.activeElement !== targetElement) { + document.activeElement.blur(); + } + + touch = event.changedTouches[0]; + + // Synthesise a click event, with an extra attribute so it can be tracked + clickEvent = document.createEvent('MouseEvents'); + clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); + clickEvent.forwardedTouchEvent = true; + targetElement.dispatchEvent(clickEvent); + }; + + FastClick.prototype.determineEventType = function(targetElement) { + + //Issue #159: Android Chrome Select Box does not open with a synthetic click event + if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') { + return 'mousedown'; + } + + return 'click'; + }; + + + /** + * @param {EventTarget|Element} targetElement + */ + FastClick.prototype.focus = function(targetElement) { + var length; + + // Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724. + if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month' && targetElement.type !== 'email') { + length = targetElement.value.length; + targetElement.setSelectionRange(length, length); + } else { + targetElement.focus(); + } + }; + + + /** + * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it. + * + * @param {EventTarget|Element} targetElement + */ + FastClick.prototype.updateScrollParent = function(targetElement) { + var scrollParent, parentElement; + + scrollParent = targetElement.fastClickScrollParent; + + // Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the + // target element was moved to another parent. + if (!scrollParent || !scrollParent.contains(targetElement)) { + parentElement = targetElement; + do { + if (parentElement.scrollHeight > parentElement.offsetHeight) { + scrollParent = parentElement; + targetElement.fastClickScrollParent = parentElement; + break; + } + + parentElement = parentElement.parentElement; + } while (parentElement); + } + + // Always update the scroll top tracker if possible. + if (scrollParent) { + scrollParent.fastClickLastScrollTop = scrollParent.scrollTop; + } + }; + + + /** + * @param {EventTarget} targetElement + * @returns {Element|EventTarget} + */ + FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) { + + // On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node. + if (eventTarget.nodeType === Node.TEXT_NODE) { + return eventTarget.parentNode; + } + + return eventTarget; + }; + + + /** + * On touch start, record the position and scroll offset. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchStart = function(event) { + var targetElement, touch, selection; + + // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111). + if (event.targetTouches.length > 1) { + return true; + } + + targetElement = this.getTargetElementFromEventTarget(event.target); + touch = event.targetTouches[0]; + + if (deviceIsIOS) { + + // Only trusted events will deselect text on iOS (issue #49) + selection = window.getSelection(); + if (selection.rangeCount && !selection.isCollapsed) { + return true; + } + + if (!deviceIsIOS4) { + + // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23): + // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched + // with the same identifier as the touch event that previously triggered the click that triggered the alert. + // Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an + // immediately preceeding touch event (issue #52), so this fix is unavailable on that platform. + // Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string, + // which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long, + // random integers, it's safe to to continue if the identifier is 0 here. + if (touch.identifier && touch.identifier === this.lastTouchIdentifier) { + event.preventDefault(); + return false; + } + + this.lastTouchIdentifier = touch.identifier; + + // If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and: + // 1) the user does a fling scroll on the scrollable layer + // 2) the user stops the fling scroll with another tap + // then the event.target of the last 'touchend' event will be the element that was under the user's finger + // when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check + // is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42). + this.updateScrollParent(targetElement); + } + } + + this.trackingClick = true; + this.trackingClickStart = event.timeStamp; + this.targetElement = targetElement; + + this.touchStartX = touch.pageX; + this.touchStartY = touch.pageY; + + // Prevent phantom clicks on fast double-tap (issue #36) + if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { + event.preventDefault(); + } + + return true; + }; + + + /** + * Based on a touchmove event object, check whether the touch has moved past a boundary since it started. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.touchHasMoved = function(event) { + var touch = event.changedTouches[0], boundary = this.touchBoundary; + + if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) { + return true; + } + + return false; + }; + + + /** + * Update the last position. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchMove = function(event) { + if (!this.trackingClick) { + return true; + } + + // If the touch has moved, cancel the click tracking + if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) { + this.trackingClick = false; + this.targetElement = null; + } + + return true; + }; + + + /** + * Attempt to find the labelled control for the given label element. + * + * @param {EventTarget|HTMLLabelElement} labelElement + * @returns {Element|null} + */ + FastClick.prototype.findControl = function(labelElement) { + + // Fast path for newer browsers supporting the HTML5 control attribute + if (labelElement.control !== undefined) { + return labelElement.control; + } + + // All browsers under test that support touch events also support the HTML5 htmlFor attribute + if (labelElement.htmlFor) { + return document.getElementById(labelElement.htmlFor); + } + + // If no for attribute exists, attempt to retrieve the first labellable descendant element + // the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label + return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea'); + }; + + + /** + * On touch end, determine whether to send a click event at once. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchEnd = function(event) { + var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement; + + if (!this.trackingClick) { + return true; + } + + // Prevent phantom clicks on fast double-tap (issue #36) + if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { + this.cancelNextClick = true; + return true; + } + + if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) { + return true; + } + + // Reset to prevent wrong click cancel on input (issue #156). + this.cancelNextClick = false; + + this.lastClickTime = event.timeStamp; + + trackingClickStart = this.trackingClickStart; + this.trackingClick = false; + this.trackingClickStart = 0; + + // On some iOS devices, the targetElement supplied with the event is invalid if the layer + // is performing a transition or scroll, and has to be re-detected manually. Note that + // for this to function correctly, it must be called *after* the event target is checked! + // See issue #57; also filed as rdar://13048589 . + if (deviceIsIOSWithBadTarget) { + touch = event.changedTouches[0]; + + // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null + targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement; + targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent; + } + + targetTagName = targetElement.tagName.toLowerCase(); + if (targetTagName === 'label') { + forElement = this.findControl(targetElement); + if (forElement) { + this.focus(targetElement); + if (deviceIsAndroid) { + return false; + } + + targetElement = forElement; + } + } else if (this.needsFocus(targetElement)) { + + // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through. + // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37). + if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) { + this.targetElement = null; + return false; + } + + this.focus(targetElement); + this.sendClick(targetElement, event); + + // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open. + // Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others) + if (!deviceIsIOS || targetTagName !== 'select') { + this.targetElement = null; + event.preventDefault(); + } + + return false; + } + + if (deviceIsIOS && !deviceIsIOS4) { + + // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled + // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42). + scrollParent = targetElement.fastClickScrollParent; + if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) { + return true; + } + } + + // Prevent the actual click from going though - unless the target node is marked as requiring + // real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted. + if (!this.needsClick(targetElement)) { + event.preventDefault(); + this.sendClick(targetElement, event); + } + + return false; + }; + + + /** + * On touch cancel, stop tracking the click. + * + * @returns {void} + */ + FastClick.prototype.onTouchCancel = function() { + this.trackingClick = false; + this.targetElement = null; + }; + + + /** + * Determine mouse events which should be permitted. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onMouse = function(event) { + + // If a target element was never set (because a touch event was never fired) allow the event + if (!this.targetElement) { + return true; + } + + if (event.forwardedTouchEvent) { + return true; + } + + // Programmatically generated events targeting a specific element should be permitted + if (!event.cancelable) { + return true; + } + + // Derive and check the target element to see whether the mouse event needs to be permitted; + // unless explicitly enabled, prevent non-touch click events from triggering actions, + // to prevent ghost/doubleclicks. + if (!this.needsClick(this.targetElement) || this.cancelNextClick) { + + // Prevent any user-added listeners declared on FastClick element from being fired. + if (event.stopImmediatePropagation) { + event.stopImmediatePropagation(); + } else { + + // Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) + event.propagationStopped = true; + } + + // Cancel the event + event.stopPropagation(); + event.preventDefault(); + + return false; + } + + // If the mouse event is permitted, return true for the action to go through. + return true; + }; + + + /** + * On actual clicks, determine whether this is a touch-generated click, a click action occurring + * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or + * an actual click which should be permitted. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onClick = function(event) { + var permitted; + + // It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early. + if (this.trackingClick) { + this.targetElement = null; + this.trackingClick = false; + return true; + } + + // Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target. + if (event.target.type === 'submit' && event.detail === 0) { + return true; + } + + permitted = this.onMouse(event); + + // Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through. + if (!permitted) { + this.targetElement = null; + } + + // If clicks are permitted, return true for the action to go through. + return permitted; + }; + + + /** + * Remove all FastClick's event listeners. + * + * @returns {void} + */ + FastClick.prototype.destroy = function() { + var layer = this.layer; + + if (deviceIsAndroid) { + layer.removeEventListener('mouseover', this.onMouse, true); + layer.removeEventListener('mousedown', this.onMouse, true); + layer.removeEventListener('mouseup', this.onMouse, true); + } + + layer.removeEventListener('click', this.onClick, true); + layer.removeEventListener('touchstart', this.onTouchStart, false); + layer.removeEventListener('touchmove', this.onTouchMove, false); + layer.removeEventListener('touchend', this.onTouchEnd, false); + layer.removeEventListener('touchcancel', this.onTouchCancel, false); + }; + + + /** + * Check whether FastClick is needed. + * + * @param {Element} layer The layer to listen on + */ + FastClick.notNeeded = function(layer) { + var metaViewport; + var chromeVersion; + var blackberryVersion; + var firefoxVersion; + + // Devices that don't support touch don't need FastClick + if (typeof window.ontouchstart === 'undefined') { + return true; + } + + // Chrome version - zero for other browsers + chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [, 0])[1]; + + if (chromeVersion) { + + if (deviceIsAndroid) { + metaViewport = document.querySelector('meta[name=viewport]'); + + if (metaViewport) { + // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89) + if (metaViewport.content.indexOf('user-scalable=no') !== -1) { + return true; + } + // Chrome 32 and above with width=device-width or less don't need FastClick + if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) { + return true; + } + } + + // Chrome desktop doesn't need FastClick (issue #15) + } else { + return true; + } + } + + if (deviceIsBlackBerry10) { + blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/); + + // BlackBerry 10.3+ does not require Fastclick library. + // https://github.com/ftlabs/fastclick/issues/251 + if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) { + metaViewport = document.querySelector('meta[name=viewport]'); + + if (metaViewport) { + // user-scalable=no eliminates click delay. + if (metaViewport.content.indexOf('user-scalable=no') !== -1) { + return true; + } + // width=device-width (or less than device-width) eliminates click delay. + if (document.documentElement.scrollWidth <= window.outerWidth) { + return true; + } + } + } + } + + // IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97) + if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') { + return true; + } + + // Firefox version - zero for other browsers + firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [, 0])[1]; + + if (firefoxVersion >= 27) { + // Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896 + + metaViewport = document.querySelector('meta[name=viewport]'); + if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) { + return true; + } + } + + // IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version + // http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx + if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') { + return true; + } + + return false; + }; + + + /** + * Factory method for creating a FastClick object + * + * @param {Element} layer The layer to listen on + * @param {Object} [options={}] The options to override the defaults + */ + FastClick.attach = function(layer, options) { + return new FastClick(layer, options); + }; + + + if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { + + // AMD. Register as an anonymous module. + define(function() { + return FastClick; + }); + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = FastClick.attach; + module.exports.FastClick = FastClick; + } else { + window.FastClick = FastClick; + } +}()); diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/fastclick.js.LICENSE.txt b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/fastclick.js.LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2014 The Financial Times Ltd. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/librejs-title.png b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/librejs-title.png Binary files differ. diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/mobile.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/mobile.js @@ -0,0 +1,8 @@ +window.isMobile = !("windows" in browser); +if (isMobile) { + document.documentElement.classList.add("mobile"); + let s = document.createElement("script"); + s.src = "/html/fastclick.js"; + document.head.appendChild(s); + window.addEventListener("load", e => FastClick.attach(document.body)); +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/pref.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/pref.js @@ -0,0 +1,315 @@ +/** +* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. +* +* Copyright (C) 2017 Nathan Nichols +* Copyright (C) 2018 Giorgio maone +* Copyright (C) 2022 Yuchen Pei +* +* This file is part of GNU LibreJS. +* +* GNU LibreJS is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GNU LibreJS is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. +*/ + +(() => { + "use strict"; + + const LIST_NAMES = ["white", "black"]; + + const Model = { + lists: {}, + prefs: null, + + malformedUrl(url) { + try { + const objUrl = new URL(url); + const newUrl = objUrl.href; + if (!objUrl.protocol.startsWith("http")) { + return "Please enter http:// or https:// URLs only"; + } else if (!/^[^*]+\*?$/.test(newUrl)) { + return "Only one single trailing path wildcard (/*) allowed"; + } + } catch (e) { + if (/^https?:\/\/\*\./.test(url)) { + return this.malformedUrl(url.replace("*.", "")); + } + const prefix = "Invalid URL"; + if (url && !url.includes("://")) + return prefix + ": missing protocol, either http:// or https://"; + else if (url.endsWith("://")) + return prefix + ": missing domain name"; + else + return prefix; + } + return null; + }, + + async save(prefs = this.prefs) { + if (prefs !== this.prefs) { + this.prefs = Object.assign(this.prefs, prefs); + } + this.saving = true; + try { + return await browser.storage.local.set(prefs); + } finally { + this.saving = false; + } + }, + + async addToList(list, ...items) { + const other = list === Model.lists.black ? Model.lists.white : Model.lists.black; + this.saving = true; + try { + await Promise.all([ + other.remove(...items), + list.store(...items) + ]); + } finally { + this.saving = false; + } + } + }; + + Model.loading = (async () => { + const prefsNames = [ + "whitelist", + "blacklist", + "subject", + "body" + ]; + Model.prefs = await browser.storage.local.get(prefsNames.map(name => `pref_${name}`)); + + for (const listName of LIST_NAMES) { + const prefName = `pref_${listName}list`; + await (Model.lists[listName] = new ListStore(prefName, Storage.CSV)) + .load(Model.prefs[prefName]); + } + })(); + + const Controller = { + init() { + const widgetsRoot = this.root = document.getElementById("widgets"); + for (const widget of widgetsRoot.querySelectorAll('[id^="pref_"]')) { + if (widget.id in Model.lists) { + populateListUI(widget); + } else if (widget.id in Model.prefs) { + widget.value = Model.prefs[widget.id]; + } + } + + this.populateListUI(); + this.syncAll(); + + for (const ev in Listeners) { + widgetsRoot.addEventListener(ev, Listeners[ev]); + } + document.getElementById("site").onfocus = e => { + if (!e.target.value.trim()) { + e.target.value = "https://"; + } + }; + + browser.storage.onChanged.addListener(changes => { + if (!Model.saving && + ("pref_whitelist" in changes || "pref_blacklist" in changes)) { + setTimeout(() => { + this.populateListUI(); + this.syncAll(); + }, 10); + } + }); + }, + + async addSite(list) { + const url = document.getElementById("site").value.trim(); + + if (url && !Model.malformedUrl(url)) { + await this.addToList(list, url); + } + }, + async addToList(list, ...items) { + await Model.addToList(list, ...items); + this.populateListUI(); + this.syncAll(); + }, + async swapSelection(list) { + const origin = list === Model.lists.black ? "white" : "black"; + await this.addToList(list, ...Array.prototype.map.call( + document.querySelectorAll(`select#${origin} option:checked`), + option => option.value) + ); + }, + + syncAll() { + this.syncListsUI(); + this.syncSiteUI(); + }, + + syncSiteUI() { + const widget = document.getElementById("site"); + const list2button = listName => document.getElementById(`cmd-${listName}list-site`); + + for (const bi of LIST_NAMES.map(list2button)) { + bi.disabled = true; + } + + const url = widget.value.trim(); + const malformedUrl = url && Model.malformedUrl(url); + widget.classList.toggle("error", !!malformedUrl); + document.getElementById("site-error").textContent = malformedUrl || ""; + if (!url) return; + if (url !== widget.value) { + widget.value = url; + } + + for (const listName of LIST_NAMES) { + const list = Model.lists[listName]; + if (!list.contains(url)) { + list2button(listName).disabled = false; + } + } + }, + + syncListsUI() { + const total = ["black", "white"].reduce((cum, id) => { + const selected = document.querySelectorAll(`select#${id} option:checked`).length; + const other = id === "black" ? "white" : "black"; + document.getElementById(`cmd-${other}list`).disabled = selected === 0; + return cum + selected; + }, 0); + document.getElementById("cmd-delete").disabled = total === 0; + }, + + async deleteSelection() { + for (const id of ["black", "white"]) { + const selection = document.querySelectorAll(`select#${id} option:checked`); + await Model.lists[id].remove(...Array.prototype.map.call(selection, option => option.value)); + } + this.populateListUI(); + this.syncAll(); + }, + + populateListUI(widget) { + if (!widget) { + for (const id of ["white", "black"]) { + this.populateListUI(document.getElementById(id)); + } + return; + } + widget.innerHTML = ""; + const items = [...Model.lists[widget.id].items].sort(); + const options = new DocumentFragment(); + for (const item of items) { + const option = document.createElement("option"); + option.value = option.textContent = option.title = item; + options.appendChild(option); + } + widget.appendChild(options); + } + }; + + const KeyEvents = { + Delete(e) { + if (e.target.matches("#lists select")) { + Controller.deleteSelection(); + } + }, + Enter(e) { + if (e.target.id === "site") { + e.target.parentElement.querySelector("button[default]").click(); + } + }, + KeyA(e) { + if (e.target.matches("select") && e.ctrlKey) { + for (const o of e.target.options) { + o.selected = true; + } + Controller.syncListsUI(); + } + } + } + + const Listeners = { + async change(e) { + const { target } = e; + const { id } = target; + + if (id in Model.lists) { + Controller.syncListsUI(); + const selection = target.querySelectorAll("option:checked"); + if (selection.length === 1) { + document.getElementById("site").value = selection[0].value; + } + return; + } + }, + + click(e) { + const { target } = e; + + const match = /^cmd-(white|black|delete)(list-site)?/.exec(target.id); + if (!match) return; + e.preventDefault(); + const cmd = match[1]; + if (cmd === "delete") { + Controller.deleteSelection(); + return; + } + const list = Model.lists[cmd]; + if (list) { + Controller[match[2] ? "addSite" : "swapSelection"](list); + return; + } + }, + + keypress(e) { + const { code } = e; + if (code && typeof KeyEvents[code] === "function") { + if (KeyEvents[code](e) === false) { + e.preventDefault(); + } + return; + } + }, + + async input(e) { + const { target } = e; + const { id } = target; + if (!id) return; + + if (id === "site") { + Controller.syncSiteUI(); + const url = target.value; + if (url) { + const o = document.querySelector(`#lists select option[value="${url}"]`); + if (o) { + o.scrollIntoView(); + o.selected = true; + } + } + return; + } + + if (id.startsWith("pref_")) { + await Model.save({ [id]: target.value }); + return; + } + } + }; + + window.addEventListener("DOMContentLoaded", async _ => { + await Model.loading; + Controller.init(); + }); + +})(); diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/preferences_panel.html b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/preferences_panel.html @@ -0,0 +1,81 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"/> +<!-- /** + * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. + * * + * Copyright (C) 2011, 2012, 2014 Loic J. Duros + * Copyright (C) 2014, 2015 Nik Nyby + * Copyright (C) 2018 Giorgio Maone + * + * This file is part of GNU LibreJS. + * + * GNU LibreJS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNU LibreJS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>. + */ +--> + <title> + LibreJS preferences + </title> + <link rel="stylesheet" type="text/css" href="./prefs.css"/> + <script src="/html/mobile.js"></script> + <script type="text/javascript" src="/common/Storage.js"></script> + <script type="text/javascript" src="pref.js"></script> + </head> + + <body> + <div class="libre"> + <a class="libre" + id="ljs-settings" + href="https://www.gnu.org/software/librejs/" + title="LibreJS Settings"> + <h1 class="libre">LibreJS</h1> + </a> + <h3>Settings</h3> + </div> + <div id="widgets"> + <fieldset id="section-lists"><legend>Allow or block scripts matching the following URLs ("*."" matches any subdomain, "/*" matches any path)</legend> + <label>Type a new whitelist / blacklist entry:</label> + <div id="new-site"> + <input type="text" id="site" value="" placeholder="https://*.gnu.org/*"> + <button id="cmd-whitelist-site" class="white" title="Whitelist this site" default>Whitelist</button> + <button id="cmd-blacklist-site" class="red" title="Blacklist this site">Blacklist</button> + </div> + <div id="site-error" class="error-msg"></div> + <div id="lists"> + <div class="white list-container"> + <label>Whitelist (always allow)</label> + <select id="white" multiple size="10"></select> + </div> + <div id="commands"> + <button id="cmd-delete" title="Delete">x</button> + <button id="cmd-blacklist" title="Move to blacklist">&raquo;</button> + <button id="cmd-whitelist" title="Move to whitelist">&laquo;</button> + </div> + <div class="black list-container"> + <label>Blacklist (always block)</label> + <select id="black" multiple size="10"></select> + </div> + </div> + </fieldset> + + <fieldset id="section-complaint"><legend>Complaint email defaults</legend> + <label for="pref_subject">Subject</label> + <input id="pref_subject" type="text"/> + <label for="pref_body">Body</label> + <textarea id="pref_body" rows="5"></textarea> + </fieldset> + </div> + </body> +</html> diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/prefs.css b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/html/preferences_panel/prefs.css @@ -0,0 +1,87 @@ +@import url("chrome://browser/content/extension.css"); +@import url("/html/common.css"); +h3 { + position: absolute; + bottom: 0px; + left: 240px; + font-size: 18px; +} +textarea { + width: 100%; +} +fieldset { + border: none; + padding: 0; + margin-top: 1em; + border-top: 1px solid #ccc; +} +legend { + font-weight: bold; + margin: 0; + padding: 0; +} +label, legend { + display: block; + font-size: 1.2em; +} + +#lists { + display: flex; + flex-direction: row; +} +.list-container { + flex: 3; + flex-direction: row; +} +.list-container select { +width: 100% +} + +.black { + color: #600; +} +.white { + color: #060; +} + +#commands { + display: flex; + justify-content: center; + flex: none; + flex-flow: column nowrap; +} + +#commands button { + font-weight: bold; +} +input[type="text"] { + width: 100%; +} + +#lists label { + font-weight: bold; +} +#lists select { + color: black; +} +#black { + background-color: #fcc; +} +#white { + background-color: #cfc; +} + +#new-site { + display: flex; + flex: 2; +} +.error-msg { + color: red; +} +.error-msg::after { + content: "\00A0"; +} +.error { + background: #ffe; + color: #800; +} diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/icons/librejs.png b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/icons/librejs.png Binary files differ. diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/manifest.json b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/manifest.json @@ -0,0 +1,61 @@ +{ + "manifest_version": 2, + "name": "GNU LibreJS", + "short_name": "LibreJS", + "version": "7.21.1", + "author": "various", + "description": "Only allows free and/or trivial Javascript to run.", + "applications": { + "gecko": { + "id": "jid1-KtlZuoiikVfFew@jetpack", + "strict_min_version": "60.0" + } + }, + "icons": { + "64": "icons/librejs.png" + }, + "permissions": [ + "contextMenus", + "webRequest", + "webRequestBlocking", + "activeTab", + "notifications", + "sessions", + "storage", + "tabs", + "<all_urls>" + ], + "browser_action": { + "browser_style": true, + "default_icon": { + "64": "icons/librejs.png" + }, + "default_title": "LibreJS", + "default_popup": "html/display_panel/content/display-panel.html" + }, + "options_ui": { + "page": "html/preferences_panel/preferences_panel.html", + "open_in_tab": true + }, + "web_accessible_resources": [ + "html/report_page/report.html" + ], + "background": { + "scripts": [ + "bundle.js" + ] + }, + "content_scripts": [ + { + "run_at": "document_start", + "matches": [ + "<all_urls>" + ], + "match_about_blank": true, + "all_frames": true, + "js": [ + "content/externalLicenseChecker.js" + ] + } + ] +} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/META-INF/cose.manifest b/data/extensions/sponsorBlocker@ajay.app/META-INF/cose.manifest @@ -0,0 +1,717 @@ +Manifest-Version: 1.0 + +Name: manifest.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: A2A5fhmpHmSpbQZwQdiKJaQLuJA= +SHA256-Digest: xRZ/fCx9EVFpeU8x+jh0m/OLBtTJ4Zc2vDfN4VK1Fbo= + +Name: popup.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +1cQ4qqN9cCB3pNPMdxKqGeywyw= +SHA256-Digest: 3GgB1y/RtNRlhbwXlXqZz3zIzDfEaaEwRLFecjn7fL8= + +Name: popup.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: OKbMt5EbcM35/3IGyFnpHaKJTC8= +SHA256-Digest: bbFP6WvQbFk8KP3ysZ6P+O0BoXrWFBXbdG3dCveT5/k= + +Name: shared.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 9MlHGOy2LUBoTe8W4aL755V+bio= +SHA256-Digest: S2oUOalRoZG2Xrx0bpnAgojIjNfupDIye3X2sRX4L3Q= + +Name: content.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: MFQwfSj4U1zhmdDCEcybQdmSuGw= +SHA256-Digest: NhFayuKMCXbNsMoHGzH7lTcSNX83/7OS0pFR+kksnDY= + +Name: res/countries.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8zH64XmehkULv051Rq4x4qyNgqY= +SHA256-Digest: tPFXXDdDgE3Zez6W/SVRcq6iOXK0544YTRIaeVa+dA0= + +Name: js/popup.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jdBJ0dr7Dku0UxWboixdOQwEiKo= +SHA256-Digest: 2+kkrPDhzEupohN2hu96xYHKowtKn+JfuVrU6MduQfA= + +Name: js/content.js.LICENSE.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1i3QZtyoli4K65vJtoAdq3mzUaM= +SHA256-Digest: e5p1o8nk5I59O2lYb59lVhS16o36RTqkziIaZ9X8TZA= + +Name: js/background.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4X+VkysJPYpN9HlMs8nbqPufkUQ= +SHA256-Digest: ytXdVokmXkY1mx9VUg2TN/8rybH8tgwJMnLmuvplSeg= + +Name: js/content.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: XoOrS/RwUuqv/qnsYmZ+skcXiss= +SHA256-Digest: C+5s3e3zGfNKWa6+Ib5vIcsQEqKrU2UYaYRsfxRARj8= + +Name: js/popup.js.LICENSE.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1i3QZtyoli4K65vJtoAdq3mzUaM= +SHA256-Digest: e5p1o8nk5I59O2lYb59lVhS16o36RTqkziIaZ9X8TZA= + +Name: js/options.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: CzhpMvyp/euzWO/89kQy0bOfp3I= +SHA256-Digest: C4fc+M9JWz/9UTG0VTJwH4uyAdxmMKbGZXqjTHNc1As= + +Name: js/help.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: cw/jYV7X6+gXHOhX9Lwl/l5Ek10= +SHA256-Digest: 1XV0KxWwRB3dWe8MU+2JRvJhlFeSGdt203xs9Dn1B/A= + +Name: js/options.js.LICENSE.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1i3QZtyoli4K65vJtoAdq3mzUaM= +SHA256-Digest: e5p1o8nk5I59O2lYb59lVhS16o36RTqkziIaZ9X8TZA= + +Name: js/document.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: WkA1qwCgKpxQpPUgjwgwzuHar7s= +SHA256-Digest: aFbLEgMoMoR24kq4cjnAu1g9IfFRJfWzN0f1v+sMdqs= + +Name: js/permissions.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: nq9xKXidT3o+t+fv8JgT/EWhBmk= +SHA256-Digest: zuZTv3mZ9WxHtfaXqYnji6PZDggMz9Khp/9WSS3TROc= + +Name: options/options.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: EEHoZeZHRolAocLPfOgC/pdjLjQ= +SHA256-Digest: wmdwgvZ3kHShK3E30M8s4Fa3COz3ZrHjQwUxQhmuHus= + +Name: options/options.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mBJnhzt1yM20Pa4i+pHVcSxHRRU= +SHA256-Digest: jwPG7RnduCaWwMGndwPJiC6kvCCjC4dEwBuqMro0cDc= + +Name: icons/import.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 9GzRVgylLSliV8MzZuXHQa5fso4= +SHA256-Digest: jq0yF1Kt0NLzcD5XB09L8w+pqPYyPISecvXPzM7mgZU= + +Name: icons/right-arrow.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: UvrdykE811S6bQE1xHEDYNqpz/Y= +SHA256-Digest: kKEsmxH7iDr3wDvSs4rM+ieYQGq3apcwR0zbeGUuqr4= + +Name: icons/PlayerStopIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1AK4LqdsUSKdXRLOKX4p8OxUyGE= +SHA256-Digest: zk4XLG++m8N+MKtACbm1g5Sj3K11ED2HIZJK9iE4yuE= + +Name: icons/visible.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fz+9bvc+xViBK8Ewg/MSEcpFw8Y= +SHA256-Digest: 9TMx0ZyVXUdyWG/nptkWmfUj6D+etgSdd4Kv6P5AB0M= + +Name: icons/LogoSponsorBlocker64px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: akzmiZuKt4Rqs/iatc68mb8oht0= +SHA256-Digest: 6aaoRlsn0geP+d24lpR0iBDJ77Dodyd7oo21IAAX4/w= + +Name: icons/report.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: yCxL8RadT5mghcOTeibSDGqQ48E= +SHA256-Digest: frQBGM5oHqmWpa6udttE8B79/jjcmuVR8zfG5kvc+pw= + +Name: icons/thumb.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +3D8kQKc9e0TOfjjd4sKwXCUeA4= +SHA256-Digest: j+BVJR9BC0gHvX+N+cL+zLCNQDL0EfhhdcO/dUgWjfc= + +Name: icons/LogoSponsorBlocker1024px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: pKsc5tjgl/kao7NS9rP6AMnIswk= +SHA256-Digest: sPlDnCjHt6aLBT8c7wVXJzcXtX0U5ovZzaJUbQSaE4Q= + +Name: icons/SafariIconSponsorBlocker32px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: BjzN3RW/qpA3hzBbWom+IEew0tg= +SHA256-Digest: eh0/WOnqB5kUngUDSWeYWwQ4emjJ1rJC1ipm5VwSVws= + +Name: icons/SafariIconSponsorBlocker128px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: UmKZTu5tqbc8WlxfZBskCMscWzw= +SHA256-Digest: 1WDejXRSQ19DKGLCiFK++Zr1Xo8xhXYMTDfQJzqPHpc= + +Name: icons/PlayerDeleteIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s1aVbZ0Y8m4BOkT2+LZAvLYzUQA= +SHA256-Digest: 2RLSoHHVDz1KuFsW1o2rfaWi7Vu+rYQq09zRWH51J7I= + +Name: icons/check.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q4pbxIkM/I+Jalo5QGk/cNW+wUU= +SHA256-Digest: 941NgHZng6vl5O8QOE8IUZ+sf1qqEgmsqN6+UoFaGkQ= + +Name: icons/IconSponsorBlocker256px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: F6XiN4yPnbCe76UvfqkQlPyUfTU= +SHA256-Digest: o89CNvZvM7cTX8M9YCgHLA0tJtIx4XgBUhaLyX9O/8M= + +Name: icons/thumbs_up.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: D8h+K6aT5sr3rH/vKDmyYjFlnTg= +SHA256-Digest: Bgive5ZoNiIaFBh2iSynNlSydpIJ9nroygf0FmqFwMY= + +Name: icons/PlayerUploadFailedIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bXub0bviBYsKv3VCGEP/BNyBWxA= +SHA256-Digest: IImdAjC6SN3c5ZBtGLBp3pBWh4qefdXfRGu09RnjPW0= + +Name: icons/PlayerCancelSegmentIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: tmAft2yKf7GAKPa9LNd5RBr3MU8= +SHA256-Digest: JmWrXkNM1PzTPaKA1WuM3a+ZwGZf74KJ5NYy1k7mnOM= + +Name: icons/looped.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JQynFqoXs8c4+/quCf4FJa1lGQY= +SHA256-Digest: uGaAmz75vhXziMxfIoKBwvb2HWAF6hCCO2T3uV/BQms= + +Name: icons/sort.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: q6c1nAfvyecxPpwdI5OMHW+BhWs= +SHA256-Digest: kPyAIsUa2OzfDLyuTdJOm28mdqXIItCVAqHx3/ps/50= + +Name: icons/downvote.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wikHSywfPJDRZOW4NZpesz617t4= +SHA256-Digest: IZtKg+7y7eeqcRdR6l3cMQEh/JIvpwUAG+VakA/D1c4= + +Name: icons/segway.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: /HYkgfcb2bztO2lAleqGK1T6Mg8= +SHA256-Digest: CYqHxn6XdDjcyQSxzUnFMYHKMYLa7Ljj69s6OQXIvuA= + +Name: icons/PlayerStartIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +CgCG/k+0+wyZ6ckPO+cQrzcQiQ= +SHA256-Digest: CcgYi9mMFq1Hsow0UlKY6fCArwLNvmvFHZr6Em5s5f8= + +Name: icons/skip.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s1uWs87Cz5CggyMUBx4+O5wvlxo= +SHA256-Digest: 1orCjKiLarqIFqmtMxAaosl6Lg8YvYETVIiBaae+xh0= + +Name: icons/upvote.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RBT37o65JabAUlffpGCAILQGxFE= +SHA256-Digest: qcsI7YrSzOUfRh+5SFxq3OvTOktdpxnYFiVuFp6qUIs= + +Name: icons/campaign.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: LiQUsv7YkpTpYOo9xcJKgKxO1tg= +SHA256-Digest: mhIsUOx5+eJ294dQ0Yb9upc+jFkQzI/rxagwxYoQubY= + +Name: icons/export.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 5cMeOFGzDSw7FkN03HHPMPOBXBs= +SHA256-Digest: txs64+22KNqOWj0yB9hbeIEzTZJUdTCO4Cbl8d+/J6k= + +Name: icons/bolt.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4UMr2mF3iV+yZo646McqOAsVZoA= +SHA256-Digest: kcTQzDpzuXgETfss+/i1QCyGUSqNUc/t3w/6EQ/5GbA= + +Name: icons/help.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PA/ASdDQzZACR47ZfnVEBQBDESs= +SHA256-Digest: 6yFfKtLioSQ1BNg8IFd+RiehBPjMdC6v9BPqYI1XUqM= + +Name: icons/thumbs_down.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: zU8Z61Z0pgVQWcEzPZQ2E/LXR54= +SHA256-Digest: WYZ3UbbaSjynTWT1s9wWqu3ST7nEoXsf4mVc7WvtTgA= + +Name: icons/PlayerUploadIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Fc0/SSP8sPKWct2uZkOdanjZ/RA= +SHA256-Digest: s01ziZKZHbDGGQcjdzO21l1qAhfZ1WUYsTwHCtoj+fc= + +Name: icons/lightbulb.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: qGxW0gZeyADyBEgOrP0A4FqDtFE= +SHA256-Digest: VeuyRrfw3EpJV4RxvgxUigwL5i6UDtpG2MSbsilSZs4= + +Name: icons/check-smaller.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s1VOkXQmFFbkAfte+S88L/b3WRU= +SHA256-Digest: GfF4qDN9QIc8VVvR7d2kSgSl1lOlrFE9am4wvOJq6uc= + +Name: icons/money.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: iM91/00VLCUKAkoYLFHQ7MPT8wA= +SHA256-Digest: gxG1YGrpD8ue6/qH9/3dNq/vfWfh2gPXP9mAXFxx5vg= + +Name: icons/IconSponsorBlocker1024px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: p7216WsRJnFbZza9H1OZ9urPe1w= +SHA256-Digest: 4+6cekvlNNjZ+Mfq1Ng6s7HjhivN9SE7g+htukftqvU= + +Name: icons/stop.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8tLzUF3DP09YLhy/VHx6wnVtSu4= +SHA256-Digest: E3ABQyR4pufSzJsjotypdQivKmqR/OIiHr8EcxFQuIA= + +Name: icons/dearrow.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TZnOYO5dp8KW/MlQHJWk8CyTFCc= +SHA256-Digest: CZHzebAi3Riel8Gd88cJSS/04jLWYgR7uBsl0Mf5Gz0= + +Name: icons/close-smaller.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: uj3nBNfwx7Eqz7WE3m+DOylKyPk= +SHA256-Digest: EeMbOYOAAn/I1MENT8ScrnEVTuCzPLzD85uNKWUBsq8= + +Name: icons/heart.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: pGpCCalVMSVUoM3wH/FC93uhZfs= +SHA256-Digest: FOPBx0KgobRkt/k7EWUPPQWbqC8RmUPL0xUNmaujEBw= + +Name: icons/newprofilepic.jpg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Wan5R2ZRaNOg1SA9X1IhbnWrOd8= +SHA256-Digest: ZC8lhyC1gs+RAB4dtINIZNhIEktLmAkK06lBtBiuoQY= + +Name: icons/LogoSponsorBlocker256px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 9/pu87OXgOTPjhTaG2aauJPuBsc= +SHA256-Digest: JU21bhXMTzaK9IBcn6llgB2LQMVXW3kdottF03TsVsA= + +Name: icons/IconSponsorBlocker64px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 2pOOi3yrihb2evL9M3h75ZmLhN8= +SHA256-Digest: sZWqDykvjNKf5IFOMFq3pMTkd4NT7VjVL9Hb9sRphRg= + +Name: icons/stopwatch.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: G+WxoVPtoKvoKb0OqgUPpADuzk4= +SHA256-Digest: ZVGZL2FzUiMTd/r+0QWTPqFUy/4E9FZIV0lZosR9jBw= + +Name: icons/settings.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Dm5ZVYazkXnCwImTkY9PqsKudjc= +SHA256-Digest: /Q7FLZvrcw96QOQdE+jNR8fP3Vlfn5leqo04nAmo570= + +Name: icons/pause.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HsFvL/2WasnkEUAss7I2JxQuMU4= +SHA256-Digest: AOHhXCiEJY5CYnpOVtGsj7dXO/YXW1WDesfDgnmys+4= + +Name: icons/not_visible.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8ybHfc/Xs7pMxxUuj0jculn936o= +SHA256-Digest: SFe7gbGj/SUA7tXGEig7sHLlIoNi7P1mdzh2FlHfbig= + +Name: icons/skipIcon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oH/Rp9YspEjQ+1gvQbgE+Mq9XuA= +SHA256-Digest: 6IJSMDviPeCr4YVvov1QxZjOiGHP7KM6v4FEhKYn3ug= + +Name: icons/SafariIconSponsorBlocker16px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: xIzZqrqh46lUdtakcUMXz0ELzPw= +SHA256-Digest: 3ab1+Ej6/vUtKdpudP8aJrrJ5OCywbkEkRDAIHbYTV8= + +Name: icons/beep.oga +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s1LyR+QutN0Rh0z2EJkRUIeztgM= +SHA256-Digest: MDohn+5j2SvoZUrte1ILWbKgstbKrVXZ/SWfGvOUEWQ= + +Name: icons/LogoSponsorBlocker128px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: j7GYdq9Q0WsY/Gm/QiZTN2sv6+U= +SHA256-Digest: s+mhRa13noiJ166+116Rx4IOab6oKaE3OGc8Pfaepkg= + +Name: icons/close.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HLNztOmiPLDuhv3mxRArCbZM/oI= +SHA256-Digest: 7ZD1GvJfy4aeOvUG0wTDHxPDIo+1hjJFS3bMPSxU9pI= + +Name: icons/upvote.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s2SxNZz4X/+B/69amyjypNryjGI= +SHA256-Digest: KvnS5yVjt30phEItIdywpFaWxXpzw7PuSRQLTN2N3qU= + +Name: icons/pencil.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: r8kIovMJPiXGjoHVlGTFoMzGZo8= +SHA256-Digest: iyNGIU6NqOjMxRucMTpuvtvfNiUwX4Jipq3Iut+fGLk= + +Name: icons/IconSponsorBlocker512px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fIJXKz+c2Pxad7WLijZwpErHy8A= +SHA256-Digest: 4psTDTGh3azunMeqEblZlrVXkG7UIVTEuu0TgxU18iA= + +Name: icons/thumbs_down_locked.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 6Xh96iGYZ8zRkS7+3/Hbrb4Zdsg= +SHA256-Digest: Q7//RtHnydbo/OznNwrwyBxZgd1ZZoDvuLhA3WQIwwg= + +Name: icons/loop.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oTW3+WKrp70WCCJdxgGYXjG3F4c= +SHA256-Digest: W0fRGQm/BiV4OMqjwbK7ipiUsPyVE7hsBUtl0JTvz54= + +Name: icons/IconSponsorBlocker128px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JVuXbJnsFQyW6sYHWGjp/yCmR34= +SHA256-Digest: yBz3VYs4lsAQm44ivr00ETgl5UNervuN0MOiamTuwss= + +Name: icons/PlayerInfoIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: FUeRFS2ZEPLESudxuhQ3wWDV2TI= +SHA256-Digest: oKdpW8VDKKJa3y0sgkoyTyQHWm09UXCoti7ZxCtUrI0= + +Name: icons/SafariIconSponsorBlocker64px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Tz2KRF65hajKOWOtg5Vwsv/U9E0= +SHA256-Digest: 1PV7iptuvlKGj9FPci1Bcg61IaFY2s3owKO1YqqXT9A= + +Name: icons/music-note.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: rtVwQz+i+KChRv4BroQRJ69r3QM= +SHA256-Digest: SgGp/m+IH6c5Z8ByIz80XWzBVdOc2U2shwfUsjHb/tg= + +Name: icons/IconSponsorBlocker16px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mtyDO1Od7IHNzp1398tm2hms1cc= +SHA256-Digest: 5jDfe9hxC8kobMr6avUXgkbRi2K93tA+JOZ0wjRLEw8= + +Name: icons/LogoSponsorBlocker512px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: cC8AvPXxtOfZUmIyAhV3IS74qS8= +SHA256-Digest: TqOGFnHQPVDWjYlefHio0MxzIJgRI0X+tLlzQUEbxRU= + +Name: icons/clipboard.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jYuS097WdwwyMAAOug2HhknSyts= +SHA256-Digest: 39eIugSocCVvYYwMsd/0aro+HnuJ78njhcc35ssEEZc= + +Name: icons/IconSponsorBlocker32px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Ros2ttvfRsC0D+nmRx5tmFqqKss= +SHA256-Digest: Oye/xwbddWd/U4bKT9IxPn6yyX3aERAwtwkh1LT3zuk= + +Name: icons/refresh.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ilT1D6CwLZ8RzLYyfSLZN2FMpTg= +SHA256-Digest: 5CbeBYZE5lZWHKTCYBE+RD2E+C+CgXoY1Dj6yOrsC08= + +Name: icons/star.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ShIsdta5cDpBnf73MYs6pb3BFhM= +SHA256-Digest: MRvZD6mDWx0Ab10nNGgp7pgX7NDxvYd/+LE0u5461vk= + +Name: libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: moalhFDNVLJvMtR1+MZfuPJ3kNA= +SHA256-Digest: 0kQ6bJHqZzNYJdcdHtwluax+dn3k9EU1nk9r60NPW4E= + +Name: libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vS3pwCDR+wRhzt9Ojh1NaDRCbRU= +SHA256-Digest: JPfjl/rseeYsN/8vALFw9twVV/tGrBafnxiXqdZB3QM= + +Name: libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: F9pbYIRduJGqzJQpnTzv8hz1EBk= +SHA256-Digest: 7e9aSSGKADFRQsREqYCBm+gs7Han8z5QLbi8/jPBm+s= + +Name: libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PFK6lKhO8oRrZe6bRy8HvxculOU= +SHA256-Digest: rXx6yn7pBj93pIJC+cc45LFbmExRFntUc/q/LAJiuvc= + +Name: libs/Source+Sans+Pro.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: l0xcmN4YftYYKPRKMN4bI2fa1HM= +SHA256-Digest: nV1+AekAO3F/loRZ6j7sbFRBvOszN5LBlGiyBpXQjl4= + +Name: _locales/es/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: dYmIFpeFVQmquQf+6jMyedVMo+I= +SHA256-Digest: eSLDZfgM8cloUhdTJjbRTVR01ojZq8EoVP6m8SIwuXI= + +Name: _locales/ml/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 3+yYGfE+xTTcKEh4nBIdARgL+sk= +SHA256-Digest: RVpKxw1hRnJgxi1mA9eiEElgMZYMKmUwQxoo7mpj+jM= + +Name: _locales/bg/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 33bL74dP2TjCzkC9JU1cY0x7yQg= +SHA256-Digest: TJPoVmr5qNZKslX5B/k/bRk78WqN/dsyIVNn9xQRpI4= + +Name: _locales/zh_CN/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: O1fCrC73MTqTift8qhAs1V9hhZg= +SHA256-Digest: 90M2CFQPZdo+kxpNNosOfE2BH+WOAMEiPu2LaNPbPuo= + +Name: _locales/pl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: c8uvpAnRSA5PpSAZ/VEBHbi0tsk= +SHA256-Digest: OdIXea+5T1fOn9ocZbs7/gWsAdlObm9ZjXX0l8N+dZQ= + +Name: _locales/cs/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Ah3F6UXcfwzpFM/V6qbgHkJ4ptY= +SHA256-Digest: e5VM+ZlcJb6DYBJ/TPogzxuhcr2VhgTu2OscGJHJNlA= + +Name: _locales/ja/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: V268M0S9fmXWPWOBzfCX+Fe3Hrc= +SHA256-Digest: hTAMtHsLs2yglgIuYAnD2gWvaK95m02XFFDTm994wnQ= + +Name: _locales/fr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Uryv9JfSbWUYb6twLJ8xYGfNjac= +SHA256-Digest: MPhrWMLf0nwUsHiNS4hhL6rspIBTxNZlD9MaR+ZAxDU= + +Name: _locales/ru/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Gj0cPiCTGtm85GcAsyYLzQu3qqo= +SHA256-Digest: m8JCWyLIIQbBcwQNJLq4Rf6uViRwgALYc1WeJSjQGvQ= + +Name: _locales/th/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: g8x6ukJbxSxLOtIDQ7gHVjhqywc= +SHA256-Digest: zv5EPnJ0HTa1cIkeaZ9BT9tuQuL08bCgjnP+pLTHRwg= + +Name: _locales/fa/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RI3IzTPT96kVtcf/9Jg68VvWbZs= +SHA256-Digest: ubkWd1XY9rx9WJ96rdZgC7Vg4a2UWb7Ad30FGFZbNCQ= + +Name: _locales/lt/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: KAbeB+/zak6DGCjMeC/iO1+/Xmw= +SHA256-Digest: BoAFuN9+CQjPcfFntRVEto3ssAhlxDZ7WmqqKnEZhkI= + +Name: _locales/ar/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: IUbHRhc4JirIil7oR5CNL2+NBio= +SHA256-Digest: wtCWOkimYNCK0AvrpAIVQE8y1HjL2sZ8/EEFpaUdLfM= + +Name: _locales/kn/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 6OZ2SgV5rxH9HKB4dK1WBhsm8YE= +SHA256-Digest: 2T3X8htREjaHVXhlrvUrPM+WHzOH84BrGCfUF/vhoFI= + +Name: _locales/bn/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: aheiSp3p8jAeuitdaqLZo3dT308= +SHA256-Digest: 9Vsyq9uAue2WTQYT5XQHrYpGdKZJfCF+IqoF9TVAQAU= + +Name: _locales/de/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bBd+cBjMldYHejGLdqlI1ghPF6w= +SHA256-Digest: 6nBep39cpu7kriVH1Iq47CSBFtdWuszQhgomkV6a38A= + +Name: _locales/fi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TbfvyORF1Vh8/mZ44MCx8BKvXzc= +SHA256-Digest: mI7Z2IUVrqZ0++/DM4wrroMnAa3Dib0QXyYVwwNks4I= + +Name: _locales/te/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 3Rki5KX7yMYuiKgRs93NeHgA1oA= +SHA256-Digest: EmCKUO1VpU9TjEkdmqNrksgLvTqjoaucYaCi3nerU0A= + +Name: _locales/hu/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: V9mzvb5XV6gWsKF6v6TOVUMDeVk= +SHA256-Digest: 6NjId1+tQ0U2arVKVv2lsMzeLKBcyCCAI4rh9QVD4tA= + +Name: _locales/nl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4W0dL6o4kNrixr+FAArFUy0PhOo= +SHA256-Digest: xmubqMxt3YvHFurfunk/e95etfSaJ5iGdlUwW0kdb+c= + +Name: _locales/ta/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Xhw5cy2Tc/mLWuawfnjw53q0byU= +SHA256-Digest: cgpc2+C94ZOrI5S8NnbXEvzqaEkxMhVgWzdI0IiB/FI= + +Name: _locales/it/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oS8hr2e9/+BofpuCw532u5SmyCI= +SHA256-Digest: pjRnn95sQ3p3A1m7lrG5VoqPGthpzzpiGhRDXMLWI7U= + +Name: _locales/zh_TW/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Z1h+IBEp+T1+hg2gICZokHIDNRU= +SHA256-Digest: 2N3xs5PClgoBvaR5Ewrp/h5IAgze99DVx+tAXOOp6nk= + +Name: _locales/sr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PfpYZ3Ajt8R4T47eIdmxXkwWJBw= +SHA256-Digest: +/zA3apTQzUfn5T0IQXtNlXh7yR40r6LSnJcqSg9Hdk= + +Name: _locales/pt_PT/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sEnovyjIxUraIqqHi6Kig4Sq8YI= +SHA256-Digest: RdFk9dkh51Psq1/S6N7ceU3e58uuM04VYR651wURyLM= + +Name: _locales/sv/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JndOj2/+EUfJWhaDooCTOZdZWm8= +SHA256-Digest: bHRuZsaTvJNT34KS/TSrssQSdbjMsdj4shKeN87FBxw= + +Name: _locales/en/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: kATFehXJI0Bn6RHWmGoIbzBcqZY= +SHA256-Digest: dDxU9bzutaIiRm2npyg2lYKsrtXJB6p7r5/P8IJC12I= + +Name: _locales/uk/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: E+Hkao9HINT0wc/IV/LErjd/uII= +SHA256-Digest: 2tbD7+KECUr0Q10YOCo9DYLMpCcwdZc4v+0FlG9yY08= + +Name: _locales/fil/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: K2BAoatvsnYWkUo3rcyvl306DxY= +SHA256-Digest: HCjv08o4kMI1L64L1a7PVLfJkr6F8eCX8itJFECKyNw= + +Name: _locales/sk/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1q3mDDQVJrSIMf+p/nlkUGX/+ks= +SHA256-Digest: ip3Qfi250rS6AfwJGW88YlaEt6V17retf+Nf/nYloCA= + +Name: _locales/vi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: deRB9IrZe0b6fg5onHHmDYYB43g= +SHA256-Digest: GnGGqTT9ra72yzW9bE7Oci1B8RzSyFOMx+jfRNutkyY= + +Name: _locales/ro/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 61r4lIwsUVeR2WFpKESdte3AOcw= +SHA256-Digest: ifReD0RFZQp02dCISjLVSAYK0t3MiopfcrD7J8+u3ig= + +Name: _locales/el/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: j+NTJ0c7xwJdArCdRszBzgRIOwQ= +SHA256-Digest: t3PJunoxka9HOmhNjvgzww43ohHCiHyu4nqzGkk0Ir0= + +Name: _locales/et/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: hP95NYOweyZK86V28vMcrK14WeU= +SHA256-Digest: XWZyZ1gBbpQdJiCOEMRqzDnxa/a05ncRoCHogoCKZO0= + +Name: _locales/ca/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: rHGVtBuxNOdV+QNorLt4XTtTGyU= +SHA256-Digest: Rw2lMcq499K6cQmInlz2yjqfSn96rfprx7on80j0b2Q= + +Name: _locales/no/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: nyqG87gd708Glhgi4//HSYYNVWU= +SHA256-Digest: 3kSH2+rgKBjb52jLDJ/8leX3eou9X3acnstTodOmOnU= + +Name: _locales/pt_BR/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: lGf8zhpf0bHZsk+wVj7oOCUgRO8= +SHA256-Digest: 4piBHOi7wJ4KrYqvD8e4ecrk14fXJrhkzD4pSIusI0k= + +Name: _locales/hr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gtIlROvuooa+lBq9UI0GPfnltbw= +SHA256-Digest: rs6FwPcsrJUHUH8NpTV3I/B5tL2rlLu1NqGWFtsSvhk= + +Name: _locales/id/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: b0GctXRheeT9Ro/2nuotsB8naC4= +SHA256-Digest: mNdGMx+2YYIn1TaUWNgB2ct+4q7A+oYARMDQe9V5O+E= + +Name: _locales/lv/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: qJHXpT2HW7sisLpuySnEghPQ6xo= +SHA256-Digest: h4LqD+NndZiby1l48TCFDtLPpT0wp3UvVZj9mcvS1EE= + +Name: _locales/hi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: DsJpiBYlT9U8xz/h9HbAyNhLdsI= +SHA256-Digest: NV12rYGUyxYdgeq2rthzoBiw1dPfrL4Hgn4Ba9eIttA= + +Name: _locales/he/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ARg3Z+YK3BTGaZw79fmsiufo5kc= +SHA256-Digest: KUB38qgzDef/2+pY8KnyFTeRU0CzHB2GNTZ5LT1jgBs= + +Name: _locales/da/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: BwWEKdnxcpev6dfFXr7vx6/1cOI= +SHA256-Digest: Ht5uFJeDeZEW954I8E98Ky8hC7rVR1kliG+3BhvuaJA= + +Name: _locales/ko/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: YA1GxmGvRXBy5Rb9iRQGLWB5QiY= +SHA256-Digest: 2cUjyY0xC/XKt9iyFhikdO2tCU3lso6y1L4W/L/MEiU= + +Name: _locales/tr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fZhis2vpb+uJndgXXrxT5J4XUXk= +SHA256-Digest: 9JgsYfDvgw5nAm8N4FwF/aXk1ICOhZM/c+wnWbSHhv4= + +Name: _locales/ms/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HduCTE1RhQoclQaWqwlYAuAwpHE= +SHA256-Digest: TBP/XwFz4Vm53KrMQ3SfH3bwRlpGWc6hHibBCAE+OCU= + +Name: permissions/styles.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ixF+PRLHr3DjiQBE0kDYqMMGN6A= +SHA256-Digest: RC2twhKbr1BYwJS1IorUPSBlv3WzlZPLxtZnX8lQnWk= + +Name: permissions/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gNe1Rh7n4kZNY1bWTlHfxVQYew0= +SHA256-Digest: q64PreAGI6GyEzZ1f2y0X8GNEE3G139dRSGUlx0xOJ8= + +Name: oss-attribution/attribution.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: LW6ymcibRp0v2RE2hxFWt0RLvoM= +SHA256-Digest: ZIA/Co9QGpQBg5OACGjp0+L978AGML0f2YTP1Z8UqgA= + +Name: help/styles.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: QkJ6RmMHdqcJvNZbm1G/v8cLh6s= +SHA256-Digest: 4B5jaGhEfOM0BNHb1je7Ce3WINlkKVEpBe6zqV6oeg0= + +Name: help/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: agDsE59x1EYsf8Yl5sbYFcxl2nQ= +SHA256-Digest: UpYzdaL4VXVbVlHi9HjpDo3FoLS1QrRjTle1pyXPQR8= + +Name: help/images/popup.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: y02T9cHW00OJUj8Uev8S9fKJNpk= +SHA256-Digest: 9lotN5clUitwAl4YyFEf8LQZ1mqmYHxo9KT0DLlNoPE= + +Name: help/images/submission menu.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: UYpwleQR2v29PGzgIB47vbKHYZM= +SHA256-Digest: LL7+CzF5sXxWIlKaK32kp25Arr0xykQbQP12Q5iimfE= + +Name: help/images/votebuttons.gif +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: p4t/3qlFQhFPPBvVOTppmLON+H8= +SHA256-Digest: LKc1UFg0FLDpIATSWwbxfMvkptajajp3GmVmjfus14M= + +Name: help/images/voting on notice.gif +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +H8LiQ1wTfFbF9nhAYIQtg+WI1Y= +SHA256-Digest: njrfEQA/oZhf+adqglwK+kY83oqobNMjGSCHahgN3gA= + +Name: mozilla-recommendation.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wQ0sN05RugG0UABc9M8SHADu1eg= +SHA256-Digest: yQXJzK18cbqXZIgHJ6tbkgku8a1oFaKh3Lcte8ldWU4= + diff --git a/data/extensions/sponsorBlocker@ajay.app/META-INF/cose.sig b/data/extensions/sponsorBlocker@ajay.app/META-INF/cose.sig Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/META-INF/manifest.mf b/data/extensions/sponsorBlocker@ajay.app/META-INF/manifest.mf @@ -0,0 +1,727 @@ +Manifest-Version: 1.0 + +Name: manifest.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: A2A5fhmpHmSpbQZwQdiKJaQLuJA= +SHA256-Digest: xRZ/fCx9EVFpeU8x+jh0m/OLBtTJ4Zc2vDfN4VK1Fbo= + +Name: popup.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +1cQ4qqN9cCB3pNPMdxKqGeywyw= +SHA256-Digest: 3GgB1y/RtNRlhbwXlXqZz3zIzDfEaaEwRLFecjn7fL8= + +Name: popup.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: OKbMt5EbcM35/3IGyFnpHaKJTC8= +SHA256-Digest: bbFP6WvQbFk8KP3ysZ6P+O0BoXrWFBXbdG3dCveT5/k= + +Name: shared.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 9MlHGOy2LUBoTe8W4aL755V+bio= +SHA256-Digest: S2oUOalRoZG2Xrx0bpnAgojIjNfupDIye3X2sRX4L3Q= + +Name: content.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: MFQwfSj4U1zhmdDCEcybQdmSuGw= +SHA256-Digest: NhFayuKMCXbNsMoHGzH7lTcSNX83/7OS0pFR+kksnDY= + +Name: res/countries.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8zH64XmehkULv051Rq4x4qyNgqY= +SHA256-Digest: tPFXXDdDgE3Zez6W/SVRcq6iOXK0544YTRIaeVa+dA0= + +Name: js/popup.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jdBJ0dr7Dku0UxWboixdOQwEiKo= +SHA256-Digest: 2+kkrPDhzEupohN2hu96xYHKowtKn+JfuVrU6MduQfA= + +Name: js/content.js.LICENSE.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1i3QZtyoli4K65vJtoAdq3mzUaM= +SHA256-Digest: e5p1o8nk5I59O2lYb59lVhS16o36RTqkziIaZ9X8TZA= + +Name: js/background.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4X+VkysJPYpN9HlMs8nbqPufkUQ= +SHA256-Digest: ytXdVokmXkY1mx9VUg2TN/8rybH8tgwJMnLmuvplSeg= + +Name: js/content.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: XoOrS/RwUuqv/qnsYmZ+skcXiss= +SHA256-Digest: C+5s3e3zGfNKWa6+Ib5vIcsQEqKrU2UYaYRsfxRARj8= + +Name: js/popup.js.LICENSE.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1i3QZtyoli4K65vJtoAdq3mzUaM= +SHA256-Digest: e5p1o8nk5I59O2lYb59lVhS16o36RTqkziIaZ9X8TZA= + +Name: js/options.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: CzhpMvyp/euzWO/89kQy0bOfp3I= +SHA256-Digest: C4fc+M9JWz/9UTG0VTJwH4uyAdxmMKbGZXqjTHNc1As= + +Name: js/help.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: cw/jYV7X6+gXHOhX9Lwl/l5Ek10= +SHA256-Digest: 1XV0KxWwRB3dWe8MU+2JRvJhlFeSGdt203xs9Dn1B/A= + +Name: js/options.js.LICENSE.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1i3QZtyoli4K65vJtoAdq3mzUaM= +SHA256-Digest: e5p1o8nk5I59O2lYb59lVhS16o36RTqkziIaZ9X8TZA= + +Name: js/document.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: WkA1qwCgKpxQpPUgjwgwzuHar7s= +SHA256-Digest: aFbLEgMoMoR24kq4cjnAu1g9IfFRJfWzN0f1v+sMdqs= + +Name: js/permissions.js +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: nq9xKXidT3o+t+fv8JgT/EWhBmk= +SHA256-Digest: zuZTv3mZ9WxHtfaXqYnji6PZDggMz9Khp/9WSS3TROc= + +Name: options/options.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: EEHoZeZHRolAocLPfOgC/pdjLjQ= +SHA256-Digest: wmdwgvZ3kHShK3E30M8s4Fa3COz3ZrHjQwUxQhmuHus= + +Name: options/options.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mBJnhzt1yM20Pa4i+pHVcSxHRRU= +SHA256-Digest: jwPG7RnduCaWwMGndwPJiC6kvCCjC4dEwBuqMro0cDc= + +Name: icons/import.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 9GzRVgylLSliV8MzZuXHQa5fso4= +SHA256-Digest: jq0yF1Kt0NLzcD5XB09L8w+pqPYyPISecvXPzM7mgZU= + +Name: icons/right-arrow.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: UvrdykE811S6bQE1xHEDYNqpz/Y= +SHA256-Digest: kKEsmxH7iDr3wDvSs4rM+ieYQGq3apcwR0zbeGUuqr4= + +Name: icons/PlayerStopIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1AK4LqdsUSKdXRLOKX4p8OxUyGE= +SHA256-Digest: zk4XLG++m8N+MKtACbm1g5Sj3K11ED2HIZJK9iE4yuE= + +Name: icons/visible.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fz+9bvc+xViBK8Ewg/MSEcpFw8Y= +SHA256-Digest: 9TMx0ZyVXUdyWG/nptkWmfUj6D+etgSdd4Kv6P5AB0M= + +Name: icons/LogoSponsorBlocker64px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: akzmiZuKt4Rqs/iatc68mb8oht0= +SHA256-Digest: 6aaoRlsn0geP+d24lpR0iBDJ77Dodyd7oo21IAAX4/w= + +Name: icons/report.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: yCxL8RadT5mghcOTeibSDGqQ48E= +SHA256-Digest: frQBGM5oHqmWpa6udttE8B79/jjcmuVR8zfG5kvc+pw= + +Name: icons/thumb.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +3D8kQKc9e0TOfjjd4sKwXCUeA4= +SHA256-Digest: j+BVJR9BC0gHvX+N+cL+zLCNQDL0EfhhdcO/dUgWjfc= + +Name: icons/LogoSponsorBlocker1024px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: pKsc5tjgl/kao7NS9rP6AMnIswk= +SHA256-Digest: sPlDnCjHt6aLBT8c7wVXJzcXtX0U5ovZzaJUbQSaE4Q= + +Name: icons/SafariIconSponsorBlocker32px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: BjzN3RW/qpA3hzBbWom+IEew0tg= +SHA256-Digest: eh0/WOnqB5kUngUDSWeYWwQ4emjJ1rJC1ipm5VwSVws= + +Name: icons/SafariIconSponsorBlocker128px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: UmKZTu5tqbc8WlxfZBskCMscWzw= +SHA256-Digest: 1WDejXRSQ19DKGLCiFK++Zr1Xo8xhXYMTDfQJzqPHpc= + +Name: icons/PlayerDeleteIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s1aVbZ0Y8m4BOkT2+LZAvLYzUQA= +SHA256-Digest: 2RLSoHHVDz1KuFsW1o2rfaWi7Vu+rYQq09zRWH51J7I= + +Name: icons/check.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Q4pbxIkM/I+Jalo5QGk/cNW+wUU= +SHA256-Digest: 941NgHZng6vl5O8QOE8IUZ+sf1qqEgmsqN6+UoFaGkQ= + +Name: icons/IconSponsorBlocker256px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: F6XiN4yPnbCe76UvfqkQlPyUfTU= +SHA256-Digest: o89CNvZvM7cTX8M9YCgHLA0tJtIx4XgBUhaLyX9O/8M= + +Name: icons/thumbs_up.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: D8h+K6aT5sr3rH/vKDmyYjFlnTg= +SHA256-Digest: Bgive5ZoNiIaFBh2iSynNlSydpIJ9nroygf0FmqFwMY= + +Name: icons/PlayerUploadFailedIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bXub0bviBYsKv3VCGEP/BNyBWxA= +SHA256-Digest: IImdAjC6SN3c5ZBtGLBp3pBWh4qefdXfRGu09RnjPW0= + +Name: icons/PlayerCancelSegmentIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: tmAft2yKf7GAKPa9LNd5RBr3MU8= +SHA256-Digest: JmWrXkNM1PzTPaKA1WuM3a+ZwGZf74KJ5NYy1k7mnOM= + +Name: icons/looped.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JQynFqoXs8c4+/quCf4FJa1lGQY= +SHA256-Digest: uGaAmz75vhXziMxfIoKBwvb2HWAF6hCCO2T3uV/BQms= + +Name: icons/sort.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: q6c1nAfvyecxPpwdI5OMHW+BhWs= +SHA256-Digest: kPyAIsUa2OzfDLyuTdJOm28mdqXIItCVAqHx3/ps/50= + +Name: icons/downvote.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wikHSywfPJDRZOW4NZpesz617t4= +SHA256-Digest: IZtKg+7y7eeqcRdR6l3cMQEh/JIvpwUAG+VakA/D1c4= + +Name: icons/segway.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: /HYkgfcb2bztO2lAleqGK1T6Mg8= +SHA256-Digest: CYqHxn6XdDjcyQSxzUnFMYHKMYLa7Ljj69s6OQXIvuA= + +Name: icons/PlayerStartIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +CgCG/k+0+wyZ6ckPO+cQrzcQiQ= +SHA256-Digest: CcgYi9mMFq1Hsow0UlKY6fCArwLNvmvFHZr6Em5s5f8= + +Name: icons/skip.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s1uWs87Cz5CggyMUBx4+O5wvlxo= +SHA256-Digest: 1orCjKiLarqIFqmtMxAaosl6Lg8YvYETVIiBaae+xh0= + +Name: icons/upvote.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RBT37o65JabAUlffpGCAILQGxFE= +SHA256-Digest: qcsI7YrSzOUfRh+5SFxq3OvTOktdpxnYFiVuFp6qUIs= + +Name: icons/campaign.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: LiQUsv7YkpTpYOo9xcJKgKxO1tg= +SHA256-Digest: mhIsUOx5+eJ294dQ0Yb9upc+jFkQzI/rxagwxYoQubY= + +Name: icons/export.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 5cMeOFGzDSw7FkN03HHPMPOBXBs= +SHA256-Digest: txs64+22KNqOWj0yB9hbeIEzTZJUdTCO4Cbl8d+/J6k= + +Name: icons/bolt.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4UMr2mF3iV+yZo646McqOAsVZoA= +SHA256-Digest: kcTQzDpzuXgETfss+/i1QCyGUSqNUc/t3w/6EQ/5GbA= + +Name: icons/help.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PA/ASdDQzZACR47ZfnVEBQBDESs= +SHA256-Digest: 6yFfKtLioSQ1BNg8IFd+RiehBPjMdC6v9BPqYI1XUqM= + +Name: icons/thumbs_down.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: zU8Z61Z0pgVQWcEzPZQ2E/LXR54= +SHA256-Digest: WYZ3UbbaSjynTWT1s9wWqu3ST7nEoXsf4mVc7WvtTgA= + +Name: icons/PlayerUploadIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Fc0/SSP8sPKWct2uZkOdanjZ/RA= +SHA256-Digest: s01ziZKZHbDGGQcjdzO21l1qAhfZ1WUYsTwHCtoj+fc= + +Name: icons/lightbulb.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: qGxW0gZeyADyBEgOrP0A4FqDtFE= +SHA256-Digest: VeuyRrfw3EpJV4RxvgxUigwL5i6UDtpG2MSbsilSZs4= + +Name: icons/check-smaller.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s1VOkXQmFFbkAfte+S88L/b3WRU= +SHA256-Digest: GfF4qDN9QIc8VVvR7d2kSgSl1lOlrFE9am4wvOJq6uc= + +Name: icons/money.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: iM91/00VLCUKAkoYLFHQ7MPT8wA= +SHA256-Digest: gxG1YGrpD8ue6/qH9/3dNq/vfWfh2gPXP9mAXFxx5vg= + +Name: icons/IconSponsorBlocker1024px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: p7216WsRJnFbZza9H1OZ9urPe1w= +SHA256-Digest: 4+6cekvlNNjZ+Mfq1Ng6s7HjhivN9SE7g+htukftqvU= + +Name: icons/stop.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8tLzUF3DP09YLhy/VHx6wnVtSu4= +SHA256-Digest: E3ABQyR4pufSzJsjotypdQivKmqR/OIiHr8EcxFQuIA= + +Name: icons/dearrow.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TZnOYO5dp8KW/MlQHJWk8CyTFCc= +SHA256-Digest: CZHzebAi3Riel8Gd88cJSS/04jLWYgR7uBsl0Mf5Gz0= + +Name: icons/close-smaller.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: uj3nBNfwx7Eqz7WE3m+DOylKyPk= +SHA256-Digest: EeMbOYOAAn/I1MENT8ScrnEVTuCzPLzD85uNKWUBsq8= + +Name: icons/heart.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: pGpCCalVMSVUoM3wH/FC93uhZfs= +SHA256-Digest: FOPBx0KgobRkt/k7EWUPPQWbqC8RmUPL0xUNmaujEBw= + +Name: icons/newprofilepic.jpg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Wan5R2ZRaNOg1SA9X1IhbnWrOd8= +SHA256-Digest: ZC8lhyC1gs+RAB4dtINIZNhIEktLmAkK06lBtBiuoQY= + +Name: icons/LogoSponsorBlocker256px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 9/pu87OXgOTPjhTaG2aauJPuBsc= +SHA256-Digest: JU21bhXMTzaK9IBcn6llgB2LQMVXW3kdottF03TsVsA= + +Name: icons/IconSponsorBlocker64px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 2pOOi3yrihb2evL9M3h75ZmLhN8= +SHA256-Digest: sZWqDykvjNKf5IFOMFq3pMTkd4NT7VjVL9Hb9sRphRg= + +Name: icons/stopwatch.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: G+WxoVPtoKvoKb0OqgUPpADuzk4= +SHA256-Digest: ZVGZL2FzUiMTd/r+0QWTPqFUy/4E9FZIV0lZosR9jBw= + +Name: icons/settings.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Dm5ZVYazkXnCwImTkY9PqsKudjc= +SHA256-Digest: /Q7FLZvrcw96QOQdE+jNR8fP3Vlfn5leqo04nAmo570= + +Name: icons/pause.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HsFvL/2WasnkEUAss7I2JxQuMU4= +SHA256-Digest: AOHhXCiEJY5CYnpOVtGsj7dXO/YXW1WDesfDgnmys+4= + +Name: icons/not_visible.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 8ybHfc/Xs7pMxxUuj0jculn936o= +SHA256-Digest: SFe7gbGj/SUA7tXGEig7sHLlIoNi7P1mdzh2FlHfbig= + +Name: icons/skipIcon.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oH/Rp9YspEjQ+1gvQbgE+Mq9XuA= +SHA256-Digest: 6IJSMDviPeCr4YVvov1QxZjOiGHP7KM6v4FEhKYn3ug= + +Name: icons/SafariIconSponsorBlocker16px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: xIzZqrqh46lUdtakcUMXz0ELzPw= +SHA256-Digest: 3ab1+Ej6/vUtKdpudP8aJrrJ5OCywbkEkRDAIHbYTV8= + +Name: icons/beep.oga +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s1LyR+QutN0Rh0z2EJkRUIeztgM= +SHA256-Digest: MDohn+5j2SvoZUrte1ILWbKgstbKrVXZ/SWfGvOUEWQ= + +Name: icons/LogoSponsorBlocker128px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: j7GYdq9Q0WsY/Gm/QiZTN2sv6+U= +SHA256-Digest: s+mhRa13noiJ166+116Rx4IOab6oKaE3OGc8Pfaepkg= + +Name: icons/close.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HLNztOmiPLDuhv3mxRArCbZM/oI= +SHA256-Digest: 7ZD1GvJfy4aeOvUG0wTDHxPDIo+1hjJFS3bMPSxU9pI= + +Name: icons/upvote.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: s2SxNZz4X/+B/69amyjypNryjGI= +SHA256-Digest: KvnS5yVjt30phEItIdywpFaWxXpzw7PuSRQLTN2N3qU= + +Name: icons/pencil.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: r8kIovMJPiXGjoHVlGTFoMzGZo8= +SHA256-Digest: iyNGIU6NqOjMxRucMTpuvtvfNiUwX4Jipq3Iut+fGLk= + +Name: icons/IconSponsorBlocker512px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fIJXKz+c2Pxad7WLijZwpErHy8A= +SHA256-Digest: 4psTDTGh3azunMeqEblZlrVXkG7UIVTEuu0TgxU18iA= + +Name: icons/thumbs_down_locked.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 6Xh96iGYZ8zRkS7+3/Hbrb4Zdsg= +SHA256-Digest: Q7//RtHnydbo/OznNwrwyBxZgd1ZZoDvuLhA3WQIwwg= + +Name: icons/loop.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oTW3+WKrp70WCCJdxgGYXjG3F4c= +SHA256-Digest: W0fRGQm/BiV4OMqjwbK7ipiUsPyVE7hsBUtl0JTvz54= + +Name: icons/IconSponsorBlocker128px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JVuXbJnsFQyW6sYHWGjp/yCmR34= +SHA256-Digest: yBz3VYs4lsAQm44ivr00ETgl5UNervuN0MOiamTuwss= + +Name: icons/PlayerInfoIconSponsorBlocker.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: FUeRFS2ZEPLESudxuhQ3wWDV2TI= +SHA256-Digest: oKdpW8VDKKJa3y0sgkoyTyQHWm09UXCoti7ZxCtUrI0= + +Name: icons/SafariIconSponsorBlocker64px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Tz2KRF65hajKOWOtg5Vwsv/U9E0= +SHA256-Digest: 1PV7iptuvlKGj9FPci1Bcg61IaFY2s3owKO1YqqXT9A= + +Name: icons/music-note.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: rtVwQz+i+KChRv4BroQRJ69r3QM= +SHA256-Digest: SgGp/m+IH6c5Z8ByIz80XWzBVdOc2U2shwfUsjHb/tg= + +Name: icons/IconSponsorBlocker16px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: mtyDO1Od7IHNzp1398tm2hms1cc= +SHA256-Digest: 5jDfe9hxC8kobMr6avUXgkbRi2K93tA+JOZ0wjRLEw8= + +Name: icons/LogoSponsorBlocker512px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: cC8AvPXxtOfZUmIyAhV3IS74qS8= +SHA256-Digest: TqOGFnHQPVDWjYlefHio0MxzIJgRI0X+tLlzQUEbxRU= + +Name: icons/clipboard.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: jYuS097WdwwyMAAOug2HhknSyts= +SHA256-Digest: 39eIugSocCVvYYwMsd/0aro+HnuJ78njhcc35ssEEZc= + +Name: icons/IconSponsorBlocker32px.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Ros2ttvfRsC0D+nmRx5tmFqqKss= +SHA256-Digest: Oye/xwbddWd/U4bKT9IxPn6yyX3aERAwtwkh1LT3zuk= + +Name: icons/refresh.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ilT1D6CwLZ8RzLYyfSLZN2FMpTg= +SHA256-Digest: 5CbeBYZE5lZWHKTCYBE+RD2E+C+CgXoY1Dj6yOrsC08= + +Name: icons/star.svg +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ShIsdta5cDpBnf73MYs6pb3BFhM= +SHA256-Digest: MRvZD6mDWx0Ab10nNGgp7pgX7NDxvYd/+LE0u5461vk= + +Name: libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: moalhFDNVLJvMtR1+MZfuPJ3kNA= +SHA256-Digest: 0kQ6bJHqZzNYJdcdHtwluax+dn3k9EU1nk9r60NPW4E= + +Name: libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: vS3pwCDR+wRhzt9Ojh1NaDRCbRU= +SHA256-Digest: JPfjl/rseeYsN/8vALFw9twVV/tGrBafnxiXqdZB3QM= + +Name: libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: F9pbYIRduJGqzJQpnTzv8hz1EBk= +SHA256-Digest: 7e9aSSGKADFRQsREqYCBm+gs7Han8z5QLbi8/jPBm+s= + +Name: libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PFK6lKhO8oRrZe6bRy8HvxculOU= +SHA256-Digest: rXx6yn7pBj93pIJC+cc45LFbmExRFntUc/q/LAJiuvc= + +Name: libs/Source+Sans+Pro.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: l0xcmN4YftYYKPRKMN4bI2fa1HM= +SHA256-Digest: nV1+AekAO3F/loRZ6j7sbFRBvOszN5LBlGiyBpXQjl4= + +Name: _locales/es/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: dYmIFpeFVQmquQf+6jMyedVMo+I= +SHA256-Digest: eSLDZfgM8cloUhdTJjbRTVR01ojZq8EoVP6m8SIwuXI= + +Name: _locales/ml/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 3+yYGfE+xTTcKEh4nBIdARgL+sk= +SHA256-Digest: RVpKxw1hRnJgxi1mA9eiEElgMZYMKmUwQxoo7mpj+jM= + +Name: _locales/bg/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 33bL74dP2TjCzkC9JU1cY0x7yQg= +SHA256-Digest: TJPoVmr5qNZKslX5B/k/bRk78WqN/dsyIVNn9xQRpI4= + +Name: _locales/zh_CN/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: O1fCrC73MTqTift8qhAs1V9hhZg= +SHA256-Digest: 90M2CFQPZdo+kxpNNosOfE2BH+WOAMEiPu2LaNPbPuo= + +Name: _locales/pl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: c8uvpAnRSA5PpSAZ/VEBHbi0tsk= +SHA256-Digest: OdIXea+5T1fOn9ocZbs7/gWsAdlObm9ZjXX0l8N+dZQ= + +Name: _locales/cs/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Ah3F6UXcfwzpFM/V6qbgHkJ4ptY= +SHA256-Digest: e5VM+ZlcJb6DYBJ/TPogzxuhcr2VhgTu2OscGJHJNlA= + +Name: _locales/ja/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: V268M0S9fmXWPWOBzfCX+Fe3Hrc= +SHA256-Digest: hTAMtHsLs2yglgIuYAnD2gWvaK95m02XFFDTm994wnQ= + +Name: _locales/fr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Uryv9JfSbWUYb6twLJ8xYGfNjac= +SHA256-Digest: MPhrWMLf0nwUsHiNS4hhL6rspIBTxNZlD9MaR+ZAxDU= + +Name: _locales/ru/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Gj0cPiCTGtm85GcAsyYLzQu3qqo= +SHA256-Digest: m8JCWyLIIQbBcwQNJLq4Rf6uViRwgALYc1WeJSjQGvQ= + +Name: _locales/th/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: g8x6ukJbxSxLOtIDQ7gHVjhqywc= +SHA256-Digest: zv5EPnJ0HTa1cIkeaZ9BT9tuQuL08bCgjnP+pLTHRwg= + +Name: _locales/fa/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: RI3IzTPT96kVtcf/9Jg68VvWbZs= +SHA256-Digest: ubkWd1XY9rx9WJ96rdZgC7Vg4a2UWb7Ad30FGFZbNCQ= + +Name: _locales/lt/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: KAbeB+/zak6DGCjMeC/iO1+/Xmw= +SHA256-Digest: BoAFuN9+CQjPcfFntRVEto3ssAhlxDZ7WmqqKnEZhkI= + +Name: _locales/ar/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: IUbHRhc4JirIil7oR5CNL2+NBio= +SHA256-Digest: wtCWOkimYNCK0AvrpAIVQE8y1HjL2sZ8/EEFpaUdLfM= + +Name: _locales/kn/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 6OZ2SgV5rxH9HKB4dK1WBhsm8YE= +SHA256-Digest: 2T3X8htREjaHVXhlrvUrPM+WHzOH84BrGCfUF/vhoFI= + +Name: _locales/bn/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: aheiSp3p8jAeuitdaqLZo3dT308= +SHA256-Digest: 9Vsyq9uAue2WTQYT5XQHrYpGdKZJfCF+IqoF9TVAQAU= + +Name: _locales/de/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: bBd+cBjMldYHejGLdqlI1ghPF6w= +SHA256-Digest: 6nBep39cpu7kriVH1Iq47CSBFtdWuszQhgomkV6a38A= + +Name: _locales/fi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: TbfvyORF1Vh8/mZ44MCx8BKvXzc= +SHA256-Digest: mI7Z2IUVrqZ0++/DM4wrroMnAa3Dib0QXyYVwwNks4I= + +Name: _locales/te/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 3Rki5KX7yMYuiKgRs93NeHgA1oA= +SHA256-Digest: EmCKUO1VpU9TjEkdmqNrksgLvTqjoaucYaCi3nerU0A= + +Name: _locales/hu/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: V9mzvb5XV6gWsKF6v6TOVUMDeVk= +SHA256-Digest: 6NjId1+tQ0U2arVKVv2lsMzeLKBcyCCAI4rh9QVD4tA= + +Name: _locales/nl/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 4W0dL6o4kNrixr+FAArFUy0PhOo= +SHA256-Digest: xmubqMxt3YvHFurfunk/e95etfSaJ5iGdlUwW0kdb+c= + +Name: _locales/ta/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Xhw5cy2Tc/mLWuawfnjw53q0byU= +SHA256-Digest: cgpc2+C94ZOrI5S8NnbXEvzqaEkxMhVgWzdI0IiB/FI= + +Name: _locales/it/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: oS8hr2e9/+BofpuCw532u5SmyCI= +SHA256-Digest: pjRnn95sQ3p3A1m7lrG5VoqPGthpzzpiGhRDXMLWI7U= + +Name: _locales/zh_TW/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: Z1h+IBEp+T1+hg2gICZokHIDNRU= +SHA256-Digest: 2N3xs5PClgoBvaR5Ewrp/h5IAgze99DVx+tAXOOp6nk= + +Name: _locales/sr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: PfpYZ3Ajt8R4T47eIdmxXkwWJBw= +SHA256-Digest: +/zA3apTQzUfn5T0IQXtNlXh7yR40r6LSnJcqSg9Hdk= + +Name: _locales/pt_PT/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: sEnovyjIxUraIqqHi6Kig4Sq8YI= +SHA256-Digest: RdFk9dkh51Psq1/S6N7ceU3e58uuM04VYR651wURyLM= + +Name: _locales/sv/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: JndOj2/+EUfJWhaDooCTOZdZWm8= +SHA256-Digest: bHRuZsaTvJNT34KS/TSrssQSdbjMsdj4shKeN87FBxw= + +Name: _locales/en/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: kATFehXJI0Bn6RHWmGoIbzBcqZY= +SHA256-Digest: dDxU9bzutaIiRm2npyg2lYKsrtXJB6p7r5/P8IJC12I= + +Name: _locales/uk/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: E+Hkao9HINT0wc/IV/LErjd/uII= +SHA256-Digest: 2tbD7+KECUr0Q10YOCo9DYLMpCcwdZc4v+0FlG9yY08= + +Name: _locales/fil/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: K2BAoatvsnYWkUo3rcyvl306DxY= +SHA256-Digest: HCjv08o4kMI1L64L1a7PVLfJkr6F8eCX8itJFECKyNw= + +Name: _locales/sk/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 1q3mDDQVJrSIMf+p/nlkUGX/+ks= +SHA256-Digest: ip3Qfi250rS6AfwJGW88YlaEt6V17retf+Nf/nYloCA= + +Name: _locales/vi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: deRB9IrZe0b6fg5onHHmDYYB43g= +SHA256-Digest: GnGGqTT9ra72yzW9bE7Oci1B8RzSyFOMx+jfRNutkyY= + +Name: _locales/ro/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: 61r4lIwsUVeR2WFpKESdte3AOcw= +SHA256-Digest: ifReD0RFZQp02dCISjLVSAYK0t3MiopfcrD7J8+u3ig= + +Name: _locales/el/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: j+NTJ0c7xwJdArCdRszBzgRIOwQ= +SHA256-Digest: t3PJunoxka9HOmhNjvgzww43ohHCiHyu4nqzGkk0Ir0= + +Name: _locales/et/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: hP95NYOweyZK86V28vMcrK14WeU= +SHA256-Digest: XWZyZ1gBbpQdJiCOEMRqzDnxa/a05ncRoCHogoCKZO0= + +Name: _locales/ca/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: rHGVtBuxNOdV+QNorLt4XTtTGyU= +SHA256-Digest: Rw2lMcq499K6cQmInlz2yjqfSn96rfprx7on80j0b2Q= + +Name: _locales/no/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: nyqG87gd708Glhgi4//HSYYNVWU= +SHA256-Digest: 3kSH2+rgKBjb52jLDJ/8leX3eou9X3acnstTodOmOnU= + +Name: _locales/pt_BR/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: lGf8zhpf0bHZsk+wVj7oOCUgRO8= +SHA256-Digest: 4piBHOi7wJ4KrYqvD8e4ecrk14fXJrhkzD4pSIusI0k= + +Name: _locales/hr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gtIlROvuooa+lBq9UI0GPfnltbw= +SHA256-Digest: rs6FwPcsrJUHUH8NpTV3I/B5tL2rlLu1NqGWFtsSvhk= + +Name: _locales/id/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: b0GctXRheeT9Ro/2nuotsB8naC4= +SHA256-Digest: mNdGMx+2YYIn1TaUWNgB2ct+4q7A+oYARMDQe9V5O+E= + +Name: _locales/lv/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: qJHXpT2HW7sisLpuySnEghPQ6xo= +SHA256-Digest: h4LqD+NndZiby1l48TCFDtLPpT0wp3UvVZj9mcvS1EE= + +Name: _locales/hi/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: DsJpiBYlT9U8xz/h9HbAyNhLdsI= +SHA256-Digest: NV12rYGUyxYdgeq2rthzoBiw1dPfrL4Hgn4Ba9eIttA= + +Name: _locales/he/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ARg3Z+YK3BTGaZw79fmsiufo5kc= +SHA256-Digest: KUB38qgzDef/2+pY8KnyFTeRU0CzHB2GNTZ5LT1jgBs= + +Name: _locales/da/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: BwWEKdnxcpev6dfFXr7vx6/1cOI= +SHA256-Digest: Ht5uFJeDeZEW954I8E98Ky8hC7rVR1kliG+3BhvuaJA= + +Name: _locales/ko/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: YA1GxmGvRXBy5Rb9iRQGLWB5QiY= +SHA256-Digest: 2cUjyY0xC/XKt9iyFhikdO2tCU3lso6y1L4W/L/MEiU= + +Name: _locales/tr/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: fZhis2vpb+uJndgXXrxT5J4XUXk= +SHA256-Digest: 9JgsYfDvgw5nAm8N4FwF/aXk1ICOhZM/c+wnWbSHhv4= + +Name: _locales/ms/messages.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: HduCTE1RhQoclQaWqwlYAuAwpHE= +SHA256-Digest: TBP/XwFz4Vm53KrMQ3SfH3bwRlpGWc6hHibBCAE+OCU= + +Name: permissions/styles.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: ixF+PRLHr3DjiQBE0kDYqMMGN6A= +SHA256-Digest: RC2twhKbr1BYwJS1IorUPSBlv3WzlZPLxtZnX8lQnWk= + +Name: permissions/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: gNe1Rh7n4kZNY1bWTlHfxVQYew0= +SHA256-Digest: q64PreAGI6GyEzZ1f2y0X8GNEE3G139dRSGUlx0xOJ8= + +Name: oss-attribution/attribution.txt +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: LW6ymcibRp0v2RE2hxFWt0RLvoM= +SHA256-Digest: ZIA/Co9QGpQBg5OACGjp0+L978AGML0f2YTP1Z8UqgA= + +Name: help/styles.css +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: QkJ6RmMHdqcJvNZbm1G/v8cLh6s= +SHA256-Digest: 4B5jaGhEfOM0BNHb1je7Ce3WINlkKVEpBe6zqV6oeg0= + +Name: help/index.html +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: agDsE59x1EYsf8Yl5sbYFcxl2nQ= +SHA256-Digest: UpYzdaL4VXVbVlHi9HjpDo3FoLS1QrRjTle1pyXPQR8= + +Name: help/images/popup.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: y02T9cHW00OJUj8Uev8S9fKJNpk= +SHA256-Digest: 9lotN5clUitwAl4YyFEf8LQZ1mqmYHxo9KT0DLlNoPE= + +Name: help/images/submission menu.png +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: UYpwleQR2v29PGzgIB47vbKHYZM= +SHA256-Digest: LL7+CzF5sXxWIlKaK32kp25Arr0xykQbQP12Q5iimfE= + +Name: help/images/votebuttons.gif +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: p4t/3qlFQhFPPBvVOTppmLON+H8= +SHA256-Digest: LKc1UFg0FLDpIATSWwbxfMvkptajajp3GmVmjfus14M= + +Name: help/images/voting on notice.gif +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: +H8LiQ1wTfFbF9nhAYIQtg+WI1Y= +SHA256-Digest: njrfEQA/oZhf+adqglwK+kY83oqobNMjGSCHahgN3gA= + +Name: mozilla-recommendation.json +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: wQ0sN05RugG0UABc9M8SHADu1eg= +SHA256-Digest: yQXJzK18cbqXZIgHJ6tbkgku8a1oFaKh3Lcte8ldWU4= + +Name: META-INF/cose.manifest +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: aHhtOVXKDJGko2EljhAidQ2QaXA= +SHA256-Digest: pxEX8gM2ZzuQuZ4lat4wec/pFDJ61QzJTuH5IWeoUFg= + +Name: META-INF/cose.sig +Digest-Algorithms: SHA1 SHA256 +SHA1-Digest: AMbFOhW9I2iP3mo4HxgcUxxw6lo= +SHA256-Digest: /cPEf3mTeW9IFl5VlNV1QiMzev7hxjMWUTHAjeYG2H0= + diff --git a/data/extensions/sponsorBlocker@ajay.app/META-INF/mozilla.rsa b/data/extensions/sponsorBlocker@ajay.app/META-INF/mozilla.rsa Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/META-INF/mozilla.sf b/data/extensions/sponsorBlocker@ajay.app/META-INF/mozilla.sf @@ -0,0 +1,4 @@ +Signature-Version: 1.0 +SHA1-Digest-Manifest: f2YQDI70d8mKAt/cu6Nv/o5My/c= +SHA256-Digest-Manifest: ISnQkLFKZsx5KEmOWUNC07dQMfyZdHNmUuCOZFKD0og= + diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ar/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ar/messages.json @@ -0,0 +1 @@ +{"0":{"message":"انتهت مهلة الاتصال. تحقق من اتصالك بالإنترنت. إذا كان إتصالك بالإنترنت يعمل، قد يكون الخادم محمل أكثر من اللازم أو معطل حاليا."},"400":{"message":"قال الخادم أن هذا الطلب خاطئ"},"409":{"message":"تم تقديم هذا بالفعل من قبل"},"502":{"message":"يبدو أن الخادم محمَّل أكثر من اللازم. حاول مرة أخرى في بضع ثوان."},"fullName":{"message":"SponsorBlock لليوتيوب - تخطي الرعايات","description":"Name of the extension."},"Description":{"message":"تخطى الرعايات و التسول بالاشتراك و المزيد على فيديوهات اليوتيوب. بلغ عن الرعايات في الفيديوات التي تشاهدها لتوفير وقت الآخرين.","description":"Description of the extension."},"channelWhitelisted":{"message":"القناة في القائمة البيضاء!"},"Segment":{"message":"فقرة"},"Segments":{"message":"فقرة"},"SegmentsCap":{"message":"فقرات"},"Chapters":{"message":"الفصول"},"renderAsChapters":{"message":"عرض الفقرات كفصول","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"إظهار الفقرة الحالية الحالية بجانب وقت الفيديو"},"showAutogeneratedChapters":{"message":"إظهار الفصول التي تم إنشاؤها تلقائيا بواسطة يوتيوب"},"upvoteButtonInfo":{"message":"تصويت ايجابي على هذه المشاركة"},"reportButtonTitle":{"message":"إبلاغ"},"reportButtonInfo":{"message":"الإبلاغ عن هذه المشاركة كغير صحيحة."},"Dismiss":{"message":"إلغاء"},"Loading":{"message":"جاري التحميل..."},"Hide":{"message":"لا تظهر أبداً"},"hitGoBack":{"message":"قم الضغط على الرجوع في التخطي للوصول إلى المكان الذي أتيت منه."},"unskip":{"message":"الرجوع في التخطي"},"reskip":{"message":"اعاده التخطي"},"unmute":{"message":"إلغاء الكتم"},"paused":{"message":"متوقف مؤقتا"},"manualPaused":{"message":"تم إيقاف الموقت"},"confirmMSG":{"message":"لتحرير أو حذف قيم فردية، انقر زر المعلومات أو افتح مُنبثق الاضافة عن طريق النقر على أيقونة الإضافة في الزاوية اليمنى العليا."},"clearThis":{"message":"هل أنت متأكد أنك تريد حذف هذا؟\n\n"},"Unknown":{"message":"حدث خطأ في تقديم توقيت الرعاية، الرجاء المحاولة مرة أخرى لاحقاً."},"sponsorFound":{"message":"يحتوي هذا الفيديو على فقرات في قاعدة البيانات!"},"sponsor404":{"message":"لم يتم العثور على فقرات"},"sponsorStart":{"message":"بدأ الفقرة الآن"},"sponsorEnd":{"message":"انهاء الفقرة الآن"},"sponsorCancel":{"message":"إلغاء إنشاء الفقرة"},"noVideoID":{"message":"لم يتم العثور على فيديو يوتيوب.\nإذا كان هذا غير صحيح، قم بتحديث الصفحة."},"refreshSegments":{"message":"تحديث الفقرات"},"success":{"message":"تم بنجاح!"},"voted":{"message":"تم التصويت!"},"serverDown":{"message":"يبدو أن الخادم معطل. تواصل مع المطوّر على الفور."},"connectionError":{"message":"حدث خطأ في الاتصال. رمز الخطأ: "},"segmentsStillLoading":{"message":"لا تزل الفقرات قيد التحميل..."},"clearTimes":{"message":"مسح الفقرات"},"openPopup":{"message":"فتح نافذة SponsorBlock المنبثقة"},"closePopup":{"message":"إغلاق النافذة المنبثقة"},"closeIcon":{"message":"أيقونة الإغلاق"},"OpenSubmissionMenu":{"message":"قتح قائمة التقديم"},"sortSegments":{"message":"فرز الفقرات"},"submitCheck":{"message":"هل أنت متأكد أنك تريد إرسال هذا؟"},"whitelistChannel":{"message":"إضافة القناة إلى القائمة البيضاء"},"removeFromWhitelist":{"message":"إزالة القناة من القائمة البيضاء"},"voteOnTime":{"message":"صوّت لفقرة"},"Submissions":{"message":"المشاركات"},"savedPeopleFrom":{"message":"لقد وفّرت على الناس "},"viewLeaderboard":{"message":"المتصدرين"},"recordTimesDescription":{"message":"تقديم"},"submissionEditHint":{"message":"سيظهر تحرير القسم بعد النقر على تقديم","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"تلميح: يمكنك إعداد اختصارات مفاتيح للتقديم في الخيارات"},"clearTimesButton":{"message":"مسح الأوقات"},"Username":{"message":"اسم المستخدم"},"setUsername":{"message":"تعيين اسم مستخدم"},"copyPublicID":{"message":"نسخ معرف المستخدم العام"},"copySegmentID":{"message":"نسخ معرف الفقرة"},"unloopChapter":{"message":"إلغاء تكرار الفصل"},"hideThis":{"message":"إخفاء هذا"},"Options":{"message":"خيارات"},"showButtons":{"message":"إظهار الأزرار على مشغل اليوتيوب"},"hideButtonsDescription":{"message":"يخفي الأزرار التي تظهر على مشغل اليوتيوب لإرسال فقرات للتخطي."},"showSkipButton":{"message":"إبقاء زر \"تخطي للابراز\" على المشغّل"},"showInfoButton":{"message":"إظهار زر \"معلومات\" على مشغّل اليوتيوب"},"autoHideInfoButton":{"message":"إخفاء تلقائي لزر \"معلومات\""},"showDeleteButton":{"message":"إظهار زر \"حذف\" على مشغّل اليوتيوب"},"enableViewTracking":{"message":"تفعيل تتبع مرات التخطي"},"whatViewTracking":{"message":"تتعقب هذه المِيزة الفقرات التي تخطيتها للسماح للمستخدمين بمعرفة مقدار مساعدة مشاركاتهم للآخرين و تستخدم كمقياس جنبًا إلى جنب مع الأصوات الايجابية لضمان عدم وصول المشاركات الخاطئة إلى قاعدة البيانات. ترسل الإضافة رسالة للخادم كل مرة تتخطى فيها فقرة. نأمل ألا يغير معظم الناس هذا الاعداد بحيث تكون ارقام مرات العرض دقيقة. :)"},"enableViewTrackingInPrivate":{"message":"تفعيل تتبع مرات التخطي في علامات التبويب الخاصة / التصفح المتخفي"},"enableTrackDownvotes":{"message":"حفظ الأصوات السلبية للفقرات"},"whatTrackDownvotes":{"message":"أي فقرات قمت بالتصويت السلبي لها ستبقى مخفية حتى بعد تحديث الصفحة"},"trackDownvotesWarning":{"message":"تحذير: سيؤدي تعطيل هذا إلى حذف جميع الأصوات السلبية التي تم تخزينها مسبقًا"},"enableTrackDownvotesInPrivate":{"message":"حفظ الأصوات السلبية للفقرات التي تقدم في وضع التصفح المتخفي"},"enableQueryByHashPrefix":{"message":"الاستعلام عن طريق بادئة التجزئة"},"whatQueryByHashPrefix":{"message":"بدلاً من طلب الفقرات من الخادم باستخدام معرف الفيديو ، يتم إرسال الأحرف الأربعة الأولى من تجزئة معرف الفيديو. سيرسل هذا الخادم بالمقابل بينات كل الفيديوهات بتجزئات مشابهة."},"enableShowCategoryWithoutPermission":{"message":"إظهار الفئات في قائمة التقديم حتى دون إذن التقديم"},"whatShowCategoryWithoutPermission":{"message":"تحتاج بعض الفئات إلى إذن لتقديمها بسبب الحد الأدنى من متطلبات السمعة"},"showNotice":{"message":"إظهار الإشعار مرة أخرى"},"showSkipNotice":{"message":"إظهار إشعار بعد تخطي فقرة ما"},"showUpcomingNotice":{"message":"إظهار إشعار قبل أن يبدأ الجزء"},"showCategoryGuidelines":{"message":"إظهار مساعدة الفئة"},"noticeVisibilityMode0":{"message":"الحجم الكامل لإشعارات التخطي"},"noticeVisibilityMode1":{"message":"إشعارات تخطي صغيرة للتخطي التلقائي"},"noticeVisibilityMode2":{"message":"حجم صغير لإشعارات التخطي"},"noticeVisibilityMode3":{"message":"إشعارات تخطي متلاشية للتخطي التلقائي"},"noticeVisibilityMode4":{"message":"إشعارات تخطي متلاشية"},"longDescription":{"message":"يتيح لك SponsorBlock تخطي الرعايات و المقدمات و المؤخرات و التذكيرات بالاشتراك و اجزاء أخرى مزعجة من فيديوهات اليوتيوب. SponsorBlock إضافة متصفح مصدّرة جماعيا يتيح لأي احد بتقديم أوقات البدء و الانتهاء للفقرات المرعية و فقرات اخرى من فيديوهات اليوتيوب. و بمجرد أن يقدم شخص واحد هذه المعلونات سيتخطى كل شخص آخر مع هذه الإضافة الفقرة المرعية. بالامكان أيضا تخطي الأجزاء الغير موسيقية من فيديوات الموسيقى.","description":"Full description of the extension on the store pages."},"website":{"message":"موقع الويب","description":"Used on Firefox Store Page"},"sourceCode":{"message":"الشفرة المصدرية","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"تم تحديث الإشعار!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"اذا كانت لا تزال تزعجك، اضغط على زر لا تظهر أبداً.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"تخطي الفقرة","description":"Keybind label"},"setStartSponsorShortcut":{"message":"بدء/إيقاف الفقرة","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"قتح قائمة التقديم","description":"Keybind label"},"setSubmitKeybind":{"message":"تقديم الفقرات","description":"Keybind label"},"setPreviewKeybind":{"message":"معاينة الفقرة","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"إغلاق إشعار التخطي","description":"Keybind label"},"nextChapterKeybind":{"message":"الفصل التالي","description":"Keybind label"},"previousChapterKeybind":{"message":"الفصل السابق","description":"Keybind label"},"enableDeArrowKey":{"message":"مفتاح تفعيل DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"قتح قائمة التقديم","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"حدد مفتاح عن طريق كتابته واختار أي \"مفاتيح تعديل\" ترغب في استخدامها."},"disableSkipping":{"message":"التخطي مفعل"},"enableSkipping":{"message":"التخطي معطل"},"yourWork":{"message":"عملك","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"رمز الخطأ: "},"skip":{"message":"تخطي"},"mute":{"message":"كتم"},"full":{"message":"الفيديو كامل","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"تخطي {0}؟"},"mute_category":{"message":"كتم {0}؟"},"skip_to_category":{"message":"تخطي إلى {0}؟","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"{0} قادم","description":"Example: Upcoming Sponsor"},"skipped":{"message":"تم تخطي {0}","description":"Example: Sponsor Skipped"},"muted":{"message":"تم كتم {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"تم التخطي إلى {0}","description":"Used for skipping to things (Skipped to Highlight)"},"disableAutoSkip":{"message":"تعطيل التخطي التلقائي"},"enableAutoSkip":{"message":"تفعيل التخطي التلقائي"},"audioNotification":{"message":"إشعار صوتي عند التخطي"},"audioNotificationDescription":{"message":"إشعار صوتي عند التخطي سيشغّل صوت كلما يتم تخطي فقرة ما. إن كان معطل (أو التخطي التلقائي معطل) لن يتم تشغيل صوت."},"showTimeWithSkips":{"message":"أظهر مدة الفيديو من دون الفقرات المتخطية"},"showTimeWithSkipsDescription":{"message":"هذه المدة ستظهر بين قوسين بجانب الوقت الحالي أسفل شريط التمرير. يظهر مجموع مدة الفيديو مطروح من أي فقرات. يشمل الفقرات المحددة فقط على أنها \"إظهار في شريط التمرير\"."},"youHaveSkipped":{"message":"قمت بتخطي "},"minLower":{"message":"دقيقة"},"minsLower":{"message":"دقائق"},"hourLower":{"message":"ساعة"},"hoursLower":{"message":"ساعات"},"youHaveSavedTime":{"message":"لقد وفّرت على الناس","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" من حياتهم","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"تحقق من status.sponsor.ajay.app لمعرفة حالة الخادم."},"changeUserID":{"message":"استيراد/تصدير معرف المستخدم السري الخاص بك"},"whatChangeUserID":{"message":"يجب أن يبقى سريًا فهو مثل كلمة المرور ولا ينبغي مشاركته مع أي شخص. إذا كان بحوزة شخص ما، فيمكنه انتحال شخصيتك. إذا كنت تبحث عن معرف المستخدم العام الخاص بك، انقر فوق أيقونة الحافظة في المنبثق."},"setUserID":{"message":"تعيين معرف المستخدم السري"},"userIDChangeWarning":{"message":"تحذير: تغيير معرف المستخدم السري دائم. هل أنت متأكد من رغبتك في القيام بذلك؟ تأكد من تحضير نسخة احتياطية للمعرف القديم تحسبا."},"createdBy":{"message":"أنشئت من قِبل"},"supportOtherSites":{"message":"دعم مواقع يوتيوب الطرف الثالث"},"supportOtherSitesDescription":{"message":"دعم منصات يوتيوب الطرف ثالث. لتمكين الدعم، يجب عليك قبول التصاريح الإضافية.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"المواقع المدعومة: "},"optionsInfo":{"message":"تفعيل دعم Invidious، تعطيل التخطي التلقائي، إخفاء الأزرار و المزيد."},"addInvidiousInstance":{"message":"إضافة حالة لمنصة يوتيوب طرف ثالث"},"addInvidiousInstanceDescription":{"message":"اضافة حالة خاصة. يجب ان يحتوي على المجال فقط. مثال: invidious.ajay.app"},"add":{"message":"أضِف"},"addInvidiousInstanceError":{"message":"هذا مجال غير صالح. يجب ان يحتوي على جزء المجال فقط. مثال: invidious.ajay.app"},"resetInvidiousInstance":{"message":"إعادة تعيين قائمة حالات Invidious"},"resetInvidiousInstanceAlert":{"message":"أنت على وشك إعادة تعيين قائمة حالات Invidious"},"invidiousDisabledSafari":{"message":"دعم انفيديوس (Invidious) غير متوفر على متصفح \"سفاري\" حاليًا بسبب خطأ برمجي في سفاري. حينما تقوم أبل بإصلاح الخطأ, سيتم إضافته مرة أخرى"},"currentInstances":{"message":"الحالات الحالية:"},"minDuration":{"message":"المدة الدنيا (ثوان):"},"minDurationDescription":{"message":"الاقسام الاصغر من القيمة المحددة لن يتم تخطيها ولا عرضها في المشغل."},"enableManualSkipOnFullVideo":{"message":"استخدام التخطي اليدوي عند وجود وسم للفيديو باكمله"},"whatManualSkipOnFullVideo":{"message":"للاشخاص الراغبين بمشاهدة الفيديو دون انقطاع اذا كان مُرعى بالكامل أو دعاية شخصية."},"skipNoticeDuration":{"message":"مدة اشعار التخطي (ثوان):"},"skipNoticeDurationDescription":{"message":"سيبقى اشعار التخطي على الشاشة للمدة المحددة على الأقل. للتخطي اليدوي، قد يكون مرئيًا لفترة أطول."},"shortCheck":{"message":"التقديم التالي أقصر من مدة التقديم الأدنى المحددة. قد يعني هذا أن التقديم قد يكون موجود بالفعل ولكن يتم تجاهله بسبب هذا الخيار. هل أنت متأكد من رغبتك في التقديم؟"},"liveOrPremiere":{"message":"لا يسمح بالتقديم على بث مباشر أو بث العرض الأولي للفيديو. الرجاء الانتظار حتى ينتهي، ثم قم بتحديث الصفحة و تحقق أن الفقرات لا تزال صالحة."},"showUploadButton":{"message":"إظهار زر الرفع"},"customServerAddress":{"message":"عنوان خادم SponsorBlock"},"customServerAddressDescription":{"message":"العنوان الذي يستعمله SponsorBlock لاجراء اتصالات للخادم.\nإلا إذا كان لديك حالة خادم خاصة بك، لا ينبغي تغيير هذا."},"dataFetchingServerAddress":{"message":"عنوان خادم جلب البينات"},"dataFetchingServerAddressDescription":{"message":"العنوان المستخدم لاجراء اتصالات لخادم جلب البينات.\nإلا إذا كان لديك حالة خادم خاصة بك، لا ينبغي تغيير هذا."},"thumbnailCacheServerAddress":{"message":"عنوان خادم تخزين الصور المصغرة"},"save":{"message":"حفظ"},"reset":{"message":"إعادة تعيين"},"customAddressError":{"message":"هذا العنوان ليس في الشكل الصحيح. تأكد من أن لديك http:// أو https:// في البداية و عدم تواجد شريط مائل في النهاية."},"areYouSureReset":{"message":"هل أنت متيقِّن من رغبتك في إعادة تعيين هذا؟"},"mobileUpdateInfo":{"message":"m.youtube.com مدعوم الآن"},"exportOptions":{"message":"إستيراد/تصدير جميع الإعدادات"},"exportOtherData":{"message":"استيراد/تصدير جميع البيانات الأخرى"},"exportOptionsCopy":{"message":"تعديل/نسخ"},"exportOptionsDownload":{"message":"حفظ إلى ملف"},"exportOptionsUpload":{"message":"تحميل من ملف"},"whatExportOptions":{"message":"هذا هو كامل إعداداتك في صيغة JSON. يشمل معرف المستخدم السري الخاص بك، لذا تأكد من مشاركته بحكمة."},"setOptions":{"message":"تعيين الخيارات"},"exportOptionsWarning":{"message":"تحذير: تغيير الخيارات دائم و قد يخرب تثبيتك. هل أنت متأكد من رغبتك في القيام بهذا؟ تأكد من النسخ الاحتياطي للتثبيت القديم تحسبا."},"incorrectlyFormattedOptions":{"message":"لم يتم تنسيق JSON بشكل صحيح. لم يتم تغيير الخيارات الخاصة بك."},"confirmNoticeTitle":{"message":"تقديم الفقرة"},"submit":{"message":"تقديم"},"cancel":{"message":"إلغاء"},"delete":{"message":"حذف"},"preview":{"message":"معاينة"},"unsubmitted":{"message":"غير مقَدَّمة"},"inspect":{"message":"فحص"},"edit":{"message":"تعديل"},"copyDebugLogs":{"message":"نسخ سجلات التصحيح"},"copyDebugInformation":{"message":"نسخ معلومات التشخيص إلى الحافظة"},"copyDebugInformationFailed":{"message":"فشل النسخ إلى الحافظة"},"copyDebugInformationOptions":{"message":"ينسخ المعلومات إلى الحافظة لتقديمها إلى المطور عند تبليغ خلل / عندما يطلب المطور ذلك. تم إزالة معلومات حساسة مثل معرف مستخدمك السري و قنوات القائمة البيضاء وعنوان الخادم المخصص. غير أنه يحتوي على معلومات مثل المستخدم الخاص بك و المتصفح و نظام التشغيل و رقم اصدار الإضافة. "},"copyDebugInformationComplete":{"message":"تم نسخ معلومات التشخيص إلى الحافظة. لا تتردد في إزالة أي معلومات تفضل عدم مشاركتها. إحفظه في ملف نصي أو الصقه في تقرير الخلل البرمجي."},"keyAlreadyUsed":{"message":"هذا الاختصار مرتبط بإجراء آخر. الرجاء تحديد إجراء مختلف."},"to":{"message":"إلى","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"تم النسخ!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"يتضمن الانتقالات"},"generic_guideline2":{"message":"يجب أن يستمر الفيديو كأنما لم يتم تخطي شيئا"},"category_sponsor":{"message":"رعاية"},"category_sponsor_description":{"message":"الدعايات المدفوعة و التوصيات المدفوعة و الإعلانات المباشرة. ليس للدعاية الذاتية أو اعلانات مجانية لأسباب انسانية/مبدعين/مواقع/منتجات يحبونها."},"category_sponsor_guideline1":{"message":"دعايات مدفوعة"},"category_sponsor_guideline2":{"message":"ليس للتبرعات أو منتجات صانع المحتوى"},"category_selfpromo":{"message":"دعاية غير مدفوعة/ذاتية"},"category_selfpromo_description":{"message":"شبيه بـ \"رعاية\" ولكنها دعاية ذاتية او غير مدفوعة. يشمل منتجات صانع المحتوى أو تبرعات او معلومات حول من تعاونوا معهم."},"category_selfpromo_guideline1":{"message":"التبرعات و العضوية و منتجات صانع المحتوى"},"category_selfpromo_guideline2":{"message":"تصريحات شكر مجانية التي لا تضيف إلى الفيديو"},"category_selfpromo_guideline3":{"message":"ليس للمنتجات المصممة من شركات"},"category_exclusive_access":{"message":"وصول حصري"},"category_exclusive_access_description":{"message":"فقط لتوسيم مقاطع فيديو بِرُمَّتها. تستخدم عند عرض الفيديو منتج أو خدمة أو موقع حصلوا عليه مجانا أو بثمن مخفف."},"category_exclusive_access_pill":{"message":"هذا الفيديو يعرض منتج أو خدمة أو موقع حصل صانع المحتوى عليه مجانا أو بثمن مخفف","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"الفيديو برمّته يعرض شيء حصل صانع المحتوى عليه مجانا أو بثمن مخفف"},"category_interaction":{"message":"التذكير بالتفاعل (الاشتراك)"},"category_interaction_description":{"message":"عند وجود تذكار قصير للاشتراك أو المتابعة في منتصف محتوى. إذا كان طويل أو حول شيء محدد، ينبغي أن يكون تحت الدعاية الذاتية."},"category_interaction_guideline1":{"message":"تذكيرات قصيرة بالإعجاب أو الاشتراك أو المتابعة"},"category_interaction_guideline2":{"message":"يتضمن تذكيرات غير مباشرة بالتعليق"},"category_interaction_guideline3":{"message":"ليس للترويج بشكل عام و انما فقط نداءات لفعل"},"category_interaction_short":{"message":"تذكير بالتفاعل"},"category_intro":{"message":"انترو"},"category_intro_description":{"message":"فاصل زمني بدون محتوى فعلي. يمكن أن يكون توقفًا مؤقتًا أو إطارًا ثابتًا أو رسوم متحركة متكررة. لا يتضمن انتقالات تحتوي على معلومات."},"category_intro_short":{"message":"انترو"},"category_intro_guideline1":{"message":"فاصل زمني بدون محتوى فعلي"},"category_intro_guideline2":{"message":"ليس للانتقالات التي تحتوي على معلومات"},"category_outro":{"message":"شاشات نهاية/الشكر و التقدير"},"category_outro_description":{"message":"لائحة الشكر و التقدير أو عند ظهور شاشات النهاية. ليس للاستنتاجات مع معلومات."},"category_outro_guideline1":{"message":"لا تضم محتوى، حتى إذا كانت شاشات النهاية على الشاشة"},"category_preview_description":{"message":"مجموعة من اللقطات تُظهر ما هو قادم في هذا الفيديو او في فيديوهات اخرى في سلسلة حيث كل المعلومة مكررة لاحقا في الفيديو."},"category_preview_guideline1":{"message":"لقطات تظهر لاحقا في الفيديو او في فيديوهات مستقبلية"},"category_preview_guideline2":{"message":"تلخيص فيديو سابق"},"category_preview_guideline3":{"message":"ليس للأقسام التي تضيف محتوى إضافي"},"category_filler_guideline2":{"message":"تلهيات، خلف الكواليس، إعادة عرض مشاهد سابقة"},"category_filler_guideline3":{"message":"ليس للمشاهد الضرورية لفهم الموضوع"},"category_music_offtopic":{"message":"الموسيقى: مقطع لا موسيقي"},"category_music_offtopic_description":{"message":"فقط للاستخدام في الفيديوات الموسيقية. يجب استعماله فقط لأجزاء من الفيديو الموسيقي التي ليست مغطات بفئة اخرى."},"category_music_offtopic_short":{"message":"غير موسيقي"},"category_music_offtopic_guideline1":{"message":"الأجزاء الغير واردة في الاصدارات الرسمية"},"category_music_offtopic_guideline2":{"message":"الأجزاء الغير موسيقية من العروض الحية"},"category_poi_highlight":{"message":"ابراز"},"category_poi_highlight_description":{"message":"الجزء من الفيديو الذي يبحث عنه معظم الناس. على غرار تعليقات \"الفيديو يبدأ عند س\"."},"category_poi_highlight_guideline1":{"message":"الجزء من الفيديو الذي يبحث عنه معظم الناس"},"category_poi_highlight_guideline2":{"message":"يمكن تخطي السياق"},"category_poi_highlight_guideline3":{"message":"يمكن التخطي إلى عنوان المقطع أو الصورة المصغرة"},"category_chapter":{"message":"فصل"},"category_chapter_description":{"message":"فصول بأسماء مخصصة تصف اجزاء كبرى من فيديو."},"category_chapter_guideline1":{"message":"لا تذكر أسماء العلامة التجارية الراعية"},"category_chapter_guideline2":{"message":"استخدم فصول أكبر للأقسام العامة"},"category_chapter_guideline3":{"message":"يمكن وضع فصول صغيرة داخل فصول أكبر"},"category_livestream_messages":{"message":"بث مباشر: قراءة التبرعات/الرسائل"},"category_livestream_messages_short":{"message":"قراءة الرسائل"},"autoSkip":{"message":"تخطي تلقائي"},"manualSkip":{"message":"تخطي يدوي"},"showOverlay":{"message":"إظهار في شريط التمرير"},"disable":{"message":"تعطيل"},"autoSkip_POI":{"message":"تخطي تلقائي الى البداية"},"manualSkip_POI":{"message":"اسأل عند تحميل الفيديو"},"showOverlay_POI":{"message":"إظهار في شريط التمرير"},"showOverlay_full":{"message":"إظهار الوسم"},"showOverlay_chapter":{"message":"عرض الفصول"},"autoSkipOnMusicVideos":{"message":"تخطي جميع الفقرات تلقائياً عندما يكون هناك فقرة لا موسيقية"},"muteSegments":{"message":"السماح بالفقرات التي تكتم الصوت بدلاً من التخطي"},"fullVideoSegments":{"message":"إظهار أيقونة عندما يكون الفيديو بالكامل اعلان","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"إظهار الوسوم على الصور المصغرة للفيديوهات أيضا","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"لون غير مقَدَّم","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"لون شريط التمرير"},"category":{"message":"الفئة"},"skipOption":{"message":"خيار التخطي","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"تمكين الخادم التجريبي"},"whatEnableTestingServer":{"message":"مساهماتك و أصواتك لن تحسب في الخادم الرئيسي. استخدم هذا الخيار فقط للاختبار."},"testingServerWarning":{"message":"لن تحسب كل مساهماتك و أصواتك في الخادم الرئيسي حين اتصالك بالخادم التجريبي. تأكد من تعطيل هذا الخيار عندما ترغب في تقديم مساهمات حقيقية."},"bracketNow":{"message":"(الآن)"},"moreCategories":{"message":"المزيد من الفئات"},"chooseACategory":{"message":"اختر فئة"},"enableThisCategoryFirst":{"message":"لتقديم فقرات مع الفئة \"{0}\"، يوجب تفعيلها في الخيارات. سيتم تحويلك الى الخيارات فورا.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"تحذير: هذا النوع من الفقرة يمكن فقط ان يكون واحد منه فعال في آن واحد كحد اقصى. تقديم عدة سيؤدي الى عرض واحد عشوائي منهم."},"youMustSelectACategory":{"message":"يوجب تحديد فئة لكل الفقرات المنبغي تقديمها!"},"bracketStart":{"message":"(البداية)"},"bracketEnd":{"message":"(النهاية)"},"End":{"message":"النهاية","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"مخفي: تصويت سلبي"},"hiddenDueToDuration":{"message":"مخفي: قصير جداً"},"manuallyHidden":{"message":"مخفي يدوياً"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"لم يتم تحميل معرف القناة بعد. إذا كنت تستخدم \"فيديو مضمن\"، حاول استخدام الصفحة الرئيسية على اليوتيوب بدلاً منه. قد يكون السبب في ذلك أيضًا تغييرات في واجهة اليوتيوب، إذا كنت تعتقد ذلك، قم بتقديم تعليق هنا:"},"invidiousPermissionRefresh":{"message":"قام المتصفح بإلغاء التصاريح المطلوبة للعمل على Invidious وغيرها من مواقع الطرف الثالث. الرجاء النقر على الزر أدناه لإعادة تنشيط هذا التصريح."},"acceptPermission":{"message":"قَبُول الإذن"},"permissionRequestSuccess":{"message":"نجح طلب الإذن!"},"permissionRequestFailed":{"message":"فشل طلب الإذن ، هل نقرت على رفض؟"},"adblockerIssueWhitelist":{"message":"إذا كنت غير قادر على حل هذا، عطل إعداد \"اجبار التحقق من القناة قبل التخطي\"، لأن SponsorBlock غير قادر على استرداد معلومات القناة لهذا الفيديو"},"forceChannelCheck":{"message":"اجبار التحقق من القناة قبل التخطي"},"whatForceChannelCheck":{"message":"افتراضيا، سيتم تخطي الفقرات مباشرة حتى قبل التعرف على القناة. افتراضيا، قد يتم تخطي بعض الفقرات في بداية الفيديو على القنواة في اللائحة البيضاء. تفعيل هذا الخيار سيوقف ذلك لكن يجعل كل التخطيات لها تأخير طفيف حيث أن الحصول على معرف القناة قد يستغرق بعض الوقت. قد يكون هذا التأخير غير ملحوظ إذا كان لديك إنترنت سريع."},"forceChannelCheckPopup":{"message":"حاول تفعيل \"اجبار التحقق من القناة قبل التخطي\""},"downvoteDescription":{"message":"خاطئ/توقيت غير صحيح"},"incorrectVote":{"message":"غير صحيح"},"harmfulVote":{"message":"ضار","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"تغيير الفئة"},"nonMusicCategoryOnMusic":{"message":"هذا الفيديو مصنف كموسيقى. هل أنت متأكد من وجود رعاية؟ إن كانت هذه بالفعل \"فقرة لا موسيقية\"، قم بفتح خيارات الإضافة و فعّل هذه الفئة. ثم يمكنك تقديم هذه الفقرة كـ \"لا موسيقي\" بدلاً من رعاية. يرجى قراءة المبادئ التوجيهية إن كنت محتار."},"multipleSegments":{"message":"فقرات متعددة"},"guidelines":{"message":"الإرشادات"},"readTheGuidelines":{"message":"اقرأ الإرشادات!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"الفئات هنا!"},"categoryUpdate2":{"message":"افتح الخيارات لتخطي المقدمات و المؤخرات و ترويج المنتجات إلخ."},"help":{"message":"المساعدة"},"GotIt":{"message":"فهمت","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"هذاه الفقرة كبيرة. إذا كان الفيديو كله حول موضوع واحد، فغيير من \"تخطي\" إلى \"الفيديو كامل\". راجع الإرشادات لمزيد من المعلومات."},"categoryPillTitleText":{"message":"تم توسيم الفيديو برمّته بهذه الفئة و لا يمكن تفصيله لكونه كثير التكامل ببعضه"},"chapterNameTooltipWarning":{"message":"أحد أسماء الفصول مشابهة لفئة. يجب استخدام الفئات عند الإمكان بدلاً من الفصول."},"experiementOptOut":{"message":"الانسحاب من جميع التجارب المستقبلية","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"إخفاء للأبد"},"warningChatInfo":{"message":"لاحظنا أنك ترتكب بعض الأخطاء الشائعة. نحن نقدّر عملك حتى الآن، ولكننا نسعى جاهدين نحو الكمال، فحتى الأخطاء الصغيرة جدا مهمة :)"},"questionButton":{"message":"لدي سؤال"},"askAQuestion":{"message":"اطرح سؤالًا"},"warningConfirmButton":{"message":"أنا أفهم السبب"},"warningError":{"message":"خطأ عند محاولة الإقرار بالتحذير:"},"deArrowMessageRecieved":{"message":"لقد تلقيت نصيحة من مشرف"},"Donate":{"message":"تبرع"},"considerDonating":{"message":"ساعد في تمويل التطوير"},"hideDonationLink":{"message":"إخفاء رابط التبرع"},"darkModeOptionsPage":{"message":"الوضع الداكن في صفحة الخيارات"},"helpPageThanksForInstalling":{"message":"شكرا على تثبيت SponsorBlock."},"helpPageReviewOptions":{"message":"يرجى مراجعة الخيارات أدناه"},"helpPageFeatureDisclaimer":{"message":"العديد من الميزات معطلة افتراضيا. إذا كنت ترغب في تخطي المقدمات أو المؤخرات أو استخدام Invidious أو إلخ.، يمكنك تفعيل هذه الميزات في الأسفل. يمكنك أيضًا إخفاء/إظهار عناصر واجهة المستخدم."},"helpPageHowSkippingWorks2":{"message":"كلما تتخطى فقرة، ستحصل على إشعار. إذا بدا التوقيت خاطئا بإمكانك التصويت سلبيا عبر ضغط زر التصويت السلبي! يمكنك أيضا التصويت في المنبثق."},"Submitting":{"message":"تقديم"},"helpPageCopyOfDatabase2":{"message":"الشفرة المصدرية متاحة بحرية. لذلك، في حالت حدوث شيء لي فلن تذهب مساهماتك بلا جدوى."},"Credits":{"message":"الشكر و التقدير"},"LearnMore":{"message":"معرفة المزيد"},"FullDetails":{"message":"التفاصيل الكاملة"},"CopyDownvoteButtonInfo":{"message":"تصوِّت سلبيا و تنشئ نسخة محلية لك لتعيد تقديمها"},"OpenCategoryWikiPage":{"message":"افتح صفحة ويكي لهذه الفئة."},"CopyAndDownvote":{"message":"نسخ وتصويت معارض"},"ContinueVoting":{"message":"المتابعة بالتصويت"},"ChangeCategoryTooltip":{"message":"سيتم تطبيق هذا فورا على فقراتك"},"downvote":{"message":"تصويت سلبي"},"upvote":{"message":"تصويت إيجابي"},"hideSegment":{"message":"إخفاء الفقرة"},"skipSegment":{"message":"تخطي الفقرة"},"playChapter":{"message":"تشغيل الفصل"},"SponsorTimeEditScrollNewFeature":{"message":"استخدم عجلة الفأرة أثناء التمرير فوق مربع التعديل لضبط الوقت بسرعة. يمكن استخدام مجموعات مفتاح ctrl أو shift للضبط بدقة."},"categoryPillNewFeature":{"message":"جديد! معرفة اذا كان الفيديو برمَّته مَرعي أو دعاية ذاتية"},"yearAbbreviation":{"message":"س","description":"100y"},"dayAbbreviation":{"message":"ي","description":"100d"},"hourAbbreviation":{"message":"س","description":"100h"},"optionsTabBehavior":{"message":"سلوك","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"واجهه المستخدم","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"اختصارات لوحة المفاتيح","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"النسخ الاحتياطي/الاستعادة","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"متنوع","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"مظهر إشعار التخطي","description":"Option label"},"unbind":{"message":"إلغاء ربط","description":"Unbind keyboard shortcut"},"notSet":{"message":"لم يتم التعيين"},"change":{"message":"تغيير"},"youtubeKeybindWarning":{"message":"هذا اختصار يوتيوب مدمج. هل أنت متأكد أنك تريد استخدامه؟"},"betaServerWarning":{"message":"الخادم التجريبي مفعّل!"},"openOptionsPage":{"message":"فتح صفحة الخيارات"},"resetToDefault":{"message":"إعادة تعيين الإعدادات"},"confirmResetToDefault":{"message":"هل أنت متأكد من أنك تريد إعادة تعيين كافة الإعدادات إلى حالتها الافتراضية؟ لا يمكنك التراجع عن ذلك."},"exportSegments":{"message":"تصدير الفقرات"},"importSegments":{"message":"استيراد الفقرات"},"Import":{"message":"استيراد","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"تم الاستبدال بنجاح!"},"redeemFailed":{"message":"مفتاح الترخيص غير صالح"},"hideUpsells":{"message":"إخفاء الخيارات غير المتاحة بدون دفع إضافي"},"hideNewFeatureUpdates":{"message":"إخفاء التنبيهات حول الميزات الجديدة"},"redeem":{"message":"استبدال"},"enterLicenseKey":{"message":"أدخل مفتاح الرّخصة"},"unsubmittedSegmentCounts":{"message":"لديك حاليا {0} على {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"ليس لديك حاليا أي فقرة غير مقدَّمة","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"فقرات غير مقدَّمة","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"فقرة غير مقدَّمة","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"فيديوهات","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"فيديو","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"مسح جميع الفقرات","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"هل أنت متأكد من أنك تريد مسح جميع الفقرات غير المقدَّمة؟","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"اظهار الفقرات","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"إخفاء الفقرات","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"معرف الفيديو","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"عدد الفقرات","description":"Header of the unsubmitted segments list"},"actions":{"message":"قائمة الأوامر","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"شارك كرابط"},"segmentFetchFailureWarning":{"message":"تحذير: الخادم لم يجيب مع الفقرات بعد. قد تكون هناك في الواقع فقرات على هذا الفيديو تم تقديمها مسبقاً لكنك لم تستلمها بسبب مشاكل مع الخادم."},"allowScrollingToEdit":{"message":"السماح بالتمرير لتعديل الأوقات"},"NoticeTimeAfterSkip":{"message":"{seconds} ثانية","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - عناوين وصور مصغرة أفضل على اليوتيوب","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"استخدام عناوين و صور مصغرة من تقديم مساهمين لتكون وصفية و غير عاطفية","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"إختر الاكثر وصفية"},"Original":{"message":"الأصلي"},"OriginalTitle":{"message":"العنوان الأصلي"},"CurrentTime":{"message":"الوقت الحالي"},"resetCustomTitle":{"message":"إعادة تعيين العنوان إلى النص الأصلي"},"resetIcon":{"message":"إعادة ضبط الأيقونة"},"TypeYourOwnTitleHere":{"message":"اكتب عنوانك هنا"},"VideoNotReady":{"message":"الفيديو غير جاهز"},"FailedToRender":{"message":"فشلت المعالجة","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"الـcanvas مفقود","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"خطأ حين التحميل","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"فشل التحميل","description":"Thumbnail failed to load"},"titleFormatting":{"message":"تنسيق العنوان"},"Disabled":{"message":"معطَّل"},"CapitalizeWords":{"message":"تكبير الحرف الأول لكل كلمة"},"TitleCase":{"message":"نسق العنوان"},"SentenceCase":{"message":"تكبير الحرف الأول في الجملة"},"LowerCase":{"message":"أحرف صغيرة"},"FirstLetterUppercase":{"message":"تكبير الحرف الأول"},"shouldCleanEmojis":{"message":"ازالة الإيموجي"},"onlyTitleCaseInEnglish":{"message":"تكبير الحرف الأول لكل كلمة للعناوين غير الانكليزية"},"onlyTitleCaseInEnglishDescription":{"message":"خاصية الكشف عن اللغة غير مثالية و ترى بعض العناوين الانكليزية كغير انكليزية."},"thumbnailFallbackOption":{"message":"عند عدم وجود صورة مصغرة مقدَّمة"},"whatThumbnailFallbackOption":{"message":"عند تحديد وقت عشوائي، سوف تستخدم بيانات SponsorBlock لضمان عدم تحديد وقت اثناء فقرة اعلانية.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"إظهار لقطة شاشة من وقت عشوائي"},"TheOriginalThumbnail":{"message":"إظهار الصورة المصغرة الأصلية"},"showABlankBox":{"message":"إظهار مربع فارغ"},"AutoGenerated":{"message":"إظهار صورة مصغرة تم توليدها تلقائياً من اليوتيوب","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"البداية"},"Middle":{"message":"الوسط"},"keepUnsubmitted":{"message":"تخزين الأصوات المقدمة"},"showLiveCover":{"message":"إظهار الصورة الرمزية للقناة على الفيديوهات القادمة","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"عدم استخدام الصور المصغرة من ضمن اختبار أ-ب أبداً"},"ignoreAbThumbnailsDescription":{"message":"يمكن للقنوات اعداد اختبارات على فيديوهاتهم بحيث يُظهر اليوتيوب صور مصغرة مختلفة لكل شخص. سيستخدم هذا الخيار دائما الصورة المصغرة الاولى للحفاظ على الاتساق."},"abThumbnailsWarning":{"message":"تحذير: يجري هذا الفيديو حاليا اختبار أ-ب للصور المصغرة. هذا يعني أن الصورة المصغرة قد تتغير كثيرا. من الأفصل على الأغلب عدم التصويت للصورة المصغرة الأصلية بسبب هذا الخطر."},"whatKeepUnsubmitted":{"message":"حافظ على الأصوات المقدمة بعد التصويت لإظهار العناوين والصور المصغرة التي اخترتها بدلا من الأكثر تصويتا على الخادم."},"keepUnsubmittedInPrivate":{"message":"تخزين الأصوات المُقدَمة من علامات التبويب الخاصة"},"useThumbnailGenerationService":{"message":"استخدام خدمة توليد الصور المصغرة"},"titleMaxLines":{"message":"الحد الأقصى للأسطر للعنوان"},"titleMaxLinesDescription":{"message":"سوف توزع عناوين الفيديوهات هكذا سطور في صفحة الاقتراحات."},"thumbnailSaturationLevel":{"message":"مستوى تشبع الصورة المصغرة"},"whatSaturateThumbnails":{"message":"تقليل سطوع الصور المصغرة من خلال تخفيض الوانها"},"hideDetailsWhileFetching":{"message":"إخفاء التفاصيل أثناء الجلب"},"hideDetailsWhileFetchingDescription":{"message":"إخفاء العناوين و الصور المصغرة عند جلب البيانات من الخادم. في حالة تعطيل الخيار، سترى تغيرات مفاجئة في العناوين و الصور المصغرة مع تناوبهم."},"ignoreTranslatedTitles":{"message":"لا تظهر عناوين يوتيوب المترجمة","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"يقوم يوتيوب أحيانا بترجمة العناوين تلقائيًا إلى لغتك الأم. لا ينطبق هذا الخيار إلا عندما لا يتوفر عنوان تم الحصول عليه من مصادر خارجية."},"onAllPages":{"message":"على جميع الصفحات","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"على جميع الصفحات باستثناء صفحات الفيديو","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"ابداً"},"thumbnailGeneratorDescription1":{"message":"خدمة توليد الصور المصغرة تسرع بشكل كبير توليد الصور المصغرة بإرسال طلب مجهول مع معرف الفيديو إلى خادم عن بعد. ثم سيتم إنشاء الصورة المصغرة أو سحبها من ذاكرة التخزين المؤقت إذا كان قد تم إنشاؤها بالفعل."},"thumbnailGeneratorDescription2":{"message":"إذا تم استخدام هذا الخيار صفحات الفيديو، يمكن أن يؤدي ذلك إلى تسرب معرف الفيديوهات غير المُدرَجة إلى هذا الخادم. تعيين الخيار إلى \"على جميع الصفحات باستثناء صفحات الفيديو\" إلى تجنب هذه المشكلة. خيار آخر هو استضافة خدمة إنشاء الصور المصغرة الخاصة بك."},"thumbnailGeneratorDescription3":{"message":"إذا تم تعطيل استخدام خدمة توليد الصور المصغرة، جميع الطلبات سوف تستخدم نظام اسعلام بطريقة k-anonymity، مما يجعل من الصعب على الخادم التنبؤ بأي مقاطع فيديو تم جلبها، وسيتم استخدام خدمة توليد صور مصغرة محلية أبطأ.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"الشفرة المصدرية لخدمة توليد الصور المصغرة"},"moreAboutKAnonymity":{"message":"المزيد عن k-anonymity","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"اظهار دائماً زر \"إظهار الأصلي\""},"whatAlwaysShowShowOriginalButton":{"message":"إذا كنت ترغب دائما في معرفة ما إذا تغير عنوان/صورة مصغرة، قم بتفعيل هذ الخيار."},"showIconForFormattedTitles":{"message":"عرض زر \"إظهار الأصلي\" للعناوين المنسقة تلقائياً"},"Enable":{"message":"تفعيل"},"Titles":{"message":"العناوين","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"الصور المصغرة","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"خطأ"},"ShowOriginal":{"message":"إظهار التفاصيل الأصلية"},"ShowModified":{"message":"إظهار التفاصيل المعدلة"},"FillerWarning":{"message":"تحذير: هذه فئة شرسة للغاية. على الأرجح سترجع في تخطي بعض الفقرات، أو تعطّل هذا الخيار في بعض الأحيان. تحذّر من أن العديد من الفيديوهات قد تم تخطي 50% أو اكثر منها! ومع ذلك، تذكر أنه لا تزال هناك إرشادات محددة يتعين اتباعها عند التقديم.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"انضم إلى Discord أو Matrix للبقاء في هذه المحادثة بشكل دائم","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"إظهار مساعدة الإرشادات","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"تجنب عبارات الوجه المبالغ فيها","description":"Referring to the thumbnail of a video"},"tip2":{"message":"فكر بنطاق واسع، لا فقط تجيب على سؤال العنوان الأصلي","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"تجنب وصف ردود الفعل للفيديو (\"صادم\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"قم بتوفير معلومات كافية لتمكين القيام بخيار واعٍ قبل النقر"},"tip5":{"message":"كبّر الاحرف كالجملة (للغات التي تحتوي على تكبير احرف)","description":"Tip about submitting titles to DeArrow"},"DetectedWord":{"message":"الكلمة المكتشفة: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"dearrowHelpSponsorBlockImported":{"message":"ملاحظة: تم استيراد إعدادات SponsorBlock الخاصة بك تلقائيا!"},"howItWorks":{"message":"آلية العمل"},"discordPromotion":{"message":"تعال ساهم و قدم بعض الاقتراحات و فدم المساعدة على {discord} أو على {matrix}"},"deArrowDonationText":{"message":"إذا كنت تحب ما فعلتُه حتى الآن، وترغب في مساعدتي بالمال، إليك رابط"},"termsAgreement":{"message":"باستخدام هذه الإضافة، فإنك توافق على {privacy-policy} و {terms}"},"privacyPolicy":{"message":"سياسة الخصوصية"},"termsOfUse":{"message":"شروط الإستخدام"},"openSourceLicenses":{"message":"رخص مفتوحة المصدر"},"defaultToOriginals":{"message":"معلومات الفيديو افراضية الى اصلية"},"whatDefaultToOriginals":{"message":"إظهار العنوان و الصورة المصغرة الأصليين بشكل افتراضي، ولكن يكون هناك زر يظهر حين التمرير لرؤية العناوين و الصور المصغرة الخاصين."},"replaceTitles":{"message":"استبدال العناوين"},"replaceThumbnails":{"message":"استبدال الصور المصغرة"},"useCrowdsourcedTitles":{"message":"استخدام عناوين مصدَّرة جماعيا"},"whatUseCrowdsourcedTitles":{"message":"في حالة التعطيل، ستنسيق العناوين ولكن لن يتم استخدم العناوين المقدمة من مساهمين","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"هل أنت متأكد مِن أنك تريد حذف هذا التكوين؟","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"تكوين جديد"},"DeleteConfiguration":{"message":"حذف التكوين"},"ChannelAllowlist":{"message":"إعدادات لقناة محددة"},"ConfigurationName":{"message":"اسم التكوين"},"ChannelListInstructions":{"message":"أدخل القنوات التي تريد تطبيق هذا التكوين عليها في المربع أدناه، مفصولة بسطر جديد. كل من معرف القناة وأسماء العرض مدعومة. اسم المستخدم @ غير مدعوم. يمكنك الحصول على معرف القناة من خلال النقر على زر مشاركة في صفحة \"حول\" الخاصة بالقناة.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"لم يتم ضبط تكوين بعد. انقر الزر في الأعلى لإضافة تكوين جديد.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"إيقاف طعم النقرة من خلال استبدال العناوين والصور المصغرة ببدائل أكثر دقة"},"DeArrowPromotionMessage2":{"message":"هل تعبت من العناوين و الصور المصغرة المشتتة؟ تفقد إضافتي الجديدة لتحسين العناوين والصور المصغرة"},"DeArrowPromotionMessage3":{"message":"أيضا تفقد DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"لا تحب هذا العنوان؟ إذا كنت تفضل العنوان أدناه، فكر في تفقد ميزة استبدال العنوان في DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"تم اختيار هذه الصورة المصغرة من وقت عشوائي من الفيديو بسبب عدم وجود مساهمة على هذا الفيديو حتى الآن","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"تم اختيار هذه الصورة المصغرة من وقت عشوائي من الفيديو و العنوان منسق تلقائيا بسبب عدم وجود مساهمة على هذا الفيديو حتى الآن","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"يمكنك تغيير هذه القيمة الافتراضية أدناه","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"تم استبدال {titles} عنوان و {thumbnails} صورة مصغرة منذ تحميلك هذه الإضافة","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} عناوين ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} عنوان ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"و {thumbnails} صور مصغرة","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"و {thumbnails} صورة مصغرة","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"تم استبدال {titleAndThumbnailMessage} منذ تحميلك هذه الإضافة","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"قم بحساب عدد مرات تبديل العناوين و الصور المصغرة"},"countReplacementsDescription":{"message":"تستخدم لإعطائك إحصائيات في المنبثق.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"إضافة قائمة تصفية لمنع الاستطلاعات و المنتجات و العناصر الترويجية الأخرى باستخدام yt-neuter"},"requiresUblock":{"message":"يتطلب uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"حدث خطأ ما في اكتشاف معرف الفيديو. الرجاء محاولة تحديث الصفحة قبل التقديم للتأكد من أنه يتم التقديم للفيديو الصحيح. إذا كانت هذه المشكلة تحدث كثيرا، يرجى إرسال تقرير عن المشكلة إلى جانب الإضافات الأخرى أو userscripts المثبتة من خلالGitHub، Discord أو Matrix."},"dearrowLogoCredit":{"message":"شعار مبني على Twemoji مرخص بموجب CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock غير متوافق مع الإضافة \"Zoom to Fill\". هناك العديد من البدائل التي يمكنك استخدامها بدلاً من ذلك والتي ستعمل بشكل صحيح."},"freeTrialStarted":{"message":"بدأت النسخة التجربة المجانية الخاصة بك بنجاح. قم بزيارة اليوتيوب لتجربتها"},"freeTrialEnded":{"message":"انتهت النسخة التجريبية المجانية"},"freeTrialPrompt":{"message":"إذا كنت ترغب في التجربة لمدة ساعة، يمكنك بدء نسخة تجريبية مجانية بالزر أدناه."},"startFreeTrial":{"message":"ابدأ النسخة التجريبية المجانية"},"freeAccessRequested":{"message":"تم تسجيلك بنجاح للوصول المجاني. سيتم إعلامك عند منح الوصول المجاني."},"freeAccessComplete":{"message":"تهانينا! لديك الآن وصول مجاني إلى DeArrow"},"DeArrowNotActivated":{"message":"DeArrow غير مفعل"},"ActivateDeArrow":{"message":"تفعيل DeArrow"},"DeArrowIsActivated":{"message":"تم تفعيل DeArrow بنجاح"},"Close":{"message":"إغلاق"},"ViewLicenseKey":{"message":"اعرض مفتاح الرّخصة"},"SharingIsCaring":{"message":"المشاركة تعني الاهتمام"},"cleanPopup":{"message":"إخفاء الفوضى في منبثقة قائمة الفقرات"},"syncDisabledWarning":{"message":"تحذير: تم تعطيل مساحة تخزين الاضافة في المتصفح. لن يتم حفظ الإعدادات إن حاولت حفظها."},"syncDisabledWarningDeArrow":{"message":"لن يعمل DeArrow بدون مساحة تخزين."},"syncDisabledFirefoxSuggestions":{"message":"يمكنك تفعيلها عن طريق الذهاب الى about:config و تعيين قيمة \"webextensions.storage.sync.enabled\" الى true."},"storageFull":{"message":"مساحة تخزين الاضافة ممتلئة. الرجاء حذف بعض الفقرات الغير مُقدمة في قائمة الخيارات."},"previewSegmentRequired":{"message":"الرجاء معاينة الفقرات قبل التقديم. يمكنك القيام بذلك بالنقر على زر المعاينة أو باستخدام الاختصار التالي:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"التصرف كـ VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"لا يمكن قبول المشاركات من متصفحك في الوقت الحالي لأن يوتيوب يبدو أنه قام بحقن بعض الإعلانات من جانب الخادم والتي لا تستطيع الإضافة إزالتها. يرجى الاتصال بنا إذا كنت تتلقى هذا الخطأ."},"DeArrowIsDisabled":{"message":"تم تعطيل DeArrow - انقر للتفعيل","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"هل أنت متأكد من أن هذه الصورة المصغرة الأصلية تتبع إرشادات DeArrow؟ إذا كنت تفضل رؤية الصور المصغرة الأصلية بشكل عام، ففكر في تغيير خيار \"عندما لا توجد صورة مصغرة مرسلة\" في إعدادات DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"Yes":{"message":"نعم"},"OpenSettings":{"message":"فتح الإعدادات"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/bg/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/bg/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Времето за изчакване на връзката изтече. Проверете връзката си с интернет. Ако вашият интернет работи, вероятно сървърът е претоварен или не работи."},"400":{"message":"Сървърът съобщава, че тази заявка е невалидна"},"409":{"message":"Това спонсорство е вече изпратено"},"502":{"message":"Сървърът изглежда претоварен. Опитайте отново след няколко секунди."},"fullName":{"message":"SponsorBlock за YouTube - пропускайте спонсорства","description":"Name of the extension."},"Description":{"message":"Прескачайте спонсорства, напомняния за абониране и други неща в клипове в YouTube. Докладвайте спонсорства в клиповете, които гледате, за да спестите време на други потребители.","description":"Description of the extension."},"channelWhitelisted":{"message":"Каналът е добавен към белия списък!"},"Segment":{"message":"сегмент"},"Segments":{"message":"сегмента"},"SegmentsCap":{"message":"Сегменти"},"Chapters":{"message":"Глави"},"renderAsChapters":{"message":"Изобразяване на сегментите като глави","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Показване на текущия сегмент до времето на клипа"},"showAutogeneratedChapters":{"message":"Показване на глави, генерирани автоматично от YouTube"},"upvoteButtonInfo":{"message":"Одобряване на това предложение"},"reportButtonTitle":{"message":"Докладване"},"reportButtonInfo":{"message":"Подайте сигнал за неправилно предложение."},"Dismiss":{"message":"Отхвърляне"},"Loading":{"message":"Зареждане..."},"Hide":{"message":"Никога да не се показва"},"hitGoBack":{"message":"Натиснете „връщане“, за да се върнете там, където бяхте."},"unskip":{"message":"Връщане"},"reskip":{"message":"Пропускане отново"},"unmute":{"message":"Вкл. на звука"},"paused":{"message":"На пауза"},"manualPaused":{"message":"Таймерът е спрян"},"confirmMSG":{"message":"За да редактирате или изтриете отделни стойности, щракнете върху бутона за информация или отворете изскачащия прозорец на разширението, като щракнете върху иконата на разширението в горния десен ъгъл."},"clearThis":{"message":"Наистина ли искате да изчистите това?\n\n"},"Unknown":{"message":"Възникна грешка при подаването на вашите времена на спонсорства, моля, опитайте отново по-късно."},"sponsorFound":{"message":"Този видеоклип има сегменти в базата данни!"},"sponsor404":{"message":"Не са намерени сегменти"},"sponsorStart":{"message":"Сегментът започва сега"},"sponsorEnd":{"message":"Сегментът свършва сега"},"sponsorCancel":{"message":"Отказ от създаването на сегмент"},"noVideoID":{"message":"Не е намерен видеоклип в YouTube.\nАко това не е правилно, опреснете раздела."},"refreshSegments":{"message":"Опресняване на сегментите"},"success":{"message":"Успешно!"},"voted":{"message":"Гласувахте!"},"serverDown":{"message":"Изглежда, че сървърът не работи. Свържете се с програмиста незабавно."},"connectionError":{"message":"Възникна грешка с връзката. Код на грешката: "},"segmentsStillLoading":{"message":"Сегментите все още се зареждат..."},"clearTimes":{"message":"Изчистване на сегментите"},"openPopup":{"message":"Отваряне на изскачащия прозорец на SponsorBlock"},"closePopup":{"message":"Затваряне на прозореца"},"closeIcon":{"message":"Икона - затваряне"},"OpenSubmissionMenu":{"message":"Отваряне на менюто за изпращане"},"OpenCasualVoteMenu":{"message":"Отваряне на менюто в нормален режим"},"sortSegments":{"message":"Сортиране на сегментите"},"submitCheck":{"message":"Наистина ли искате да изпратите това?"},"whitelistChannel":{"message":"Добавяне на канала към белия списък"},"removeFromWhitelist":{"message":"Премахване на канала от белия списък"},"voteOnTime":{"message":"Гласувайте за сегмент"},"Submissions":{"message":"Изпратени сегменти"},"savedPeopleFrom":{"message":"Помогнахте на хората да пропуснат "},"viewLeaderboard":{"message":"Класиране"},"recordTimesDescription":{"message":"Изпращане"},"submissionEditHint":{"message":"Редактирането на частите ще се появи, след като щракнете върху Изпращане","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Съвет: Можете да настроите клавиши за изпращане в опциите"},"clearTimesButton":{"message":"Изчистване на времената"},"Username":{"message":"Потребител"},"setUsername":{"message":"Задайте потребителско име"},"copyPublicID":{"message":"Копиране на публичния UserID"},"copySegmentID":{"message":"Копиране на идентификатора на сегмента"},"loopChapter":{"message":"Повтаряне на главата"},"unloopChapter":{"message":"Без повтаряне на главата"},"hideThis":{"message":"Скриване на това"},"Options":{"message":"Опции"},"showButtons":{"message":"Показване на бутоните в плейъра на YouTube"},"hideButtonsDescription":{"message":"Това скрива бутоните, които се показват в плейъра на YouTube за изпращане на сегменти за пропускане."},"showSkipButton":{"message":"Оставяне в плейъра на бутона за преминаване към акцента"},"showInfoButton":{"message":"Показване на бутона за информация в плейъра на YouTube"},"autoHideInfoButton":{"message":"Автоматично скриване на бутона за информация"},"showDeleteButton":{"message":"Показване на бутона за изтриване в плейъра на YouTube"},"enableViewTracking":{"message":"Активиране проследяването на броя пропускания"},"whatViewTracking":{"message":"Тази функция проследява кои сегменти сте пропуснали, за да уведоми потребителите доколко приносът им е помогнал на другите и се използва като показател заедно с положителните гласове, за да се гарантира, че спамът няма да попадне в базата данни. Разширението изпраща съобщение до сървъра всеки път, когато пропуснете сегмент. Надяваме се, че повечето хора няма да променят тази настройка, така че броят на прегледите да е точен. :)"},"enableViewTrackingInPrivate":{"message":"Активиране проследяването на броя пропускания в раздели „Инкогнито“"},"enableTrackDownvotes":{"message":"Съхраняване на отрицателните гласове за сегменти"},"whatTrackDownvotes":{"message":"Всички сегменти, за които гласувате против, ще останат скрити дори след опресняване"},"trackDownvotesWarning":{"message":"Внимание: Деактивирането на това ще изтрие всички по-рано запазени отрицателни гласове"},"enableTrackDownvotesInPrivate":{"message":"Съхраняване на гласовете против за сегменти в частни/инкогнито раздели"},"enableQueryByHashPrefix":{"message":"Заявка по префикс на хеш"},"whatQueryByHashPrefix":{"message":"Вместо да се изискват сегменти от сървъра с помощта на videoID, се изпращат първите 4 знака от хеша на videoID. Този сървър ще изпрати обратно данни за всички видеоклипове с подобни хешове."},"enableShowCategoryWithoutPermission":{"message":"Показване на категории в менюто за изпращане дори без разрешение за изпращане"},"whatShowCategoryWithoutPermission":{"message":"Някои категории изискват разрешение за изпращане поради минимални изисквания за репутация"},"showNotice":{"message":"Отново покажете известието"},"showSkipNotice":{"message":"Показване на известие след пропускане на сегмент"},"showUpcomingNotice":{"message":"Показване на известие преди началото на даден сегмент"},"showCategoryGuidelines":{"message":"Показване на помощ за категорията"},"noticeVisibilityMode0":{"message":"Известия за пропускане в пълен размер"},"noticeVisibilityMode1":{"message":"Малки известия за пропускане при автоматично пропускане"},"noticeVisibilityMode2":{"message":"Изцяло малки известия за пропускане"},"noticeVisibilityMode3":{"message":"Плавни известия за пропускане при автоматично пропускане"},"noticeVisibilityMode4":{"message":"Изцяло плавни известия за пропускане"},"longDescription":{"message":"SponsorBlock ви позволява да прескачате спонсори, въведения, заключения, напомняния за абониране и други досадни части от видеоклиповете в YouTube. SponsorBlock е разширение за браузър, създадено от множество хора, което позволява на всеки да изпраща началния и крайния час на спонсорирани сегменти и други сегменти от видеоклиповете в YouTube. След като един човек подаде тази информация, всички останали с това разширение ще прескочат спонсорирания сегмент. Можете също да пропуснете части без музика при музикалните видеоклипове.","description":"Full description of the extension on the store pages."},"website":{"message":"Уебсайт","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Програмен код","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Известието е обновено!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Ако все още не ви харесва, натиснете бутона „Никога да не се показва“.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Пропускане на сегмент","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Начало/край на сегмент","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Отваряне на менюто за изпращане","description":"Keybind label"},"setSubmitKeybind":{"message":"Изпращане на сегментите","description":"Keybind label"},"setPreviewKeybind":{"message":"Преглед на сегмента","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Затваряне на уведомлението за пропускане","description":"Keybind label"},"setDownvoteKeybind":{"message":"Гласуване против сегмента","description":"Keybind label"},"setUpvoteKeybind":{"message":"Гласуване за сегмента","description":"Keybind label"},"nextChapterKeybind":{"message":"Следваща глава","description":"Keybind label"},"previousChapterKeybind":{"message":"Предишна глава","description":"Keybind label"},"enableDeArrowKey":{"message":"Вкл. / Изкл. на DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Отваряне на менюто за изпращане","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Изберете клавиш, като го натиснете, заедно с всички клавишни модификатори, които искате да използвате."},"disableSkipping":{"message":"Пропускането е активирано"},"enableSkipping":{"message":"Пропускането е деактивирано"},"yourWork":{"message":"Вашата работа","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Код на грешката: "},"skip":{"message":"Пропускане"},"mute":{"message":"Заглушаване"},"full":{"message":"Целия видеоклип","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Пропускане на {0}?"},"mute_category":{"message":"Заглушаване на {0}?"},"skip_to_category":{"message":"Прескачане до {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Предстои {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} пропуснат","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} заглушено","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Прескочено до {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Глас за {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Деактивиране на автоматичното пропускане"},"enableAutoSkip":{"message":"Активиране на автоматичното пропускане"},"audioNotification":{"message":"Звуково известие при пропускане"},"audioNotificationDescription":{"message":"Звуковото известие при пропускане ще пуска звук всеки път, когато се пропусне сегмент. Ако е забранено (или автоматичното пропускане е деактивирано), няма да се пуска звук."},"showTimeWithSkips":{"message":"Показване на времето с премахнати пропускания"},"showTimeWithSkipsDescription":{"message":"Това време се показва в скоби до текущото време под лентата за прогреса. Това показва общата продължителност на видеоклипа минус всички сегменти. Това включва сегменти, маркирани само като „Показване в лентата за прогреса“."},"youHaveSkipped":{"message":"Пропуснали сте "},"minLower":{"message":"минута"},"minsLower":{"message":"минути"},"hourLower":{"message":"час"},"hoursLower":{"message":"часа"},"youHaveSavedTime":{"message":"Спестили сте на хората","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" от живота им","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Проверете status.sponsor.ajay.app за състоянието на сървъра."},"changeUserID":{"message":"Импортиране/експортиране на вашия личен UserID"},"whatChangeUserID":{"message":"Това трябва да се пази в тайна. То е като парола и не трябва да се споделя с никого. Ако някой го има, може да се представи за вас. Ако търсите своя публичен потребителски идентификатор, щракнете върху иконата на клипборда в изскачащия прозорец."},"setUserID":{"message":"Задаване на личен UserID"},"userIDChangeWarning":{"message":"Внимание: Промяната на личния UserID е постоянна. Наистина ли искате да направите това? Не забравяйте да архивирате стария си за всеки случай."},"createdBy":{"message":"Създаден от"},"supportOtherSites":{"message":"Поддръжка на YouTube-сайтове на трети страни"},"supportOtherSitesDescription":{"message":"Поддръжка на клиенти на трети страни за YouTube. За да активирате поддръжката, трябва да приемете допълнителните разрешения.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Поддържани сайтове: "},"optionsInfo":{"message":"Активиране поддръжката на Invidious, деактивиране на автоматичното пропускане, скриване на бутоните и др."},"addInvidiousInstance":{"message":"Добавяне екземпляр на клиент на трета страна"},"addInvidiousInstanceDescription":{"message":"Добавяне на персонализиран екземпляр. Това трябва да бъде форматирано само с домейна. Пример: invidious.ajay.app"},"add":{"message":"Добавяне"},"addInvidiousInstanceError":{"message":"Това е невалиден домейн. Трябва да включва само частта на домейна. Пример: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Нулиране списъка на Invidious"},"resetInvidiousInstanceAlert":{"message":"На път сте да нулирате списъка на Invidious"},"invidiousDisabledSafari":{"message":"В момента поддръжката на Invidious не е налична в Safari поради грешка в Safari. Когато Apple отстрани грешката, ще бъде добавен обратно."},"currentInstances":{"message":"Текущи екземпляри:"},"minDuration":{"message":"Минимална продължителност (секунди):"},"minDurationDescription":{"message":"Сегменти, по-кратки от зададената стойност, няма да бъдат пропускани или показвани в плейъра."},"enableManualSkipOnFullVideo":{"message":"Използване на ръчно пропускане, когато съществува етикет за целия видеоклип"},"whatManualSkipOnFullVideo":{"message":"За хора, които искат да гледат видеоклипа без прекъсване, ако е изцяло спонсориран или саморекламен."},"skipNoticeDuration":{"message":"Продължителност на известието за пропускане (секунди):"},"skipNoticeDurationDescription":{"message":"Известието за пропускане ще остане на екрана поне толкова дълго. За ръчно пропускане може да се вижда по-дълго."},"shortCheck":{"message":"Следното предложение е по-кратко от опцията за минимална продължителност. Това може да означава, че вече е изпратено и просто е игнорирано поради тази опция. Наистина ли искате да го изпратите?"},"liveOrPremiere":{"message":"Не е разрешено изпращането по време на активен поток на живо или премиера. Моля, изчакайте, докато приключи, след което опреснете страницата и проверете дали сегментите са все още валидни."},"showUploadButton":{"message":"Показване на бутона за качване"},"customServerAddress":{"message":"Адрес на сървъра на SponsorBlock"},"customServerAddressDescription":{"message":"Адресът, който SponsorBlock използва за осъществяване на заявки към сървъра.\nОсвен ако нямате собствен екземпляр на сървър, това не трябва да се променя."},"dataFetchingServerAddress":{"message":"Адрес на сървъра за извличане на данни"},"dataFetchingServerAddressDescription":{"message":"Адресът, използван за осъществяване на повиквания към сървъра за извличане на данни.\nОсвен ако нямате собствена инстанция на сървъра, този параметър не трябва да се променя."},"thumbnailCacheServerAddress":{"message":"Адрес на сървъра за кеширане на миниатюри"},"save":{"message":"Запазване"},"reset":{"message":"Начално състояние"},"customAddressError":{"message":"Този адрес не е в правилния формат. Уверете се, че имате http:// или https:// в началото и няма последващи наклонени черти."},"areYouSureReset":{"message":"Наистина ли искате да върнете началното състояние?"},"mobileUpdateInfo":{"message":"m.youtube.com вече се поддържа"},"exportOptions":{"message":"Импортиране/експортиране на всички опции"},"exportOtherData":{"message":"Импортиране/експортиране на всички други данни"},"exportOptionsCopy":{"message":"Редактиране/копиране"},"exportOptionsDownload":{"message":"Записване във файл"},"exportOptionsUpload":{"message":"Зареждане от файл"},"whatExportOptions":{"message":"Това е цялата ви конфигурация в JSON. Това включва вашия личен userID, така че се уверете, че споделяте това разумно."},"setOptions":{"message":"Задаване на опции"},"exportOptionsWarning":{"message":"Внимание: Промяната на опциите е постоянна и може да повреди вашата инсталация. Наистина ли искате да направите това? Не забравяйте да архивирате старите си за всеки случай."},"incorrectlyFormattedOptions":{"message":"Този JSON не е форматиран правилно. Вашите опции не са променени."},"confirmNoticeTitle":{"message":"Изпращане на сегмента"},"submit":{"message":"Изпращане"},"cancel":{"message":"Отказ"},"delete":{"message":"Изтриване"},"preview":{"message":"Преглед"},"unsubmitted":{"message":"Неизпратен"},"inspect":{"message":"Изследване"},"edit":{"message":"Редактиране"},"copyDebugLogs":{"message":"Копиране на дневниците за отстраняване на грешки"},"copyDebugInformation":{"message":"Копиране на информацията за отстраняване на грешки в клипборда"},"copyDebugInformationFailed":{"message":"Неуспешно записване в клипборда"},"copyDebugInformationOptions":{"message":"Копира информацията в клипборда, за да се предостави на разработчика при възникване на грешка или когато разработчикът поиска това. Деликатната информация като вашия user ID, канали в белия списък и потребителски адрес на сървъра са премахнати. Съдържа се обаче информация като вашия потребителски агент, браузър, операционна система и номер на версия на разширението. "},"copyDebugInformationComplete":{"message":"Информацията за отстраняване на грешки е копирана в клипборда. Чувствайте се свободни да премахнете всяка информация, която предпочитате да не споделяте. Запазете това в текстов файл или го поставете в доклада за грешки."},"keyAlreadyUsed":{"message":"Тази клавишна комбинация е свързана с друго действие. Моля, изберете друга."},"to":{"message":"до","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Копирано!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Включване на преходи"},"generic_guideline2":{"message":"Възпроизвежда се, сякаш нищо не е пропуснато"},"category_sponsor":{"message":"Спонсорство"},"category_sponsor_description":{"message":"Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора."},"category_sponsor_guideline1":{"message":"Платени промоции"},"category_sponsor_guideline2":{"message":"Не за дарения или персонализирани стоки"},"category_selfpromo":{"message":"Неплатена/Самореклама"},"category_selfpromo_description":{"message":"Подобно на „спонсорство“, но за безплатна реклама или самореклама. Това включва търговия със стоки, дарения или информация с кого каналът има сътрудничество."},"category_selfpromo_guideline1":{"message":"Дарения, членства и персонализирани стоки"},"category_selfpromo_guideline2":{"message":"Безплатни възгласи, които не допринасят за видеоклипа"},"category_selfpromo_guideline3":{"message":"Не за продукти и стоки с корпоративен дизайн"},"category_exclusive_access":{"message":"Ексклузивен достъп"},"category_exclusive_access_description":{"message":"Само за обозначаване на цели видеоклипове. Използва се, когато видеоклипът представя продукт, услуга или място, до които е получен безплатен или субсидиран достъп."},"category_exclusive_access_pill":{"message":"Този видеоклип представя продукт, услуга или място, до което е получен безплатен или субсидиран достъп","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Целият видеоклип показва нещо, до което е получен безплатен или субсидиран достъп"},"category_interaction":{"message":"Напомняне за действие (абониране)"},"category_interaction_description":{"message":"Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или за нещо специфично, трябва да е под „самореклама“."},"category_interaction_guideline1":{"message":"Кратки напомняния за харесване, абониране или следване"},"category_interaction_guideline2":{"message":"Включва непреки напомняния за коментиране"},"category_interaction_guideline3":{"message":"Не за общо популяризиране, а само за призиви за действие"},"category_interaction_short":{"message":"Напомняне за взаимодействие"},"category_intro":{"message":"Антракт/Начална анимация"},"category_intro_description":{"message":"Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация."},"category_intro_short":{"message":"Антракт"},"category_intro_guideline1":{"message":"Интервал без реално съдържание"},"category_intro_guideline2":{"message":"Не за преходи с информация"},"category_outro":{"message":"Крайни картички/Заслуги"},"category_outro_description":{"message":"Заслуги или когато се показват крайните карти на YouTube. Не за заключения с информация."},"category_outro_guideline1":{"message":"Без съдържание, дори ако крайните карти са на екрана"},"category_preview":{"message":"Кратко резюме/Обобщение"},"category_preview_description":{"message":"Колекция от клипове, които показват какво предстои в този видеоклип или в други видеоклипове от поредицата, където цялата информация се повтаря по-късно във видеоклипа."},"category_preview_guideline1":{"message":"Клипове, които се появяват по-късно или в бъдещ видеоклип"},"category_preview_guideline2":{"message":"Резюме на предишен видеоклип"},"category_preview_guideline3":{"message":"Не за части, които добавят допълнително съдържание"},"category_hook":{"message":"Кукичка/Поздрави","description":"https://en.wikipedia.org/wiki/Narrative_hook"},"category_hook_description":{"message":"Озвучени трейлъри за предстоящото видео, поздрави и сбогувания. Това не трябва да пропуска заключенията с информация."},"category_hook_guideline1":{"message":"Озвучени трейлъри за предстоящото видео"},"category_hook_guideline2":{"message":"Раздели за поздрави и сбогом, които приветстват зрителите"},"category_hook_guideline3":{"message":"Не за части, които добавят допълнително съдържание"},"category_filler":{"message":"Несвързани теми/Шеги"},"category_filler_description":{"message":"Отвличащи вниманието сцени или шеги, които не са необходими за разбирането на основното съдържание на видеоклипа. Това не трябва да включва сегменти, предоставящи контекст или справочни данни. Това е много агресивна категория, предназначена за случаите, когато не сте в настроение за „забавление“."},"category_filler_short":{"message":"Несвързани теми"},"category_filler_guideline1":{"message":"Несвързани теми или шеги"},"category_filler_guideline2":{"message":"Отвличане на вниманието, гафове, повторения"},"category_filler_guideline3":{"message":"Не за сцени, необходими за разбиране на темата"},"category_music_offtopic":{"message":"Музика: Част без музика"},"category_music_offtopic_description":{"message":"За използване само в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория."},"category_music_offtopic_short":{"message":"Без музика"},"category_music_offtopic_guideline1":{"message":"Секции, които не са в официалните издания"},"category_music_offtopic_guideline2":{"message":"Немузикална част от изпълнение на живо"},"category_poi_highlight":{"message":"Акцент"},"category_poi_highlight_description":{"message":"Частта от видеото, която повечето хора търсят. Подобно на коментарите „Видеото започва от х“."},"category_poi_highlight_guideline1":{"message":"Секция, която повечето хора търсят"},"category_poi_highlight_guideline2":{"message":"Може да помогне за прескачане на миналия контекст"},"category_poi_highlight_guideline3":{"message":"Може да прескочи до заглавието или миниатюрата"},"category_chapter":{"message":"Глава"},"category_chapter_description":{"message":"Потребителски наименувани глави, описващи основните части на видеоклипа."},"category_chapter_guideline1":{"message":"Без споменаване имена на марки на спонсори"},"category_chapter_guideline2":{"message":"Използване на по-големи глави за общи раздели"},"category_chapter_guideline3":{"message":"По-малките глави могат да бъдат поставени в по-големите"},"category_livestream_messages":{"message":"Поточно предаване: Четене на съобщения/дарения"},"category_livestream_messages_short":{"message":"Четене на съобщения"},"autoSkip":{"message":"Автоматично пропускане"},"manualSkip":{"message":"Ръчно пропускане"},"showOverlay":{"message":"Показване в лентата на прогреса"},"disable":{"message":"Деактивиране"},"autoSkip_POI":{"message":"Автоматично прескачане до началото"},"manualSkip_POI":{"message":"Питане, когато видеото се зарежда"},"showOverlay_POI":{"message":"Показване в лентата на прогреса"},"showOverlay_full":{"message":"Показване на етикета"},"showOverlay_chapter":{"message":"Показване на глави"},"autoSkipOnMusicVideos":{"message":"Автоматично пропускане на всички сегменти, когато има сегмент без музика"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Автоматично пропускане само на music.youtube.com"},"muteSegments":{"message":"Разрешаване на сегменти, които заглушават звука, вместо да се пропускат"},"fullVideoSegments":{"message":"Показване на икона, когато видеоклипът е изцяло реклама","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Показване на етикети на миниатюрите на видеоклиповете","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Цвят на неизпратен сегмент","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Цвят на лентата на прогреса"},"category":{"message":"Категория"},"skipOption":{"message":"Метод за пропускане","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Отваряне на разширените опции за прескачане"},"advancedSkipNotSaved":{"message":"Синтактична грешка: Вашите опции не са запазени"},"advancedSkipSettingsHelp":{"message":"Как работи това","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Активиране на сървъра за бета тестване"},"whatEnableTestingServer":{"message":"Вашите предложения и гласове НЯМА ДА СЕ БРОЯТ към основния сървър. Използвайте това само за тестване."},"testingServerWarning":{"message":"Всички предложения и гласове НЯМА ДА СЕ БРОЯТ към основния сървър, докато се свързвате с тестовия сървър. Не забравяйте да деактивирате това, когато искате да правите реални предложения."},"bracketNow":{"message":"(Сега)"},"moreCategories":{"message":"Още категории"},"chooseACategory":{"message":"Изберете категория"},"enableThisCategoryFirst":{"message":"За да изпратите сегменти с категория „{0}“, трябва да я активирате от опциите. Ще бъдете пренасочени към опциите сега.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Внимание: Само един сегмент от този тип може да е активен. Изпращането на няколко ще доведе до показване на случаен."},"youMustSelectACategory":{"message":"Трябва да изберете категория за всички сегменти, които изпращате!"},"bracketStart":{"message":"(Начало)"},"bracketEnd":{"message":"(Край)"},"End":{"message":"Край","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"скрито: глас против"},"hiddenDueToDuration":{"message":"скрито: твърде кратко"},"manuallyHidden":{"message":"ръчно скрито"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID на канала все още не е зареден. Ако използвате вграден видеоклип, опитайте вместо това да използвате началната страница на YouTube. Това може да бъде причинено и от промени в оформлението на YouTube, ако мислите така, направете коментар тук:"},"invidiousPermissionRefresh":{"message":"Браузърът е отменил разрешението, необходимо за функциониране на Invidious и други сайтове на трети страни. Моля, щракнете върху бутона по-долу, за да активирате отново това разрешение."},"acceptPermission":{"message":"Даване на разрешение"},"permissionRequestSuccess":{"message":"Искането за разрешение е успешно!"},"permissionRequestFailed":{"message":"Искането за разрешение не бе успешно, натиснахте ли Отказ?"},"adblockerIssueWhitelist":{"message":"Ако не можете да разрешите това, деактивирайте настройката „Принудителна проверка на канала преди пропускане“, тъй като SponsorBlock не може да извлече информацията за канала за този видеоклип"},"forceChannelCheck":{"message":"Принудителна проверка на канала преди пропускане"},"whatForceChannelCheck":{"message":"По подразбиране ще пропусне сегменти веднага, преди дори да разбере какъв е каналът. По подразбиране някои сегменти в началото на видеоклипа може да бъдат пропуснати в канали от белия списък. Активирането на тази опция ще предотврати това, но при всички пропускания ще има леко забавяне, тъй като получаването на ID на канала може да отнеме известно време. Това забавяне може да бъде незабележимо, ако имате бърз интернет."},"forceChannelCheckPopup":{"message":"Помислете за активиране на „Принудителна проверка на канала преди пропускане“"},"downvoteDescription":{"message":"Грешно/Неправилно време"},"incorrectVote":{"message":"Неправилно"},"harmfulVote":{"message":"Вредно","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Промяна на категорията"},"nonMusicCategoryOnMusic":{"message":"Това видео е категоризирано като музика. Сигурни ли сте, че това има спонсор? Ако това всъщност е „Немузикален сегмент“, отворете опциите на разширението и активирайте тази категория. След това можете да изпратите този сегмент като „Немузикален“ вместо като спонсор. Моля, прочетете указанията, ако сте объркани."},"multipleSegments":{"message":"Няколко сегмента"},"guidelines":{"message":"Насоки"},"readTheGuidelines":{"message":"Прочетете насоките!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Категориите са тук!"},"categoryUpdate2":{"message":"Отворете опциите, за да пропускате въведения, заключения, продажба на стоки и т.н."},"help":{"message":"Помощ"},"GotIt":{"message":"Разбрах","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Този сегмент е голям. Ако целия видеоклип е на една тема, променете от „Пропускане“ на „Целия видеоклип“. Вижте насоките за повече информация."},"categoryPillTitleText":{"message":"Целият видеоклип е обозначен с тази категория и е твърде тясно интегриран, за да може да се раздели"},"chapterNameTooltipWarning":{"message":"Едно от имената на вашите глави е подобно на категория. Вместо това трябва да използвате категории, когато е възможно."},"experiementOptOut":{"message":"Отказ от всички бъдещи експерименти","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Скриване завинаги"},"warningChatInfo":{"message":"Забелязахме, че допускате някои често срещани грешки. Оценяваме високо досегашната ви работа, но тук се стремим към съвършенство, така че дори и много малките грешки са от значение :)"},"questionButton":{"message":"Имам въпрос"},"askAQuestion":{"message":"Задайте въпрос"},"warningConfirmButton":{"message":"Разбирам причината"},"warningError":{"message":"Грешка при опит за потвърждаване на предупреждение:"},"deArrowMessageRecieved":{"message":"Получихте съвет от модератор"},"Donate":{"message":"Дарение"},"considerDonating":{"message":"Помогнете с финансиране на разработката"},"supportSponsorBlock":{"message":"Подкрепете работата ми на пълен работен ден по SponsorBlock"},"hideDonationLink":{"message":"Скриване на връзката за дарение"},"darkModeOptionsPage":{"message":"Тъмен режим на страницата с опции"},"helpPageThanksForInstalling":{"message":"Благодарим ви, че инсталирахте SponsorBlock."},"helpPageReviewOptions":{"message":"Моля, прегледайте опциите по-долу"},"helpPageFeatureDisclaimer":{"message":"Много функции са деактивирани по подразбиране. Ако искате да пропускате въведения, заключения, да използвате Invidious и т.н., активирайте ги по-долу. Можете също да скриете/покажете елементи от потребителския интерфейс."},"helpPageHowSkippingWorks":{"message":"Как работи"},"helpPageHowSkippingWorks1":{"message":"Всички спонсори са изпратени от потребители като вас. Можете да видите списъка с подадените спонсори в базата данни, като отворите изскачащия прозорец в горния десен ъгъл на браузъра си."},"helpPageHowSkippingWorks2":{"message":"Всеки път, когато пропуснете сегмент, ще получите известие. Ако времето изглежда грешно, гласувайте против, като щракнете на палец надолу! Можете също така да гласувате в изскачащия прозорец."},"Submitting":{"message":"Изпращане"},"helpPageSubmitting1":{"message":"Подаването може да стане, като кликнете върху логото на SponsorBlock във видео плейъра."},"helpPageSubmitting2":{"message":"Щракването върху бутона за възпроизвеждане показва началото на сегмента, а щракването върху иконата за спиране - края му. Щракнете върху бутона със стрелка нагоре, за да отворите менюто за подаване, където можете да проверите сегментите си, като ги прегледате и редактирате, за да бъдат перфектни. Прецизността е важна, уверете се, че сте прочели указанията, преди да изпратите."},"helpPageCopyOfDatabase":{"message":"Къде отиват подадените данни?"},"helpPageCopyOfDatabase1":{"message":"Всички подадени данни се въвеждат в базата данни на SponsorBlock, която е публично достъпна за ползване от всеки и е на разположение на адрес"},"helpPageCopyOfDatabase2":{"message":"Програмният код е достъпен свободно. Така че, дори нещо да ми се случи, вашият принос не се губи."},"AdviceForSubmitting":{"message":"Съвети за подаване на данни"},"Credits":{"message":"Заслуги"},"LearnMore":{"message":"Научете повече"},"FullDetails":{"message":"Пълна информация"},"CopyDownvoteButtonInfo":{"message":"Гласуване против и създаване на локално копие, за да го изпратите отново"},"OpenCategoryWikiPage":{"message":"Отваряне на wiki страницата на тази категория."},"CopyAndDownvote":{"message":"Копиране и гласуване против"},"ContinueVoting":{"message":"Продължаване на гласуването"},"ChangeCategoryTooltip":{"message":"Това незабавно ще се приложи към вашите сегменти"},"downvote":{"message":"Не одобрение"},"upvote":{"message":"Одобрение"},"hideSegment":{"message":"Скриване на сегмента"},"skipSegment":{"message":"Пропускане на сегмент"},"playChapter":{"message":"Пускане на главата"},"SponsorTimeEditScrollNewFeature":{"message":"Използвайте колелото на мишката, докато държите курсора върху полето за редактиране, за да коригирате бързо времето. Комбинации с клавиша ctrl или shift могат да се използват за фина настройка на промените."},"categoryPillNewFeature":{"message":"Ново! Вижте кога видеоклипът е изцяло спонсориран или саморекламен"},"yearAbbreviation":{"message":"г","description":"100y"},"dayAbbreviation":{"message":"д","description":"100d"},"hourAbbreviation":{"message":"ч","description":"100h"},"optionsTabBehavior":{"message":"Поведение","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Интерфейс","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Клавишни комбинации","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Архивиране/Възстановяване","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Други","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Изглед на известията за пропускане","description":"Option label"},"unbind":{"message":"Освобождаване","description":"Unbind keyboard shortcut"},"notSet":{"message":"Не е зададено"},"change":{"message":"Промяна"},"youtubeKeybindWarning":{"message":"Това е вградена клавишна комбинация в YouTube. Наистина ли искате да я използвате?"},"betaServerWarning":{"message":"Сървърът BETA е активиран!"},"openOptionsPage":{"message":"Отваряне на страницата с опции"},"resetToDefault":{"message":"Възстановяване на първоначалните настройки"},"confirmResetToDefault":{"message":"Наистина ли искате да възстановите всички настройки до стойностите им по подразбиране? Това не може да бъде отменено."},"exportSegments":{"message":"Експортиране на сегменти"},"importSegments":{"message":"Импортиране на сегменти"},"Import":{"message":"Импортиране","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Осребряването е успешно!"},"redeemFailed":{"message":"Лицензионният ключ е невалиден"},"hideUpsells":{"message":"Скриване на опциите, които не са налични без допълнително заплащане"},"hideNewFeatureUpdates":{"message":"Скриване на известията за нови функции"},"redeem":{"message":"Осребряване"},"enterLicenseKey":{"message":"Въведете лицензния ключ"},"unsubmittedSegmentCounts":{"message":"В момента имате {0} в {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"В момента нямате неизпратени сегменти","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"неизпратен сегмент","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"неизпратени сегменти","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"видеоклип","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"видеоклипа","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Изчистване на всички сегменти","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Наистина ли искате да изтриете всички неизпратени сегменти?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Показване на сегментите","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Скриване на сегментите","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Идентификатор на видеоклипа","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Брой сегменти","description":"Header of the unsubmitted segments list"},"actions":{"message":"Действия","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Споделяне като URL"},"segmentFetchFailureWarning":{"message":"Внимание: сървърът все още не е отговорил със сегменти. В действителност може да има вече изпратени сегменти в този видеоклип, но просто не сте ги получили поради проблеми със сървъра."},"allowScrollingToEdit":{"message":"Разрешаване на превъртане за редактиране на времената"},"NoticeTimeAfterSkip":{"message":"{seconds}с","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - По-добри заглавия и миниатюри в YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Заглавията и миниатюрите трябва да са описателни, а не сензационни","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Изберете най-описателното"},"Original":{"message":"Оригинал"},"OriginalTitle":{"message":"Първоначално заглавие"},"CurrentTime":{"message":"Текущо време"},"resetCustomTitle":{"message":"Връщане първоначалния текст на заглавието"},"resetIcon":{"message":"Икона за нулиране"},"TypeYourOwnTitleHere":{"message":"Въведете собствено заглавие тук"},"VideoNotReady":{"message":"Видеото не е готово"},"FailedToRender":{"message":"Неуспешно визуализиране","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Липсва платно","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Изключение при визуализиране","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Неуспешно зареждане","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Формат на заглавието"},"Disabled":{"message":"Деактивирано"},"CapitalizeWords":{"message":"Думи с главни букви"},"TitleCase":{"message":"Заглавни букви"},"SentenceCase":{"message":"Изречение"},"LowerCase":{"message":"Малки букви"},"FirstLetterUppercase":{"message":"Главна първа буква"},"shouldCleanEmojis":{"message":"Премахване на емоджитата"},"onlyFormatCustomTitles":{"message":"Форматиране само на заглавия, подадени от потребителите"},"onlyTitleCaseInEnglish":{"message":"Писане с главни букви на думите в неанглийските заглавия"},"onlyTitleCaseInEnglishDescription":{"message":"Разпознаването на езика не е перфектно и разпознава някои английски заглавия като неанглийски."},"thumbnailFallbackOption":{"message":"Когато няма изпратена миниатюра"},"whatThumbnailFallbackOption":{"message":"При избора на случаен час се използват данни от SponsorBlock, за да се гарантира, че не е избран час в промоционален сегмент.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Показване на екранна снимка от произволно време"},"TheOriginalThumbnail":{"message":"Показване на оригиналната миниатюра"},"showABlankBox":{"message":"Показване на празно поле"},"AutoGenerated":{"message":"Показване на миниатюра, генерирана автоматично от YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Начало"},"Middle":{"message":"Среда"},"keepUnsubmitted":{"message":"Запазване на подадените гласове"},"showLiveCover":{"message":"Показване аватара на канала в предстоящите видеоклипове","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Никога да не се използват A/B тестове на миниатюрите"},"ignoreAbThumbnailsDescription":{"message":"Каналите могат да настроят тестове на своите видеоклипове, при които YouTube ще показва различни миниатюри на всеки човек. При тази опция винаги ще се използва първата миниатюра, за да се запази последователността."},"abThumbnailsWarning":{"message":"Предупреждение: В момента в този видеоклип се изпълнява A/B тест на миниатюрата. Това означава, че миниатюрата може да се променя често. Вероятно не трябва да гласувате за оригиналната миниатюра поради този риск."},"whatKeepUnsubmitted":{"message":"Запазване на подадените гласове след гласуване, за да се показват заглавията и миниатюрите, които сте избрали, вместо най-гласуваните на сървъра."},"keepUnsubmittedInPrivate":{"message":"Съхраняване на подадените гласове от частни раздели"},"useThumbnailGenerationService":{"message":"Използване на услугата за генериране на миниатюри"},"titleMaxLines":{"message":"Макс. брой редове за заглавията"},"titleMaxLinesDescription":{"message":"Заглавията на видеоклиповете ще бъдат разпределени на толкова реда в предложенията."},"thumbnailSaturationLevel":{"message":"Ниво на наситеност на миниатюрата"},"whatSaturateThumbnails":{"message":"Прави миниатюрите по-малко ярки, като намалява цвета им"},"hideDetailsWhileFetching":{"message":"Скриване на подробностите при извличане"},"hideDetailsWhileFetchingDescription":{"message":"Скриване на заглавията и миниатюрите при извличане на данни от сървъра. Ако е деактивирано, заглавията и миниатюрите ще мигат, докато се сменят."},"ignoreTranslatedTitles":{"message":"Да не се показват преведените заглавия в YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"Понякога YouTube автоматично превежда заглавията на родния ви език. Тази опция се прилага само когато не е налично заглавие, предоставено от общността."},"onAllPages":{"message":"На всички страници","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"На всички страници, освен страниците с видео","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Никога"},"thumbnailGeneratorDescription1":{"message":"Услугата за генериране на миниатюри значително ускорява процеса на генериране на миниатюри, като изпраща анонимна заявка с videoID до отдалечен сървър. Миниатюрата ще бъде генерирана или извлечена от кеш, ако вече е била генерирана."},"thumbnailGeneratorDescription2":{"message":"Ако се използва на страници с видео, това може потенциално да доведе до изтичане на непубликувани videoID към този сървър. Задаването му на \"На всички страници, освен на страниците с видео\" ще избегне този проблем. Друга опция е да хостнете своя собствена услуга за генериране на миниатюри."},"thumbnailGeneratorDescription3":{"message":"Ако използването на услугата за генериране на миниатюри е деактивирано, всички заявки ще използват система за к-анонимност на заявките, която затруднява предвиждането от сървъра кои видеоклипове са били изтеглени, и ще се използва по-бавна локална услуга за генериране на миниатюри.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Изходен код на услугата за генериране на миниатюри"},"moreAboutKAnonymity":{"message":"Повече за к-анонимността","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Винаги да се показва бутона „Показване на оригинала“"},"whatAlwaysShowShowOriginalButton":{"message":"Ако искате винаги да знаете дали заглавието/миниатюрата са се променили, разрешете тази опция."},"showOriginalOnHover":{"message":"Смяна на персонализираните детайли и оригиналните детайли при преминаване върху тях"},"showOriginalOnHoverOfVideo":{"message":"Смяна на персонализираните детайли с оригиналните детайли при преминаване с мишката навсякъде върху видеокартата"},"showOriginalOnHoverOfVideoDescription":{"message":"Това ще деактивира автоматичното възпроизвеждане при преминаване на мишката"},"showCustomOnHoverIfCasual":{"message":"Показване на персонализирано заглавие при поставяне на мишката, ако се показва заглавие в нормален режим"},"showIconForFormattedTitles":{"message":"Показване на бутон „Покажи оригинала“ за автоматично форматираните заглавия"},"Enable":{"message":"Активиране"},"Titles":{"message":"Заглавия","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Миниатюри","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Гласове в нормален режим","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Грешка"},"ShowOriginal":{"message":"Показване на оригиналните детайли"},"ShowModified":{"message":"Показване на изменените подробности"},"ShowFormatted":{"message":"Показване на форматирани детайли"},"FillerWarning":{"message":"Внимание: Това е изключително агресивна категория. Най-вероятно ще се наложи да връщате пропуснатото или да го забраните понякога. Предупреждаваме ви, че при много видеоклипове се пропускат над 50% или повече от видеото! Не забравяйте обаче, че все пак има конкретни насоки, които трябва да се спазват при изпращане.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Присъединете се към Discord или Matrix, за да останете в този чат постоянно","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Показване на помощни насоки","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Избягвайте преувеличени изражения на лицето","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Мислете мащабно, не отговаряйте само на въпроса от оригиналното заглавие","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Избягвайте да описвате реакции на видеото (шокиращо)","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Предоставете достатъчно информация, за да може да се вземе информирано решение преди кликване"},"tip5":{"message":"Първата буква от изречението да е главна ","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Отметнете всички насоки за подаване","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Заглавието ми се пише с главна буква като изречение","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Заглавието ми не просто отговаря на въпроса, поставен в заглавието","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Заглавията трябва да описват видеоклипа или историята като цяло. Трябва да се уверите, че сте гледали цялото видео, за да разберете за какво всъщност става дума, вместо да разчитате на интригуващо оригинално заглавие.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Заглавието ми не обобщава заключението и не разваля излишно","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Заглавията нямат за цел да заместят изцяло гледането на видеоклипа, а по-скоро да ви помогнат да разберете дали да кликнете или не.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Заглавието ми не проверява фактите, не се подиграва и не критикува видеоклипа или създателя му","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Заглавията трябва да са от гледната точка на създателя и на видеото. Оценяването или проверката на фактите на самото видео е извън обхвата на DeArrow. Заглавията не са предназначени за секция за коментари.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Открита дума: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Не използвайте ненужни глаголи в началото на заглавието","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Започвайте всички заглавия с главна буква. Заглавията трябва да бъдат оформени като изречение","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Заглавията не трябва да завършват с точка","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Не добавяйте просто отговор на въпрос в първоначалното заглавие. Заглавията трябва да описват видеоклипа или историята като цяло","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Заглавията не трябва да проверяват фактите, да се подиграват или да критикуват видеоклипа или неговия създател","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Заглавията не трябва да запазват сензационни елементи от оригиналното заглавие","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Заглавията не трябва да съдържат емотикони","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Трябва да отстраните предупреждението преди изпращане"},"dearrowHelpSponsorBlockImported":{"message":"Забележка: Вашите настройки на SponsorBlock са автоматично импортирани!"},"howItWorks":{"message":"Как функционира"},"discordPromotion":{"message":"Присъединете се, направете някои предложения и помогнете в {discord} или {matrix}"},"deArrowDonationText":{"message":"Ако ви харесва това, което съм направил до момента, и искате да ми помогнете с пари, ето линк"},"termsAgreement":{"message":"Използвайки това разширение, вие се съгласявате с {privacy-policy} и {terms}"},"privacyPolicy":{"message":"Политика за поверителност"},"termsOfUse":{"message":"Условия за ползване"},"openSourceLicenses":{"message":"Лицензи за софтуер с отворен код"},"defaultToOriginals":{"message":"По подразбиране към оригиналната информация за видеоклипа"},"whatDefaultToOriginals":{"message":"Показване на оригиналното заглавие и миниатюра по подразбиране, но да има бутон, който се появява при преминаване, за да се видят персонализираните заглавия и миниатюри."},"replaceTitles":{"message":"Замяна на заглавията"},"replaceThumbnails":{"message":"Замяна на миниатюрите"},"useCrowdsourcedTitles":{"message":"Използване на заглавия от общността"},"whatUseCrowdsourcedTitles":{"message":"Ако е деактивирано, ще се форматират заглавията, но няма да се използват подадените от общността заглавия","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Наистина ли искате да изтриете тази конфигурация?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Нова конфигурация"},"DeleteConfiguration":{"message":"Изтриване на конфигурацията"},"ChannelAllowlist":{"message":"Специфични за канала настройки"},"ConfigurationName":{"message":"Име на конфигурация"},"ChannelListInstructions":{"message":"Въведете в полето по-долу всички канали, които искате да приложите към тази конфигурация, разделени с нови редове. Поддържат се както идентификатори на канали, така и показвани имена. @Потребителските имена не се поддържат. Можете да получите идентификаторите на каналите, като щракнете върху бутона за споделяне в страницата за канала. За да стигнете до страницата за канала, щракнете върху описанието на канала, което се появява под името му на страницата му.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Все още няма настроени конфигурации. Щракнете върху бутона в горната част, за да добавите нова конфигурация.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Спрете примамките за кликване, като замените заглавията и миниатюрите с по-точни"},"DeArrowPromotionMessage2":{"message":"Омръзнаха ли ви примамките за кликване? Вижте новото ми разширение за подобряване на заглавията и миниатюрите"},"DeArrowPromotionMessage3":{"message":"Също така вижте DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Не ви харесва това заглавие? Ако предпочитате заглавието по-долу, разгледайте функцията за замяна на заглавия в DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Тази миниатюра е избрана на случаен принцип, тъй като все още няма подадена информация за този видеоклип","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Тази миниатюра е избрана на случаен принцип, а заглавието е автоматично форматирано, защото все още няма подадена информация за този видеоклип","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Можете да промените това по подразбиране по-долу","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} заглавия и {thumbnails} миниатюри са заменени, откакто сте инсталирали това разширение","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} заглавие ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} заглавия ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"и {thumbnails} миниатюра","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"и {thumbnails} миниатюри","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} са заменени, откакто сте инсталирали това разширение","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Брой замествания на заглавия и миниатюри"},"countReplacementsDescription":{"message":"Използва се за предоставяне на статистически данни в изскачащия прозорец.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Добавете списък с филтри за блокиране на проучвания, раздел за стоки и други рекламни елементи в страницата, с помощта на yt-neuter"},"requiresUblock":{"message":"Изисква uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Нещо се обърка при откриването ID на видеото. Моля, опитайте да опресните преди да го изпратите, за да се уверите, че е изпратено за правилното видео. Ако това се случва често, моля изпратете доклад за това заедно с другите разширения или потребителски скриптове, които сте инсталирали, чрез GitHub, Discord или Matrix."},"dearrowLogoCredit":{"message":"Лого, базирано на Twemoji, лицензирано под CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock не е съвместим с разширението \"Zoom to Fill\". Има много алтернативи, които можете да използвате вместо него и които ще работят правилно."},"freeTrialStarted":{"message":"Вашият безплатен пробен период стартира успешно. Посетете YouTube, за да го изпробвате"},"freeTrialEnded":{"message":"Вашият безплатен пробен период приключи"},"freeTrialPrompt":{"message":"Ако искате да я изпробвате за един час, можете да започнете безплатен пробен период с бутона по-долу."},"startFreeTrial":{"message":"Начало на безплатния пробен период"},"freeAccessRequested":{"message":"Успешно сте регистрирани за безплатен достъп. Ще бъдете уведомени, когато ви бъде предоставен безплатен достъп."},"freeAccessComplete":{"message":"Поздравления! Вече имате безплатен достъп до DeArrow"},"DeArrowNotActivated":{"message":"DeArrow не е активиран"},"ActivateDeArrow":{"message":"Активиране на DeArrow"},"DeArrowIsActivated":{"message":"DeArrow е успешно активиран"},"Close":{"message":"Затваряне"},"ViewLicenseKey":{"message":"Преглед на лицензния ключ"},"SharingIsCaring":{"message":"Споделянето е грижа"},"cleanPopup":{"message":"Скриване на претрупването в изскачащия прозорец на списъка със сегменти"},"hideSegmentCreationInPopup":{"message":"Скриване на бутоните за създаване на сегменти в изскачащия прозорец"},"syncDisabledWarning":{"message":"Внимание: Съхранението на данни на разширението е деактивирано във вашия браузър. Настройките няма да бъдат запазени, ако се опитате да ги запазите."},"syncDisabledWarningDeArrow":{"message":"DeArrow няма да функционира без хранилище."},"syncDisabledFirefoxSuggestions":{"message":"Можете да го активирате, като отидете в about:config и зададете стойността на „webextensions.storage.sync.enabled“ на true."},"storageFull":{"message":"Мястото за съхранение на разширението е пълно. Моля, изтрийте някои неподадени сегменти в опциите."},"previewSegmentRequired":{"message":"Моля, прегледайте сегментите си, преди да ги изпратите. Можете да направите това, като кликнете върху бутона за преглед или като използвате следния пряк път:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Действайте като VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"В момента не могат да бъдат приемани заявки от браузъра ви, тъй като YouTube изглежда е инжектирал някои реклами от страна на сървъра, които разширението не може да премахне. Моля, свържете се с нас, ако получавате тази грешка."},"DeArrowIsDisabled":{"message":"DeArrow е деактивиран - кликнете, за да го активирате","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Сигурни ли сте, че тази оригинална миниатюра отговаря на насоките на DeArrow? Ако просто предпочитате да виждате оригинални миниатюри по принцип, помислете дали да не промените опцията „Когато няма подадена миниатюра“ в настройките на DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"В YouTube TV SponsorBlock не е съвместим с живо и наскоро записано съдържание. Ако това е скорошен запис, моля, изчакайте няколко часа, за да стане достъпна обработената версия на записа.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Белият списък на каналите не се поддържа в tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Харесвате ли оригиналното заглавие?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Да"},"No":{"message":"Не"},"votes":{"message":"{0} гласа","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} глас","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Смешно","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Творческо","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Умно","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Описателно","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Други","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Класически режим","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Заглавията се заменят със стандартизирани формати въз основа на насоките за всички видеоклипове, за които има заглавие, предоставено от аудиторията."},"CasualMode":{"message":"Нормален режим","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Запазете оригиналните заглавия, когато те описват видеоклипа достатъчно добре и са умни или забавни.\nИзберете кои категории заглавия искате да виждате.\nЩе можете да гласувате дали дадено заглавие се вписва в дадена категория или не."},"minimumVotes":{"message":"Минимум гласове","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Показване на оригиналната миниатюра на гласуваните видеоклипове в нормален режим","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Нова функция: Нормален режим","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Показване на иконата за нормален режим само когато е налично персонализирано заглавие"},"OpenSettings":{"message":"Отваряне на настройките"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/bn/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/bn/messages.json @@ -0,0 +1 @@ +{"0":{"message":"সংযোগের সময়সীমা অতিক্রান্ত। আপনার ইন্টারনেট সংযোগ যাচাই করুন. যদি আপনার ইন্টারনেট কাজ করে থাকে তবে সার্ভারটি সম্ভবত ওভারলোডেড বা ডাউন।"},"400":{"message":"সার্ভার বলেছে এই অনুরোধটি অবৈধ"},"409":{"message":"এটি আগেই জমা দেওয়া হয়েছে"},"502":{"message":"সার্ভারটি সম্ভবত ওভারলোডেড। কয়েক সেকেন্ডের মধ্যে আবার চেষ্টা করুন।"},"fullName":{"message":"ইউটিউবের জন্য স্পনসরব্লক - স্পনসরশিপ এড়িয়ে যান","description":"Name of the extension."},"Description":{"message":"YouTube ভিডিওতে স্পনসরশিপ, সাবস্ক্রিপশন ভিক্ষা এবং আরও অনেক কিছু এড়িয়ে যান। অন্যদের সময় বাঁচাতে আপনার দেখা ভিডিওগুলিতে স্পনসরদের রিপোর্ট করুন।","description":"Description of the extension."},"channelWhitelisted":{"message":"চ্যানেল সাদা তালিকাভুক্ত!"},"Segment":{"message":"অংশ"},"Segments":{"message":"অংশগুলো"},"SegmentsCap":{"message":"অংশগুলো"},"Chapters":{"message":"অধ্যায়সমূহ"},"renderAsChapters":{"message":"অংশসমূহকে অধ্যায়সমূহতে পরিণত করুন","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"ভিডিও সময়ের পাশে বর্তমান সেগমেন্ট দেখান"},"upvoteButtonInfo":{"message":"এই জমাটিকে সমর্থন করুন"},"reportButtonTitle":{"message":"রিপোর্ট"},"reportButtonInfo":{"message":"এই জমাটি ভুল হিসাবে রিপোর্ট করুন।"},"Dismiss":{"message":"খারিজ করুন"},"Loading":{"message":"লোড করা হচ্ছে..."},"Hide":{"message":"কখনো দেখাবে না"},"hitGoBack":{"message":"আপনি যেখান থেকে এসেছেন সেখানে যেতে আনস্কিপ টিপুন"},"unskip":{"message":"বাদ দিন"},"reskip":{"message":"বাদ দিন"},"unmute":{"message":"সরব করুন"},"paused":{"message":"বিরতি"},"manualPaused":{"message":"টাইমার থেমেছে"},"confirmMSG":{"message":"পৃথক মান সম্পাদনা করতে বা মুছতে, তথ্য বোতামে ক্লিক করুন বা উপরের ডানদিকের কোণায় এক্সটেনশন আইকনে ক্লিক করে এক্সটেনশন পপআপ খুলুন।"},"clearThis":{"message":"আপনি কি পরিষ্কার করতে চান?"},"Unknown":{"message":"আপনার স্পনসর জমা দেওয়ার সময় একটি ত্রুটি হয়েছে, অনুগ্রহ করে পরে আবার চেষ্টা করুন৷"},"sponsorFound":{"message":"এই ভিডিওটি ডাটাবেসে সেগমেন্ট আছে!"},"sponsor404":{"message":"কোনো সেগমেন্ট পাওয়া যায়নি"},"sponsorStart":{"message":"অংশ এখন শুরু হয়"},"sponsorEnd":{"message":"অংশ এখন শেষ হয়"},"sponsorCancel":{"message":"সেগমেন্ট তৈরি করা বাতিল করুন"},"noVideoID":{"message":"কোনো ইউটিউব ভিডিও পাওয়া যায়নি।\nযদি এটি ভুল হয়, ট্যাব রিফ্রেশ করুন।"},"refreshSegments":{"message":"সেগমেন্ট রিফ্রেশ করুন"},"success":{"message":"সফল!"},"voted":{"message":"ভোট দিয়েছেন!"},"serverDown":{"message":"মনে হচ্ছে সার্ভার ডাউন। অবিলম্বে বিকাশকারীর সাথে যোগাযোগ করুন।"},"connectionError":{"message":"একটি সংযোগ ত্রুটি ঘটেছে. ভুল সংকেত: "},"segmentsStillLoading":{"message":"সেগমেন্ট এখনো লোড হচ্ছে..."},"clearTimes":{"message":"বিভাগগুলি পরিষ্কার করুন"},"openPopup":{"message":"স্পনসরব্লক পপআপ খুলুন"},"closePopup":{"message":"পপআপ বন্ধ করুন"},"closeIcon":{"message":"বন্ধ করার চিহ্ন"},"OpenSubmissionMenu":{"message":"সাবমিশন মেন্যু খুলুন"},"sortSegments":{"message":"সংক্ষিপ্ত অংশ"},"submitCheck":{"message":"আপনি কি এটি জমা দেওয়ার বিষয়ে নিশ্চিত?"},"whitelistChannel":{"message":"সাদা তালিকার চ্যানেল"},"removeFromWhitelist":{"message":"সাদা তালিকা থেকে চ্যানেল সরান"},"voteOnTime":{"message":"একটি বিভাগে ভোট দিন"},"Submissions":{"message":"জমা"},"savedPeopleFrom":{"message":"আপনি মানুষকে রক্ষা করেছেন "},"viewLeaderboard":{"message":"শীর্ষতালিকা"},"recordTimesDescription":{"message":"সাবমিট"},"submissionEditHint":{"message":"আপনি জমা ক্লিক করার পরে বিভাগ সম্পাদনা প্রদর্শিত হবে","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"ইঙ্গিত: আপনি বিকল্পগুলিতে জমা দেওয়ার জন্য কীবাইন্ড সেটআপ করতে পারেন"},"clearTimesButton":{"message":"সময় মুছুন"},"Username":{"message":"ব্যবহারকারীর নাম"},"setUsername":{"message":"ব্যবহারকারীর নাম দিন"},"copyPublicID":{"message":"পাবলিক ইউজার আইডি কপি করুন"},"copySegmentID":{"message":"অংশের আইডি কপি করুন"},"hideThis":{"message":"এই বিষয়বস্তু লুকান"},"Options":{"message":"বিকল্পসমূহ"},"showButtons":{"message":"ইউটিউব প্লেয়ারে বোতাম দেখান"},"hideButtonsDescription":{"message":"এটি স্কিপ সেগমেন্ট জমা দেওয়ার জন্য ইউটিউব প্লেয়ারে প্রদর্শিত বোতামগুলিকে লুকিয়ে রাখে।"},"showSkipButton":{"message":"প্লেয়ারে বোতাম হাইলাইট করতে এড়িয়ে যান"},"showInfoButton":{"message":"ইউটিউব প্লেয়ারে তথ্য বোতাম দেখান"},"autoHideInfoButton":{"message":"অটো-লুকান তথ্য বোতাম"},"showDeleteButton":{"message":"ইউটিউব প্লেয়ারে ডিলিট বোতাম দেখান"},"enableViewTracking":{"message":"স্কিপ কাউন্ট ট্র্যাকিং সক্ষম করুন"},"whatViewTracking":{"message":"এই বৈশিষ্ট্যটি ট্র্যাক করে যে আপনি কোন বিভাগগুলি এড়িয়ে গেছেন ব্যবহারকারীদের জানাতে যে তাদের জমা দেওয়া অন্যদের কতটা সাহায্য করেছে এবং স্প্যাম ডাটাবেসে প্রবেশ না করে তা নিশ্চিত করার জন্য আপভোট সহ একটি মেট্রিক হিসাবে ব্যবহার করা হয়েছে৷ আপনি যখনই একটি সেগমেন্ট এড়িয়ে যান তখন এক্সটেনশনটি সার্ভারে একটি বার্তা পাঠায়। আশা করি অধিকাংশ মানুষ এই সেটিং পরিবর্তন করবেন না যাতে ভিউ সংখ্যা সঠিক হয়। :)"},"enableViewTrackingInPrivate":{"message":"ব্যক্তিগত/ছদ্মবেশী ট্যাবে গণনা ট্র্যাকিং এড়িয়ে যাওয়া সক্ষম করুন৷"},"enableTrackDownvotes":{"message":"স্টোর সেগমেন্ট ডাউনভোট"},"whatTrackDownvotes":{"message":"যেকোন ডাউনভোটকৃত অংশ রিফ্রেশ করার পরেও অদৃশ্য থাকবে"},"trackDownvotesWarning":{"message":"সতর্কীকরণ: এটি বন্ধ করলে পূর্বে সংরক্ষিত সব ডাউনভোট মুছে যাবে"},"enableQueryByHashPrefix":{"message":"হ্যাশের প্রিফিক্স দিয়ে খুজুন "},"whatQueryByHashPrefix":{"message":"সার্ভার থেকে videoID দিয়ে অংশ অনুরোধ করার পরিবর্তে videoID এর হ্যাশ এর প্রথম ৪ অক্ষর পাঠানো হয়। এই সার্ভার সমতুল্য হ্যাশ এর সকল ভিডিও এর তথ্য ফেরত পাঠাবে।"},"enableShowCategoryWithoutPermission":{"message":"জমার অনুমতি ছাড়াই বিভাগসমূহকে জমা মেনুতে দেখান"},"whatShowCategoryWithoutPermission":{"message":"নূন্যতম খ্যাতি প্রয়োজনীয়তার কারণে কিছু বিভাগ জমা দিতে অনুমতি প্রয়োজন"},"showNotice":{"message":"নোটিশ পুনরায় প্রদর্শন করুন"},"showSkipNotice":{"message":"একটি অংশ এড়ানোর পরে নোটিস প্রদর্শন করুন"},"showCategoryGuidelines":{"message":"বিভাগের সাহায্য দেখান"},"noticeVisibilityMode0":{"message":"পূর্ণ আকারের স্কিপ নোটিস"},"noticeVisibilityMode1":{"message":"স্বয়ংক্রিয় স্কিপের জন্য ক্ষুদ্র আকারের স্কিপ নোটিস"},"noticeVisibilityMode2":{"message":"সব ক্ষুদ্র আকারের স্কিপ নোটিস"},"noticeVisibilityMode3":{"message":"স্বয়ংক্রিয় স্কিপের জন্য অনুজ্বল স্কিপ নোটিস"},"noticeVisibilityMode4":{"message":"সব অনুজ্বল স্কিপ নোটিস"},"longDescription":{"message":"SponsorBlock আপনাকে YouTube ভিডিওসমূহের স্পন্সর বার্তা, সূচনাবার্তা, সমাপ্তিবার্তা, সাবস্ক্রাইব করার জন্য স্মরণ করানো, এবং অন্যান্য বিবিধ বিরক্তিকর অংশ এড়িয়ে যেতে সাহায্য করে। SponsorBlock জনসংগৃহীত তথ্যসম্বলিত একটি ব্রাউজার এক্সটেনশন যা যে কাউকে একটি ভিডিওর স্পন্সর বার্তা এবং অন্যান্য অংশের শুরু এবং শেষ সময় সাবমিট করতে দেয়। যখন কেউ একজন এই তথ্য সাবমিট করে, এই এক্সটেনশন ব্যবহারকারী সবাই ঐ স্পন্সর বার্তা সম্বলিত অংশ এড়িয়ে যাবে। মিউজিক ভিডিও এর মিউজিক বহির্ভুত অংশও আপনি এড়িয়ে যেতে পারেন।","description":"Full description of the extension on the store pages."},"website":{"message":"ওয়েবসাইট","description":"Used on Firefox Store Page"},"sourceCode":{"message":"সোর্স কোড","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"নোটিসটি আপগ্রেড করা হয়েছে!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"আপনি যদি এখনও এটি পছন্দ না করেন তবে কখনই দেখাবে না বোতামটি চাপুন।","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"সেগমেন্ট এড়িয়ে যান","description":"Keybind label"},"setStartSponsorShortcut":{"message":"সেগমেন্ট শুরু/শেষ","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"সাবমিশন মেনু খুলুন","description":"Keybind label"},"setSubmitKeybind":{"message":"সেগমেন্ট জমা দিন","description":"Keybind label"},"setPreviewKeybind":{"message":"সেগমেন্ট প্রিভিউ দেখুন","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"এড়িয়ে যাওয়ার বিজ্ঞপ্তি বন্ধ করুন","description":"Keybind label"},"nextChapterKeybind":{"message":"পরবর্তী অধ্যায়","description":"Keybind label"},"previousChapterKeybind":{"message":"পূর্ববর্তী অধ্যায়","description":"Keybind label"},"keybindDescription":{"message":"এটি টাইপ করে একটি কী নির্বাচন করুন এবং আপনি যে কোনও সংশোধক কীগুলি ব্যবহার করতে চান তা চয়ন করুন।"},"disableSkipping":{"message":"স্কিপিং চালু করা হয়েছে"},"enableSkipping":{"message":"স্কিপিং বন্ধ করা হয়েছে"},"yourWork":{"message":"আপনার কাজ","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"ইরোর কোডঃ "},"skip":{"message":"এড়িয়ে যান"},"mute":{"message":"নিঃশব্দ করুন"},"full":{"message":"সমপূর্ণ ভিডিও","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} এড়িয়ে যান?"},"mute_category":{"message":"{0} নিঃশব্দ করুন?"},"skip_to_category":{"message":"{0} তে চলে যান?","description":"Used for skipping to things (Skip to Highlight)"},"skipped":{"message":"{0} এড়িয়ে যাওয়া হয়েছে","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} নিঃশব্দ করা হয়েছে","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"{0} তে চলে যাওয়া হয়েছে","description":"Used for skipping to things (Skipped to Highlight)"},"disableAutoSkip":{"message":"স্বয়ংক্রিয়ভাবে স্কিপ করা বন্ধ করুন"},"enableAutoSkip":{"message":"স্বয়ংক্রিয়ভাবে স্কিপ করা চালু করুন"},"audioNotification":{"message":"স্কিপের জন্য অডিও নোটিস"},"audioNotificationDescription":{"message":"যখনই কোনও অংশ এড়িয়ে যাওয়া হয় তখন একটি শব্দ বাজাবে। যদি বন্ধ করা হয় (বা অটো স্কিপ বন্ধ থাকে) তবে কোনও শব্দ বাজানো হবে না।"},"showTimeWithSkips":{"message":"স্কিপগুলি সরানো সহ সময় দেখান"},"showTimeWithSkipsDescription":{"message":"এই সময়টি সময় বারের নীচে বর্তমান সময়ের পাশের বন্ধনীগুলিতে উপস্থিত হয়। এটি মোট ভিডিও সময়কাল যে কোনও বিভাগকে বিয়োগ করে তা দেখায়। এর মধ্যে কেবল \"সময় বার এ দেখান\" হিসাবে চিহ্নিত বিভাগগুলি অন্তর্ভুক্ত রয়েছে।"},"youHaveSkipped":{"message":"আপনি এড়িয়েছেন "},"minLower":{"message":"মিনিট"},"minsLower":{"message":"মিনিট"},"hourLower":{"message":"ঘন্টা"},"hoursLower":{"message":"ঘন্টা"},"youHaveSavedTime":{"message":"আপনি মানুষকে রক্ষা করেছেন","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":"তাদের জীবন থেকে","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"সার্ভারের স্ট্যাটাস এর জন্য status.sponsor.ajay.app দেখুন করুন।"},"changeUserID":{"message":"‌আপনার ব্যক্তিগত ব্যবহারকারী আইডি ইম্পোর্ট/এক্সপোর্ট করুন"},"whatChangeUserID":{"message":"এটি ব্যক্তিগত রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে ভাগ করা উচিত নয়। কারও যদি এটি থাকে তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে। আপনি যদি আপনার পাবলিক ইউজারআইডি খুঁজছেন তবে পপআপে ক্লিপবোর্ড আইকনটি ক্লিক করুন।"},"setUserID":{"message":"ব্যক্তিগত ব্যবহারকারী আইডি সেট করুন"},"userIDChangeWarning":{"message":"সতর্কতা: ব্যক্তিগত ব্যবহারকারী আইডি পরিবর্তন চিরস্থায়ী। আপনি কি নিশ্চিত যে আপনি এটি করত এ চান? এক্ষেত্রে আপনার পুরাতন আইডির ব্যাকআপ নিশ্চিত করুন। "},"createdBy":{"message":"সৃষ্টি করেছেন"},"supportOtherSites":{"message":"এটি ৩য় পক্ষের ইউটইউব সাইট সাপোর্ট করে"},"supportOtherSitesDescription":{"message":"তৃতীয় পক্ষ YouTube ক্লায়েন্ট সমর্থন করে। এটি চালু করার জন্য আপনাকে কিছু অতিরিক্ত পারমিশনে সম্মতি দিতে হবে।","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"সমর্থিত সাইটসমুহ:"},"optionsInfo":{"message":"Indivious সমর্থন সক্ষম করুন, অটোস্কিপ বন্ধ করুন, বোতামগুলি লুকান এবং আরও অনেক কিছু করুন।"},"addInvidiousInstance":{"message":"তৃতীয় পক্ষের ক্লায়েন্ট যুক্ত করুন"},"addInvidiousInstanceDescription":{"message":"একটি কাস্টম উদাহরণ যুক্ত করুন। এটি অবশ্যই ডোমেন দিয়ে ফর্ম্যাট করা উচিত। উদাহরণ: invidious.ajay.app"},"add":{"message":"যোগ করুন"},"addInvidiousInstanceError":{"message":"এটি একটি অবৈধ ডোমেন। এটিতে কেবল ডোমেন অংশ অন্তর্ভুক্ত করা উচিত। উদাহরণ: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Invidious Instance এর তালিকা পুনরায় সেট করুন"},"resetInvidiousInstanceAlert":{"message":"আপনি এখন Invidious Instance এর তালিকা পুনরায় আগের মত করে দিবেন"},"currentInstances":{"message":"বর্তমান Instance এর তালিকা"},"minDuration":{"message":"সর্বনিম্ন দৈর্ঘ্য (সেকেন্ড):"},"minDurationDescription":{"message":"সেট করা মান (সেকেন্ডে) থেকে ছোট সেগমেন্টগুলি প্লেয়ারে এড়িয়ে যাওয়া হবে বা দেখানো হবে না"},"enableManualSkipOnFullVideo":{"message":"সম্পূর্ণ ভিডিওর লেবেল যুক্ত থাকলে ম্যানুয়াল স্কিপ দেখান"},"whatManualSkipOnFullVideo":{"message":"যারা ভিডিওটি সম্পূর্ণ স্পন্সর বা স্ব-প্রচার হলে নিরবচ্ছিন্নভাবে দেখতে চান তাদের জন্য."},"skipNoticeDuration":{"message":"নোটিশ প্রদর্শন করার দৈর্ঘ্য (সেকেন্ড):"},"skipNoticeDurationDescription":{"message":"স্কিপ নোটিশটি কমপক্ষে এত সেকেন্ডের জন্য স্ক্রিনে থাকবে। নিজে এড়িয়ে যাওয়ার জন্য, এটি দীর্ঘকাল ধরে দৃশ্যমান হতে পারে।"},"shortCheck":{"message":"নিম্নলিখিত সাবমিশনটি আপনার ন্যূনতম সময়কাল অপশনের চেয়ে কম। এর মানে এই হতে পারে যে এটি ইতিমধ্যে জমা দেওয়া হয়েছে, এবং এই অপশনের কারণে উপেক্ষা করা হচ্ছে। আপনি কি জমা দিতে চান?"},"liveOrPremiere":{"message":"একটি সক্রিয় লাইভস্ট্রিম বা প্রিমিয়ারে জমা দেওয়ার অনুমতি নেই। এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন, তারপরে পৃষ্ঠাটি রিফ্রেশ করুন এবং অংশগুলি এখনও বৈধ কিনা তা যাচাই করুন।"},"showUploadButton":{"message":"আপলোড করার বোতামটি দেখান"},"customServerAddress":{"message":"স্পনসরব্লক সার্ভার ঠিকানা"},"customServerAddressDescription":{"message":"এ ঠিকানা SponsorBlock সার্ভারে সাথে যোগাযোগ করতে ব্যবহার করে।\nআপনার নিজের সার্ভার না থাকলে এটি পরিবর্তন করবেন না।"},"dataFetchingServerAddress":{"message":"ডেটা আনয়ন সার্ভারের ঠিকানা"},"dataFetchingServerAddressDescription":{"message":"ডেটা আনার সার্ভারে কল করতে ব্যবহৃত ঠিকানা।\nআপনার নিজের সার্ভার না থাকলে, এটি পরিবর্তন করা উচিত নয়।."},"thumbnailCacheServerAddress":{"message":"থাম্বনেল ক্যাশে সার্ভারের ঠিকানা"},"save":{"message":"সংরক্ষণ করুন"},"reset":{"message":"পুনরায় সেট করুন"},"customAddressError":{"message":"এই ঠিকানাটি সঠিক আকারে নেই। এটিতে http: // বা https: // শুরুতে এবং কোনও পিছনের স্ল্যাশ নেই তা নিশ্চিত করুন।"},"areYouSureReset":{"message":"আপনি কি নিশ্চিতভাবে এটি মুছে ফেলতে চান??"},"mobileUpdateInfo":{"message":"m.youtube.com এখন সাপর্টেড"},"exportOptions":{"message":"সব অপশন ইম্পোর্ট/এক্সপোর্ট করুন"},"exportOtherData":{"message":"অন্যান্য সমস্ত ডেটা আমদানি/রপ্তানি করুন"},"exportOptionsCopy":{"message":"সম্পাদন/কপি করুন"},"exportOptionsDownload":{"message":"ফাইল এ সেভ করুন"},"exportOptionsUpload":{"message":"ফাইল থেকে লোড করুন"},"whatExportOptions":{"message":"এটি JSON-এ আপনার সম্পূর্ণ কনফিগারেশন। এতে আপনার ব্যক্তিগত UserID অন্তর্ভুক্ত রয়েছে, তাই এটিকে বিজ্ঞতার সাথে শেয়ার করতে ভুলবেন না."},"setOptions":{"message":"অপশন সেট করুন"},"exportOptionsWarning":{"message":"সতর্কতা: অপশনগুলি পরিবর্তন করা চিরস্থায়ী এবং আপনার ইনস্টলটি ভাঙতে পারে। আপনি কি নিশ্চিত যে আপনি এটি করতে চান? আপনার পুরানোটিকে সাবধানতার সার্থে ব্যাকআপ করার বিষয়টি নিশ্চিত করুন।"},"incorrectlyFormattedOptions":{"message":"এই JSON সঠিকভাবে ফর্ম্যাট করা হয় নাই। আপনার অপশনগুলি পরিবর্তন করা হয়নি।"},"confirmNoticeTitle":{"message":"অংশ জমা দিন"},"submit":{"message":"জমা দিন"},"cancel":{"message":"বাতিল করুন"},"delete":{"message":"মুছে ফেলুন"},"preview":{"message":"প্রিভিউ দেখুন"},"unsubmitted":{"message":"জমাকৃত নয়"},"inspect":{"message":"পরিদর্শন করুন"},"edit":{"message":"সম্পাদন করুন"},"copyDebugInformation":{"message":"ডিবাগ তথ্য ক্লিপবোর্ডে কপি করুন"},"copyDebugInformationFailed":{"message":"ক্লিপবোর্ডে কপি করা যায় নি"},"copyDebugInformationOptions":{"message":" কোনও বাগ উত্থাপন করার সময় / যখন কোনও ডেভেলপার এটির জন্য অনুরোধ করে তখন ক্লিপবোর্ডে তথ্য কপি করে। সংবেদনশীল তথ্য যেমন আপনার ইউজার আইডি, সাদা তালিকাভুক্ত চ্যানেল এবং কাস্টম সার্ভারের ঠিকানা সরানো হয়েছে। তবে এটিতে আপনার ব্যবহারকারীর, ব্রাউজার, অপারেটিং সিস্টেম এবং এক্সটেনশন সংস্করণ নম্বরের মতো তথ্য রয়েছে।"},"copyDebugInformationComplete":{"message":"ডিবাগের তথ্য ক্লিপ বোর্ডে কপি করা হয়েছে। আপনি কোনও তথ্য দিতে অনিচ্ছুক হলে তা নির্দ্বিধায় অপসারণ করতে পারেন। এটি একটি টেক্সট ফাইলে সংরক্ষণ করুন বা বাগ প্রতিবেদনে পেস্ট করুন।"},"keyAlreadyUsed":{"message":"এই শর্টকাটটি অন্য ক্রিয়ায় আবদ্ধ। দয়া করে একটি আলাদা নির্বাচন করুন।"},"to":{"message":"থেকে","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"কপি হয়েছে!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline2":{"message":"এমনভাবে চালায় যেন কিছুই বাদ যায়নি"},"category_sponsor":{"message":"স্পন্সর"},"category_sponsor_description":{"message":"পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়।"},"category_sponsor_guideline1":{"message":"পেইড প্রচারণা"},"category_sponsor_guideline2":{"message":"অনুদান বা কাস্টম পণ্যদ্রব্যের জন্য নয়"},"category_selfpromo":{"message":"বিনা অর্থপ্রাপ্ত/স্ব-প্রচার"},"category_selfpromo_description":{"message":"অবৈতনিক বা স্ব -প্রচার ব্যতীত \"স্পনসর\" এর মতো। এর মধ্যে পণ্যদ্রব্য, অনুদান বা তারা কার সাথে সহযোগিতা করেছে সে সম্পর্কে তথ্য অন্তর্ভুক্ত রয়েছে।"},"category_exclusive_access":{"message":"এক্সক্লুসিভ অ্যাক্সেস"},"category_exclusive_access_description":{"message":"শুধুমাত্র পুরো ভিডিও লেবেল করার জন্য। যখন কোনও ভিডিও কোনও পণ্য, পরিষেবা বা অবস্থান প্রদর্শন করে যা তারা নিখরচায় বা ভর্তুকিযুক্ত অ্যাক্সেস পেয়েছে।"},"category_exclusive_access_pill":{"message":"এই ভিডিওটি এমন একটি পণ্য, পরিষেবা বা অবস্থান প্রদর্শন করে যা তারা নিখরচায় বা ভর্তুকিযুক্ত অ্যাক্সেস পেয়েছে","description":"Short description for this category"},"category_interaction":{"message":"ইন্টারঅ্যাকশন রেমাইন্ডার (সাবস্ক্রাইব)"},"category_interaction_description":{"message":"যখন সামগ্রীর মাঝখানে তাদেরকে লাইক, সাবস্ক্রাইব বা ফলো করার জন্য একটি সংক্ষিপ্ত অনুস্মারক থাকে। যদি এটি দীর্ঘ বা নির্দিষ্ট কিছু সম্পর্কে হয় তবে পরিবর্তে এটি স্ব -প্রচারের অধীনে থাকা উচিত।"},"category_interaction_short":{"message":"ইন্টারঅ্যাকশন রেমাইন্ডার"},"category_intro":{"message":"ইন্টারমিশন/ইন্ট্র অ্যানিমেশন"},"category_intro_description":{"message":"প্রকৃত বিষয়বস্তু ছাড়াই একটি বিরতি। বিরতি, স্থির ফ্রেম, অ্যানিমেশন পুনরাবৃত্তি হতে পারে। এটি তথ্যযুক্ত ট্রানজিশনের জন্য ব্যবহার করা উচিত নয়।"},"category_intro_short":{"message":"ইন্টারমিশন"},"category_intro_guideline1":{"message":"মূল কনটেন্ট ব্যতীত ব্যবধান"},"category_outro":{"message":"এন্ডকার্ডস/ক্রেডিট"},"category_outro_description":{"message":"ক্রেডিট বা যখন ইউটিউব এন্ডকার্ডগুলি উপস্থিত হয়। তথ্য সহ সিদ্ধান্তের জন্য নয়।"},"category_preview_guideline2":{"message":"আগের ভিডিওর রিক্যাপ"},"category_music_offtopic":{"message":"সঙ্গীত: অসঙ্গীত বিভাগ"},"category_music_offtopic_description":{"message":"শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনও বিভাগ দ্বারা আচ্ছাদিত নয়।"},"category_music_offtopic_short":{"message":"মিউসিক নয়"},"category_poi_highlight":{"message":"গুরুত্বপূর্ণ"},"category_poi_highlight_description":{"message":"ভিডিওর অংশটি যা বেশিরভাগ লোকেরা খুঁজছেন। \"ভিডিওটি x এ শুরু হয়\" মন্তব্যের মতো।"},"category_chapter":{"message":"অধ্যায়"},"category_livestream_messages":{"message":"লাইভস্ট্রিম: অনুদান/বার্তা পাঠ"},"category_livestream_messages_short":{"message":"বার্তা পাঠ"},"autoSkip":{"message":"স্বয়ংক্রিয়ভাবে এড়িয়ে যান"},"manualSkip":{"message":"নিজে এড়িয়ে যান"},"showOverlay":{"message":"সময় বার এ দেখান"},"disable":{"message":"নিষ্ক্রিয় করুন"},"autoSkip_POI":{"message":"স্বয়ংক্রিয় ভাবে শুরুতে স্কিপ করুন"},"manualSkip_POI":{"message":"ভিডিও লোড হলে জিজ্ঞেস করুন"},"showOverlay_POI":{"message":"সময় বার এ দেখান"},"showOverlay_full":{"message":"লেবেল দেখান"},"showOverlay_chapter":{"message":"অধ্যায়গুলো দেখান"},"autoSkipOnMusicVideos":{"message":"যখন অ-সংগীত বিভাগ থাকে তখন স্বয়ংক্রিয়ভাবে সমস্ত বিভাগগুলি এড়িয়ে যান"},"muteSegments":{"message":"স্কিপের পরিবর্তে অডিও নিঃশব্দ এমন বিভাগগুলিকে দেখানোর অনুমতি দিন"},"fullVideoSegments":{"message":"যখন কোনও ভিডিও সম্পূর্ণ বিজ্ঞাপন হয় তখন একটি আইকন দেখান","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"previewColor":{"message":"জমাকৃত নয় এমন অংশের রঙ","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"সময় বারের রঙ"},"category":{"message":"বিভাগ"},"skipOption":{"message":"সেগমেন্ট এড়িয়ে যাওয়ার অপশন","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"বিটা টেস্টিং প্রোগ্রামে যোগদান করুন"},"whatEnableTestingServer":{"message":"আপনার জমাকৃত অংশ এবং ভোটগুলি মূল সার্ভারের হিসাবে গণনা করা হবে না। কেবল পরীক্ষার জন্য এটি ব্যবহার করুন।"},"testingServerWarning":{"message":"সমস্ত জমাকৃত অংশ এবং ভোট টেস্ট সার্ভারের সাথে সংযোগ করার সময় মূল সার্ভারের হিসাবে গণনা করা হবেনা। আপনি যখন সত্যিকারের অংশ ও ভোট জমা দিতে চান তখন এটি বন্ধ করার বিষয়টি নিশ্চিত করুন।"},"bracketNow":{"message":"(এখন)"},"moreCategories":{"message":"আরো বিভাগ"},"chooseACategory":{"message":"বিভাগ নির্বাচন করুন"},"enableThisCategoryFirst":{"message":"\"{0}\" বিভাগের অন্তর্ভুক্ত অংশ জমা দিতে, আপনাকে এটি অপশন এ গিয়ে চালু করতে হবে। আপনাকে এখন অপশন এ পাঠানো হবে।","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"সতর্কতা: এই ধরণের বিভাগে একসময়ে সর্বাধিক একবার সক্রিয় থাকতে পারে। একাধিক জমা দেওয়া হলে যেকোন একটি এলোমেলোভাবে বেছে সেটি দেখানো হবে।"},"youMustSelectACategory":{"message":"আপনাকে প্রত্যেকটি অংশের জন্য কমপক্ষে একটি করে ক্যাটাগরি সিলেক্ট করতে হবে!"},"bracketEnd":{"message":"(শেষ)"},"End":{"message":"সমাপ্ত","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"লুক্কায়িতঃ ডাউনভোট"},"hiddenDueToDuration":{"message":"লুক্কায়িতঃ খুব ছোট"},"manuallyHidden":{"message":"নিজে লুক্কায়িত"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"চ্যানেল আইডি এখনও লোড হয় না। আপনি যদি এম্বেডে থাকা ভিডিও দেখছেন তবে পরিবর্তে ইউটিউব হোমপেজটি ব্যবহার করার চেষ্টা করুন। এটি ইউটিউব লেআউটে পরিবর্তনের কারণেও হতে পারে, আপনার যদি মনেহয় এটি লেআউটে পরিবর্তনের কারণে হয়েছে তাহলে এখানে একটি মন্তব্য করুনঃ "},"acceptPermission":{"message":"অনুমতি একসেপ্ট করুন"},"permissionRequestSuccess":{"message":"অনুমতির অনুরোধ সফল হয়েছে!"},"permissionRequestFailed":{"message":"অনুমতির অনুরোধ ব্যর্থ হয়েছে, আপনি কি ডেনাই ক্লিক করেছেন?"},"adblockerIssueWhitelist":{"message":"আপনি যদি এটি সমাধান করতে অক্ষম হন তবে সেটিংস এ গিয়ে 'এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন' বন্ধ করুন, কারণ স্পনসরব্লক এই ভিডিওটির জন্য চ্যানেলের তথ্য পুনরুদ্ধার করতে অক্ষম"},"forceChannelCheck":{"message":"এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন"},"whatForceChannelCheck":{"message":"সাধারণত, এটি চ্যানেলটি কী তা জানার আগেই এটি এখনই বিভাগগুলি এড়িয়ে যাবে। সাধারণত, ভিডিওর শুরুতে কিছু বিভাগগুলি সাদা তালিকাভুক্ত চ্যানেলগুলিতে এড়িয়ে যেতে পারে। এই বিকল্পটি সক্ষম করা এটিকে প্রতিরোধ করবে তবে চ্যানেলআইডি পেতে কিছুটা সময় নিতে পারে বলে সমস্ত এড়িয়ে যাওয়া কিছুটা বিলম্বিত করে। আপনার যদি দ্রুত ইন্টারনেট থাকে তবে এই বিলম্বটি অদৃশ্য হতে পারে।"},"forceChannelCheckPopup":{"message":"\"এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন\" সেটিংস টি চালু করার বিষয়টি বিবেচনা করুন"},"downvoteDescription":{"message":"সময় ভুল দেওয়া হয়েছে"},"incorrectVote":{"message":"সঠিক নয়"},"harmfulVote":{"message":"ক্ষতিকর","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"বিভাগ পরিবর্তন করুন"},"nonMusicCategoryOnMusic":{"message":"এই ভিডিওটি সংগীত হিসাবে শ্রেণীবদ্ধ করা হয়েছে। আপনি কি নিশ্চিত যে এটি একটি স্পনসর আছে? যদি এটি আসলে একটি \"অ-সংগীত বিভাগ\" হয় তবে এক্সটেনশন এর অপশন এ যান এবং এই বিভাগটি চালু করুন। তারপরে, আপনি এই বিভাগটিকে স্পনসর পরিবর্তে \"অ-সংগীত\" হিসাবে জমা দিতে পারেন। আপনি বিভ্রান্ত হলে দয়া করে নিয়মকানুনপড়ুন।"},"multipleSegments":{"message":"অনেকগুলো অংশ"},"guidelines":{"message":"নিয়মকানুন"},"readTheGuidelines":{"message":"নিয়মকানুন পড়ুন!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"বিভাগ ফিচার এসেছে!"},"categoryUpdate2":{"message":"ইন্ট্রোস, আউট্রোস, মার্চ ইত্যাদি এড়িয়ে যাওয়ার জন্য অপশন খুলুন।"},"help":{"message":"সাহায্য"},"GotIt":{"message":"বুঝেছি","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"এই বিভাগটি বিশাল। যদি পুরো ভিডিওটি একটি বিষয় নিয়ে হয় তবে \"Skip\" থেকে \"Full Video\" এ পরিবর্তন করুন। আরও তথ্যের জন্য নিয়মকানুন দেখুন।"},"categoryPillTitleText":{"message":"এই পুরো ভিডিওটি এই বিভাগ হিসাবে লেবেলযুক্ত এবং পৃথক করা সম্ভব না কারন এটি খুব ঘন ঘন সংযুক্ত করা হয়েছে"},"experiementOptOut":{"message":"ভবিষ্যতের সমস্ত পরীক্ষা-নিরীক্ষা পাওয়া থেকে বিরত থাকুন","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"চিরকালের জন্য এই বিষয়বস্তু লুকান"},"questionButton":{"message":"আমার একটি প্রশ্ন আছে"},"warningConfirmButton":{"message":"আমি কারণ বুঝেছি"},"Donate":{"message":"অনুদান"},"considerDonating":{"message":"অনুদানের মাধ্যমে ভবিষ্যতেে এর উন্নয়নের কাজে সাহায্য হবে"},"hideDonationLink":{"message":"অনুদানের লিঙ্ক লুকান"},"darkModeOptionsPage":{"message":"অপশন পেজে ডার্ক মোড "},"helpPageThanksForInstalling":{"message":"স্পনসরব্লক ইনস্টল করার জন্য আপনাকে ধন্যবাদ."},"helpPageReviewOptions":{"message":"নীচের অপশনগুলি পর্যালোচনা করুন"},"helpPageFeatureDisclaimer":{"message":"অনেকগুলি বৈশিষ্ট্য সাধারণত অক্ষম থাকে। আপনি যদি ইন্ট্রোস, আউট্রোস এড়িয়ে যেতে চান, Invidious ইত্যাদি ব্যবহার করতে চান তবে সেগুলি নীচে সক্ষম করুন। আপনি UI উপাদানগুলিও লুকাতে/দেখাতে পারেন।"},"helpPageHowSkippingWorks2":{"message":"আপনি যখনই কোনও বিভাগ এড়িয়ে যান, আপনি একটা নোটিস পাবেন। সময়টি যদি ভুল বলে মনে হয় তবে ডাউনভোটে ক্লিক করে ভোট দিন! আপনি পপআপ থেকেও ভোট দিতে পারেন।"},"Submitting":{"message":"নতুন অংশ জমা দেওয়া"},"helpPageCopyOfDatabase2":{"message":"এটির সোর্স কোড অবাধে উপলব্ধ। সুতরাং, যদি আমার কিছু ঘটেও যায় তবে আপনার জমাকৃত অংশগুলি হারিয়ে যাবে না।"},"Credits":{"message":"কৃতিত্ব"},"LearnMore":{"message":"আরও জানুন"},"FullDetails":{"message":"সম্পূর্ণ বিস্তারিত"},"CopyDownvoteButtonInfo":{"message":"ডাউনভোট করে আপনার জন্য পুনরায় জমা দেওয়ার জন্য একটি স্থানীয় অনুলিপি তৈরি করে"},"OpenCategoryWikiPage":{"message":"এই বিভাগের উইকি পাতা খুলুন."},"CopyAndDownvote":{"message":"কপি এবং ডাউনভোট"},"ContinueVoting":{"message":"ভোট করা চালিয়ে যান"},"ChangeCategoryTooltip":{"message":"এটি তাৎক্ষনিকভাবে আপনার অংশে দেওয়া হবে"},"downvote":{"message":"ডাউনভোট"},"upvote":{"message":"আপভোট"},"hideSegment":{"message":"অংশ আড়াল করুন"},"skipSegment":{"message":"সেগমেন্ট এড়িয়ে যান"},"playChapter":{"message":"অধ্যায় চালু করুন"},"SponsorTimeEditScrollNewFeature":{"message":"দ্রুত সময়টি পরিবর্কতন করতে সম্পাদনা বাক্সে ঘুরে দেখার সময় আপনার মাউস এর হুইয়িলটি ব্যবহার করুন। কন্ট্রল বা শিফট কী এর সংমিশ্রণগুলি পরিবর্তনগুলি আরো নিখুতভাবে টিউন করতে ব্যবহার করা যেতে পারে।"},"categoryPillNewFeature":{"message":"নতুন! দেখুন যখন কোনও ভিডিও সম্পূর্ণ স্পনসর করা বা স্ব-প্রচার হয়"},"dayAbbreviation":{"message":" দিন","description":"100d"},"hourAbbreviation":{"message":" ঘণ্টা","description":"100h"},"optionsTabBehavior":{"message":"আচরণ","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"ইন্টারফেস","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"কীবোর্ড শর্টকাট","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"ব্যাকআপ এবং পুনঃস্থাপন","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"বিবিধ","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"নোটিশ প্রদর্শন করা বন্ধ করুন","description":"Option label"},"unbind":{"message":"বাদ দিন","description":"Unbind keyboard shortcut"},"notSet":{"message":"নির্ধারণ করা হয়নি"},"change":{"message":"বদল করুন"},"youtubeKeybindWarning":{"message":"এটি একটি অন্তর্নির্মিত ইউটিউব শর্টকাট। আপনি কি নিশ্চিত যে আপনি এটি ব্যবহার করতে চান?"},"betaServerWarning":{"message":"বেটা সার্ভার চালু করা হয়েছে!"},"openOptionsPage":{"message":"বিকল্প পাতা খুলুন"},"resetToDefault":{"message":"সেটিংস ডিফল্টে ফিরিয়ে নিন"},"exportSegments":{"message":"সেগমেন্ট রপ্তানি করুন"},"importSegments":{"message":"সেগমেন্ট আমদানী করুন"},"Import":{"message":"আমদানী","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemFailed":{"message":"লাইসেন্স কী অবৈধ"},"redeem":{"message":"ফিরত"},"enterLicenseKey":{"message":"লাইসেন্স কি দাও"},"unsubmittedSegmentCounts":{"message":"তোমার বর্তমানে {1} তে {0} আছে","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"কোন জমাহীন অংশ বাকি নেই","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"জমা দেওয়া হয়নি এমন অংশ","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"জমা দেওয়া হয়নি এমন অংশ","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"ভিডিও","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"ভিডিওগুলি","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"সকল সেগমেন্ট পরিস্কার করুন","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"তুমি কী নিশ্চিত সকল জমা দেওয়া হয়নি এমন অংশ মুছতে চাও?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"অংশ দেখাও","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"অংশ লুকাও","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ভিডিও আইডি","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"অংশ সংখ্যা","description":"Header of the unsubmitted segments list"},"actions":{"message":"ক্রিয়া","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"ইউআরএল হিসেবে ভাগ করো"},"NoticeTimeAfterSkip":{"message":"{seconds}সে","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"Original":{"message":"প্রকৃত"},"resetIcon":{"message":"সবকিছু ফিরত নাও আইকন"},"Disabled":{"message":"নিষ্ক্রিয়"},"TitleCase":{"message":"শিরোনামের হাত"},"LowerCase":{"message":"ছোট হাতের"},"Never":{"message":"কখনই না"},"Enable":{"message":"সক্রিয়"},"Titles":{"message":"শিরোনাম","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"প্রচ্ছবি","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"ত্রুটি"},"Close":{"message":"বন্ধ"},"No":{"message":"না"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ca/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ca/messages.json @@ -0,0 +1 @@ +{"400":{"message":"El server ha dit que aquesta sol·licitud es invalida"},"409":{"message":"Això ja s'ha enviat abans"},"fullName":{"message":"SponsorBlock per YouTube - Omet els Sponsorships","description":"Name of the extension."},"Description":{"message":"Omet els sponsorships, pregant per una subscripció i mes en videos de YouTube. Informa dels patrocinadors a els vídeos que mires per estalviar temps als altres.","description":"Description of the extension."},"channelWhitelisted":{"message":"El canal és a la llista blanca!"},"Segment":{"message":"segment"},"Segments":{"message":"segments"},"upvoteButtonInfo":{"message":"Voteu millor aquesta submissió"},"reportButtonTitle":{"message":"Informa"},"reportButtonInfo":{"message":"Notifiqueu que aquest enviament és incorrecte."},"Dismiss":{"message":"Omet"},"Loading":{"message":"Carregant..."},"Hide":{"message":"No mostris mai"},"hitGoBack":{"message":"Premeu \"no saltar\" per tornar on estàveu."},"unskip":{"message":"No saltar"},"reskip":{"message":"Saltar de nou"},"unmute":{"message":"Deixa de silenciar"},"paused":{"message":"En pausa"},"manualPaused":{"message":"S'ha aturat el temporitzador"},"confirmMSG":{"message":"Per editar o esborrar valors individuals, premeu el botó d'informació o cliqueu la pestanya de l'extensió al cantó superior dret."},"clearThis":{"message":"Segur que voleu esborrar això?\n\n"},"Unknown":{"message":"S'ha produït un error en enviar els temps d'anunciant, torneu-ho a provar més endavant."},"sponsorFound":{"message":"Aquest vídeo té segments a la base de dades!"},"sponsor404":{"message":"No s'han trobat segments"},"sponsorStart":{"message":"El segment comença ara"},"sponsorEnd":{"message":"El segment acaba ara"},"sponsorCancel":{"message":"Cancel·la la creació del segment"},"noVideoID":{"message":"No s'ha trobat cap vídeo de YouTube.\nSi penseu que és incorrecte, refresqueu la pestanya."},"refreshSegments":{"message":"Refresca els segments"},"success":{"message":"Èxit!"},"voted":{"message":"Votat!"},"serverDown":{"message":"Sembla que ha caigut el servidor. Contacteu el desenvolupador immediatament."},"connectionError":{"message":"S'ha produït un error de connexió. Codi d'error: "},"clearTimes":{"message":"Esborra els segments"},"openPopup":{"message":"Obrir finestra de SponsorBlock"},"closePopup":{"message":"Tanca la finestra"},"submitCheck":{"message":"Segur que voleu enviar això?"},"whitelistChannel":{"message":"Canal de llista blanca"},"removeFromWhitelist":{"message":"Treure canal de la llista blanca"},"voteOnTime":{"message":"Vota un segment"},"Submissions":{"message":"Propostes"},"savedPeopleFrom":{"message":"Heu estalviat la gent "},"viewLeaderboard":{"message":"Classificació"},"recordTimesDescription":{"message":"Envia"},"submissionEditHint":{"message":"L'edició de seccions apareixerà després de prémer \"envia\"","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Consell: Podeu crear tecles de drecera per enviar en \"opcions\""},"clearTimesButton":{"message":"Esborra temps"},"Username":{"message":"Nom d'usuari"},"setUsername":{"message":"Definiu el nom d'usuari"},"copyPublicID":{"message":"Copia l'identificador públic d'usuari"},"hideThis":{"message":"Amaga això"},"Options":{"message":"Opcions"},"showButtons":{"message":"Mostra els botons al reproductor de YouTube"},"hideButtonsDescription":{"message":"Això amaga els botons que apareixen al reproductor de YouTube per enviar segments."},"showSkipButton":{"message":"Mantenir \"Botar al destacat\" al reproductor"},"showInfoButton":{"message":"Mostra el botó d'informació al reproductor de YouTube"},"autoHideInfoButton":{"message":"Amaga automàticament el botó d'informació"},"minLower":{"message":"minut"},"minsLower":{"message":"minuts"},"hourLower":{"message":"hora"},"hoursLower":{"message":"hores"},"youHaveSavedTime":{"message":"Heu estalviat la gent","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" de les seves vides","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Visiteu status.sponsor.ajay.app per conèixer l'estat del servidor."},"whatChangeUserID":{"message":"Això hauria de romandre privat: és semblant a una contrasenya i no s'hauria de compartir amb cap persona. Si algú hi té accés, poden suplantar-vos. Si esteu cercant el vostre identificador d'usuari públic, premeu la icona del portanotes a la finestra."},"help":{"message":"Ajuda"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/cs/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/cs/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Vypršel časový limit připojení. Zkontrolujte vaše připojení k internetu. Pokud váš internet funguje, server je nejspíš přetížený nebo spadnul."},"400":{"message":"Server hlásí, že tento požadavek je neplatný"},"409":{"message":"Tento příspěvek byl již přidán dříve"},"502":{"message":"Server je nejspíš přetížený. Zkuste to znovu za pár vteřin."},"fullName":{"message":"SponsorBlock pro YouTube - Přeskoč sponzory","description":"Name of the extension."},"Description":{"message":"Přeskočte sponzorství, žádosti o odběr a další ve videích na YouTube. Nahlaste sponzorované segmenty ve videích, která sledujete a ušetřete ostatním čas.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanál přidán do výjimek!"},"Segment":{"message":"segment"},"Segments":{"message":"segmentů"},"SegmentsCap":{"message":"Segmenty"},"Chapters":{"message":"Kapitoly"},"renderAsChapters":{"message":"Zobrazit segmenty jako kapitoly","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Zobrazit aktuální segment vedle času videa"},"showAutogeneratedChapters":{"message":"Zobrazit kapitoly automaticky vygenerované službou YouTube"},"upvoteButtonInfo":{"message":"Hlasovat pro tento příspěvek"},"reportButtonTitle":{"message":"Nahlásit"},"reportButtonInfo":{"message":"Nahlásit tento příspěvek jako nesprávný."},"Dismiss":{"message":"Zrušit"},"Loading":{"message":"Načítání..."},"Hide":{"message":"Nikdy nezobrazovat"},"hitGoBack":{"message":"Klikněte na „Vrátit se“, abyste se dostali do místa před přeskočením."},"unskip":{"message":"Vrátit se"},"reskip":{"message":"Znovu přeskočit"},"unmute":{"message":"Zrušit ztlumení"},"paused":{"message":"Pozastaveno"},"manualPaused":{"message":"Časovač zastaven"},"confirmMSG":{"message":"Chcete-li upravit nebo odstranit jednotlivé hodnoty, klikněte na tlačítko informace, nebo otevřete vyskakovací okno rozšíření kliknutím na ikonu rozšíření v pravém horním rohu."},"clearThis":{"message":"Jste si jistí, že to chcete vymazat?\n\n"},"Unknown":{"message":"Při přidávání vašeho příspěvku došlo k chybě. Zkuste to prosím později."},"sponsorFound":{"message":"Toto video má segmenty v databázi!"},"sponsor404":{"message":"Nebyly nalezeny žádné segmenty"},"sponsorStart":{"message":"Nyní začíná segment"},"sponsorEnd":{"message":"Segment nyní končí"},"sponsorCancel":{"message":"Zrušit vytváření segmentu"},"noVideoID":{"message":"Nebylo nalezeno žádné YouTube video.\nPokud je to špatně, obnovte kartu."},"refreshSegments":{"message":"Aktualizovat segmenty"},"success":{"message":"Úspěch!"},"voted":{"message":"Hlasováno!"},"serverDown":{"message":"Zdá se, že server je offline. Okamžitě kontaktujte vývojáře."},"connectionError":{"message":"Došlo k chybě připojení. Kód chyby: "},"segmentsStillLoading":{"message":"Segmenty se stále načítají..."},"clearTimes":{"message":"Vymazat segmenty"},"openPopup":{"message":"Otevřít vyskakovací okno SponsorBlock"},"closePopup":{"message":"Zavřít vyskakovací okno"},"closeIcon":{"message":"Ikona pro zavření"},"OpenSubmissionMenu":{"message":"Otevřít nabídku příspěvků"},"OpenCasualVoteMenu":{"message":"Otevřít nabídku normálního režimu"},"sortSegments":{"message":"Seřadit segmenty"},"submitCheck":{"message":"Opravdu to chcete odeslat?"},"whitelistChannel":{"message":"Přidat kanál do výjimek"},"removeFromWhitelist":{"message":"Odebrat kanál z výjimek"},"voteOnTime":{"message":"Hlasovat pro segment"},"Submissions":{"message":"Příspěvky"},"savedPeopleFrom":{"message":"Zachránili jste lidi od "},"viewLeaderboard":{"message":"Žebříček"},"recordTimesDescription":{"message":"Odeslat"},"submissionEditHint":{"message":"Úpravy sekcí se objeví po odeslání","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Tip: V možnostech můžete nastavit klávesové zkratky pro odeslání"},"clearTimesButton":{"message":"Vymazat časy"},"Username":{"message":"Uživatelské jméno"},"setUsername":{"message":"Nastavit uživatelské jméno"},"copyPublicID":{"message":"Kopírovat veřejné uživatelské ID"},"copySegmentID":{"message":"Zkopírovat ID segmentu"},"loopChapter":{"message":"Opakovat kapitolu"},"unloopChapter":{"message":"Zrušit opakování kapitoly"},"hideThis":{"message":"Skrýt"},"Options":{"message":"Nastavení"},"showButtons":{"message":"Zobrazit tlačítka na YouTube přehrávači"},"hideButtonsDescription":{"message":"Skryje tlačítka, která se zobrazí v YouTube přehrávači pro přeskočení segmentů."},"showSkipButton":{"message":"Nechat tlačítko přeskočení na zvýraznění v přehrávači"},"showInfoButton":{"message":"Zobrazit informační tlačítko v YouTube přehrávači"},"autoHideInfoButton":{"message":"Automaticky skrýt informační tlačítko"},"showDeleteButton":{"message":"Zobrazit tlačítko Odstranit v YouTube přehrávači"},"enableViewTracking":{"message":"Povolit počítadlo přeskočení"},"whatViewTracking":{"message":"Tato vlastnost sleduje, jaké segmenty jste přeskočili, abychom dali uživatelům vědět, jak moc jejich příspěvek pomohl ostatním a může být použita jako sledování společně s hlasy pro zajištění, že se spam nedostane do databáze. Toto rozšíření posílá zprávu serveru pokaždé když přeskočíte segment. Doufejme, že si moc lidí nezmění toto nastavení, aby byla zobrazená čísla přesná. :)"},"enableViewTrackingInPrivate":{"message":"Povolit sledování počtu přeskočení v soukromých/anonymních oknech"},"enableTrackDownvotes":{"message":"Ukládat hlasy proti segmentům"},"whatTrackDownvotes":{"message":"Jakékoli segmenty, proti kterým budete hlasovat, zůstanou skryté i po obnovení karty"},"trackDownvotesWarning":{"message":"Varování: Zakázání této možnosti odstraní všechny dříve uložené hlasy proti"},"enableTrackDownvotesInPrivate":{"message":"Ukládat hlasy proti segmentům v soukromých/anonymních oknech"},"enableQueryByHashPrefix":{"message":"Dotaz podle hash předpony"},"whatQueryByHashPrefix":{"message":"Místo žádání o segmenty ze serveru pomocí videoID jsou poslány první 4 charaktery hashe ve videoID. Tento server odešle zpět data pro všechna videa s podobnými hashy."},"enableShowCategoryWithoutPermission":{"message":"Zobrazit kategorie v nabídce odeslání i bez oprávnění k odeslání"},"whatShowCategoryWithoutPermission":{"message":"Některé kategorie vyžadují oprávnění k odeslání z důvodu minimálních požadavků na reputaci"},"showNotice":{"message":"Znovu zobrazit upozornění"},"showSkipNotice":{"message":"Zobrazit upozornění po přeskočení segmentu"},"showUpcomingNotice":{"message":"Zobrazit oznámení před začátkem segmentu"},"showCategoryGuidelines":{"message":"Zobrazit nápovědu ke kategorii"},"noticeVisibilityMode0":{"message":"Oznámení o přeskočení v plné velikosti"},"noticeVisibilityMode1":{"message":"Malá oznámení o automatickém přeskočení"},"noticeVisibilityMode2":{"message":"Všechna malá oznámení o přeskočení"},"noticeVisibilityMode3":{"message":"Vybledlá oznámení o automatickém přeskočení"},"noticeVisibilityMode4":{"message":"Všechna vybledlá oznámení o přeskočení"},"longDescription":{"message":"SponsorBlock vám umožní přeskakovat sponzorské sekce, intra, outra, oznámení k odběru a další otravné části YouTube videí. SponsorBlock je crowdsourcované rozšíření prohlížeče, které dává komukoli možnost odeslat začátek a konec sponzorovaných segmentů a dalších segmentů YouTube videí. Jakmile jedna osoba odešle tuto informaci, všichni ostatní s tímto rozšířením automaticky přeskočí sponzorovaný segment. Můžete také přeskakovat nehudební sekce v hudebních videích.","description":"Full description of the extension on the store pages."},"website":{"message":"Web","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Zdrojový kód","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Upozornění bylo aktualizováno!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Pokud se vám to stále nelíbí, klikněte na tlačítko Nikdy nezobrazovat.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Přeskočit segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Začít/ukončit segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Otevřít nabídku příspěvků","description":"Keybind label"},"setSubmitKeybind":{"message":"Odeslat segmenty","description":"Keybind label"},"setPreviewKeybind":{"message":"Náhled segmentu","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Zavřít oznámení o přeskočení","description":"Keybind label"},"setDownvoteKeybind":{"message":"Hlasovat proti segmentu","description":"Keybind label"},"setUpvoteKeybind":{"message":"Hlasovat pro segment","description":"Keybind label"},"nextChapterKeybind":{"message":"Další kapitola","description":"Keybind label"},"previousChapterKeybind":{"message":"Předchozí kapitola","description":"Keybind label"},"enableDeArrowKey":{"message":"Zapnout/vypnout DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Otevřít nabídku příspěvků","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Vyberte klávesu jejím zadáním a zvolte si modifikátory, které chcete použít."},"disableSkipping":{"message":"Přeskakování je povoleno"},"enableSkipping":{"message":"Přeskakování je zakázáno"},"yourWork":{"message":"Vaše práce","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Kód chyby: "},"skip":{"message":"Přeskočit"},"mute":{"message":"Ztlumit"},"full":{"message":"Celé video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Přeskočit {0}?"},"mute_category":{"message":"Ztlumit {0}?"},"skip_to_category":{"message":"Přeskočit na {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Nadcházející {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"Segment {0} přeskočen","description":"Example: Sponsor Skipped"},"muted":{"message":"Segment {0} ztlumen","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Přeskočeno na {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Hlasováno u {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Zakázat automatické přeskočení"},"enableAutoSkip":{"message":"Povolit automatické přeskočení"},"audioNotification":{"message":"Zvukové oznámení při přeskočení"},"audioNotificationDescription":{"message":"Zvukové oznámení při přeskočení přehraje zvuk při každém přeskočení segmentu. Při zakázání (nebo je zakázáno automatické přeskočení) nebude přehrán žádný zvuk."},"showTimeWithSkips":{"message":"Zobrazit čas s odebranými přeskočeními"},"showTimeWithSkipsDescription":{"message":"Tento čas se objeví v závorkách vedle aktuálního času pod časovou lištou. Zobrazí to celkovou dobu trvání videa mínus všechny segmenty. To zahrnuje i segmenty označené jen jako „Zobrazit v liště“."},"youHaveSkipped":{"message":"Přeskočili jste "},"minLower":{"message":"minutu"},"minsLower":{"message":"minut"},"hourLower":{"message":"hodinu"},"hoursLower":{"message":"hodin"},"youHaveSavedTime":{"message":"Ušetřili jste lidem","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" jejich života","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Podívejte se na status.sponsor.ajay.app pro stav serverů."},"changeUserID":{"message":"Importovat / exportovat vaše soukromé UserID"},"whatChangeUserID":{"message":"Toto by mělo být ponecháno v soukromí. Je to jako heslo a nemělo by být s nikým sdíleno. Pokud to někdo má, může se za vás vydávat. Pokud hledáte vaše veřejné uživatelské ID, klikněte na ikonu schránky ve vyskakovacím okně."},"setUserID":{"message":"Nastavit soukromé UserID"},"userIDChangeWarning":{"message":"Varování: Změna soukromého UserID je nevratná. Opravdu to chcete udělat? Pro jistotu si zálohujte vaše staré ID, jen kdyby něco."},"createdBy":{"message":"Vytvořil"},"supportOtherSites":{"message":"Podpora pro weby YouTube třetích stran"},"supportOtherSitesDescription":{"message":"Podporovat klienty YouTube třetích stran. Pro povolení podpory musíte přijmout dodatečná oprávnění.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Podporované weby: "},"optionsInfo":{"message":"Povolení podpory Invidious, zakázání automatického přeskočení, skrytí tlačítek a více."},"addInvidiousInstance":{"message":"Přidat relaci klienta třetí strany"},"addInvidiousInstanceDescription":{"message":"Přidat vlastní relaci. Musí být formátována POUZE s doménou. Například: invidious.ajay.app"},"add":{"message":"Přidat"},"addInvidiousInstanceError":{"message":"Neplatná doména. Toto by mělo zahrnovat POUZE doménovou část. Například: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Obnovit seznam relací Invidious"},"resetInvidiousInstanceAlert":{"message":"Chystáte se obnovit seznam relací Invidious"},"invidiousDisabledSafari":{"message":"Podpora Invidious není v tuto chvíli v prohlížeči Safari dostupná kvůli chybě v prohlížeči. Jakmile Apple chybu opraví, bude funkce přidána zpět."},"currentInstances":{"message":"Aktuální relace:"},"minDuration":{"message":"Minimální doba trvání (ve vteřinách):"},"minDurationDescription":{"message":"Segmenty kratší než nastavená hodnota nebudou přeskočeny nebo zobrazeny v přehrávači."},"enableManualSkipOnFullVideo":{"message":"Použít manuální přeskočení, pokud existuje štítek na celém videu"},"whatManualSkipOnFullVideo":{"message":"Pro lidi, kteří chtějí sledovat video bez přerušení, pokud je celé sponzorované nebo sebepropagace."},"skipNoticeDuration":{"message":"Délka trvání oznámení o přeskočení (v sekundách):"},"skipNoticeDurationDescription":{"message":"Oznámení o přeskočení zůstane na obrazovce alespoň po tuto dobu. Pro ruční může být zobrazeno déle."},"shortCheck":{"message":"Váš příspěvek je kratší než vaše možnost nejkratší doby trvání. To by mohlo znamenat, že někdo segment již odeslal, a je jenom ignorován kvůli této možnosti. Opravdu chcete odeslat váš příspěvek?"},"liveOrPremiere":{"message":"Odesílání na aktivním streamu nebo premiéře. Počkejte prosím, než skončí, poté obnovte stránku a ověřte, zda jsou segmenty stále platné."},"showUploadButton":{"message":"Zobrazit tlačítko Nahrát"},"customServerAddress":{"message":"Adresa serveru SponsorBlock"},"customServerAddressDescription":{"message":"Adresa, kterou SponsorBlock používá ke kontaktování serveru.\nToto byste neměli měnit, pokud nemáte vlastní serverovou relaci."},"dataFetchingServerAddress":{"message":"Adresa serveru pro získávání dat"},"dataFetchingServerAddressDescription":{"message":"Adresa používaná ke kontaktování serveru s daty.\nToto byste neměli měnit, pokud nemáte vlastní serverovou instanci."},"thumbnailCacheServerAddress":{"message":"Adresa serveru mezipaměti miniatury"},"save":{"message":"Uložit"},"reset":{"message":"Obnovit"},"customAddressError":{"message":"Tato adresa není platná. Ujistěte se, že na začátku máte http:// nebo https:// a žádná koncová lomítka."},"areYouSureReset":{"message":"Jste si jisti, že toto chcete obnovit?"},"mobileUpdateInfo":{"message":"m.youtube.com je nyní podporováno"},"exportOptions":{"message":"Importovat / exportovat všechny možnosti"},"exportOtherData":{"message":"Importovat/exportovat všechna ostatní data"},"exportOptionsCopy":{"message":"Upravit/kopírovat"},"exportOptionsDownload":{"message":"Uložit do souboru"},"exportOptionsUpload":{"message":"Načíst ze souboru"},"whatExportOptions":{"message":"Toto je celá vaše konfigurace ve formátu JSON. Zahrnuje vaše soukromé UserID, takže s ní nakládejte opatrně."},"setOptions":{"message":"Nastavit možnosti"},"exportOptionsWarning":{"message":"Varování: Změna možností je nevratná a může rozbít vaši instalaci. Pro jistotu si soubor zálohujte, jen kdyby něco."},"incorrectlyFormattedOptions":{"message":"Tento soubor JSON nemá správný formát. Vaše možnosti nebyly změněny."},"confirmNoticeTitle":{"message":"Odeslat segment"},"submit":{"message":"Odeslat"},"cancel":{"message":"Zrušit"},"delete":{"message":"Odstranit"},"preview":{"message":"Náhled"},"unsubmitted":{"message":"Neodesláno"},"inspect":{"message":"Kontrola"},"edit":{"message":"Upravit"},"copyDebugLogs":{"message":"Kopírovat protokoly ladění"},"copyDebugInformation":{"message":"Zkopírovat ladící informace do schránky"},"copyDebugInformationFailed":{"message":"Nepodařilo se zapsat do schránky"},"copyDebugInformationOptions":{"message":"Zkopíruje informace do schránky pro poskytnutí vývojáři při nahlašování chyby / když o to vývojář zažádá. Citlivé informace jako vaše uživatelské ID, povolené kanály a vlastní adresa serveru byly odebrány. Obsahuje to nicméně informace jako váš useragent, prohlížeč, operační systém a verzi rozšíření. "},"copyDebugInformationComplete":{"message":"Ladící informace byly zkopírovány do schránky. Můžete odstranit jakékoli informace, které raději nechcete sdílet. Uložte text do textového souboru nebo vložte do chybového hlášení."},"keyAlreadyUsed":{"message":"Tato zkratka je vázána na jinou akci. Vyberte prosím jinou."},"to":{"message":"do","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Zkopírováno!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Zahrnuje přechody"},"generic_guideline2":{"message":"Hraje, jako kdyby nebylo nic přeskočeno"},"category_sponsor":{"message":"Sponzor"},"category_sponsor_description":{"message":"Placená propagace, placená doporučení a přímé reklamy. Nezahrnuje sebepropagaci nebo shout-outy uživatelů/tvůrců/webů/produktů, které se tvůrcovi líbí."},"category_sponsor_guideline1":{"message":"Placené propagace"},"category_sponsor_guideline2":{"message":"Není pro dary nebo vlastní merch"},"category_selfpromo":{"message":"Neplacená / vlastní propagace"},"category_selfpromo_description":{"message":"Podobné jako „sponzor“, ale pro neplacenou nebo vlastní propagaci. Zahrnuje sekce o zboží, darech nebo informace o tom, s kým spolupracují."},"category_selfpromo_guideline1":{"message":"Dary, členství a vlastní merch"},"category_selfpromo_guideline2":{"message":"Bezplatné propagace, které nepřidávají nic k videu"},"category_selfpromo_guideline3":{"message":"Není pro podnikové produkty a merch"},"category_exclusive_access":{"message":"Exkluzivní přístup"},"category_exclusive_access_description":{"message":"Pouze pro označování celých videí. Používá se v případě, že je ve videu zobrazován produkt, služba nebo místo, které autor obdržel zdarma nebo s bezplatným přístupem."},"category_exclusive_access_pill":{"message":"V tomto videu je zobrazován produkt, služba nebo místo, které autor obdržel zdarma nebo s bezplatným přístupem","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Celé video zobrazuje místo, kam autor obdržel bezplatný nebo dotovaný přístup"},"category_interaction":{"message":"Připomenutí interakce (odběr)"},"category_interaction_description":{"message":"Krátká připomínka, abyste dali like, odběr nebo jste sledovali tvůrce uprostřed obsahu. Pokud je segment dlouhý nebo zahrnuje něco specifického, mělo by být místo toho zařazeno do vlastní propagace."},"category_interaction_guideline1":{"message":"Krátká připomenutí pro lajknutí, odebírání či sledování"},"category_interaction_guideline2":{"message":"Zahrnuje nepřímé připomenutí komentování"},"category_interaction_guideline3":{"message":"Není pro obecnou propagaci, pouze výzvy k akci"},"category_interaction_short":{"message":"Připomenutí interakce"},"category_intro":{"message":"Přestávka / úvodní animace"},"category_intro_description":{"message":"Interval bez skutečného obsahu. Může to být pauza, statický obrázek nebo opakující se animace. Nemělo by být použito pro přechody obsahující informace."},"category_intro_short":{"message":"Přestávka"},"category_intro_guideline1":{"message":"Část bez skutečného obsahu"},"category_intro_guideline2":{"message":"Není pro přechody s informacemi"},"category_outro":{"message":"Koncové karty / titulky"},"category_outro_description":{"message":"Titulky nebo když se objeví konečné karty YouTube. Není pro závěry s informacemi."},"category_outro_guideline1":{"message":"Nezahrnuje obsah, i když jsou na obrazovce závěrečné karty"},"category_preview_description":{"message":"Sbírka klipů, které zobrazují, co se objeví v tomto videu nebo v jiných videích v sérii, kdy jsou všechny informace zopakovány později ve videu."},"category_preview_guideline1":{"message":"Klipy které se objeví později nebo v budoucím videu"},"category_preview_guideline2":{"message":"Shrnutí předchozího videa"},"category_preview_guideline3":{"message":"Není pro sekce, které přidávají další obsah"},"category_filler":{"message":"Mimo téma / vtipy"},"category_filler_description":{"message":"Scény, které se netýkají tématu, nebo vtipy, které nejsou nutné k pochopení hlavního obsahu videa. Kategorie by neměla zahrnovat segmenty poskytující podrobnosti o kontextu nebo pozadí. Jedná se o velmi agresivní kategorii myšlenou pro chvíle, kdy nemáte náladu na „zábavu“."},"category_filler_short":{"message":"Mimo téma"},"category_filler_guideline1":{"message":"Scény mimo téma nebo vtipy"},"category_filler_guideline2":{"message":"Rozptýlení, nepovedené scénky, opakování"},"category_filler_guideline3":{"message":"Není pro scény vyžadované k pochopení tématu"},"category_music_offtopic":{"message":"Hudba: nehudební sekce"},"category_music_offtopic_description":{"message":"Použijte pouze u hudebních videí. Mělo by být použito pouze pro části hudebních videí, které nepokrývá jiná kategorie."},"category_music_offtopic_short":{"message":"Jiné než hudba"},"category_music_offtopic_guideline1":{"message":"Sekce, které nejsou v oficiálních vydáních"},"category_music_offtopic_guideline2":{"message":"Nehudební sekce na živém vystoupení"},"category_poi_highlight":{"message":"Zvýraznění"},"category_poi_highlight_description":{"message":"Část videa, kterou hledá většina lidí. Podobné komentářům typu „Video začíná v x“."},"category_poi_highlight_guideline1":{"message":"Sekce, kterou hledá většina lidí"},"category_poi_highlight_guideline2":{"message":"Může pomoci přeskočit předchozí kontext"},"category_poi_highlight_guideline3":{"message":"Může přeskočit k názvu nebo náhledu"},"category_chapter":{"message":"Kapitola"},"category_chapter_description":{"message":"Vlastní názvy kapitol popisující hlavní části videa."},"category_chapter_guideline1":{"message":"Nezmiňujte názvy značek sponzorů"},"category_chapter_guideline2":{"message":"Používejte větší kapitoly pro obecné části"},"category_chapter_guideline3":{"message":"Menší kapitoly mohou být umístěny uvnitř větších"},"category_livestream_messages":{"message":"Livestream: Čtení donatů / zpráv"},"category_livestream_messages_short":{"message":"Čtení zpráv"},"autoSkip":{"message":"Automatické přeskočení"},"manualSkip":{"message":"Ruční přeskočení"},"showOverlay":{"message":"Zobrazit v liště"},"disable":{"message":"Zakázat"},"autoSkip_POI":{"message":"Automatické přeskočení na začátek"},"manualSkip_POI":{"message":"Zeptat se při načtení videa"},"showOverlay_POI":{"message":"Zobrazit v liště"},"showOverlay_full":{"message":"Zobrazit štítek"},"showOverlay_chapter":{"message":"Zobrazit kapitoly"},"autoSkipOnMusicVideos":{"message":"Automaticky přeskočit všechny segmenty, když je ve videu nehudební segment"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Automaticky přeskakovat pouze na music.youtube.com"},"muteSegments":{"message":"Povolit segmenty, které místo přeskočení ztlumují zvuk"},"fullVideoSegments":{"message":"Zobrazit ikonu, když je celé video reklama","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Zobrazit štítky i u náhledů videí","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Barva neodeslaného segmentu","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Barva lišty"},"category":{"message":"Kategorie"},"skipOption":{"message":"Možnost přeskočení","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Otevřít pokročilé možnosti přeskočení"},"advancedSkipNotSaved":{"message":"Chyba syntaxe: Vaše možnosti nebyly uloženy"},"advancedSkipSettingsHelp":{"message":"Jak to funguje","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Povolit beta testovací server"},"whatEnableTestingServer":{"message":"Vaše příspěvky a hlasy SE NEZAPOČÍTAJÍ do hlavního serveru. Použijte pouze pro testování."},"testingServerWarning":{"message":"Všechny příspěvky a hlasy SE NEZAPOČÍTAJÍ do hlavního serveru při připojování se k testovacímu serveru. Zakažte, pokud chcete vytvářet skutečné příspěvky."},"bracketNow":{"message":"(Nyní)"},"moreCategories":{"message":"Další kategorie"},"chooseACategory":{"message":"Vyberte kategorii"},"enableThisCategoryFirst":{"message":"Pro odeslání segmentů v kategorii „{0}“ ji nejprve musíte povolit v nastavení. Nyní budete přesměrováni do nastavení.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Varování: tento typ segmentu může být aktivní najednou pouze jeden. Odeslání více segmentů způsobí zobrazení náhodného segmentu."},"youMustSelectACategory":{"message":"Musíte vybrat kategorii pro všechny odeslané segmenty!"},"bracketStart":{"message":"(Začátek)"},"bracketEnd":{"message":"(Konec)"},"End":{"message":"Konec","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"skryté: protihlas"},"hiddenDueToDuration":{"message":"skryté: moc krátké"},"manuallyHidden":{"message":"ručně skryto"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID kanálu ještě není načteno. Pokud používáte vložené video, zkuste místo toho použít domovskou stránku YouTube. Toto může být také způsobeno změnami v rozložení YouTube, pokud si myslíte, že tomu tak bude, zanechte zde komentář:"},"invidiousPermissionRefresh":{"message":"Prohlížeč odvolal oprávnění potřebné k funkci na Invidious a dalších webech třetích stran. Klikněte prosím na tlačítko níže pro opětovnou aktivaci tohoto oprávnění."},"acceptPermission":{"message":"Přijmout oprávnění"},"permissionRequestSuccess":{"message":"Žádost o oprávnění byla úspěšná!"},"permissionRequestFailed":{"message":"Žádost o oprávnění se nezdařila, neklikli jste na Odmítnout?"},"adblockerIssueWhitelist":{"message":"Pokud vám tento problém nepůjde vyřešit, vypněte nastavení 'Vynutit kontrolu kanálu před přeskočením', protože SponsorBlock nemůže zjistit informace o kanálu"},"forceChannelCheck":{"message":"Vynutit kontrolu kanálu před přeskočením"},"whatForceChannelCheck":{"message":"Ve výchozím nastavení bude přeskakovat segmenty ještě před tím, než bude rozšíření vědět, jaký je to kanál. Ve výchozím nastavení mohou být některé segmenty na začátku videa přeskočeny na povolených kanálech. Povolením této možnosti tomu zabráníte, ale každé přeskočení bude mít mírné zpoždění, protože získávání ID kanálu může chvíli trvat. Toto zpoždění nemusí být patrné, pokud máte rychlý internet."},"forceChannelCheckPopup":{"message":"Zvažte povolení možnosti „Vynutit kontrolu kanálu před přeskočením“"},"downvoteDescription":{"message":"Nesprávné / špatné časování"},"incorrectVote":{"message":"Nesprávné"},"harmfulVote":{"message":"Škodlivé","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Změnit kategorii"},"nonMusicCategoryOnMusic":{"message":"Toto video je kategorizováno jako hudba. Jste si jisti, že je v něm sponzorská sekce? Pokud se opravdu jedná o „Nehudební segment“, otevřete nastavení a povolte tuto kategorii. Poté budete moct odeslat segment jako „Nehudební“ místo sponzorského. Pokud jste zmateni, přečtěte si prosím pokyny."},"multipleSegments":{"message":"Více segmentů"},"guidelines":{"message":"Pokyny"},"readTheGuidelines":{"message":"Přečtěte si pokyny!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategorie jsou zde!"},"categoryUpdate2":{"message":"Otevřít možnosti pro přeskočení intra, outra, merche apod."},"help":{"message":"Nápověda"},"GotIt":{"message":"Rozumím","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Tento segment je velký. Pokud je celé video o jednom tématu, změňte režim z „Přeskočit“ na „Celé video“. Pro více informací se podívejte na pokyny."},"categoryPillTitleText":{"message":"Toto celé video je označeno jako tato kategorie a je příliš integrované na to, aby se dalo rozdělit"},"chapterNameTooltipWarning":{"message":"Jeden z názvů kapitol je podobný kategorii. Pokud je to možné, raději používejte kategorie."},"experiementOptOut":{"message":"Odhlásit se ze všech budoucích experimentů","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Skrýt napořád"},"warningChatInfo":{"message":"Všimli jsme si, že děláte některé běžné chyby. Velmi si vážíme vaší dosavadní práce, ale snažíme se zde o dokonalost, takže i na velmi malých chybách záleží :)"},"questionButton":{"message":"Mám otázku"},"askAQuestion":{"message":"Mám otázku"},"warningConfirmButton":{"message":"Chápu důvod"},"warningError":{"message":"Chyba při pokusu o potvrzení varování:"},"deArrowMessageRecieved":{"message":"Obdrželi jste tip od moderátora"},"Donate":{"message":"Přispět"},"considerDonating":{"message":"Pomozte s financováním vývoje"},"supportSponsorBlock":{"message":"Podpořte mou práci na plný úvazek na SponsorBlocku"},"hideDonationLink":{"message":"Skrýt odkaz na přispění"},"darkModeOptionsPage":{"message":"Tmavý režim na stránce možností"},"helpPageThanksForInstalling":{"message":"Děkujeme za instalaci SponsorBlocku."},"helpPageReviewOptions":{"message":"Zkontrolujte prosím možnosti níže"},"helpPageFeatureDisclaimer":{"message":"Spousta funkcí je ve výchozím nastavení zakázána. Pokud chcete přeskakovat intra, outra, používat Invidious atd., povolte je níže. Můžete také zobrazit/skrýt UI prvky."},"helpPageHowSkippingWorks":{"message":"Jak to funguje"},"helpPageHowSkippingWorks1":{"message":"Všechny sponzorské segmenty jsou přidány uživateli, jako jste vy. Seznam segmentů v databázi si můžete zobrazit otevřením vyskakovacího okna v pravém horním rohu vašeho prohlížeče."},"helpPageHowSkippingWorks2":{"message":"Kdykoli přeskočíte segment, dostanete oznámení. Pokud je časování nesprávné, můžete hlasovat proti kliknutím na palec dolů! Také můžete hlasovat ve vyskakovacím okně."},"Submitting":{"message":"Odesílání"},"helpPageSubmitting1":{"message":"Přidat segment můžete kliknutím na logo SponsorBlocku v přehrávači videa."},"helpPageSubmitting2":{"message":"Kliknutím na tlačítko přehrání označíte začátek segmentu. Kliknutím na tlačítko zastavení označíte jeho konec. Kliknutím na tlačítko se šipkou nahoru otevřete nabídku odeslání, kde můžete zkontrolovat své segmenty jejich náhledem a upravit je, aby byly co nejlepší. Přesnost je důležitý, takže si před odesláním nezapomeňte přečíst pokyny."},"helpPageCopyOfDatabase":{"message":"Kam se segmenty odesílají?"},"helpPageCopyOfDatabase1":{"message":"Všechny segmenty se odesílají do databáze SponsorBlock, kterou může kdokoli použít a je veřejně dostupná na adrese"},"helpPageCopyOfDatabase2":{"message":"Zdrojový kód je volně dostupný. Takže i když se mi něco stane, vaše příspěvky nebudou ztraceny."},"AdviceForSubmitting":{"message":"Rady pro odesílání"},"Credits":{"message":"Poděkování"},"LearnMore":{"message":"Zjistit více"},"FullDetails":{"message":"Úplné podrobnosti"},"CopyDownvoteButtonInfo":{"message":"Zahlasuje proti a vytvoří pro vás lokální kopii pro opětovné odeslání"},"OpenCategoryWikiPage":{"message":"Otevřít wiki stránku této kategorie."},"CopyAndDownvote":{"message":"Zkopírovat a hlasovat proti"},"ContinueVoting":{"message":"Pokračovat v hlasování"},"ChangeCategoryTooltip":{"message":"Toto bude okamžitě platit pro vaše segmenty"},"downvote":{"message":"Hlas proti"},"upvote":{"message":"Hlas pro"},"hideSegment":{"message":"Skrýt segment"},"skipSegment":{"message":"Přeskočit segment"},"playChapter":{"message":"Přehrát kapitolu"},"SponsorTimeEditScrollNewFeature":{"message":"Použijte kolečko myši při přechodu přes editační okno pro rychlou úpravu času. Kombinace kláves Ctrl nebo Shift mohou být použity k doladění změn."},"categoryPillNewFeature":{"message":"Novinka! Nyní uvidíte, zda je video zcela sponzorované nebo celé obsahuje sebepropagaci"},"yearAbbreviation":{"message":" let","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Chování","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Rozhraní","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Klávesové zkratky","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Záloha/obnovení","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Různé","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Vzhled oznámení o přeskočení","description":"Option label"},"unbind":{"message":"Odebrat","description":"Unbind keyboard shortcut"},"notSet":{"message":"Nenastaveno"},"change":{"message":"Změnit"},"youtubeKeybindWarning":{"message":"Toto je vestavěná zkratka YouTube. Opravdu ji chcete použít?"},"betaServerWarning":{"message":"BETA server je povolen!"},"openOptionsPage":{"message":"Otevřít stránku s možnostmi"},"resetToDefault":{"message":"Obnovit nastavení na výchozí hodnoty"},"confirmResetToDefault":{"message":"Opravdu chcete obnovit všechna nastavení na jejich výchozí hodnoty? Tato akce je nevratná."},"exportSegments":{"message":"Exportovat segmenty"},"importSegments":{"message":"Importovat segmenty"},"Import":{"message":"Importovat","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Uplatnění bylo úspěšné!"},"redeemFailed":{"message":"Licenční klíč není platný"},"hideUpsells":{"message":"Skrýt možnosti nedostupné bez další platby"},"hideNewFeatureUpdates":{"message":"Skrýt informace o nových funkcích"},"redeem":{"message":"Uplatnit"},"enterLicenseKey":{"message":"Zadejte licenční klíč"},"unsubmittedSegmentCounts":{"message":"Momentálně máte {0} na {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"V současné době nemáte žádné neodeslané segmenty","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"neodeslaný segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"neodeslaných segmentů","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"videu","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videích","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Vymazat všechny segmenty","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Opravdu chcete vymazat všechny své neodeslané segmenty?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Zobrazit segmenty","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Skrýt segmenty","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID videa","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Počet segmentů","description":"Header of the unsubmitted segments list"},"actions":{"message":"Akce","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Sdílet jako URL"},"segmentFetchFailureWarning":{"message":"Varování: Server zatím neodpověděl se segmenty. U tohoto videa se již mohou nacházet odeslané segmenty, ale vy jste je neobdrželi kvůli chybě na serveru."},"allowScrollingToEdit":{"message":"Povolit skrolování k časům úprav"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Lepší názvy a náhledy na YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Komunitní názvy a náhledy, které mají popsat video, ne nadchnout","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Vyberte nejvíce popisný"},"Original":{"message":"Původní"},"OriginalTitle":{"message":"Původní název"},"CurrentTime":{"message":"Aktuální čas"},"resetCustomTitle":{"message":"Obnovit název zpět na původní text"},"resetIcon":{"message":"Ikona obnovení"},"TypeYourOwnTitleHere":{"message":"Sem zadejte svůj název"},"VideoNotReady":{"message":"Video není připraveno"},"FailedToRender":{"message":"Vykreslování se nezdařilo","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Chybějící Canvas","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Chyba při vykreslování","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Načítání selhalo","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Formát názvu"},"Disabled":{"message":"Zakázáno"},"CapitalizeWords":{"message":"Kapitalizace slov"},"TitleCase":{"message":"Kapitalizace v názvu"},"SentenceCase":{"message":"Kapitalizace ve větě"},"LowerCase":{"message":"Malá písmena"},"FirstLetterUppercase":{"message":"Velké počáteční písmeno"},"shouldCleanEmojis":{"message":"Odebrat smajlíky"},"onlyFormatCustomTitles":{"message":"Formátovat pouze názvy odeslané uživateli"},"onlyTitleCaseInEnglish":{"message":"Velká písmena u neanglických názvů"},"onlyTitleCaseInEnglishDescription":{"message":"Rozpoznávání jazyka není dokonalé a může rozpoznat některé anglické názvy jako neanglické."},"thumbnailFallbackOption":{"message":"Pokud neexistuje žádný komunitní náhled"},"whatThumbnailFallbackOption":{"message":"Při výběru na náhodném čase budou použita data z projektu SponsorBlock pro zajištění, že nebude vybrán čas v propagačním segmentu.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Zobrazit snímek z náhodného času"},"TheOriginalThumbnail":{"message":"Zobrazit původní náhled"},"showABlankBox":{"message":"Zobrazit prázdný rámeček"},"AutoGenerated":{"message":"Zobrazit náhled automaticky vygenerovaný službou YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Začátek"},"Middle":{"message":"Střed"},"keepUnsubmitted":{"message":"Ukládat odeslané hlasy"},"showLiveCover":{"message":"Zobrazit avatar kanálu u nadcházejících videí","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Nikdy nepoužívat A/B testované náhledy"},"ignoreAbThumbnailsDescription":{"message":"Kanály mohou nastavit testy na svých videích, kdy bude YouTube zobrazovat různý náhled pro každého uživatele. Tato možnost vždy použije první náhled pro zachování konzistence."},"abThumbnailsWarning":{"message":"Varování: u tohoto videa momentálně běží A/B testování náhledů. To znamená, že se může náhled často měnit. Kvůli tomuto riziku nedoporučujeme hlasovat pro původní náhled."},"whatKeepUnsubmitted":{"message":"Ponechat odeslané hlasy po hlasování pro zobrazení názvů a náhledů, které jste zvolili vy, namísto nejlépe hodnocených na serveru."},"keepUnsubmittedInPrivate":{"message":"Ukládat odeslané hlasy z anonymních karet"},"useThumbnailGenerationService":{"message":"Použít službu generování náhledů"},"titleMaxLines":{"message":"Maximální počet řádků pro název"},"titleMaxLinesDescription":{"message":"Názvy videí budou v návrzích rozloženy na tento počet řádků."},"thumbnailSaturationLevel":{"message":"Úroveň sytosti náhledů"},"whatSaturateThumbnails":{"message":"Zmenšit výraznost náhledů snížením jejich barvy"},"hideDetailsWhileFetching":{"message":"Skrýt podrobnosti při načítání"},"hideDetailsWhileFetchingDescription":{"message":"Skrýt názvy a náhledy při načítání dat ze serveru. Pokud je tato funkce zakázána, při změně názvů a náhledů uvidíte blikání."},"ignoreTranslatedTitles":{"message":"Nezobrazovat názvy přeložené službou YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube někdy automaticky přeloží názvy do vašeho rodného jazyka. Tato možnost se použije pouze v případě, že není dostupný komunitní název."},"onAllPages":{"message":"Na všech stránkách","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Na všech stránkách kromě stránek videí","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Nikdy"},"thumbnailGeneratorDescription1":{"message":"Služba generování miniatur výrazně urychluje generování miniatur odesláním anonymního požadavku s ID videa na vzdálený server. Miniatura se pak buď vygeneruje, nebo se použije verze z mezipaměti, pokud již byla vygenerována."},"thumbnailGeneratorDescription2":{"message":"Při použití na stránkách s videem by mohlo dojít k úniku nezařazených ID videí na tento server. Nastavením této možnosti na „Na všech stránkách kromě stránek videí“ se tomuto problému vyhnete. Další možností je hostovat vlastní službu generování miniatur."},"thumbnailGeneratorDescription3":{"message":"Pokud je použití služby generování miniatur zakázáno, budou všechny požadavky používat systém k-anonymních dotazů, což ztěžuje serveru předvídat, která videa byla načtena, a bude použita pomalejší místní služba generování miniatur.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Zdrojový kód služby generování náhledů"},"moreAboutKAnonymity":{"message":"Více informací o K-Anonymitě","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Vždy zobrazit tlačítko „Zobrazit původní“"},"whatAlwaysShowShowOriginalButton":{"message":"Pokud chcete vždy vědět, zda byl změněn název/náhled, povolte tuto funkci."},"showOriginalOnHover":{"message":"Při přejetí myší přepnout mezi vlastními a původními podrobnostmi"},"showOriginalOnHoverOfVideo":{"message":"Přepínat mezi vlastními podrobnostmi a původními při přejetí myší kamkoli na kartu videa"},"showOriginalOnHoverOfVideoDescription":{"message":"Toto zakáže automatické přehrávání při přejetí myší"},"showCustomOnHoverIfCasual":{"message":"Zobrazit vlastní název po přejetí myší, pokud je zobrazen název z normálního režimu"},"showIconForFormattedTitles":{"message":"U automaticky formátovaných názvů zobrazit tlačítko „Zobrazit původní“"},"Enable":{"message":"Povolit"},"Titles":{"message":"Názvy","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Náhledy","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Hlasy v normálním režimu","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Chyba"},"ShowOriginal":{"message":"Zobrazit původní podrobnosti"},"ShowModified":{"message":"Zobrazit upravené podrobnosti"},"ShowFormatted":{"message":"Zobrazit formátované podrobnosti"},"FillerWarning":{"message":"Varování: Jedná se o velmi agresivní kategorii. S největší pravděpodobností budete muset někdy zrušit přeskočení nebo kategorii zakázat. Upozorňujeme, že u mnoha videí je přeskočeno více než 50 % videa! Nezapomeňte však, že při odesílání je stále třeba dodržovat konkrétní pokyny.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Pokud chcete trvale zůstat v tomto chatu, připojte se na Discord nebo Matrix","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Zobrazit nápovědu k pokynům","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Vyhněte se přehnaným výrazům obličeje","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Přemýšlejte v širších souvislostech, neodpovídejte pouze na otázku v původním názvu","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Vyhněte se popisování reakcí na video („šokující“)","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Poskytněte dostatek informací pro informovanou volbu před kliknutím"},"tip5":{"message":"Použijte velká písmena jako ve větě","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Před odesláním si přečtěte všechny pokyny","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Můj název je kapitalizován jako věta","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Můj název neodpovídá pouze na otázku v aktuálním názvu","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Názvy by měly popisovat video, nebo obecně jeho obsah/příběh. Nejprve zhlédněte celé video, abyste opravdu věděli, o čem je, než abyste se spoléhali na původní název snažící se zaujmout.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Můj název neshrnuje závěr ani nevyzrazuje zápletku","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Názvy nemají nahradit celé video, ale máte se díky nim rozhodnout, zda na dané video chcete kliknout.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Můj název nekontroluje fakta, nezesměšňuje ani nekrizituje video nebo tvůrce","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Názvy mají být z pohledu tvůrce a videa. Hodnocení nebo kontrola faktů samotného videa je mimo působnost DeArrow. Názvy nejsou určeny jako sekce komentářů.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Zjištěno slovo: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Na začátku názvu nepoužívejte zbytečná slovesa","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Začněte všechny názvy velkým písmenem. Názvy by měly být formátovány jako věta","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Názvy by neměly končit tečkou","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Nepřidávejte pouze odpověď na otázku v původním. Názvy by měly popisovat video nebo příběh obecně","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Názvy by neměly ověřovat fakta, zesměšňovat ani kritizovat video nebo tvůrce","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Názvy by neměly zachovávat senzacechtivé prvky z původního názvu","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Názvy by neměly obsahovat emotikony","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Před odesláním vyřešte varování"},"dearrowHelpSponsorBlockImported":{"message":"Poznámka: vaše nastavení doplňku SponsorBlock byla automaticky importována!"},"howItWorks":{"message":"Jak to funguje"},"discordPromotion":{"message":"Přispějte, vymyslete nějaké návrhy a pomozte ostatním na {discord} nebo na {matrix}"},"deArrowDonationText":{"message":"Pokud se vám líbí, co jsem zatím vytvořil a chcete mi finančně pomoct, zde je odkaz"},"termsAgreement":{"message":"Používáním tohoto rozšíření souhlasíte se {privacy-policy} a {terms}"},"privacyPolicy":{"message":"zásadami ochrany osobních údajů"},"termsOfUse":{"message":"podmínkami používání"},"openSourceLicenses":{"message":"Licence Open Source"},"defaultToOriginals":{"message":"Původní informace o videu jako výchozí"},"whatDefaultToOriginals":{"message":"Ve výchozím nastavení zobrazit původní název a náhled, umožnit ale přepnutí na vlastní název a náhled pomocí tlačítka, které se zobrazí po přejetí myší."},"replaceTitles":{"message":"Nahradit názvy"},"replaceThumbnails":{"message":"Nahradit náhledy"},"useCrowdsourcedTitles":{"message":"Použít komunitní názvy"},"whatUseCrowdsourcedTitles":{"message":"Při zakázání budou názvy formátovány, ale nebudou použity jejich komunitou vytvořené verze","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Opravdu chcete odstranit tuto konfiguraci?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Nová konfigurace"},"DeleteConfiguration":{"message":"Odstranit konfiguraci"},"ChannelAllowlist":{"message":"Nastavení pro tento kanál"},"ConfigurationName":{"message":"Název konfigurace"},"ChannelListInstructions":{"message":"Do níže uvedeného pole zadejte všechny kanály, na které chcete tuto konfiguraci použít, každý kanál na nový řádek. Podporovány jsou jak ID kanálů, tak zobrazované názvy. @ Uživatelská jména podporována nejsou. ID kanálu získáte po kliknutí na tlačítko sdílení v informacích o kanálu. Na tuto stránku se dostanete kliknutím na popis kanálu, který se zobrazí pod názvem kanálu na jeho stránce.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Zatím nejsou nastaveny žádné konfigurace. Pro přidání nové konfigurace klikněte na tlačítko nahoře.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Zastavte clickbaity nahrazením názvů a náhledů jejich přesnějšími verzemi"},"DeArrowPromotionMessage2":{"message":"Jste unaveni clickbaity? Vyzkoušejte mé nové rozšíření pro vylepšení názvů a náhledů"},"DeArrowPromotionMessage3":{"message":"Mrkněte na DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Nelíbí se vám tento název? Pokud byste raději viděli název níže, mrkněte na funkci nahrazení názvu v DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Tento náhled byl vybrán z náhodného času, protože u tohoto videa zatím nebyl nastaven vlastní náhled","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Tento náhled byl vybrán z náhodného času a název byl automaticky formátován, protože u tohoto videa zatím nebyl nastaven vlastní název a náhled","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Výchozí nastavení můžete změnit níže","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"Od doby nainstalování tohoto rozšíření bylo nahrazeno {titles} názvů a {thumbnails} náhledů","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} název ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} názvů ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"a {thumbnails} náhled","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"a {thumbnails} náhledů","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"Od doby nainstalování tohoto rozšíření jsme nahradili {titleAndThumbnailMessage}","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Počítat nahrazení názvů a náhledů"},"countReplacementsDescription":{"message":"Slouží k poskytnutí statistik ve vyskakovací nabídce.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Přidat seznam filtrů do blokových průzkumů, prodeje merchandise a dalších propagačních prvků pomocí yt-neuter"},"requiresUblock":{"message":"Vyžaduje uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Při detekci ID videa se něco pokazilo. Před odesláním prosím zkuste znovu načíst stránku a ujistěte se, že jsou segmenty odeslány u správného videa. Pokud se toto stává často, odešlete prosím hlášení společně s dalšími rozšířeními a uživatelskými skripty, které máte nainstalovány, na GitHub, Discord nebo Matrix."},"dearrowLogoCredit":{"message":"Logo založeno na Twemoji licencovaném pod CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock není kompatibilní s doplňkem „Zoom to Fill“. Místo něj můžete použít spoustu alternativ, které fungují správně."},"freeTrialStarted":{"message":"Vaše bezplatná zkušební verze byla úspěšně zahájena. Navštivte YouTube a vyzkoušejte ji"},"freeTrialEnded":{"message":"Vaše bezplatná zkušební verze skončila"},"freeTrialPrompt":{"message":"Pokud si chcete na hodinu vyzkoušet funkce, můžete tlačítkem níže zahájit zkušební verzi."},"startFreeTrial":{"message":"Spustit bezplatnou zkušební verzi"},"freeAccessRequested":{"message":"Úspěšně jste se zaregistrovali pro bezplatný přístup. Jakmile vám bude udělen přístup, budete upozorněni."},"freeAccessComplete":{"message":"Gratulujeme! Nyní máte bezplatný přístup k DeArrow"},"DeArrowNotActivated":{"message":"DeArrow není aktivován"},"ActivateDeArrow":{"message":"Aktivovat DeArrow"},"DeArrowIsActivated":{"message":"DeArrow byl úspěšně aktivován"},"Close":{"message":"Zavřít"},"ViewLicenseKey":{"message":"Zobrazit licenční klíč"},"SharingIsCaring":{"message":"Daruj a budeš obdarován"},"cleanPopup":{"message":"Skrýt zbytečnosti ve vyskakovacím okně seznamu segmentů"},"hideSegmentCreationInPopup":{"message":"Skrýt tlačítka pro tvorbu segmentů ve vyskakovacím okně"},"syncDisabledWarning":{"message":"Varování: ve vašem prohlížeči bylo zakázáno úložiště rozšíření. Nastavení nebudou uložena."},"syncDisabledWarningDeArrow":{"message":"DeArrow nebude fungovat bez přístupu k úložišti."},"syncDisabledFirefoxSuggestions":{"message":"Můžete ji povolit na stránce about:config nastavením hodnoty „webextensions.storage.sync.enabled“ na „true“."},"storageFull":{"message":"Úložiště rozšíření je plné. Odstraňte prosím nějaké neodeslané segmenty v možnostech."},"previewSegmentRequired":{"message":"Před odesláním segmentů se prosím podívejte na jejich náhled. Můžete tak učinit klepnutím na tlačítko náhledu nebo použitím následující zkratky:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Akce jako VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Z vašeho prohlížeče momentálně nelze přijímat příspěvky, jelikož YouTube do videa nejspíše vložil serverové reklamy, které toto rozšíření nedokáže odebrat. Pokud vidíte tuto chybu, kontaktujte nás prosím."},"DeArrowIsDisabled":{"message":"DeArrow je zakázán - klikněte pro povolení","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Jste si jisti, že tento původní náhled je v souladu s pokyny služby DeArrow? Pokud obecně pouze upřednostňujete vidět původní náhledy, zvažte změnu možnosti „Pokud neexistuje žádný komunitní náhled“ v nastavení doplňku DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"Na YouTube TV není SponsorBlock kompatibilní s živým a nedávno nahraným obsahem. Pokud se jedná o nedávno nahraný obsah, počkejte prosím několik hodin, než bude dostupná zpracovaná verze nahrávky.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Povolení kanálů není na tv.youtube.com k dispozici.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Líbí se vám původní název?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Ano"},"No":{"message":"Ne"},"votes":{"message":"{0} hlasů","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} hlas","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Zábavné","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Kreativní","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Chytré","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Popisné","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Jiné","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Klasický režim","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Názvy budou nahrazeny standardizovanými formáty založenými na pokynech pro všechna videa, kde existují komunitní názvy."},"CasualMode":{"message":"Normální režim","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Ponechat původní názvy, pokud popisují video dostatečně dobře a jsou chytré nebo zábavné.\nVyberte, které kategorie názvů chcete vidět.\nBudete moci hlasovat, zda název do těchto kategorií patří, nebo ne."},"minimumVotes":{"message":"Minimum hlasů","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Zobrazit původní náhled u videí, kde jste hlasovali v normálním režimu","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Nová funkce: normální režim","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Zobrazit ikonu normálního režimu pouze, pokud je dostupný vlastní název"},"OpenSettings":{"message":"Otevřít nastavení"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/da/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/da/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Forbindelsestimeout. Tjek din internetforbindelse. Hvis dit internet fungerer, er serveren sandsynligvis overbelastet eller nede."},"400":{"message":"Serveren sagde at denne efterspørgsel var ugyldig"},"409":{"message":"Dette er allerede blevet indsendt"},"502":{"message":"Serveren lader til at være overbelastet. Prøv igen om et par sekunder."},"fullName":{"message":"SponsorBlock til YouTube - Fjern reklamer","description":"Name of the extension."},"Description":{"message":"Fjern reklamer, subscriber tiggeri og mere i youtube videoer. Rapporter reklamer på de videoer du ser for at spare folks tid.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanal whitelisted!"},"Segment":{"message":"seg"},"Segments":{"message":"segmenter"},"SegmentsCap":{"message":"Segmenter"},"Chapters":{"message":"Kapitler"},"renderAsChapters":{"message":"Vis segmenter som kapitler","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Vis nuværende segment ved siden af videotid"},"showAutogeneratedChapters":{"message":"Vis kapitler auto-genereret af YouTube"},"upvoteButtonInfo":{"message":"Stem for dette forslag"},"reportButtonTitle":{"message":"Anmeld"},"reportButtonInfo":{"message":"Anmeld dette forslag som forkert."},"Dismiss":{"message":"Afvis"},"Loading":{"message":"Indlæser..."},"Hide":{"message":"Vis aldrig"},"hitGoBack":{"message":"Tryk på unskip for at gå tilbage til hvor du kom fra."},"unskip":{"message":"Annuller overspring"},"reskip":{"message":"Spring over"},"unmute":{"message":"Lyd til"},"paused":{"message":"Sat på pause"},"manualPaused":{"message":"Sat på pause"},"confirmMSG":{"message":"For at redigere eller slette individuelle værdier, så skal du klikke på info knappen eller åbne udvidelses popupet ved at klikke på udvidelses ikonet i øverste højre hjørne."},"clearThis":{"message":"Er du sikker på, at du vil fjerne dette?\n\n"},"Unknown":{"message":"Der skete en fejl da du prøvede at indsende dine reklame tider, prøv lige igen."},"sponsorFound":{"message":"Denne video har segmenter i databasen!"},"sponsor404":{"message":"Ingen segmenter fundet"},"sponsorStart":{"message":"Start segment nu"},"sponsorEnd":{"message":"Afslut segment nu"},"sponsorCancel":{"message":"Annuller Oprettelse Af Segment"},"noVideoID":{"message":"Ingen YouTube-video fundet.\nHvis dette er forkert, så genindlæs siden."},"refreshSegments":{"message":"Opdater segmenter"},"success":{"message":"Succes!"},"voted":{"message":"Stemt!"},"serverDown":{"message":"Det ser ud til at serveren er nede. Kontakt udvikleren straks."},"connectionError":{"message":"Der opstod en forbindelsesfejl. Fejlkode: "},"segmentsStillLoading":{"message":"Segmenter indlæses stadig..."},"clearTimes":{"message":"Ryd Segmenter"},"openPopup":{"message":"Åbn SponsorBloker Pop-op"},"closePopup":{"message":"Luk Pop-op"},"closeIcon":{"message":"Luk-ikon"},"OpenSubmissionMenu":{"message":"Åbn indsendelsesmenu"},"OpenCasualVoteMenu":{"message":"Åbn menu for afslappet tilstand"},"sortSegments":{"message":"Sortér segmenter"},"submitCheck":{"message":"Er du sikker på, at du vil indsende dette?"},"whitelistChannel":{"message":"Hvidlist kanal"},"removeFromWhitelist":{"message":"Fjern kanal fra hvidliste"},"voteOnTime":{"message":"Stem På Et Segment"},"Submissions":{"message":"Indsendelser"},"savedPeopleFrom":{"message":"Du har sparet folk for "},"viewLeaderboard":{"message":"Topliste"},"recordTimesDescription":{"message":"Indsend"},"submissionEditHint":{"message":"Sektionsredigering vises, når du klikker på Indsend","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Tip: Du kan opsætte tastebindinger til indsendelse i indstillingerne"},"clearTimesButton":{"message":"Ryd tider"},"Username":{"message":"Brugernavn"},"setUsername":{"message":"Indstil brugernavn"},"copyPublicID":{"message":"Kopiér offentligt bruger-ID"},"copySegmentID":{"message":"Kopiér segment-ID"},"loopChapter":{"message":"Gentag kapitel"},"unloopChapter":{"message":"Gentag ikke kapitel"},"hideThis":{"message":"Skjul dette"},"Options":{"message":"Indstillinger"},"showButtons":{"message":"Vis knapper på YouTube-afspiller"},"hideButtonsDescription":{"message":"Dette skjuler knapperne, der vises på YouTube-afspilleren til indsendelse af overspringssegmenter."},"showSkipButton":{"message":"Behold knappen \"Spring til fremhævning\" på afspilleren"},"showInfoButton":{"message":"Vis Info-knap på YouTube-afspiller"},"autoHideInfoButton":{"message":"Skjul Info-knap automatisk"},"showDeleteButton":{"message":"Vis Slet-knappen på YouTube-afspiller"},"enableViewTracking":{"message":"Aktiver optælling af antal overspring"},"whatViewTracking":{"message":"Funktionen registrerer, hvilke segmenter du springer over, så brugerne kan se, hvor meget deres bidrag har hjulpet andre, og bruges som en måleenhed sammen med upvotes til at forhindre spam i databasen. Hver gang du springer et segment over, sender udvidelsen en besked til serveren. Forhåbentlig lader de fleste denne indstilling være, så visningstallene forbliver korrekte. :)"},"enableViewTrackingInPrivate":{"message":"Aktiver optælling af antal overspring i inkognitovinduer (private vinduer)"},"enableTrackDownvotes":{"message":"Gem segment-downvotes"},"whatTrackDownvotes":{"message":"Ethvert segment, du nedstemmer, forbliver skjult selv efter genindlæsning"},"trackDownvotesWarning":{"message":"Advarsel: Deaktivering af dette sletter alle tidligere gemte downvotes"},"enableTrackDownvotesInPrivate":{"message":"Gem segment-downvotes i inkognitofaner (private faner)"},"enableQueryByHashPrefix":{"message":"Søg via hashpræfiks"},"whatQueryByHashPrefix":{"message":"I stedet for at anmode serveren om segmenter med videoID’et, sendes kun de første 4 tegn af videoID’ets hash. Serveren returnerer derefter data for alle videoer med lignende hashes."},"enableShowCategoryWithoutPermission":{"message":"Vis kategorier i indsendelsesmenuen, selv uden indsendelsestilladelse"},"whatShowCategoryWithoutPermission":{"message":"Nogle kategorier kræver tilladelse til at indsende på grund af minimumskrav til omdømme"},"showNotice":{"message":"Vis meddelelse igen"},"showSkipNotice":{"message":"Vis meddelelse, når et segment er sprunget over"},"showUpcomingNotice":{"message":"Vis meddelelse, før et segment starter"},"showCategoryGuidelines":{"message":"Vis kategorihjælp"},"noticeVisibilityMode0":{"message":"Fuld størrelse på meddelelser om overspring"},"noticeVisibilityMode1":{"message":"Små meddelelser om overspring ved automatisk overspring"},"noticeVisibilityMode2":{"message":"Alle små meddelelser om overspring"},"noticeVisibilityMode3":{"message":"Udtonede meddelelser om overspring ved automatisk overspring"},"noticeVisibilityMode4":{"message":"Alle meddelelser om overspring udtonet"},"longDescription":{"message":"SponsorBlock lader dig overspringe sponsorer, introer, outroer, abonnementspåmindelser og andre irriterende dele af YouTube-videoer. SponsorBlock er en crowdsourcet browserudvidelse, hvor alle kan indsende start- og sluttidspunkter for sponsorerede segmenter og andre segmenter i YouTube-videoer. Du kan også overspringe de dele af musikvideoer, som ikke er musik.","description":"Full description of the extension on the store pages."},"website":{"message":"Hjemmeside","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Kildekode","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Meddelelsen er blevet opgraderet!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Hvis du stadig ikke kan lide det, så tryk på knappen \"Vis aldrig\".","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Spring segment over","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Start/stop segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Åbn indsendelsesmenu","description":"Keybind label"},"setSubmitKeybind":{"message":"Indsend segmenter","description":"Keybind label"},"setPreviewKeybind":{"message":"Forhåndsvis segment","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Luk spring over-meddelelse","description":"Keybind label"},"setDownvoteKeybind":{"message":"Downvote segment","description":"Keybind label"},"setUpvoteKeybind":{"message":"Upvote segment","description":"Keybind label"},"nextChapterKeybind":{"message":"Næste kapitel","description":"Keybind label"},"previousChapterKeybind":{"message":"Forrige kapitel","description":"Keybind label"},"enableDeArrowKey":{"message":"Slå DeArrow til/fra","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Åbn indsendelsesmenu","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Vælg en tast ved at trykke på den og vælg de modificeringstaster du ønsker at bruge."},"disableSkipping":{"message":"Overspringning er aktiveret"},"enableSkipping":{"message":"Overspringning er deaktiveret"},"yourWork":{"message":"Dit arbejde","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Fejlkode: "},"skip":{"message":"Spring over"},"mute":{"message":"Slå lyd fra"},"full":{"message":"Fuld video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Spring {0} over?"},"mute_category":{"message":"Slå lyd fra for {0}?"},"skip_to_category":{"message":"Spring til {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Kommende {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} sprunget over","description":"Example: Sponsor Skipped"},"muted":{"message":"Lyd slået fra for {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Sprunget til {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Stemt på {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Deaktiver automatisk overspringning"},"enableAutoSkip":{"message":"Aktiver automatisk overspringning"},"audioNotification":{"message":"Lydnotifikation ved overspringning"},"audioNotificationDescription":{"message":"Lydnotifikation ved overspringning afspiller en lyd, når et segment overspringes. Hvis deaktiveret (eller automatisk overspringning er deaktiveret), afspilles ingen lyd."},"showTimeWithSkips":{"message":"Vis tid med overspringninger fjernet"},"showTimeWithSkipsDescription":{"message":"Denne tid vises i parentes ved siden af den aktuelle tid under søgelinjen. Den viser den samlede videovarighed minus alle segmenter, også dem der kun er markeret som \"Vis i søgelinje\"."},"youHaveSkipped":{"message":"Du har oversprunget "},"minLower":{"message":"minut"},"minsLower":{"message":"minutter"},"hourLower":{"message":"time"},"hoursLower":{"message":"timer"},"youHaveSavedTime":{"message":"Du har sparet folk","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" af deres liv","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Tjek status.sponsor.ajay.app for serverstatus."},"changeUserID":{"message":"Importér/eksportér dit private bruger-ID"},"whatChangeUserID":{"message":"Dette bør holdes privat. Det fungerer som en adgangskode og må ikke deles med nogen. Hvis nogen får fat i den, kan de udgive sig for at være dig. Hvis du leder efter dit offentlige bruger-ID, så klik på udklipsholderikonet i pop op-vinduet."},"setUserID":{"message":"Angiv privat bruger-ID"},"userIDChangeWarning":{"message":"Advarsel: Ændring af det private bruger-ID er permanent. Er du sikker på, at du vil gøre det? Sørg for at sikkerhedskopiere dit gamle for en sikkerheds skyld."},"createdBy":{"message":"Oprettet af"},"supportOtherSites":{"message":"Understøtter YouTube-websteder fra tredjeparter"},"supportOtherSitesDescription":{"message":"Understøt tredjeparts YouTube-klienter. Du skal acceptere de ekstra tilladelser for at aktivere understøttelse.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Understøttede websteder: "},"optionsInfo":{"message":"Aktiver Invidious-understøttelse, deaktiver automatisk overspringning, skjul knapper m.m."},"addInvidiousInstance":{"message":"Tilføj tredjeparts-klientinstans"},"addInvidiousInstanceDescription":{"message":"Tilføj en brugerdefineret instans. Dette skal KUN formateres med domænet. Eksempel: invidious.ajay.app"},"add":{"message":"Tilføj"},"addInvidiousInstanceError":{"message":"Dette er et ugyldigt domæne. Det skal KUN indeholde domænedelen. Eksempel: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Nulstil liste over Invidious-instanser"},"resetInvidiousInstanceAlert":{"message":"Du er ved at nulstille listen over Invidious-instanser"},"invidiousDisabledSafari":{"message":"Invidious-understøttelse virker ikke i Safari på grund af en fejl. Når Apple retter den, bliver den tilføjet igen."},"currentInstances":{"message":"Nuværende instanser:"},"minDuration":{"message":"Minimumsvarighed (sekunder):"},"minDurationDescription":{"message":"Segmenter kortere end den angivne værdi bliver ikke sprunget over eller vist i afspilleren."},"enableManualSkipOnFullVideo":{"message":"Spring over manuelt, når der er en fuld video-etiket"},"whatManualSkipOnFullVideo":{"message":"For folk, der ønsker at se videoen uafbrudt, hvis den er fuldt sponsoreret eller selvpromoveret."},"skipNoticeDuration":{"message":"Varighed af overspringsmeddelelse (sekunder):"},"skipNoticeDurationDescription":{"message":"Overspringsmeddelelsen bliver på skærmen i mindst dette antal sekunder. Den kan være synlig i længere tid ved manuel overspringning."},"shortCheck":{"message":"Den følgende indsendelse er kortere end din indstillede minimumsvarighed. Dette kan betyde, at den allerede er indsendt og bare bliver ignoreret på grund af denne indstilling. Er du sikker på, at du vil indsende?"},"liveOrPremiere":{"message":"Indsendelse på en aktiv livestream eller premiere er ikke tilladt. Vent venligst indtil den er færdig og genindlæs derefter siden og bekræft, at segmenterne stadig er gyldige."},"showUploadButton":{"message":"Vis Upload-Knap"},"customServerAddress":{"message":"SponsorBlock-serveradresse"},"customServerAddressDescription":{"message":"Adressen SponsorBlock bruger til at foretage opkald til serveren. Medmindre du har din egen serverinstans, bør dette ikke ændres."},"dataFetchingServerAddress":{"message":"Adresse på datahentningsserver"},"dataFetchingServerAddressDescription":{"message":"Adressen der bliver brugt til at kontakte datahentningsserveren.\nHvis du ikke har din egen serverinstans skal dette ikke ændres."},"thumbnailCacheServerAddress":{"message":"Serveradresse på mellemlager for thumbnails"},"save":{"message":"Gem"},"reset":{"message":"Nulstil"},"customAddressError":{"message":"Denne adresse er ikke i den rigtige form. Sørg for at du har http:// eller https:// i begyndelsen og ingen afsluttende skråstreger."},"areYouSureReset":{"message":"Er du sikker på, at du ønsker at nulstille dette?"},"mobileUpdateInfo":{"message":"m.youtube.com understøttes nu"},"exportOptions":{"message":"Importer/Eksporter Alle Indstillinger"},"exportOtherData":{"message":"Importer/eksporter alle andre data"},"exportOptionsCopy":{"message":"Rediger/kopier"},"exportOptionsDownload":{"message":"Gem til fil"},"exportOptionsUpload":{"message":"Indlæs fra fil"},"whatExportOptions":{"message":"Dette er hele din konfiguration i JSON. Dette inkluderer dit private bruger-ID, så sørg for at dele dette med omtanke."},"setOptions":{"message":"Indstil Indstillinger"},"exportOptionsWarning":{"message":"Advarsel: Ændring af indstillingerne er permanent, og kan ødelægge din installation. Er du sikker på, at du vil gøre dette? Sørg for at sikkerhedskopiere din gamle for en sikkerheds skyld."},"incorrectlyFormattedOptions":{"message":"Denne JSON er ikke formateret korrekt. Dine indstillinger er ikke blevet ændret."},"confirmNoticeTitle":{"message":"Indsend segment"},"submit":{"message":"Indsend"},"cancel":{"message":"Annuller"},"delete":{"message":"Slet"},"preview":{"message":"Forhåndsvisning"},"unsubmitted":{"message":"Ikke indsendt"},"inspect":{"message":"Undersøg"},"edit":{"message":"Rediger"},"copyDebugLogs":{"message":"Kopier fejlfindingslogge"},"copyDebugInformation":{"message":"Kopier fejlretningsoplysninger til udklipsholder"},"copyDebugInformationFailed":{"message":"Det lykkedes ikke at skrive til udklipsholderen"},"copyDebugInformationOptions":{"message":"Kopierer information til udklipsholderen, der skal leveres til en udvikler, når en fejl indberettes / når en udvikler anmoder om det. Følsomme oplysninger som dit bruger-ID, hvidlistede kanaler og brugerdefineret serveradresse er blevet fjernet. Dog indeholder det oplysninger som din brugeragent, browser, operativsystem og versionsnummer for udvidelsen. "},"copyDebugInformationComplete":{"message":"Fejlfindingsinformationen er blevet kopieret til udklipsholderen. Du er velkommen til at fjerne alle oplysninger, du helst ikke vil dele. Gem dette i en tekstfil eller indsæt i fejlrapporten."},"keyAlreadyUsed":{"message":"Denne genvej er tilknyttet en anden handling. Vælg venligst en anden."},"to":{"message":"til","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Kopieret!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Inkludér bløde overgange"},"generic_guideline2":{"message":"Afspilles som om intet blev sprunget over"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Betalt kampagne, betalte henvisninger og direkte reklamer. Ikke til selvpromovering eller gratis anerkendelser af gode sager/skabere/hjemmesider/produkter, de kan lide."},"category_sponsor_guideline1":{"message":"Betalt markedsføring"},"category_sponsor_guideline2":{"message":"Ikke til donationer eller egne reklamevarer"},"category_selfpromo":{"message":"Ubetalt/selvmarkedsføring"},"category_selfpromo_description":{"message":"Ligesom \"sponsor\", men for ubetalt markedsføring eller selvmarkedsføring. Dette inkluderer sektioner om merchandise (reklamevarer), donationer eller oplysninger om hvem, de har samarbejdet med."},"category_selfpromo_guideline1":{"message":"Donationer, medlemskaber og egne reklamevarer"},"category_selfpromo_guideline2":{"message":"Gratis anerkendelser af andre, der ikke tilføjer videoen noget"},"category_selfpromo_guideline3":{"message":"Ikke til produkter og merchandise (reklamevarer) designet af store virksomheder"},"category_exclusive_access":{"message":"Eksklusiv adgang"},"category_exclusive_access_description":{"message":"Kun til mærkning af hele videoer. Bruges, når en video viser et produkt, en tjeneste eller et sted, som de har modtaget gratis eller har fået subsidieret adgang til."},"category_exclusive_access_pill":{"message":"Denne video viser et produkt, en tjeneste eller et sted, som de har modtaget gratis eller subsidieret adgang til","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Hele videoen viser noget med gratis eller subsidieret adgang"},"category_interaction":{"message":"Påmindelse om interaktion (abonnere)"},"category_interaction_description":{"message":"Når der er en kort påmindelse om at synes godt om, abonnere eller følge dem midt i indholdet. Hvis den er lang eller om noget specifikt, bør den i stedet markeres som selvpromovering."},"category_interaction_guideline1":{"message":"Korte påmindelser om at synes godt om, abonnere eller følge"},"category_interaction_guideline2":{"message":"Indeholder indirekte påmindelser om at kommentere"},"category_interaction_guideline3":{"message":"Ikke til generel markedsføring, kun opfordringer til handling"},"category_interaction_short":{"message":"Påmindelse om interaktion"},"category_intro":{"message":"Pause-/intro-animation"},"category_intro_description":{"message":"Et interval uden reelt indhold. Kunne være en pause, statisk ramme, gentagelse af animation. Dette bør ikke bruges til overgange som indeholder information."},"category_intro_short":{"message":"Pause"},"category_intro_guideline1":{"message":"Interval uden egentligt indhold"},"category_intro_guideline2":{"message":"Ikke for overgange med information"},"category_outro":{"message":"Slutkort/anerkendelser"},"category_outro_description":{"message":"Anerkendelser, rulletekster eller når YouTube-slutkort vises. Ikke til konklusioner med information."},"category_outro_guideline1":{"message":"Inkludér ikke indhold, selv hvis slutkort er på skærmen"},"category_preview_description":{"message":"Samling af klip, der viser, hvad der kommer senere i denne video eller andre videoer i en serie, hvor alle oplysninger gentages senere i videoen."},"category_preview_guideline1":{"message":"Klip, der vil blive vist senere eller i en fremtidig video"},"category_preview_guideline2":{"message":"Resumé af en tidligere video"},"category_preview_guideline3":{"message":"Ikke til afsnit, der tilføjer yderligere indhold"},"category_filler":{"message":"Sidespor/vittigheder"},"category_filler_description":{"message":"Emneafvigende scener eller vittigheder, der ikke er nødvendige for at forstå hovedindholdet af videoen. Dette bør ikke omfatte segmenter, der giver kontekst eller baggrundsoplysninger. Dette er en meget aggressiv kategori beregnet til når du ikke er i humør til \"sjov\"."},"category_filler_short":{"message":"Sidespor"},"category_filler_guideline1":{"message":"Emneafvigelser eller vittigheder"},"category_filler_guideline2":{"message":"Distraktioner, bloopers, replays"},"category_filler_guideline3":{"message":"Ikke for scener, der er nødvendige for at forstå emnet"},"category_music_offtopic":{"message":"Musik: Ikke-Musikalsk Sektion"},"category_music_offtopic_description":{"message":"Kun til brug i musikvideoer. Dette bør kun bruges til sektioner af musikvideoer, der ikke allerede er dækket af en anden kategori."},"category_music_offtopic_short":{"message":"Ikke-Musikalsk"},"category_music_offtopic_guideline1":{"message":"Afsnit, der ikke findes i officielle udgivelser"},"category_music_offtopic_guideline2":{"message":"Ikke-musik i en live-optræden"},"category_poi_highlight":{"message":"Fremhæv"},"category_poi_highlight_description":{"message":"Den del af videoen, som de fleste mennesker leder efter. Svarende til \"Video starter ved x\" kommentarer."},"category_poi_highlight_guideline1":{"message":"Afsnit, som de fleste mennesker leder efter"},"category_poi_highlight_guideline2":{"message":"Kan springe kontekst over"},"category_poi_highlight_guideline3":{"message":"Kan springe til titlen eller thumbnailet"},"category_chapter":{"message":"Kapitel"},"category_chapter_description":{"message":"Brugerdefinerede navngivne kapitler, der beskriver store afsnit af en video."},"category_chapter_guideline1":{"message":"Undlad at nævne sponsor mærkenavne"},"category_chapter_guideline2":{"message":"Brug større kapitler til generelle sektioner"},"category_chapter_guideline3":{"message":"Mindre kapitler kan placeres inde i større kapitler"},"category_livestream_messages":{"message":"Livestream: Donations-/Beskedsaflæsning"},"category_livestream_messages_short":{"message":"Læsning Af Meddelelser"},"autoSkip":{"message":"Automatisk overspringning"},"manualSkip":{"message":"Manuel Spring Over"},"showOverlay":{"message":"Vis på søgelinjen"},"disable":{"message":"Deaktiver"},"autoSkip_POI":{"message":"Spring automatisk til starten"},"manualSkip_POI":{"message":"Spørg, når videoen indlæses"},"showOverlay_POI":{"message":"Vis på søgelinjen"},"showOverlay_full":{"message":"Vis Etiket"},"showOverlay_chapter":{"message":"Vis Kapitler"},"autoSkipOnMusicVideos":{"message":"Spring automatisk over alle segmenter, når der er et ikke-musik-segment"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Spring kun automatisk over på music.youtube.com"},"muteSegments":{"message":"Tillad segmenter som slår lyden fra i stedet for at springe over"},"fullVideoSegments":{"message":"Vis et ikon, når en video udelukkende er en reklame eller udelukkende selvpromovering","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Vis også etiketter på videothumbnails","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Ikke-indsendt farve","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Farve på søgelinjen"},"category":{"message":"Kategori"},"skipOption":{"message":"Indstilling for overspringning","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"Aktiver Betatestserver"},"whatEnableTestingServer":{"message":"Dine indsendelser og stemmer TÆLLER IKKE med i hovedserveren. Brug kun dette til testformål."},"testingServerWarning":{"message":"Alle indsendelser og stemmer TÆLLES IKKE med i hovedserveren, når du opretter forbindelse til testserveren. Sørg for at deaktivere dette, når du ønsker at foretage rigtige indsendelser."},"bracketNow":{"message":"(Nu)"},"moreCategories":{"message":"Flere Kategorier"},"chooseACategory":{"message":"Vælg en Kategori"},"enableThisCategoryFirst":{"message":"Hvis du vil indsende segmenter med kategorien \"{0}\", skal du aktivere den i indstillingerne. Du vil blive omdirigeret til indstillingerne nu.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Advarsel: Denne type segment kan have maksimalt en aktiv ad gangen. Indsendelse af flere vil få en tilfældig til at blive vist."},"youMustSelectACategory":{"message":"Du skal vælge en kategori for alle segmenter, du indsender!"},"bracketStart":{"message":"(Start)"},"bracketEnd":{"message":"(Slut)"},"End":{"message":"Slutning","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"skjult: nedstem"},"hiddenDueToDuration":{"message":"skjult: for kort"},"manuallyHidden":{"message":"manuelt skjult"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Kanal-ID er ikke indlæst endnu. Hvis du bruger en integreret video, så prøv i stedet at bruge YouTube-hjemmesiden. Dette kunne også være forårsaget af ændringer i YouTube-layout. Hvis du mener det, så lav en kommentar her:"},"invidiousPermissionRefresh":{"message":"Browseren har ophævet tilladelserne til at fungere på Invidious eller andre tredjepartssider. Klik venligst på knappen nedenfor for at genaktivere denne tilladelse."},"acceptPermission":{"message":"Accepter tilladelse"},"permissionRequestSuccess":{"message":"Tilladelsesandmodning lykkedes!"},"permissionRequestFailed":{"message":"Tilladelsesanmodning mislykkedes, klikkede du på afvis?"},"adblockerIssueWhitelist":{"message":"Hvis du ikke kan løse dette problem, skal du deaktivere indstillingen 'Tving Kanaltjek Inden Springning', da SponsorBlock ikke er i stand til at hente kanaloplysningerne for denne video"},"forceChannelCheck":{"message":"Gennemtving kanaltjek inden overspringning"},"whatForceChannelCheck":{"message":"Som standard vil den springe segmenter over med det samme, før den overhovedet ved, hvad kanalen er. Som standard kan nogle segmenter i starten af videoen blive sprunget over på kanaler på whitelisten. Hvis du aktiverer denne indstilling, forhindrer du dette, men det vil medføre en lille forsinkelse, da det kan tage noget tid at få kanal-ID'et. Denne forsinkelse kan være umærkelig, hvis du har hurtigt internet."},"forceChannelCheckPopup":{"message":"Overvej at aktivere \"Gennemtving kanaltjek inden overspringning\""},"downvoteDescription":{"message":"Ukorrekt/Forkert Timing"},"incorrectVote":{"message":"Forkert"},"harmfulVote":{"message":"Skadelig","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Skift kategori"},"nonMusicCategoryOnMusic":{"message":"Denne video er kategoriseret som musik. Er du sikker på, at denne har en sponsor? Hvis dette faktisk er et \"Ikke-musik segment\", skal du åbne udvidelsesindstillingerne og aktivere denne kategori. Derefter kan du indsende dette segment som \"Ikke-musik\" i stedet for sponsor. Læs venligst retningslinjerne, hvis du er forvirret."},"multipleSegments":{"message":"Adskillige Segmenter"},"guidelines":{"message":"Retningslinjer"},"readTheGuidelines":{"message":"Læs Retningslinjerne!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategorier er her!"},"categoryUpdate2":{"message":"Åbn mulighederne for at springe intros, outros, merch osv. over."},"help":{"message":"Hjælp"},"GotIt":{"message":"Forstået","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Dette segment er stort. Hvis hele videoen handler om et enkelt emne, så skift fra \"Skip\" til \"Fuld video\". Se retningslinjerne for mere information."},"categoryPillTitleText":{"message":"Hele denne video er mærket som denne kategori og er for tæt integreret til at være i stand til at adskille"},"chapterNameTooltipWarning":{"message":"Et af dine kapitelnavne er magen til en kategori. Du bør bruge kategorier, når det er muligt i stedet."},"experiementOptOut":{"message":"Fravælg alle fremtidige eksperimenter","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Skjul for evigt"},"warningChatInfo":{"message":"Vi har lagt mærke til, at du har lavet nogle almindelige fejl. Vi sætter stor pris på dit indsendte arbejde, men vi stræber efter perfektion, så selv meget små fejl har betydning. :)"},"questionButton":{"message":"Jeg har et spørgsmål"},"askAQuestion":{"message":"Stil et spørgsmål"},"warningConfirmButton":{"message":"Jeg forstår årsagen"},"warningError":{"message":"Fejl under anerkendelse af advarsel:"},"deArrowMessageRecieved":{"message":"Du har modtaget et tip fra en moderator"},"Donate":{"message":"Doner"},"considerDonating":{"message":"Hjælp til at finansiere udvikling"},"hideDonationLink":{"message":"Skjul Donationslink"},"darkModeOptionsPage":{"message":"Mørk tilstand på indstillingssiden"},"helpPageThanksForInstalling":{"message":"Tak for at installere SponsorBlock."},"helpPageReviewOptions":{"message":"Gennemgå venligst indstillingerne nedenfor"},"helpPageFeatureDisclaimer":{"message":"Mange funktioner er deaktiveret som standard. Hvis du vil springe intros, outros over, bruge Invidious osv., skal du aktivere dem nedenfor. Du kan også skjule/vise brugergrænsefladeelementer."},"helpPageHowSkippingWorks2":{"message":"Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på nedstem! Du kan også stemme i popup-vinduet."},"Submitting":{"message":"Indsendelse"},"helpPageCopyOfDatabase2":{"message":"Kildekoden er frit tilgængelig. Så selvom der sker noget med mig, går dine indsendelser ikke tabt."},"Credits":{"message":"Anerkendelser"},"LearnMore":{"message":"Læs mere"},"FullDetails":{"message":"Alle detaljer"},"CopyDownvoteButtonInfo":{"message":"Nedstemmer og opretter en lokal kopi som du kan genindsende"},"OpenCategoryWikiPage":{"message":"Åbn denne kategoris wikiside."},"CopyAndDownvote":{"message":"Kopier og nedstem"},"ContinueVoting":{"message":"Fortsæt afstemning"},"ChangeCategoryTooltip":{"message":"Dette vil øjeblikkeligt gælde for dine indsendelser"},"downvote":{"message":"Downvote"},"upvote":{"message":"Upvote"},"hideSegment":{"message":"Skjul segment"},"skipSegment":{"message":"Spring segment over"},"playChapter":{"message":"Afspil kapitel"},"SponsorTimeEditScrollNewFeature":{"message":"Brug musehjulet, mens du holder musen over redigeringsfeltet for hurtigt at justere tiden. Kombinationer af ctrl eller shift-tastenerne kan bruges til at finjustere ændringerne."},"categoryPillNewFeature":{"message":"Ny! Se når en video er helt sponsoreret eller selvpromoverende"},"yearAbbreviation":{"message":"å","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"t","description":"100h"},"optionsTabBehavior":{"message":"Adfærd","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Grænseflade","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Tastaturgenveje","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Sikkerhedskopier/Gendan","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Diverse","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Spring meddelelsesvisning over","description":"Option label"},"unbind":{"message":"Adskil","description":"Unbind keyboard shortcut"},"notSet":{"message":"Ikke indstillet"},"change":{"message":"Skift"},"youtubeKeybindWarning":{"message":"Dette er en indbygget Youtube-genvej. Er du sikker på, at du vil bruge den?"},"betaServerWarning":{"message":"BETA Server er aktiveret!"},"openOptionsPage":{"message":"Åbn indstillinger"},"resetToDefault":{"message":"Nulstil indstillinger til standard"},"confirmResetToDefault":{"message":"Er du sikker på, at du vil nulstille alle indstillinger til deres standardværdier? Dette kan ikke fortrydes."},"exportSegments":{"message":"Eksporter segmenter"},"importSegments":{"message":"Importer segmenter"},"Import":{"message":"Importer","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Indløsning Lykkedes!"},"redeemFailed":{"message":"Licensnøglen er ugyldig"},"hideUpsells":{"message":"Skjul muligheder som ikke er tilgængelige uden ekstra betaling"},"hideNewFeatureUpdates":{"message":"Skjul tips om nye funktioner"},"redeem":{"message":"Indløs"},"enterLicenseKey":{"message":"Indtast Licensnøgle"},"unsubmittedSegmentCounts":{"message":"Du har lige nu {0} på {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Du har i øjeblikket ingen uindsendte segmenter","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"ikke-indsendt segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"ikke-indsendte segmenter","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videoer","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Ryd alle segmenter","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Er du sikker på, at du vil rydde alle dine uindsendte segmenter?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Vis segmenter","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Skjul segmenter","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Segmentantal","description":"Header of the unsubmitted segments list"},"actions":{"message":"Handlinger","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Del som URL"},"segmentFetchFailureWarning":{"message":"Advarsel: Serveren har endnu ikke svaret med segmenter. Der kan faktisk være segmenter på denne video, der allerede er indsendt, men som du bare ikke har modtaget på grund af problemer med serveren."},"allowScrollingToEdit":{"message":"Tillad rulning for at redigere tider"},"NoticeTimeAfterSkip":{"message":"{seconds} s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Bedre titler og thumbnails på YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Bruger crowdsourcing til at gøre titler og thumbnails beskrivende og ikke sensationelle","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Vælg det mest beskrivende"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Oprindelig titel"},"CurrentTime":{"message":"Aktuel tid"},"resetCustomTitle":{"message":"Nulstil titel tilbage til oprindelig tekst"},"resetIcon":{"message":"Nulstil ikon"},"TypeYourOwnTitleHere":{"message":"Skriv din egen titel her"},"VideoNotReady":{"message":"Video er ikke klar"},"FailedToRender":{"message":"Kunne ikke indlæse","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Lærred mangler","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Undtagelse under indlæsning","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Kunne ikke indlæse","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Titelformat"},"Disabled":{"message":"Deaktiveret"},"CapitalizeWords":{"message":"Skriv ord med store begyndelsesbogstaver"},"TitleCase":{"message":"Store forbogstaver"},"SentenceCase":{"message":"Første bogstav i sætning med stort"},"LowerCase":{"message":"Små bogstaver"},"FirstLetterUppercase":{"message":"Første bogstav med stort"},"shouldCleanEmojis":{"message":"Fjern emojis"},"onlyFormatCustomTitles":{"message":"Formatér kun brugerindsendte titler"},"onlyTitleCaseInEnglish":{"message":"Kapitalisér ord for ikke-engelske titler"},"onlyTitleCaseInEnglishDescription":{"message":"Sprogdetektering er ikke perfekt og registrerer nogle engelske titler som ikke-engelske."},"thumbnailFallbackOption":{"message":"Når ingen indsendte miniaturer findes"},"whatThumbnailFallbackOption":{"message":"Når du vælger et tilfældigt tidspunkt, bruges der SponsorBlock-data for at sikre, at der ikke vælges et tidspunkt i et salgsfremmende segment.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Vis et skærmbillede fra et tilfældigt tidspunkt"},"TheOriginalThumbnail":{"message":"Vis det oprindelige thumbnail"},"showABlankBox":{"message":"Vis et tomt felt"},"AutoGenerated":{"message":"Vis et thumbnail auto-genereret af YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Begyndelse"},"Middle":{"message":"Midte"},"keepUnsubmitted":{"message":"Gem indsendte stemmer"},"showLiveCover":{"message":"Vis kanalavatar på kommende videoer","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Brug aldrig A/B-testede thumbnails"},"ignoreAbThumbnailsDescription":{"message":"Kanaler kan konfigurere tests på deres videoer, hvor YouTube vil vise forskellige thumbnails til hver person. Denne indstilling vil altid bruge den første thumbnail for at være konsekvent."},"abThumbnailsWarning":{"message":"Advarsel: Denne video har i øjeblikket en A/B thumbnail-test kørende. Det betyder, at thumbnailet kan ændre sig ofte. Du burde sandsynligvis ikke stemme for det oprindelige thumbnail på grund af denne risiko."},"whatKeepUnsubmitted":{"message":"Behold indsendte stemmer efter afstemningen for at vise de titler og thumbnails, du valgte, i stedet for den mest populære på serveren."},"keepUnsubmittedInPrivate":{"message":"Gem indsendte stemmer fra private faner"},"useThumbnailGenerationService":{"message":"Brug thumbnailgenereringstjeneste"},"titleMaxLines":{"message":"Maksimum linjer for titel"},"titleMaxLinesDescription":{"message":"Videotitler vil blive spredt ud over så mange linjer i forslag."},"thumbnailSaturationLevel":{"message":"Mætningsniveau for miniature"},"whatSaturateThumbnails":{"message":"Gør miniaturer mindre levende ved at reducere deres farve"},"hideDetailsWhileFetching":{"message":"Skjul detaljer under hentning"},"hideDetailsWhileFetchingDescription":{"message":"Skjul titler og miniaturer mens data hentes fra serveren. Hvis dette er slået fra, vil du opleve flimmer mens titler og miniaturer skifter."},"ignoreTranslatedTitles":{"message":"Vis ikke YouTubes oversatte titler","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube oversætter nogle gange titler automatisk til dit modersmål. Denne indstilling gælder kun, når en crowdsourcet titel ikke er tilgængelig."},"onAllPages":{"message":"På alle sider","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"På alle sider undtagen video-sider","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Aldrig"},"thumbnailGeneratorDescription1":{"message":"Thumbnailgenereringstjenesten fremskynder dannelsen af thumbnails væsentligt ved at sende en anonym anmodning med video-Id'et til en ekstern server. Thumbnailet vil derefter enten blive genereret eller trukket fra et mellemlager, hvis det allerede er blevet genereret."},"thumbnailGeneratorDescription2":{"message":"Hvis det bruges på videosider, kan dette potentielt lække video-Id'er til den pågældende server. Indstilling af dette til \"På alle sider undtagen videosider\" vil undgå dette problem. En anden mulighed er at være vært for din egen thumbnailgenereringstjeneste."},"thumbnailGeneratorDescription3":{"message":"Hvis brugen af thumbnailgenereringstjenesten er deaktiveret, vil alle anmodninger bruge et k-anonymitets forespørgselssystem, hvilket gør det sværere for serveren at forudsige hvilke videoer, der blev hentet, og en langsommere lokal thumbnailgenereringstjeneste vil blive brugt.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Thumbnailgenereringstjeneste kildekode"},"moreAboutKAnonymity":{"message":"Mere om K-anonymitet","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Vis altid \"Vis original\"-knappen"},"whatAlwaysShowShowOriginalButton":{"message":"Aktivér dette, hvis du altid vil vide om en titel eller et thumbnail er ændret."},"showOriginalOnHover":{"message":"Skift mellem brugerdefinerede detaljer og originale detaljer når musen holdes over"},"showOriginalOnHoverOfVideo":{"message":"Skift mellem brugerdefinerede og originale oplysninger, når du holder musen over et sted på videokortet"},"showOriginalOnHoverOfVideoDescription":{"message":"Dette deaktiverer automatisk afspilning ved mouseover"},"showCustomOnHoverIfCasual":{"message":"Vis brugerdefineret titel når musen holdes over en titel i afslappet tilstand"},"showIconForFormattedTitles":{"message":"Vis \"Vis original\"-knap for automatisk formateret titler"},"Enable":{"message":"Aktivér"},"Titles":{"message":"Titler","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniaturebilleder","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Afslappede stemmer","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Fejl"},"ShowOriginal":{"message":"Vis oprindelige detaljer"},"ShowModified":{"message":"Vis ændrede detaljer"},"ShowFormatted":{"message":"Vis formaterede detaljer"},"FillerWarning":{"message":"Advarsel: Dette er en utrolig aggressiv kategori. Du skal muligvis ofte annullere overspringning eller deaktivere den. Bemærk, at mange videoer har over 50% eller mere af dem sprunget over! Husk dog, at der stadig er specifikke retningslinjer, du skal følge, når du indsender.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Deltag på Discord eller Matrix for at blive i denne chat permanent","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Vis hjælp til retningslinjer","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Undgå overdrevne ansigtsudtryk","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Tænk stort – besvar ikke bare spørgsmålet i den oprindelige titel","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Undgå at beskrive reaktioner på videoen (\"chokerende\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Giv nok information til at træffe et informeret valg, før du klikker"},"tip5":{"message":"Brug stort begyndelsesbogstav som i en sætning","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Tjek alle retningslinjerne for at indsende","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Min titel bruger stort begyndelsesbogstav som i en sætning","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Min titel besvarer ikke blot et spørgsmål stillet i titlen","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Titler bør beskrive videoen eller historien generelt. Sørg for at se hele videoen for at forstå, hvad den faktisk handler om, i stedet for kun at stole på en spændende original titel.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Min titel opsummerer ikke en konklusion eller afslører noget unødvendigt","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Titler skal ikke erstatte det at se videoen, men hjælpe dig med at beslutte, om du skal klikke.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Min titel faktatjekker, håner eller kritiserer ikke videoen eller skaberen","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Titler skal afspejle skaberens og videoens perspektiv. Bedømmelse eller faktatjek af selve videoen ligger uden for DeArrows omfang. Titler er ikke en kommentarsektion.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Registreret ord: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Brug ikke unødvendige verber (udsagnsord) i starten af titlen","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Start alle titler med et stort bogstav. Titler skal formateres som en sætning.","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Titler bør ikke slutte med et '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Tilføj ikke bare et svar på et spørgsmål i den originale titel. Titler bør beskrive videoen eller historien generelt.","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Titler bør ikke faktatjekke, håne eller kritisere videoen eller skaberen","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Titler bør ikke beholde sensationelle elementer fra den originale titel","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Titler bør ikke indeholde emojis","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Du skal løse advarslen, før du indsender"},"dearrowHelpSponsorBlockImported":{"message":"Bemærk: Dine SponsorBlock-indstillinger er automatisk blevet importeret!"},"howItWorks":{"message":"Hvordan det virker"},"discordPromotion":{"message":"Kom og bidrag, giv nogle forslag og hjælp til på {discord} eller {matrix}"},"deArrowDonationText":{"message":"Her er et link, hvis du kan lide det, jeg har lavet indtil videre, og vil støtte mig økonomisk"},"termsAgreement":{"message":"Ved at bruge denne udvidelse accepterer du {privacy-policy} og {terms}"},"privacyPolicy":{"message":"Privatlivspolitik"},"termsOfUse":{"message":"Brugsvilkår"},"openSourceLicenses":{"message":"Open source-licenser"},"defaultToOriginals":{"message":"Vis original videoinformation som standard"},"whatDefaultToOriginals":{"message":"Vis den originale titel og miniature som standard, men vis en knap ved mouseover, så man kan se de brugerdefinerede titler og miniaturebilleder."},"replaceTitles":{"message":"Erstat titler"},"replaceThumbnails":{"message":"Erstat miniaturebilleder"},"useCrowdsourcedTitles":{"message":"Brug crowdsourcede titler"},"whatUseCrowdsourcedTitles":{"message":"Hvis deaktiveret, formaterer den titler, men bruger ikke titler indsendt af fællesskabet","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Er du sikker på, at du vil slette denne konfiguration?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Ny konfiguration"},"DeleteConfiguration":{"message":"Slet konfiguration"},"ChannelAllowlist":{"message":"Kanalspecifikke indstillinger"},"ConfigurationName":{"message":"Konfigurationsnavn"},"ChannelListInstructions":{"message":"Indtast de kanaler, du vil anvende denne konfiguration på, i feltet nedenfor, adskilt med linjeskift. Både kanal-ID'er og visningsnavne understøttes. @-brugernavne understøttes ikke. Du kan finde kanalens ID ved at klikke på Del-knappen på kanalens \"Om\"-side. For at komme til \"Om\"-siden skal du klikke på kanalbeskrivelsen under kanalnavnet på kanalens forside.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Ingen konfigurationer er sat op endnu. Klik på knappen øverst for at tilføje en ny konfiguration.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Stop clickbait ved at erstatte titler og miniaturebilleder med mere præcise versioner."},"DeArrowPromotionMessage2":{"message":"Træt af clickbait? Tjek min nye udvidelse til forbedring af titler og miniaturebilleder"},"DeArrowPromotionMessage3":{"message":"Tjek også DeArrow ud","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Kan du ikke lide denne titel? Hvis du foretrækker titlen nedenfor, så overvej at tjekke funktionen til titelerstatning i DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Dette miniaturebillede er valgt ud fra et tilfældigt tidsstempel, da der endnu ikke er en indsendelse på denne video","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Dette miniaturebillede er valgt ud fra et tilfældigt tidsstempel, og titlen er automatisk formateret, da der endnu ikke er en indsendelse på denne video","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Du kan ændre denne standard nedenfor","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} titler og {thumbnails} miniaturebilleder er blevet erstattet, siden du installerede denne udvidelse","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} titel ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} titler ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"og {thumbnails} miniaturebilleder","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"og {thumbnails} miniaturebillede","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} er blevet erstattet, siden du installerede denne udvidelse","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Tæl titel- og miniature-erstatninger"},"countReplacementsDescription":{"message":"Bruges til at give statistik i pop op-vinduet.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Tilføj en filterliste for at blokere undersøgelser, merch-hylder og andre salgsfremmende sideelementer ved hjælp af yt-neuter"},"requiresUblock":{"message":"Kræver uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Noget gik galt under registreringen af video-ID. Prøv at genindlæse siden, før du indsender, for at sikre, at det indsendes for den rigtige video. Hvis dette sker ofte, bedes du sende en rapport sammen med de andre udvidelser eller userscripts, du har installeret, via GitHub, Discord eller Matrix."},"dearrowLogoCredit":{"message":"Logo baseret på Twemoji licenseret under CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock er ikke kompatibel med udvidelsen \"Zoom to Fill\". Der er mange alternativer, du kan bruge i stedet, som vil fungere."},"freeTrialStarted":{"message":"Din gratis prøveperiode er startet. Besøg YouTube for at teste det"},"freeTrialEnded":{"message":"Din gratis prøveperiode er slut"},"freeTrialPrompt":{"message":"Hvis du vil afprøve det, kan du starte en gratis prøveperiode med knappen nedenfor."},"startFreeTrial":{"message":"Start gratis prøveperiode"},"freeAccessRequested":{"message":"Du er nu registreret til gratis adgang. Du får besked, når adgang er givet."},"freeAccessComplete":{"message":"Tillykke! Du har nu gratis adgang til DeArrow"},"DeArrowNotActivated":{"message":"DeArrow er ikke aktiveret"},"ActivateDeArrow":{"message":"Aktiver DeArrow"},"DeArrowIsActivated":{"message":"DeArrow er blevet aktiveret"},"Close":{"message":"Luk"},"ViewLicenseKey":{"message":"Se licensnøgle"},"SharingIsCaring":{"message":"Deling er omsorg"},"cleanPopup":{"message":"Skjul rod i segmentlistens pop-op"},"syncDisabledWarning":{"message":"Advarsel: Udvidelseslagring er deaktiveret i din browser. Indstillingerne gemmes ikke, hvis du forsøger at gemme dem."},"syncDisabledWarningDeArrow":{"message":"DeArrow vil ikke fungere uden lager."},"syncDisabledFirefoxSuggestions":{"message":"Du kan aktivere det ved at gå til about:config og sætte værdien \"webextensions.storage.sync.enabled\" til true."},"storageFull":{"message":"Udvidelseslageret er fuldt. Slet venligst nogle ikke-indsendte segmenter i indstillingerne."},"previewSegmentRequired":{"message":"Gennemse venligst dine segmenter, før du indsender dem. Du kan gøre dette ved at klikke på forhåndsvisningsknappen eller bruge følgende genvej:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Stem som VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Indsendelser kan ikke accepteres fra din browser i øjeblikket, da det ser ud til, at YouTube har indsat nogle serverside-reklamer, som udvidelsen ikke kan fjerne. Kontakt venligst, hvis du modtager denne fejl."},"DeArrowIsDisabled":{"message":"DeArrow er slået fra - klik for at slå til","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Er du sikker på, at denne oprindelige miniature følger DeArrow-retningslinjerne? Hvis du bare foretrækker at se originale miniaturer i almindelighed, så overvej at ændre indstillingen \"Når ingen indsendte miniaturer findes\" i DeArrow-indstillingerne.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"På YouTube TV er SponsorBlock ikke kompatibel med live og nyligt optagede indhold. Hvis dette er en nylig optagelse, skal du vente et par timer, indtil den behandlede version bliver tilgængelig.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Hvidlistning af kanaler understøttes ikke på tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Kan du lide originaltitlen?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Ja"},"No":{"message":"Nej"},"votes":{"message":"{0} stemmer","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} stemme","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Sjov","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Kreativ","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Snedig","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Beskrivende","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Andet","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Klassisk tilstand","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Titler erstattes med standardiserede formater baseret på retningslinjerne for alle de videoer, som har en crowdsourcet titel."},"CasualMode":{"message":"Afslappet tilstand","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Behold de originale titler, når de beskriver videoen godt nok og er snedige eller sjove. Vælg, hvilke kategorier af titler du vil se. Du vil kunne stemme på, om en titel passer ind i en kategori eller ej."},"minimumVotes":{"message":"Minimum antal stemmer","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Vis originalt miniaturebillede på videoer stemt på i afslappet tilstand","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Ny funktion: Afslappet tilstand","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Vis kun ikonet for afslappet tilstand, når en brugerdefineret titel er tilgængelig"},"OpenSettings":{"message":"Åbn indstillinger"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/de/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/de/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Zeitüberschreibung. Überprüfe deine Internetverbindung. Bist du mit dem Internet verbunden, ist der Server wahrscheinlich offline."},"400":{"message":"Der Server meldet, dass diese Anfrage ungültig war."},"409":{"message":"Dieser Inhalt wurde bereits eingereicht."},"502":{"message":"Der Server ist wahrscheinlich überlastet. Probiere es später nochmal."},"fullName":{"message":"SponsorBlock für YouTube – Überspringe gesponserte Videosegmente","description":"Name of the extension."},"Description":{"message":"Überspringe gesponserte Inhalte, Aufforderungen zum Interagieren und mehr in YouTube-Videos. Markiere Sponsoren in Videos, um anderen die Zeit zu ersparen.","description":"Description of the extension."},"channelWhitelisted":{"message":"Der Kanal wurde auf die Whitelist gesetzt!"},"Segment":{"message":"Segment"},"Segments":{"message":"Segmente"},"SegmentsCap":{"message":"Segmente"},"Chapters":{"message":"Kapitel"},"renderAsChapters":{"message":"Zeige Segmente als Kapitel","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Aktuelles Segment neben der Videozeit anzeigen"},"showAutogeneratedChapters":{"message":"Von YouTube automatisch generierte Kapitel anzeigen"},"upvoteButtonInfo":{"message":"Diese Einreichung positiv bewerten"},"reportButtonTitle":{"message":"Melden"},"reportButtonInfo":{"message":"Beitrag als fehlerhaft melden."},"Dismiss":{"message":"Abbrechen"},"Loading":{"message":"Lädt..."},"Hide":{"message":"Verstecken"},"hitGoBack":{"message":"Klicke auf „Nicht überspringen“, um die Aktion rückgängig zu machen."},"unskip":{"message":"Nicht überspringen"},"reskip":{"message":"Nochmal überspringen"},"unmute":{"message":"Ton an"},"paused":{"message":"Pausiert"},"manualPaused":{"message":"Timer angehalten"},"confirmMSG":{"message":"Um einzelne Werte zu löschen oder zu ändern, klicke auf den Info-Knopf oder öffne die Erweiterungsübersicht, indem du das Erweiterungssymbol in der Ecke oben rechts anklickst."},"clearThis":{"message":"Bist du sicher, dass du Folgendes löschen möchtest?\n\n"},"Unknown":{"message":"Dein Beitrag konnte nicht übertragen werden, bitte versuche es später erneut."},"sponsorFound":{"message":"Dieses Video hat Segmente in der Datenbank!"},"sponsor404":{"message":"Keine Segmente gefunden"},"sponsorStart":{"message":"Segment startet jetzt"},"sponsorEnd":{"message":"Segment endet jetzt"},"sponsorCancel":{"message":"Segmenterstellung abbrechen"},"noVideoID":{"message":"Kein YouTube-Video gefunden.\nWenn dies falsch ist, aktualisiere den Tab."},"refreshSegments":{"message":"Segmente aktualisieren"},"success":{"message":"Erfolg!"},"voted":{"message":"Abgestimmt!"},"serverDown":{"message":"Der Server ist anscheinend offline. Bitte kontaktiere den Entwickler unverzüglich."},"connectionError":{"message":"Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "},"segmentsStillLoading":{"message":"Segmente werden noch geladen..."},"clearTimes":{"message":"Alle Segmente löschen"},"openPopup":{"message":"SponsorBlock-Pop-up öffnen"},"closePopup":{"message":"Pop-up schließen"},"closeIcon":{"message":"Schließen-Symbol"},"OpenSubmissionMenu":{"message":"Einreichungsmenü öffnen"},"OpenCasualVoteMenu":{"message":"Öffne Menü des Gelegenheitsmodus"},"sortSegments":{"message":"Segmente sortieren"},"submitCheck":{"message":"Bist du sicher, dass du dies übermitteln willst?"},"whitelistChannel":{"message":"Kanal zur Ausnahmeliste hinzufügen"},"removeFromWhitelist":{"message":"Kanal von der Whitelist entfernen"},"voteOnTime":{"message":"Über ein Segment abstimmen"},"Submissions":{"message":"Beiträge"},"savedPeopleFrom":{"message":"Andere Nutzer bewahrt vor: "},"viewLeaderboard":{"message":"Rangliste"},"recordTimesDescription":{"message":"Senden"},"submissionEditHint":{"message":"Die Bearbeitung von Beiträgen wird angezeigt, nachdem du auf Senden klickst","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Tipp: Du kannst Tastenkombinationen in den Optionen festlegen"},"clearTimesButton":{"message":"Zeiten löschen"},"Username":{"message":"Benutzername"},"setUsername":{"message":"Benutzernamen festlegen"},"copyPublicID":{"message":"Öffentliche Benutzer-ID kopieren"},"copySegmentID":{"message":"Segment-ID kopieren"},"loopChapter":{"message":"Kapitel wiederholen"},"unloopChapter":{"message":"Kapitel nicht mehr wiederholen"},"hideThis":{"message":"Verstecken"},"Options":{"message":"Optionen"},"showButtons":{"message":"Knöpfe im YouTube-Videoplayer anzeigen"},"hideButtonsDescription":{"message":"Versteckt die Schaltflächen im YouTube-Videoplayer, um Segmente einzusenden."},"showSkipButton":{"message":"„Zum Highlight springen“-Knopf im Wiedergabefenster behalten"},"showInfoButton":{"message":"Info-Knopf im YouTube-Wiedergabefenster anzeigen"},"autoHideInfoButton":{"message":"Info-Knopf automatisch ausblenden"},"showDeleteButton":{"message":"Löschen-Knopf im YouTube-Wiedergabefenster anzeigen"},"enableViewTracking":{"message":"Aktiviere das Zählen übersprungener Segmente"},"whatViewTracking":{"message":"Diese Funktion erfasst, welche Segmente du übersprungen hast, um anderen Nutzer zu zeigen, wie hilfreich ihre Beiträge sind. Außerdem stellt dies zusammen mit positiven Bewertungen sicher, dass keine unerwünschten Inhalte in die Datenbank gelangen. Die Erweiterung sendet jedes Mal, wenn du ein Segment überspringst, eine Meldung an den Server. Hoffentlich verändern die meisten Nutzer diese Einstellung nicht, um unsere Statistik zu verbessern :)"},"enableViewTrackingInPrivate":{"message":"Aktiviere Zählen übersprungener Segmente in Inkognito-Fenstern"},"enableTrackDownvotes":{"message":"Speichere Downvotes von Segmenten"},"whatTrackDownvotes":{"message":"Alle Segmente, die du negativ bewertest, bleiben auch nach dem Aktualisieren der Seite verborgen"},"trackDownvotesWarning":{"message":"Warnung: Das Deaktivieren wird alle zuvor gespeicherten negativen Bewertungen löschen"},"enableTrackDownvotesInPrivate":{"message":"Speichere negative Bewertungen von Segmenten in privaten/Inkognito-Tabs"},"enableQueryByHashPrefix":{"message":"Abfrage nach Hash-Präfix"},"whatQueryByHashPrefix":{"message":"Anstatt Segmente mit der Video-ID vom Server anzufordern, werden die ersten 4 Zeichen des Hashs der Video-ID gesendet. Der Server sendet Daten für alle Videos mit ähnlichen Hashes zurück."},"enableShowCategoryWithoutPermission":{"message":"Zeige Kategorien im Einreichungsmenü auch ohne Einreichungsberechtigungen"},"whatShowCategoryWithoutPermission":{"message":"Einige Kategorien erfordern eine Freigabe zur Einreichung aufgrund von Mindestanforderungen an die Reputation"},"showNotice":{"message":"Hinweis erneut anzeigen"},"showSkipNotice":{"message":"Zeige Hinweis nach dem Überspringen eines Segments"},"showUpcomingNotice":{"message":"Zeige Hinweis, bevor ein Segment beginnt"},"showCategoryGuidelines":{"message":"Kategorienhilfe anzeigen"},"noticeVisibilityMode0":{"message":"Überspringen-Meldung in voller Größe"},"noticeVisibilityMode1":{"message":"Kleine Skip-Meldung für Auto-Skips"},"noticeVisibilityMode2":{"message":"Alle kleinen Skip-Meldungen"},"noticeVisibilityMode3":{"message":"Verblasste Skip-Meldung für Auto-Skip"},"noticeVisibilityMode4":{"message":"Alle verblassten Skip-Meldungen"},"longDescription":{"message":"SponsorBlock lässt dich gesponserte Videosegmente, Intros, Outros, Interaktions-Erinnerungen, Musikvideoteile ohne Musik und andere nervige Teile von YouTube-Videos überspringen. SponsorBlock ist eine crowdsourced Browser-Erweiterung, in der jeder die Start- und Endzeit gesponserter Videosegmente und anderer Segmente von YouTube-Videos einreicht. Sobald eine Person diese Informationen einreicht, überspringen alle anderen mit dieser Erweiterung das gesponserte Segment.","description":"Full description of the extension on the store pages."},"website":{"message":"Webseite","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Quellcode","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Die Benachrichtigung wurde verbessert!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Falls es dir trotzdem nicht gefällt, drücke auf \"Verstecken\".","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Segment überspringen","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Starte/Stoppe Segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Einreichungsmenü öffnen","description":"Keybind label"},"setSubmitKeybind":{"message":"Segmente einreichen","description":"Keybind label"},"setPreviewKeybind":{"message":"Segmentvorschau","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Überspringen-Hinweis schließen","description":"Keybind label"},"setDownvoteKeybind":{"message":"Segment negativ bewerten","description":"Keybind label"},"setUpvoteKeybind":{"message":"Segment positiv bewerten","description":"Keybind label"},"nextChapterKeybind":{"message":"Nächstes Kapitel","description":"Keybind label"},"previousChapterKeybind":{"message":"Vorheriges Kapitel","description":"Keybind label"},"enableDeArrowKey":{"message":"DeArrow ein-/ausschalten","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Einreichungsmenü öffnen","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Wähle eine Taste durch Eingeben aus, und wähle (optional) gewünschte Hilfstasten."},"disableSkipping":{"message":"Überspringen ist aktiviert"},"enableSkipping":{"message":"Überspringen ist deaktiviert"},"yourWork":{"message":"Dein Werk","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Fehlermeldung: "},"skip":{"message":"Überspringen"},"mute":{"message":"Ton aus"},"full":{"message":"Vollständiges Video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} überspringen?"},"mute_category":{"message":"{0} stummschalten?"},"skip_to_category":{"message":"Zu {0} springen?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Bevorstehend: {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} übersprungen","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} stummgeschaltet","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Zu {0} gesprungen","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Über {0} abgestimmt","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Automatisches Überspringen deaktivieren"},"enableAutoSkip":{"message":"Automatisches Überspringen aktivieren"},"audioNotification":{"message":"Audio-Benachrichtigung beim Überspringen"},"audioNotificationDescription":{"message":"Es wird ein Ton abgespielt, wenn ein Segment übersprungen wird. Wenn deaktiviert (oder wenn automatisches Überspringen deaktiviert ist), wird kein Ton abgespielt."},"showTimeWithSkips":{"message":"Videodauer nach Abzug der überspringbaren Videosegmente anzeigen"},"showTimeWithSkipsDescription":{"message":"Diese Zeit wird in Klammern neben der kompletten Videodauer im YouTube-Videoplayer angezeigt. Dies betrifft auch Segmente, die als \"In Suchleiste anzeigen\" markiert sind."},"youHaveSkipped":{"message":"Du übersprangst "},"minLower":{"message":"Minute"},"minsLower":{"message":"Minuten"},"hourLower":{"message":"Stunde"},"hoursLower":{"message":"Stunden"},"youHaveSavedTime":{"message":"Du erspartest anderen","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" ihres Lebens","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Prüfe status.sponsor.ajay.app für den Serverstatus."},"changeUserID":{"message":"Private Benutzer-ID importieren/exportieren"},"whatChangeUserID":{"message":"Dies sollte geheim gehalten werden. Es ist wie ein Passwort und sollte mit niemandem geteilt werden. Jemand kann sich damit als dich ausgeben. Wenn du nach deiner öffentlichen Nutzer-ID suchst, klicke auf das Kopieren-Symbol im Popup."},"setUserID":{"message":"Private Benutzer-ID festlegen"},"userIDChangeWarning":{"message":"Warnung: Das Ändern deiner privaten Benutzer-ID ist permanent. Bist du dir sicher, dass du das tun möchtest? Zur Sicherheit solltest du vorher ein Backup deiner alten ID erstellen."},"createdBy":{"message":"Erstellt von"},"supportOtherSites":{"message":"Unterstütze Drittanbieter-YouTube-Seiten"},"supportOtherSitesDescription":{"message":"Unterstütze YouTube-Clients von Drittanbietern. Um die Unterstützung zu aktivieren, musst du die zusätzlichen Berechtigungen akzeptieren.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Unterstützte Seiten: "},"optionsInfo":{"message":"Zu überspringende Kategorien auswählen, automatisches Überspringen, Tasten ein- & ausblenden und noch viel mehr."},"addInvidiousInstance":{"message":"Client-Instanz eines Drittanbieters hinzufügen"},"addInvidiousInstanceDescription":{"message":"Füge eine benutzerdefinierte Invidious-Instanz hinzu. Diese darf nur den Domain-Teil beinhalten. Beispiel: \"invidious.ajay.app\""},"add":{"message":"Hinzufügen"},"addInvidiousInstanceError":{"message":"Dies ist eine ungültige Domain. Dies sollte NUR den Domain-Teil beinhalten. Beispiel: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Invidious-Instanzliste zurücksetzen"},"resetInvidiousInstanceAlert":{"message":"Du bist dabei, die Liste der Invidious-Instanzen zurückzusetzen"},"invidiousDisabledSafari":{"message":"Die Unterstützung von Invidious ist aufgrund eines Fehlers in Safari derzeit nicht verfügbar. Sobald Apple den Fehler behebt, wird es wieder hinzugefügt."},"currentInstances":{"message":"Aktuelle Instanzen:"},"minDuration":{"message":"Minimale Dauer (Sekunden):"},"minDurationDescription":{"message":"Videosegmente, die kürzer als der festgelegte Wert sind, werden nicht übersprungen oder im Player angezeigt."},"enableManualSkipOnFullVideo":{"message":"Verwende manuelles Überspringen, wenn ein „Vollständiges Video“-Label existiert"},"whatManualSkipOnFullVideo":{"message":"Für Personen, die das Video ohne Unterbrechungen schauen wollen, wenn es vollständig gesponsert oder Eigenwerbung ist."},"skipNoticeDuration":{"message":"Dauer des Überspringen-Hinweises (Sekunden):"},"skipNoticeDurationDescription":{"message":"Die überspringen Benachrichtigung wird mindestens für so viele Sekunden angezeigt. Für manuelles Überspringen kann sie länger sichtbar sein."},"shortCheck":{"message":"Die folgende Einsendung ist kürzer als deine Mindestdauer. Das könnte bedeuten, dass dieses Videosegment bereits eingereicht wurde und aufgrund dieser Option einfach ignoriert wird. Bist du dir sicher, dass du es übermitteln möchtest?"},"liveOrPremiere":{"message":"Das Einreichen während eines aktiven Livestreams oder einer Premiere ist nicht erlaubt. Bitte warte, bis es zu Ende ist, lade die Seite neu und überprüfe, dass die Segmente noch immer korrekt sind."},"showUploadButton":{"message":"Upload-Knopf anzeigen"},"customServerAddress":{"message":"SponsorBlock-Serveradresse"},"customServerAddressDescription":{"message":"Die Adresse, die SponsorBlock verwendet, um Anfragen an den Server zu senden. Solange du keine eigene Serverinstanz hast, sollte das nicht geändert werden."},"dataFetchingServerAddress":{"message":"Server-Adresse für Datenabfrage"},"dataFetchingServerAddressDescription":{"message":"Die Adresse, welche für Anfragen an den Abrufserver verwendet wird.\nDiese sollte nicht geändert werden, außer du hast deine eigene Serverinstanz."},"thumbnailCacheServerAddress":{"message":"Thumbnail-Cache-Server-Adresse"},"save":{"message":"Speichern"},"reset":{"message":"Zurücksetzen"},"customAddressError":{"message":"Die Adresse sieht nicht richtig aus. Bitte vergewisser dich, dass entweder \"http://\" oder \"https://\" am Anfang steht und keinen abschließenden Schrägstrich am Ende."},"areYouSureReset":{"message":"Bist du dir sicher, dass du das zurücksetzen möchtest?"},"mobileUpdateInfo":{"message":"https://m.youtube.com wird jetzt unterstützt"},"exportOptions":{"message":"Alle Einstellungen importieren/exportieren"},"exportOtherData":{"message":"Importiere/Exportiere Alle anderen Daten"},"exportOptionsCopy":{"message":"Bearbeiten / kopieren"},"exportOptionsDownload":{"message":"Als Datei speichern"},"exportOptionsUpload":{"message":"Aus Datei laden"},"whatExportOptions":{"message":"Dies ist deine gesamte Konfiguration in JSON. Sie enthält deine private Benutzer-ID, stelle also sicher, sie nicht mit jedem zu teilen."},"setOptions":{"message":"Optionen ändern"},"exportOptionsWarning":{"message":"Warnung: Das Ändern der Optionen ist permanent und kann deine Installation beschädigen. Bist du dir sicher, dass du das tun willst? Stelle sicher, dass du eine Sicherheitskopie deiner alten Optionen machst."},"incorrectlyFormattedOptions":{"message":"Dieses JSON ist nicht korrekt formatiert und kann daher nicht geladen werden. Es wurden keine Einstellungen geändert."},"confirmNoticeTitle":{"message":"Segment übermitteln"},"submit":{"message":"Senden"},"cancel":{"message":"Abbrechen"},"delete":{"message":"Löschen"},"preview":{"message":"Vorschau"},"unsubmitted":{"message":"Nicht eingereicht"},"inspect":{"message":"Überprüfen"},"edit":{"message":"Bearbeiten"},"copyDebugLogs":{"message":"Debug-Logs kopieren"},"copyDebugInformation":{"message":"Debug-Informationen in Zwischenablage kopieren"},"copyDebugInformationFailed":{"message":"Fehler beim Kopieren in die Zwischenablage"},"copyDebugInformationOptions":{"message":"Kopiert Informationen in die Zwischenablage, welche einem Entwickler gegebenenfalls (z. B. um einen Fehler zu melden) zur Verfügung gestellt werden können. Personenbezogene Daten wie die Benutzer-ID, Kanäle auf der Ausnahmeliste und die benutzerdefinierte Serveradresse wurden entfernt. Die Debug-Informationen enthalten jedoch unter anderem den Useragent, Browser, das Betriebssystem und die Versionsnummer der Erweiterung. "},"copyDebugInformationComplete":{"message":"Die Debug-Informationen wurden in die Zwischenablage kopiert. Du kannst alle Informationen entfernen, die du nicht teilen möchtest. Speichere diese in einer Textdatei, oder füge sie einem Fehlerbericht hinzu."},"keyAlreadyUsed":{"message":"Diese Verknüpfung ist an eine andere Aktion gebunden. Bitte wähle eine andere."},"to":{"message":"bis","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Kopiert!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Fließende Übergänge einbeziehen"},"generic_guideline2":{"message":"Spielt, als ob nichts übersprungen worden wäre"},"category_sponsor":{"message":"Gesponserte Videosegmente"},"category_sponsor_description":{"message":"Bezahlte Werbung, bezahlte Empfehlungen und direkte Werbung, nicht für Eigenwerbung, kostenlose Fremdwerbung oder Empfehlungen für Anlässe/Personen/Webseiten/Produkte."},"category_sponsor_guideline1":{"message":"Bezahlte Werbung"},"category_sponsor_guideline2":{"message":"Nicht für Spenden oder eigene Fanartikel"},"category_selfpromo":{"message":"Unbezahlt/​Eigenwerbung"},"category_selfpromo_description":{"message":"Ähnlich wie \"Gesponsorte Videosegmente\", jedoch für unbezahlte oder Eigenwerbung. Dies beinhaltet Bereiche über Merchandise, Spenden oder Informationen darüber, mit wem zusammengearbeitet wurde."},"category_selfpromo_guideline1":{"message":"Spenden, Mitgliedschaften und eigene Fanartikel"},"category_selfpromo_guideline2":{"message":"Unbezahlte Erwähnungen, die nicht zum Video beitragen"},"category_selfpromo_guideline3":{"message":"Nicht für Produkte und Merch von Firmen"},"category_exclusive_access":{"message":"Exklusiver Zugriff"},"category_exclusive_access_description":{"message":"Nur für das Kennzeichnen ganzer Videos. Wird verwendet, wenn ein Video ein Produkt, eine Dienstleistung oder einen Ort präsentiert, zu welchem sie freien oder subventionierten Zugriff erhalten haben."},"category_exclusive_access_pill":{"message":"Dieses Video präsentiert ein Produkt, eine Dienstleistung oder einen Ort, zu welchem sie freien oder subventionierten Zugriff erhalten haben","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Das gesamte Video zeigt etwas mit kostenlosem oder subventioniertem Zugang"},"category_interaction":{"message":"Interaktions-Erinnerungen (Abonnieren, etc.)"},"category_interaction_description":{"message":"Wenn es eine kurze Erinnerung zum Daumen-hoch-Geben, Abonnieren, oder Folgen in der Mitte des Inhalts gibt. Wenn es lang ist oder um etwas Bestimmtes geht, sollte es stattdessen unter \"Unbezahlt/Eigenwerbung\" sein."},"category_interaction_guideline1":{"message":"Kurze Erinnerungen zum Liken, Abonnieren oder Folgen"},"category_interaction_guideline2":{"message":"Enthält indirekte Erinnerungen zum Kommentieren"},"category_interaction_guideline3":{"message":"Nicht für allgemeine Werbung, nur Aufruf zum Handeln"},"category_interaction_short":{"message":"Interaktions-Erinnerung"},"category_intro":{"message":"Unterbrechung/Intro-Animation"},"category_intro_description":{"message":"Ein Videosegment ohne richtigen Inhalt. Kann eine Pause, ein Standbild oder eine sich wiederholende Animation sein. Dies sollte nicht für Übergänge verwendet werden, die Informationen enthalten."},"category_intro_short":{"message":"Unterbrechung"},"category_intro_guideline1":{"message":"Intervall ohne tatsächlichen Inhalt"},"category_intro_guideline2":{"message":"Nicht für Übergänge mit Informationen"},"category_outro":{"message":"Endkarten/Quellen/Anerkennungen"},"category_outro_description":{"message":"Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für videobeendende Schlussfolgerungen mit Informationen."},"category_outro_guideline1":{"message":"Enthalten keinen Inhalt, selbst wenn Endcards zu sehen sind"},"category_preview":{"message":"Vorschau/Rückblick"},"category_preview_description":{"message":"Sammlung von Clips, die zeigen, was in diesem Video oder anderen Videos in einer Serie kommen wird, wo alle Informationen später im Video wiederholt werden."},"category_preview_guideline1":{"message":"Clips, die später oder in einem zukünftigen Video erscheinen"},"category_preview_guideline2":{"message":"Rückblick zu einem vorherigen Video"},"category_preview_guideline3":{"message":"Nicht für Abschnitte, die zusätzliche Inhalte hinzufügen"},"category_hook":{"message":"Hook/Begrüßungen","description":"https://en.wikipedia.org/wiki/Narrative_hook"},"category_hook_description":{"message":"Erzählte Trailer für das bevorstehende Video, Begrüßungen und Verabschiedungen. Dies sollte keine Schlussfolgerungen mit Informationen überspringen."},"category_hook_guideline1":{"message":"Erzählte Trailer für das bevorstehende Video"},"category_hook_guideline2":{"message":"Begrüßungen und Verabschiedungen von Zuschauern"},"category_hook_guideline3":{"message":"Nicht für Segmente mit zusätzlichem Inhalt"},"category_filler":{"message":"Nebensachen/Witze"},"category_filler_description":{"message":"Nebensächliche Szenen, die nicht benötigt sind, um den Hauptinhalt des Videos zu verstehen oder als Witz dienen. Dies bezieht sich nicht auf Segmente, die Kontext oder Hintergrunddetails liefern. Dies ist eine sehr aggressive Kategorie, die dafür gedacht ist, wenn du nicht in der Stimmung für „Spaß“ bist."},"category_filler_short":{"message":"Nebensachen"},"category_filler_guideline1":{"message":"Nebensächliche Szenen oder Witze"},"category_filler_guideline2":{"message":"Ablenkungen, Patzer, Wiederholungen"},"category_filler_guideline3":{"message":"Nicht für Szenen, die zum Verstehen des Themas notwendig sind"},"category_music_offtopic":{"message":"Musik: Nicht-Musik-Abschnitt"},"category_music_offtopic_description":{"message":"Nur für die Verwendung in Musikvideos. Dies sollte nur für Abschnitte von Musikvideos verwendet werden, die noch nicht von einer anderen Kategorie abgedeckt sind."},"category_music_offtopic_short":{"message":"Nicht-Musik"},"category_music_offtopic_guideline1":{"message":"Abschnitte nicht in offiziellen Veröffentlichungen"},"category_music_offtopic_guideline2":{"message":"Nicht-Musik in einem Liveauftritt"},"category_poi_highlight":{"message":"Highlight"},"category_poi_highlight_description":{"message":"Der Abschnitt des Videos, nach dem die meisten Leute suchen, ähnlich wie „Video startet bei x“-Kommentare."},"category_poi_highlight_guideline1":{"message":"Bereiche, die die meisten Personen suchen"},"category_poi_highlight_guideline2":{"message":"Kann Kontext überspringen"},"category_poi_highlight_guideline3":{"message":"Kann zum Titel oder Thumbnail springen"},"category_chapter":{"message":"Kapitel"},"category_chapter_description":{"message":"Selbst benannte Kapitel, die große Abschnitte eines Videos beschreiben."},"category_chapter_guideline1":{"message":"Sponsor-Markennamen nicht erwähnen"},"category_chapter_guideline2":{"message":"Benutze größere Kapitel für allgemeine Abschnitte"},"category_chapter_guideline3":{"message":"Kleinere Kapitel können innerhalb von größeren platziert werden"},"category_livestream_messages":{"message":"Livestream: Spenden/Nachrichten vorlesen"},"category_livestream_messages_short":{"message":"Nachrichten lesen"},"autoSkip":{"message":"Automatisch überspringen"},"manualSkip":{"message":"Manuelles Überspringen"},"showOverlay":{"message":"In der Video-Zeitleiste anzeigen"},"disable":{"message":"Deaktivieren"},"autoSkip_POI":{"message":"Automatisch zum Start springen"},"manualSkip_POI":{"message":"Beim Laden des Videos fragen"},"showOverlay_POI":{"message":"In der Video-Zeitleiste anzeigen"},"showOverlay_full":{"message":"Label zeigen"},"showOverlay_chapter":{"message":"Kapitel zeigen"},"autoSkipOnMusicVideos":{"message":"Alle Segmente automatisch überspringen, wenn ein Nicht-Musiksegment vorhanden ist"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Nur auf music.youtube.com automatisch überspringen"},"muteSegments":{"message":"Segmente zulassen, die den Ton ausschalten anstatt zu überspringen"},"fullVideoSegments":{"message":"Ein Symbol anzeigen, wenn ein Video vollständig aus Werbung besteht","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Labels auch auf Video-Thumbnails anzeigen","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Nicht eingereichte Farbe","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Farbe in der Video-Zeitleiste"},"category":{"message":"Kategorie"},"skipOption":{"message":"Verhalten","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Fortgeschrittene Optionen zum Überspringen öffnen"},"advancedSkipNotSaved":{"message":"Syntaxfehler: Deine Optionen wurden nicht gespeichert"},"advancedSkipSettingsHelp":{"message":"Wie das funktioniert","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Betatest-Server aktivieren"},"whatEnableTestingServer":{"message":"Deine Beiträge und Bewertungen/Meldungen werden NICHT an den Hauptserver übertragen. Benutze diese Option also nur für Tests."},"testingServerWarning":{"message":"Alle Beiträge und Bewertungen/Meldungen werden NICHT an den Hauptserver übertragen. Deaktiviere die Betatest-Server Option, um Einreichungen an den Hauptserver zu senden."},"bracketNow":{"message":"(jetzt)"},"moreCategories":{"message":"Weitere Kategorien"},"chooseACategory":{"message":"Wähle eine Kategorie"},"enableThisCategoryFirst":{"message":"Um Segmente aus der Kategorie \"{0}\" zu senden, musst du diese in den Optionen aktivieren. Du wirst jetzt zu den Optionen weitergeleitet.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Achtung: Diese Art von Segment kann nur einmal pro Video aktiv sein. Sollten mehrere eingereicht werden, wird ein zufälliges angezeigt werden."},"youMustSelectACategory":{"message":"Du musst eine Kategorie für jedes zu übermittelnde Segment auswählen!"},"bracketStart":{"message":"(Start)"},"bracketEnd":{"message":"(Ende)"},"End":{"message":"Ende","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"Ausgeblendet: negativ bewertet"},"hiddenDueToDuration":{"message":"Ausgeblendet: zu kurz"},"manuallyHidden":{"message":"manuell versteckt"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Kanal-ID wurde noch nicht geladen. Falls du ein eingebettetes Video benutzt, probiere stattdessen die YouTube-Homepage. Dies könnte auch durch Änderungen im YouTube-Layout verursacht werden. Sollte das der Fall sein, schreibe hier einen Kommentar:"},"invidiousPermissionRefresh":{"message":"Der Browser hat die Berechtigung, welche zum Verwenden von Invidious und anderen Drittanbieter-Seiten benötigt wird, widerrufen. Bitte klicke auf die Schaltfläche unten, um diese Berechtigung zu reaktivieren."},"acceptPermission":{"message":"Berechtigung erteilen"},"permissionRequestSuccess":{"message":"Die Berechtigungsanfrage war erfolgreich!"},"permissionRequestFailed":{"message":"Berechtigungsanfrage fehlgeschlagen, hast du sie abgelehnt?"},"adblockerIssueWhitelist":{"message":"Falls du dies nicht beheben kannst, deaktiviere die Einstellung 'Kanalprüfung vor dem Überspringen von Segmenten erzwingen', da SponsorBlock nicht in der Lage ist, die Kanal-Informationen für dieses Video abzurufen"},"forceChannelCheck":{"message":"Kanalprüfung vor dem Überspringen von Segmenten erzwingen"},"whatForceChannelCheck":{"message":"Standardmäßig werden Segmente übersprungen, bevor SponsorBlock überhaupt weiß, von welchem Kanal das Video ist. Normalerweise führt dies dazu, dass Videosegmente von Kanälen, die sich auf der Ausnahmeliste befinden, am Anfang trotzdem übersprungen werden. Das Aktivieren dieser Option verhindert das, hat jedoch eine leichte Verzögerung beim Überspringen zur Folge, da die Kanal-ID erst eingelesen werden muss. Diese sollte bei einer schnellen Internetverbindung jedoch kaum bemerkbar sein."},"forceChannelCheckPopup":{"message":"Eventuell solltest du die Option \"Kanalprüfung vor dem Überspringen von Segmenten erzwingen\" aktivieren."},"downvoteDescription":{"message":"Nicht korrekt oder falsches Timing"},"incorrectVote":{"message":"Falsch"},"harmfulVote":{"message":"Schädlich","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Kategorie ändern"},"nonMusicCategoryOnMusic":{"message":"Dieses Video ist als Musikvideo kategorisiert. Bist du dir sicher, dass es ein gesponsertes Videosegment hat? Wenn dies tatsächlich ein Musikvideoteil ohne Musik ist, öffne die Optionen von SponsorBlock und aktiviere diese Kategorie. Danach kannst du dieses Segment als solches markieren. Bitte lies die Richtlinien, wenn du dir nicht sicher bist."},"multipleSegments":{"message":"Mehrere Segmente"},"guidelines":{"message":"Richtlinien"},"readTheGuidelines":{"message":"Lies die Richtlinien!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategorien sind hier!"},"categoryUpdate2":{"message":"Öffne die Optionen, um das Verhalten bei Intros, Outros, Merchandising (Fanartikel) usw. einzustellen."},"help":{"message":"Hilfe"},"GotIt":{"message":"Verstanden","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Dieses Segment ist lang. Wenn das gesamte Video nur ein Thema behandelt, wechsle von „Überspringen“ zu „Vollständiges Video“. Erfahre mehr in den Richtlinien."},"categoryPillTitleText":{"message":"Das gesamte Video fällt unter diese Kategorie und ist zu stark integriert, um es zu trennen"},"chapterNameTooltipWarning":{"message":"Einer deiner Kapitelnamen ähnelt einer Kategorie. Du solltest Kategorien verwenden, wenn möglich."},"experiementOptOut":{"message":"Aus allen zukünftigen Experimenten abmelden","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Dauerhaft verbergen"},"warningChatInfo":{"message":"Wir haben festgestellt, dass du einige häufig gemachte Fehler machst. Wir schätzen deine bisherige Arbeit sehr, streben hier aber nach Perfektion, sodass es auch auf kleine Fehler ankommt :)"},"questionButton":{"message":"Ich habe eine Frage"},"askAQuestion":{"message":"Stelle eine Frage"},"warningConfirmButton":{"message":"Ich verstehe den Grund"},"warningError":{"message":"Fehler beim Anerkennen der Verwarnung:"},"deArrowMessageRecieved":{"message":"Du hast einen Tipp von einem Moderator erhalten"},"Donate":{"message":"Spenden"},"considerDonating":{"message":"Hilf beim Finanzieren der Entwicklung"},"supportSponsorBlock":{"message":"Unterstütze meine Vollzeitarbeit an SponsorBlock"},"hideDonationLink":{"message":"Spendenlink verbergen"},"darkModeOptionsPage":{"message":"Dunkler Modus auf der Optionsseite"},"helpPageThanksForInstalling":{"message":"Danke fürs Installieren von SponsorBlock."},"helpPageReviewOptions":{"message":"Bitte überprüfe die unten stehenden Optionen"},"helpPageFeatureDisclaimer":{"message":"Viele Funktionen sind standardmäßig deaktiviert, z.B. Intros/Outros überspringen oder Invidious verwenden. Aktiviere diese unten. Du kannst auch UI-Elemente verstecken/anzeigen."},"helpPageHowSkippingWorks":{"message":"Wie es funktioniert"},"helpPageHowSkippingWorks1":{"message":"Alle Sponsoren wurden von Nutzern wie dir eingereicht. Du kannst die Liste der Sponsoren in der Datenbank sehen, indem du das Popup oben rechts in deinem Browser öffnest."},"helpPageHowSkippingWorks2":{"message":"Wann immer du ein Segment überspringst, erhältst du einen Hinweis. Wenn das Timing falsch erscheint, kannst du das Segment abwerten! Du kannst auch im Popup abstimmen."},"Submitting":{"message":"Übermitteln"},"helpPageSubmitting1":{"message":"Segmente können erstellt werden, indem du auf das SponsorBlock-Logo im Wiedergabefenster klickst."},"helpPageSubmitting2":{"message":"Ein Klick auf den Abspielknopf zeigt den Beginn eines Segments an, ein Klick auf den Stoppknopf das Ende. Verwende den Knopf mit dem nach oben zeigenden Pfeil, um das Einreichungsmenü zu öffnen, wo du deine Segmente durch die Vorschau prüfen und zur Perfektion bearbeiten kannst. Präzision ist wichtig, lies bitte die Richtlinien, bevor du Segmente einreichst."},"helpPageCopyOfDatabase":{"message":"Wo gehen die Einreichungen hin?"},"helpPageCopyOfDatabase1":{"message":"Alle Einreichungen werden in der SponsorBlock-Datenbank gespeichert, welche für jeden verwendbar veröffentlicht wird. Sie ist verfügbar unter"},"helpPageCopyOfDatabase2":{"message":"Der Quellcode ist frei verfügbar. Selbst wenn mir etwas passieren würde, wären deine Einreichungen nicht verloren."},"AdviceForSubmitting":{"message":"Tipps zum Einreichen"},"Credits":{"message":"Mitwirkende"},"LearnMore":{"message":"Erfahre mehr"},"FullDetails":{"message":"Vollständige Details"},"CopyDownvoteButtonInfo":{"message":"Dagegen stimmen und eine lokale Kopie zum erneuten Einreichen erstellen"},"OpenCategoryWikiPage":{"message":"Öffne den Wiki-Artikel dieser Kategorie."},"CopyAndDownvote":{"message":"Kopieren und abwerten"},"ContinueVoting":{"message":"Bewerten fortsetzen"},"ChangeCategoryTooltip":{"message":"Dies wirkt sich sofort auf eigene Segmente aus"},"downvote":{"message":"Dagegen stimmen"},"upvote":{"message":"Positiv bewerten"},"hideSegment":{"message":"Segment ausblenden"},"skipSegment":{"message":"Segment überspringen"},"playChapter":{"message":"Kapitel abspielen"},"SponsorTimeEditScrollNewFeature":{"message":"Benutze das Mausrad, während der Mauszeiger über dem Eingabefeld schwebt, um die Zeit schnell anzupassen. Kombinationen mit der Strg- oder Shift-Taste können zur Feinabstimmung der Änderungen verwendet werden."},"categoryPillNewFeature":{"message":"Neu! Sieh, wenn ein Video ausschließlich gesponsert oder Eigenwerbung ist"},"yearAbbreviation":{"message":"J.","description":"100y"},"dayAbbreviation":{"message":"T.","description":"100d"},"hourAbbreviation":{"message":"Std.","description":"100h"},"optionsTabBehavior":{"message":"Verhalten","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Oberfläche","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Tastenkürzel","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Sichern/Wiederherstellen","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Verschiedenes","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Aussehen der Überspringen-Benachrichtigung","description":"Option label"},"unbind":{"message":"Aufheben","description":"Unbind keyboard shortcut"},"notSet":{"message":"Nicht gesetzt"},"change":{"message":"Ändern"},"youtubeKeybindWarning":{"message":"Dies ist ein vorhandenes YouTube-Kürzel. Bist du sicher, dass du es verwenden möchtest?"},"betaServerWarning":{"message":"BETA-Server ist aktiviert!"},"openOptionsPage":{"message":"Einstellungen öffnen"},"resetToDefault":{"message":"Auf Werkseinstellungen zurücksetzen"},"confirmResetToDefault":{"message":"Bist du sicher, dass du alle Einstellungen auf ihre Standardwerte zurücksetzen willst? Dies kann nicht rückgängig gemacht werden."},"exportSegments":{"message":"Segmente exportieren"},"importSegments":{"message":"Segmente importieren"},"Import":{"message":"Importieren","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Einlösen erfolgreich!"},"redeemFailed":{"message":"Lizenzschlüssel ist ungültig"},"hideUpsells":{"message":"Verstecke Optionen, welche ohne extra Zahlung nicht verfügbar sind"},"hideNewFeatureUpdates":{"message":"Verstecke Hinweise über neue Funktionen"},"redeem":{"message":"Einlösen"},"enterLicenseKey":{"message":"Lizenzschlüssel eingeben"},"unsubmittedSegmentCounts":{"message":"Du hast derzeit {0} in {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Du hast aktuell keine nicht eingereichten Segmente","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"nicht eingereichtes Segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"nicht eingereichte Segmente","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"Video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"Videos","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Lösche alle Segmente","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Möchtest du wirklich alle nicht eingereichten Segmente löschen?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Segmente anzeigen","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Segmente ausblenden","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video-ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Segmentanzahl","description":"Header of the unsubmitted segments list"},"actions":{"message":"Aktionen","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Als URL teilen"},"segmentFetchFailureWarning":{"message":"Warnung: Der Server hat noch nicht mit Segmenten geantwortet. Möglicherweise gibt es in diesem Video bereits übermittelte Segmente, aber du hast sie aufgrund von Serverproblemen noch nicht erhalten."},"allowScrollingToEdit":{"message":"Scrollen zum Bearbeiten von Zeiten erlauben"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Bessere Titel und Thumbnails auf YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Community-basierte Titel und Thumbnails, um sie informativer und weniger aufsehenerregend zu machen","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Wähle die am besten beschreibende"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Originaltitel"},"CurrentTime":{"message":"Aktuelle Zeit"},"resetCustomTitle":{"message":"Titel auf Originaltext zurücksetzen"},"resetIcon":{"message":"Icon zurücksetzen"},"TypeYourOwnTitleHere":{"message":"Eigenen Titel hier eingeben"},"VideoNotReady":{"message":"Video nicht bereit"},"FailedToRender":{"message":"Rendern fehlgeschlagen","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas fehlt","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Renderfehler","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Laden fehlgeschlagen","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Titelformat"},"Disabled":{"message":"Deaktiviert"},"CapitalizeWords":{"message":"Wörter großschreiben"},"TitleCase":{"message":"Großschreibung in Überschriften"},"SentenceCase":{"message":"Satzschreibung"},"LowerCase":{"message":"Kleinbuchstaben"},"FirstLetterUppercase":{"message":"Erster Buchstabe großgeschrieben"},"shouldCleanEmojis":{"message":"Emojis entfernen"},"onlyFormatCustomTitles":{"message":"Nur eingereichte Titel formatieren"},"onlyTitleCaseInEnglish":{"message":"Wörter für nicht-englische Titel großschreiben"},"onlyTitleCaseInEnglishDescription":{"message":"Spracherkennung ist nicht perfekt und erkennt einige englische Titel als nicht-englisch."},"thumbnailFallbackOption":{"message":"Wenn kein Thumbnail eingereicht wurde"},"whatThumbnailFallbackOption":{"message":"Bei der Auswahl einer zufälligen Zeit wird mittels SponsorBlock-Daten sichergestellt, dass keine Zeit in einem Werbesegment ausgewählt wird.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Zeige einen Screenshot eines zufälligen Zeitpunktes"},"TheOriginalThumbnail":{"message":"Zeige das originale Thumbnail"},"showABlankBox":{"message":"Zeige eine leere Box"},"AutoGenerated":{"message":"Von YouTube automatisch generiertes Thumbnail anzeigen","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Start"},"Middle":{"message":"Mitte"},"keepUnsubmitted":{"message":"Speichere eingereichte Abstimmungen"},"showLiveCover":{"message":"Kanal-Avatar auf kommenden Videos anzeigen","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"A/B-getestete Thumbnails nie verwenden"},"ignoreAbThumbnailsDescription":{"message":"Kanäle können Tests auf Ihren Videos einrichten, bei denen YouTube jeder Person verschiedene Thumbnails zeigt. Diese Option wird immer das erste Thumbnail verwenden, um Konsistenz zu bewahren."},"abThumbnailsWarning":{"message":"Warnung: Dieses Video hat aktuell einen A/B-Thumbnail-Test aktiv. Das bedeutet, dass sich das Thumbnail oft ändern kann. Du solltest wegen dieses Risikos eventuell nicht für das originale Thumbnail abstimmen."},"whatKeepUnsubmitted":{"message":"Behalte übermittelte Abstimmungen, um die Titel und Thumbnails anzuzeigen, die du ausgewählt hast anstelle der am besten bewerteten auf dem Server."},"keepUnsubmittedInPrivate":{"message":"Von privaten Tabs eingereichte Bewertungen speichern"},"useThumbnailGenerationService":{"message":"Thumbnail-Erstellungsdienst verwenden"},"titleMaxLines":{"message":"Maximale Zeilenanzahl für Titel"},"titleMaxLinesDescription":{"message":"Videotitel werden in Vorschlägen über so viele Zeilen verteilt."},"thumbnailSaturationLevel":{"message":"Thumbnail-Sättigungslevel"},"whatSaturateThumbnails":{"message":"Mache Thumbnails durch Reduzierung ihrer Farbe weniger lebhaft"},"hideDetailsWhileFetching":{"message":"Details während des Abrufs ausblenden"},"hideDetailsWhileFetchingDescription":{"message":"Blende Titel und Thumbnails während des Abrufens von Daten vom Server aus. Wenn deaktiviert, wirst du aufblinkende Titel und Thumbnails sehen, während diese sich ändern."},"ignoreTranslatedTitles":{"message":"YouTubes übersetzte Titel nicht anzeigen","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube übersetzt manchmal automatisch Titel in deine ausgewählte Sprache. Diese Option hat nur dann eine Auswirkung, wenn kein eingereichter Titel verfügbar ist."},"onAllPages":{"message":"Auf allen Seiten","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Auf allen Seiten außer Videoseiten","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Nie"},"thumbnailGeneratorDescription1":{"message":"Der Thumbnail-Generierungsdienst beschleunigt die Generierung von Thumbnails erheblich, indem er eine anonyme Anfrage mit der Video‑ID an einen Server schickt. Das Thumbnail wird dann entweder generiert oder aus einem Cache bezogen, wenn es zuvor bereits generiert wurde."},"thumbnailGeneratorDescription2":{"message":"Wenn auf Videoseiten verwendet, könnten nicht gelistete Video-IDs an den Server weitergegeben werden. Das Verwenden von „Auf allen Seiten außer Videoseiten“ vermeidet dieses Problem. Eine andere Option ist es, einen eigenen Thumbnail-Generierungsdienst zu hosten."},"thumbnailGeneratorDescription3":{"message":"Wenn die Verwendung des Thumbnail-Erstellungsdienstes deaktiviert ist, werden alle Anfragen ein k-Anonymitäts-Anfragesystem verwenden, welches es für den Server schwieriger macht, vorauszusagen, welche Videos abgerufen wurden. Außerdem wird ein langsamerer, lokaler Thumbnail-Erstellungsdienst verwendet.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Thumbnail-Erstellungsdienst-Quellcode"},"moreAboutKAnonymity":{"message":"Mehr über K-Anonymität","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Zeige immer den „Original anzeigen“-Knopf an"},"whatAlwaysShowShowOriginalButton":{"message":"Aktiviere dies, wenn du immer wissen möchtest, ob sich ein Titel oder Thumbnail verändert hat."},"showOriginalOnHover":{"message":"Beim Daraufzeigen zwischen eingereichten und originalen Details wechseln"},"showOriginalOnHoverOfVideo":{"message":"Wechsel zwischen benutzerdefinierten Details und Originaldetails, wenn du den Mauszeiger über eine beliebige Stelle in der Video-Karte bewegst"},"showOriginalOnHoverOfVideoDescription":{"message":"Damit wird die automatische Wiedergabe beim Daraufzeigen deaktiviert"},"showCustomOnHoverIfCasual":{"message":"Zeige eingereichten Titel beim Daraufzeigen, falls ein Titel des Gelegenheitsmodus angezeigt wird"},"showIconForFormattedTitles":{"message":"Zeige „Original anzeigen“-Knopf für automatisch formatierte Titel"},"Enable":{"message":"Aktivieren"},"Titles":{"message":"Titel","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Thumbnails","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Stimmen für Originaltitel","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Fehler"},"ShowOriginal":{"message":"Zeige originale Details"},"ShowModified":{"message":"Zeige veränderte Details"},"ShowFormatted":{"message":"Zeige formatierte Details"},"FillerWarning":{"message":"Warnung: Dies ist eine extrem aggressive Kategorie. Höchstwahrscheinlich musst du Einiges manuell nicht überspringen, oder es manchmal deaktivieren. Sei gewarnt, dass 50% oder mehr vieler Videos übersprungen werden! Denk jedoch daran, dass du trotzdem bestimmten Richtlinien beim Einreichen folgen musst.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Trete bei Discord oder Matrix bei, um dauerhaft in diesem Chat zu bleiben","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Zeige Richtlinien-Hilfe","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Vermeide übertriebene Gesichtsausdrücke","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Denke an das große Ganze, beantworte nicht einfach die Frage des Originaltitels","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Vermeide Beschreibungen von Reaktionen zum Video („schockierend“)","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Gib genug Informationen an, dass andere wissen, worum es geht, bevor sie auf das Video klicken"},"tip5":{"message":"Verwende Groß- und Kleinschreibung wie in einem Satz","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Überprüfe alle Richtlinien zum Einsenden","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Mein Titel verwendet Groß- und Kleinschreibung, wie in einem Satz.","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Mein Titel beantwortet nicht einfach nur eine im Originaltitel gestellte Frage","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Titel sollten das Video oder das Geschehen im Allgemeinen beschreiben. Schaue immer das gesamte Video an, um zu wissen, worüber es tatsächlich ist, als dich auf einen interessanten Originaltitel zu verlassen.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Mein Titel ist keine Zusammenfassung einer Schlussfolgerung oder ein unnötiger Spoiler","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Titel sind nicht zum Ersetzen des ganzen Videos gedacht, sondern zum Erkennen, ob es sich lohnt, es anzuschauen.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Mein Titel dient nicht der Überprüfung der Fakten, der Verspottung, oder der Kritik an dem Video oder seinem Ersteller.","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Titel sollen aus der Perspektive des Erstellers und des Videos sein. Bewertungen und Kritik von Videos sind außerhalb des Aufgabenbereichs von DeArrow. Titel sind kein Kommentarbereich.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Erkanntes Wort: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Verwende keine unnötigen Verben am Anfang eines Titels.","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Beginne alle Titel mit einem Großbuchstaben. Titel sollten Groß- und Kleinschreibung wie in einem Satz verwenden.","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Titel sollten nicht mit einem Punkt ‚.‘ enden","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Beantworte nicht einfach eine im Originaltitel gestellte Frage. Titel sollten das Video beschreiben, oder das Geschehen allgemein.","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Titel dienen nicht der Überprüfung der Fakten, der Verspottung, oder der Kritik an dem Video oder seinem Ersteller.","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Titel sollten keine sensationalistischen Elemente des Originaltitels behalten.","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Titel sollten keine Emojis enthalten.","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Du musst das angezeigte Problem beheben, bevor du diesen Titel einreichen kannst."},"dearrowHelpSponsorBlockImported":{"message":"Hinweis: Deine SponsorBlock-Einstellungen wurden automatisch importiert!"},"howItWorks":{"message":"So funktioniert es"},"discordPromotion":{"message":"Bring dich mit ein, mache Vorschläge und hilf auf {discord} oder {matrix} mit"},"deArrowDonationText":{"message":"Falls dir gefällt, was ich bisher gemacht habe und du mir mit Geld aushelfen willst, ist hier ein Link"},"termsAgreement":{"message":"Durch die Verwendung dieser Erweiterung stimmst du der {privacy-policy} und den {terms} zu"},"privacyPolicy":{"message":"Datenschutzerklärung"},"termsOfUse":{"message":"Nutzungsbedingungen"},"openSourceLicenses":{"message":"Open-Source-Lizenzen"},"defaultToOriginals":{"message":"Standardmäßig die ursprünglichen Videoinformationen verwenden"},"whatDefaultToOriginals":{"message":"Zeige standardmäßig den ursprünglichen Titel und Thumbnail, aber biete eine Schaltfläche an, mit der benutzerdefinierte Titel und Thumbnails für einzelne Videos angezeigt werden können."},"replaceTitles":{"message":"Ersetze Titel"},"replaceThumbnails":{"message":"Ersetze Thumbnails"},"useCrowdsourcedTitles":{"message":"Verwende eingereichte Titel"},"whatUseCrowdsourcedTitles":{"message":"Wenn deaktiviert, werden Titel formatiert, aber keine von der Community übermittelten Titel verwendet","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Soll diese Konfiguration wirklich gelöscht werden?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Neue Konfiguration"},"DeleteConfiguration":{"message":"Konfiguration löschen"},"ChannelAllowlist":{"message":"Kanalspezifische Einstellungen"},"ConfigurationName":{"message":"Name der Konfiguration"},"ChannelListInstructions":{"message":"Gib Kanäle ein, auf welche du diese Konfiguration anwenden willst, in die unten stehende Textbox durch neue Zeilen getrennt ein. Sowohl Kanal-IDs und Anzeigenamen werden unterstützt. @-Benutzernamen werden nicht unterstützt. Du kannst Kanal-IDs durch den Teilen-Knopf in der Kanalinfo-Seite finden. Um auf die Kanalinfo-Seite zu kommen, klicke auf die Kanalbeschreibung welche unterhalb des Kanalnamens auf der Kanalseite erscheint.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Noch keine Konfigurationen eingerichtet. Klicke oben auf den Knopf, um eine neue Konfiguration hinzuzufügen.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Stoppe Clickbait, indem du Titel und Thumbnails durch genauere ersetzt"},"DeArrowPromotionMessage2":{"message":"Genug von Clickbait? Schau dir meine neue Erweiterung zum Verbessern von Titeln und Thumbnails an"},"DeArrowPromotionMessage3":{"message":"Schau dir auch DeArrow an","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Gefällt dir dieser Titel nicht? Wenn du den unten stehenden Titel bevorzugst, schau dir die Titelersetzungsfunktion in DeArrow an.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Dieses Thumbnail wurde von einem zufälligen Zeitstempel gewählt, da es noch keine Einreichungen für dieses Video gibt","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Dieses Thumbnail wurde von einem zufälligen Zeitstempel gewählt und der Titel wurde automatisch formatiert, weil es noch keine Einreichung für dieses Video gibt","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Du kannst diese Standardeinstellung unten ändern","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} Titel und {thumbnails} Thumbnails wurden ersetzt, seit du diese Erweiterung installiert hast","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} Titel ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} Titel ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"und {thumbnails} Thumbnail","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"und {thumbnails} Thumbnails","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} wurden ersetzt, seit du diese Erweiterung installiert hast","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Zähle Titel- und Thumbnail-Ersetzungen"},"countReplacementsDescription":{"message":"Wird verwendet, um dir Statistiken im Pop-up zu zeigen.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Füge eine Filterliste hinzu, um Umfragen, Merchandise-Regale und ähnliche Werbeseitenelemente mit yt-neuter zu blockieren"},"requiresUblock":{"message":"Benötigt uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Etwas ist bei der Video-ID-Erkennung schiefgelaufen. Bitte versuche vor dem Absenden, die Seite zu aktualisieren, um sicherzustellen, dass es für das richtige Video übermittelt wird. Wenn dies oft passiert, schicke bitte einen Bericht mit deinen installierten Erweiterungen und Userscripts auf GitHub, Discord oder Matrix."},"dearrowLogoCredit":{"message":"Logo basierend auf Twemoji lizenziert unter CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock ist nicht mit der Erweiterung „Zoom to Fill“ kompatibel. Es gibt viele Alternativen, die problemlos funktionieren werden."},"freeTrialStarted":{"message":"Deine Gratisprobezeit wurde erfolgreich gestartet. Besuche YouTube, um es auszuprobieren"},"freeTrialEnded":{"message":"Deine Gratisprobezeit ist vorbei"},"freeTrialPrompt":{"message":"Wenn du es für eine Stunde ausprobieren möchtest, kannst du mit dem Knopf unten eine Gratisprobezeit starten."},"startFreeTrial":{"message":"Gratisprobezeit starten"},"freeAccessRequested":{"message":"Du hast dich erfolgreich für den kostenlosen Zugriff registriert. Du wirst benachrichtigt, wenn dieser gewährt wird."},"freeAccessComplete":{"message":"Glückwunsch! Du hast nun kostenlosen Zugriff auf DeArrow"},"DeArrowNotActivated":{"message":"DeArrow ist nicht aktiviert"},"ActivateDeArrow":{"message":"DeArrow aktivieren"},"DeArrowIsActivated":{"message":"DeArrow wurde erfolgreich aktiviert"},"Close":{"message":"Schließen"},"ViewLicenseKey":{"message":"Lizenzschlüssel anzeigen"},"SharingIsCaring":{"message":"Teilen macht Freude"},"cleanPopup":{"message":"Verstecke Unordnung im Segmentlisten-Popup"},"hideSegmentCreationInPopup":{"message":"Verstecke die Knöpfe zur Segmenterstellung im Popup"},"syncDisabledWarning":{"message":"Achtung: Die Speicherung von Erweiterungsdaten wurde in deinem Browser deaktiviert. Einstellungen können nicht gespeichert werden, wenn du versuchst, sie zu speichern."},"syncDisabledWarningDeArrow":{"message":"DeArrow funktioniert nicht ohne Speicher."},"syncDisabledFirefoxSuggestions":{"message":"Du kannst es aktivieren, indem du zu about:config gehst und den Wert \"webextensions.storage.sync.enabled\" auf true setzt."},"storageFull":{"message":"Erweiterungsspeicher ist voll. Bitte lösche einige nicht eingereichte Segmente in den Optionen."},"previewSegmentRequired":{"message":"Bitte überprüfe deine Segmente vor dem Absenden. Dafür musst du auf den Vorschau-Knopf klicken oder das folgende Tastenkürzel benutzen:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Als VIP handeln","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Einreichungen können im Moment von deinem Browser nicht akzeptiert werden, weil YouTube scheinbar serverseitige Werbung eingespeist hat, welche die Erweiterung nicht entfernen kann. Bitte kontaktiere uns, wenn du diesen Fehler erhältst."},"DeArrowIsDisabled":{"message":"DeArrow ist deaktiviert - Klicke zum Aktivieren","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Bist du sicher, dass dieses originale Thumbnail den DeArrow-Richtlinien entspricht? Falls du allgemein lieber die ursprünglichen Thumbnails sehen möchtest, ändere die Option „Wenn kein Thumbnail eingereicht wurde“ in den DeArrow-Einstellungen.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"SponsorBlock ist auf YouTube TV nicht mit live übertragenen oder kürzlich aufgenommen Videos kompatibel. Falls dies eine kürzliche Aufnahme ist, warte ein paar Stunden, bis die verarbeitete Version verfügbar ist.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Kanal-Whitelists werden auf tv.youtube.com nicht unterstützt.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Gefällt dir der Originaltitel?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Ja"},"No":{"message":"Nein"},"votes":{"message":"{0} Stimmen","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} Stimme","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Witzig","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Kreativ","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Clever","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Beschreibend","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Sonstiges","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Klassischer Modus","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Titel werden mit einem auf den Richtlinien basierten, standardisierten Format auf allen Videos ersetzt, für die ein eingereichter Titel existiert."},"CasualMode":{"message":"Gelegenheitsmodus","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Behalte Originaltitel, wenn sie das Video ausreichend beschreiben, clever oder witzig sind.\nWähle aus, welche Kategorien von Titeln du sehen möchtest.\nDu kannst darüber abstimmen, ob ein Titel in eine Kategorie passt oder nicht."},"minimumVotes":{"message":"Mindest-Stimmanzahl","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Zeige auch das ursprüngliche Thumbnail","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Neue Funktion: Gelegenheitsmodus","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Zeige Symbol des Gelegenheitsmodus nur, wenn ein eingereichter Titel verfügbar ist"},"OpenSettings":{"message":"Einstellungen öffnen"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/el/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/el/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Λήξη χρονικού ορίου σύνδεσης. Παρακαλώ ελέγξτε ότι η σύνδεσή σας με το διαδίκτυο λειτουργεί, αλλιώς ο διακομιστής μπορεί να υπερφορτώθηκε ή να έπεσε."},"400":{"message":"Ο διακομιστής ανέφερε πως αυτό το αίτημα δεν είναι έγκυρο"},"409":{"message":"Αυτό έχει ήδη υποβληθεί στο παρελθόν"},"502":{"message":"Ο διακομιστής φαίνεται ότι έχει υπερφορτωθεί. Δοκιμάστε ξανά σε μερικά δευτερόλεπτα."},"fullName":{"message":"SponsorBlock για το YouTube - Παραλείπει Χορηγίες","description":"Name of the extension."},"Description":{"message":"Παράλειψη χορηγιών, έκκλησης συνδρομής και πολλά περισσότερα στα βίντεο του YouTube. Αναφέρετε χορηγίες σε βίντεο που βλέπετε για να κερδίσετε χρόνο στους υπολοίπους.","description":"Description of the extension."},"channelWhitelisted":{"message":"Το κανάλι προστέθηκε στη λίστα αποδοχής!"},"Segment":{"message":"τμήμα"},"Segments":{"message":"τμήματα"},"SegmentsCap":{"message":"Τμήματα"},"Chapters":{"message":"Κεφάλαια"},"renderAsChapters":{"message":"Απεικόνιση τμημάτων ως κεφάλαια","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Εμφάνιση τρέχοντος τμήματος δίπλα στο χρόνο βίντεο"},"showAutogeneratedChapters":{"message":"Εμφάνιση κεφαλαίων που δημιουργήθηκαν αυτόματα από το YouTube"},"upvoteButtonInfo":{"message":"Θετική ψήφος για αυτήν την υποβολή"},"reportButtonTitle":{"message":"Αναφορά"},"reportButtonInfo":{"message":"Αναφορά αυτής της υποβολής ως λανθασμένης."},"Dismiss":{"message":"Παράβλεψη"},"Loading":{"message":"Φόρτωση…"},"Hide":{"message":"Να μην ξαναεμφανιστεί"},"hitGoBack":{"message":"Πατήστε αναίρεση παράλειψης για να επιστρέψετε όπου βρισκόσασταν."},"unskip":{"message":"Αναίρεση παράλειψης"},"reskip":{"message":"Παράλειψη ξανά"},"unmute":{"message":"Αναίρεση σίγασης"},"paused":{"message":"Σε παύση"},"manualPaused":{"message":"Λήξη Χρονομέτρου"},"confirmMSG":{"message":"Για να επεξεργαστείτε ή να διαγράψετε τα τμήματα ξεχωριστά, ανοίξτε το αναδυόμενο παράθυρο πατώντας το κουμπί πληροφορίες (i) ή πατώντας το εικονίδιο της επέκτασης στην πάνω δεξιά γωνία του προγράμματος περιήγησης σας."},"clearThis":{"message":"Θέλετε σίγουρα να σβήσετε τη φόρμα υποβολής τμημάτων;\n\n"},"Unknown":{"message":"Παρουσιάστηκε ένα σφάλμα κατά την υποβολή των τμημάτων χορηγιών, παρακαλώ προσπαθήστε ξανά αργότερα."},"sponsorFound":{"message":"Υπάρχουν τμήματα στη βάση δεδομένων για αυτό το βίντεο!"},"sponsor404":{"message":"Δε βρέθηκαν τμήματα στη βάση δεδομένων"},"sponsorStart":{"message":"Το τμήμα ξεκινάει εδώ"},"sponsorEnd":{"message":"Το τμήμα τελειώνει εδώ"},"sponsorCancel":{"message":"Ακύρωση δημιουργίας τμήματος"},"noVideoID":{"message":"Δε βρέθηκε βίντεο YouTube.\nΑν αυτό δεν είναι σωστό, παρακαλώ ανανεώστε την καρτέλα."},"refreshSegments":{"message":"Ανανέωση των δεδομένων των τμημάτων"},"success":{"message":"Επιτυχία!"},"voted":{"message":"Ψηφίστηκε!"},"serverDown":{"message":"Φαίνεται ότι ο διακομιστής έχει πέσει. Παρακαλώ επικοινωνήστε με τον προγραμματιστή αμέσως."},"connectionError":{"message":"Παρουσιάστηκε σφάλμα σύνδεσης. Κωδικός σφάλματος: "},"segmentsStillLoading":{"message":"Τα τμήματα φορτώνονται ακόμα…"},"clearTimes":{"message":"Καθαρισμός τμημάτων"},"openPopup":{"message":"Εμφάνιση του αναδυόμενου παραθύρου του SponsorBlock"},"closePopup":{"message":"Κλείσιμο αναδυόμενου παραθύρου"},"closeIcon":{"message":"Εικονίδιο Κλεισίματος"},"OpenSubmissionMenu":{"message":"Άνοιγμα Μενού Υποβολής"},"OpenCasualVoteMenu":{"message":"Άνοιγμα μενού απλής λειτουργίας"},"sortSegments":{"message":"Ταξινόμηση Τμημάτων"},"submitCheck":{"message":"Σίγουρα θέλετε να το υποβάλετε αυτό;"},"whitelistChannel":{"message":"Λίστα αποδοχής καναλιών"},"removeFromWhitelist":{"message":"Αφαίρεση καναλιού από τη λίστα αποδοχής"},"voteOnTime":{"message":"Ψηφίστε για κάποιο τμήμα"},"Submissions":{"message":"Υποβολές"},"savedPeopleFrom":{"message":"Έχετε γλιτώσει τον κόσμο από "},"viewLeaderboard":{"message":"Πίνακας βαθμολογίας"},"recordTimesDescription":{"message":"Υποβολή"},"submissionEditHint":{"message":"Η επεξεργασία τμήματος θα εμφανιστεί αφότου πατήσετε υποβολή","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Συμβουλή: Μπορείτε να ρυθμίσετε συντομεύσεις πλήκτρων για υποβολή στις ρυθμίσεις"},"clearTimesButton":{"message":"Σβήσιμο τμημάτων"},"Username":{"message":"Όνομα χρήστη"},"setUsername":{"message":"Ορισμός ονόματος χρήστη"},"copyPublicID":{"message":"Αντιγραφή δημόσιου αναγνωριστικού χρήστη"},"copySegmentID":{"message":"Αντιγραφή ταυτότητας τμήματος"},"loopChapter":{"message":"Επανάληψη κεφαλαίου"},"unloopChapter":{"message":"Ακύρωση επανάληψης κεφαλαίου"},"hideThis":{"message":"Απόκρυψη"},"Options":{"message":"Ρυθμίσεις"},"showButtons":{"message":"Εμφάνιση Κουμπιών στην οθόνη αναπαραγωγής YouTube"},"hideButtonsDescription":{"message":"Αυτό αποκρύπτει τα κουμπιά που εμφανίζονται στο πρόγραμμα αναπαραγωγής YouTube ώστε να υποβάλετε τμήματα προς παράλειψη."},"showSkipButton":{"message":"Διατήρηση του κουμπιού παράλειψης προς το κυριότερο περιεχόμενο του βίντεο στην οθόνη αναπαραγωγής"},"showInfoButton":{"message":"Εμφάνιση κουμπιού «πληροφορίες» στο πρόγραμμα αναπαραγωγής YouTube"},"autoHideInfoButton":{"message":"Αυτόματη απόκρυψη του κουμπιού «Πληροφορίες»"},"showDeleteButton":{"message":"Εμφάνιση κουμπιού «διαγραφή» στο πρόγραμμα αναπαραγωγής YouTube"},"enableViewTracking":{"message":"Ενεργοποίηση του μετρητή παραλείψεων"},"whatViewTracking":{"message":"Αυτή η δυνατότητα ανιχνεύει ποια τμήματα έχετε παραλείψει, ώστε να ξέρουν εκείνοι που τα υπέβαλαν, πόσο έχουν βοηθήσει τους συνανθρώπους τους, και χρησιμοποιείται ως μέτρηση μαζί με τις θετικές ψήφους, ώστε να βεβαιωθεί η βάση δεδομένων πως δεν είναι ανεπιθύμητο τμήμα. Κάθε φορά που παραλείπετε κάποιο τμήμα ή επέκταση το στέλνει στον διακομιστή. Ελπίζουμε οι περισσότεροι χρήστες να μην αλλάξουν αυτή τη ρύθμιση, ώστε ο αριθμός μη προβολής τμημάτων να είναι ακριβής. :)"},"enableViewTrackingInPrivate":{"message":"Ενεργοποίηση του μετρητή παραλείψεων σε καρτέλες Ιδιωτικής/Ανώνυμης περιήγησης"},"enableTrackDownvotes":{"message":"Αποθήκευση καταψηφίσεων τμημάτων"},"whatTrackDownvotes":{"message":"Όποια τμήματα καταψηφίζετε θα παραμένουν κρυμμένα ακόμα και μετά από ανανέωση της σελίδας"},"trackDownvotesWarning":{"message":"Προειδοποίηση: Η απενεργοποίηση αυτής της επιλογής θα διαγράψει όλες τις προηγούμενες αποθηκευμένες καταψηφίσεις"},"enableTrackDownvotesInPrivate":{"message":"Αποθήκευσε τις αρνητικές ψήφους των τμημάτων σε ιδιωτικές/ανώνυμες καρτέλες"},"enableQueryByHashPrefix":{"message":"Αιτήματα μέσω προθέματος Hash"},"whatQueryByHashPrefix":{"message":"Αντί να ζητάτε τα τμήματα από τον διακομιστή μέσω ολόκληρης της ταυτότητας του βίντεο, στέλνονται μόνο οι πρώτοι 4 κομμένοι χαρακτήρες από την ταυτότητα του βίντεο. Ο διακομιστής στέλνει πίσω δεδομένα για όλα τα βίντεο με παρόμοιους κομμένους χαρακτήρες."},"enableShowCategoryWithoutPermission":{"message":"Εμφάνιση κατηγοριών στο μενού υποβολής ακόμα και χωρίς άδεια υποβολής"},"whatShowCategoryWithoutPermission":{"message":"Ορισμένες κατηγορίες απαιτούν άδεια υποβολής λόγω ελάχιστων απαιτήσεων φήμης"},"showNotice":{"message":"Επανεμφάνιση ειδοποιήσεων"},"showSkipNotice":{"message":"Εμφάνιση ειδοποιήσεων μετά την παράλειψη κάθε τμήματος"},"showUpcomingNotice":{"message":"Εμφάνιση ειδοποίησης πριν ξεκινήσει ένα τμήμα"},"showCategoryGuidelines":{"message":"Εμφάνιση βοήθειας κατηγοριών"},"noticeVisibilityMode0":{"message":"Ειδοποιήσεις παράλειψης πλήρους μεγέθους"},"noticeVisibilityMode1":{"message":"Μικρές ειδοποιήσεις αυτόματης παράλειψης"},"noticeVisibilityMode2":{"message":"Να είναι όλες μικρές ειδοποιήσεις"},"noticeVisibilityMode3":{"message":"Ξεθωριασμένες ειδοποιήσεις αυτόματης παράλειψης"},"noticeVisibilityMode4":{"message":"Να είναι όλες ξεθωριασμένες ειδοποιήσεις"},"longDescription":{"message":"Το SponsorBlock σας επιτρέπει να παραλείψετε χορηγίες, εισαγωγές, επίλογους, υπενθυμίσεις εγγραφής, και άλλα ενοχλητικά μέρη των βίντεο YouTube. Το SponsorBlock είναι μια επέκταση που τροφοδοτείται, από τους ίδιους τους χρήστες, επιτρέπει στον κάθε έναν να υποβάλει το πότε ξεκινούν και πότε τελειώνουν τμήματα χορηγιών των βίντεο YouTube. Μόλις κάποιος χρήστης υποβάλει αυτή τη πληροφορία, ο οποιοσδήποτε άλλος που έχει αυτήν την επέκταση μπορεί να παραλείψει όλα αυτά τα ενοχλητικά τμήματα χορηγιών. Μπορείτε επίσης να παραλείψετε τμήματα, που δεν περιέχουν μουσική, σε μουσικά βίντεο.","description":"Full description of the extension on the store pages."},"website":{"message":"Ιστοσελίδα","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Πηγαίος Κώδικας","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Οι ειδοποιήσεις αναβαθμίστηκαν!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Εάν δεν σας αρέσουν, πατήστε το κουμπί «Να μην ξαναεμφανιστεί».","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Παράλειψη τμήματος","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Έναρξη/Τέλος τμήματος","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Άνοιγμα μενού υποβολής","description":"Keybind label"},"setSubmitKeybind":{"message":"Υποβολή Τμημάτων","description":"Keybind label"},"setPreviewKeybind":{"message":"Προεπισκόπηση τμήματος","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Κλείσιμο ειδοποίησης παράλειψης","description":"Keybind label"},"setDownvoteKeybind":{"message":"Καταψήφιση τμήματος","description":"Keybind label"},"setUpvoteKeybind":{"message":"Υπερψήφιση τμήματος","description":"Keybind label"},"nextChapterKeybind":{"message":"Επόμενο κεφάλαιο","description":"Keybind label"},"previousChapterKeybind":{"message":"Προηγούμενο κεφάλαιο","description":"Keybind label"},"enableDeArrowKey":{"message":"Εναλλαγή ενεργοποίησης DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Άνοιγμα μενού υποβολής","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Επιλέξτε ένα πλήκτρο πατώντας το και επιλέξτε όποιο πρόσθετο πλήκτρο ελέγχου επιθυμείτε."},"disableSkipping":{"message":"Η παράλειψη είναι ενεργή"},"enableSkipping":{"message":"Η παράλειψη είναι ανενεργή"},"yourWork":{"message":"Η δουλειά σας","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Κωδικός σφάλματος: "},"skip":{"message":"Παράλειψη"},"mute":{"message":"Σίγαση"},"full":{"message":"Όλο το βίντεο","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Παράλειψη {0};"},"mute_category":{"message":"Σίγαση {0};"},"skip_to_category":{"message":"Παράλειψη προς το σημείο «{0}»;","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Επερχόμενο {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"Παραλείφθηκε «{0}»","description":"Example: Sponsor Skipped"},"muted":{"message":"Σίγαση {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Παραλείφθηκε προς το σημείο «{0}»","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Ψηφίστηκε το {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Απενεργοποίηση Αυτόματης Παράλειψης"},"enableAutoSkip":{"message":"Ενεργοποίηση Αυτόματης Παράλειψης"},"audioNotification":{"message":"Ηχητική ειδοποίηση κατά την παράληψη"},"audioNotificationDescription":{"message":"Οι ειδοποιήσεις μετά την παράλειψη κάθε τμήματος θα αναπαράγουν ήχο. Εάν είναι ανενεργή αυτή η επιλογή εκτός αν η αυτόματη παράλειψη είναι ανενεργή."},"showTimeWithSkips":{"message":"Εμφάνιση χρόνου συμπεριλαμβάνοντας τις παραλείψεις"},"showTimeWithSkipsDescription":{"message":"Αυτός ο χρόνος εμφανίζεται σε παρενθέσεις δίπλα από τον τρέχων χρόνο που είναι κάτω από την μπάρα χρόνου. Αυτό δείχνει την συνολική διάρκεια του βίντεο πλην οποιουδήποτε τμήματος. Αυτό περιλαμβάνει και τα τμήματα που εμφανίζονται μόνο στην μπάρα χρόνου."},"youHaveSkipped":{"message":"Έχετε παραλείψει "},"minLower":{"message":"λεπτό"},"minsLower":{"message":"λεπτά"},"hourLower":{"message":"ώρα"},"hoursLower":{"message":"ώρες"},"youHaveSavedTime":{"message":"Έχετε γλιτώσει τον κόσμο από","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" της ζωής τους","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Ελέγξτε το status.sponsor.ajay.app για την κατάσταση διακομιστή."},"changeUserID":{"message":"Εισαγωγή/Εξαγωγή του ιδιωτικού σας UserID"},"whatChangeUserID":{"message":"Κρατείστε το μυστικό. Αυτό είναι σαν ένα κωδικό πρόσβασης όπου δε θα έπρεπε να μοιράζεστε με κανένα. Εάν το αποκτήσει κάποιος, μπορεί να σας υποδυθεί. Εάν ψάχνετε για τη δημόσια ταυτότητα χρήστη σας, πατήστε πάνω στο αναδυόμενο εικονίδιο πρόχειρου."},"setUserID":{"message":"Ορισμός Ιδιωτικού UserID"},"userIDChangeWarning":{"message":"Προσοχή: Η αλλαγή του Ιδιωτικού UserID είναι μόνιμη. Είστε βέβαιοι ότι θέλετε να το αλλάξετε; Βεβαιωθείτε ότι έχετε δημιουργήσει αντίγραφο ασφαλείας του παλιού σας για παν ενδεχόμενο."},"createdBy":{"message":"Δημιουργήθηκε από"},"supportOtherSites":{"message":"Υποστήριξη 3των ιστοσελίδων τύπου YouTube"},"supportOtherSitesDescription":{"message":"Υποστήριξη τρίτων YouTube πελατών. Για να ενεργοποιήσετε την υποστήριξη, πρέπει να αποδεχτείτε τις επιπλέον άδειες.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Υποστηριζόμενες Ιστοσελίδες: "},"optionsInfo":{"message":"Ενεργοποίηση υποστήριξης «Invidious», απενεργοποίηση αυτόματης παράλειψης, απόκρυψη κουμπιών και άλλα."},"addInvidiousInstance":{"message":"Προσθήκη 3ου πελάτη συνεδρίας"},"addInvidiousInstanceDescription":{"message":"Προσθέστε μια προσαρμοσμένη συνεδρία. Αυτό πρέπει να είναι μορφοποιημένο MONO με την διεύθυνση. Για παράδειγμα: invidious.ajay.app"},"add":{"message":"Προσθήκη"},"addInvidiousInstanceError":{"message":"Μη έγκυρη διεύθυνση. Θα πρέπει να περιλαμβάνεται ΜΟΝΟ αυτό το μέρος της διεύθυνσης.\nΓια παράδειγμα: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Επαναφορά Λίστας «Invidious»"},"resetInvidiousInstanceAlert":{"message":"Πρόκειται να επαναφέρετε τη λίστα «Invidious»"},"invidiousDisabledSafari":{"message":"Η υποστήριξη Invidious δεν είναι διαθέσιμη στο Safari αυτή τη στιγμή λόγω σφάλματος στο Safari. Όταν η Apple διορθώσει το σφάλμα, θα προστεθεί ξανά."},"currentInstances":{"message":"Τρέχουσες Συνεδρίες:"},"minDuration":{"message":"Ελάχιστη διάρκεια (σε δευτερόλεπτα):"},"minDurationDescription":{"message":"Τμήματα μικρότερα από την καθορισμένη τιμή δε θα παραλείπονται ή δε θα εμφανίζονται στην οθόνη αναπαραγωγής."},"enableManualSkipOnFullVideo":{"message":"Χρήση χειροκίνητης παράλειψης όταν υπάρχει μια πλήρης ετικέτα βίντεο"},"whatManualSkipOnFullVideo":{"message":"Για τους ανθρώπους που θέλουν να παρακολουθήσουν το βίντεο αδιάκοπα αν είναι πλήρως χορηγούμενο ή αυτοπροωθούμενο."},"skipNoticeDuration":{"message":"Διάρκεια ειδοποίησης παράλειψης (σε δευτερόλεπτα):"},"skipNoticeDurationDescription":{"message":"Η ειδοποίηση παράλειψης θα παραμείνει στην οθόνη για τουλάχιστον τόσα δευτερόλεπτα. Στη μη αυτόματη παράκαμψη, μπορεί να είναι ορατή για μεγαλύτερο χρονικό διάστημα."},"shortCheck":{"message":"Η ακόλουθη υποβολή είναι μικρότερη από την επιλεγμένη ελάχιστη διάρκεια. Αυτό θα μπορούσε να σημαίνει ότι αυτό το τμήμα έχει ήδη υποβληθεί, και απλά αγνοείται λόγω αυτής της επιλογής. Είστε σίγουροι ότι θα θέλατε να το υποβάλετε;"},"liveOrPremiere":{"message":"Η υποβολή σε μια ζωντανή μετάδοση σε εξέλιξη ή σε μια πρεμιέρα δεν επιτρέπεται. Παρακαλώ περιμένετε μέχρι να τελειώσει, στην συνέχεια ανανεώστε την σελίδα και επαληθεύστε ότι τα τμήματα είναι έγκυρα."},"showUploadButton":{"message":"Εμφάνιση κουμπιού υποβολής"},"customServerAddress":{"message":"Διεύθυνση Διακομιστή SponsorBlock"},"customServerAddressDescription":{"message":"Η διεύθυνση που χρησιμοποιείται για την επικοινωνία με τον διακομιστή του SponsorBlock. Εάν δε διαθέτετε το δικό σας διακομιστή, αυτή η επιλογή δεν πρέπει να αλλάξει."},"dataFetchingServerAddress":{"message":"Διεύθυνση ανάκτησης δεδομένων διακομιστή"},"dataFetchingServerAddressDescription":{"message":"Η διεύθυνση που χρησιμοποιείται για την επικοινωνία με τον διακομιστή ανάκτησης δεδομένων. Εάν δε διαθέτετε το δικό σας διακομιστή, αυτή η επιλογή δεν πρέπει να αλλάξει."},"thumbnailCacheServerAddress":{"message":"Διεύθυνση διακομιστή προσωρινής μνήμης μικρογραφίας"},"save":{"message":"Αποθήκευση"},"reset":{"message":"Επαναφορά"},"customAddressError":{"message":"Η διεύθυνση δεν έχει τη σωστή μορφή. Παρακαλώ ελέγξτε ότι έχετε http:// ή https:// στην αρχή της χωρίς κάθετους στο τέλος."},"areYouSureReset":{"message":"Είστε σίγουροι ότι θέλετε να το επαναφέρετε;"},"mobileUpdateInfo":{"message":"Το m.youtube.com υποστηρίζεται πλέον"},"exportOptions":{"message":"Εισαγωγή/Εξαγωγή όλων των ρυθμίσεων"},"exportOtherData":{"message":"Εισαγωγή/Εξαγωγή Όλων Των Άλλων Δεδομένων"},"exportOptionsCopy":{"message":"Επεξεργασία/αντιγραφή"},"exportOptionsDownload":{"message":"Αποθήκευση σε αρχείο"},"exportOptionsUpload":{"message":"Φόρτωση από αρχείο"},"whatExportOptions":{"message":"Αυτές είναι όλες σας οι ρυθμίσεις σε αρχείο JSON. Αυτό περιλαμβάνει και την ιδιωτική ταυτότητα χρήστη, οπότε μοιραστείτε το με προσοχή."},"setOptions":{"message":"Ορισμός Επιλογών"},"exportOptionsWarning":{"message":"Προσοχή: Η αλλαγή των επιλογών είναι μόνιμη και μπορεί να χαλάσει την εγκατάσταση σας. Είσαστε σίγουροι ότι θέλετε να προχωρήσετε; Σιγουρευτείτε ότι έχετε δημιουργήσει αντίγραφο ασφαλείας για καλό και για κακό."},"incorrectlyFormattedOptions":{"message":"Αυτό το JSON δεν έχει μορφοποιηθεί σωστά. Οι ρυθμίσεις σας δεν έχουν αλλάξει."},"confirmNoticeTitle":{"message":"Υποβολή Τμήματος"},"submit":{"message":"Υποβολή"},"cancel":{"message":"Ακύρωση"},"delete":{"message":"Διαγραφή"},"preview":{"message":"Προεπισκόπηση"},"unsubmitted":{"message":"Μη Υποβληθέντα"},"inspect":{"message":"Επιθεώρηση"},"edit":{"message":"Επεξεργασία"},"copyDebugLogs":{"message":"Αντιγραφή Καταγραφών Σφαλμάτων"},"copyDebugInformation":{"message":"Αντιγραφή πληροφοριών αντιμετώπισης προβλημάτων στο πρόχειρο"},"copyDebugInformationFailed":{"message":"Αδυναμία εγγραφής στο πρόχειρο"},"copyDebugInformationOptions":{"message":"Αντιγράφει πληροφορίες αντιμετώπισης προβλημάτων στο πρόχειρο, ώστε να μπορέσετε να τις στείλετε στον προγραμματιστή όταν αναφέρετε κάποιο σφάλμα / όταν ο προγραμματιστής σας το ζητήσει. Ευαίσθητες πληροφορίες όπως η ταυτότητα χρήστη σας, η λίστα αποδοχής καναλιών και η προσαρμοσμένη διεύθυνση διακομιστή έχουν αφαιρεθεί. Αλλά περιέχει πληροφορίες για τον περιηγητή ιστού σας, τον τύπο δυσκευής, το λειτουργικό σύστημα, και τον αριθμό έκδοσης της επέκτασης. "},"copyDebugInformationComplete":{"message":"Οι πληροφορίες εντοπισμού σφαλμάτων έχουν αντιγραφεί στο πρόχειρο. Μη διστάσετε να αφαιρέσετε οποιαδήποτε πληροφορία που προτιμάτε να μη μοιραστείτε. Αποθηκεύστε τες σε ένα αρχείο κειμένου ή επικολλήστε στην αναφορά σφάλματός σας."},"keyAlreadyUsed":{"message":"Αυτό το πλήκτρο έχει οριστεί ως συντόμευση για άλλη ενέργεια. Παρακαλώ επιλέξτε ένα άλλο πλήκτρο."},"to":{"message":"έως","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Αντιγράφηκε!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Συμπερίληψη τμημάτων μεταβάσεων"},"generic_guideline2":{"message":"Ροή περιεχομένου σαν να μην υπήρξε ποτέ παράλειψη"},"category_sponsor":{"message":"Χορηγία"},"category_sponsor_description":{"message":"Προώθηση επί πληρωμή, παραπομπές επί πληρωμή και άμεσες διαφημίσεις. Όχι, για προσωπική προώθηση ή δωρεάν αναφορές σε δημιουργούς/ιστοσελίδες/προϊόντα που τους αρέσουν."},"category_sponsor_guideline1":{"message":"Προώθηση επί πληρωμή"},"category_sponsor_guideline2":{"message":"Όχι για δωρεές ή προσαρμοσμένα προϊόντα"},"category_selfpromo":{"message":"Αφιλοκέρδεια/Προσωπική Προώθηση"},"category_selfpromo_description":{"message":"Παρόμοιο με τη «χορηγία» αλλά για μη κερδοσκοπικό σκοπό ή για προσωπική προώθηση. Αυτό συμπεριλαμβάνει τμήματα από εμπορεύματα, δωρεές, ή πληροφορίες σχετικές με το ποιους συνεργάστηκαν."},"category_selfpromo_guideline1":{"message":"Δωρεές, συνδρομές και προσαρμοσμένα προϊόντα"},"category_selfpromo_guideline2":{"message":"Δωρεάν αναφορές που δεν προστίθενται στο βίντεο"},"category_selfpromo_guideline3":{"message":"Όχι για προϊόντα ή ρουχισμό που έχει κατασκευαστεί από αλυσίδες επιχειρήσεων"},"category_exclusive_access":{"message":"Αποκλειστική Πρόσβαση"},"category_exclusive_access_description":{"message":"Μόνο για χαρακτηρισμό ολοκλήρου του βίντεο. Χρησιμοποιείται όταν ένα βίντεο παρουσιάζει ένα προϊόν, υπηρεσία, ή τοποθεσία αποκλειστικής ή δωρεάν πρόσβασής τους."},"category_exclusive_access_pill":{"message":"Αυτό το βίντεο παρουσιάζει ένα προϊόν, υπηρεσία, ή τοποθεσία αποκλειστικής ή δωρεάν πρόσβασής τους","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Ολόκληρο το βίντεο παρουσιάζει κάτι με δωρεάν ή επιδοτούμενη πρόσβαση"},"category_interaction":{"message":"Υπενθύμιση Αλληλεπίδρασης (Εγγραφή)"},"category_interaction_description":{"message":"Όταν υπάρχει μια σύντομη υπενθύμιση για να προσθέσετε το βίντεο στα βίντεο που σας αρέσουν, να εγγραφείτε ή να τους ακολουθήσετε στη μέση του περιεχομένου. Εάν διαρκεί για αρκετή ώρα, τότε αυτό περιλαμβάνεται στη κατηγορία «προσωπική προώθηση»."},"category_interaction_guideline1":{"message":"Σύντομες υπενθυμίσεις εγγραφής, μου αρέσει και ακολούθησης"},"category_interaction_guideline2":{"message":"Περιλαμβάνει έμμεσες υπενθυμίσεις για σχόλια"},"category_interaction_guideline3":{"message":"Όχι για γενικότερες προωθήσεις, μόνο για εκκλήσεις βοήθειας"},"category_interaction_short":{"message":"Υπενθύμιση Αλληλεπίδρασης"},"category_intro":{"message":"Παύση/Εισαγωγή με Animation"},"category_intro_description":{"message":"Ένα διάστημα χωρίς ουσιαστικό περιεχόμενο. Θα μπορούσε να είναι κάποια παύση, στατική εικόνα, επαναλαμβανόμενο animation. Δεν πρέπει να επιλέγεται για μεταβάσεις που περιέχουν πληροφορίες."},"category_intro_short":{"message":"Διάλειμμα"},"category_intro_guideline1":{"message":"Χρονικό διάστημα χωρίς ουσιαστικό περιεχόμενο"},"category_intro_guideline2":{"message":"Όχι για μεταβάσεις που συμπεριλαμβάνουν πληροφορίες"},"category_outro":{"message":"Προτεινόμενα βίντεο καναλιών/Εύσημα"},"category_outro_description":{"message":"Όταν εμφανίζονται τα εύσημα ή τα προτεινόμενα βίντεο των καναλιών. Όχι, για επίλογους που περιέχουν πληροφορίες."},"category_outro_guideline1":{"message":"Μη συμπερίληψη περιεχομένου, ακόμα και αν τα προτεινόμενα βίντεο βρίσκονται στην οθόνη"},"category_preview_description":{"message":"Συλλογή από κλιπ που δείχνουν τι έρχεται σε αυτό το βίντεο ή άλλα βίντεο σε μια σειρά όπου όλες οι πληροφορίες επαναλαμβάνονται αργότερα στο βίντεο."},"category_preview_guideline1":{"message":"Κλιπ που εμφανίζονται μετά, ή σε μελλοντικά βίντεο"},"category_preview_guideline2":{"message":"Ανακεφαλαίωση προηγούμενου βίντεο"},"category_preview_guideline3":{"message":"Όχι για μέρη που περιλαμβάνουν πρόσθετο περιεχόμενο"},"category_filler":{"message":"Εφαπτόμενα/Αστεία"},"category_filler_description":{"message":"Εφαπτόμενες σκηνές ή αστεία που δεν απαιτούνται για τη κατανόηση του κυριώς περιεχομένου του βίντεο. Αυτό δε θα πρέπει να περιλαμβάνει τμήματα που παρέχουν επεξήγηση ή λεπτομέρειες εις βάθος. Πρόκειται για μια πολύ επιθετική κατηγορία που προορίζεται για όταν δεν είστε σε διάθεση για \"διασκέδαση\"."},"category_filler_short":{"message":"Εφαπτόμενα"},"category_filler_guideline1":{"message":"Εφαπτόμενες σκηνές ή αστεία"},"category_filler_guideline2":{"message":"Αποσπάσεις, επαναλήψεις, αποτυχημένες λήψεις"},"category_filler_guideline3":{"message":"Όχι για σκηνές που απαιτούνται για την κατανόηση του θέματος"},"category_music_offtopic":{"message":"Μουσική: Τμήμα χωρίς μουσική"},"category_music_offtopic_description":{"message":"Μόνο για χρήση σε βίντεο μουσικής. Αυτό θα πρέπει να χρησιμοποιείται μόνο για τμήματα βίντεο μουσικής που δεν καλύπτονται ήδη από κάποια άλλη κατηγορία."},"category_music_offtopic_short":{"message":"Χωρίς Μουσική"},"category_music_offtopic_guideline1":{"message":"Μέρη τα οποία δεν έχουν κυκλοφορήσει επίσημα"},"category_music_offtopic_guideline2":{"message":"Χωρίς μουσική σε ζωντανή συναυλία"},"category_poi_highlight":{"message":"Καλύτερη στιγμή"},"category_poi_highlight_description":{"message":"Το κομμάτι του βίντεο που ψάχνουν να δουν οι περισσότεροι άνθρωποι. Παρόμοιο με το «Το βίντεο ξεκινάει από το x σημείο» στα σχόλια."},"category_poi_highlight_guideline1":{"message":"Το μέρος που ψάχνουν οι περισσότεροι"},"category_poi_highlight_guideline2":{"message":"Ίσως παραλειφθεί κάτι που συμβάλει στην κατανόηση"},"category_poi_highlight_guideline3":{"message":"Παράλειψη προς το περιεχόμενο όπου παρουσιάζεται στον τίτλο ή το εικονίδιο"},"category_chapter":{"message":"Κεφάλαιο"},"category_chapter_description":{"message":"Προσαρμοσμένα ονόματα κεφαλαίων που περιγράφουν σημαντικές ενότητες ενός βίντεο."},"category_chapter_guideline1":{"message":"Μην αναφέρετε τα εμπορικά ονόματα χορηγών"},"category_chapter_guideline2":{"message":"Χρησιμοποιήστε μεγαλύτερα κεφάλαια για γενικά τμήματα"},"category_chapter_guideline3":{"message":"Μικρότερα κεφάλαια μπορούν να τοποθετηθούν μέσα σε μεγαλύτερα"},"category_livestream_messages":{"message":"Ζωντανή μετάδοση: Δωρεές/Ανάγνωση Μηνυμάτων από δωρεές"},"category_livestream_messages_short":{"message":"Ανάγνωση Μηνυμάτων"},"autoSkip":{"message":"Αυτόματη Παράλειψη"},"manualSkip":{"message":"Χειροκίνητη Παράλειψη"},"showOverlay":{"message":"Εμφάνιση στην μπάρα χρόνου"},"disable":{"message":"Απενεργοποίηση"},"autoSkip_POI":{"message":"Αυτόματη παράλειψη στην αρχή του τμήματος"},"manualSkip_POI":{"message":"Ερώτηση μόλις φορτώνει το βίντεο"},"showOverlay_POI":{"message":"Εμφάνιση στην μπάρα χρόνου"},"showOverlay_full":{"message":"Εμφάνιση Ετικέτας"},"showOverlay_chapter":{"message":"Εμφάνιση κεφαλαίων"},"autoSkipOnMusicVideos":{"message":"Αυτόματη παράλειψη όλων των τμημάτων όταν είναι «Χωρίς μουσική»"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Αυτόματη παράλειψη μόνο στο music.youtube.com"},"muteSegments":{"message":"Επιτρέψτε τμήματα που κάνουν σίγαση αντί για παράλειψη"},"fullVideoSegments":{"message":"Εμφάνιση εικονιδίου όταν όλο το βίντεο είναι διαφημιστικό εξολοκλήρου","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Εμφάνιση ετικετών και στις μικρογραφίες βίντεο","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Χρώμα Μη Υποβληθέντων","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Χρώμα Μπάρας Χρόνου"},"category":{"message":"Κατηγορία"},"skipOption":{"message":"Παράλειψη Επιλογής","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Άνοιγμα προηγμένων επιλογών παράλειψης"},"advancedSkipNotSaved":{"message":"Συντακτικό σφάλμα: Οι επιλογές σας δεν έχουν αποθηκευτεί"},"advancedSkipSettingsHelp":{"message":"Πώς λειτουργεί αυτό","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Ενεργοποίηση διακομιστή δοκιμαστικών λειτουργιών"},"whatEnableTestingServer":{"message":"Οι υποβολές και οι ψήφοι ΔΕΝ ΘΑ ΜΕΤΡΗΣΟΥΝ προς τον κεντρικό διακομιστή. Χρησιμοποίησέ το μόνο για δοκιμή."},"testingServerWarning":{"message":"Όλες οι υποβολές και οι ψήφοι ΔΕΝ ΘΑ ΜΕΤΡΙΣΟΥΝ στον κύριο διακομιστή κατά τη σύνδεση με τον δοκιμαστικό διακομιστή. Σιγουρευτείτε για να την απενεργοποιήσετε όταν θέλετε να κάνετε πραγματικές υποβολές."},"bracketNow":{"message":"(εδώ)"},"moreCategories":{"message":"Περισσότερες κατηγορίες"},"chooseACategory":{"message":"Επιλέξτε μια κατηγορία"},"enableThisCategoryFirst":{"message":"Για να υποβάλετε τμήματα της «{0}» κατηγορίας, πρέπει να την ενεργοποιήσετε στις ρυθμίσεις. Θα μεταφερθείτε στις ρυθμίσεις τώρα.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Προσοχή: Αυτός ο τύπος τμήματος μπορεί να υπάρξει μόνο μια φορά. Εάν υποβάλετε πολλαπλά τότε εμφανίζεται ένα από τα τμήματα στην τύχη."},"youMustSelectACategory":{"message":"Πρέπει να επιλέξετε Κατηγορία για όλα τα τμήματα που υποβάλετε!"},"bracketStart":{"message":"(Έναρξη)"},"bracketEnd":{"message":"(τέλος)"},"End":{"message":"Τέλος","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"κρυφό: αρνητική ψήφος"},"hiddenDueToDuration":{"message":"κρυφό: πολύ κοντό"},"manuallyHidden":{"message":"χειροκίνητη απόκρυψη"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Η ταυτότητα καναλιού δεν έχει φορτώσει ακόμα. Εάν χρησιμοποιείτε ενσωματωμένο βίντεο, δοκιμάστε αντιθέτως να το ανοίξετε στο YouTube. Μπορεί επίσης να ευθύνονται αλλαγές στη διάταξη του YouTube, εάν το πιστεύετε, γράψτε ένα σχόλιο εδώ:"},"invidiousPermissionRefresh":{"message":"Το πρόγραμμα περιήγησης έχει ανακαλέσει την άδεια που απαιτείται για να λειτουργήσει σε Invidious και άλλους ιστότοπους τρίτων. Παρακαλώ κάντε κλικ στο παρακάτω κουμπί για να επανενεργοποιήσετε αυτή την άδεια."},"acceptPermission":{"message":"Αποδεχτείτε την άδεια"},"permissionRequestSuccess":{"message":"Επιτυχείς αίτηση της άδειας!"},"permissionRequestFailed":{"message":"Η αίτηση της άδειας απέτυχε, πατήσατε απόρριψη;"},"adblockerIssueWhitelist":{"message":"Εάν δεν μπορείτε να το επιδιορθώσετε, απενεργοποιείστε την επιλογή «Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη», καθώς το SponsorBlock δεν μπόρεσε να ανακτήσει τις πληροφορίες του καναλιού αυτού του βίντεο"},"forceChannelCheck":{"message":"Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη"},"whatForceChannelCheck":{"message":"Από προεπιλογή, παραλείπονται τμήματα αμέσως πριν ακόμα ανοιχνευτεί ποιό κανάλι είναι. Από προεπιλογή, ορισμένα τμήματα στην αρχή του βίντεο μπορεί να παραλείπονται στα επιτρεπόμενα κανάλια που είναι στην «Λίστα αποδοχής». Η ενεργοποίηση αυτής της επιλογής θα το αποτρέψει αυτό, αλλά μετά η παράλειψη όλων των τμημάτων θα έχει μια μικρή καθυστέρηση, καθώς η απόκτυση της ταυτότητας καναλιού μπορεί να πάρει κάμποσο χρόνο. Αυτή η καθυστέρηση μπορεί να είναι μη αντιληπτή αν έχετε γρήγορη σύνδεση στο διαδίκτυο."},"forceChannelCheckPopup":{"message":"Σκεφτείτε να ενεργοποιήσετε τη ρύθμιση «Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη»"},"downvoteDescription":{"message":"Λάθος Συγχρονισμός"},"incorrectVote":{"message":"Λάθος"},"harmfulVote":{"message":"Επιβλαβές","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Αλλαγή κατηγορίας"},"nonMusicCategoryOnMusic":{"message":"Αυτό το βίντεο έχει κατηγοριοποιηθεί ως μουσική. Είσαστε σίγουροι ότι έχει χορηγία; Εάν είναι ένα τμήμα «Χωρίς μουσική», ανοίξτε τις επιλογές της επέκτασης και ενεργοποιήστε αυτήν την κατηγορία. Μετά μπορείτε, να υποβάλετε αυτό το τμήμα ως «Χωρίς μουσική», αντί για χορηγία. Παρακαλώ διαβάστε τις οδηγίες, εάν είστε μπερδεμένοι."},"multipleSegments":{"message":"Πολλαπλά Τμήματα"},"guidelines":{"message":"Οδηγίες"},"readTheGuidelines":{"message":"Διάβασε τις οδηγίες!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Οι κατηγορίες είναι εδώ!"},"categoryUpdate2":{"message":"Άνοιξε τις επιλογές για την παράλειψη τίτλων αρχής-τέλους, πωλήσεων κ. α."},"help":{"message":"Βοήθεια"},"GotIt":{"message":"Το' χω","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Αυτό το τμήμα είναι μεγάλο. Αν όλο το βίντεο έχει να κάνει με ένα θέμα, τότε αλλάξτε την επιλογή από \"Παράλειψη\" σε \"Όλο το βίντεο\". Δείτε τις οδηγίες για περισσότερες πληροφορίες."},"categoryPillTitleText":{"message":"Ολόκληρο το βίντεο έχει χαρακτηριστεί ως αυτής της κατηγορίας οπότε είναι αυστηρά ενσωματωμένη ώστε να μπορείτε να το διαφοροποιήσετε σε τμήματα"},"chapterNameTooltipWarning":{"message":"Ένα από τα ονόματα κεφαλαίων σας είναι παρόμοιο με μια κατηγορία. Θα πρέπει να χρησιμοποιείτε κατηγορίες όταν είναι εφικτό."},"experiementOptOut":{"message":"Αποχή από μελλοντικά πειράματα","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Απόκρυψη για πάντα"},"warningChatInfo":{"message":"Παρατηρήσαμε ότι κάνατε κάποια κοινά λάθη. Εκτιμούμε πολύ το έργο σας μέχρι στιγμής, αλλά αγωνιζόμαστε προς την τελειότητα εδώ, οπότε ακόμα και πολύ μικρά λάθη έχουν σημασία:)"},"questionButton":{"message":"Έχω μια ερώτηση"},"askAQuestion":{"message":"Κάντε μια ερώτηση"},"warningConfirmButton":{"message":"Κατανοώ το λόγο"},"warningError":{"message":"Σφάλμα κατά τη γνωστοποίηση της προειδοποίησης:"},"deArrowMessageRecieved":{"message":"Έχετε λάβει μια συμβουλή από έναν συντονιστή"},"Donate":{"message":"Δωρεά"},"considerDonating":{"message":"Χρηματική βοήθεια για την ανάπτυξή μας"},"hideDonationLink":{"message":"Απόκρυψη Συνδέσμου Δωρεάς"},"darkModeOptionsPage":{"message":"Σκουρόχρωμη Λειτουργία στη σελίδα Ρυθμίσεις"},"helpPageThanksForInstalling":{"message":"Ευχαριστούμε που εγκαταστήσατε το SponsorBlock."},"helpPageReviewOptions":{"message":"Παρακαλώ ελέγξτε τις παρακάτω ρυθμίσεις"},"helpPageFeatureDisclaimer":{"message":"Πολλές δυνατότητες είναι ανενεργές από προεπιλογή. Εάν θέλετε να παραλείπετε εισαγωγές, επίλογους, χρήση «Invidious», κτλ., ενεργοποιήστε τα παρακάτω. Μπορείτε επίσης να κρύψετε/εμφανίσετε στοιχεία της διεπαφής."},"helpPageHowSkippingWorks2":{"message":"Κάθε φορά που παραλείπετε κάποιο τμήμα, θα λαμβάνετε ειδοποίηση. Εάν ο συγχρονισμός σας φαίνεται λάθος, ψηφίστε αρνητικά πατώντας το εικονίδιο! Μπορείτε επίσης να ψηφίσετε μέσω του αναδυόμενου παράθυρου."},"Submitting":{"message":"Υποβολή"},"helpPageCopyOfDatabase2":{"message":"Ο πηγαίος κώδικας είναι δημόσια διαθέσιμος. Έτσι ώστε, ακόμα και αν συμβεί κάτι σε εμάς, οι υποβολές σας δε θα χαθούν."},"Credits":{"message":"Εύσημα"},"LearnMore":{"message":"Μάθετε περισσότερα"},"FullDetails":{"message":"Πλήρεις Λεπτομέρειες"},"CopyDownvoteButtonInfo":{"message":"Καταψήφιση και δημιουργία τοπικού αντίγραφου για επανάληψη υποβολής"},"OpenCategoryWikiPage":{"message":"Άνοιγμα σελίδας wiki της κατηγορίας."},"CopyAndDownvote":{"message":"Αντίγραφο και καταψήφιση"},"ContinueVoting":{"message":"Συνεχίστε την ψηφοφορία"},"ChangeCategoryTooltip":{"message":"Αυτό θα εφαρμοστεί απευθείας στα τμήματά σας"},"downvote":{"message":"Αρνητική ψήφος"},"upvote":{"message":"Θετική ψήφος"},"hideSegment":{"message":"Απόκρυψη τμήματος"},"skipSegment":{"message":"Παράλειψη τμήματος"},"playChapter":{"message":"Αναπαραγωγή κεφαλαίου"},"SponsorTimeEditScrollNewFeature":{"message":"Χρήση της ροδέλας ποντικιού καθώς είναι πάνω από το παράθυρο επεξεργασίας για να αλλάξετε γρηγορότερα τον χρόνο. Συνδυασμοί όπως το ctrl ή το shift χρησιμοποιούνται για να τελειοποιήσετε τις αλλαγές."},"categoryPillNewFeature":{"message":"Νέο! Δείτε ποτέ ένα βίντεο αποτελείται εξολοκλήρου από προσωπικές προωθήσεις ή χορηγίες"},"yearAbbreviation":{"message":"έ","description":"100y"},"dayAbbreviation":{"message":"ημ","description":"100d"},"hourAbbreviation":{"message":"ω","description":"100h"},"optionsTabBehavior":{"message":"Συμπεριφορά παραλ.","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Διεπαφή","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Συντομεύσεις πλήκτρων","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Αντίγραφο/Επαναφορά","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Διάφορα","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Εμφάνιση ειδοποίησης παράλειψης","description":"Option label"},"unbind":{"message":"Αφαίρεση","description":"Unbind keyboard shortcut"},"notSet":{"message":"Δεν έχει οριστεί"},"change":{"message":"Αλλαγή"},"youtubeKeybindWarning":{"message":"Αυτή η συντόμευση χρησιμοποιείται από το YouTube. Σίγουρα θέλετε να την χρησιμοποιήσετε;"},"betaServerWarning":{"message":"Ο Δοκιμαστικός Διακομιστής είναι ενεργός!"},"openOptionsPage":{"message":"Άνοιγμα σελίδας ρυθμίσεων"},"resetToDefault":{"message":"Επαναφορά των προκαθορισμένων ρυθμίσεων"},"confirmResetToDefault":{"message":"Είστε βέβαιοι ότι θέλετε να επαναφέρετε όλες τις ρυθμίσεις στις προεπιλεγμένες τιμές τους; Αυτό δεν μπορεί να αναιρεθεί."},"exportSegments":{"message":"Εξαγωγή τμημάτων"},"importSegments":{"message":"Εισαγωγή τμημάτων"},"Import":{"message":"Εισαγωγή","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Επιτυχής Εξαργύρωση!"},"redeemFailed":{"message":"Το κλειδί άδειας δεν είναι έγκυρο"},"hideUpsells":{"message":"Η απόκρυψη ρυθμίσεων δεν είναι διαθέσιμη χωρίς επιπλέον πληρωμή"},"hideNewFeatureUpdates":{"message":"Απόκρυψη πληροφοριών σχετικά με νέες λειτουργίες"},"redeem":{"message":"Εξαργύρωση"},"enterLicenseKey":{"message":"Εισαγωγή κλειδιού της άδειας χρήσης"},"unsubmittedSegmentCounts":{"message":"Αυτή τη στιγμή έχετε {0} σε {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Αυτή τη στιγμή δεν έχετε μη υποβληθέντα τμήματα","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"μη υποβληθέν τμήμα","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"μη υποβληθέντα τμήματα","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"βίντεο","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"βίντεο","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Καθαρισμός όλων των τμημάτων","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Είστε βέβαιοι ότι θέλετε να καθαρίσετε όλα τα μη υποβληθέντα τμήματά σας;","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Εμφάνιση τμημάτων","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Απόκρυψη τμημάτων","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID Βίντεο","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Αριθμός τμημάτων","description":"Header of the unsubmitted segments list"},"actions":{"message":"Ενέργειες","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Κοινή χρήση ως URL"},"segmentFetchFailureWarning":{"message":"Προειδοποίηση: Ο διακομιστής δεν έχει απαντήσει ακόμα με τμήματα. Μπορεί στην πραγματικότητα να υπάρχουν τμήματα σε αυτό το βίντεο που έχουν ήδη υποβληθεί, αλλά απλά δεν τα έχετε λάβει λόγω προβλημάτων με το διακομιστή."},"allowScrollingToEdit":{"message":"Να επιτρέπεται η κύλιση για την επεξεργασία χρόνων"},"NoticeTimeAfterSkip":{"message":"{seconds}δλ","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Καλύτεροι Τίτλοι και Μικρογραφίες στο YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Πληθοπορισμός τίτλων και μικρογραφιών ώστε να είναι περιγραφικοί και όχι συναισθηματικοί","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Επιλέξτε το πιο περιγραφικό"},"Original":{"message":"Αρχικό"},"OriginalTitle":{"message":"Αρχικός Τίτλος"},"CurrentTime":{"message":"Τρέχουσα ώρα"},"resetCustomTitle":{"message":"Επαναφορά Τίτλου Πίσω Στο Αρχικό Κείμενο"},"resetIcon":{"message":"Επαναφορά Εικονιδίου"},"TypeYourOwnTitleHere":{"message":"Πληκτρολογήστε τον δικό σας τίτλο εδώ"},"VideoNotReady":{"message":"Το βίντεο δεν είναι έτοιμο"},"FailedToRender":{"message":"Αποτυχία απεικόνισης","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Το canvas λείπει","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Σφάλμα κατά την απεικόνιση","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Αποτυχία φόρτωσης","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Μορφή Τίτλου"},"Disabled":{"message":"Απενεργοποιημένο"},"CapitalizeWords":{"message":"Κεφαλαιοποίηση Λέξεων"},"TitleCase":{"message":"Κεφαλαιοποίηση Τίτλου"},"SentenceCase":{"message":"Κεφαλαιοποίηση Πρότασης"},"LowerCase":{"message":"Πεζά"},"FirstLetterUppercase":{"message":"Μόνο Πρώτο Γράμμα Κεφαλαίο"},"shouldCleanEmojis":{"message":"Αφαίρεση emojis"},"onlyFormatCustomTitles":{"message":"Μορφοποίηση μόνο των τίτλων που υποβλήθηκαν από το χρήστη"},"onlyTitleCaseInEnglish":{"message":"Κεφαλαιοποίηση Λέξεων για Μη-Αγγλικούς Τίτλους"},"onlyTitleCaseInEnglishDescription":{"message":"Η ανίχνευση γλώσσας δεν είναι τέλεια και ανιχνεύει μερικούς αγγλικούς τίτλους ως μη αγγλικούς."},"thumbnailFallbackOption":{"message":"Όταν Δεν Υπάρχει Υποβληθείσα Μικρογραφία"},"whatThumbnailFallbackOption":{"message":"Κατά την επιλογή μιας τυχαίας ώρας, θα χρησιμοποιήσει τα δεδομένα SponsorBlock για να εξασφαλίσει ότι δεν είναι επιλεγμένη μια στιγμή από διαφημιστικό τμήμα.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Εμφάνιση στιγμιότυπου οθόνης από τυχαίο χρόνο"},"TheOriginalThumbnail":{"message":"Εμφάνιση της αρχικής μικρογραφίας"},"showABlankBox":{"message":"Εμφάνιση ενός κενού πλαισίου"},"AutoGenerated":{"message":"Εμφάνιση μικρογραφίας που δημιουργήθηκε αυτόματα από το YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Έναρξη"},"Middle":{"message":"Μέση"},"keepUnsubmitted":{"message":"Αποθήκευση Καταχωρημένων Ψήφων"},"showLiveCover":{"message":"Εμφάνιση Avatar καναλιών στα προσεχή βίντεο","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Να μη χρησιμοποιούνται ποτέ Μικρογραφίες Α/Β Δοκιμών"},"ignoreAbThumbnailsDescription":{"message":"Τα κανάλια μπορούν να ρυθμίσουν δοκιμές στα βίντεο τους, όπου το YouTube θα εμφανίζει διαφορετικές μικρογραφίες σε κάθε άτομο. Αυτή η επιλογή θα χρησιμοποιεί πάντα την πρώτη μικρογραφία για να διατηρεί τη συνέπεια."},"abThumbnailsWarning":{"message":"Προειδοποίηση: Αυτό το βίντεο εκτελείται επί του παρόντος μια δοκιμή μικρογραφίας A/B. Αυτό σημαίνει ότι η μικρογραφία μπορεί να αλλάζει συχνά. Πιθανώς δε θα πρέπει να ψηφίσετε για την αρχική μικρογραφία λόγω αυτού του κινδύνου."},"whatKeepUnsubmitted":{"message":"Κρατήστε τις ψήφους μετά την ψηφοφορία για να εμφανιστούν οι τίτλοι και οι μικρογραφίες που επιλέξατε αντί για την πρώτη ψήφο στο διακομιστή."},"keepUnsubmittedInPrivate":{"message":"Αποθήκευση Καταχωρημένων Ψήφων Από Ιδιωτικές Καρτέλες"},"useThumbnailGenerationService":{"message":"Χρήση Υπηρεσίας Δημιουργίας Μικρογραφιών"},"titleMaxLines":{"message":"Μέγιστος αριθμός γραμμών για τον τίτλο"},"titleMaxLinesDescription":{"message":"Οι τίτλοι βίντεο θα εξαπλωθούν σε τόσες πολλές γραμμές στις προτάσεις."},"thumbnailSaturationLevel":{"message":"Επίπεδο κορεσμού μικρογραφιών"},"whatSaturateThumbnails":{"message":"Κάντε τις μικρογραφίες λιγότερο ζωντανές μειώνοντας το χρώμα τους"},"hideDetailsWhileFetching":{"message":"Απόκρυψη λεπτομερειών κατά την ανάκτηση"},"hideDetailsWhileFetchingDescription":{"message":"Απόκρυψη τίτλων και μικρογραφιών κατά τη λήψη δεδομένων από το διακομιστή. Αν είναι απενεργοποιημένο, θα παρατηρήσετε εναλλαγές καθώς οι τίτλοι και οι μικρογραφίες αλλάζουν."},"ignoreTranslatedTitles":{"message":"Να μην εμφανίζονται μεταφρασμένοι τίτλοι του YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"Το YouTube μερικές φορές θα μεταφράσει αυτόματα τους τίτλους στη μητρική σας γλώσσα. Αυτή η επιλογή ισχύει μόνο όταν ένας πληθοπορισμένος τίτλος δεν είναι διαθέσιμος."},"onAllPages":{"message":"Σε όλες τις σελίδες","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Σε όλες τις σελίδες εκτός των σελίδων βίντεο","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Ποτέ"},"thumbnailGeneratorDescription1":{"message":"Η υπηρεσία δημιουργίας μικρογραφιών επιταχύνει σημαντικά την παραγωγή μικρογραφιών στέλνοντας ένα ανώνυμο αίτημα με το videoID σε έναν απομακρυσμένο διακομιστή. Η μικρογραφία είτε θα δημιουργηθεί ή θα τραβηχθεί από μια κρύπτη αν έχει ήδη δημιουργηθεί."},"thumbnailGeneratorDescription2":{"message":"Αν χρησιμοποιηθεί σε σελίδες βίντεο, αυτό θα μπορούσε δυνητικά να διαρρεύσει μη καταχωρημένα videoIDs σε αυτόν τον διακομιστή. Ρυθμίζοντας αυτό στην επιλογή \"Σε όλες τις σελίδες εκτός από τις σελίδες βίντεο\" θα αποτρέψει αυτό το πρόβλημα. Μια άλλη επιλογή είναι να φιλοξενήσετε τη δική σας υπηρεσία δημιουργίας μικρογραφιών."},"thumbnailGeneratorDescription3":{"message":"Αν η χρήση της υπηρεσίας δημιουργίας εικόνων μικρογραφίας είναι απενεργοποιημένη, όλες οι αιτήσεις θα χρησιμοποιήσουν ένα σύστημα ερωτημάτων k-ανωνυμίας, που καθιστά δυσκολότερο για το διακομιστή να προβλέψει ποια βίντεο ανακτήθηκαν, και μια πιο αργή τοπική υπηρεσία δημιουργίας μικρογραφιών θα χρησιμοποιηθεί.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Πηγαίος Κώδικας Υπηρεσίας Δημιουργίας Μικρογραφιών"},"moreAboutKAnonymity":{"message":"Περισσότερα για το K-Anonymity","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Να Εμφανίζεται Πάντα Το Κουμπί \"Εμφάνιση Αρχικού\""},"whatAlwaysShowShowOriginalButton":{"message":"Αν θέλετε να ξέρετε πάντα αν ένας τίτλος/μικρογραφία έχει αλλάξει, ενεργοποιήστε το."},"showOriginalOnHover":{"message":"Εναλλαγή μεταξύ προσαρμοσμένων και αρχικών λεπτομερειών κατά την αιώρηση"},"showOriginalOnHoverOfVideo":{"message":"Εναλλαγή μεταξύ προσαρμοσμένων και αρχικών λεπτομερειών κατά την αιώρηση οπουδήποτε στην κάρτα βίντεο"},"showOriginalOnHoverOfVideoDescription":{"message":"Αυτό θα απενεργοποιήσει την αυτόματη αναπαραγωγή κατά την αιώρηση"},"showCustomOnHoverIfCasual":{"message":"Εμφάνιση προσαρμοσμένου τίτλου κατά την αιώρηση εάν εμφανίζεται τίτλος απλής λειτουργίας"},"showIconForFormattedTitles":{"message":"Εμφάνιση κουμπιού \"Εμφάνιση αρχικού\" για αυτόματα διαμορφωμένους τίτλους"},"Enable":{"message":"Ενεργοποίηση"},"Titles":{"message":"Τίτλοι","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Μικρογραφίες","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Ψήφοι απλής λειτουργίας","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Σφάλμα"},"ShowOriginal":{"message":"Εμφάνιση Αρχικών Λεπτομερειών"},"ShowModified":{"message":"Εμφάνιση Τροποποιημένων Λεπτομερειών"},"ShowFormatted":{"message":"Εμφάνιση Μορφοποιημένων Λεπτομερειών"},"FillerWarning":{"message":"Προειδοποίηση: Αυτή είναι μια απίστευτα επιθετική κατηγορία. Πιθανότατα θα πρέπει να κάνετε αναίρεση παράλειψης ή να το απενεργοποιήσετε μερικές φορές. Προειδοποιούμε ότι σε πολλά βίντεο παραλείπεται τουλάχιστον το 50%! Ωστόσο, να θυμάστε ότι εξακολουθούν να υπάρχουν συγκεκριμένες κατευθυντήριες γραμμές που πρέπει να ακολουθηθούν κατά την υποβολή.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Γίνετε μέλος στο Discord ή Matrix για να μείνετε μόνιμα σε αυτή τη συνομιλία","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Εμφάνιση Βοήθειας Οδηγιών","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Αποφύγετε υπερβολικές εκφράσεις προσώπου","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Σκεφτείτε τη μεγάλη εικόνα, μην απαντάτε απλά στην ερώτηση του αρχικού τίτλου","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Αποφύγετε την περιγραφή των αντιδράσεων στο βίντεο (\"σοκαριστικό\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Παρέχετε αρκετές πληροφορίες για να κάνετε μια ενημερωμένη επιλογή πριν κάνετε κλικ"},"tip5":{"message":"Κεφαλαιοποίηση σαν μια πρόταση","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Ελέγξτε όλες τις οδηγίες για υποβολή","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Ο τίτλος μου κεφαλαιοποιείται σαν μια πρόταση","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Ο τίτλος μου δεν απαντά απλά σε μια ερώτηση που τίθεται στον τίτλο","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Οι τίτλοι θα πρέπει να περιγράφουν το βίντεο ή την ιστορία γενικότερα. Θα πρέπει να φροντίσετε να παρακολουθήσετε το πλήρες βίντεο για να ξέρετε για τι μιλάει αντί να βασίζεστε σε ένα ενδιαφέροντα πρωτότυπο τίτλο.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Ο τίτλος μου δεν συνοψίζει ένα συμπέρασμα ή αποκαλύπτει το περιεχόμενο άσκοπα","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Οι τίτλοι δεν προορίζονται να αντικαταστήσουν την παρακολούθηση του βίντεο εξ' ολοκλήρου, αλλά αντιθέτως για να ξέρετε αν πρέπει να κάνετε κλικ ή όχι.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Ο τίτλος μου δεν ελέγχει τα γεγονότα, δεν χλευάζει, ούτε ασκεί κριτική στο βίντεο ή τον δημιουργό","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Οι τίτλοι προορίζονται να είναι από την οπτική γωνία του δημιουργού και του βίντεο. Η αξιολόγηση ή ο έλεγχος των γεγονότων του ίδιου του βίντεο είναι εκτός του πεδίου εφαρμογής του DeArrow. Οι τίτλοι δεν προορίζονται ως ενότητα σχολίων.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Εντοπίστηκε λέξη: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Μην χρησιμοποιείτε περιττά ρήματα στην αρχή του τίτλου","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Ξεκινήστε όλους τους τίτλους με κεφαλαίο γράμμα. Οι τίτλοι πρέπει να μορφοποιούνται σαν πρόταση","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Οι τίτλοι δεν πρέπει να τελειώνουν με '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Μην προσθέτετε απλώς μια απάντηση σε μια ερώτηση στον αρχικό τίτλο. Οι τίτλοι πρέπει να περιγράφουν το βίντεο ή την ιστορία γενικά","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Οι τίτλοι δεν πρέπει να ελέγχουν τα γεγονότα, να χλευάζουν ή να ασκούν κριτική στο βίντεο ή στον δημιουργό","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Οι τίτλοι δεν πρέπει να διατηρούν εντυπωσιακά στοιχεία από τον αρχικό τίτλο","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Οι τίτλοι δεν πρέπει να περιέχουν emojis","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Πρέπει να επιλύσετε την προειδοποίηση πριν την υποβολή"},"dearrowHelpSponsorBlockImported":{"message":"Σημείωση: Οι ρυθμίσεις του SponsorBlock έχουν εισαχθεί αυτόματα!"},"howItWorks":{"message":"Πώς λειτουργεί"},"discordPromotion":{"message":"Συμβάλετε, κάντε κάποιες προτάσεις και βοηθήστε στο {discord} ή στο {matrix}"},"deArrowDonationText":{"message":"Αν σας αρέσει αυτό που έχω κάνει μέχρι στιγμής και θέλετε να με βοηθήσετε με χρήματα, εδώ είναι ένας σύνδεσμος"},"termsAgreement":{"message":"Με τη χρήση αυτής της επέκτασης, συμφωνείτε με το {privacy-policy} και {terms}"},"privacyPolicy":{"message":"Πολιτική Απορρήτου"},"termsOfUse":{"message":"Όροι Χρήσης"},"openSourceLicenses":{"message":"Άδειες Ανοικτού Κώδικα"},"defaultToOriginals":{"message":"Προεπιλογή Στις Αρχικές Πληροφορίες Βίντεο"},"whatDefaultToOriginals":{"message":"Εμφάνιση του αρχικού τίτλου και της μικρογραφίας από προεπιλογή, αλλά να υπάρχει ένα κουμπί που εμφανίζεται κατά την αιώρηση για να δείτε τους προσαρμοσμένους τίτλους και τις μικρογραφίες."},"replaceTitles":{"message":"Αντικατάσταση Τίτλων"},"replaceThumbnails":{"message":"Αντικατάσταση Μικρογραφιών"},"useCrowdsourcedTitles":{"message":"Χρήση Πληθοπορισμένων Τίτλων"},"whatUseCrowdsourcedTitles":{"message":"Αν απενεργοποιηθεί, θα μορφοποιήσει τους τίτλους αλλά δε θα χρησιμοποιήσει τίτλους που έχουν υποβληθεί από την κοινότητα","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Είστε βέβαιοι ότι θα θέλατε να διαγράψετε αυτή την διαμόρφωση;","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Νέα ρύθμιση παραμέτρων"},"DeleteConfiguration":{"message":"Διαγραφή ρύθμισης παραμέτρων"},"ChannelAllowlist":{"message":"Ρυθμίσεις για συγκεκριμένα κανάλια"},"ConfigurationName":{"message":"Όνομα της διαμόρφωσης"},"ChannelListInstructions":{"message":"Εισάγετε τα κανάλια που θέλετε να εφαρμόσετε αυτή τη ρύθμιση στο παρακάτω πλαίσιο, διαχωρισμένα με νέες γραμμές. Και τα αναγνωριστικά καναλιών και τα ονόματα εμφάνισης υποστηρίζονται. @ Ονόματα χρηστών δεν υποστηρίζονται. Μπορείτε να πάρετε αναγνωριστικά καναλιού κάνοντας κλικ στο κουμπί κοινοποίησης στη σελίδα σχετικά του καναλιού. Για να φτάσετε στη σελίδα σχετικά, κάντε κλικ στην περιγραφή του καναλιού που εμφανίζεται κάτω από το όνομα του καναλιού στη σελίδα του καναλιού.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Καμία ρύθμιση παραμέτρων ακόμα. Κάντε κλικ στο κουμπί στο επάνω μέρος για να προσθέσετε μια νέα ρύθμιση.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Σταματήστε το clickbait αντικαθιστώντας τίτλους και μικρογραφίες με άλλα πιο ακριβή"},"DeArrowPromotionMessage2":{"message":"Σας έχει κουράσει το clickbait; Ελέγξτε τη νέα μου επέκταση για τη βελτίωση των τίτλων και των μικρογραφιών"},"DeArrowPromotionMessage3":{"message":"Επίσης ελέγξτε το DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Δεν αρέσει αυτός ο τίτλος; Αν προτιμάτε τον παρακάτω τίτλο, σκεφτείτε να ελέγξετε τη λειτουργία αντικατάστασης τίτλου στο DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Αυτή η μικρογραφία επιλέγεται από μια τυχαία χρονοσφραγίδα επειδή δεν υπάρχει ακόμα μια υποβολή σε αυτό το βίντεο","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Αυτή η μικρογραφία επιλέγεται από μια τυχαία χρονοσφραγίδα και ο τίτλος είναι αυτόματα-μορφοποιημένος επειδή δεν υπάρχει ακόμα μια υποβολή σε αυτό το βίντεο","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Μπορείτε να αλλάξετε αυτήν την προεπιλογή παρακάτω","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"Οι {titles} τίτλοι και οι {thumbnails} μικρογραφίες έχουν αντικατασταθεί από τότε που εγκαταστήσατε αυτήν την επέκταση","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} τίτλος ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} τίτλοι ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"και {thumbnails} μικρογραφία","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"και {thumbnails} μικρογραφίες","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"Οι {titleAndThumbnailMessage} έχουν αντικατασταθεί από τότε που εγκαταστήσατε αυτήν την επέκταση","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Καταμέτρηση Αντικαταστάσεων Τίτλων και Μικρογραφιών"},"countReplacementsDescription":{"message":"Χρησιμοποιείται για να σας δώσει στατιστικά στο αναδυόμενο παράθυρο.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Προσθέστε μια λίστα φίλτρων για να αποκλείσετε έρευνες, ράφια εμπορευμάτων και άλλα διαφημιστικά στοιχεία σελίδας χρησιμοποιώντας το yt-neuter"},"requiresUblock":{"message":"Απαιτεί uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Κάτι πήγε στραβά με την ανίχνευση του videoID. Δοκιμάστε να ανανεώσετε τη σελίδα πριν την υποβολή για να βεβαιωθείτε ότι υποβάλλεται για το σωστό βίντεο. Εάν αυτό συμβαίνει συχνά, στείλτε μια αναφορά σχετικά με αυτό μαζί με τις άλλες επεκτάσεις ή τα userscripts που έχετε εγκαταστήσει μέσω GitHub, Discord ή Matrix."},"dearrowLogoCredit":{"message":"Λογότυπο βασισμένο σε Twemoji με άδεια CC-BY 4.0"},"zoomToFillUnsupported":{"message":"Το SponsorBlock δεν είναι συμβατό με την επέκταση \"Μεγέθυνση για Γέμισμα\". Υπάρχουν πολλές εναλλακτικές που μπορείτε να χρησιμοποιήσετε αντ' αυτού που θα λειτουργήσουν σωστά."},"freeTrialStarted":{"message":"Η δωρεάν δοκιμή σας ξεκίνησε επιτυχώς. Επισκεφθείτε το YouTube για να το δοκιμάσετε"},"freeTrialEnded":{"message":"Η δωρεάν δοκιμαστική περίοδος σας έχει τελειώσει"},"freeTrialPrompt":{"message":"Αν θέλετε να το δοκιμάσετε, μπορείτε να ξεκινήσετε μια δωρεάν δοκιμαστική περίοδο με το παρακάτω κουμπί."},"startFreeTrial":{"message":"Έναρξη δωρεάν δοκιμαστικής περιόδου"},"freeAccessRequested":{"message":"Έχετε εγγραφεί με επιτυχία για δωρεάν πρόσβαση. Θα ειδοποιηθείτε όταν σας δοθεί δωρεάν πρόσβαση."},"freeAccessComplete":{"message":"Συγχαρητήρια! Τώρα έχετε δωρεάν πρόσβαση στο DeArrow"},"DeArrowNotActivated":{"message":"Το DeArrow δεν είναι ενεργοποιημένο"},"ActivateDeArrow":{"message":"Ενεργοποίηση DeArrow"},"DeArrowIsActivated":{"message":"Το DeArrow έχει ενεργοποιηθεί με επιτυχία"},"Close":{"message":"Κλείσιμο"},"ViewLicenseKey":{"message":"Προβολή Κλειδιού Άδειας"},"SharingIsCaring":{"message":"Το να μοιράζεσαι σημαίνει φροντίδα"},"cleanPopup":{"message":"Απόκρυψη ακαταστασίας στο αναδυόμενο παράθυρο λίστας τμημάτων"},"syncDisabledWarning":{"message":"Προειδοποίηση: Η αποθήκευση επεκτάσεων έχει απενεργοποιηθεί στο πρόγραμμα περιήγησης σας. Οι ρυθμίσεις δε θα αποθηκευτούν αν προσπαθήσετε να τις αποθηκεύσετε."},"syncDisabledWarningDeArrow":{"message":"Το DeArrow δε θα λειτουργήσει χωρίς αποθηκευτικό χώρο."},"syncDisabledFirefoxSuggestions":{"message":"Μπορείτε να το ενεργοποιήσετε πηγαίνοντας στο about:config και ορίζοντας την τιμή του \"webextensions.storage.sync.enabled\" σε true."},"storageFull":{"message":"Ο αποθηκευτικός χώρος επεκτάσεων είναι πλήρης. Παρακαλούμε διαγράψτε μερικά μη υποβληθέντα τμήματα στις επιλογές."},"previewSegmentRequired":{"message":"Παρακαλούμε κάνετε προεπισκόπηση των τμημάτων σας πριν από την υποβολή. Μπορείτε να το κάνετε κάνοντας κλικ στο κουμπί προεπισκόπησης ή χρησιμοποιώντας την ακόλουθη συντόμευση:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Λειτουργία VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Οι υποβολές δεν μπορούν να γίνουν δεκτές από το πρόγραμμα περιήγησης σας αυτή τη στιγμή, επειδή το YouTube φαίνεται να έχει εγχύσει μερικές διαφημίσεις σε επίπεδο διακομιστή, που η επέκταση δεν είναι σε θέση να αφαιρέσει. Παρακαλώ επικοινωνήστε εάν λαμβάνετε αυτό το σφάλμα."},"DeArrowIsDisabled":{"message":"Το DeArrow είναι απενεργοποιημένο - κάντε κλικ για ενεργοποίηση","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Είστε βέβαιοι ότι αυτή η αρχική μικρογραφία ακολουθεί τις οδηγίες του DeArrow; Αν απλώς προτιμάτε να βλέπετε γενικά τις αρχικές μικρογραφίες, σκεφτείτε να αλλάξετε την επιλογή \"Όταν δεν υπάρχει υποβληθείσα μικρογραφία\" στις ρυθμίσεις του DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"Στο YouTube TV, το SponsorBlock δεν είναι συμβατό με ζωντανό και πρόσφατα εγγεγραμμένο περιεχόμενο. Εάν πρόκειται για πρόσφατη εγγραφή, περιμένετε μερικές ώρες για να γίνει διαθέσιμη η επεξεργασμένη έκδοση της εγγραφής.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Η προσθήκη καναλιών στη λίστα αποδοχής δεν υποστηρίζεται στο tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Σας αρέσει ο αρχικός τίτλος;","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Ναι"},"No":{"message":"Όχι"},"votes":{"message":"{0} ψήφοι","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} ψήφος","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Αστείο","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Δημιουργικό","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Έξυπνο","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Περιγραφικό","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Άλλο","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Κλασική λειτουργία","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Οι τίτλοι αντικαθίστανται με τυποποιημένες μορφές βάσει των οδηγιών σε όλα τα βίντεο όπου υπάρχει πληθοπορισμένος τίτλος."},"CasualMode":{"message":"Απλή λειτουργία","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Διατηρήστε τους αρχικούς τίτλους όταν περιγράφουν αρκετά καλά το βίντεο και είναι έξυπνοι ή αστείοι.\nΕπιλέξτε ποιες κατηγορίες τίτλων θέλετε να βλέπετε.\nΘα μπορείτε να ψηφίσετε εάν ένας τίτλος ταιριάζει σε μια κατηγορία ή όχι."},"minimumVotes":{"message":"Ελάχιστες ψήφοι","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Εμφάνιση αρχικής μικρογραφίας σε βίντεο που ψηφίστηκαν σε απλή λειτουργία","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Νέα λειτουργία: Απλή λειτουργία","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Εμφάνιση εικονιδίου απλής λειτουργίας μόνο όταν είναι διαθέσιμος προσαρμοσμένος τίτλος"},"OpenSettings":{"message":"Άνοιγμα ρυθμίσεων"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/en/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/en/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Connection Timeout. Check your internet connection. If your internet is working, the server is probably overloaded or down."},"400":{"message":"Server said this request was invalid"},"409":{"message":"This has already been submitted before"},"502":{"message":"The server seems to be overloaded. Try again in a few seconds."},"fullName":{"message":"SponsorBlock for YouTube - Skip Sponsorships","description":"Name of the extension."},"Description":{"message":"Skip sponsorships, subscription begging and more on YouTube videos. Report sponsors on videos you watch to save others' time.","description":"Description of the extension."},"channelWhitelisted":{"message":"Channel Whitelisted!"},"Segment":{"message":"segment"},"Segments":{"message":"segments"},"SegmentsCap":{"message":"Segments"},"Chapters":{"message":"Chapters"},"renderAsChapters":{"message":"Render segments as chapters","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Show current segment beside video time"},"showAutogeneratedChapters":{"message":"Show chapters auto-generated by YouTube"},"upvoteButtonInfo":{"message":"Upvote this submission"},"reportButtonTitle":{"message":"Report"},"reportButtonInfo":{"message":"Report this submission as incorrect."},"Dismiss":{"message":"Dismiss"},"Loading":{"message":"Loading..."},"Hide":{"message":"Never Show"},"hitGoBack":{"message":"Hit unskip to get to where you came from."},"unskip":{"message":"Unskip"},"reskip":{"message":"Reskip"},"unmute":{"message":"Unmute"},"paused":{"message":"Paused"},"manualPaused":{"message":"Timer Stopped"},"confirmMSG":{"message":"To edit or delete individual values, click the info button or open the extension popup by clicking the extension icon in the top right corner."},"clearThis":{"message":"Are you sure you want to clear this?\n\n"},"Unknown":{"message":"There was an error submitting your sponsor times, please try again later."},"sponsorFound":{"message":"This video has segments in the database!"},"sponsor404":{"message":"No segments found"},"sponsorStart":{"message":"Start Segment Now"},"sponsorEnd":{"message":"End Segment Now"},"sponsorCancel":{"message":"Cancel Creating Segment"},"noVideoID":{"message":"No YouTube video found.\nIf this is incorrect, refresh the tab."},"refreshSegments":{"message":"Refresh segments"},"success":{"message":"Success!"},"voted":{"message":"Voted!"},"serverDown":{"message":"It seems the server is down. Contact the dev immediately."},"connectionError":{"message":"A connection error has occurred. Error code: "},"segmentsStillLoading":{"message":"Segments still loading..."},"clearTimes":{"message":"Clear Segments"},"openPopup":{"message":"Open SponsorBlock Popup"},"closePopup":{"message":"Close Popup"},"closeIcon":{"message":"Close Icon"},"OpenSubmissionMenu":{"message":"Open Submission Menu"},"OpenCasualVoteMenu":{"message":"Open casual mode menu"},"sortSegments":{"message":"Sort Segments"},"submitCheck":{"message":"Are you sure you want to submit this?"},"whitelistChannel":{"message":"Whitelist channel"},"removeFromWhitelist":{"message":"Remove channel from whitelist"},"voteOnTime":{"message":"Vote On A Segment"},"Submissions":{"message":"Submissions"},"savedPeopleFrom":{"message":"You've saved people from "},"viewLeaderboard":{"message":"Leaderboard"},"recordTimesDescription":{"message":"Submit"},"submissionEditHint":{"message":"Section editing will appear after you click submit","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Hint: You can setup keybinds for submitting in the options"},"clearTimesButton":{"message":"Clear Times"},"Username":{"message":"Username"},"setUsername":{"message":"Set Username"},"copyPublicID":{"message":"Copy Public UserID"},"copySegmentID":{"message":"Copy Segment ID"},"loopChapter":{"message":"Loop chapter"},"unloopChapter":{"message":"Unloop chapter"},"hideThis":{"message":"Hide this"},"Options":{"message":"Options"},"showButtons":{"message":"Show buttons on YouTube player"},"hideButtonsDescription":{"message":"This hides the buttons that appear on the YouTube player to submit skip segments."},"showSkipButton":{"message":"Keep skip to highlight button on player"},"showInfoButton":{"message":"Show info button on YouTube player"},"autoHideInfoButton":{"message":"Auto-hide info button"},"showDeleteButton":{"message":"Show delete button on YouTube player"},"enableViewTracking":{"message":"Enable skip count tracking"},"whatViewTracking":{"message":"This feature tracks which segments you have skipped to let users know how much their submission has helped others and used as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message to the server each time you skip a segment. Hopefully most people don't change this setting so that the view numbers are accurate. :)"},"enableViewTrackingInPrivate":{"message":"Enable skip count tracking in private/incognito tabs"},"enableTrackDownvotes":{"message":"Store segment downvotes"},"whatTrackDownvotes":{"message":"Any segments you downvote will remain hidden even after refreshing"},"trackDownvotesWarning":{"message":"Warning: Disabling this will delete all previously stored downvotes"},"enableTrackDownvotesInPrivate":{"message":"Store segment downvotes in private/incognito tabs"},"enableQueryByHashPrefix":{"message":"Query By Hash Prefix"},"whatQueryByHashPrefix":{"message":"Instead of requesting segments from the server using the videoID, the first 4 characters of the hash of the videoID are sent. This server will send back data for all videos with similar hashes."},"enableShowCategoryWithoutPermission":{"message":"Show categories in submission menu even without submission permission"},"whatShowCategoryWithoutPermission":{"message":"Some categories require permission to submit due to minimum reputation requirements"},"showNotice":{"message":"Show Notice Again"},"showSkipNotice":{"message":"Show notice after a segment is skipped"},"showUpcomingNotice":{"message":"Show notice before a segment starts"},"showCategoryGuidelines":{"message":"Show category help"},"noticeVisibilityMode0":{"message":"Full size skip notices"},"noticeVisibilityMode1":{"message":"Small skip notices for auto skip"},"noticeVisibilityMode2":{"message":"All small skip notices"},"noticeVisibilityMode3":{"message":"Faded skip notices for auto skip"},"noticeVisibilityMode4":{"message":"All faded skip notices"},"longDescription":{"message":"SponsorBlock lets you skip over sponsors, intros, outros, subscription reminders, and other annoying parts of YouTube videos. SponsorBlock is a crowdsourced browser extension that lets anyone submit the start and end times of sponsored segments and other segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment. You can also skip over non music sections of music videos.","description":"Full description of the extension on the store pages."},"website":{"message":"Website","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Source Code","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"The notice has been upgraded!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"If you still don't like it, hit the never show button.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Skip segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Start/stop segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Open submission menu","description":"Keybind label"},"setSubmitKeybind":{"message":"Submit segments","description":"Keybind label"},"setPreviewKeybind":{"message":"Preview segment","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Close skip notice","description":"Keybind label"},"setDownvoteKeybind":{"message":"Downvote segment","description":"Keybind label"},"setUpvoteKeybind":{"message":"Upvote segment","description":"Keybind label"},"nextChapterKeybind":{"message":"Next chapter","description":"Keybind label"},"previousChapterKeybind":{"message":"Previous chapter","description":"Keybind label"},"enableDeArrowKey":{"message":"Toggle enabling DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Open submission menu","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Select a key by typing it and choose any modifier keys you wish to use."},"disableSkipping":{"message":"Skipping is enabled"},"enableSkipping":{"message":"Skipping is disabled"},"yourWork":{"message":"Your Work","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Error Code: "},"skip":{"message":"Skip"},"mute":{"message":"Mute"},"full":{"message":"Full Video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Skip {0}?"},"mute_category":{"message":"Mute {0}?"},"skip_to_category":{"message":"Skip to {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Upcoming {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} Skipped","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} Muted","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Skipped to {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Voted on {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Disable Auto Skip"},"enableAutoSkip":{"message":"Enable Auto Skip"},"audioNotification":{"message":"Audio notification on skip"},"audioNotificationDescription":{"message":"Audio notification on skip will play a sound whenever a segment is skipped. If disabled (or auto skip is disabled), no sound will be played."},"showTimeWithSkips":{"message":"Show time with skips removed"},"showTimeWithSkipsDescription":{"message":"This time appears in brackets next to the current time on below the Seek Bar. This shows the total video duration minus any segments. This includes segments marked as only \"Show In Seek Bar\"."},"youHaveSkipped":{"message":"You've skipped "},"minLower":{"message":"minute"},"minsLower":{"message":"minutes"},"hourLower":{"message":"hour"},"hoursLower":{"message":"hours"},"youHaveSavedTime":{"message":"You've saved people","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" of their lives","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Check status.sponsor.ajay.app for server status."},"changeUserID":{"message":"Import/Export your private userID"},"whatChangeUserID":{"message":"This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you. If you are looking for your public userID, click the clipboard icon in the popup."},"setUserID":{"message":"Set Private UserID"},"userIDChangeWarning":{"message":"Warning: Changing the Private UserID is permanent. Are you sure you would like to do this? Make sure to backup your old one just in case."},"createdBy":{"message":"Created By"},"supportOtherSites":{"message":"Support 3rd Party YouTube-Sites"},"supportOtherSitesDescription":{"message":"Support third party YouTube clients. To enable support, you must accept the extra permissions.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Supported Sites: "},"optionsInfo":{"message":"Enable Invidious support, disable auto skip, hide buttons and more."},"addInvidiousInstance":{"message":"Add 3rd-Party Client Instance"},"addInvidiousInstanceDescription":{"message":"Add a custom instance. This must be formatted with JUST the domain. Example: invidious.ajay.app"},"add":{"message":"Add"},"addInvidiousInstanceError":{"message":"This is an invalid domain. This should JUST include the domain part. Example: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Reset Invidious Instance List"},"resetInvidiousInstanceAlert":{"message":"You are about to reset the Invidious instance list"},"invidiousDisabledSafari":{"message":"Invidious support is not available on Safari at the moment due to a bug in Safari. When Apple fixes the bug, it will be added back."},"currentInstances":{"message":"Current Instances:"},"minDuration":{"message":"Minimum duration (seconds):"},"minDurationDescription":{"message":"Segments shorter than the set value will not be skipped or show in the player."},"enableManualSkipOnFullVideo":{"message":"Use manual skip when a full video label exists"},"whatManualSkipOnFullVideo":{"message":"For people who want to watch the video uninterrupted if it is fully sponsored or self promotion."},"skipNoticeDuration":{"message":"Skip notice duration (seconds):"},"skipNoticeDurationDescription":{"message":"The skip notice will stay on screen for at least this many seconds. For manual skipping, it may be visible for longer."},"shortCheck":{"message":"The following submission is shorter than your minimum duration option. This could mean that this is already submitted, and just being ignored due to this option. Are you sure you would like to submit?"},"liveOrPremiere":{"message":"Submitting on an active livestream or premiere is not allowed. Please wait until it finishes, then refresh the page and verify that the segments are still valid."},"showUploadButton":{"message":"Show upload button"},"customServerAddress":{"message":"SponsorBlock server address"},"customServerAddressDescription":{"message":"The address SponsorBlock uses to make calls to the server.\nUnless you have your own server instance, this should not be changed."},"dataFetchingServerAddress":{"message":"Data fetching server address"},"dataFetchingServerAddressDescription":{"message":"The address used to make calls to the data fetching server.\nUnless you have your own server instance, this should not be changed."},"thumbnailCacheServerAddress":{"message":"Thumbnail cache server address"},"save":{"message":"Save"},"reset":{"message":"Reset"},"customAddressError":{"message":"This address is not in the right form. Make sure you have http:// or https:// at the beginning and no trailing slashes."},"areYouSureReset":{"message":"Are you sure you would like to reset this?"},"mobileUpdateInfo":{"message":"m.youtube.com is now supported"},"exportOptions":{"message":"Import/Export All Options"},"exportOtherData":{"message":"Import/Export All Other Data"},"exportOptionsCopy":{"message":"Edit/copy"},"exportOptionsDownload":{"message":"Save to file"},"exportOptionsUpload":{"message":"Load from file"},"whatExportOptions":{"message":"This is your entire configuration in JSON. This includes your Private UserID, so be sure to share this wisely."},"setOptions":{"message":"Set Options"},"exportOptionsWarning":{"message":"Warning: Changing the options is permanent and can break your install. Are you sure you would like to do this? Make sure to backup your old one just in case."},"incorrectlyFormattedOptions":{"message":"This JSON is not formatted correctly. Your options have not been changed."},"confirmNoticeTitle":{"message":"Submit Segment"},"submit":{"message":"Submit"},"cancel":{"message":"Cancel"},"delete":{"message":"Delete"},"preview":{"message":"Preview"},"unsubmitted":{"message":"Unsubmitted"},"inspect":{"message":"Inspect"},"edit":{"message":"Edit"},"copyDebugLogs":{"message":"Copy Debug Logs"},"copyDebugInformation":{"message":"Copy debug information to clipboard"},"copyDebugInformationFailed":{"message":"Failed to write to clipboard"},"copyDebugInformationOptions":{"message":"Copies information to the clipboard to be provided to a developer when raising a bug / when a developer requests it. Sensitive information such as your user ID, whitelisted channels, and custom server address have been removed. However it does contain information such as your useragent, browser, operating system, and extension version number. "},"copyDebugInformationComplete":{"message":"The debug information has been copied to the clip board. Feel free to remove any information you would rather not share. Save this in a text file or paste into the bug report."},"keyAlreadyUsed":{"message":"This shortcut is bound to another action. Please select a different one."},"to":{"message":"to","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Copied!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Include segue transitions"},"generic_guideline2":{"message":"Plays as if nothing was skipped"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shoutouts to causes/creators/websites/products they like."},"category_sponsor_guideline1":{"message":"Paid promotions"},"category_sponsor_guideline2":{"message":"Not for donations or custom merch"},"category_selfpromo":{"message":"Unpaid/Self Promotion"},"category_selfpromo_description":{"message":"Similar to \"sponsor\" except for unpaid or self promotion. This includes sections about merchandise, donations, or information about who they collaborated with."},"category_selfpromo_guideline1":{"message":"Donations, memberships and custom merch"},"category_selfpromo_guideline2":{"message":"Free shoutouts that don't add to the video"},"category_selfpromo_guideline3":{"message":"Not for corporate designed products and merch"},"category_exclusive_access":{"message":"Exclusive Access"},"category_exclusive_access_description":{"message":"Only for labeling entire videos. Used when a video showcases a product, service or location that they've received free or subsidized access to."},"category_exclusive_access_pill":{"message":"This video showcases a product, service or location that they've received free or subsidized access to","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Entire video showcases something with free or subsidized access"},"category_interaction":{"message":"Interaction Reminder (Subscribe)"},"category_interaction_description":{"message":"When there is a short reminder to like, subscribe or follow them in the middle of content. If it is long or about something specific, it should be under self promotion instead."},"category_interaction_guideline1":{"message":"Short reminders to like, subscribe or follow"},"category_interaction_guideline2":{"message":"Includes indirect reminders to comment"},"category_interaction_guideline3":{"message":"Not for general promotion, only calls to action"},"category_interaction_short":{"message":"Interaction Reminder"},"category_intro":{"message":"Intermission/Intro Animation"},"category_intro_description":{"message":"An interval without actual content. Could be a pause, static frame, repeating animation. This should not be used for transitions containing information."},"category_intro_short":{"message":"Intermission"},"category_intro_guideline1":{"message":"Interval without actual content"},"category_intro_guideline2":{"message":"Not for transitions with information"},"category_outro":{"message":"Endcards/Credits"},"category_outro_description":{"message":"Credits or when the YouTube endcards appear. Not for conclusions with information."},"category_outro_guideline1":{"message":"Don't include content, even if endcards are on screen"},"category_preview":{"message":"Preview/Recap"},"category_preview_description":{"message":"Collection of clips that show what is coming up in in this video or other videos in a series where all information is repeated later in the video."},"category_preview_guideline1":{"message":"Clips that appear later, or in a future video"},"category_preview_guideline2":{"message":"Recap of a previous video"},"category_preview_guideline3":{"message":"Not for sections that add additional content"},"category_hook":{"message":"Hook/Greetings","description":"https://en.wikipedia.org/wiki/Narrative_hook"},"category_hook_description":{"message":"Narrated trailers for the upcoming video, greetings and goodbyes. This should not skip conclusions with information."},"category_hook_guideline1":{"message":"Narrated trailers for the upcoming video"},"category_hook_guideline2":{"message":"Greetings and goodbye sections welcoming viewers"},"category_hook_guideline3":{"message":"Not for sections that add additional content"},"category_filler":{"message":"Tangents/Jokes"},"category_filler_description":{"message":"Tangential scenes or jokes that are not required to understand the main content of the video. This should not include segments providing context or background details. This is a very aggressive category meant for when you aren't in the mood for \"fun\"."},"category_filler_short":{"message":"Tangents"},"category_filler_guideline1":{"message":"Tangential scenes or jokes"},"category_filler_guideline2":{"message":"Distractions, bloopers, replays"},"category_filler_guideline3":{"message":"Not for scenes required to understand the topic"},"category_music_offtopic":{"message":"Music: Non-Music Section"},"category_music_offtopic_description":{"message":"Only for use in music videos. This only should be used for sections of music videos that aren't already covered by another category."},"category_music_offtopic_short":{"message":"Non-Music"},"category_music_offtopic_guideline1":{"message":"Sections not in official releases"},"category_music_offtopic_guideline2":{"message":"Non-music in a live performance"},"category_poi_highlight":{"message":"Highlight"},"category_poi_highlight_description":{"message":"The part of the video that most people are looking for. Similar to \"Video starts at x\" comments."},"category_poi_highlight_guideline1":{"message":"Section most people are looking for"},"category_poi_highlight_guideline2":{"message":"Can skip context"},"category_poi_highlight_guideline3":{"message":"Can skip to the title or thumbnail"},"category_chapter":{"message":"Chapter"},"category_chapter_description":{"message":"Custom named chapters describing major sections of a video."},"category_chapter_guideline1":{"message":"Don't mention sponsor brand names"},"category_chapter_guideline2":{"message":"Use larger chapters for general sections"},"category_chapter_guideline3":{"message":"Smaller chapters can be placed inside larger ones"},"category_livestream_messages":{"message":"Livestream: Donation/Message Readings"},"category_livestream_messages_short":{"message":"Message Reading"},"autoSkip":{"message":"Auto skip"},"manualSkip":{"message":"Manual skip"},"showOverlay":{"message":"Show in seek bar"},"disable":{"message":"Disable"},"autoSkip_POI":{"message":"Auto skip to the start"},"manualSkip_POI":{"message":"Ask when video loads"},"showOverlay_POI":{"message":"Show in seek bar"},"showOverlay_full":{"message":"Show label"},"showOverlay_chapter":{"message":"Show chapters"},"autoSkipOnMusicVideos":{"message":"Auto skip all segments when there is a non-music segment"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Only auto skip on music.youtube.com"},"muteSegments":{"message":"Allow segments that mute audio instead of skip"},"fullVideoSegments":{"message":"Show an icon when a video is entirely an advertisement","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Show labels on video thumbnails as well","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Unsubmitted color","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Seek bar color"},"category":{"message":"Category"},"skipOption":{"message":"Skip option","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Open advanced skip options"},"advancedSkipNotSaved":{"message":"Syntax error: Your options have not been saved"},"advancedSkipSettingsHelp":{"message":"How this works","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Enable beta testing server"},"whatEnableTestingServer":{"message":"Your submissions and votes WILL NOT COUNT towards the main server. Only use this for testing."},"testingServerWarning":{"message":"All submissions and votes WILL NOT COUNT towards the main server while connecting to the test server. Make sure to disable this when you want to make real submissions."},"bracketNow":{"message":"(Now)"},"moreCategories":{"message":"More Categories"},"chooseACategory":{"message":"Choose a Category"},"enableThisCategoryFirst":{"message":"To submit segments with the category of \"{0}\", you must enable it in the options. You will be redirected to the options now.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Warning: This type of segment can have a maximum of one active at a time. Submitting multiple will cause a random one to be shown."},"youMustSelectACategory":{"message":"You must select a category for all segments you are submitting!"},"bracketStart":{"message":"(Start)"},"bracketEnd":{"message":"(End)"},"End":{"message":"End","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"hidden: downvote"},"hiddenDueToDuration":{"message":"hidden: too short"},"manuallyHidden":{"message":"manually hidden"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Channel ID is not loaded yet. If you are using an embedded video, try using the YouTube homepage instead. This could also be caused by changes in the YouTube layout, if you think so, make a comment here:"},"invidiousPermissionRefresh":{"message":"The browser has revoked the permission needed to function on Invidious and other 3rd-party sites. Please click the button below to reactivate this permission."},"acceptPermission":{"message":"Accept permission"},"permissionRequestSuccess":{"message":"Permission request succeeded!"},"permissionRequestFailed":{"message":"Permission request failed, did you click deny?"},"adblockerIssueWhitelist":{"message":"If you are unable to resolve this, then disable the setting 'Force channel check before skipping', as SponsorBlock is unable to retrieve the channel information for this video"},"forceChannelCheck":{"message":"Force channel check before skipping"},"whatForceChannelCheck":{"message":"By default, it will skip segments right away before it even knows what the channel is. By default, some segments at the start of the video might be skipped on whitelisted channels. Enabling this option will prevent this but making all skipping have a slight delay as getting the channelID can take some time. This delay might be unnoticeable if you have fast internet."},"forceChannelCheckPopup":{"message":"Consider Enabling \"Force channel check before skipping\""},"downvoteDescription":{"message":"Incorrect/Wrong Timing"},"incorrectVote":{"message":"Incorrect"},"harmfulVote":{"message":"Harmful","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Change Category"},"nonMusicCategoryOnMusic":{"message":"This video is categorized as music. Are you sure this has a sponsor? If this is actually a \"Non-Music segment\", open up the extension options and enable this category. Then, you can submit this segment as \"Non-Music\" instead of sponsor. Please read the guidelines if you are confused."},"multipleSegments":{"message":"Multiple Segments"},"guidelines":{"message":"Guidelines"},"readTheGuidelines":{"message":"Read The Guidelines!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Categories are here!"},"categoryUpdate2":{"message":"Open the options to skip intros, outros, merch, etc."},"help":{"message":"Help"},"GotIt":{"message":"Got it","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"This segment is large. If the whole video is about one topic, then change from \"Skip\" to \"Full Video\". See the guidelines for more information."},"categoryPillTitleText":{"message":"This entire video is labeled as this category and is too tightly integrated to be able to separate"},"chapterNameTooltipWarning":{"message":"One of your chapter names is similar to a category. You should use categories when possible instead."},"experiementOptOut":{"message":"Opt-out of all future experiments","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Hide forever"},"warningChatInfo":{"message":"We noticed you were making some common mistakes. We very much appreciate your work so far, but we strive towards perfection here, so even very small mistakes matter :)"},"questionButton":{"message":"I have a question"},"askAQuestion":{"message":"Ask a question"},"warningConfirmButton":{"message":"I understand the reason"},"warningError":{"message":"Error when trying to acknowledge warning:"},"deArrowMessageRecieved":{"message":"You've received a tip from a moderator"},"Donate":{"message":"Donate"},"considerDonating":{"message":"Help fund development"},"supportSponsorBlock":{"message":"Support my full-time work on SponsorBlock"},"hideDonationLink":{"message":"Hide donation link"},"darkModeOptionsPage":{"message":"Dark mode on options page"},"helpPageThanksForInstalling":{"message":"Thanks for installing SponsorBlock."},"helpPageReviewOptions":{"message":"Please review the options below"},"helpPageFeatureDisclaimer":{"message":"Many features are disabled by default. If you want to skip intros, outros, use Invidious, etc., enable them below. You can also hide/show UI elements."},"helpPageHowSkippingWorks":{"message":"How it works"},"helpPageHowSkippingWorks1":{"message":"All sponsors are submitted by users like you. You can see the list of submitted sponsors in the database by opening the popup in the top right of your browser."},"helpPageHowSkippingWorks2":{"message":"Whenever you skip a segment, you will get notice. If the timing seems wrong vote down by clicking downvote! You can also vote in the popup."},"Submitting":{"message":"Submitting"},"helpPageSubmitting1":{"message":"Submitting can be made by clicking the SponsorBlock logo in the video player."},"helpPageSubmitting2":{"message":"Clicking the play button indicates the start of a segment and clicking the stop icon indicates the end. Click the up arrow button to open the submission menu where you can verify your segments by previewing and editing them to be perfect. Precision is important, make sure to read the guidelines before submitting."},"helpPageCopyOfDatabase":{"message":"Where do the submissions go?"},"helpPageCopyOfDatabase1":{"message":"All submissions are put into the SponsorBlock database, which is publicly released for anyone to use and is available at"},"helpPageCopyOfDatabase2":{"message":"The source code is freely available. So, even if something happens to me, your submissions are not lost."},"AdviceForSubmitting":{"message":"Advice for submitting"},"Credits":{"message":"Credits"},"LearnMore":{"message":"Learn More"},"FullDetails":{"message":"Full Details"},"CopyDownvoteButtonInfo":{"message":"Downvotes and creates a local copy for you to resubmit"},"OpenCategoryWikiPage":{"message":"Open this category's wiki page."},"CopyAndDownvote":{"message":"Copy and downvote"},"ContinueVoting":{"message":"Continue Voting"},"ChangeCategoryTooltip":{"message":"This will instantly apply to your segments"},"downvote":{"message":"Downvote"},"upvote":{"message":"Upvote"},"hideSegment":{"message":"Hide segment"},"skipSegment":{"message":"Skip segment"},"playChapter":{"message":"Play chapter"},"SponsorTimeEditScrollNewFeature":{"message":"Use your mousewheel while hovering over the edit box to quickly adjust the time. Combinations of the ctrl or shift key can be used to fine tune the changes."},"categoryPillNewFeature":{"message":"New! See when a video is entirely sponsored or self-promotion"},"yearAbbreviation":{"message":"y","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Behavior","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interface","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Keyboard shortcuts","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Backup/Restore","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Miscellaneous","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Skip notice appearance","description":"Option label"},"unbind":{"message":"Unbind","description":"Unbind keyboard shortcut"},"notSet":{"message":"Not set"},"change":{"message":"Change"},"youtubeKeybindWarning":{"message":"This is a built-in YouTube shortcut. Are you sure you want to use it?"},"betaServerWarning":{"message":"BETA Server is enabled!"},"openOptionsPage":{"message":"Open options page"},"resetToDefault":{"message":"Reset settings to default"},"confirmResetToDefault":{"message":"Are you sure you want to reset all settings to their default values? This cannot be undone."},"exportSegments":{"message":"Export segments"},"importSegments":{"message":"Import segments"},"Import":{"message":"Import","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Redeem Successful!"},"redeemFailed":{"message":"License key is invalid"},"hideUpsells":{"message":"Hide options not available without extra payment"},"hideNewFeatureUpdates":{"message":"Hide prompts about new features"},"redeem":{"message":"Redeem"},"enterLicenseKey":{"message":"Enter License Key"},"unsubmittedSegmentCounts":{"message":"You currently have {0} on {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"You currently have no unsubmitted segments","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"unsubmitted segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"unsubmitted segments","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videos","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Clear all segments","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Are you sure you want to clear all your unsubmitted segments?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Show segments","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Hide segments","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Segment Count","description":"Header of the unsubmitted segments list"},"actions":{"message":"Actions","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Share as URL"},"segmentFetchFailureWarning":{"message":"Warning: The server hasn't responded with segments yet. There might actually be segments on this video already submitted but you just haven't received them due to issues with the server."},"allowScrollingToEdit":{"message":"Allow scrolling to edit times"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Better Titles and Thumbnails on YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Crowdsourcing titles and thumbnails to be descriptive and not sensational","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Choose the most descriptive"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Original Title"},"CurrentTime":{"message":"Current Time"},"resetCustomTitle":{"message":"Reset Title Back To Original Text"},"resetIcon":{"message":"Reset Icon"},"TypeYourOwnTitleHere":{"message":"Type your own title here"},"VideoNotReady":{"message":"Video not ready"},"FailedToRender":{"message":"Failed to render","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas missing","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Exception while rendering","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Failed to load","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Title Format"},"Disabled":{"message":"Disabled"},"CapitalizeWords":{"message":"Capitalize Words"},"TitleCase":{"message":"Title Case"},"SentenceCase":{"message":"Sentence Case"},"LowerCase":{"message":"Lower Case"},"FirstLetterUppercase":{"message":"First Letter Uppercase"},"shouldCleanEmojis":{"message":"Remove Emojis"},"onlyFormatCustomTitles":{"message":"Only format user-submitted titles"},"onlyTitleCaseInEnglish":{"message":"Capitalize Words for Non-English Titles"},"onlyTitleCaseInEnglishDescription":{"message":"Language detection is not perfect and detects some English titles as non-English."},"thumbnailFallbackOption":{"message":"When No Submitted Thumbnail Exists"},"whatThumbnailFallbackOption":{"message":"When selecting a random time, it will use SponsorBlock data to ensure a time in a promotional segment is not selected.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Show a screenshot from a random time"},"TheOriginalThumbnail":{"message":"Show the original thumbnail"},"showABlankBox":{"message":"Show a blank box"},"AutoGenerated":{"message":"Show a thumbnail auto-generated by YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Start"},"Middle":{"message":"Middle"},"keepUnsubmitted":{"message":"Store Submitted Votes"},"showLiveCover":{"message":"Show Channel Avatar on Upcoming Videos","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Never Use A/B Tested Thumbnails"},"ignoreAbThumbnailsDescription":{"message":"Channels can setup tests on their videos where YouTube will show different thumbnails to each person. This option will always use the first thumbnail to maintain consistency."},"abThumbnailsWarning":{"message":"Warning: This video currently has a thumbnail A/B test running. This means that the thumbnail may change often. You probably should not vote for the original thumbnail due to this risk."},"whatKeepUnsubmitted":{"message":"Keep submitted votes after voting to show the titles and thumbnails you chose instead of the top voted one on the server."},"keepUnsubmittedInPrivate":{"message":"Store Submitted Votes From Private Tabs"},"useThumbnailGenerationService":{"message":"Use Thumbnail Generation Service"},"titleMaxLines":{"message":"Maximum Lines for Title"},"titleMaxLinesDescription":{"message":"Video titles will be spread over this many lines in suggestions."},"thumbnailSaturationLevel":{"message":"Thumbnail saturation level"},"whatSaturateThumbnails":{"message":"Make thumbnails less vibrant by reducing their color"},"hideDetailsWhileFetching":{"message":"Hide details while fetching"},"hideDetailsWhileFetchingDescription":{"message":"Hide titles and thumbnails while fetching data from the server. If disabled, you will experience flashing as the titles and thumbnails change over."},"ignoreTranslatedTitles":{"message":"Don't show YouTube's translated titles","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"onAllPages":{"message":"On All Pages","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"On All Pages Except Video Pages","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Never"},"thumbnailGeneratorDescription1":{"message":"The thumbnail generation service significantly speeds up thumbnail generation by sending an anonymous request with the videoID to a remote server. The thumbnail will then either be generated, or pulled from a cache if it has already been generated."},"thumbnailGeneratorDescription2":{"message":"If used on video pages, this could potentially leak unlisted videoIDs to this server. Setting this to \"On All Pages Except Video Pages\" will avoid this problem. Another option is to host your own thumbnail generation service."},"thumbnailGeneratorDescription3":{"message":"If use of the thumbnail generation service is disabled, all requests will use a k-anonymity query system, which makes it harder for the server to predict which videos were fetched, and a slower local thumbnail generation service will be used.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Thumbnail Generation Service Source Code"},"moreAboutKAnonymity":{"message":"More about K-Anonymity","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Always Display The \"Show Original\" Button"},"whatAlwaysShowShowOriginalButton":{"message":"If you want to always know if a title/thumbnail has changed, enable this."},"showOriginalOnHover":{"message":"Swap between custom details and original details on hover"},"showOriginalOnHoverOfVideo":{"message":"Swap between custom details and original details on hover of anywhere on the video card"},"showOriginalOnHoverOfVideoDescription":{"message":"This will disable auto-play on hover"},"showCustomOnHoverIfCasual":{"message":"Show custom title on hover if a casual mode title is being shown"},"showIconForFormattedTitles":{"message":"Display \"Show Original\" Button for Auto-Formatted Titles"},"Enable":{"message":"Enable"},"Titles":{"message":"Titles","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Thumbnails","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Casual votes","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Error"},"ShowOriginal":{"message":"Show Original Details"},"ShowModified":{"message":"Show Modified Details"},"ShowFormatted":{"message":"Show Formatted Details"},"FillerWarning":{"message":"Warning: This is an incredibly aggressive category. You most likely will have to unskip stuff, or disable it sometimes. Be warned that many videos have over 50% or more of the video skipped! However, remember that there are still specific guidelines to follow when submitting.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Join on Discord or Matrix to stay in this chat permanently","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Show Guideline Help","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Avoid exaggerated facial expressions","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Think big picture, don't just answer the original title's question","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Avoid describing reactions to the video (\"shocking\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Provide enough information to make an informed choice before clicking"},"tip5":{"message":"Capitalize it like a sentence","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Check all the guidelines to submit","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"My title is capitalized like a sentence","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"My title does not just answer a question posed in the title","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Titles should describe the video, or the story in general. You should make sure to watch the full video to know what it is actually about instead of relying on an intriguing original title.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"My title does not summarize a conclusion or spoil unnecessarily","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Titles are not meant to replace watching the video entirely, but instead meant for you to know if you should click or not.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"My title does not fact check, mock, or critique the video or the creator","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Titles are meant to be from the perspective of the creator and the video. Rating or fact-checking the video itself is out of scope of DeArrow. Titles are not meant as a comment section.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Detected word: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Don't use unnecessary verbs at the start of the title","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Start all titles with a capital letter. Titles should be formatted like a sentence","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Titles should not end with a '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Don't just add an answer to a question in the original title. Titles should describe the video, or the story in general","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Titles should not fact check, mock, or critique the video or the creator","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Titles should not keep sensational elements from the original title","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Titles should not contain emojis","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"You must resolve the warning before submitting"},"dearrowHelpSponsorBlockImported":{"message":"Note: Your SponsorBlock settings have been automatically imported!"},"howItWorks":{"message":"How it works"},"discordPromotion":{"message":"Come contribute, make some suggestions and help out on {discord} or on {matrix}"},"deArrowDonationText":{"message":"If you like what I've done so far, and want to help me with money, here's a link"},"termsAgreement":{"message":"By using this extension, you agree to the {privacy-policy} and {terms}"},"privacyPolicy":{"message":"Privacy Policy"},"termsOfUse":{"message":"Terms of Use"},"openSourceLicenses":{"message":"Open Source Licenses"},"defaultToOriginals":{"message":"Default To Original Video Information"},"whatDefaultToOriginals":{"message":"Show the original title and thumbnail by default, but have a button that appears on hover to see the custom titles and thumbnails."},"replaceTitles":{"message":"Replace Titles"},"replaceThumbnails":{"message":"Replace Thumbnails"},"useCrowdsourcedTitles":{"message":"Use Crowdsourced Titles"},"whatUseCrowdsourcedTitles":{"message":"If disabled, it will format titles but not use community submitted titles","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Are you sure you would like to delete this configuration?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"New Configuration"},"DeleteConfiguration":{"message":"Delete Configuration"},"ChannelAllowlist":{"message":"Channel-specific settings"},"ConfigurationName":{"message":"Configuration Name"},"ChannelListInstructions":{"message":"Enter any channels you want to apply this configuration to in the box below, separated by new lines. Both Channel IDs and display names are supported. @ Usernames are not supported. You can get channel IDs from clicking the share button on the channel's about page. To get to the about page, click on the channel description that appears below their channel name on their channel page.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"No configurations setup yet. Click the button at the top to add a new configuration.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Stop clickbait by replacing titles and thumbnails with more accurate ones"},"DeArrowPromotionMessage2":{"message":"Tired of clickbait? Check out my new extension for improving titles and thumbnails"},"DeArrowPromotionMessage3":{"message":"Also check out DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Don't like this title? If you prefer the title below, consider checking out the title replacement feature in DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"This thumbnail is chosen from a random timestamp because there isn't a submission on this video yet","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"This thumbnail is chosen from a random timestamp and the title is auto-formatted because there isn't a submission on this video yet","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"You can change this default below","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} titles and {thumbnails} thumbnails have been replaced since you installed this extension","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} title ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} titles ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"and {thumbnails} thumbnail","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"and {thumbnails} thumbnails","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} have been replaced since you installed this extension","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Count Title and Thumbnail Replacements"},"countReplacementsDescription":{"message":"Used to give you statistics in the popup.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Add a filterlist to block surveys, merch shelves, and other promotional page elements using yt-neuter"},"requiresUblock":{"message":"Requires uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Something has gone wrong with the videoID detection. Please try refreshing before submitting to ensure it gets submitted for the correct video. If this is happening a lot, please send a report of this along with the other extensions or userscripts you have installed through GitHub, Discord or Matrix."},"dearrowLogoCredit":{"message":"Logo based on Twemoji licensed under CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock is not compatible with the extension \"Zoom to Fill\". There are many alternatives you can use instead that will work properly."},"freeTrialStarted":{"message":"Your free trial has successfully started. Visit YouTube to test it out"},"freeTrialEnded":{"message":"Your free trial is over"},"freeTrialPrompt":{"message":"If you want to test it out, you can start a free trial with the button below."},"startFreeTrial":{"message":"Start free trial"},"freeAccessRequested":{"message":"You are successfully registered for free access. You will be notified when free access is granted."},"freeAccessComplete":{"message":"Congrats! You now have free access to DeArrow"},"DeArrowNotActivated":{"message":"DeArrow is not activated"},"ActivateDeArrow":{"message":"Activate DeArrow"},"DeArrowIsActivated":{"message":"DeArrow has been successfully activated"},"Close":{"message":"Close"},"ViewLicenseKey":{"message":"View License Key"},"SharingIsCaring":{"message":"Sharing is caring"},"cleanPopup":{"message":"Hide clutter in segment list popup"},"hideSegmentCreationInPopup":{"message":"Hide segment creation buttons in popup"},"syncDisabledWarning":{"message":"Warning: Extension storage has been disabled in your browser. Settings will not be saved if you try saving them."},"syncDisabledWarningDeArrow":{"message":"DeArrow will not function without storage."},"syncDisabledFirefoxSuggestions":{"message":"You can enable it by going to about:config and setting the value of \"webextensions.storage.sync.enabled\" to true."},"storageFull":{"message":"Extension storage is full. Please delete some unsubmitted segments in the options."},"previewSegmentRequired":{"message":"Please preview your segments before submitting. You can do this by clicking the preview button or using the following shortcut:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Act as VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Submissions cannot be accepted from your browser at the moment because YouTube seems to have injected some server-side advertisements that the extension is not able to remove. Please contact if you are receiving this error."},"DeArrowIsDisabled":{"message":"DeArrow is disabled - click to enable","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Are you sure that this original thumbnail follows the DeArrow guidelines? If you just prefer seeing original thumbnails in general, consider changing the \"When no submitted thumbnail exists\" option in the DeArrow settings.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"On YouTube TV, SponsorBlock is not compatible with live and recently-recorded content. If this is a recent recording, please wait a few hours for the processed version of the recording to become available.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Channel whitelisting is not supported on tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Like the original title?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Yes"},"No":{"message":"No"},"votes":{"message":"{0} votes","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} vote","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Funny","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Creative","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Clever","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Descriptive","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Other","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Classic mode","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Titles are replaced with standardized formats based on the guidelines on all videos where a crowdsourced title exists."},"CasualMode":{"message":"Casual mode","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Keep original titles when they describe the video well enough and are clever or funny.\nChoose which categories of titles you want to see.\nYou'll be able to vote if a title fits into a category or not."},"minimumVotes":{"message":"Minimum votes","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Show original thumbnail on casual mode voted videos","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"New feature: Casual mode","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Only show casual mode icon when a custom title is available"},"OpenSettings":{"message":"Open settings"},"hookNewFeature":{"message":"Notice: Hook has been moved from the Preview/Recap category to the new Hook/Greetings category","description":"The category definition has changed, this notice let's people know when they are submitting."}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/es/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/es/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Tiempo de espera agotado. Compruebe su conexión a Internet. Si su internet está funcionando, el servidor probablemente esta sobrecargado o desconectado."},"400":{"message":"El servidor dijo que esta solicitud no era válida"},"409":{"message":"Esto ya ha sido enviado antes"},"502":{"message":"El servidor parece estar sobrecargado. Inténtalo de nuevo en unos segundos."},"fullName":{"message":"SponsorBlock para YouTube - Omitir Sponsors","description":"Name of the extension."},"Description":{"message":"Salte todos los sponsors, súplicas de suscripción y más en vídeos de YouTube. Reporta sponsors en los vídeos que veas para ahorrarle tiempo a los demás.","description":"Description of the extension."},"channelWhitelisted":{"message":"¡Canal permitido!"},"Segment":{"message":"segmento"},"Segments":{"message":"segmentos"},"SegmentsCap":{"message":"Segmentos"},"Chapters":{"message":"Capítulos"},"renderAsChapters":{"message":"Procesar segmentos como capítulos","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Mostrar segmento actual al lado del tiempo del video"},"showAutogeneratedChapters":{"message":"Mostrar capítulos autogenerados por YouTube"},"upvoteButtonInfo":{"message":"Votar positivamente este envío"},"reportButtonTitle":{"message":"Denunciar"},"reportButtonInfo":{"message":"Denunciar este envío como incorrecto."},"Dismiss":{"message":"Descartar"},"Loading":{"message":"Cargando..."},"Hide":{"message":"Nunca Mostrar"},"hitGoBack":{"message":"Haz clic en no omitir para volver a donde estabas."},"unskip":{"message":"No omitir"},"reskip":{"message":"Volver a saltar"},"unmute":{"message":"Quitar silencio"},"paused":{"message":"Pausado"},"manualPaused":{"message":"Temporizador Detenido"},"confirmMSG":{"message":"Para editar o eliminar valores individuales, haz clic en el botón de información o abre la ventana de extensión haciendo clic en el icono de extensión en la esquina superior derecha."},"clearThis":{"message":"¿Estas seguro de que quieres eliminar esto?\n\n"},"Unknown":{"message":"Se ha producido un error enviando tus tiempos de sponsor, por favor inténtalo de nuevo más tarde."},"sponsorFound":{"message":"¡Este video tiene segmentos en la base de datos!"},"sponsor404":{"message":"No se han encontrado segmentos"},"sponsorStart":{"message":"Marcar inicio de segmento"},"sponsorEnd":{"message":"Marcar final de segmento"},"sponsorCancel":{"message":"Cancelar Creación de Segmento"},"noVideoID":{"message":"No se ha encontrado ningún vídeo de YouTube.\nSi esto es incorrecto, actualice la pestaña."},"refreshSegments":{"message":"Actualizar segmentos"},"success":{"message":"¡Completado!"},"voted":{"message":"¡Votado!"},"serverDown":{"message":"Parece que el servidor está desconectado. Póngase en contacto con el desarrollador inmediatamente."},"connectionError":{"message":"Ha ocurrido un error de conexión. Código de error: "},"segmentsStillLoading":{"message":"Los segmentos aún se están cargando..."},"clearTimes":{"message":"Borrar Segmentos"},"openPopup":{"message":"Abrir Ventana de SponsorBlock"},"closePopup":{"message":"Cerrar la ventana"},"closeIcon":{"message":"Icono de cerrar"},"OpenSubmissionMenu":{"message":"Abrir Menú de Envíos"},"OpenCasualVoteMenu":{"message":"Abrir el menú en modo casual"},"sortSegments":{"message":"Ordenar Segmentos"},"submitCheck":{"message":"¿Estás seguro de que quieres enviar esto?"},"whitelistChannel":{"message":"Permitir Canal"},"removeFromWhitelist":{"message":"Quitar canal de la lista blanca"},"voteOnTime":{"message":"Vote En Un Segmento"},"Submissions":{"message":"Envíos"},"savedPeopleFrom":{"message":"Has salvado a personas de "},"viewLeaderboard":{"message":"Tablas de clasificación"},"recordTimesDescription":{"message":"Enviar"},"submissionEditHint":{"message":"La edición de la sección aparecerá después de hacer clic en enviar","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Sugerencia: Puede asignar teclas para el envío en las opciones"},"clearTimesButton":{"message":"Eliminar Tiempos"},"Username":{"message":"Nombre de Usuario"},"setUsername":{"message":"Escoger Nombre De Usuario"},"copyPublicID":{"message":"Copiar el ID de usuario Público"},"copySegmentID":{"message":"Copiar ID de Segmento"},"loopChapter":{"message":"Acoplar cspítulo"},"unloopChapter":{"message":"Desacoplar capítulo"},"hideThis":{"message":"No mostrar esto"},"Options":{"message":"Opciones"},"showButtons":{"message":"Mostrar botones en el reproductor de YouTube"},"hideButtonsDescription":{"message":"Esto oculta los botones que aparecen en el reproductor de YouTube que se usan para enviar segmentos saltados."},"showSkipButton":{"message":"Mantener el Botón de \"Saltar a Destacado\" en el Reproductor"},"showInfoButton":{"message":"Mostrar botón de información en el reproductor de YouTube"},"autoHideInfoButton":{"message":"Ocular automáticamente el Botón de Información"},"showDeleteButton":{"message":"Mostrar botón de eliminar en el reproductor de YouTube"},"enableViewTracking":{"message":"Habilitar el conteo de omisiones"},"whatViewTracking":{"message":"Esta función rastrea los segmentos que se han saltado para que los usuarios sepan en qué medida sus envíos ayudaron a los demás y se utilizan como una métrica junto con los votos positivos para garantizar que no aparezca spam en la base de datos. La extensión envía un mensaje al servidor cada vez que se salta un segmento. Esperemos que la mayoría de la gente no cambie esta configuración para que los números de vistas sean exactos. :)"},"enableViewTrackingInPrivate":{"message":"Activar el seguimiento del número de saltos en las pestañas privadas/de incógnito"},"enableTrackDownvotes":{"message":"Almacenar los votos negativos de los segmentos"},"whatTrackDownvotes":{"message":"Los segmentos que votes negativamente permanecerán ocultos incluso después de actualizar la página"},"trackDownvotesWarning":{"message":"Advertencia: Desactivar esto eliminará todos los votos negativos previamente almacenados"},"enableTrackDownvotesInPrivate":{"message":"Almacenar los votos negativos de segmentos en pestañas privadas/incognito"},"enableQueryByHashPrefix":{"message":"Consulta Por Prefijo Hash"},"whatQueryByHashPrefix":{"message":"En el lugar de solicitar segmentos del servidor usando el videoID, se envían los primeros 4 caracteres del hash del videoID. Este servidor devolverá los datos de todos los vídeos con hashes similares."},"enableShowCategoryWithoutPermission":{"message":"Mostrar categorías en el menú de envío, incluso al no tener permiso de envío"},"whatShowCategoryWithoutPermission":{"message":"Algunas categorías requieren permiso para enviar debido a los requisitos mínimos de reputación"},"showNotice":{"message":"Mostrar aviso de nuevo"},"showSkipNotice":{"message":"Mostrar aviso después de que se omita un segmento"},"showUpcomingNotice":{"message":"Mostrar aviso antes del inicio de un segmento"},"showCategoryGuidelines":{"message":"Mostrar Ayuda de la Categoría"},"noticeVisibilityMode0":{"message":"Avisos de Omisión de Tamaño Completo"},"noticeVisibilityMode1":{"message":"Avisos de Omisión Pequeños para la Omisión Automática"},"noticeVisibilityMode2":{"message":"Todos los Avisos de Omisión Pequeños"},"noticeVisibilityMode3":{"message":"Avisos de Omisión Desvanecidos para la Omisión Automática"},"noticeVisibilityMode4":{"message":"Todos los Avisos de Omisión Desvanecidos"},"longDescription":{"message":"SponsorBlock te permite saltarte los patrocinadores, intros, outros, recordatorios de suscripción y otras partes molestas de los videos de YouTube. SponsorBlock es una extensión de navegador de código abierto que permite a cualquiera enviar el tiempo de inicio y fin de los segmentos de patrocinadores y otros segmentos de los videos de YouTube. Una vez que una persona envía esta información, todos los que tengan esta extensión podrán saltearse ese segmento. También es posible saltar las secciones no musicales de los videos musicales.","description":"Full description of the extension on the store pages."},"website":{"message":"Sitio Web","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Código Fuente","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"¡El aviso ha sido actualizado!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Si aún no te gusta, pulsa el botón de nunca mostrar.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Omitir segmento","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Iniciar/detener segmento","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Abrir menú de envíos","description":"Keybind label"},"setSubmitKeybind":{"message":"Enviar segmentos","description":"Keybind label"},"setPreviewKeybind":{"message":"Previsualizar segmento","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Cerrar aviso de salto","description":"Keybind label"},"setDownvoteKeybind":{"message":"Segmento de voto positivo","description":"Keybind label"},"setUpvoteKeybind":{"message":"Segmento de voto negativo","description":"Keybind label"},"nextChapterKeybind":{"message":"Siguiente capítulo","description":"Keybind label"},"previousChapterKeybind":{"message":"Capítulo anterior","description":"Keybind label"},"enableDeArrowKey":{"message":"Tecla que activa DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Abrir menú de envíos","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Selecciona una tecla escribiéndola y elige las teclas modificadoras que desees utilizar."},"disableSkipping":{"message":"Saltar está activado"},"enableSkipping":{"message":"Saltar está desactivado"},"yourWork":{"message":"Tu trabajo","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Código de Error: "},"skip":{"message":"Omitir"},"mute":{"message":"Silenciar"},"full":{"message":"Video Completo","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"¿Saltar {0}?"},"mute_category":{"message":"¿Silenciar {0}?"},"skip_to_category":{"message":"¿Saltar a {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Próximamente {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} Omitido/as","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} Silenciado","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Se ha saltado a {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Votado en {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Desactivar la omisión automática"},"enableAutoSkip":{"message":"Activar la omisión automática"},"audioNotification":{"message":"Notificación de audio al omitir"},"audioNotificationDescription":{"message":"Si se salta un segmento, se oirá un sonido de notificación de audio. Si se desactiva (o si se desactiva la función de omisión automática), no se reproducirá ningún sonido."},"showTimeWithSkips":{"message":"Mostrar la duración del video con las secciones omitidas"},"showTimeWithSkipsDescription":{"message":"Esta duración aparece entre paréntesis junto al tiempo actual del video, debajo de la barra de navegación. Esta muestra la duración total del vídeo menos cualquier segmento eliminado. Esto incluye los segmentos marcados como solo \"Mostrar en la barra de navegación\"."},"youHaveSkipped":{"message":"Has saltado "},"minLower":{"message":"minuto"},"minsLower":{"message":"minutos"},"hourLower":{"message":"hora"},"hoursLower":{"message":"horas"},"youHaveSavedTime":{"message":"Has salvado personas","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" de sus vidas","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Comprueba status.sponsor.ajay.app para ver el estado del servidor."},"changeUserID":{"message":"Importar/Exportar su ID de usuario privado"},"whatChangeUserID":{"message":"Esto se debería mantener privado. Esto es como una contraseña y no debe ser compartido con nadie. Si alguien tiene esto, puede suplantarte. Si estás buscando tu ID de usuario Público, haz clic en el icono de portapapeles en la ventana emergente."},"setUserID":{"message":"Establecer ID de usuario privado"},"userIDChangeWarning":{"message":"Advertencia: El cambio del ID de usuario privado es permanente. ¿Está seguro/a de que desea hacer esto? Asegúrese de respaldar el antiguo por si acaso."},"createdBy":{"message":"Creado Por"},"supportOtherSites":{"message":"Soportar sitios de YouTube de terceros"},"supportOtherSitesDescription":{"message":"Admite clientes de YouTube de terceros. Para habilitar el soporte, debe aceptar los permisos adicionales.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Sitios compatibles: "},"optionsInfo":{"message":"Activar el soporte para Invidious, desactivar la omisión automática, oculta botones y más."},"addInvidiousInstance":{"message":"Añadir instancia de cliente de terceros"},"addInvidiousInstanceDescription":{"message":"Añadir una instancia personalizada. Esta debe formatearse SÓLO con el dominio. Ejemplo: invidious.ajay.app"},"add":{"message":"Agregar"},"addInvidiousInstanceError":{"message":"Este es un dominio inválido. SÓLO debería incluir la parte del dominio. Ejemplo: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Restablecer la lista de instancias de Invidious"},"resetInvidiousInstanceAlert":{"message":"Está a punto de reiniciar la lista de instancias del Invidious"},"invidiousDisabledSafari":{"message":"Por el momento no se ofrece soporte debido a un error del mismo Navegador Safari. Cuando Apple solucione el error, se añadirá de nuevo."},"currentInstances":{"message":"Instancias actuales:"},"minDuration":{"message":"Duración mínima (segundos):"},"minDurationDescription":{"message":"Los segmentos más cortos que el valor configurado no se omitirán ni se mostrarán en el reproductor."},"enableManualSkipOnFullVideo":{"message":"Usar omisión manual cuando existe una etiqueta de vídeo completa"},"whatManualSkipOnFullVideo":{"message":"Para las personas que quieren ver el video sin interrupción si es totalmente patrocinado o autopromoción."},"skipNoticeDuration":{"message":"Duración del aviso de omisión (segundos):"},"skipNoticeDurationDescription":{"message":"El aviso de omisión permanecerá en la pantalla por lo menos este tiempo. Si la omisión es manual, podría ser visible por más tiempo."},"shortCheck":{"message":"El siguiente envío es más corto que su opción de duración mínima. Esto podría significar que esto ya se ha enviado y que simplemente se ha ignorado debido a esta opción. ¿Está seguro de que desea enviar?"},"liveOrPremiere":{"message":"No se permite enviar en una transmisión en vivo activa o estreno. Espere hasta que finalice, luego actualice la página y verifique que los segmentos aún sean válidos."},"showUploadButton":{"message":"Mostrar botón de subida"},"customServerAddress":{"message":"Dirección del servidor SponsorBlock"},"customServerAddressDescription":{"message":"La dirección que SponsorBlock utiliza para hacer llamadas al servidor.\nA menos que tengas tu propia instancia del servidor, no debería cambiarse."},"dataFetchingServerAddress":{"message":"Dirección del servidor de obtención de datos"},"dataFetchingServerAddressDescription":{"message":"La dirección utilizada para hacer llamadas al servidor de obtención de datos.\nA menos que tenga su propia instancia de servidor, esto no debería cambiarse."},"thumbnailCacheServerAddress":{"message":"Dirección del servidor de caché de miniaturas"},"save":{"message":"Guardar"},"reset":{"message":"Restablecer"},"customAddressError":{"message":"La dirección no tiene el formato adecuado. Asegúrese de que tenga http:// o https:// al principio y que no haya barras al final."},"areYouSureReset":{"message":"¿Estás seguro de que te gustaría reiniciar esto?"},"mobileUpdateInfo":{"message":"m.youtube.com ahora es compatible"},"exportOptions":{"message":"Importar/Exportar todas las opciones"},"exportOtherData":{"message":"Importar/Exportar todos los demás datos"},"exportOptionsCopy":{"message":"Editar/copiar"},"exportOptionsDownload":{"message":"Guardar en archivo"},"exportOptionsUpload":{"message":"Cargar desde archivo"},"whatExportOptions":{"message":"Esta es toda su configuración en JSON. Esto incluye tu ID de usuario Privado, asegúrese de compartir esto con prudencia."},"setOptions":{"message":"Configurar opciones"},"exportOptionsWarning":{"message":"Advertencia: cambiar las opciones es permanente y puede romper la instalación. ¿Estás seguro de que te gustaría hacer esto? Asegúrate de hacer una copia de seguridad de la antigua por si acaso."},"incorrectlyFormattedOptions":{"message":"Este JSON no está correctamente formateado. Sus opciones no han sido cambiadas."},"confirmNoticeTitle":{"message":"Enviar segmento"},"submit":{"message":"Enviar"},"cancel":{"message":"Cancelar"},"delete":{"message":"Eliminar"},"preview":{"message":"Vista Previa"},"unsubmitted":{"message":"No enviado"},"inspect":{"message":"Inspeccionar"},"edit":{"message":"Editar"},"copyDebugLogs":{"message":"Copiar registros de depuración"},"copyDebugInformation":{"message":"Copiar información de depuración al portapapeles"},"copyDebugInformationFailed":{"message":"Error al escribir al portapapeles"},"copyDebugInformationOptions":{"message":"Copia la información al portapapeles para ser proporcionada a un desarrollador cuando levanta un error / cuando un desarrollador lo solicita. Información sensible como su ID de usuario, canales de la lista blanca y la dirección del servidor personalizado han sido eliminados. Sin embargo, contiene información como su agente de usuario, navegador, sistema operativo y número de versión de la extensión. "},"copyDebugInformationComplete":{"message":"La información de depuración ha sido copiada al portapapeles. Siéntase libre de eliminar cualquier información que prefiera no compartir. Guarde esto en un archivo de texto o péguelo en el informe de errores."},"keyAlreadyUsed":{"message":"Este atajo está vinculado a otra acción. Por favor, selecciona uno diferente."},"to":{"message":"a","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"¡Copiado!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Incluye transiciones entre segmentos"},"generic_guideline2":{"message":"Reproduce como si nada se omitiera"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Promoción pagada, recomendaciones pagadas y anuncios directos. No para promoción propia o agradecimientos gratuitos a causas/creadores/sitios web/productos que les gusten."},"category_sponsor_guideline1":{"message":"Promociones pagadas"},"category_sponsor_guideline2":{"message":"No para donaciones o mercancía personalizada"},"category_selfpromo":{"message":"Promoción Propia/No Remunerada"},"category_selfpromo_description":{"message":"Similar a \"sponsor\", excepto que para la promoción propia o no remunerada. Esto incluye secciones sobre mercancía, donaciones o información sobre con quiénes colaboraron."},"category_selfpromo_guideline1":{"message":"Donaciones, membresías y mercancía personalizada"},"category_selfpromo_guideline2":{"message":"Agradecimientos gratuitos que no contribuyen al video"},"category_selfpromo_guideline3":{"message":"No para productos ni mercancía diseñados por empresas"},"category_exclusive_access":{"message":"Acceso Exclusivo"},"category_exclusive_access_description":{"message":"Solo para etiquetar videos completos. Utilizado cuando un video exhibe un producto, servicio o ubicación al que han recibido acceso gratuito o subsidiado."},"category_exclusive_access_pill":{"message":"Este video exhibe un producto, servicio o ubicación al que han recibido acceso gratuito o subsidiado","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Todo el video muestra algo con acceso gratuito o subsidiado"},"category_interaction":{"message":"Recordatorio de Interacción (Suscribir)"},"category_interaction_description":{"message":"Cuando hay un breve recordatorio para dar me gusta, suscribirse o seguirlos en medio del contenido. Si es largo o sobre algo específico, debería estar bajo promoción propia en su lugar."},"category_interaction_guideline1":{"message":"Recordatorios breves para dar me gusta, suscribirse o seguir"},"category_interaction_guideline2":{"message":"Incluye recordatorios indirectos para comentar"},"category_interaction_guideline3":{"message":"No para promoción general, solo llamadas a la acción"},"category_interaction_short":{"message":"Recordatorio de Interacción"},"category_intro":{"message":"Intermisión/Animación de Introducción"},"category_intro_description":{"message":"Un intervalo sin contenido real. Podría ser una pausa, un cuadro estático, una animación repetida. Esto no debe ser usado para transiciones que contengan información."},"category_intro_short":{"message":"Intermisión"},"category_intro_guideline1":{"message":"Intervalo sin contenido real"},"category_intro_guideline2":{"message":"No para transiciones con información"},"category_outro":{"message":"Tarjetas/Créditos"},"category_outro_description":{"message":"Créditos o cuando aparecen las tarjetas finales de YouTube. No para conclusiones con información."},"category_outro_guideline1":{"message":"No incluyas contenido, aun si las tarjetas finales están en pantalla"},"category_preview_description":{"message":"Colección de clips que muestran lo que vendrá en este video u otros videos en una serie en la cual toda la información es repetida en el video."},"category_preview_guideline1":{"message":"Clips que aparecen más tarde o en un video futuro"},"category_preview_guideline2":{"message":"Recapitulación de un video anterior"},"category_preview_guideline3":{"message":"No para secciones que añaden contenido adicional"},"category_filler":{"message":"Desvío del tema/Divagues"},"category_filler_description":{"message":"Desvíos del tema principal o divagues añadidos solo como relleno o humor que no son necesarias para entender el contenido principal del video. Esto no debería incluir segmentos que proporcionen contexto o detalles de fondo. Es una categoría muy agresiva pensada para cuando no se está de humor para «divertirse»."},"category_filler_guideline2":{"message":"Distracciones, bloopers, repeticiones"},"category_filler_guideline3":{"message":"No para escenas requeridas para entender el tema"},"category_music_offtopic":{"message":"Música: Sección sin musica"},"category_music_offtopic_description":{"message":"Sólo para el uso en vídeos musicales. Esto sólo debe utilizarse para secciones de vídeos musicales que no están ya cubiertos por otra categoría."},"category_music_offtopic_short":{"message":"Sin Música"},"category_music_offtopic_guideline1":{"message":"Secciones que no están en versiones oficiales"},"category_music_offtopic_guideline2":{"message":"Secciones sin música en un espectáculo en vivo"},"category_poi_highlight":{"message":"Destacado"},"category_poi_highlight_description":{"message":"La parte del video que la mayoría de gente está buscando. Similar a los comentarios que dicen \"El video comienza en x\"."},"category_poi_highlight_guideline1":{"message":"Sección que busca la mayoría"},"category_poi_highlight_guideline2":{"message":"Puede omitir contexto"},"category_poi_highlight_guideline3":{"message":"Puede saltar al título o miniatura"},"category_chapter":{"message":"Capítulo"},"category_chapter_description":{"message":"Capítulos con nombre personalizado que describen las secciones principales de un video."},"category_chapter_guideline1":{"message":"No mencione las marcas del patrocinador"},"category_chapter_guideline2":{"message":"Usar capítulos más grandes para secciones generales"},"category_chapter_guideline3":{"message":"Los capítulos más pequeños pueden colocarse dentro de capítulos más grandes"},"category_livestream_messages":{"message":"Directo: Lecturas de donaciones y mensajes"},"category_livestream_messages_short":{"message":"Lectura del mensaje"},"autoSkip":{"message":"Omitir automáticamente"},"manualSkip":{"message":"Omisión manual"},"showOverlay":{"message":"Mostrar en la barra de búsqueda"},"disable":{"message":"Desactivar"},"autoSkip_POI":{"message":"Omitir automáticamente al inicio"},"manualSkip_POI":{"message":"Preguntar cuando cargue el video"},"showOverlay_POI":{"message":"Mostrar en la barra de búsqueda"},"showOverlay_full":{"message":"Mostrar Etiqueta"},"showOverlay_chapter":{"message":"Mostrar capítulos"},"autoSkipOnMusicVideos":{"message":"Omitir automáticamente todos los segmentos cuando hay un segmento sin música"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Solo saltear automáticamente en music.youtube.com"},"muteSegments":{"message":"Permitir segmentos que silencian el audio en lugar de omitir"},"fullVideoSegments":{"message":"Mostrar un icono cuando un video es enteramente un anuncio","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"También mostrar etiquetas en las miniaturas de los videos","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Color No Enviado","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Color de la barra de búsqueda"},"category":{"message":"Categoría"},"skipOption":{"message":"Opción de Saltar","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"advancedSkipSettingsHelp":{"message":"Cómo funciona esto","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Habilitar Servidor de Pruebas Beta"},"whatEnableTestingServer":{"message":"Sus envíos y votos NO CONTABILIZARÁN hacia el servidor principal. Sólo use esto para probar."},"testingServerWarning":{"message":"Todos los envíos y votos NO CONTABILIZARÁN hacia el servidor principal mientras se conecten al servidor de prueba. Asegúrate de desactivar esto cuando quieras hacer presentaciones reales."},"bracketNow":{"message":"(Ahora)"},"moreCategories":{"message":"Más categorías"},"chooseACategory":{"message":"Elija una categoría"},"enableThisCategoryFirst":{"message":"Para enviar segmentos con la categoría de \"{0}\", debes activarlo en las opciones. Serás redirigido a las opciones ahora.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Advertencia: Solo puede haber uno de este tipo de segmento activo a la vez. Enviar múltiples causará que se muestre uno al azar."},"youMustSelectACategory":{"message":"¡Debes seleccionar una categoría para todos los segmentos que estés presentando!"},"bracketStart":{"message":"(Inicio)"},"bracketEnd":{"message":"(Final)"},"End":{"message":"Final","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"oculto: voto negativo"},"hiddenDueToDuration":{"message":"oculto: demasiado corto"},"manuallyHidden":{"message":"manualmente oculto"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"El ID del canal no está cargado todavía. Si está usando un vídeo incrustado, intente usar la página de inicio de YouTube en su lugar. Esto también podría ser causado por cambios en el diseño de YouTube, si lo cree, haga un comentario aquí:"},"invidiousPermissionRefresh":{"message":"El navegador ha revocado el permiso necesario para funcionar en Invidious y otros sitios de terceros. Por favor, haga clic en el botón de abajo para reactivar este permiso."},"acceptPermission":{"message":"Aceptar permiso"},"permissionRequestSuccess":{"message":"¡Petición de permiso realizada con éxito!"},"permissionRequestFailed":{"message":"La petición de permiso ha fallado, ¿ha hecho clic en denegar?"},"adblockerIssueWhitelist":{"message":"Si no puede resolverlo, desactive la opción \"Forzar Comprobación de Canal antes de Saltar\", ya que SponsorBlock no puede recuperar la información del canal de este video"},"forceChannelCheck":{"message":"Forzar Comprobación de Canal antes de Saltar"},"whatForceChannelCheck":{"message":"Por defecto, se saltará los segmentos inmediatamente antes de saber cuál es el canal. Por defecto, algunos segmentos al principio del vídeo pueden ser salteados en los canales de la lista blanca. Al activar esta opción se evitará esto, pero haciendo que todos los saltos tengan un ligero retraso, ya que obtener el ID del canal puede llevar algún tiempo. Este retraso podría ser imperceptible si tienes una Internet rápida."},"forceChannelCheckPopup":{"message":"Considere la posibilidad de activar \"Forzar Comprobación de Canal antes de Saltar\""},"downvoteDescription":{"message":"Tiempo incorrecto/equivocado"},"incorrectVote":{"message":"Incorrecto"},"harmfulVote":{"message":"Perjudicial","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Cambiar Categoría"},"nonMusicCategoryOnMusic":{"message":"Este video está clasificado como música. ¿Estás seguro de que esto tiene un sponsor? Si esto es realmente un \"Segmento Sin Música\", abre las opciones de la extensión y activa esta categoría. Entonces, puedes enviar este segmento como \"Sin Música\" en lugar de sponsor. Por favor, lee las instrucciones si estás confundido/a."},"multipleSegments":{"message":"Múltiples segmentos"},"guidelines":{"message":"Instrucciones"},"readTheGuidelines":{"message":"¡¡¡Lee las instrucciones!!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"¡Las categorías están aquí!"},"categoryUpdate2":{"message":"Abre las opciones de saltarse intros, outros, mercancía, etc."},"help":{"message":"Ayuda"},"GotIt":{"message":"Entendido","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Este segmento es grande. Si todo el video es acerca de un tema, entonces cámbielo de \"Omitir\" a \"Video completo\". Consulte las instrucciones para más información."},"categoryPillTitleText":{"message":"Todo el video está etiquetado como esta categoría y está muy estrechamente integrado como para poder separarlo"},"chapterNameTooltipWarning":{"message":"Uno de los nombres de sus capítulos es similar a una categoría. Debería usar categorías cuando sea posible en su lugar."},"experiementOptOut":{"message":"No participar en futuros experimentos","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Ocultar para siempre"},"warningChatInfo":{"message":"Nos hemos dado cuenta de que cometías algunos errores comunes. Apreciamos mucho tu trabajo hasta ahora, pero aquí nos esforzamos por alcanzar la perfección, así que incluso los errores más pequeños importan :)"},"questionButton":{"message":"Tengo una pregunta"},"askAQuestion":{"message":"Hacer una pregunta"},"warningConfirmButton":{"message":"Entiendo la razón"},"warningError":{"message":"Error al intentar confirmar la advertencia:"},"deArrowMessageRecieved":{"message":"Has recibido una sugerencia de un moderador"},"Donate":{"message":"Donar"},"considerDonating":{"message":"Ayuda a financiar el desarrollo"},"hideDonationLink":{"message":"Ocultar enlace de donación"},"darkModeOptionsPage":{"message":"Modo Oscuro en la página de Opciones"},"helpPageThanksForInstalling":{"message":"Gracias por instalar SponsorBlock."},"helpPageReviewOptions":{"message":"Por favor, revise las siguientes opciones"},"helpPageFeatureDisclaimer":{"message":"Muchas funciones están desactivadas por defecto. Si quiere saltar intros, outros, usar Invidious, etc., actívelos a continuación. También puede ocular/mostrar los elementos de la interfaz."},"helpPageHowSkippingWorks":{"message":"Cómo funciona"},"helpPageHowSkippingWorks2":{"message":"Cada vez que salte un segmento, recibirá un aviso. ¡Si el tiempo parece equivocado, dele un voto negativo! También puede votar en la ventana emergente."},"Submitting":{"message":"Envío"},"helpPageCopyOfDatabase2":{"message":"El código fuente está disponible libremente. Así que, aun si algo me sucede, sus envíos no se perderán."},"Credits":{"message":"Créditos"},"LearnMore":{"message":"Aprenda Más"},"FullDetails":{"message":"Detalles Completos"},"CopyDownvoteButtonInfo":{"message":"Vota negativamente y crea una copia local para que la puedas volver a enviar"},"OpenCategoryWikiPage":{"message":"Abrir la página de la wiki de esta categoría."},"CopyAndDownvote":{"message":"Copiar y votar negativamente"},"ContinueVoting":{"message":"Continuar Votando"},"ChangeCategoryTooltip":{"message":"Esto se aplicará instantáneamente a tus segmentos"},"downvote":{"message":"Votar negativamente"},"upvote":{"message":"Votar positivamente"},"hideSegment":{"message":"Ocultar segmento"},"skipSegment":{"message":"Omitir segmento"},"playChapter":{"message":"Reproducir capítulo"},"SponsorTimeEditScrollNewFeature":{"message":"Utilice la rueda del ratón mientras pasa el cursor por encima del cuadro de edición para ajustar el tiempo. Se pueden utilizar combinaciones de la tecla ctrl o shift para afinar los cambios."},"categoryPillNewFeature":{"message":"¡Nuevo! Mira cuando un video es enteramente un sponsor o una promoción propia"},"yearAbbreviation":{"message":"a","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Comportamiento","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interfaz","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Atajos de teclado","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Respaldar/Restaurar","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Miscelánea","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Apariencia del aviso de omisión","description":"Option label"},"unbind":{"message":"Desvincular","description":"Unbind keyboard shortcut"},"notSet":{"message":"No establecido"},"change":{"message":"Cambiar"},"youtubeKeybindWarning":{"message":"Este un atajo incorporado de YouTube. ¿Estás seguro de que quieres usarlo?"},"betaServerWarning":{"message":"¡El servidor BETA está activado!"},"openOptionsPage":{"message":"Abrir página de opciones"},"resetToDefault":{"message":"Restablecer los ajustes por defecto"},"confirmResetToDefault":{"message":"¿Estás seguro de que quieres restablecer todos los ajustes a sus valores por defecto? Esto no se puede deshacer."},"exportSegments":{"message":"Exportar segmentos"},"importSegments":{"message":"Importar segmentos"},"Import":{"message":"Importar","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"¡Canje exitoso!"},"redeemFailed":{"message":"La clave de la licencia es inválida"},"hideUpsells":{"message":"Ocultar opciones no disponibles sin pago extra"},"hideNewFeatureUpdates":{"message":"Ocultar sugerencias sobre nuevas características"},"redeem":{"message":"Canjear"},"enterLicenseKey":{"message":"Ingresar clave de licencia"},"unsubmittedSegmentCounts":{"message":"Actualmente tienes {0} en {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Actualmente, no tiene segmentos sin enviar","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"segmento no enviado","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"segmentos no enviados","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"vídeos","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Borrar todos los segmentos","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"¿Estás seguro de que quieres borrar todos tus segmentos no enviados?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Mostrar segmentos","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Ocultar segmentos","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID del vídeo","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Conteo de segmentos","description":"Header of the unsubmitted segments list"},"actions":{"message":"Acciones","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Compartir como URL"},"segmentFetchFailureWarning":{"message":"Advertencia: El servidor aún no ha respondido con segmentos. Es posible que haya segmentos en este video ya enviados, pero no los ha recibido debido a problemas con el servidor."},"allowScrollingToEdit":{"message":"Permitir desplazamiento para editar tiempos"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Mejores títulos y miniaturas en Youtube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Colaboración colectiva para que títulos y miniaturas sean descriptivos y no sensacionalistas","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Elige el más descriptivo"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Título original"},"CurrentTime":{"message":"Tiempo Actual"},"resetCustomTitle":{"message":"Restablecer título al texto original"},"resetIcon":{"message":"Restablecer icono"},"TypeYourOwnTitleHere":{"message":"Escribe tu propio título aquí"},"VideoNotReady":{"message":"El vídeo no está listo"},"FailedToRender":{"message":"Error al procesar","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas HTML faltante","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Excepción al procesar","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Error al cargar","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Formato de Título"},"Disabled":{"message":"Deshabilitado"},"CapitalizeWords":{"message":"Poner palabras en mayúsculas"},"TitleCase":{"message":"Todo en Mayúsculas, Excepto Artículos, Preposiciones y Algunas Conjunciones"},"SentenceCase":{"message":"Solo primera letra en mayúscula"},"LowerCase":{"message":"Minúsculas"},"FirstLetterUppercase":{"message":"Primera letra en mayúscula"},"shouldCleanEmojis":{"message":"Eliminar emojis"},"onlyTitleCaseInEnglish":{"message":"Poner en mayúsculas los títulos que no están en inglés"},"onlyTitleCaseInEnglishDescription":{"message":"La detección de idiomas no es perfecta y detecta algunos títulos en Inglés como si no estuvieran en Inglés."},"thumbnailFallbackOption":{"message":"Cuando no exista una miniatura enviada"},"whatThumbnailFallbackOption":{"message":"Al seleccionar un tiempo aleatorio, se utilizarán los datos de SponsorBlock para asegurar que no se seleccione un tiempo durante un segmento promocional.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Mostrar una captura de pantalla desde un tiempo aleatorio"},"TheOriginalThumbnail":{"message":"Mostrar la miniatura original"},"showABlankBox":{"message":"Mostrar un cuadro en blanco"},"AutoGenerated":{"message":"Mostrar una miniatura autogenerada por YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Inicio"},"Middle":{"message":"Medio"},"keepUnsubmitted":{"message":"Almacenar votos enviados"},"showLiveCover":{"message":"Mostrar avatar del Canal en los próximos videos","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Nunca utilice miniaturas en prueba A/B"},"ignoreAbThumbnailsDescription":{"message":"Los canales pueden realizar pruebas en sus vídeos en las que YouTube mostrará miniaturas diferentes a cada persona. Esta opción utilizará siempre la primera miniatura para mantener la consistencia."},"abThumbnailsWarning":{"message":"Advertencia: En este vídeo se está realizando una prueba A/B de miniaturas. Esto significa que la miniatura puede cambiar a menudo. Probablemente no deberías votar por la miniatura original debido a este riesgo."},"whatKeepUnsubmitted":{"message":"Mantenga los votos enviados después de la votación para mostrar los títulos y miniaturas que eligió en lugar de uno de los mejores votados en el servidor."},"keepUnsubmittedInPrivate":{"message":"Almacenar votos enviados desde pestañas privadas"},"useThumbnailGenerationService":{"message":"Usar servicio de generación de miniaturas"},"titleMaxLines":{"message":"Máximo de líneas para el título"},"titleMaxLinesDescription":{"message":"Los títulos de los videos se extenderán en esta cantidad de líneas en las sugerencias."},"thumbnailSaturationLevel":{"message":"Nivel de saturación de miniatura"},"whatSaturateThumbnails":{"message":"Atenuar miniaturas reduciendo su color"},"hideDetailsWhileFetching":{"message":"Ocultar detalles al obtener datos"},"hideDetailsWhileFetchingDescription":{"message":"Ocultar títulos y miniaturas al obtener datos desde el servidor. Si está deshabilitado, experimentará parpadeos al cambiar los títulos y miniaturas."},"onAllPages":{"message":"En todas las páginas","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"En todas las páginas, excepto páginas de video","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Nunca"},"thumbnailGeneratorDescription1":{"message":"El servicio de generación de miniaturas acelera significativamente la generación de miniaturas enviando una solicitud anónima con el videoID a un servidor remoto. La miniatura se generará o se extraerá de un caché si ya se ha generado."},"thumbnailGeneratorDescription2":{"message":"Si se utiliza en las páginas de video, potencialmente podría filtrar los videoID ocultos a este servidor. Establecer esto como \"En todas las páginas, excepto páginas de video\" evitará este problema. Otra opción es alojar su propio servicio de generación de miniaturas."},"thumbnailGeneratorDescription3":{"message":"Si el uso del servicio de generación de miniaturas está deshabilitado, todas las peticiones usarán un sistema de consulta k-anonymity, lo que hace más difícil para el servidor predecir qué videos se obtuvieron y se usará un servicio local de generación de miniaturas más lento.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Código fuente del servicio de generación de miniaturas"},"moreAboutKAnonymity":{"message":"Más sobre de K-Anonimato","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Mostrar siempre el botón \"Mostrar original\""},"whatAlwaysShowShowOriginalButton":{"message":"Si desea saber siempre si un título/imagen ha cambiado, active esto."},"showCustomOnHoverIfCasual":{"message":"Mostrar título personalizado al pasar el cursor si se muestra un título de modo ocasional"},"showIconForFormattedTitles":{"message":"Mostrar el botón \"Mostrar original\" para los títulos autoformateados"},"Enable":{"message":"Habilitar"},"Titles":{"message":"Títulos","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniaturas","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Votos casuales","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Error"},"ShowOriginal":{"message":"Mostrar Detalles Originales"},"ShowModified":{"message":"Mostrar Detalles Modificados"},"FillerWarning":{"message":"Advertencia: Esta es una categoría increíblemente agresiva. Lo más probable es que tenga que deshacer cosas, o desactivarla a veces. ¡Tenga en cuenta que muchos vídeos tienen más del 50% o más del vídeo omitido! Sin embargo, recuerde que aún hay guías específicas a seguir al enviar.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Únete a Discord o Matrix para permanecer en este chat permanentemente","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Mostrar guía de ayuda","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Evita expresiones faciales exageradas","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Piensa en grande, no te limites a responder la pregunta del título original","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Evitar describir las reacciones al video (\"impactante\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Proporciona información suficiente para tomar una decisión informada antes de hacer clic"},"tip5":{"message":"Pon la primera letra en mayúscula","description":"Tip about submitting titles to DeArrow"},"DetectedWord":{"message":"Palabra detectada: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"No usar verbos innecesarios al inicio del título","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Comenzar todos los títulos con una letra mayúscula. Los títulos deben ser formateados como una frase","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Los títulos no deben terminar con un '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"No sólo agregue una respuesta a una pregunta en el título original. Los títulos deben describir el vídeo, o la historia en general","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Los títulos no deben verificar los hechos, burlarse o criticar el vídeo o al creador","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Los títulos no deben mantener elementos sensacionalistas del título original","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Los títulos no deben contener emojis","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Debe resolver la advertencia antes de enviar"},"dearrowHelpSponsorBlockImported":{"message":"Nota: ¡Tu configuración de SponsorBlock se ha importado automáticamente!"},"howItWorks":{"message":"¿Cómo funciona?"},"discordPromotion":{"message":"Ven a contribuir, haz algunas sugerencias y ayuda en {discord} o en {matrix}"},"deArrowDonationText":{"message":"Si te gusta lo que he hecho hasta ahora, y quieres ayudarme con algo de dinero, aquí tienes un enlace"},"termsAgreement":{"message":"Al usar esta extensión, aceptas la {privacy-policy} y los {terms}"},"privacyPolicy":{"message":"Política de Privacidad"},"termsOfUse":{"message":"Términos de Uso"},"openSourceLicenses":{"message":"Licencias de Código Abierto"},"defaultToOriginals":{"message":"Optar por defecto a la información original del video"},"whatDefaultToOriginals":{"message":"Mostrar el título original y la miniatura por defecto, pero que aparezca un botón al pasar el puntero encima para ver los títulos y miniaturas personalizados."},"replaceTitles":{"message":"Reemplazar títulos"},"replaceThumbnails":{"message":"Reemplazar miniaturas"},"useCrowdsourcedTitles":{"message":"Utilizar títulos brindados por la comunidad"},"whatUseCrowdsourcedTitles":{"message":"Si está deshabilitado, se dará formato a los títulos, pero no se usarán los brindados por la comunidad","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"¿Estás seguro/a de que quieres eliminar esta configuración?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Nueva configuración"},"DeleteConfiguration":{"message":"Eliminar configuración"},"ConfigurationName":{"message":"Nombre de configuración"},"ChannelListInstructions":{"message":"Ingrese los canales a los que desee aplicar esta configuración en el siguiente cuadro, separados por nuevas líneas. Se admiten tanto ID de canal como nombres de pantalla. No se admiten @ nombres de usuario. Puedes obtener los ID de canal haciendo clic en el botón compartir de la página acerca del canal. Para ir a la página de información, haga clic en la descripción del canal que aparece debajo de su nombre en la página del canal.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Aún no hay configuraciones establecidas. Haga clic en el botón en la parte superior para añadir una nueva configuración.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Dejar de hacer clic reemplazando títulos y miniaturas por otros más precisos"},"DeArrowPromotionMessage2":{"message":"¿Cansado/a del clickbait? Échele un vistazo a mi nueva extensión para mejorar títulos y miniaturas"},"DeArrowPromotionMessage3":{"message":"También echa un vistazo a DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"¿No te gusta este título? Si prefieres el título de abajo, considera probar la función de reemplazo de títulos en DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Esta miniatura se elige desde una marca de tiempo aleatoria porque aún no hay un envío para este video","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Esta miniatura se elige desde una marca de tiempo aleatoria y el título se autoformatea porque aún no hay un envío para este video","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Puede cambiar este valor por defecto a continuación","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} títulos y {thumbnails} miniaturas han sido reemplazados desde que instaló esta extensión","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} título ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} títulos ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"y {thumbnails} miniatura","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"y {thumbnails} miniaturas","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} han sido reemplazados desde que instaló esta extensión","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Contar reemplazos de títulos y miniaturas"},"countReplacementsDescription":{"message":"Utilizado para darle estadísticas en la ventana emergente.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Añadir una lista de filtros para bloquear encuestas, estantes de mercadería, y otros elementos de páginas promocionales usando yt-neuter"},"requiresUblock":{"message":"Requiere uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Algo ha salido mal con la detección de la ID de vídeo. Intente actualizar la página antes de enviarlo para asegurarse de que se envía el vídeo correcto. Si esto está sucediendo con frecuencia, por favor envíe un reporte del mismo junto con las otras extensiones o scripts de usuario que haya instalado a través de GitHub, Discord o Matrix."},"dearrowLogoCredit":{"message":"Logo basado en Twemoji licenciado bajo CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock no es compatible con la extensión \"Zoom to Fill\". Hay varias alternativas que puede usar en su lugar que funcionarán correctamente."},"freeTrialStarted":{"message":"Su prueba gratuita ha comenzado con éxito. Visita YouTube para probarlo"},"freeTrialEnded":{"message":"Tu prueba gratuita ha terminado"},"freeTrialPrompt":{"message":"Si desea probarlo durante una hora, puede iniciar una prueba gratuita con el botón a continuación."},"startFreeTrial":{"message":"Empezar la prueba gratuita"},"freeAccessRequested":{"message":"Estás registrado con éxito para el acceso gratuito. Se le notificará cuando se conceda el acceso gratuito."},"freeAccessComplete":{"message":"¡Felicitaciones! Ahora tienes acceso gratuito a DeArrow"},"DeArrowNotActivated":{"message":"DeArrow no está activado"},"ActivateDeArrow":{"message":"Activar DeArrow"},"DeArrowIsActivated":{"message":"DeArrow ha sido activado con éxito"},"Close":{"message":"Cerrar"},"ViewLicenseKey":{"message":"Ver clave de licencia"},"SharingIsCaring":{"message":"Compartir es demostrar interés"},"cleanPopup":{"message":"Ocultar interferencias en la ventana emergente de la lista de segmentos"},"syncDisabledWarning":{"message":"Advertencia: El almacenamiento de extensiones ha sido desactivado en su navegador. Los ajustes no se guardarán si lo intenta."},"syncDisabledWarningDeArrow":{"message":"DeArrow no funcionará sin almacenamiento."},"syncDisabledFirefoxSuggestions":{"message":"Puede activarlo yendo a about:config y estableciendo el valor de \"webextensions.storage.sync.enabled\" a \"true\"."},"storageFull":{"message":"El almacenamiento de la extensión está lleno. Por favor, elimine algunos segmentos no enviados en las opciones."},"previewSegmentRequired":{"message":"Por favor previsualice sus segmentos antes de enviarlo. Puede hacerlo haciendo clic en el botón de vista previa o utilizando el siguiente acceso directo:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Actuar como VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Los envíos no pueden ser aceptados desde su navegador en este momento porque YouTube parece haber inyectado algunos anuncios en el lado del servidor que la extensión no es capaz de eliminar. Por favor, contáctenos si está recibiendo este error."},"Yes":{"message":"Si"},"No":{"message":"No"},"votes":{"message":"{0} votos","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} voto","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Gracioso","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Creativo","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Inteligente","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Descriptivo","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Otro","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Modo clásico","description":"Classic mode is a mode in DeArrow"},"CasualMode":{"message":"Modo Casual","description":"Casual mode is a mode in DeArrow"},"minimumVotes":{"message":"Votos mínimos","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"newCasualMode":{"message":"Nueva característica: Modo casual","description":"Title of announcement in DeArrow about the new casual mode feature"},"OpenSettings":{"message":"Abrir la configuración"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/et/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/et/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Ühenduse ajalõpp. Kontrolli oma võrguühendust. Kui internet töötab, on ilmselt server ülekoormatud või maas."},"400":{"message":"Server ütles, et see taotlus oli sobimatu"},"409":{"message":"See on juba varasemalt saadetud"},"502":{"message":"Server paistab olevat ülekoormatud. Proovi uuesti mõne sekundi pärast."},"fullName":{"message":"SponsorBlock YouTube'ile - jäta sponsorid vahele","description":"Name of the extension."},"Description":{"message":"Jäta sponsorid, tellimise palumine ja muud YouTube'i videote tüütused vahele. Teata vaadatavate videote sponsoritest, et säästa teiste aega.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanal ignoreerimisnimekirjas!"},"Segment":{"message":"segmendi"},"Segments":{"message":"segmenti"},"SegmentsCap":{"message":"Segmendid"},"Chapters":{"message":"Peatükid"},"renderAsChapters":{"message":"Kuva segmendid peatükkidena","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Kuva praegune segment video aja kõrval"},"showAutogeneratedChapters":{"message":"Näita YouTube'i automaatselt genereeritud peatükke"},"upvoteButtonInfo":{"message":"Anna segmendile poolthääl"},"reportButtonTitle":{"message":"Teavita"},"reportButtonInfo":{"message":"Teavita sellest segmendist kui sobimatust."},"Dismiss":{"message":"Sulge"},"Loading":{"message":"Laadimine..."},"Hide":{"message":"Ära kunagi näita"},"hitGoBack":{"message":"Vajuta \"kuva uuesti\", et jõuda sinna, kust tulid."},"unskip":{"message":"Kuva uuesti"},"reskip":{"message":"Jäta uuesti vahele"},"unmute":{"message":"Tühista vaigistus"},"paused":{"message":"Pausil"},"manualPaused":{"message":"Taimer peatatud"},"confirmMSG":{"message":"Üksikute väärtuste muutmiseks või kustutamiseks vajuta infonuppu või ava laienduse hüpik, vajutades selle ikoonile üleval paremal nurgas."},"clearThis":{"message":"Kas soovid tõesti selle tühjendada?\n\n"},"Unknown":{"message":"Sinu sponsoriaegade saatmisel esines tõrge, palun proovi hiljem uuesti."},"sponsorFound":{"message":"Sellel videol on andmebaasis segmente!"},"sponsor404":{"message":"Segmente ei leitud"},"sponsorStart":{"message":"Segment algab nüüd"},"sponsorEnd":{"message":"Segment lõpeb nüüd"},"sponsorCancel":{"message":"Tühista segmendi loomine"},"noVideoID":{"message":"YouTube'i videot ei leitud.\nKui see ei vasta tõele, laadi kaart uuesti."},"refreshSegments":{"message":"Värskenda segmendid"},"success":{"message":"Õnnestus!"},"voted":{"message":"Hääletatud!"},"serverDown":{"message":"Tundub, et server on maas. Anna sellest koheselt arendajale teada."},"connectionError":{"message":"Ühendusega esines tõrge. Veakood: "},"segmentsStillLoading":{"message":"Segmente veel laetakse..."},"clearTimes":{"message":"Tühjenda segmendid"},"openPopup":{"message":"Ava SponsorBlocki hüpik"},"closePopup":{"message":"Sulge hüpik"},"closeIcon":{"message":"Sulgemisikoon"},"OpenSubmissionMenu":{"message":"Ava saatmise menüü"},"OpenCasualVoteMenu":{"message":"Ava tavarežiimi menüü"},"sortSegments":{"message":"Sorteeri segmendid"},"submitCheck":{"message":"Kas soovid kindlasti selle saata?"},"whitelistChannel":{"message":"Lisa kanal ignoreerimisnimekirja"},"removeFromWhitelist":{"message":"Eemalda kanal ignoreerimisnimekirjast"},"voteOnTime":{"message":"Hääleta segmendi sobivust"},"Submissions":{"message":"Saadetud segmendid"},"savedPeopleFrom":{"message":"Oled inimeste aega säästnud "},"viewLeaderboard":{"message":"Edetabel"},"recordTimesDescription":{"message":"Saada"},"submissionEditHint":{"message":"Segmendi töötlemine avaneb pärast saatmist","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Vihje: sa võid saatmiseks määrata valikutes klaviatuuriotseteid"},"clearTimesButton":{"message":"Tühjenda ajad"},"Username":{"message":"Kasutajanimi"},"setUsername":{"message":"Määra kasutajanimi"},"copyPublicID":{"message":"Kopeeri avalik UserID"},"copySegmentID":{"message":"Kopeeri segmendi ID"},"loopChapter":{"message":"Lülita peatükikordus sisse"},"unloopChapter":{"message":"Lülita peatükikordus välja"},"hideThis":{"message":"Peida see"},"Options":{"message":"Valikud"},"showButtons":{"message":"Kuva YouTube'i mängijal nupud"},"hideButtonsDescription":{"message":"See peidab nupud, mis kuvatakse YouTube'i mängijal vahelejätmiste segmentide saatmiseks."},"showSkipButton":{"message":"Hoia esiletõstuni vahelejätmise nuppu mängijal"},"showInfoButton":{"message":"Kuva YouTube'i mängijal infonupp"},"autoHideInfoButton":{"message":"Peida infonupp automaatselt"},"showDeleteButton":{"message":"Kuva YouTube'i mängijal kustutusnupp"},"enableViewTracking":{"message":"Luba vahelejätmiste arvu jälgimine"},"whatViewTracking":{"message":"See funktsioon jälgib, milliseid segmente sa oled vahele jätnud, et kasutajad teaksid, kui palju nende sisestus on teisi aidanud ning et koos poolthäältega veenduda rämpsu mittesattumises andmebaasi. Laiendus saadab iga segmendi vahelejätmisel serverisse sõnumi. Loodetavasti enamus inimesi ei muuda seda seadistust, et vaatamisarvud oleksid täpsed. :)"},"enableViewTrackingInPrivate":{"message":"Luba vahelejätmiste arvu jälgimine privaatsetel/inkognito kaartidel"},"enableTrackDownvotes":{"message":"Säilita segmentide vastuhääled"},"whatTrackDownvotes":{"message":"Segmendid, millele annad vastuhääle, peidetakse ka pärast lehe uuesti laadimist"},"trackDownvotesWarning":{"message":"Hoiatus: selle keelamine kustutab kõik varasemalt säilitatud vastuhääled"},"enableTrackDownvotesInPrivate":{"message":"Salvesta segmentide poolt hääletamist privaatsetel/incognito vahelehtedel"},"enableQueryByHashPrefix":{"message":"Küsi räsi eesliite järgi"},"whatQueryByHashPrefix":{"message":"VideoID järgi segmentide küsimise asemel saadetakse videoID räsi 4 esimest märki ning server saadab tagasi kõigi sarnaste räsidega videote andmed."},"enableShowCategoryWithoutPermission":{"message":"Näita segmentide menüüs ka ilma saatmise loata kategooriaid"},"whatShowCategoryWithoutPermission":{"message":"Osade kategooriate esitamiseks on minimaalse reputatsiooni nõuete tõttu vajalik luba"},"showNotice":{"message":"Kuva märkus uuesti"},"showSkipNotice":{"message":"Kuva segmendi vahelejätmisel teatis"},"showUpcomingNotice":{"message":"Näita teavitust enne segmendi algust"},"showCategoryGuidelines":{"message":"Kuva kategooria abi"},"noticeVisibilityMode0":{"message":"Täissuuruses vahelejätmise teavitused"},"noticeVisibilityMode1":{"message":"Väikesed vahelejätmise teavitused autom. vahelejätmistele"},"noticeVisibilityMode2":{"message":"Kõik vahelejätmise teavitused on väikesed"},"noticeVisibilityMode3":{"message":"Hääbuvad vahelejätmise teavitused autom. vahelejätmistele"},"noticeVisibilityMode4":{"message":"Kõik vahelejätmise teavitused hääbuvad"},"longDescription":{"message":"SponsorBlock lubab sul vahele jätta sponsorid, vaheajad, kanali tellimise meeldetuletused ja muud YouTube'i videote tüütud kohad. SponsorBlock on rahva ühistööna toimiv brauserilaiendus, mis lubab igaühel saata sponsoreeritud segmendi algus- ja lõpuaegu ning teiste video segmentide aegu. Kui üks inimene saadab sponsoreeritud segmendi, jätavad teised laienduse kasutajad kohe selle vahele. Laiendus võimaldab ka muusikavideotel mitte-muusika jaotised vahele jätta.","description":"Full description of the extension on the store pages."},"website":{"message":"Veebileht","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Lähtekood","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Teavitus on uuendatud!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Kui sulle see ikka ei meeldi, vajuta \"ära kunagi näita\" nuppu.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Jäta segment vahele","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Alusta/lõpeta segmenti","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Ava segmendi avalikustamise menüü","description":"Keybind label"},"setSubmitKeybind":{"message":"Esita segmendid","description":"Keybind label"},"setPreviewKeybind":{"message":"Näita segmendi eelvaadet","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Sulge vahelejätmise teavitus","description":"Keybind label"},"setDownvoteKeybind":{"message":"Hääleta segmendi vastu","description":"Keybind label"},"setUpvoteKeybind":{"message":"Hääleta segmendi poolt","description":"Keybind label"},"nextChapterKeybind":{"message":"Järgmine peatükk","description":"Keybind label"},"previousChapterKeybind":{"message":"Eelmine peatükk","description":"Keybind label"},"enableDeArrowKey":{"message":"Lülita sisse DeArrow sisse- ja väljalülitamine","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Ava segmendi avalikustamise menüü","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Valige klahv vajutades sellele, seejärel valige need teisendklahvid, mida soovite kasutada."},"disableSkipping":{"message":"Vahelejätmine on lubatud"},"enableSkipping":{"message":"Vahelejätmine on keelatud"},"yourWork":{"message":"Sinu töö","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Veakood: "},"skip":{"message":"Jäta vahele"},"mute":{"message":"Vaigista"},"full":{"message":"Terve video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Jätad {0} vahele?"},"mute_category":{"message":"Vaigistad {0}?"},"skip_to_category":{"message":"Jäta {0}-ni vahele?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Järgnev {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} vahelejäetud","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} vaigistatud","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"{0}-ni vahelejäetud","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Hääletasite segmendi {0} poolt/vastu","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Keela automaatne vahelejätmine"},"enableAutoSkip":{"message":"Luba automaatne vahelejätmine"},"audioNotification":{"message":"Heliteavitus vahelejätmisel"},"audioNotificationDescription":{"message":"Heliteavitus vahelejätmisel esitab igal korral heli, kui segment vahele jäetakse. Keelamisel (või autom. vahelejätmise keelamisel) heli ei esitata."},"showTimeWithSkips":{"message":"Kuva vahelejäetud segmentidega aeg"},"showTimeWithSkipsDescription":{"message":"See aeg kuvatakse sulgudes praeguse aja kõrval, ajariba all. See näitab video, millest on segmendid eemaldatud, kogukestvust. Sealhulgas arvestatakse ka segmente, mis on märgitud valikuga \"kuva mängija ajaribal\"."},"youHaveSkipped":{"message":"Oled vahele jätnud "},"minLower":{"message":"minut"},"minsLower":{"message":"minutit"},"hourLower":{"message":"tund"},"hoursLower":{"message":"tundi"},"youHaveSavedTime":{"message":"Oled inimestel säästnud","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" nende eludest","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Serveri oleku saamiseks vaata status.sponsor.ajay.app"},"changeUserID":{"message":"Impordi/ekspordi oma privaatne UserID"},"whatChangeUserID":{"message":"Seda tuleks privaatsena hoida. See on nagu parool ning seda ei tohiks kellegagi jagada. Kui kellelgi see on, saavad nad sinuna esineda.\nKui otsid avalikku UserID'd, klõpsa hüpikus olevat lõikelaua ikooni."},"setUserID":{"message":"Määra privaatne UserID"},"userIDChangeWarning":{"message":"Tähelepanu: privaatse UserID muutmine on lõplik. Kas soovid kindlasti seda teha? Igaks juhuks soovitame eelmise UserID varundada."},"createdBy":{"message":"Autor"},"supportOtherSites":{"message":"Toeta 3. osapoole YouTube-saite"},"supportOtherSitesDescription":{"message":"Kolmanda osapoole YouTube'i klientide tugi. Selle toe lubamiseks pead nõustuma lisalubadega.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Toetatud saidid: "},"optionsInfo":{"message":"Luba Invidiouse tugi, keela automaatne vahelejätmine, peida nupud ja muud valikud."},"addInvidiousInstance":{"message":"Lisa 3. osapoole kliendi eksemplar"},"addInvidiousInstanceDescription":{"message":"Lisa kohandatud eksemplar. See tuleb vormistada AINULT domeeniga. Näide: invidious.ajay.app"},"add":{"message":"Lisa"},"addInvidiousInstanceError":{"message":"See on sobimatu domeen. Siia tuleks kirjutada AINULT domeeniosa, nt invidious.ajay.app"},"resetInvidiousInstance":{"message":"Lähtesta Invidiouse eksemplaride nimekiri"},"resetInvidiousInstanceAlert":{"message":"Lähtestad Invidiouse eksemplaride nimekirja"},"invidiousDisabledSafari":{"message":"Invidioust ei toetata hetkel Safaris brauserisisese tõrke tõttu. Siis kui Apple tõrke kõrvaldab, taastatakse Invidiouse toetus."},"currentInstances":{"message":"Praegused eksemplarid:"},"minDuration":{"message":"Minimaalne kestus (sekundit):"},"minDurationDescription":{"message":"Segmendid, mis on lühemad kui määratud väärtus ei jäeta vahele või ei kuvata mängijal."},"enableManualSkipOnFullVideo":{"message":"Jäta käsitsi vahele, kui eksisteerib terve video silt"},"whatManualSkipOnFullVideo":{"message":"Inimestele, kes soovivad vaadata (enese-)reklaami sisaldavat videot segamatult."},"skipNoticeDuration":{"message":"Vahelejätmise teavituse kestus (sekundites):"},"skipNoticeDurationDescription":{"message":"Vahelejätmise teavitus püsib ekraanil vähemalt nii kaua. Käsitsi vahelejätmise puhul võib see kauem püsida."},"shortCheck":{"message":"See saadetav segment on lühem, kui sinu lühima pikkuse valik. See võib tähendada, et see on juba saadetud ning on selle valiku tõttu lihtsalt ignoreeritud. Kas soovid kindlasti seda saata?"},"liveOrPremiere":{"message":"Käimasolevale otseülekandele segmentide esitamine pole lubatud. Palun oodake kuni otseülekanne lõpeb, värskendage lehte ja kontrollige siis, kas segmendid on jätkuvalt kehtivad."},"showUploadButton":{"message":"Kuva üleslaadimisnupp"},"customServerAddress":{"message":"SponsorBlocki serveri aadress"},"customServerAddressDescription":{"message":"Aadress, mida SponsorBlock kasutab serveriga info vahetamiseks.\nKui sul just oma serverit pole, ei peaks sa seda valikut muutma."},"dataFetchingServerAddress":{"message":"Andmepäringute serveri aadress"},"dataFetchingServerAddressDescription":{"message":"Aadress, mida SponsorBlock kasutab serveriga päringute vahetamiseks.\nKui teil just oma serverit pole, ei peaks te seda valikut muutma."},"thumbnailCacheServerAddress":{"message":"Pisipiltide puhverserveri aadress"},"save":{"message":"Salvesta"},"reset":{"message":"Lähtesta"},"customAddressError":{"message":"Aadress ei ole õiges vormingus. Veendu, et sul on alguses http:// või https:// ning lõpus ei ole kaldkriipsu."},"areYouSureReset":{"message":"Kas soovid kindlasti selle lähtestada?"},"mobileUpdateInfo":{"message":"m.youtube.com on nüüd toetatud"},"exportOptions":{"message":"Impordi/ekspordi kõik valikud"},"exportOtherData":{"message":"Impordi/Ekspordi Kõik Muud Andmed"},"exportOptionsCopy":{"message":"Muuda/kopeeri"},"exportOptionsDownload":{"message":"Salvesta faili"},"exportOptionsUpload":{"message":"Laadi failist"},"whatExportOptions":{"message":"See on sinu terve seadistus JSON-formaadis. See sisaldab sinu privaatset UserID-d, seega ole tähelepanelik, kellega seda jagad."},"setOptions":{"message":"Määra valikud"},"exportOptionsWarning":{"message":"Hoiatus: valikute muutmine on püsiv ning võib su paigalduse lõhkuda. Kas soovid kindlasti seda teha? Varunda kindlasti igaks juhuks varasemad valikud."},"incorrectlyFormattedOptions":{"message":"See JSON ei ole korralikult vormistatud. Sinu valikuid ei muudetud."},"confirmNoticeTitle":{"message":"Saada segment"},"submit":{"message":"Saada"},"cancel":{"message":"Katkesta"},"delete":{"message":"Kustuta"},"preview":{"message":"Eelvaade"},"unsubmitted":{"message":"Saatmata"},"inspect":{"message":"Inspekteeri"},"edit":{"message":"Muuda"},"copyDebugLogs":{"message":"Kopeeri Silumislogid"},"copyDebugInformation":{"message":"Kopeeri silumisteave lõikelauale"},"copyDebugInformationFailed":{"message":"Lõikelauale kirjutamine ebaõnnestus"},"copyDebugInformationOptions":{"message":"Kopeerib lõikelauale info, mida saad arendajale anda veast teatamisel või siis, kui arendaja seda sinult taotleb. Tundlik info, sealhulgas sinu kasutaja ID, ignoreerimisnimekirjas kanalid ning kohandatud serveri aadress on eemaldatud. Siiski see sisaldab teatud infot, nagu sinu kasutajaagent, brauser, opsüsteem ning laienduse versiooninumber."},"copyDebugInformationComplete":{"message":"Silumisinfo on lõikelauale kopeeritud. Võid sellelt vabalt eemaldada mistahes info, mida ei soovi jagada. Salvesta see tekstifaili või kleebi vearaportisse."},"keyAlreadyUsed":{"message":"See kiirkombinatsioon on juba kasutuses teise toimingu poolt. Palun valige teine kiirkombinatsioon."},"to":{"message":"kuni","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Kopeeritud!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Kasuta sujuvaid üleminekuid"},"generic_guideline2":{"message":"Mängib nii, nagu midagi poleks vahele jäetud"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Tasulised promod, tasulised viited ja otsesed reklaamid. Pole mõeldud enesepromo või tasuta petitsioonide/autorite/veebilehtede/toodete mainimiste puhul."},"category_sponsor_guideline1":{"message":"Tasulised kampaaniad"},"category_sponsor_guideline2":{"message":"Mitte annetuste ja omaloodud kauba jaoks"},"category_selfpromo":{"message":"Tasumata/enesepromo"},"category_selfpromo_description":{"message":"Sarnaneb \"sponsorile\", ent on mõeldud tasumata või enesepromo jaoks. Selle alla kuuluvad jaotised oma müüdava kauba, annetuste ja koostööpartnerite kohta."},"category_selfpromo_guideline1":{"message":"Annetused, liikmesused ja omaloodud kaup"},"category_selfpromo_guideline2":{"message":"Tasuta mainimised, mis ei anna videole lisaväärtust"},"category_selfpromo_guideline3":{"message":"Mitte ettevõtete-disainitud toodete ja kauba jaoks"},"category_exclusive_access":{"message":"Eksklusiivne ligipääs"},"category_exclusive_access_description":{"message":"Ainult tervete videote märkimiseks. Kasutatakse, kui video esitleb toodet, teenust või asukohta, millele isik on tasuta või toetusega ligipääsu saanud."},"category_exclusive_access_pill":{"message":"See video esitleb toodet, teenust või asukohta, millele isik on tasuta või toetusega ligipääsu saanud","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Kogu video esitleb midagi, millele autor on saanud tasuta või toetusega ligipääsu"},"category_interaction":{"message":"Tegutsemise meeldetuletus (kanali tellimine)"},"category_interaction_description":{"message":"Lühike sisukeskne meeldetuletus anda videole meeldib, tellida kanalit või jälgida autorit. Kui see on pikk või millegi kindlaga seotud, peaks see olema enesepromo all."},"category_interaction_guideline1":{"message":"Lühikesed meeldetuletused vajutada \"meeldib\", \"telli\" või \"jälgi\""},"category_interaction_guideline2":{"message":"Sisaldab mitteotseseid meeldetuletusi kommenteerimiseks"},"category_interaction_guideline3":{"message":"Mitte üldise promo jaoks, vaid üleskutsed tegevustele"},"category_interaction_short":{"message":"Tegutsemise meeldetuletus"},"category_intro":{"message":"Vaheaeg/sissejuhatav animatsioon"},"category_intro_description":{"message":"Tegeliku sisuta intervall. Võib olla paus, seisev pilt, korduv animatsioon. Seda ei peaks kasutama üleminekutel, milles on teabega sisu."},"category_intro_short":{"message":"Vaheaeg"},"category_intro_guideline1":{"message":"Intervall ilma tegeliku sisuta"},"category_intro_guideline2":{"message":"Mitte informatsiooniga üleminekute jaoks"},"category_outro":{"message":"Lõpukaardid/-tiitrid"},"category_outro_description":{"message":"Tiitrid või YouTube'i lõpukaardid. Pole mõeldud informatsiooniga järelduste jaoks."},"category_outro_guideline1":{"message":"Ära kaasa sisu, isegi kui lõputiitrid on ekraanil"},"category_preview_description":{"message":"Klippide kogum, mis näitab selles või teistes videotes tulevat sisu seerias, kus kogu info kuvatakse uuesti video sees."},"category_preview_guideline1":{"message":"Klipid, mida kuvatakse hiljem või tulevases videos"},"category_preview_guideline2":{"message":"Eelmise video kokkuvõte"},"category_preview_guideline3":{"message":"Mitte jaotistele, mis lisavad täiendavat sisu"},"category_filler":{"message":"Teemavahetus/Naljad"},"category_filler_description":{"message":"Põhiteemast kõrvalekaldumised või naljad, mis pole kriitilised video sisu mõistmiseks. Selle alla ei käi segmendid, mis lisavad video sisule konteksti või taustainfot. See on väga agressiivne kategooria, mis on mõeldud selleks, kui soovite välistada videost kogu \"lõbu\"."},"category_filler_short":{"message":"Teemavahetused"},"category_filler_guideline1":{"message":"Põhiteemast kõrvalekaldumised või naljad"},"category_filler_guideline2":{"message":"Tähelepanu hajutajad, saatevead, kordused"},"category_filler_guideline3":{"message":"Mitte stseenid, mida on teema mõistmiseks vaja vaadata"},"category_music_offtopic":{"message":"Muusika: mitte-muusika jaotis"},"category_music_offtopic_description":{"message":"Ainult muusikavideotes kasutamiseks. Seda peaks kasutama vaid muusikavideote jaotiste puhul, mis ei läheks mõne teise kategooria alla."},"category_music_offtopic_short":{"message":"Mitte-muusika"},"category_music_offtopic_guideline1":{"message":"Jaotised, mida avalikes väljalasetes pole"},"category_music_offtopic_guideline2":{"message":"Mitte-muusika kontserdil"},"category_poi_highlight":{"message":"Esiletõst"},"category_poi_highlight_description":{"message":"Video osa, mida enamus inimesed otsivad. Sarnaneb kommentaaridele stiilis \"video algab ajal x\"."},"category_poi_highlight_guideline1":{"message":"Jaotis, mida inimesed enim otsivad"},"category_poi_highlight_guideline2":{"message":"Aitab konteksti vahele jätta"},"category_poi_highlight_guideline3":{"message":"Aitab pealkirja või pisipildi sisuni viia"},"category_chapter":{"message":"Peatükk"},"category_chapter_description":{"message":"Isikupärastatava pealkirjaga peatükid, mis kirjeldavad tähtsamaid video osi."},"category_chapter_guideline1":{"message":"Ära maini sponsorite brändinimesid"},"category_chapter_guideline2":{"message":"Kasuta suuri peatükke peamiste jaotiste jaoks"},"category_chapter_guideline3":{"message":"Väiksemad peatükid saab asetada suuremate sisse"},"category_livestream_messages":{"message":"Otseülekanne: annetuste ja sõnumite lugemine"},"category_livestream_messages_short":{"message":"Sõnumite lugemine"},"autoSkip":{"message":"Autom. vahelejätmine"},"manualSkip":{"message":"Käsitsi vahelejätmine"},"showOverlay":{"message":"Kuva mängija ajaribal"},"disable":{"message":"Keela"},"autoSkip_POI":{"message":"Jäta automaatselt alguseni vahele"},"manualSkip_POI":{"message":"Küsi video laadimisel"},"showOverlay_POI":{"message":"Kuva mängija ajaribal"},"showOverlay_full":{"message":"Kuva silt"},"showOverlay_chapter":{"message":"Kuva peatükid"},"autoSkipOnMusicVideos":{"message":"Jäta automaatselt kõik segmendid vahele, kui eksisteerib mitte-muusika segment"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Luba automaatne vahelejätmine ainult lehel music.youtube.com"},"muteSegments":{"message":"Luba segmente, mis vahelejätmise asemel vaigistavad heli"},"fullVideoSegments":{"message":"Kuva ikoon, kui terve video on reklaam","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Kuva silte ka videote pisipiltidel","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Saatmata värv","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Ajariba värv"},"category":{"message":"Kategooria"},"skipOption":{"message":"Vahelejätmise valik","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Ava laiendatud vahelejätmise menüü"},"advancedSkipNotSaved":{"message":"Süntaksiviga: Teie sätteid ei salvestatud"},"advancedSkipSettingsHelp":{"message":"Kuidas see toimib","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Luba beetatestimise server"},"whatEnableTestingServer":{"message":"Sinu saadetud segmendid ja hääled EI LÄHE põhiserveri alla. Kasuta seda vaid katsetamiseks."},"testingServerWarning":{"message":"Kõik segmendid ja hääled EI LÄHE põhiserveri alla, kuni oled ühendatud testserveriga. Veendu, et keelad selle valiku, kui soovid tegelikult segmente saata."},"bracketNow":{"message":"(nüüd)"},"moreCategories":{"message":"Rohkem kategooriaid"},"chooseACategory":{"message":"Vali kategooria"},"enableThisCategoryFirst":{"message":"Kategooriaga \"{0}\" segmentide saatmiseks pead selle enne valikutes lubama. Sind suunatakse nüüd valikutesse.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Hoiatus: Seda tüüpi segmenti saab korraga aktiivne olla vaid üks. Mitme saatmine põhjustab suvalise segmendi kuvamise."},"youMustSelectACategory":{"message":"Sa pead enne saatmist igale segmendile kategooria valima!"},"bracketStart":{"message":"(Algus)"},"bracketEnd":{"message":"(lõpp)"},"End":{"message":"Lõpp","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"peidetud: vastuhääl"},"hiddenDueToDuration":{"message":"peidetud: liiga lühike"},"manuallyHidden":{"message":"käsitsi peidetud"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Kanali ID pole veel laaditud. Kui vaatad manustatud videot, proovi seda vaadata YouTube'i kodulehelt. See võib olla põhjustatud ka YouTube'i paigutuse muudatustest - kui arvad et see nii on, kommenteeri siin:"},"invidiousPermissionRefresh":{"message":"Teie veebilehitseja on eemaldanud loa, mis on vajalik korrektseks tööks Invidious platformil ja muudel kolmandate osapoolte lehtedel. Vajutage allolevat nuppu, et taaskäivitada see luba."},"acceptPermission":{"message":"Nõustu loaga"},"permissionRequestSuccess":{"message":"Loataotlus õnnestus!"},"permissionRequestFailed":{"message":"Loataotlus ebaõnnestus, kas sa keeldusid?"},"adblockerIssueWhitelist":{"message":"Kui sa ei suuda seda lahendada, keela valik \"sunnitud kanalikontroll enne vahelejätmist\", kuna SponsorBlock ei leia selle video kanaliteavet"},"forceChannelCheck":{"message":"Sunnitud kanalikontroll enne vahelejätmist"},"whatForceChannelCheck":{"message":"Vaikimisi jätab see segmendid vahele juba siis, kui veel kanalitki ei tea. Vaikimisi võidakse mõned video alguses olevad segmendid ignoreerimisnimekirjas olevatel kanalitel vahele jätta. Selle valiku lubamine väldib seda, kuid võib lisada vahelejätmistele väikese viivituse, sest kanali ID hankimine võib aega võtta. Viivitus võib kiire interneti puhul olla märkamatu."},"forceChannelCheckPopup":{"message":"Kaalu valiku \"Sunnitud kanalikontroll enne vahelejätmist\" lubamist"},"downvoteDescription":{"message":"Sobimatu/vale ajastus"},"incorrectVote":{"message":"Ebakorrektne"},"harmfulVote":{"message":"Kahjulik","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Muuda kategooriat"},"nonMusicCategoryOnMusic":{"message":"See video on muusikana kategoriseeritud. Kas oled kindel, et sellel on sponsor? Kui see on tegelikult \"mitte-muusika segment\", ava laienduse valikud ning luba see kategooria. Seejärel saad selle segmendi saata \"mitte-muusika\" kategoorias. Segaduse korral palun loe üle juhised."},"multipleSegments":{"message":"Mitu segmenti"},"guidelines":{"message":"Juhised"},"readTheGuidelines":{"message":"Loe juhiseid!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategooriad on siin!"},"categoryUpdate2":{"message":"Ava valikud, et jätta vahele vaheaegu, müüdavat kaupa jms."},"help":{"message":"Abi"},"GotIt":{"message":"Sain aru","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"See segment on üsna suur. Kui kogu video vältel käsitletakse üht teemat, muutke seade \"jäta vahele\" seadeks \"Täis video\". Vaadake juhiseid rohkema info jaoks."},"categoryPillTitleText":{"message":"See terve video on selle kategooriaga sildistatud ning on liiga tihedalt integreeritud, et eraldada saaks"},"chapterNameTooltipWarning":{"message":"Üks teie peatükkidest sarnaneb kategooriaga. Kui võimalik, kasutage kategooriaid."},"experiementOptOut":{"message":"Keeldu kõigist tulevikus tehtavatatest eksperimentidest","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Peida igaveseks"},"warningChatInfo":{"message":"Märkasime, et olete teinud paar üsna tavalist viga. Oleme teie töö eest väga tänulikud, aga me püüdleme täiuslikkuse poole, seega iga väike viga loeb :)"},"questionButton":{"message":"Mul on küsimus"},"askAQuestion":{"message":"Esita küsimus"},"warningConfirmButton":{"message":"Ma mõistan põhjust"},"warningError":{"message":"Hoiatuse mõistmise kinnitamisel esines viga:"},"deArrowMessageRecieved":{"message":"Said moderaatorilt vihje"},"Donate":{"message":"Anneta"},"considerDonating":{"message":"Aita arendust toetada"},"hideDonationLink":{"message":"Peida annetuste link"},"darkModeOptionsPage":{"message":"Tume režiim valikute lehel"},"helpPageThanksForInstalling":{"message":"Täname SponsorBlocki paigaldamise eest."},"helpPageReviewOptions":{"message":"Palun vaata allolevad valikud üle"},"helpPageFeatureDisclaimer":{"message":"Paljud funktsioonid on vaikimisi välja lülitatud. Kui te soovite jätta vahele sissejutatused, kokkuvõtted, kasutada Invidioust jms, lülitage need allpool sisse. Te saate ka peita/kuvada kasutajaliidese elemente."},"helpPageHowSkippingWorks2":{"message":"Iga kord, kui jätate segmendi vahele, saadetakse teie teavitus. Kui segmendi ajastus tundub vale või ebatäpsena - hääletage see valeks vajutades vastuhäälele. Hääletamine on võimalik ka hüpikakna abil."},"Submitting":{"message":"Saatmine"},"helpPageCopyOfDatabase2":{"message":"Lähtekood on vabalt saadaval. Seega, isegi kui minuga midagi juhtub, ei ole sinu saadetud segmendid kadunud."},"Credits":{"message":"Tiitrid"},"LearnMore":{"message":"Lisateave"},"FullDetails":{"message":"Täielikud üksikasjad"},"CopyDownvoteButtonInfo":{"message":"Annab vastuhääle ja loob kohaliku koopia, mida saad uuesti saata"},"OpenCategoryWikiPage":{"message":"Ava selle kategooria vikileht."},"CopyAndDownvote":{"message":"Kopeeri ja anna vastuhääl"},"ContinueVoting":{"message":"Jätka hääletamist"},"ChangeCategoryTooltip":{"message":"See rakendub sinu segmentidele koheselt"},"downvote":{"message":"Vastuhääl"},"upvote":{"message":"Poolthääl"},"hideSegment":{"message":"Peida segment"},"skipSegment":{"message":"Jäta segment vahele"},"playChapter":{"message":"Esita peatükk"},"SponsorTimeEditScrollNewFeature":{"message":"Kiireks aja reguleerimiseks keri hiirega muutmiskasti kohal. Täpsemaks reguleerimiseks hoia kerimise ajal all Ctrl või Shift klahvi."},"categoryPillNewFeature":{"message":"Uus! Näe, kui video on täielikult sponsoreeritud või enesepromo"},"yearAbbreviation":{"message":"a","description":"100y"},"dayAbbreviation":{"message":"p","description":"100d"},"hourAbbreviation":{"message":"t","description":"100h"},"optionsTabBehavior":{"message":"Käitumine","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Liides","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Klaviatuuriotseteed","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Varunda/taasta","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Varia","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Vahelejätmise teavituse välimus","description":"Option label"},"unbind":{"message":"Tühista määrang","description":"Unbind keyboard shortcut"},"notSet":{"message":"Määramata"},"change":{"message":"Muuda"},"youtubeKeybindWarning":{"message":"See on YouTube'i sisseehitatud otsetee. Kas soovid kindlasti seda kasutada?"},"betaServerWarning":{"message":"BEETAserver on lubatud!"},"openOptionsPage":{"message":"Ava valikute leht"},"resetToDefault":{"message":"Lähtesta sätted vaikeväärtustele"},"confirmResetToDefault":{"message":"Kas soovid kindlasti kõik sätted vaikeväärtustele lähtestada? Seda ei saa tagasi võtta."},"exportSegments":{"message":"Ekspordi segmendid"},"importSegments":{"message":"Impordi segmendid"},"Import":{"message":"Impordi","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Lunastamine õnnestus!"},"redeemFailed":{"message":"Litsentsivõti on sobimatu"},"hideUpsells":{"message":"Peida valikud, mis on saadaval vaid lisatasu eest"},"hideNewFeatureUpdates":{"message":"Peida teavitused uutest funktsioonidest"},"redeem":{"message":"Lunasta"},"enterLicenseKey":{"message":"Sisesta litsentsivõti"},"unsubmittedSegmentCounts":{"message":"Sul on hetkel {0} {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Sul pole hetkel saatmata segmente","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"esitamata segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"esitamata segmenti","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"videol","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videol","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Tühjenda kõik segmendid","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Kas soovid kindlasti tühjendada kõik oma saatmata segmendid?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Kuva segmendid","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Peida segmendid","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Segmentide arv","description":"Header of the unsubmitted segments list"},"actions":{"message":"Tegevused","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Jaga URLina"},"segmentFetchFailureWarning":{"message":"Tähelepanu: Server ei ole veel segmente edastanud. Sellel videol võivad olla esitatud segmendid, aga sa pole neid serveri tõrke tõttu kätte saanud."},"allowScrollingToEdit":{"message":"Luba aegade muutmiseks kerimine"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - paremad pealkirjad ja pisipildid YouTube'is","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Rahva valitud pealkirjad ja pisipildid, mis on kirjeldavad, mitte pilkupüüdvad","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Vali kõige kirjeldavam"},"Original":{"message":"Algne"},"OriginalTitle":{"message":"Algne pealkiri"},"CurrentTime":{"message":"Praegune aeg"},"resetCustomTitle":{"message":"Lähtesta pealkiri esialgsele tekstile"},"resetIcon":{"message":"Lähtesta ikoon"},"TypeYourOwnTitleHere":{"message":"Sisesta oma pealkiri siia"},"VideoNotReady":{"message":"Video ei ole valmis"},"FailedToRender":{"message":"Renderdamine ebaõnnestus","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas puudub","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Renderdamisel esines viga","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Laadimine ebaõnnestus","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Pealkirjavorming"},"Disabled":{"message":"Keelatud"},"CapitalizeWords":{"message":"Suurtähesta Sõnu"},"TitleCase":{"message":"Suurtähesta Sõnad"},"SentenceCase":{"message":"Suurtähesta laused"},"LowerCase":{"message":"Väiketähed"},"FirstLetterUppercase":{"message":"Suur Algustäht"},"shouldCleanEmojis":{"message":"Eemalda emojid"},"onlyFormatCustomTitles":{"message":"Kohanda ainult kasutajate avaldatud pealkirju"},"onlyTitleCaseInEnglish":{"message":"Kasuta Läbivat Suurt Algustähte Mitte-ingliskeelsetes Pealkirjades"},"onlyTitleCaseInEnglishDescription":{"message":"Keeletuvastus pole täiuslik ning võib vahepeal ingliskeelsed pealkirjad teiste keeltega segamini ajada."},"thumbnailFallbackOption":{"message":"Kui Puudub Avaldatud Pisipilt"},"whatThumbnailFallbackOption":{"message":"Suvalise aja valikult kasutatab süsteem SponsorBlocki andmeid, vältimaks aja sattumist reklaamsegmentidesse.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Näita kuvatõmmist suvalisest hetkest"},"TheOriginalThumbnail":{"message":"Näita esialgset pisipilti"},"showABlankBox":{"message":"Näita tühja kasti"},"AutoGenerated":{"message":"Näita YouTube'i automaatselt genereeritud pisipilti","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Video algus"},"Middle":{"message":"Video keskosa"},"keepUnsubmitted":{"message":"Säilita saadetud hääled"},"showLiveCover":{"message":"Näita Kanali Profiilipilti Järgnevate Videote Menüüs","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Välista A/B Testimisel Olevad Pisipildid"},"ignoreAbThumbnailsDescription":{"message":"Kanalite omanikud saavad erinevate testimise käigus näidata YouTube'is eri inimestele erinevaid pisipilte. Selle sätte sisselülitamisel kasutab süsteem alati esimest pisipilti, et tagada ühtlus."},"abThumbnailsWarning":{"message":"Tähelepanu! Selle video pisipilt on hetkel A/B testimisel. See tähendab, et selle video pisipilt võib tihti muutuda, mistõttu selle video esialgse pisipildi poolt ei tasu tõenäoliselt hääletada."},"whatKeepUnsubmitted":{"message":"Salvesta hääled ning näita serveril salvestatud enim hääletatud pisipildi/pealkirja asemel pisipilte/pealkirju, mille poolt teie hääletasite."},"keepUnsubmittedInPrivate":{"message":"Salvesta Privaatsetelt Vahelehtedelt Antud Hääli"},"useThumbnailGenerationService":{"message":"Kasuta Pisipiltide Genereerimise Süsteemi"},"titleMaxLines":{"message":"Maksimaalne Ridade Arv Pealkirjades"},"titleMaxLinesDescription":{"message":"Videote pealkirjad jaotatakse soovitustes nii mitme rea vahele."},"thumbnailSaturationLevel":{"message":"Pisipildi küllastatuse tase"},"whatSaturateThumbnails":{"message":"Vähenda pisipildite värviküllasust"},"hideDetailsWhileFetching":{"message":"Peida lisainfo laadimisel"},"hideDetailsWhileFetchingDescription":{"message":"See säte peidab pealkirjad ja pisipildid andmete laadimise ajal. Kui see säte on välja lülitatud, siis võite laadimise ja pealkirjade ning pisipiltide vahetamise ajal näha vilkumist."},"ignoreTranslatedTitles":{"message":"Ära näita YouTube'i automaatselt tõlgitud pealkirju","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"Vahel võib YouTube automaatselt tõlkida osa pealkirju teie emakeelde. See säte kehtib vaid siis, kui kasutajate avaldatud pealkiri ei ole saadaval."},"onAllPages":{"message":"Kõikidel Lehtedel","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Kõikidel Lehtedel Välja Arvatud Video Lehtedel","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Mitte kunagi"},"thumbnailGeneratorDescription1":{"message":"Pisipildi genereerimise süsteem kiirendab oluliselt pisipildi genereerimist - selleks saadetakse serverile anonüümne, video ID-ga päring. Seejärel pisipilt kas genereeritakse, või, kui see on juba olemas, võetakse puhvermälust."},"thumbnailGeneratorDescription2":{"message":"Video lehtedel kasutades võib see funktsioon lisada lehele varjatud video ID-sid. \"Kõigil Lehtedel Välja Arvatud Video Lehtedel\" režiim aitab seda probleemi vältida. Lisaks on võimalik seda probleemi vältida, kui seate üles pisipildi genereerimise süsteemi oma enda serverile."},"thumbnailGeneratorDescription3":{"message":"Kui pisipildi genereerimise süsteemi kasutamine on välja lülitatud, siis kasutatakse kõigi päringute puhul K-anonüümsuse päringusüsteemi, mille toimel on serveril keerulisem ennustada, mis videod saadeti ning pisipiltide genereerimiseks kasutatakse aeglasemal lokaalset süsteemi.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Pisipildi Genereerimise Süsteemi Lähtekood"},"moreAboutKAnonymity":{"message":"Rohkem infot K-anonüümsusest","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Näita alati \"Näita esialgset\" nuppu"},"whatAlwaysShowShowOriginalButton":{"message":"Kui soovite alati näha, millised pisipildid on asendatud, kasutage seda sätet."},"showOriginalOnHover":{"message":"Näita hiire hõljumisel video info kohal asendatud info asemel esialgset"},"showOriginalOnHoverOfVideo":{"message":"Näita hiire hõljumisel video kaardi kohal asendatud info asemel esialgset"},"showOriginalOnHoverOfVideoDescription":{"message":"See funktsioon lülitab välja automaatesituse"},"showCustomOnHoverIfCasual":{"message":"Näita kohandatud pealkirja hiire sattumisel pealkirjale, kui näidatakse tavarežiimi pealkirja"},"showIconForFormattedTitles":{"message":"Näita \"Näita esialgset\" nuppu automaatkohandatud pealkirjadele"},"Enable":{"message":"Luba"},"Titles":{"message":"Pealkirjad","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Pisipildid","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"Viga"},"DeArrowClickbaitWarning":{"message":"Video pealkirjad ei tohiks video autorit naeruvääristada, kritiseerida või teostada autorile faktikontrolli","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Pealkirjad ei tohiks sisaldada esialgse pealkirja sensatsioonilisi elemente","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Pealkirjad ei tohiks sisaldada emotikone","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Palun kõrvaldage hoiatuses kirjeldatav probleem enne avaldamist"},"privacyPolicy":{"message":"Privaatsuspoliitika"},"requiresUblock":{"message":"Nõuab uBlock Originit"},"Close":{"message":"Sulge"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/fa/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/fa/messages.json @@ -0,0 +1 @@ +{"400":{"message":"سرور گفت که این درخواست نامعتبر است"},"409":{"message":"این قبلاً ثبت شده است"},"502":{"message":"به نظر می‌رسد سرور زیر فشار است. چند ثانیه‌ی دیگر دوباره امتحان کنید."},"fullName":{"message":"اسپانسربلاک برای یوتیوب - اسپانسر ها را رد کنید","description":"Name of the extension."},"Description":{"message":"بخش های اسپانسر شده، درخواست ساب اسکرایب و خیلی چیز های دیگر در ویدیو های یوتیوب را رد کنید. قسمت های اسپانسری ویدیو هایی که میبینید را گزارش کنید تا در وقت دیگران صرفه جویی شود.","description":"Description of the extension."},"channelWhitelisted":{"message":"کانال در لیست سفید قرار گرفت!"},"Segment":{"message":"بخش"},"Segments":{"message":"بخش"},"upvoteButtonInfo":{"message":"امتیاز دادن به این گزارش ثبت‌شده"},"reportButtonTitle":{"message":"گزارش"},"reportButtonInfo":{"message":"گزارش این ارسال به‌عنوان غیر صحیح."},"Dismiss":{"message":"رد کردن"},"Loading":{"message":"درحال بارگذاری..."},"Hide":{"message":"هرگز نمایش نده"},"hitGoBack":{"message":"کلید عدم رد کردن را بزنید تا به جایی که بودید برگردید."},"unskip":{"message":"عدم رد کردن"},"reskip":{"message":"دوباره رد کردن"},"unmute":{"message":"صدادار"},"paused":{"message":"وقفه شده"},"manualPaused":{"message":"شمارنده متوقف شد"},"clearThis":{"message":"مطمئن هستید که میخواهید این را حذف کنید؟\n\n"},"Unknown":{"message":"اشکالی در ثبت کردن زمان های ارسالی شما پیش آمد. لطفا بعداً دوباره تلاش کنید."},"sponsorFound":{"message":"این ویدیو دارای بخش‌هایی در پایگاه‌داده است!"},"sponsor404":{"message":"هیچ بخشی پیدا نشد"},"sponsorStart":{"message":"بخش اینجا شروع می‌شود"},"sponsorEnd":{"message":"بخش اینجا پایان می‌یابد"},"sponsorCancel":{"message":"لغو ساختن بخش"},"noVideoID":{"message":"هیچ ویدیوی یوتیوب‌ای یافت نشد.\nاگر این صحیح نیست، زبانه را تازه کنید."},"refreshSegments":{"message":"تازه‌کردن بخش‌ها"},"success":{"message":"موفقیت!"},"voted":{"message":"گزارش داده شد!"},"serverDown":{"message":"به‌نظر می‌رسد که ارتباط سرور قطع شده است. با توسعه‌دهنده سریعاً تماس بگیرید."},"connectionError":{"message":"خطای شبکه رخ داده است. کد خطا: "},"clearTimes":{"message":"پاک‌نمودن بخش‌ها"},"openPopup":{"message":"نمایش پنجره اسپانسر بلاک"},"closePopup":{"message":"بستن پنجره"},"submitCheck":{"message":"مطمئن هستید که میخواهید این را ثبت کنید؟"},"whitelistChannel":{"message":"قرار دادن کانال در لیست سفید"},"removeFromWhitelist":{"message":"حذف کانال از لیست سفید"},"voteOnTime":{"message":"رأی دهی به یک بخش"},"Submissions":{"message":"ارسالی‌ها"},"savedPeopleFrom":{"message":"شما دیگران را نجات دادید از "},"viewLeaderboard":{"message":"نفرات برتر"},"recordTimesDescription":{"message":"ثبت"},"clearTimesButton":{"message":"حذف دفعات"},"Username":{"message":"نام‌کاربری"},"setUsername":{"message":"تنظیم نام کاربری"},"hideThis":{"message":"مخفی‌سازی"},"Options":{"message":"گزینه‌ها"},"showButtons":{"message":"نمایش کلید ها در پخش‌کننده یوتیوب"},"showNotice":{"message":"نمایش مجدد اطلاعیه"},"longDescription":{"message":"افزونه اسپانسر بلاک به شما امکان رد کردن بخش‌های تبلیغاتی (اسپانسر شده)، قسمت‌های شروع و پایان ویدیو، درخواست ساب‌اسکرایب و سایر قسمت‌های آزار دهنده یوتیوب را می‌دهد. اسپانسر بلاک یک افزونه مرورگر است که به هر کسی امکان ثبت زمان شروع و پایان بخش های اسپانسر شده و سایر بخش های ویدیو های یوتیوب را می‌دهد. پس از اینکه هر کاربر این اطلاعات را ثبت کرده و گزارش دهد، بقیه کاربرانی که از این افزونه استفاده می‌کنند مستقیماً بخش اسپانسر شده ویدیو را رد خواهند کرد. شما همچنین می‌توانید در ویدیو های نماهنگ (موزیک ویدیو)، قسمت‌های غیر موسیقی ویدیو را رد کنید.","description":"Full description of the extension on the store pages."},"website":{"message":"وب‌سایت","description":"Used on Firefox Store Page"},"sourceCode":{"message":"سورس کد","description":"Used on Firefox Store Page"},"noticeUpdate2":{"message":"اگر همچنان این را نمی‌پسندید، گزینه هرگز نمایش نده را انتخاب کنید.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"رد کردن بخش","description":"Keybind label"},"nextChapterKeybind":{"message":"بخش بعدی","description":"Keybind label"},"previousChapterKeybind":{"message":"بخش پیشین","description":"Keybind label"},"disableSkipping":{"message":"ردکردن فعال است"},"enableSkipping":{"message":"ردکردن غیرفعال است"},"yourWork":{"message":"کار شما","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"کد خطا: "},"skip":{"message":"رد کردن"},"mute":{"message":"بی‌صدا"},"skip_category":{"message":"{0} رد شود؟"},"mute_category":{"message":"{0} بی‌صدا شود؟"},"skipped":{"message":"{0} رد شد","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} بی‌صدا شد","description":"Example: Sponsor Muted"},"minLower":{"message":"دقیقه"},"minsLower":{"message":"دقیقه"},"hourLower":{"message":"ساعت"},"hoursLower":{"message":"ساعت"},"youHaveSavedTime":{"message":"شما دیگران را نجات دادید از","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" از زندگی‌شان","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"createdBy":{"message":"ایجاد شده توسط"},"supportedSites":{"message":"وب‌سایت‌های پشتیبانی شده: "},"add":{"message":"افزودن"},"save":{"message":"ذخیره"},"reset":{"message":"بازنشانی"},"areYouSureReset":{"message":"آيا مطمئن هستيد که مي خواهيد این را بازنشانی کنید؟"},"mobileUpdateInfo":{"message":"m.youtube.com اکنون پشتیبانی می‌شود"},"exportOptionsDownload":{"message":"ذخیره در فایل"},"setOptions":{"message":"تنظیم گزینه‌ها"},"confirmNoticeTitle":{"message":"ثبت بخش"},"submit":{"message":"ثبت"},"cancel":{"message":"لغو"},"delete":{"message":"حذف"},"preview":{"message":"پیش‌نمایش"},"unsubmitted":{"message":"ثبت‌نشده"},"inspect":{"message":"مشاهده"},"edit":{"message":"ویرایش"},"to":{"message":"به","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"کپی شد!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"category_sponsor":{"message":"اسپانسر"},"category_exclusive_access":{"message":"دسترسی اختصاصی"},"category_music_offtopic_short":{"message":"غیر موسیقی"},"category_poi_highlight":{"message":"برجسته"},"autoSkip":{"message":"ردکردن خودکار"},"manualSkip":{"message":"ردکردن دستی"},"showOverlay":{"message":"نمایش در نوار پیشرفت"},"disable":{"message":"غیرفعال کردن"},"showOverlay_POI":{"message":"نمایش در نوار پیشرفت"},"showOverlay_full":{"message":"نمایش نام"},"category":{"message":"دسته بندی"},"bracketNow":{"message":"(اکنون)"},"moreCategories":{"message":"نمایش دسته‌بندی‌ها"},"bracketEnd":{"message":"(پایان)"},"acceptPermission":{"message":"تأیید دسترسی"},"incorrectCategory":{"message":"تغییر دسته بندی"},"guidelines":{"message":"دستورالعمل‌ها"},"readTheGuidelines":{"message":"دستورالعمل‌ها را بخوانید!!","description":"Show the first time they submit or if they are \"high risk\""},"help":{"message":"راهنما"},"GotIt":{"message":"فهمیدم","description":"Used as the button to dismiss a tooltip"},"hideForever":{"message":"مخفی‌سازی برای همیشه"},"Donate":{"message":"کمک مالی"},"hideDonationLink":{"message":"پنهان کردن لینک کمک مالی"},"helpPageThanksForInstalling":{"message":"ازینکه افزونه SponserBlock را نصب کردید سپاسگزاریم."},"helpPageReviewOptions":{"message":"لطفاً تنظیمات زیر را بررسی کنید"},"Submitting":{"message":"ثبت نمودن"},"helpPageCopyOfDatabase2":{"message":"سورس کد به‌صورت رایگان ارائه شده است. بنابراین، اگر اتفاقی برای من بیفتد، ارسالات شما از بین نمی‌روند."},"Credits":{"message":"سازندگان"},"LearnMore":{"message":"بیشتر بدانید"},"dayAbbreviation":{"message":"روز","description":"100d"},"hourAbbreviation":{"message":"ساعت","description":"100h"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/fi/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/fi/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Yhteyden aikakatkaisu. Tarkista internet-yhteytesi. Jos internetyhteytesi toimii, palvelin on todennäköisesti ylikuormittunut tai alhaalla."},"400":{"message":"Palvelin sanoi tämän pyynnön olevan virheellinen"},"409":{"message":"Tämä on jo lähetetty aiemmin"},"502":{"message":"Palvelin näyttää olevan ylikuormitettu. Yritä uudelleen muutaman sekunnin kuluttua."},"fullName":{"message":"SponsorBlock YouTubelle - Ohita sponsoroinnit","description":"Name of the extension."},"Description":{"message":"Ohita sponsoroitu mainonta, tilausten kerjääminen ja muuta YouTube-videoissa. Ilmoita katsomasi videoiden sponsorit säästääksesi muilta aikaa.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanava lisätty valkolistalle!"},"Segment":{"message":"osio"},"Segments":{"message":"osiota"},"SegmentsCap":{"message":"Osiot"},"Chapters":{"message":"Kappaleet"},"renderAsChapters":{"message":"Piirrä osiot kappaleina","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Näytä nykyinen osio videon ajan vieressä"},"showAutogeneratedChapters":{"message":"Näytä YouTuben luomat kappaleet"},"upvoteButtonInfo":{"message":"Äänestä lähetystä"},"reportButtonTitle":{"message":"Ilmoita"},"reportButtonInfo":{"message":"Ilmoita tämän lähetyksen olevan virheellinen."},"Dismiss":{"message":"Hylkää"},"Loading":{"message":"Ladataan..."},"Hide":{"message":"Älä näytä koskaan"},"hitGoBack":{"message":"Paina 'älä ohita' palataksesi kohtaan, jossa olit."},"unskip":{"message":"Älä ohita"},"reskip":{"message":"Ohita uudelleen"},"unmute":{"message":"Poista mykistys"},"paused":{"message":"Pysäytetty"},"manualPaused":{"message":"Ajastin pysäytetty"},"confirmMSG":{"message":"Muokataksesi tai poistaaksesi yksittäisiä arvoja, klikkaa info-painiketta tai avaa laajennuksen ponnahdusikkuna klikkaamalla laajennuksen kuvaketta oikeassa yläkulmassa."},"clearThis":{"message":"Haluatko varmasti poistaa tämän?\n\n"},"Unknown":{"message":"Sponsorointiaikoja lähetettäessä tapahtui virhe, yritä myöhemmin uudelleen."},"sponsorFound":{"message":"Tällä videolla on osioita tietokannassa!"},"sponsor404":{"message":"Osioita ei löytynyt"},"sponsorStart":{"message":"Osio alkaa nyt"},"sponsorEnd":{"message":"Osio päättyy nyt"},"sponsorCancel":{"message":"Peruuta osion luominen"},"noVideoID":{"message":"YouTube-videota ei löytynyt.\nJos tämä ei pidä paikkaansa, päivitä välilehti."},"refreshSegments":{"message":"Päivitä osiot"},"success":{"message":"Onnistui!"},"voted":{"message":"Äänestetty!"},"serverDown":{"message":"Palvelin näyttää olevan alhaalla. Ota heti yhteyttä kehittäjään."},"connectionError":{"message":"Yhteysvirhe on tapahtunut. Virhekoodi: "},"segmentsStillLoading":{"message":"Osioita ladataan yhä..."},"clearTimes":{"message":"Tyhjennä osiot"},"openPopup":{"message":"Avaa SponsorBlock-ponnahdusikkuna"},"closePopup":{"message":"Sulje ponnahdusikkuna"},"closeIcon":{"message":"Sulkukuvake"},"OpenSubmissionMenu":{"message":"Avaa Lähetykset-valikko"},"OpenCasualVoteMenu":{"message":"Avaa kasuaalitilan valikko"},"sortSegments":{"message":"Järjestä osiot"},"submitCheck":{"message":"Haluatko varmasti lähettää tämän?"},"whitelistChannel":{"message":"Lisää kanava valkolistalle"},"removeFromWhitelist":{"message":"Poista kanava valkolistalta"},"voteOnTime":{"message":"Äänestä osiota"},"Submissions":{"message":"Lähetykset"},"savedPeopleFrom":{"message":"Olet säästänyt ihmisiltä "},"viewLeaderboard":{"message":"Tulostaulu"},"recordTimesDescription":{"message":"Lähetä"},"submissionEditHint":{"message":"Osioiden muokkaus ilmestyy klikattuasi lähetä","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Vihje: Voit määrittää lähetyksen pikanäppäimet asetuksista"},"clearTimesButton":{"message":"Tyhjennä ajat"},"Username":{"message":"Käyttäjänimi"},"setUsername":{"message":"Aseta käyttäjänimi"},"copyPublicID":{"message":"Kopioi julkinen UserID"},"copySegmentID":{"message":"Kopioi osion ID"},"loopChapter":{"message":"Toista kappale jatkuvasti"},"unloopChapter":{"message":"Lopeta kappaleen jatkuva toisto"},"hideThis":{"message":"Piilota tämä"},"Options":{"message":"Asetukset"},"showButtons":{"message":"Näytä painikkeet YouTuben soittimessa"},"hideButtonsDescription":{"message":"Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."},"showSkipButton":{"message":"Pidä \"Ohita kohtaan: Kohokohta\" -painike soittimessa"},"showInfoButton":{"message":"Näytä info-painike YouTuben soittimessa"},"autoHideInfoButton":{"message":"Piilota info-painike automaattisesti"},"showDeleteButton":{"message":"Näytä poista-painike YouTuben soittimessa"},"enableViewTracking":{"message":"Käytä ohitusten lukumäärän seurantaa"},"whatViewTracking":{"message":"Tämä toiminto seuraa, mitä osioita olet ohittanut. Sen avulla käyttäjät saavat tietää, kuinka paljon heidän lähetyksensä ovat auttaneet muita, ja sitä käytetään myös mittarina äänestysten kanssa estääksemme spämmin pääsyn tietokantaan. Laajennus lähettää viestin palvelimelle aina kun ohitat osion. Toivottavasti useimmat eivät muuta tätä asetusta, jotta katselunumerot pysyisivät tarkkoina. :)"},"enableViewTrackingInPrivate":{"message":"Ota ohitusten lukumäärän seuranta käyttöön yksityis-/incognito-välilehdissä"},"enableTrackDownvotes":{"message":"Säilytä osion negatiiviset äänet"},"whatTrackDownvotes":{"message":"Negatiivisesti äänestämäsi osiot pysyvät piilotettuina myös päivityksen jälkeen"},"trackDownvotesWarning":{"message":"Varoitus: Tämän käytöstä poisto poistaa kaikki aiemmat negatiiviset äänet"},"enableTrackDownvotesInPrivate":{"message":"Säilytä osioiden alaäänet yksityisissä/incognito-välilehdissä"},"enableQueryByHashPrefix":{"message":"Kysely tiiviste-etuliittellä"},"whatQueryByHashPrefix":{"message":"Sen sijaan, että videoID:tä käyttäen pyydettäisiin osioita palvelimelta, videoID:n tiivisteen 4 ensimmäistä merkkiä lähetetään. Palvelin lähettää takaisin dataa kaikista videoista, joilla on samankaltaiset tiivisteet."},"enableShowCategoryWithoutPermission":{"message":"Näytä kategoriat lähetysvalikossa myös ilman lähetyslupaa"},"whatShowCategoryWithoutPermission":{"message":"Jotkin kategoriat vaativat lähetysluvan maineen vähimmäisvaatimusten vuoksi"},"showNotice":{"message":"Näytä ilmoitus uudelleen"},"showSkipNotice":{"message":"Näytä ilmoitus ohitetun osion jälkeen"},"showUpcomingNotice":{"message":"Näytä ilmoitus ennen kuin osio alkaa"},"showCategoryGuidelines":{"message":"Näytä kategorian ohje"},"noticeVisibilityMode0":{"message":"Täysikokoiset ohitusilmoitukset"},"noticeVisibilityMode1":{"message":"Pienet ohitusilmoitukset automaattiselle ohitukselle"},"noticeVisibilityMode2":{"message":"Kaikki pienet ohitusilmoitukset"},"noticeVisibilityMode3":{"message":"Haalistuneet ohitusilmoitukset automaattiselle ohitukselle"},"noticeVisibilityMode4":{"message":"Kaikki haalistuneet ohitusilmoitukset"},"longDescription":{"message":"SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on käyttäjälähteinen selainlaajennus, jonka avulla kuka tahansa voi lähettää Youtube-videoiden sponsoroitujen ja muiden osioiden aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun osion. Voit myös ohittaa musiikkivideoiden musiikittomat osat.","description":"Full description of the extension on the store pages."},"website":{"message":"Sivusto","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Lähdekoodi","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Ilmoitus on päivitetty!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Jos et vieläkään pidä siitä, paina \"älä näytä koskaan\" -painiketta.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Ohita osio","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Aloita/lopeta osio","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Avaa lähetys-valikko","description":"Keybind label"},"setSubmitKeybind":{"message":"Lähetä osiot","description":"Keybind label"},"setPreviewKeybind":{"message":"Osion esikatselu","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Sulje ohitus-ilmoitus","description":"Keybind label"},"setDownvoteKeybind":{"message":"Äänestä osio alas","description":"Keybind label"},"setUpvoteKeybind":{"message":"Äänestä osio ylös","description":"Keybind label"},"nextChapterKeybind":{"message":"Seuraava kappale","description":"Keybind label"},"previousChapterKeybind":{"message":"Edellinen kappale","description":"Keybind label"},"enableDeArrowKey":{"message":"DeArrown käyttöönotto/käytöstä poisto","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Avaa lähetys-valikko","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Valitse näppäin painamalla sitä ja valitse haluamasi vaihtonäppäin."},"disableSkipping":{"message":"Ohitus on käytössä"},"enableSkipping":{"message":"Ohitus on poistettu käytöstä"},"yourWork":{"message":"Työsi","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Virhekoodi: "},"skip":{"message":"Ohita"},"mute":{"message":"Mykistä"},"full":{"message":"Koko video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Ohita {0}?"},"mute_category":{"message":"Mykistä {0}?"},"skip_to_category":{"message":"Ohita kohtaan: {0}","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Tulossa: {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} ohitettu","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} Mykistetty","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Ohitettiin kohtaan: {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"{0} äänestetty","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Poista automaattinen ohitus käytöstä"},"enableAutoSkip":{"message":"Ota automaattinen ohitus käyttöön"},"audioNotification":{"message":"Ääni-ilmoitus ohitettaessa"},"audioNotificationDescription":{"message":"Ääni-ilmoitus ohittaessa toistaa äänen kun osio ohitetaan. Jos asetus on pois päältä (tai automaattinen ohitus on pois käytöstä), ääntä ei soiteta."},"showTimeWithSkips":{"message":"Näytä kesto ilman ohitettuja osioita"},"showTimeWithSkipsDescription":{"message":"Tämä aika näkyy sulkeissa nykyisen ajan vieressä liukusäätimen alapuolella. Se näyttää videon koko pituuden ilman osioita. Se sisältää vain osiot, jotka on merkitty \"Näytä liukusäätimessä\"."},"youHaveSkipped":{"message":"Olet ohittanut "},"minLower":{"message":"minuutin"},"minsLower":{"message":"minuuttia"},"hourLower":{"message":"tunnin"},"hoursLower":{"message":"tuntia"},"youHaveSavedTime":{"message":"Olet säästänyt ihmisiltä","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" heidän elämistään","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Tarkista palvelimen tila osoitteessa status.sponsor.ajay.app."},"changeUserID":{"message":"Tuo/vie yksityinen UserID"},"whatChangeUserID":{"message":"Tämä pitäisi pitää yksityisenä. Tämä on kuin salasana, eikä sitä pitäisi jakaa kenenkään kanssa. Jos jollakulla on tämä, he voivat esiintyä sinuna. Jos etsit julkista userID:täsi, napsauta leikepöydän kuvaketta ponnahdusikkunassa."},"setUserID":{"message":"Määritä yksityinen UserID"},"userIDChangeWarning":{"message":"Varoitus: Yksityisen UserID:n vaihto on pysyvää. Haluatko varmasti tehdä tämän? Varmuuskopioi vanha UserID varmuuden vuoksi."},"createdBy":{"message":"Luonut"},"supportOtherSites":{"message":"Tue kolmansien osapuolien YouTube-sivustoja"},"supportOtherSitesDescription":{"message":"Tue kolmannen osapuolen YouTube-sovelluksia. Ottaaksesi tuen käyttöön, sinun on hyväksyttävä tarvittavat käyttöoikeudet.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Tuetut sivustot: "},"optionsInfo":{"message":"Ota käyttöön Invidious tuki, poista käytöstä automaattinen ohitus, piilota painikkeet ja muuta."},"addInvidiousInstance":{"message":"Lisää kolmannen osapuolen asiakasohjelmainstanssi"},"addInvidiousInstanceDescription":{"message":"Lisää mukautettu instanssi. Tämän täytyy olla formatoitu VAIN verkkotunnuksella. Esimerkki: invidious.ajay.app"},"add":{"message":"Lisää"},"addInvidiousInstanceError":{"message":"Tämä on virheellinen verkkotunnus. Tämän pitäisi sisältää VAIN verkkotunnus. Esimerkiksi: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Nollaa Invidious-instanssien lista"},"resetInvidiousInstanceAlert":{"message":"Olet nollaamassa Invidious-instanssien listan"},"invidiousDisabledSafari":{"message":"Invidious-tuki ei ole tällä hetkellä käytettävissä Safarissa siinä olevan vian takia. Tuki palautetaan Applen korjattua vian."},"currentInstances":{"message":"Nykyiset instanssit:"},"minDuration":{"message":"Vähimmäiskesto (sekuntia):"},"minDurationDescription":{"message":"Osioita jotka ovat asetettua arvoa lyhyempiä ei ohiteta tai näytetä soittimessa."},"enableManualSkipOnFullVideo":{"message":"Käytä manuaalista ohitusta, kun video on merkitty \"Koko video\" osiolla"},"whatManualSkipOnFullVideo":{"message":"Niille, jotka haluavat katsella täysin sponsoroitua sisältöä tai julkaisijan omaa markkinointia sisältävät videot keskeytyksettä."},"skipNoticeDuration":{"message":"Ohitusilmoituksen kesto (sekuntia):"},"skipNoticeDurationDescription":{"message":"Ohitusimoitus pysyy näytöllä ainakin näin kauan.\nManuaalisella ohituksella se saattaa pysyä pitempäänkin."},"shortCheck":{"message":"Seuraava lähetys on lyhyempi kuin vähimmäiskeston asetuksesi. Tämä voi tarkoittaa sitä, että tämä on jo lähetetty, ja sitä ei vain oteta huomioon tämän asetuksen vuoksi. Oletko varma, että haluat lähettää?"},"liveOrPremiere":{"message":"Aktiivisen livestriimin tai ensiesityksen aikana lähettäminen ei ole sallittua. Odota kunnes se loppuu, sitten päivitä sivu ja varmista, että osiot ovat yhä oikein."},"showUploadButton":{"message":"Näytä lähetä-painike"},"customServerAddress":{"message":"SponsorBlock-palvelimen osoite"},"customServerAddressDescription":{"message":"Osoite, jota SponsorBlock käyttää lähettääkseen kutsuja palvelimelle.\nEllei sinulla ole omaa palvelininstanssia, tätä ei pitäisi muuttaa."},"dataFetchingServerAddress":{"message":"Tiedot hakevan palvelimen osoite"},"dataFetchingServerAddressDescription":{"message":"Osoite, jota käytetään kutsujen lähettämiseen tietojenhakupalvelimelle.\nEllei sinulla ole omaa palvelininstanssia, tätä ei pitäisi muuttaa."},"thumbnailCacheServerAddress":{"message":"Pienoiskuvien välimuistipalvelimen osoite"},"save":{"message":"Tallenna"},"reset":{"message":"Palauta"},"customAddressError":{"message":"Tämä osoite ei ole oikeassa muodossa. Varmista, että sinulla on http:// tai https:// alussa eikä perässä kauttaviivoja."},"areYouSureReset":{"message":"Oletko varma, että haluat nollata tämän?"},"mobileUpdateInfo":{"message":"m.youtube.com-osoitetta tuetaan nyt"},"exportOptions":{"message":"Vie/tuo kaikki asetukset"},"exportOtherData":{"message":"Tuo/vie kaikki muut tiedot"},"exportOptionsCopy":{"message":"Muokkaa/kopioi"},"exportOptionsDownload":{"message":"Tallenna tiedostoon"},"exportOptionsUpload":{"message":"Lataa tiedostosta"},"whatExportOptions":{"message":"Tässä ovat kaikki määrityksesi JSON-muodossa. Myös yksityinen UserID sisältyy näihin tietoihin, joten jaa tiedostoa harkiten."},"setOptions":{"message":"Käytä asetuksia"},"exportOptionsWarning":{"message":"Varoitus: Asetusten vaihtaminen on pysyvää ja voi rikkoa asennuksesi. Oletko varma, että haluat tehdä tämän? Varmuuskopioi vanha varmuuden vuoksi."},"incorrectlyFormattedOptions":{"message":"Tämä JSON ei ole muotoiltu oikein. Asetuksiasi ei ole muutettu."},"confirmNoticeTitle":{"message":"Lähetä osio"},"submit":{"message":"Lähetä"},"cancel":{"message":"Peruuta"},"delete":{"message":"Poista"},"preview":{"message":"Esikatsele"},"unsubmitted":{"message":"Lähettämätön"},"inspect":{"message":"Tarkista"},"edit":{"message":"Muokkaa"},"copyDebugLogs":{"message":"Kopioi virheenkorjauslokit"},"copyDebugInformation":{"message":"Kopioi vianetsintätiedot leikepöydälle"},"copyDebugInformationFailed":{"message":"Kirjoittaminen leikepöydälle epäonnistui"},"copyDebugInformationOptions":{"message":"Kopioi tiedot leikepöydälle, joka annetaan kehittäjälle kun ilmoitetaan viasta / kun kehittäjä pyytää sitä. Arkaluonteiset tiedot, kuten käyttäjätunnus, sallitut kanavat ja mukautettu palvelimen osoite on poistettu. Se sisältää kuitenkin tietoja, kuten käyttäjäagentin, selaimen, käyttöjärjestelmän ja laajennuksen versionumeron. "},"copyDebugInformationComplete":{"message":"Virheenkorjaustiedot on kopioitu leikepöydälle. Voit poistaa mitä tahansa tietoa mitä et mielummin jakaisi. Tallenna tämä tekstitiedostoon tai liitä se virheraporttiin."},"keyAlreadyUsed":{"message":"Pikänäppäin on jo liitetty toiselle toiminnolle. Valitse eri näppäin."},"to":{"message":"-","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Kopioitu!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Sisällytä siirtymät osioon"},"generic_guideline2":{"message":"Video toistuu ikään kuin mitään ei olisi ohitettu"},"category_sponsor":{"message":"Sponsori"},"category_sponsor_description":{"message":"Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai ilmaisille maininnoille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät."},"category_sponsor_guideline1":{"message":"Maksetut mainostukset"},"category_sponsor_guideline2":{"message":"Ei lahjoituksille tai omalle kauppatavaralle"},"category_selfpromo":{"message":"Maksamaton/Itsensä mainostus"},"category_selfpromo_description":{"message":"Samankaltainen \"sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä."},"category_selfpromo_guideline1":{"message":"Lahjoitukset, jäsenyydet ja oma kauppatavara"},"category_selfpromo_guideline2":{"message":"Ilmaiset maininnat, jotka eivät tuo videolle lisäarvoa"},"category_selfpromo_guideline3":{"message":"Ei yritysten luomille tuotteille tai kauppatavaralle"},"category_exclusive_access":{"message":"Yksinoikeudellinen ensikatsaus"},"category_exclusive_access_description":{"message":"Vain kokonaisten videoiden merkitsemiseen. Käytetään kun videossa esitellään tuote, palvelu tai sijainti, johon he ovat saaneet ilmaisen tai tuetun käyttöoikeuden."},"category_exclusive_access_pill":{"message":"Tämä video esittelee tuotteen, palvelun tai sijainnin, johon he ovat saaneet ilmaisen tai tuetun käyttöoikeuden","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Koko video esittelee jotakin, jonka käyttöoikeus on saatu veloituksetta tai tuetusti"},"category_interaction":{"message":"Vuorovaikutusmuistutus (tilaaminen)"},"category_interaction_description":{"message":"Lyhyt muistutus tykätä, tilata tai seurata sisällön keskellä. Jos se on pitkä tai koskee jotain tiettyä asiaa, tulisi se merkitä mielummin itsensä mainostamiseksi."},"category_interaction_guideline1":{"message":"Lyhyet muistutukset tykätä, tilata tai seurata"},"category_interaction_guideline2":{"message":"Sisältää epäsuorat muistutukset kommenttien jättämisestä"},"category_interaction_guideline3":{"message":"Ei yleiselle mainostukselle, vain toimintapyynnöille"},"category_interaction_short":{"message":"Vuorovaikutusmuistutus"},"category_intro":{"message":"Tauko/Introanimaatio"},"category_intro_description":{"message":"Aikaväli ilman varsinaista sisältöä. Voi olla tauko, staattinen kehys, toistuva animaatio. Tätä ei pitäisi käyttää siirtymisiin, jotka sisältävät tietoa."},"category_intro_short":{"message":"Tauko"},"category_intro_guideline1":{"message":"Tauko ilman varsinaista sisältöä"},"category_intro_guideline2":{"message":"Ei tietoa sisältäville siirtymille"},"category_outro":{"message":"Loppukortit/-tekstit"},"category_outro_description":{"message":"Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille joissa on tietoa."},"category_outro_guideline1":{"message":"Älä sisällytä sisältöä, vaikka loppukortit olisivatkin näytöllä"},"category_preview_description":{"message":"Kokoelma leikkeitä, jotka kertovat mitä video sisältää tai sarjan muut videot sisältävät ja joiden kaikki informaatio toistuu videossa myöhemmin."},"category_preview_guideline1":{"message":"Myöhemmin tai tulevassa videossa ilmestyvät klipit"},"category_preview_guideline2":{"message":"Kertaus edellisestä videosta"},"category_preview_guideline3":{"message":"Ei osioille, jotka lisäävät uutta sisältöä"},"category_filler":{"message":"Toissijaiset kohtaukset/Vitsit"},"category_filler_description":{"message":"Täytteenä tai kevennyksenä toimivia toissijaisia kohtauksia, jotka eivät ole videon pääsisällön ymmärtämisen kannalta oleellisia. Tämän ei tulisi sisältää aiheeseen liittyviä tai taustatietoja tarjoavia osioita. Tämä on erittäin aggressiivinen kategoria hetkiin, joina et välitä \"huvituksista\"."},"category_filler_short":{"message":"Toissijaiset kohtaukset"},"category_filler_guideline1":{"message":"Toissijaiset kohtaukset tai vitsit"},"category_filler_guideline2":{"message":"Häiriöt, blooperit, uusinnat"},"category_filler_guideline3":{"message":"Ei aiheen ymmärtämiseen tarvittavia kohtauksia varten"},"category_music_offtopic":{"message":"Musiikki: Musiikiton osa"},"category_music_offtopic_description":{"message":"Vain musiikkivideoille. Tätä tulee käyttää vain musiikkivideoiden osissa, jotka eivät jo kuulu toiseen kategoriaan."},"category_music_offtopic_short":{"message":"Musiikiton"},"category_music_offtopic_guideline1":{"message":"Osat, jotka eivät ole virallisissa julkaisuissa"},"category_music_offtopic_guideline2":{"message":"Musiikittomat kohdat live-esityksissä"},"category_poi_highlight":{"message":"Kohokohta"},"category_poi_highlight_description":{"message":"Kohta videossa, mitä suurin osa ihmisistä etsivät.\nSamankaltainen \"Video alkaa kohdassa x\" kommenttien kanssa."},"category_poi_highlight_guideline1":{"message":"Kohta mitä useimmat ihmiset etsivät"},"category_poi_highlight_guideline2":{"message":"Voi ohittaa kontekstin"},"category_poi_highlight_guideline3":{"message":"Voi ohittaa otsikon tai pienoiskuvan viittaamaan kohtaan"},"category_chapter":{"message":"Kappale"},"category_chapter_description":{"message":"Nimetyt kappaleet, jotka kuvaavat videon merkittäviä osia."},"category_chapter_guideline1":{"message":"Älä mainitse sponsoreiden nimiä"},"category_chapter_guideline2":{"message":"Käytä yleisille osille suurempia kappaleita"},"category_chapter_guideline3":{"message":"Pienemmät kappaleet voidaan sijoittaa suurempien kappaleiden sisälle"},"category_livestream_messages":{"message":"Livestream: lahjoitusten/viestien lukeminen"},"category_livestream_messages_short":{"message":"Viestien lukeminen"},"autoSkip":{"message":"Ohita automaattisesti"},"manualSkip":{"message":"Manuaalinen ohitus"},"showOverlay":{"message":"Näytä liukusäätimessä"},"disable":{"message":"Poista käytöstä"},"autoSkip_POI":{"message":"Ohita automaattisesti alkuun"},"manualSkip_POI":{"message":"Kysy kun video latautuu"},"showOverlay_POI":{"message":"Näytä liukusäätimessä"},"showOverlay_full":{"message":"Näytä merkki"},"showOverlay_chapter":{"message":"Näytä kappaleet"},"autoSkipOnMusicVideos":{"message":"Ohita kaikki osiot automaattisesti, kun videossa on \"Musiikiton\" osio"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Ohita automaattisesti vain music.youtube.com-osoittessa"},"muteSegments":{"message":"Salli osiot, jotka mykistävät äänen ohittamisen sijaan"},"fullVideoSegments":{"message":"Näytä kuvake, kun video on kokonaan mainos","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Näytä tunnisteet myös videoiden pienoiskuvissa","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Lähettämättömien väri","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Siirtymispalkin väri"},"category":{"message":"Kategoria"},"skipOption":{"message":"Ohitusvalinta","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Avaa ohituksen lisäasetukset"},"advancedSkipNotSaved":{"message":"Syntaksivirhe: Asetuksiasi ei ole tallennettu"},"advancedSkipSettingsHelp":{"message":"Näin tämä toimii","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Käytä betatestauspalvelinta"},"whatEnableTestingServer":{"message":"Lähetyksiäsi ja ääniäsi EI LASKETA pääpalvelimella. Käytä tätä vain testaamiseen."},"testingServerWarning":{"message":"Kaikki lähetykset ja äänet EIVÄT LASKE pääpalvelinta kohti, kun muodostat yhteyden testipalvelimeen. Varmista, että poistat tämän käytöstä, kun haluat tehdä oikeita lähetyksiä."},"bracketNow":{"message":"(Nyt)"},"moreCategories":{"message":"Lisää kategorioita"},"chooseACategory":{"message":"Valitse kategoria"},"enableThisCategoryFirst":{"message":"Lähettääksesi osioita \"{0}\" kategorialla, sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Varoitus: Tämäntyyppisiä osioita voi olla aktiivisena enintään yksi. Usean lähettäminen aiheuttaa sen, että satunnainen osio näytetään."},"youMustSelectACategory":{"message":"Sinun täytyy valita kategoria kaikille osioille, joita olet lähettämässä!"},"bracketStart":{"message":"(Alku)"},"bracketEnd":{"message":"(Loppu)"},"End":{"message":"Lopusta","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"piilotettu: miinusääniä"},"hiddenDueToDuration":{"message":"piilotettu: liian lyhyt"},"manuallyHidden":{"message":"manuaalisesti piilotettu"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Kanavan ID ei ole vielä latautunut. Jos käytät upotettua videota, kokeile sen sijaan käyttää YouTuben kotisivua. Tämä voi myös johtua muutoksista YouTuben ulkoasussa. Jos luulet luulet niin, tee kommenti tänne:"},"invidiousPermissionRefresh":{"message":"Selain on perunut laajennuksen oikeuden toimia Invidious- ja muilla kolmannen osapuolen sivustoilla. Palauta käyttöoikeus painamalla alla olevaa painiketta."},"acceptPermission":{"message":"Hyväksy käyttöoikeus"},"permissionRequestSuccess":{"message":"Käyttöoikeuspyyntö onnistui!"},"permissionRequestFailed":{"message":"Käyttöoikeuspyyntö epäonnistui, klikkasitko kiellä?"},"adblockerIssueWhitelist":{"message":"Jos et pysty ratkaisemaan tätä, poista käytöstä asetus 'Pakota kanavan tarkistus ennen ohittamista', koska SponsorBlock ei pysty noutamaan tämän videon kanavatietoja"},"forceChannelCheck":{"message":"Pakota kanavan tarkistus ennen ohittamista"},"whatForceChannelCheck":{"message":"Oletuksena osiot ohitetaan heti ennen kuin kanava tiedetään. Oletuksena, jotkut osiot videon alussa saattavat tulla ohitetuiksi sallituilla kanavilla. Tämän vaihtoehdon ottaminen käyttöön estää sen, mutta kaikki ohitukset viivästyvät hieman, koska kanavatunnuksen saaminen voi kestää jonkin aikaa. Tämä viive saattaa olla huomaamaton, jos sinulla on nopea internetyhteys."},"forceChannelCheckPopup":{"message":"Harkitse asetuksen \"Pakota kanavan tarkistus ennen ohittamista\" käyttöön ottaminen"},"downvoteDescription":{"message":"Virheellinen/väärä aika"},"incorrectVote":{"message":"Virheellinen"},"harmfulVote":{"message":"Haitallinen","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Vaihda kategoria"},"nonMusicCategoryOnMusic":{"message":"Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on oikeasti \"Musiikiton osio\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän osion oikeassa kategoriassa. Lue säännöt, jos olet vielä hämilläsi."},"multipleSegments":{"message":"Useita osioita"},"guidelines":{"message":"Säännöt"},"readTheGuidelines":{"message":"Lue säännöt!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategoriat ovat täällä!"},"categoryUpdate2":{"message":"Avaa asetukset ohittaaksesi introt, outrot, kauppatavarat, jne."},"help":{"message":"Ohje"},"GotIt":{"message":"Selvä","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Tämä osio on suuri. Jos koko video koskee yhtä aihetta, vaihda \"Ohita\" valintaan \"Koko video\". Katso lisätietoja säännöistä."},"categoryPillTitleText":{"message":"Koko video on merkitty tällä kategorialla ja on erotettavaksi liian tiiviisti integroitu"},"chapterNameTooltipWarning":{"message":"Jonkin kappaleesi nimi on samankaltainen kategorian kanssa. Kun mahdollista, kappaleiden sijaan on suositeltavaa käyttää kategorioita."},"experiementOptOut":{"message":"Jättäydy pois kaikista tulevista kokeiluista","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Piilota ikuisesti"},"warningChatInfo":{"message":"Huomasimme, että teit joitakin yleisiä virheitä. Arvostamme työtäsi erittäin paljon, mutta pyrimme täydellisyyteen, joten pienilläkin virheillä on väliä :)"},"questionButton":{"message":"Minulla on kysymys"},"askAQuestion":{"message":"Esitä kysymys"},"warningConfirmButton":{"message":"Ymmärrän syyn"},"warningError":{"message":"Virhe yritettäessä kuitata varoitusta:"},"deArrowMessageRecieved":{"message":"Olet saanut valvojalta vinkin"},"Donate":{"message":"Lahjoita"},"considerDonating":{"message":"Auta rahoittamalla kehitystä"},"hideDonationLink":{"message":"Piilota lahjoituslinkki"},"darkModeOptionsPage":{"message":"Tumma tila asetussivulla"},"helpPageThanksForInstalling":{"message":"Kiitos, että asensit SponsorBlockin."},"helpPageReviewOptions":{"message":"Tarkista alla olevat vaihtoehdot kiitos"},"helpPageFeatureDisclaimer":{"message":"Monet ominaisuudet ovat oletuksena pois päältä. Jos haluat ohittaa introt, outrot, käyttää Invidiousta, jne., ota ne käyttöön alhaalla. Voit myös piilottaa/näyttää käyttöliittymäelementtejä."},"helpPageHowSkippingWorks":{"message":"Näin se toimii"},"helpPageHowSkippingWorks1":{"message":"Kaikki sponsorit ovat sinunlaistesi käyttäjien lähettämiä. Voit nähdä listan lähetetyistä sponsoreista tietokannassa avaamalla ponnahdusikkunan selaimesi oikeassa yläkulmassa."},"helpPageHowSkippingWorks2":{"message":"Aina kun ohitat osion, saat ilmoituksen. Jos ajoitus näyttää väärältä, äänestä alaspäin klikkaamalla 👎! Voit myös äänestää ponnahdusikkunassa."},"Submitting":{"message":"Lähettäminen"},"helpPageCopyOfDatabase":{"message":"Minne lähetetyt osiot menevät?"},"helpPageCopyOfDatabase2":{"message":"Lähdekoodi on vapaasti saatavilla. Joten, vaikka jotain tapahtuisi minulle, sinun lähetyksesi eivät katoa."},"AdviceForSubmitting":{"message":"Neuvoja osioiden lähettämiseen"},"Credits":{"message":"Tekijät"},"LearnMore":{"message":"Opi lisää"},"FullDetails":{"message":"Täydet tiedot"},"CopyDownvoteButtonInfo":{"message":"Äänestää alas ja luo paikallisen kopion, jonka voit lähettää uudelleen"},"OpenCategoryWikiPage":{"message":"Avaa tämän kategorian wiki-sivu."},"CopyAndDownvote":{"message":"Kopioi ja äänestä alas"},"ContinueVoting":{"message":"Jatka äänestystä"},"ChangeCategoryTooltip":{"message":"Tämä vaikuttaa sinun osioihin välittömästi"},"downvote":{"message":"Äänestä alas"},"upvote":{"message":"Äänestä ylös"},"hideSegment":{"message":"Piilota osio"},"skipSegment":{"message":"Ohita osio"},"playChapter":{"message":"Toista kappale"},"SponsorTimeEditScrollNewFeature":{"message":"Käytä hiiren rullaa samalla kun osoitin on muokkauslaatikon päällä säätääksesi aikaa nopeasti. Ctrl- tai Shift-näppäimen yhdistelmiä voi käyttää muutoksien hienosäätelyyn."},"categoryPillNewFeature":{"message":"Uutta! Näe, kun video on kokonaan sponsoroitu tai itsensä mainostusta"},"yearAbbreviation":{"message":"v","description":"100y"},"dayAbbreviation":{"message":"vrk","description":"100d"},"hourAbbreviation":{"message":"t","description":"100h"},"optionsTabBehavior":{"message":"Käyttäytyminen","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Käyttöliittymä","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Pikanäppäimet","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Varmuuskopioi/palauta","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Sekalaiset","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Ohitusilmoituksen ulkoasu","description":"Option label"},"unbind":{"message":"Poista liitos","description":"Unbind keyboard shortcut"},"notSet":{"message":"Ei määritetty"},"change":{"message":"Vaihda"},"youtubeKeybindWarning":{"message":"Tämä on YouTuben sisäänrakennettu pikanäppäin. Haluatko varmasti käyttää sitä?"},"betaServerWarning":{"message":"BETA-palvelin on käytössä!"},"openOptionsPage":{"message":"Avaa asetussivu"},"resetToDefault":{"message":"Palauta oletusasetukset"},"confirmResetToDefault":{"message":"Haluatko varmasti palauttaa kaikki asetukset oletusarvoihin? Tätä ei voi perua."},"exportSegments":{"message":"Vie osiot"},"importSegments":{"message":"Tuo osiot"},"Import":{"message":"Tuo","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Lunastus onnistui!"},"redeemFailed":{"message":"Lisenssiavain on virheellinen"},"hideUpsells":{"message":"Piilota asetukset joita ei voi käyttää ilman lisämaksua"},"hideNewFeatureUpdates":{"message":"Piilota ilmoitukset uusista ominaisuuksista"},"redeem":{"message":"Lunasta"},"enterLicenseKey":{"message":"Syötä lisenssiavain"},"unsubmittedSegmentCounts":{"message":"Sinulla on tällä hetkellä {0} {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Sinulla ei ole lähettämättömiä osioita","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"lähettämätön osio","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"lähettämätöntä osiota","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"videossa","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videossa","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Tyhjennä kaikki osiot","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Haluatko varmasti tyhjentää kaikki lähettämättömät osiosi?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Näytä osiot","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Piilota osiot","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Videon ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Osiomäärä","description":"Header of the unsubmitted segments list"},"actions":{"message":"Toiminnot","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Jaa URL-osoitteena"},"segmentFetchFailureWarning":{"message":"Varoitus: Palvelin ei ole vielä toimittanut osiotietoja. Video saattaa sisältää jo lähetettyjä osioita, mutta et vain ole vielä vastaanottanut niitä palvelinongelmien takia."},"allowScrollingToEdit":{"message":"Salli aikojen muokkaaminen skrollaamalla"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Paremmat otsikot ja pienoiskuvat YouTubessa","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Käyttäjälähteinen otsikoiden ja pienoiskuvien vaihtaminen sensaatiomaisista mahdollisimman kuvaaviksi","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Valitse kuvailevin"},"Original":{"message":"Alkuperäinen"},"OriginalTitle":{"message":"Alkuperäinen otsikko"},"CurrentTime":{"message":"Tämänhetkinen aika"},"resetCustomTitle":{"message":"Palauta alkuperäisen otsikon teksti"},"resetIcon":{"message":"Palautuskuvake"},"TypeYourOwnTitleHere":{"message":"Kirjoita otsikkosi tähän"},"VideoNotReady":{"message":"Video ei ole valmis"},"FailedToRender":{"message":"Renderöinti epäonnistui","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas-elementti puuttuu","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Poikkeus pienoiskuvan renderöinnissä","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Lataus epäonnistui","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Otsikon muotoilu"},"Disabled":{"message":"Pois käytöstä"},"CapitalizeWords":{"message":"Käytä isoja alkukirjaimia"},"TitleCase":{"message":"Englanninkielisen otsikkotyylin kirjainkoko"},"SentenceCase":{"message":"Virketyylin kirjainkoko"},"LowerCase":{"message":"Pienet kirjaimet"},"FirstLetterUppercase":{"message":"Iso alkukirjain"},"shouldCleanEmojis":{"message":"Poista emojit"},"onlyFormatCustomTitles":{"message":"Muotoile vain käyttäjälähtöiset otsikot"},"onlyTitleCaseInEnglish":{"message":"Näytä englanninkielestä poikkeavien otsikoiden sanat isoilla alkukirjaimilla"},"onlyTitleCaseInEnglishDescription":{"message":"Kielen tunnistus ei ole täydellinen ja voi tunnistaa joitakin englanninkielisiä otsikoita eri kielisiksi."},"thumbnailFallbackOption":{"message":"Kun lähetettyä pienoiskuvaa ei ole"},"whatThumbnailFallbackOption":{"message":"Satunnaista kohtaa valittaessa, vältetään markkinointiosioiden valinta hyödyntämällä SponsorBlockin tietoja.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Näytä kuvakaappaus satunnaisesta kohdasta"},"TheOriginalThumbnail":{"message":"Näytä alkuperäinen pienoiskuva"},"showABlankBox":{"message":"Näytä tyhjä laatikko"},"AutoGenerated":{"message":"Näytä YouTuben luoma pienoiskuva","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Alusta"},"Middle":{"message":"Keskeltä"},"keepUnsubmitted":{"message":"Talleta lähetetyt äänet"},"showLiveCover":{"message":"Näytä kanavan kuvake tulevissa videoissa","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Älä käytä A/B-testattuja pienoiskuvia koskaan"},"ignoreAbThumbnailsDescription":{"message":"Kanavat voivat määrittää videoilleen testejä, joissa YouTube näyttää eri pienoiskuvat jokaiselle henkilölle. Tämä vaihtoehto käyttää yhtenäisyyden säilyttämiseksi aina ensimmäistä pienoiskuvaa."},"abThumbnailsWarning":{"message":"Varoitus: Videolle suoritetaan parhaillaan pienoiskuvien A/B-testausta, jonka vuoksi pienoiskuva voi vaihtua usein. Tämän riskitekijän vuoksi sinun ei todennäköisesti kannata äänestää alkuperäistä pienoiskuvaa."},"whatKeepUnsubmitted":{"message":"Pidä lähetetyt äänet äänestyksen jälkeen näyttääksesi valitsemasi otsikot ja pienoiskuvat palvelimella olevien eniten äänestettyjen sijaan."},"keepUnsubmittedInPrivate":{"message":"Tallenna lähetetyt äänet yksityisiltä välilehdiltä"},"useThumbnailGenerationService":{"message":"Käytä pienoiskuvien luontipalvelua"},"titleMaxLines":{"message":"Otsikoiden enimmäisrivimäärä"},"titleMaxLinesDescription":{"message":"Videoiden otsikot jakautuvat ehdotuksissa tässä määritetylle rivimäärälle."},"thumbnailSaturationLevel":{"message":"Pienoiskuvan kylläisyyden taso"},"whatSaturateThumbnails":{"message":"Tee pienoiskuvista vähemmän värikkäitä vähentämällä niiden väriä"},"hideDetailsWhileFetching":{"message":"Piilota tiedot noudettaessa"},"hideDetailsWhileFetchingDescription":{"message":"Piilota otsikot ja pienoiskuvat kun tietoja haetaan palvelimelta. Jos poistettu käytöstä, koet vilkkumista, kun otsikot ja pienoiskuvat vaihtuvat."},"ignoreTranslatedTitles":{"message":"Älä näytä YouTuben käännettyjä otsikoita","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube joskus kääntää otsikot automaattisesti äidinkielellesi. Tämä asetus pätee vain, kun käyttäjälähteistä otsikkoa ei ole saatavilla."},"onAllPages":{"message":"Kaikilla sivuilla","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Kaikilla paitsi videosivuilla","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Ei koskaan"},"thumbnailGeneratorDescription1":{"message":"Pienoiskuvien luontipalvelu nopeuttaa pienoiskuvien luontia merkittävästi lähettämällä videon ID:n etäpalvelimelle anonyymisti. Tällöin luodaan joko uusi pienoiskuva tai noudetaan aiemmin luotu kuva välimuistista."},"thumbnailGeneratorDescription2":{"message":"Videosivuilla käytettäessä tämä voi vuotaa listaamattomia video ID:itä palvelimelle. Ongelma voidaan välttää valitsemalla asetukseksi \"Kaikilla paitsi videosivuilla\" tai vaihtoehtoisesti voit ylläpitää omaa pienoiskuvien luontipalvelua."},"thumbnailGeneratorDescription3":{"message":"Jos pienoiskuvien luotipalvelua ei käytetä, käytetään kaikille pyynnöille k-anonymiteetti-pohjaista kyselyjärjestelmää, jolloin palvelimen on vaikeampaa ennakoida noudettuja videoita. Tällöin käytetään myös hitaampaa paikallista pienoiskuvien luontipalvelua.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Pienoiskuvien luontipalvelun lähdekoodi"},"moreAboutKAnonymity":{"message":"Lisätietoa K-anonymiteetistä","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Näytä \"Näytä Alkuperäinen\" -painike aina"},"whatAlwaysShowShowOriginalButton":{"message":"Käytä tätä, jos haluat aina tietää, onko otsikko tai pienoiskuva muuttunut."},"showOriginalOnHover":{"message":"Vaihda muokattujen ja alkuperäisten tietojen välillä osoitettaessa"},"showCustomOnHoverIfCasual":{"message":"Näytä mukautettu otsikko osoitettaessa, jos kasuaalitilan otsikko näytetään"},"showIconForFormattedTitles":{"message":"Näytä automaattisesti muotoilluille otsikoille \"Näytä alkuperäinen\" -painike"},"Enable":{"message":"Ota käyttöön"},"Titles":{"message":"Otsikot","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Pienoiskuvat","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Kasuaaliset äänet","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Virhe"},"ShowOriginal":{"message":"Näytä alkuperäiset tiedot"},"ShowModified":{"message":"Näytä muokatut tiedot"},"ShowFormatted":{"message":"Näytä muotoillut tiedot"},"FillerWarning":{"message":"Varoitus: Tämä on erittäin agressiivinen kategoria ja on hyvin todennäköistä, että joudut joskus perumaan ohituksia tai poistamaan sen käytöstä. Huomioithan, että monista videoista saatetaan ohittaa yli 50 %! Muista myös seurata lähetyssääntöjä.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Liity Discordiin tai Matrixiin pysyäksesi tässä chatissa pysyvästi","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Näytä sääntöjen ohjeet","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Vältä ylikorostettuja kasvojen ilmeitä","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Ajattele kokonaisuutta, äläkä vain vastaa alkuperäisen otsikon kysymykseen","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Vältä videon reaktioiden kuvausta (\"järkyttävä\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Tarjoa tietoisen valinnan mahdollistava määrä informaatiota ennen klikkausta"},"tip5":{"message":"Isot kirjaimet lauseen tapaan ","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Tarkista kaikki säännöt lähettääksesi","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Otsikkoni on kirjoitettu kuin virke","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Otsikkoni ei vain vastaa otsikossa esitettyyn kysymykseen","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Otsikoiden pitäisi kuvailla videota, tai tarinaa ylipäätään. Sinun pitää katsoa koko video tietääksesi, mistä siinä oikeastaan ​​on kyse, sen sijaan että luotat kiehtovaan alkuperäiseen otsikkoon.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Otsikkoni ei ole yhteenveto päätelmästä tai aiheettomasti spoilaa","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Otsikot eivät ole tarkoitettu korvaamaan koko videon katselua, vaan ne on tarkoitettu sitä varten, jotta tietäisit, pitäisikö sinun klikata vai ei.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Otsikkoni ei tarkista faktoja, pilkkaa, tai kritisoi videota tai sen luojaa","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Otsikot on tarkoitettu olemaan luojan ja videon näkökulmasta. Videon luokittelu tai faktojen tarkistaminen on DeArrowin toiminnan ulkopuolella. Otsikot eivät ole tarkoitettu kommenttiosiona.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Havaittu sana: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Älä aloita otsikoita tarpeettomilla verbeillä","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Aloita kaikki otsikot isolla kirjaimella. Otsikot tulee muotoilla lauseiden tapaan","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Otsikot eivät saa päättyä '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Älä vain vasta alkuperäisen otsikon kysymykseen. Otsikon tulee kuvata videota tai tarinaa yleisesti","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Otsikoiden ei tule korjata videon faktoja, eikä pilkata tai kritisoida sitä tai sen sen tekijää","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Otsikoiden ei tule säilyttää alkuperäisen otsikon sensaatiomaisia elementtejä","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Otsikoiden ei tule sisältää emojeita","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Varoituksen aiheuttaja on korjattava ennen lähetystä"},"dearrowHelpSponsorBlockImported":{"message":"Huomioi: SponsorBlock-asetuksesi on tuotu automaattisesti!"},"howItWorks":{"message":"Näin se toimii"},"discordPromotion":{"message":"Liity mukaan, tee ehdotuksia ja auta {discord} tai {matrix} alustoilla"},"deArrowDonationText":{"message":"Jos pidät tähän mennessä tekemästäni ja haluat tukea minua rahallisesti, tässä linkki"},"termsAgreement":{"message":"Käyttämällä laajennusta hyväksyt seuraavat: {privacy-policy} ja {terms}"},"privacyPolicy":{"message":"Tietosuojakäytäntö"},"termsOfUse":{"message":"Käyttöehdot"},"openSourceLicenses":{"message":"Avoimen lähdekoodin lisenssit"},"defaultToOriginals":{"message":"Käytä oletusarvoisesti videoiden alkuperäisiä tietoja"},"whatDefaultToOriginals":{"message":"Näytä oletusarvoisesti alkuperäinen otsikko ja pienoiskuva, mutta myös hiirellä osoitettaessa ilmestyvä painike mukautettujen otsikoiden ja pienoiskuvien näyttöön."},"replaceTitles":{"message":"Korvaa otsikot"},"replaceThumbnails":{"message":"Korvaa pienoiskuvat"},"useCrowdsourcedTitles":{"message":"Käytä käyttäjälähteisiä otsikoita"},"whatUseCrowdsourcedTitles":{"message":"Jos ei käytössä, muotoilee otsikot, muttei käytä yhteisön lähettämiä otsikoita.","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Haluatko varmasti poistaa tämän määrityksen?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Uusi määritys"},"DeleteConfiguration":{"message":"Poista määritys"},"ChannelAllowlist":{"message":"Kanavakohtaiset asetukset"},"ConfigurationName":{"message":"Määrityksen nimi"},"ChannelListInstructions":{"message":"Syötä alla olevaan ruutuun omille riveilleen kanavat, joille haluat käyttää tätä määritystä. Kanavien ID:t ja näyttönimet kelpaavat, mutta @-käyttäjätunnukseia eivät. Kanavan ID:n saat painamalla kanavan tietosivulla olevaa jakopainiketta ja tietosivulle pääset painamalla kanavasivulla kanavan nimen alla olevaa kuvausta.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Määrityksiä ei vielä ole luotu. Lisää uusi määritys painamalla yläreunassa olevaa painiketta.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Pysäytä clickbaitit korvaamalla otsikot ja pienoiskuvat tarkemmilla versioilla"},"DeArrowPromotionMessage2":{"message":"Kyllästynyt clickbaitteihin? Tutustu uuteen laajennukseeni, joka parantaa otsikoita ja pienoiskuvia"},"DeArrowPromotionMessage3":{"message":"Tutustu myös DeArrowiin","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Etkö pidä tästä otsikosta? Jos pidät alemmasta otsikosta enemmän, harkitse tutustumista DeArrown otsikkokorvaukseen.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Tämä pienoiskuva on valittu satunnaisesta kohdasta, koska videolle ei vielä ole lähetetty ilmoituksia","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Tämä pienoiskuva on valittu satunnaisesta kohdasta ja muotoiltu automaattisesti, koska videolle ei vielä ole lähetetty ilmoituksia","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Voit muuttaa oletusta alla","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"Laajennuksen asennuksen jälkeen on korvattu {titles} otsikkoa ja {thumbnails} pienoiskuvaa","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} otsikko ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} otsikkoa ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"ja {thumbnails} pienoiskuva","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"ja {thumbnails} pienoiskuvaa","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"Laajennuksen asennuksen jälkeen on korvattu {titleAndThumbnailMessage}","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Laske otsikoiden ja pienoiskuvien korvaukset"},"countReplacementsDescription":{"message":"Käytetään tilastojen näyttöön ponnahduksessa.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Estä kyselytutkimuksia, oheistuote- ja muita markkinointielementtejä lisäämällä yt-neuterin suodatinlista"},"requiresUblock":{"message":"Vaatii uBlock Originin"},"videoIDWrongWhenSubmittingError":{"message":"Jotain on pielessä videoID:n tunnistuksessa. Pyri varmistamaan, että pienoiskuva lähetetään oikealle videolle päivittämällä sivu ennen lähetystä. Jos tätä tapahtuu paljon, lähetä raportti GitHubiin, Discordiin, tai Matrixiin muista selainlaajennuksista ja userscripteistä, joita sinulla on asennettuna."},"dearrowLogoCredit":{"message":"Twemojiin pohjautuva logo CC-BY 4.0 -lisenssillä"},"zoomToFillUnsupported":{"message":"SponsorBlock ei ole yhteensopiva \"Zoom to Fill\" -laajennuksen kanssa. Voit sen sijaan käyttää monia muita ongelmitta toimivia laajennuksia."},"freeTrialStarted":{"message":"Ilmainen kokeilu on aloitettu. Testaa sitä käymällä YouTubessa."},"freeTrialEnded":{"message":"Ilmainen kokeilu on päättynyt"},"freeTrialPrompt":{"message":"Jos haluat testata sitä tunnin ajan, voit aloittaa ilmaisen kokeilun alla olevasta painikkeesta."},"startFreeTrial":{"message":"Aloita ilmainen kokeilu"},"freeAccessRequested":{"message":"Olet rekisteröitynyt ilmaiskäyttöä varten. Saat ilmoituksen kun ilmainen käyttöoikeus on myönnetty."},"freeAccessComplete":{"message":"Onnittelut! Sinulla on nyt DeArrown ilmainen käyttöoikeus"},"DeArrowNotActivated":{"message":"DeArrowta ei ole aktivoitu"},"ActivateDeArrow":{"message":"Aktivoi DeArrow"},"DeArrowIsActivated":{"message":"DeArrow on aktivoitu"},"Close":{"message":"Sulje"},"ViewLicenseKey":{"message":"Näytä lisenssiavaimesi"},"SharingIsCaring":{"message":"Jakaminen on välittämistä"},"cleanPopup":{"message":"Piilota ylimääräisyydet Osiolistan ponnahduksesta"},"hideSegmentCreationInPopup":{"message":"Piilota osion luontipainikkeet ponnahdusikkunassa"},"syncDisabledWarning":{"message":"Varoitus: Lisäosien tallennustila on poistettu käytöstä selaimestasi, eivätkä niiden asetukset sen vuoksi tallennu."},"syncDisabledWarningDeArrow":{"message":"DeArrow ei toimi ilman tallennustilaa."},"syncDisabledFirefoxSuggestions":{"message":"Voit ottaa sen käyttöön avaamalla about:config-sivun ja asettamalla \"webextension.storage.sync.enabled\"-asetuksen todeksi."},"storageFull":{"message":"Laajennuksen tallennustila on täynnä. Poista joitakin lähettämättömiä osioita asetuksista."},"previewSegmentRequired":{"message":"Esikatselethan osiosi ennen sen lähettämistä. Paina esikatsele painiketta tai käytä pikanäppäintä:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Toimi VIP käyttäjänä","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Lähetyksiä ei voida tällä hetkellä hyväksyä selaimestasi, koska YouTube näyttää sisällyttäneen videoon palvelinpuolen mainoksia, joita laajennus ei voi poistaa. Ota yhteyttä jos kohtaat tämän virheen."},"DeArrowIsDisabled":{"message":"Dearrow on pois päältä - klikkaa ottaaksesi käyttöön","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Oletko varma, että tämä alkuperäinen pienoiskuva seuraa DeArrowin sääntöjä? Jos haluat vain nähdä alkuperäisiä pienoiskuvia ylipäätään, harkitse \"Kun lähetettyä pienoiskuvaa ei ole\" asetuksen vaihtamista DeArrow asetuksissa.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"SponsorBlock ei ole yhteensopiva suorien lähetysten tai juuri nauhoitetun sisällön kanssa YouTube TV:ssä. Jos tämä on äskettäin nauhoitettu, odotathan muutaman tunnin, että nauhoituksen käsitelty versio tulee saataville.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Kanava valkolistaus ei ole tuettu tv.youtube.com-sivulla.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Pidätkö alkuperäisestä otsikosta?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Kyllä"},"No":{"message":"En"},"votes":{"message":"{0} ääntä","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} ääni","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Hauska","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Luova","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Nokkela","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Kuvaava","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Muu","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Perinteinen tila","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Otsikot korvataan vakiomuodoilla, perustuen yhteisölähtöisen otsikon sisältävien videoiden sääntöihin."},"CasualMode":{"message":"Kasuaalitila","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Säilytä alkuperäiset otsikot, kun ne kuvaavat videota riittävän hyvin ja ovat nokkelia tai hauskoja.\nValitse otsikkokateroriat, jotka haluat nähdä.\nVoit äänestää otsikoiden sopivuudesta kategorioihin."},"minimumVotes":{"message":"Äänten vähimmäismäärä","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Näytä kasuaalitilassa äänestettujen videoiden alkuperäiset pienoiskuvat","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Uusi ominaisuus: Kasuaalitila","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Näytä kasuaalitilan kuvake vain kun mukautettu otsikko on saatavilla"},"OpenSettings":{"message":"Avaa asetukset"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/fil/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/fil/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Connection Timeout. Suriin ang iyong koneksyon sa internet. Kung gumagana ang iyong internet, ang server ay nasa mataas na trapiko o down ang server."},"400":{"message":"Mali ang request mo sa server"},"409":{"message":"Naisumite na ito noon"},"fullName":{"message":"SponsorBlock para sa YouTube - I-skip ang mga Sponsorships","description":"Name of the extension."},"Description":{"message":"I-skip ang mga sponsorships, subscription begging at marami pa sa mga YouTube videos. I-report ang mga sponsor sa videos na napapanood mo upang makatipid sa oras ng iba.","description":"Description of the extension."},"channelWhitelisted":{"message":"Whitelisted na ang channel na ito!"},"Segment":{"message":"segment"},"Segments":{"message":"segments"},"SegmentsCap":{"message":"Mga segments"},"Chapters":{"message":"Mga chapters"},"upvoteButtonInfo":{"message":"I-upvote ang submission na ito"},"reportButtonTitle":{"message":"I-report"},"reportButtonInfo":{"message":"I-report ang submission na ito bilang mali."},"Dismiss":{"message":"I-dismiss"},"Loading":{"message":"Naglo-load..."},"Hide":{"message":"Hindi ipakita"},"hitGoBack":{"message":"Pindutin ang \"unskip\" para bumalik ka sa iyong dating posisyon sa video."},"unskip":{"message":"I-unskip"},"reskip":{"message":"I-reskip"},"unmute":{"message":"I-unmute"},"paused":{"message":"Naka-pause na"},"manualPaused":{"message":"Tigilan ang timer"},"confirmMSG":{"message":"Para sa pag-edit o tanggalin ng mga individual values, pindutin ang info button o ang extension icon sa kanang sulok sa itaas."},"clearThis":{"message":"Sigurado ka bang gusto mong tanggalin ito? \n\n"},"Unknown":{"message":"May error na nagkaroon sa pagsusumite sa iyong sponsor times, subukang muli mamaya."},"sponsorFound":{"message":"May mga segments sa database para sa video na ito!"},"sponsor404":{"message":"Walang nakitang segment"},"sponsorStart":{"message":"Simula ang Segment Ngayon"},"sponsorEnd":{"message":"Nagtatapos ang Segment Ngayon"},"sponsorCancel":{"message":"Kanselahin ang Paggawa ng Segment"},"noVideoID":{"message":"Walang YouTube video na nakita.\nKung mali ito, i-refresh ang tab mo."},"refreshSegments":{"message":"I-refresh ang mga segments"},"success":{"message":"Tagumpay na!"},"voted":{"message":"Bumoto na!"},"connectionError":{"message":"Nagkaroon ng error sa koneksyon. Error code: "},"segmentsStillLoading":{"message":"Naglo-load pa ang segment..."},"clearTimes":{"message":"I-clear ang mga segments"},"openPopup":{"message":"I-buksan ang SponsorBlock popup"},"closePopup":{"message":"Isara ang Popup"},"OpenSubmissionMenu":{"message":"Buksan ang Submission Menu"},"sortSegments":{"message":"I-sort yung segments"},"submitCheck":{"message":"Sigurado ka bang gusto mong isumite ito?"},"whitelistChannel":{"message":"I-whitelist itong channel"},"removeFromWhitelist":{"message":"Tanggalin yung channel sa whitelist"},"voteOnTime":{"message":"I-boto ang mga Segment"},"Submissions":{"message":"Mga submissions"},"savedPeopleFrom":{"message":"Na i-save mo ang mga tao mula sa "},"viewLeaderboard":{"message":"Mga leaderboard"},"recordTimesDescription":{"message":"I-submit"},"popupHint":{"message":"Hinto: Maaari kang mag-set up ng mga keybinds para i-pagsusumite sa options"},"Username":{"message":"Username"},"setUsername":{"message":"I-palit yung username"},"copyPublicID":{"message":"I-kopiya ng publikong UserID"},"copySegmentID":{"message":"I-kopiya ng Segment ID"},"hideThis":{"message":"Itago ito"},"Options":{"message":"Mga options"},"showButtons":{"message":"Ipakita ang Delete Button sa YouTube Player"},"showSkipButton":{"message":"Ipakita lagi ang Skip To Highlight Button Sa Player"},"showInfoButton":{"message":"Ipakita ang Info Button sa YouTube Player"},"showDeleteButton":{"message":"Ipakita ang Delete Button sa YouTube Player"},"enableTrackDownvotesInPrivate":{"message":"I-store sa mga na-downvote ng segments sa private/incognito tabs"},"showNotice":{"message":"Ipakita yung notice ulit"},"showUpcomingNotice":{"message":"Ipakita muna yung notice bago magsimula ang mga Segment"},"showCategoryGuidelines":{"message":"Ipakita ang mga kategorya"},"noticeVisibilityMode2":{"message":"Lahat ang mga maliit na skip notices"},"noticeVisibilityMode4":{"message":"Lahat ang mga na-liit ng skip notices"},"longDescription":{"message":"Hinahayaan ka ng SponsorBlock na laktawan ang mga sponsor, intro, outros, mga paalala sa subscription, at iba pang walang kwentang bahagi ng mga YouTube videos. Ang SponsorBlock ay isang crowdsourced browser extension na maaaring isumite ng sinuman ang ilang partikular na naka-sponsor na segment at iba pang mga segment ng mga video sa YouTube. Kapag ang isang tao ay nagsumite ng isang segment, lahat ng iba pang may ganitong extension ay lalaktawan sa ibabaw mismo ng naka-sponsor na segment. Maaari mo ring laktawan ang mga seksyong hindi musika ng mga music video.","description":"Full description of the extension on the store pages."},"website":{"message":"Website","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Ang Source Code","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Na-upgrade na ang notice!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Kung ayaw mo pa rin, pindutin ang never show button.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"I-skip yung segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"I-simula o I-tigil yung segment","description":"Keybind label"},"setSubmitKeybind":{"message":"I-submit ang mga segments","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"I-close yung skip notice","description":"Keybind label"},"nextChapterKeybind":{"message":"Susunood na chapter","description":"Keybind label"},"disableSkipping":{"message":"Naka-on ng mga I-skip"},"enableSkipping":{"message":"Naka-off ng mga I-skip"},"skip":{"message":"I-skip"},"mute":{"message":"I-mute"},"full":{"message":"Full Video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"I-skip yung {0}?"},"mute_category":{"message":"I-mute {0}?"},"skip_to_category":{"message":"I-skip sa {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Paparating na {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"Na I-skip ng {0}","description":"Example: Sponsor Skipped"},"muted":{"message":"Na I-mute ng {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Na I-skip sa {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Na-vote ng {0}","description":"Example: Voted on Sponsor"},"minLower":{"message":"minuto"},"minsLower":{"message":"minuto"},"hourLower":{"message":"oras"},"hoursLower":{"message":"oras"},"supportedSites":{"message":"Mga katugmang site: "},"add":{"message":"I-add"},"customServerAddress":{"message":"SponsorBlock Server Address"},"save":{"message":"I-save"},"reset":{"message":"I-reset"},"areYouSureReset":{"message":"Sigurado ka pag i-reset mo to?"},"mobileUpdateInfo":{"message":"May support sa m.youtube.com"},"exportOptionsCopy":{"message":"I-edit/kopiya"},"exportOptionsDownload":{"message":"I-save sa file"},"exportOptionsUpload":{"message":"I-load sa file"},"incorrectlyFormattedOptions":{"message":"Ang JSON ay hindi na-format nang maayos. Hindi nagbago ang iyong options."},"confirmNoticeTitle":{"message":"I-submit ang mga segment"},"submit":{"message":"I-submit"},"cancel":{"message":"Cancel"},"delete":{"message":"I-delete"},"preview":{"message":"I-preview"},"inspect":{"message":"I-inspect"},"edit":{"message":"I-edIt"},"to":{"message":"sa","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Nakopya!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"category_sponsor":{"message":"Sponsor"},"category_selfpromo":{"message":"'Di bayad/Pang-sariling promosyon"},"category_selfpromo_description":{"message":"Katulad ng \"sponsor\" kategorya, maliban sa hindi bayad o napag-promote sa sarili. May kasamang mga seksyon tungkol sa merchandise, mga donasyon, o tungkol sa kung kanino sila nag-collab."},"category_selfpromo_guideline1":{"message":"Mga donasyon, membership, at custom merch"},"category_exclusive_access":{"message":"Exclusive Access"},"category_exclusive_access_description":{"message":"Para lang sa pag-label ng buong video. Ginagamit kapag ang isang video ay nagpapakita ng isang produkto, serbisyo, o lokasyon na natanggap nila nang libre o may suportang pinansyal."},"category_exclusive_access_pill":{"message":"Itong video na ito ay yung produkto, serbisyo o lokasyon kung saan sila nakatanggap ng libre o may subsidized na access","description":"Short description for this category"},"category_interaction":{"message":"Paalala sa interaksyon (Subscribe)"},"category_interaction_description":{"message":"Kapag may paalala na mag-like, mag-subscribe o sundan sila sa gitna ng content. Kung ito ay mahaba o tungkol sa isang partikular na bagay, dapat itong lagyan ng label sa ilalim ng \"sariling promosyon\" sa halip."},"category_intro_short":{"message":"Intermisyon"},"category_outro":{"message":"Endcard/Kredito"},"category_poi_highlight":{"message":"Highlight"},"category_chapter":{"message":"Mga chapters"},"autoSkip":{"message":"I-auto skip"},"disable":{"message":"I-disable"},"showOverlay_full":{"message":"I-show ang mga label"},"category":{"message":"Kategorya"},"enableTestingServer":{"message":"I-enable yung beta testing server"},"bracketNow":{"message":"(Ngayon)"},"chooseACategory":{"message":"Pumili ng kategorya"},"incorrectVote":{"message":"Mali"},"guidelines":{"message":"Mga Guidelines"},"readTheGuidelines":{"message":"Basain mo yung Guidelines muna!!","description":"Show the first time they submit or if they are \"high risk\""},"help":{"message":"Tulong"},"GotIt":{"message":"Okay","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Ang laki yung segment ito. Kung ang buong video ay tungkol sa isang paksa, pagkatapos ay baguhin mula sa \"I-skip\" patungo sa \"Buong Video\". Tingnan ang mga guidelines para sa higit pang impormasyon."},"questionButton":{"message":"May tanong ako"},"Donate":{"message":"Mag-donate"},"helpPageThanksForInstalling":{"message":"Salamat sa pag-iinstall ng SponsorBlock."},"Credits":{"message":"Mga credits"},"hideSegment":{"message":"Itago itong segment"},"skipSegment":{"message":"I-skip itong segment"},"playChapter":{"message":"I-play na chapter"},"youtubeKeybindWarning":{"message":"Ito ay isang built-in na YouTube shortcut. Sigurado ka bang gusto mong gamitin ang keybind na ito?"},"betaServerWarning":{"message":"Na-ienable yung BETA server!"},"redeem":{"message":"I-redeem"},"unsubmittedSegmentCounts":{"message":"Kasalukuyan kang mayroong {0} sa {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"ng mga videos","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"I-clear lahat ng segments","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Sigurado ka na i-clear lahat ng mga segments na hindi mo pa na i-submit?","description":"Confirmation message for the Clear unsubmitted segments button"},"hideUnsubmittedSegments":{"message":"Itago ng mga segments","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video ID","description":"Header of the unsubmitted segments list"},"segmentFetchFailureWarning":{"message":"Babala: Ang server ay hindi pa tumutugon sa anumang segment. Maaaring mayroon talagang mga segment sa video na ito na naisumite na ngunit hindi mo pa lang natatanggap ang mga ito dahil sa mga isyu sa server."},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"shouldCleanEmojis":{"message":"I-tangal ng mga emojis"},"DeArrowEndWithPeriodWarning":{"message":"Mga titles ay hindi dapat magtapos sa isang tuldok ('.')","description":"A DeArrow automatic warning"},"openSourceLicenses":{"message":"Mga Open Source licensya"},"replaceTitles":{"message":"Palitan ng mga Titles"},"replaceThumbnails":{"message":"Palitan ng mga Thumbnails"},"NewConfiguration":{"message":"Bagong configurasyon"},"DeArrowPromotionMessage3":{"message":"Tingnan din ang DeArrow","description":"DeArrow is the name of the extension"},"dearrowStatsMessage2":{"message":"Ang {titleAndThumbnailMessage} ay napalitan mula noong na-install mo ang extension na ito","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"requiresUblock":{"message":"I-require ng uBlock Origin"},"freeTrialStarted":{"message":"Nagsimula na yung free trial mo. Subukan mo sa YouTube"},"freeAccessComplete":{"message":"Congrats! Mayroon kang free access sa DeArrow"},"DeArrowIsActivated":{"message":"Na deactivate na yung DeArrow"},"Close":{"message":"I-close"},"syncDisabledWarningDeArrow":{"message":"Hindi gagana ang DeArrow kapang walang storage."},"actAsVip":{"message":"Kumilos bilang VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/fr/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/fr/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Délai de connexion dépassé. Vérifiez votre connexion internet. Si votre connexion internet fonctionne, le serveur est probablement surchargé ou hors service."},"400":{"message":"Le serveur indique que cette requête est invalide"},"409":{"message":"Ce segment a déjà été soumis auparavant"},"502":{"message":"Le serveur semble être surchargé. Réessayez dans quelques secondes."},"fullName":{"message":"SponsorBlock pour YouTube - Supprime les publicités intégrées","description":"Name of the extension."},"Description":{"message":"Ignorez les sponsors, les rappels d'interaction et plus encore sur les vidéos YouTube. Signalez les sponsors sur les vidéos que vous regardez pour sauver le temps des autres.","description":"Description of the extension."},"channelWhitelisted":{"message":"Chaîne mise sur liste blanche !"},"Segment":{"message":"segment"},"Segments":{"message":"segments"},"SegmentsCap":{"message":"Segments"},"Chapters":{"message":"Chapitres"},"renderAsChapters":{"message":"Afficher les segments sous la forme de chapitres","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Afficher le segment actuel à côté de la durée de la vidéo"},"showAutogeneratedChapters":{"message":"Afficher les chapitres générés automatiquement par YouTube"},"upvoteButtonInfo":{"message":"Voter pour cette soumission"},"reportButtonTitle":{"message":"Signaler"},"reportButtonInfo":{"message":"Signaler que cette soumission est incorrecte."},"Dismiss":{"message":"Fermer"},"Loading":{"message":"Chargement..."},"Hide":{"message":"Ne plus montrer"},"hitGoBack":{"message":"Cliquez sur revenir en arrière pour revenir avant le saut du segment commercial."},"unskip":{"message":"Revenir en arrière"},"reskip":{"message":"Passer"},"unmute":{"message":"Réactiver le son"},"paused":{"message":"En pause"},"manualPaused":{"message":"Minuteur arrêté"},"confirmMSG":{"message":"Pour modifier ou supprimer des soumissions, cliquez sur le bouton d'information ou ouvrez la fenêtre de l'extension en cliquant sur son icône dans le coin en haut à droite."},"clearThis":{"message":"Êtes-vous certain-e de vouloir supprimer ceci ?\n\n"},"Unknown":{"message":"Une erreur s'est produite lors de la soumission, veuillez réessayer plus tard."},"sponsorFound":{"message":"Cette vidéo a des segments dans la base de données !"},"sponsor404":{"message":"Aucun segment trouvé"},"sponsorStart":{"message":"Début du segment"},"sponsorEnd":{"message":"Fin du segment"},"sponsorCancel":{"message":"Annuler la création du segment"},"noVideoID":{"message":"Aucune vidéo YouTube trouvée.\nActualisez l'onglet s'il s'agit d'une erreur."},"refreshSegments":{"message":"Actualiser les segments"},"success":{"message":"Succès !"},"voted":{"message":"A voté !"},"serverDown":{"message":"Il semblerait que le serveur soit hors service. Contactez le développeur."},"connectionError":{"message":"Erreur de connexion. Code d'erreur : "},"segmentsStillLoading":{"message":"Segments toujours en cours de chargement..."},"clearTimes":{"message":"Effacer les segments"},"openPopup":{"message":"Ouvrir l'encart SponsorBlock"},"closePopup":{"message":"Fermer l'encart"},"closeIcon":{"message":"Icône \"Fermer\""},"OpenSubmissionMenu":{"message":"Ouvrir le menu Contribution"},"OpenCasualVoteMenu":{"message":"Ouvrir le menu du mode relaxé"},"sortSegments":{"message":"Trier les segments"},"submitCheck":{"message":"Êtes-vous sûr de vouloir soumettre ces segments ?"},"whitelistChannel":{"message":"Ajouter la chaîne à la liste blanche"},"removeFromWhitelist":{"message":"Retirer la chaîne de la liste blanche"},"voteOnTime":{"message":"Voter pour un segment"},"Submissions":{"message":"Soumissions"},"savedPeopleFrom":{"message":"Vous avez sauvé les utilisateurs de "},"viewLeaderboard":{"message":"Classement"},"recordTimesDescription":{"message":"Soumettre"},"submissionEditHint":{"message":"Le menu d'édition du segment apparaîtra après que vous ayez cliqué sur envoyer","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Astuce : vous pouvez configurer les raccourcis clavier de l'extension dans les options"},"clearTimesButton":{"message":"Supprimer les temps"},"Username":{"message":"Pseudo"},"setUsername":{"message":"Choisir un pseudonyme"},"copyPublicID":{"message":"Copier le UserID"},"copySegmentID":{"message":"Copier l'identifiant du segment"},"loopChapter":{"message":"Lire le chapitre en boucle"},"unloopChapter":{"message":"Ne plus lire le chapitre en boucle"},"hideThis":{"message":"Cacher"},"Options":{"message":"Options"},"showButtons":{"message":"Afficher les boutons sur le lecteur YouTube"},"hideButtonsDescription":{"message":"Ceci enlève du lecteur YouTube les boutons permettant de soumettre des segments."},"showSkipButton":{"message":"Conserver le bouton du lecteur Aller au temps fort"},"showInfoButton":{"message":"Montrer le bouton Info sur le lecteur YouTube"},"autoHideInfoButton":{"message":"Masquer automatiquement le bouton Info"},"showDeleteButton":{"message":"Montrer le bouton Supprimer sur le lecteur YouTube"},"enableViewTracking":{"message":"Activer le suivi du nombre de sauts de segments"},"whatViewTracking":{"message":"Cette fonctionnalité enregistre les segments que vous avez sautés afin d'informer leur auteur à quel point leur soumission a été utile. Elle est aussi utilisée en complément des votes positifs pour empêcher la soumission de spams dans la base de données. SponsorBlock envoie un message au serveur à chaque fois que vous passez un segment. Nous espérons que la plupart des utilisateurs ne modifieront pas ce paramètre afin de conserver des statistiques aussi représentatives que possible. :)"},"enableViewTrackingInPrivate":{"message":"Activer le décompte du nombre de segments sautés dans les onglets de navigation privée/incognito"},"enableTrackDownvotes":{"message":"Enregistrer les segments votés négativement"},"whatTrackDownvotes":{"message":"Tous les segments votés négativement resteront cachés même après rafraîchissement de la page"},"trackDownvotesWarning":{"message":"Attention : Désactiver ceci supprimera tous les contre-votes précédemment enregistrés"},"enableTrackDownvotesInPrivate":{"message":"Stocker les votes contre envoyés dans les onglets de navigation privée"},"enableQueryByHashPrefix":{"message":"Requête par préfixe du hash"},"whatQueryByHashPrefix":{"message":"Plutôt que de récupérer depuis le serveur les segments à sauter à l'aide de l'identifiant de la vidéo, les 4 premiers caractères du hash de l'identifiant de la vidéo sont envoyés. Le serveur renverra les données pour toutes les vidéos ayant des hash similaires."},"enableShowCategoryWithoutPermission":{"message":"Afficher les catégories dans le menu des contributions, même celles sans autorisation"},"whatShowCategoryWithoutPermission":{"message":"Certaines catégories nécessitent une autorisation en raison d'exigences minimales de réputation"},"showNotice":{"message":"Afficher à nouveau la notification"},"showSkipNotice":{"message":"Notifier après qu'un segment a été sauté"},"showUpcomingNotice":{"message":"Afficher un message avant le début d'un segment"},"showCategoryGuidelines":{"message":"Afficher l'aide de la catégorie"},"noticeVisibilityMode0":{"message":"Cacher les notifications en mode plein écran"},"noticeVisibilityMode1":{"message":"Petite notification lors du passage automatique"},"noticeVisibilityMode2":{"message":"Réduire toutes les notifications de saut"},"noticeVisibilityMode3":{"message":"Notifications estompées lors du passage automatique"},"noticeVisibilityMode4":{"message":"Estomper toutes les notifications de saut"},"longDescription":{"message":"SponsorBlock vous permet de passer les messages sponsorisés, les introductions, les postfaces, les rappels d'abonnement et autres passages ennuyeux des vidéos YouTube. SponsorBlock est une extension de navigateur web qui permet à tout le monde de soumettre les temps de début et de fin des passages sponsorisés et d'autres segments de vidéos YouTube. Dès que quelqu'un-e soumet ces informations, toutes les autres personnes possédant l'extension passeront directement les segments sponsorisés. Vous pouvez également sauter les sections non musicales des vidéos musicales.","description":"Full description of the extension on the store pages."},"website":{"message":"Site web","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Code source","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"La notification a été mise à jour !","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Si elle ne vous plaît pas, cliquez sur le bouton \"Ne plus montrer\".","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Passer le segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Commencer/arrêter le segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Ouvrir le menu de contribution","description":"Keybind label"},"setSubmitKeybind":{"message":"Soumettre les segments","description":"Keybind label"},"setPreviewKeybind":{"message":"Aperçu du segment","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Fermer l'alerte de saut","description":"Keybind label"},"setDownvoteKeybind":{"message":"Voter contre un segment","description":"Keybind label"},"setUpvoteKeybind":{"message":"Voter pour un segment","description":"Keybind label"},"nextChapterKeybind":{"message":"Chapitre suivant","description":"Keybind label"},"previousChapterKeybind":{"message":"Chapitre précédent","description":"Keybind label"},"enableDeArrowKey":{"message":"Activer/Désactiver DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Ouvrir le menu de contribution","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Sélectionnez une touche en utilisant le clavier et choisissez les touches de modification que vous souhaitez utiliser."},"disableSkipping":{"message":"Saut automatique activé"},"enableSkipping":{"message":"Saut automatique désactivé"},"yourWork":{"message":"Votre travail","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Code d'erreur : "},"skip":{"message":"Passer"},"mute":{"message":"Couper le son"},"full":{"message":"Vidéo entière","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Passer {0} ?"},"mute_category":{"message":"Mettre en sourdine {0} ?"},"skip_to_category":{"message":"Passer à {0} ?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"{0} à venir","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} ignoré","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} mis en sourdine","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Sauté à {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"A voté sur {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Désactiver le passage automatique"},"enableAutoSkip":{"message":"Activer le passage automatique"},"audioNotification":{"message":"Notification audio lors du passage"},"audioNotificationDescription":{"message":"Une notification audio sera jouée chaque fois qu'un segment sera passé. Si désactivé (ou si le passage automatique est désactivé), aucun son ne sera joué."},"showTimeWithSkips":{"message":"Afficher la durée en supprimant les segments"},"showTimeWithSkipsDescription":{"message":"Cette durée apparaît entre crochets à côté de la durée actuelle, sous la barre de défilement. Il s'agit de la durée totale de la vidéo après déduction de tous les segments. Les segments marqués comme étant uniquement à \"Afficher dans la barre de recherche\" sont inclus dans le calcul."},"youHaveSkipped":{"message":"Vous avez passé "},"minLower":{"message":"minute"},"minsLower":{"message":"minutes"},"hourLower":{"message":"heure"},"hoursLower":{"message":"heures"},"youHaveSavedTime":{"message":"Vous avez sauvé les autres de","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" de leurs vies","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Consultez status.sponsor.ajay.app pour connaître le statut du serveur."},"changeUserID":{"message":"Importer/Exporter Votre ID privé d'utilisateur"},"whatChangeUserID":{"message":"Cela doit rester privé. Il s'agit d'un mot de passe qui ne doit être communiqué à personne. Si quelqu’un l'a, il peut usurper votre identité. Si vous cherchez votre identifiant public, cliquez sur l'icône presse-papiers dans l'encart."},"setUserID":{"message":"Définir l'ID privé d'utilisateur"},"userIDChangeWarning":{"message":"Avertissement : La modification de l'ID privé d'utilisateur est permanente. Êtes-vous sûr de vouloir faire ça ? Assurez-vous de sauvegarder l'ancien au cas où."},"createdBy":{"message":"Créé par"},"supportOtherSites":{"message":"Support de sites tiers YouTube"},"supportOtherSitesDescription":{"message":"Soutenez les clients tiers pour YouTube. Pour activer le soutien, vous devez accepter les autorisations supplémentaires.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Sites pris en charge : "},"optionsInfo":{"message":"Activer Invidious, désactiver le passage automatique, masquer les boutons et plus encore."},"addInvidiousInstance":{"message":"Ajouter une instance de client tiers"},"addInvidiousInstanceDescription":{"message":"Ajouter une instance personnalisée. Contient UNIQUEMENT son nom de domaine. Par exemple : invidious.ajay.app"},"add":{"message":"Ajouter"},"addInvidiousInstanceError":{"message":"Ce domaine n'est pas valide. Vérifiez que vous avez UNIQUEMENT noté le nom de domaine. Par exemple : invidious.ajay.app"},"resetInvidiousInstance":{"message":"Réinitialiser la liste d'instances Invidious"},"resetInvidiousInstanceAlert":{"message":"Vous êtes sur le point de réinitialiser la liste des instances Invidious"},"invidiousDisabledSafari":{"message":"La prise en charge d'Invidious n'est actuellement pas disponible sur Safari en raison d'un bug dans Safari. Une fois le bug corrigé par Apple, elle sera réintégrée."},"currentInstances":{"message":"Instances actuelles :"},"minDuration":{"message":"Durée minimale (en secondes) :"},"minDurationDescription":{"message":"Les segments plus courts que la valeur fixée ne seront pas sautés ni affichés dans le lecteur."},"enableManualSkipOnFullVideo":{"message":"Utiliser le saut manuel quand une étiquette vidéo complète existe"},"whatManualSkipOnFullVideo":{"message":"Pour les personnes qui veulent regarder la vidéo sans interruptions si elle est complétement sponsorisée ou auto-promu."},"skipNoticeDuration":{"message":"Durée de l'affichage de la notification de saut de segment (en secondes) :"},"skipNoticeDurationDescription":{"message":"La notification du passage restera à l'écran pendant au moins le temps défini. Pour passer manuellement un segment, il est possible qu'il reste visible plus longtemps."},"shortCheck":{"message":"Le segment suivant est plus court que votre option de durée minimale. Cela pourrait signifier qu'il a déjà été soumis et est simplement ignoré à cause de cette option. Êtes-vous sûr de vouloir soumettre ce segment ?"},"liveOrPremiere":{"message":"La soumission de segments sur un direct en cours ou une première n'est pas autorisée. Veuillez attendre qu'il soit terminé puis actualisez la page et vérifiez que les segments sont toujours valides."},"showUploadButton":{"message":"Afficher le bouton de téléversement"},"customServerAddress":{"message":"Adresse du serveur SponsorBlock"},"customServerAddressDescription":{"message":"L'adresse que SponsorBlock utilise pour faire des appels au serveur.\nCe réglage ne doit pas être modifié à moins que vous hébergiez votre propre instance."},"dataFetchingServerAddress":{"message":"Adresse du Serveur de Collecte des Données"},"dataFetchingServerAddressDescription":{"message":"L'adresse utilisée pour accéder au serveur de collecte de données.\nCette adresse ne doit pas être modifiée, sauf si vous possédez votre propre instance de serveur."},"thumbnailCacheServerAddress":{"message":"Adresse du serveur de cache des miniatures"},"save":{"message":"Sauvegarder"},"reset":{"message":"Réinitialiser"},"customAddressError":{"message":"Le format de l'adresse est incorrect. Assurez-vous qu'elle commence bien par http:// ou https:// et ne termine pas par un slash."},"areYouSureReset":{"message":"Voulez-vous vraiment réinitialiser ?"},"mobileUpdateInfo":{"message":"m.youtube.com est maintenant pris en charge"},"exportOptions":{"message":"Importer/Exporter toutes les options"},"exportOtherData":{"message":"Importer/Exporter toutes les autres données"},"exportOptionsCopy":{"message":"Modifier/copier"},"exportOptionsDownload":{"message":"Enregistrer dans un fichier"},"exportOptionsUpload":{"message":"Charger à partir du fichier"},"whatExportOptions":{"message":"Contient toute votre configuration au format JSON. Inclut votre ID privé d'utilisateur, donc ne le partagez pas."},"setOptions":{"message":"Définir les options"},"exportOptionsWarning":{"message":"Attention : La modification des options est définitive et peut rendre instable voire planter votre installation. Êtes-vous sûr de vouloir faire ça ? Faites une sauvegarde de votre ancienne configuration au cas où."},"incorrectlyFormattedOptions":{"message":"Ce fichier JSON n'est pas formaté correctement. Vos options n'ont pas été modifiées."},"confirmNoticeTitle":{"message":"Soumettre le segment"},"submit":{"message":"Soumettre"},"cancel":{"message":"Annuler"},"delete":{"message":"Supprimer"},"preview":{"message":"Aperçu"},"unsubmitted":{"message":"Non soumis"},"inspect":{"message":"Inspecter"},"edit":{"message":"Éditer"},"copyDebugLogs":{"message":"Copier les journaux de débogage"},"copyDebugInformation":{"message":"Copier les informations de débogage dans le presse-papiers"},"copyDebugInformationFailed":{"message":"Impossible de copier dans le presse-papiers"},"copyDebugInformationOptions":{"message":"Copie les informations dans le presse-papiers de manière à les fournir à l'équipe de développement dans un rapport de bug ou si on vous le demande. Les informations personnelles telles que le UserID privé, les chaînes sur liste blanche ou l'adresse du serveur personnalisé sont retirées des données copiées. Cependant, des informations telles que votre user-agent, votre navigateur web, votre système d'exploitation ou le numéro de version d'extension de SponsorBlock font partie des données copiées. "},"copyDebugInformationComplete":{"message":"Les informations de débogage ont été copiées dans le presse-papiers. N'hésitez pas à supprimer toute information que vous ne souhaitez pas partager. Enregistrez-les dans un fichier texte ou collez-les dans le rapport de bug."},"keyAlreadyUsed":{"message":"Ce raccourci est lié à une autre action. Veuillez en choisir un autre."},"to":{"message":"à","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Copié!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Inclure les transitions entre les segments"},"generic_guideline2":{"message":"Jouer comme si rien n'avait été passé"},"category_sponsor":{"message":"Message sponsorisé"},"category_sponsor_description":{"message":"Promotion rémunérée, parrainage rémunéré et publicité directe. Ne concerne pas l'autopromotion ou le partage gratuit de causes, créateurices, sites web ou produits appréciés."},"category_sponsor_guideline1":{"message":"Promotions rémunérées"},"category_sponsor_guideline2":{"message":"Pas pour les dons ou les produits dérivés"},"category_selfpromo":{"message":"Non rémunéré/autopromotion"},"category_selfpromo_description":{"message":"Catégorie similaire à Message sponsorisé, sauf qu'elle est destinée aux promotions non rémunérées et à l'autopromotion. Cela inclut les sections à propos des produits dérivés, des dons ou des personnalités invitées."},"category_selfpromo_guideline1":{"message":"Dons, abonnements (payant) et produits dérivés"},"category_selfpromo_guideline2":{"message":"Remerciements gratuits qui n'apportent aucune information à la vidéo"},"category_selfpromo_guideline3":{"message":"Pas pour des produits dérivés fait par des marques"},"category_exclusive_access":{"message":"Accès exclusif"},"category_exclusive_access_description":{"message":"Sert uniquement à étiqueter les vidéos entièrement sponsorisées. Utilisé quand une vidéo présente un produit, un service ou un emplacement pour lesquels un accès gratuit ou subventionné a été reçu."},"category_exclusive_access_pill":{"message":"Cette vidéo présente un produit, un service ou un lieu pour lequel un accès gratuit ou subventionné a été reçu","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Toute la vidéo présente quelque chose dont le créateur a eu un accès gratuit ou subventionné"},"category_interaction":{"message":"Rappel d'interaction (abonnement)"},"category_interaction_description":{"message":"Bref rappel d'aimer la vidéo ou de s'abonner à la chaîne au milieu de la vidéo. Si le message est long ou porte sur quelque chose de précis, classez plutôt le segment comme autopromotion."},"category_interaction_guideline1":{"message":"Rappels courts à like, s'abonner ou suivre"},"category_interaction_guideline2":{"message":"Inclut des rappels indirects à commenter"},"category_interaction_guideline3":{"message":"Pas pour la promotion générale, seulement les appels à l'interaction"},"category_interaction_short":{"message":"Rappel d'interaction"},"category_intro":{"message":"Entracte/Animation d'introduction"},"category_intro_description":{"message":"Un intervalle sans réel contenu, par exemple une pause, une image statique ou une animation répétitive. N'utilisez pas cette catégorie pour les transitions contenant de l'information."},"category_intro_short":{"message":"Entracte"},"category_intro_guideline1":{"message":"Intervalle sans contenu réel"},"category_intro_guideline2":{"message":"Pas pour les transitions avec des informations"},"category_outro":{"message":"Écrans de fin/Crédits"},"category_outro_description":{"message":"Crédits ou écran de fin YouTube. Pas pour les conclusions contenant des informations."},"category_outro_guideline1":{"message":"Ne dois pas inclure de contenu, même si les écrans de fin sont apparus"},"category_preview_description":{"message":"Collection de clips qui montrent ce qui se passe dans cette vidéo ou d'autres vidéos d'une série où toutes les informations sont répétées plus tard dans la vidéo."},"category_preview_guideline1":{"message":"Clips apparaissant plus tard ou dans une prochaine vidéo"},"category_preview_guideline2":{"message":"Récapitulatif d'une vidéo précédente"},"category_preview_guideline3":{"message":"Pas pour les sections qui ajoutent du contenu supplémentaire"},"category_filler":{"message":"Digressions/Blagues"},"category_filler_description":{"message":"Digressions ou blagues non nécessaires à la compréhension du contenu principal de la vidéo. Il ne devrait pas y avoir de segments fournissant du contexte ou des détails. Il s'agit d'une catégorie très agressive destinée aux moments où vous n'êtes pas d'humeur à vous amuser."},"category_filler_short":{"message":"Digressions"},"category_filler_guideline1":{"message":"Scènes de digression ou blagues"},"category_filler_guideline2":{"message":"Distractions, bêtisiers, replays"},"category_filler_guideline3":{"message":"Pas pour les scènes nécessaires à la compréhension du sujet"},"category_music_offtopic":{"message":"Musique : Segment non musical"},"category_music_offtopic_description":{"message":"A utiliser seulement dans les vidéos de musique. Doit être uniquement utilisé pour les sections qui ne sont pas couverte par une autre catégorie plus spécifique."},"category_music_offtopic_short":{"message":"Section non musicale"},"category_music_offtopic_guideline1":{"message":"Sections qui ne sont pas dans la musique officielle"},"category_music_offtopic_guideline2":{"message":"Pas de musique pendant les concerts en direct"},"category_poi_highlight":{"message":"Temps fort"},"category_poi_highlight_description":{"message":"La partie de la vidéo qui intéresse la majorité des spectateurs. Similaire aux commentaires du type « La vidéo commence à x minutes »."},"category_poi_highlight_guideline1":{"message":"Section qui intéresse la majorité des spectateurs"},"category_poi_highlight_guideline2":{"message":"Possibilité de passer le contexte"},"category_poi_highlight_guideline3":{"message":"Possibilité de passer au sujet dans le titre ou la miniature"},"category_chapter":{"message":"Chapitre"},"category_chapter_description":{"message":"Chapitres personnalisés décrivant les sections importantes d'une vidéo."},"category_chapter_guideline1":{"message":"Ne pas mentionner le nom du sponsor"},"category_chapter_guideline2":{"message":"Utiliser de grands chapitres pour les sections générales"},"category_chapter_guideline3":{"message":"Les chapitres plus petits peuvent être placés dans les plus grands"},"category_livestream_messages":{"message":"Stream : lecture de dons et messages"},"category_livestream_messages_short":{"message":"Lecture de messages"},"autoSkip":{"message":"Passer automatiquement"},"manualSkip":{"message":"Passer manuellement"},"showOverlay":{"message":"Afficher dans la barre de progression"},"disable":{"message":"Désactiver"},"autoSkip_POI":{"message":"Passer automatiquement au début"},"manualSkip_POI":{"message":"Demander lors du chargement de la vidéo"},"showOverlay_POI":{"message":"Afficher dans la barre de recherche"},"showOverlay_full":{"message":"Afficher l'étiquette"},"showOverlay_chapter":{"message":"Afficher les chapitres"},"autoSkipOnMusicVideos":{"message":"Passer automatiquement tous les segments lorsqu'il y a un segment non musical"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Passer automatiquement seulement sur music.youtube.com"},"muteSegments":{"message":"Autoriser les segments qui mettent l'audio en sourdine plutôt que de les passer"},"fullVideoSegments":{"message":"Afficher une icône lorsqu'une vidéo est entièrement promotionnelle","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Afficher également les étiquettes sur les vignettes de la vidéo","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Couleur Non soumis","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Couleur dans la barre de progression"},"category":{"message":"Catégorie"},"skipOption":{"message":"Option de passage","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Ouvrir les options de passage avancées"},"advancedSkipNotSaved":{"message":"Erreur de syntaxe : Vos options n'ont pas été enregistrées"},"advancedSkipSettingsHelp":{"message":"Comment cela fonctionne","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Activer le serveur de test bêta"},"whatEnableTestingServer":{"message":"Vos soumissions et votes NE SERONT PAS COMPTÉES par serveur principal. À n'utiliser que lors de vos tests."},"testingServerWarning":{"message":"Aucune soumission ou vote NE SERA COMPTÉE par le serveur principal tant que vous serez connecté-e au serveur de test. À désactiver quand vous voudrez réellement soumettre des segments ou voter."},"bracketNow":{"message":"(Maintenant)"},"moreCategories":{"message":"Autres catégories"},"chooseACategory":{"message":"Choisissez une catégorie"},"enableThisCategoryFirst":{"message":"Pour envoyer des segments de la catégorie \"{0}\", vous devez l'activer dans les options. Vous allez être redirigé vers les options maintenant.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Attention : un seul segment de ce type de segment peut être actif à la fois. En soumettant plusieurs segments, un seul d'entre eux sera aléatoirement affiché."},"youMustSelectACategory":{"message":"Vous devez sélectionner une catégorie pour tous les segments que vous soumettez !"},"bracketStart":{"message":"(Début)"},"bracketEnd":{"message":"(Fin)"},"End":{"message":"Fin","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"masqué : vote négatif"},"hiddenDueToDuration":{"message":"masqué : trop court"},"manuallyHidden":{"message":"masqué manuellement"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Le Channel ID n'est pas encore chargé. Si vous utilisez une vidéo intégrée, essayez plutôt d'utiliser la page d'accueil de YouTube. Le problème peut également être causé par des changements dans l'interface de YouTube, si vous pensez que c'est le cas, écrivez un commentaire ici :"},"invidiousPermissionRefresh":{"message":"Le navigateur a refusé l'autorisation nécessaire pour pouvoir fonctionner sur Invidious et d'autres sites tiers. Veuillez cliquer sur le bouton ci-dessous pour réactiver cette autorisation."},"acceptPermission":{"message":"Donner la permission"},"permissionRequestSuccess":{"message":"Demande de permission réussie !"},"permissionRequestFailed":{"message":"La demande de permission a échoué, avez-vous cliqué sur refuser ?"},"adblockerIssueWhitelist":{"message":"Si vous ne parvenez pas à résoudre ce problème, désactivez le paramètre \"Forcer la vérification de la chaîne avant de passer\" car SponsorBlock ne parvient pas à récupérer les informations de la chaine pour cette vidéo"},"forceChannelCheck":{"message":"Forcer la vérification de la chaîne avant de passer"},"whatForceChannelCheck":{"message":"Par défaut, les segments sont passés avant même de savoir à quelle chaîne la vidéo appartient. Par défaut, certains segments en début de vidéo des chaînes sur liste blanche peuvent être involontairement passés. Activer cette option évitera ce problème mais le passage des segments aura un léger retard, du fait que l'obtention du ChannelID prend du temps. Ce retard devrait être imperceptible si vous avez un haut débit internet."},"forceChannelCheckPopup":{"message":"Envisagez d'activer \"Forcez la vérification de la chaîne avant de passer\""},"downvoteDescription":{"message":"Segment de mauvaise qualité"},"incorrectVote":{"message":"Incorrect"},"harmfulVote":{"message":"Néfaste","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Changer de catégorie"},"nonMusicCategoryOnMusic":{"message":"Cette vidéo est catégorisée comme musicale. Êtes-vous sûr-e qu'elle est sponsorisée ? S'il s'agit d'un segment non musical, activez cette catégorie dans les options de SponsorBlock. Vous pourez ensuite soumettre ce segment en tant que \"segment non musical\" plutôt que \"message commercial\". Lisez les instructions pour plus de détails."},"multipleSegments":{"message":"Plusieurs segments"},"guidelines":{"message":"Instructions"},"readTheGuidelines":{"message":"Lisez les instructions !!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Les catégories sont là !"},"categoryUpdate2":{"message":"Ouvrir les options pour sauter les introductions, postfaces, produits dérivés, etc."},"help":{"message":"Aide"},"GotIt":{"message":"C'est compris","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Ce segment est long. Si toute la vidéo parle d'un seul sujet, changer de \"Passer\" à \"Toute la vidéo\". Voir les instructions pour plus d'informations."},"categoryPillTitleText":{"message":"L'intégralité de cette vidéo est classée dans cette catégorie ce qui la rend trop intriquée pour l'en séparer"},"chapterNameTooltipWarning":{"message":"Le nom d'un de vos chapitres ressemble au nom d'une catégorie. Si possible, vous devriez plutôt utiliser une catégorie."},"experiementOptOut":{"message":"Se désinscrire de toutes les futures expériences","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Cacher pour toujours"},"warningChatInfo":{"message":"Nous avons remarqué que vous commettiez des erreurs courantes. Nous apprécions votre travail jusqu'à présent, mais nous recherchons la perfection, donc même de petites erreurs comptent :)"},"questionButton":{"message":"J’ai une question"},"askAQuestion":{"message":"Poser une question"},"warningConfirmButton":{"message":"Je comprends les risques"},"warningError":{"message":"Erreur lors de la tentative de reconnaissance de l'avertissement :"},"deArrowMessageRecieved":{"message":"Vous avez reçu une astuce d'un modérateur"},"Donate":{"message":"Faire un don"},"considerDonating":{"message":"Aider à financer le développement"},"supportSponsorBlock":{"message":"Soutenez mon travail à plein temps sur SponsorBlock"},"hideDonationLink":{"message":"Cacher le lien de don"},"darkModeOptionsPage":{"message":"Page options affichée en mode sombre"},"helpPageThanksForInstalling":{"message":"Merci d'avoir installé SponsorBlock."},"helpPageReviewOptions":{"message":"Veuillez vérifier les options ci-dessous"},"helpPageFeatureDisclaimer":{"message":"De nombreuses fonctionnalités sont désactivées par défaut. Si vous voulez ignorer les introductions, postfaces, utiliser Invidious, etc., définissez-le ci-dessous. Vous pouvez également masquer ou afficher les éléments de l'interface."},"helpPageHowSkippingWorks":{"message":"Comment ça marche"},"helpPageHowSkippingWorks1":{"message":"Chaque message sponsorisé est envoyé par d'autres utilisateurs comme vous. Vous pouvez voir la liste des messages sponsorisés stockés dans la base de données en ouvrant le pop-up en haut à droite de votre navigateur."},"helpPageHowSkippingWorks2":{"message":"À chaque fois que vous passez un segment, vous en êtes averti-e. Si le timing semble incorrect, vous pouvez voter contre le segment ! Vous pouvez également voter dans l'encart d'aperçu."},"Submitting":{"message":"Soumission en cours"},"helpPageSubmitting1":{"message":"Il est possible de soumettre un nouveau segment en cliquant sur le logo SponsorBlock dans le lecteur vidéo."},"helpPageSubmitting2":{"message":"Cliquez sur le bouton Lecture pour indiquer le début d'un segment puis sur le bouton Arrêt pour indiquer sa fin. Cliquez sur la flèche pointant vers le haut pour ouvrir le menu de soumission, où vous pouvez vérifier vos segments en les prévisualisant et en les modifiant afin de les peaufiner. La précision est importante : assurez-vous d'avoir lu les directives avant de soumettre des segments."},"helpPageCopyOfDatabase":{"message":"Où arrivent les soumissions ?"},"helpPageCopyOfDatabase1":{"message":"Toutes les soumissions sont placées dans la base de données SponsorBlock qui est publiée publiquement, utilisable par quiconque et disponible sur"},"helpPageCopyOfDatabase2":{"message":"Le code source est en accès libre. Donc, même si il m'arrive quelque chose, vos soumissions ne seront pas perdues."},"AdviceForSubmitting":{"message":"Conseils relatifs à la soumission"},"Credits":{"message":"Crédits"},"LearnMore":{"message":"En savoir plus"},"FullDetails":{"message":"Tous les détails"},"CopyDownvoteButtonInfo":{"message":"Vote contre et crée une copie locale à soumettre à nouveau"},"OpenCategoryWikiPage":{"message":"Ouvrir la page wiki de cette catégorie."},"CopyAndDownvote":{"message":"Copier et voter contre"},"ContinueVoting":{"message":"Continuer à voter"},"ChangeCategoryTooltip":{"message":"Cela s'appliquera instantanément à vos segments"},"downvote":{"message":"Voter contre"},"upvote":{"message":"Voter pour"},"hideSegment":{"message":"Cacher le segment"},"skipSegment":{"message":"Passer le segment"},"playChapter":{"message":"Jouer le chapitre"},"SponsorTimeEditScrollNewFeature":{"message":"Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches ctrl ou maj peuvent être utilisées pour affiner les modifications."},"categoryPillNewFeature":{"message":"Nouveau ! Soyez prévenu-e quand une vidéo est entièrement sponsorisée ou autopromotionnelle"},"yearAbbreviation":{"message":"y","description":"100y"},"dayAbbreviation":{"message":"j","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Comportement","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interface","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Raccourcis clavier","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Sauvegarde/Restauration","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Divers","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Sauter l'affichage de l'avertissement","description":"Option label"},"unbind":{"message":"Délier","description":"Unbind keyboard shortcut"},"notSet":{"message":"Non configuré"},"change":{"message":"Changer"},"youtubeKeybindWarning":{"message":"Il s'agit d'un raccourci intégré à YouTube. Êtes-vous sûr de vouloir l'utiliser ?"},"betaServerWarning":{"message":"Le serveur BETA est actif !"},"openOptionsPage":{"message":"Ouvrir la page d'options"},"resetToDefault":{"message":"Rétablir les paramètres par défaut"},"confirmResetToDefault":{"message":"Êtes-vous sûr de vouloir rétablir tous les paramètres ? Cette action ne peut pas être annulée."},"exportSegments":{"message":"Exporter les segments"},"importSegments":{"message":"Importer des segments"},"Import":{"message":"Importer","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Code échangé avec succès!"},"redeemFailed":{"message":"La clé de licence est invalide"},"hideUpsells":{"message":"Cache les options non disponibles sans paiement supplémentaire"},"hideNewFeatureUpdates":{"message":"Masquer les messages d'information à propos des nouvelles fonctionnalités"},"redeem":{"message":"Réclamer"},"enterLicenseKey":{"message":"Entrer la clé de licence"},"unsubmittedSegmentCounts":{"message":"Vous avez actuellement {0} sur {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Vous avez actuellement soumis aucun segment","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"segment non soumis","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"segments non soumis","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"vidéo","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"vidéos","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Effacer tous les segments","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Êtes-vous sûr de vouloir effacer tout les segments non soumis?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Montrer les segments","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Cacher les segments","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID de la vidéo","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Nombre de segments","description":"Header of the unsubmitted segments list"},"actions":{"message":"Actions","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Partager un URL"},"segmentFetchFailureWarning":{"message":"Attention : Le serveur n'a pas encore répondu aux segments. Cette vidéo peut contenir des segments déjà soumis, mais vous ne les avez pas encore reçus en raison de problèmes avec le serveur."},"allowScrollingToEdit":{"message":"Autoriser l'utilisation de la molette pour modifier les temps"},"NoticeTimeAfterSkip":{"message":"{seconds}sec","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - De Meilleurs Titres et Miniatures sur YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Le Crowdsourcing fournit des titres et des miniatures détaillés et non racoleurs","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Choisir la plus descriptive"},"Original":{"message":"Originale"},"OriginalTitle":{"message":"Titre original"},"CurrentTime":{"message":"Heure actuelle"},"resetCustomTitle":{"message":"Rétablir le texte d'origine du titre"},"resetIcon":{"message":"Icône de réinitialisation"},"TypeYourOwnTitleHere":{"message":"Tapez votre propre titre ici"},"VideoNotReady":{"message":"La vidéo n'est pas prête"},"FailedToRender":{"message":"Échec du rendu","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canevas manquant","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Anomalie lors du rendu","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Échec du chargement","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Format du titre"},"Disabled":{"message":"Désactivé"},"CapitalizeWords":{"message":"Mots en majuscule"},"TitleCase":{"message":"Casse du titre"},"SentenceCase":{"message":"Majuscule début de phrase"},"LowerCase":{"message":"Minuscules"},"FirstLetterUppercase":{"message":"Première lettre en majuscule"},"shouldCleanEmojis":{"message":"Émojis supprimés"},"onlyFormatCustomTitles":{"message":"Formater uniquement les titres envoyés par les utilisateurs"},"onlyTitleCaseInEnglish":{"message":"Mettre en majuscule les mots pour les titres non-anglais"},"onlyTitleCaseInEnglishDescription":{"message":"La détection de la langue n'est pas parfaite et détecte certains titres en anglais comme non-anglais."},"thumbnailFallbackOption":{"message":"Quand aucune miniature soumise n'existe"},"whatThumbnailFallbackOption":{"message":"Lors de la sélection d'une heure aléatoire, il utilisera les données de SponsorBlock pour s'assurer qu'une heure est située dans un segment promotionnel n'est pas sélectionnée.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Afficher une capture d'écran à partir d'un passage aléatoire"},"TheOriginalThumbnail":{"message":"Montrer la miniature originale"},"showABlankBox":{"message":"Afficher une case vide"},"AutoGenerated":{"message":"Afficher la miniature générée par YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Début"},"Middle":{"message":"Milieu"},"keepUnsubmitted":{"message":"Stocker les votes soumis"},"showLiveCover":{"message":"Afficher l'avatar de la chaine sur les vidéos à venir","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Ne jamais utiliser les miniatures des tests A/B"},"ignoreAbThumbnailsDescription":{"message":"Les chaines peuvent mettre en place des tests sur leurs vidéos où YouTube montrera différentes miniatures pour chaque personne. Cette option utilisera toujours la première miniature pour maintenir la cohérence."},"abThumbnailsWarning":{"message":"Avertissement : Cette vidéo a actuellement une miniature de test A/B. Cela signifie que la vignette peut changer souvent. Vous ne devriez probablement pas voter pour la miniature originale en raison de ce risque."},"whatKeepUnsubmitted":{"message":"Garder les votes soumis après un vote pour afficher les titres et miniatures que vous avez choisis au lieu de ceux ayant reçu le plus de votes sur le serveur."},"keepUnsubmittedInPrivate":{"message":"Stocker les votes soumis à partir des onglets privés"},"useThumbnailGenerationService":{"message":"Utiliser le service de génération de miniatures"},"titleMaxLines":{"message":"Nombre maximum de lignes pour le titre"},"titleMaxLinesDescription":{"message":"Les titres vidéo seront diffusés sur ces nombreuses lignes en suggestions."},"thumbnailSaturationLevel":{"message":"Niveau de saturation des miniatures"},"whatSaturateThumbnails":{"message":"Rendez les couleurs des miniatures moins vives en réduisant la saturation"},"hideDetailsWhileFetching":{"message":"Masquer les détails pendant la récupération d'infos"},"hideDetailsWhileFetchingDescription":{"message":"Masquer les titres et les miniatures pendant la récupération de données à partir du serveur. Si l'option est désactivée, les titres et les miniatures clignoteront au moment de les échanger."},"ignoreTranslatedTitles":{"message":"Ne pas afficher les titres traduits par YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube traduit automatiquement certains titres dans votre langue. Cette option s'applique uniquement si aucun titre crowdsourcé n'est disponible."},"onAllPages":{"message":"Sur toutes les pages","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Sur toutes les pages sauf les pages vidéo","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Jamais"},"thumbnailGeneratorDescription1":{"message":"Le service de génération de miniatures accélère considérablement la génération de miniatures en envoyant une requête anonyme avec l'identifiant vidéo à un serveur distant. La miniature sera alors soit générée, soit tirée d'un cache si elle a déjà été générée."},"thumbnailGeneratorDescription2":{"message":"Si elle est utilisée sur des pages vidéo, cela peut potentiellement révéler des identifiants vidéo non répertoriés à ce serveur. Définir ceci à \"Sur toutes les pages sauf les pages vidéo\" évitera ce problème. Une autre option est d'héberger votre propre service de génération de miniatures."},"thumbnailGeneratorDescription3":{"message":"Si l'utilisation du service de génération des vignettes est désactivée, toutes les requêtes utiliseront un système de requête k-anonymat, ce qui rend plus difficile pour le serveur de prédire quelles vidéos ont été récupérées, et un service de génération de miniatures locales plus lent sera utilisé.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Code source du service de génération de miniature"},"moreAboutKAnonymity":{"message":"En savoir plus sur la K-anonymisation","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Toujours afficher le bouton \"Afficher l'original\""},"whatAlwaysShowShowOriginalButton":{"message":"Si vous souhaitez toujours savoir si un titre/miniature a été modifié, activez cette option."},"showOriginalOnHover":{"message":"Passer des détails personnalisés aux détails originaux en les survolant"},"showOriginalOnHoverOfVideo":{"message":"Passer des détails personnalisés aux détails originaux en survolant la carte de la vidéo"},"showOriginalOnHoverOfVideoDescription":{"message":"Cela désactivera la lecture automatique au survol"},"showCustomOnHoverIfCasual":{"message":"Afficher le titre personnalisé en survolant un titre issu du mode relaxé"},"showIconForFormattedTitles":{"message":"Afficher le bouton \"Afficher l'original\" pour les titres automatiquement formatés"},"Enable":{"message":"Activé"},"Titles":{"message":"Titres","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniatures","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Votes en mode relaxé","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Erreur"},"ShowOriginal":{"message":"Montrer les détails d'origine"},"ShowModified":{"message":"Montrer les détails modifiés"},"ShowFormatted":{"message":"Afficher les détails formatés"},"FillerWarning":{"message":"Attention : cette catégorie est particulièrement agressive. Par moments, il se peut que vous deviez revenir en arrière, voire même désactiver la catégorie. Notez que certaines vidéos peuvent voir plus de 50 % de leur contenu être passé ! Souvenez-vous néanmoins que les soumissions de segments doivent respecter les directives spécifiques à cette catégorie.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Rejoignez Discord ou Matrix pour rester dans ce chat de façon permanente","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Afficher l'aide aux consignes","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Éviter les expressions faciales exagérées","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Voyez plus grand, ne répondez pas simplement à la question du titre d'origine","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Évitez de décrire les réactions à la vidéo (\"choquant\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Fournissez suffisamment d'informations pour faire un choix éclairé avant de cliquer"},"tip5":{"message":"Mettre en majuscule comme une phrase","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Vérifiez l'ensemble des instructions avant de pouvoir envoyer","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Dans mon titre, les majuscules sont utilisées comme dans les phrases","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Mon titre n'est pas simplement une réponse à la question posée dans le titre original","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Un titre doit décrire ce qui est raconté dans la vidéo. Assurez-vous d'avoir regardé la vidéo en entier pour mieux connaître son contenu et ne pas faire confiance aveuglément au titre original.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Mon titre ne résume pas la conclusion de la vidéo et ne la spoile pas","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Un titre ne doit pas remplacer le visionnage d'une vidéo, mais doit vous aider à savoir s'il est utile de cliquer dessus.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Mon titre ne fact-checke/moque/critique pas la vidéo, ni la personne l'ayant créée","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Un titre doit respecter la perspective de la vidéo et de la personne l'ayant créée. DeArrow ne sert pas à évaluer ou à fact-checker les vidéos. Ce n'est pas une section Commentaires.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Mot détecté : ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"N'utilisez pas de verbe inutile au début du titre","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Un titre doit commencer par une lettre majuscule et doit être formaté comme une phrase","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Un titre ne doit pas se terminer par un '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Ne vous contentez pas de répondre à une question posée dans le titre original. Un titre doit décrire ce qui est raconté dans la vidéo.","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Un titre ne doit pas fact-checker/moquer/critiquer la vidéo en question, ni la personne l'ayant créée","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Un titre ne doit pas conserver les éléments sensationnels du titre original","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Un titre ne doit pas contenir d'emojis","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Vous devez traiter l'avertissement avant d'envoyer le titre"},"dearrowHelpSponsorBlockImported":{"message":"Remarque : Vos paramètres SponsorBlock ont été importés automatiquement !"},"howItWorks":{"message":"Comment ça marche"},"discordPromotion":{"message":"Venez contribuer, faire quelques suggestions et aider sur {discord} ou sur {matrix}"},"deArrowDonationText":{"message":"Si vous aimez ce que j'ai fait jusqu'à présent et que vous voulez m'aider avec de l'argent, voici un lien"},"termsAgreement":{"message":"En utilisant cette extension, vous acceptez les {privacy-policy} et {terms}"},"privacyPolicy":{"message":"Politique de confidentialité"},"termsOfUse":{"message":"Conditions d'utilisation"},"openSourceLicenses":{"message":"Licences Open Source"},"defaultToOriginals":{"message":"Informations d'origine de la vidéo par défaut"},"whatDefaultToOriginals":{"message":"Afficher le titre original et la miniature par défaut, mais afficher un bouton qui apparaît au survol de la souris pour voir les titres et les vignettes personnalisés."},"replaceTitles":{"message":"Remplacer les titres"},"replaceThumbnails":{"message":"Remplacer les miniatures"},"useCrowdsourcedTitles":{"message":"Utiliser les titres collaboratifs"},"whatUseCrowdsourcedTitles":{"message":"Si désactivé, cela formalisera les titres mais n'utilisera pas les titres soumis par la communauté","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Êtes-vous certain de vouloir supprimer cette configuration ?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Nouvelle configuration"},"DeleteConfiguration":{"message":"Supprimer la configuration"},"ChannelAllowlist":{"message":"Paramètres par chaîne"},"ConfigurationName":{"message":"Nom de la configuration"},"ChannelListInstructions":{"message":"Saisissez dans la case ci-dessous les chaînes où vous voulez que cette configuration soit appliquée, en les séparant d'un retour à la ligne. Les ID de chaîne et les noms d'affichage sont pris en charge. Les @Utilisateur ne sont pas pris en charge. Vous pouvez obtenir l'ID d'une chaîne en cliquant sur le bouton Partager la chaîne dans la fenêtre À propos. Pour ouvrir cette fenêtre, cliquez sur la description de la chaîne. Elle se situe sur la page de la chaîne, en dessous de son nom.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Aucune configuration configurée pour l'instant. Cliquez sur le bouton en haut pour ajouter une nouvelle configuration.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Mettez fin aux titres piégeux et aux miniatures aguicheuses grâce à la communauté"},"DeArrowPromotionMessage2":{"message":"Fatigué des pièges à clics ? Découvrez ma nouvelle extension pour améliorer les titres et les miniatures"},"DeArrowPromotionMessage3":{"message":"Voir aussi DeFrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Vous n'aimez pas ce titre? Si vous préférez le titre ci-dessous, envisagez de consulter la fonction de remplacement du titre dans DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Cette miniature est choisie à partir d'une image aléatoire car il n'y a pas encore de soumission sur cette vidéo","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Cette miniature est choisie à partir d'un horodatage aléatoire, car il n'y a pas encore de soumission sur cette vidéo","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Vous pouvez modifier cette valeur par défaut ci-dessous","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} titres et {thumbnails} miniatures ont été remplacés depuis que vous avez installé cette extension","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} titre ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} titres ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"et {thumbnails} miniature","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"et {thumbnails} miniatures","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} ont été remplacé depuis que vous avez installé cette extension","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Nombre de titres et de remplacements de miniatures"},"countReplacementsDescription":{"message":"Utilisé pour vous donner des statistiques dans le popup.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Ajouter une liste de filtres pour bloquer les sondages, les étagères de merch et d'autres éléments de page promotionnelle à l'aide de yt-neuter"},"requiresUblock":{"message":"Nécessite uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Quelque chose s'est mal passé avec la détection de l'identifiant vidéo. Veuillez essayer de rafraîchir avant de soumettre pour s'assurer qu'il soit soumis pour la bonne vidéo. Si cela se produit beaucoup, veuillez envoyer un rapport de ceci avec les autres extensions ou scripts utilisateur que vous avez installé via GitHub, Discord ou Matrix."},"dearrowLogoCredit":{"message":"Logo basé sur Twemoji sous licence CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock n'est pas compatible avec l'extension \"Zoom to Fill\". Il existe de nombreuses alternatives que vous pouvez utiliser à la place qui fonctionneront correctement."},"freeTrialStarted":{"message":"Votre essai gratuit a démarré avec succès. Allez sur YouTube pour le tester"},"freeTrialEnded":{"message":"Votre essai gratuit est terminé"},"freeTrialPrompt":{"message":"Si vous voulez le tester pendant une heure, vous pouvez commencer un essai gratuit avec le bouton ci-dessous."},"startFreeTrial":{"message":"Commencer l'essai gratuit"},"freeAccessRequested":{"message":"Vous vous êtes enregistré avec succès pour un accès gratuit. Vous serez averti lorsqu'il vous sera accordé."},"freeAccessComplete":{"message":"Félicitations ! Vous avez maintenant un accès gratuit à DeArrow"},"DeArrowNotActivated":{"message":"DeArrow n'est pas activée"},"ActivateDeArrow":{"message":"Activer DeArrow"},"DeArrowIsActivated":{"message":"DeArrow a été activé avec succès"},"Close":{"message":"Fermer"},"ViewLicenseKey":{"message":"Voir la clé de licence"},"SharingIsCaring":{"message":"Partager c'est aimer"},"cleanPopup":{"message":"Cacher les détails dans l'affichage de la liste des segments"},"hideSegmentCreationInPopup":{"message":"Masquer les boutons de création de segment dans le pop-up"},"syncDisabledWarning":{"message":"Attention : le stockage des extensions a été désactivé dans votre navigateur. Les paramètres ne seront pas enregistrés si vous essayez de les sauvegarder."},"syncDisabledWarningDeArrow":{"message":"DeArrow ne fonctionnera pas sans stockage."},"syncDisabledFirefoxSuggestions":{"message":"Vous pouvez l'activer en allant dans about:config et en définissant la valeur de \"webextensions.storage.sync.enabled\" à true."},"storageFull":{"message":"Le stockage de l'extension est plein. Veuillez supprimer certains segments non soumis dans les options."},"previewSegmentRequired":{"message":"Veuillez prévisualiser vos segments avant de les soumettre. Vous pouvez le faire en cliquant sur le bouton de prévisualisation ou en utilisant le raccourci suivant :","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Agir en tant que VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Les contributions envoyées à partir de votre navigateur ne peuvent pas être acceptées pour le moment. En effet, YouTube semble avoir injecté des publicités côté serveur que l'extension n'est pas en mesure de retirer. Merci de nous contacter si vous constatez cette erreur."},"DeArrowIsDisabled":{"message":"DeArrow est désactivé, cliquez pour activer","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Confirmez-vous que la miniature originale suit bien les directives DeArrow ? Si vous préférez simplement toujours voir les miniatures originales, envisagez de modifier l'option \"Quand aucune miniature soumise existe\" dans les paramètres DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"SponsorBlock pour YouTube TV n'est pas compatible avec le contenu en direct ou enregistré récemment. S'il s'agit d'un enregistrement récent, merci de patienter quelques heures que la version traitée de l'enregistrement soit disponible.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"La liste blanche des chaînes n'est pas prise en charge sur tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Vous aimez le titre original ?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Oui"},"No":{"message":"Non"},"votes":{"message":"{0} votes","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} vote","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Drôle","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Créatif","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Bien trouvé","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Descriptif","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Autre","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Mode classique","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Les titres sont remplacés par d'autres titres crowdsourcés dont le format est normalisé de manière à respecter les directives."},"CasualMode":{"message":"Mode relaxé","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Conserver les titres originaux lorsqu'ils décrivent suffisamment bien la vidéo, ou lorsqu'ils sont drôles ou bien trouvés.\nChoisissez les catégories des titres que vous souhaitez voir.\nVous pourrez voter pour ou contre un titre s'il correspond bien, ou non, à une catégorie."},"minimumVotes":{"message":"Votes minimums","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Afficher la miniature originale sur les vidéos ayant des votes en mode relaxé","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Nouvelle fonctionnalité : mode relaxé","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Afficher l'icône du mode relaxé uniquement lorsqu'un titre personnalisé est disponible"},"OpenSettings":{"message":"Ouvrir les paramètres"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/he/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/he/messages.json @@ -0,0 +1 @@ +{"0":{"message":"תם זמן החיבור. בדוק את חיבור האינטרנט שלך. אם האינטרנט שלך עובד, כנראה שהשרת עמוס מאוד או מושבת."},"400":{"message":"השרת אמר שהבקשה הזו לא בתוקף"},"409":{"message":"זה כבר הוגש בעבר"},"502":{"message":"נראה שהשרת עמוס יתר על המידה. יש לנסות שוב בעוד מספר שניות."},"fullName":{"message":"חוסם פרסומות ליוטיוב - דלג על החסויות","description":"Name of the extension."},"Description":{"message":"דלג על החסויות, ההתחננויות לעשות מנוי ועוד בסרטוני יוטיוב. דווח על ספונסרים בסרטונים שאתה צופה בהם כדי לחסוך לאחרים זמן.","description":"Description of the extension."},"channelWhitelisted":{"message":"הערוץ הורשה!"},"Segment":{"message":"מקטע"},"Segments":{"message":"מקטעים"},"SegmentsCap":{"message":"קטעים"},"Chapters":{"message":"פרקים"},"renderAsChapters":{"message":"עיבוד קטעים כפרקים","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"הצגת קטע נוכחי לצד זמן וידאו"},"showAutogeneratedChapters":{"message":"הצג פרקים שנוצרו אוטומטית על ידי YouTube"},"upvoteButtonInfo":{"message":"הצבע לדיווח הזה"},"reportButtonTitle":{"message":"דווח"},"reportButtonInfo":{"message":"דווח על הדיווח הזה כלא נכון."},"Dismiss":{"message":"סגור"},"Loading":{"message":"טוען..."},"Hide":{"message":"אל תציג אף פעם"},"hitGoBack":{"message":"לחץ על דלג אחורה כדי להגיע מאיפה שבאת."},"unskip":{"message":"דלג אחורה"},"reskip":{"message":"דלג קדימה"},"unmute":{"message":"ביטול השתקה"},"paused":{"message":"מושהה"},"manualPaused":{"message":"טיימר נעצר"},"confirmMSG":{"message":"כדי לערוך או למחוק קטעים יחידים, לחץ על כפתור המידע או פתח את החלונית של ההרחבה בדפדפן ע\"י לחיצה על הסמליל בצד ימין למעלה (יכול להיות ששמאל למעלה בדפדפנים בעברית)."},"clearThis":{"message":"אתה בטוח שאתה רוצה לנקות את זה?\n\n"},"Unknown":{"message":"אירעה שגיאה בדיווח הזמנים, נסה שוב מאוחר יותר."},"sponsorFound":{"message":"לסרטון הזה יש קטעים במאגר הנתונים!"},"sponsor404":{"message":"לא נמצאו מקטעים"},"sponsorStart":{"message":"מקטע מתחיל עכשיו"},"sponsorEnd":{"message":"מקטע נגמר עכשיו"},"sponsorCancel":{"message":"ביטול יצירת קטע"},"noVideoID":{"message":"לא נמצא סרטון יוטיוב.\nאם זה לא נכון, רענן את הכרטיסייה."},"refreshSegments":{"message":"ריענון קטעים"},"success":{"message":"הצלחה!"},"voted":{"message":"הצבעת!"},"serverDown":{"message":"נראה שהשרת נפל. צור קשר עם המפתח מיד."},"connectionError":{"message":"התקבלה שגיאת חיבור. קוד השגיאה: "},"segmentsStillLoading":{"message":"קטעים עדיין נטענים..."},"clearTimes":{"message":"נקה מקטעים"},"openPopup":{"message":"פתח חלונית SponsorBlock"},"closePopup":{"message":"סגור חלון"},"closeIcon":{"message":"סגירת סמליל"},"OpenSubmissionMenu":{"message":"פתיחת תפריט הגשה"},"OpenCasualVoteMenu":{"message":"פתח את תפריט מצב מזדמן"},"sortSegments":{"message":"מיון מקטעים"},"submitCheck":{"message":"אתה בטוח שאתה רוצה להזין את זה?"},"whitelistChannel":{"message":"הרשה ערוץ"},"removeFromWhitelist":{"message":"הסר ערוץ מרשימת ערוצים מורשים"},"voteOnTime":{"message":"הצבע על מקטע"},"Submissions":{"message":"הזנות"},"savedPeopleFrom":{"message":"הצלת אנשים מ "},"viewLeaderboard":{"message":"לוח מובילים"},"recordTimesDescription":{"message":"הגש"},"submissionEditHint":{"message":"עריכת מקטע תופיע אחרי שתלחץ הגש","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"רמז: אתה יכול להגדיר קיצורים מהמקלדת דרך תפריט אפשרויות כדי להזין זמנים"},"clearTimesButton":{"message":"ניקוי זמנים"},"Username":{"message":"שם משתמש"},"setUsername":{"message":"הגדרת שם משתמש"},"copyPublicID":{"message":"העתקת מזהה משתמש פומבי"},"copySegmentID":{"message":"העתקת מזהה מקטע"},"loopChapter":{"message":"פרק לולאה"},"unloopChapter":{"message":"פתח פרק"},"hideThis":{"message":"להסתיר את זה"},"Options":{"message":"אפשרויות"},"showButtons":{"message":"הצגת כפתורים על הנגן של יוטיוב"},"hideButtonsDescription":{"message":"זה מחביא את הכפתורים שמופיעים בנגן YouTube להגיש מקטעי דילוג."},"showSkipButton":{"message":"השארת כפתור הדילוג להדגשה על הנגן"},"showInfoButton":{"message":"הראה כפתור מידע בנגן YouTube"},"autoHideInfoButton":{"message":"הסתרה אוטומטית של כפתורי אינפורמציה"},"showDeleteButton":{"message":"הצגת כפתור מחיקה על הנגן של יוטיוב"},"enableViewTracking":{"message":"אפשר מעקב ספירת דילוגים"},"whatViewTracking":{"message":"תכונה זו עוקבת אחר אילו קטעים דילגת כדי לאפשר למשתמשים לדעת עד כמה ההגשה שלהם עזרה לאחרים ותשתמש כמדד יחד עם הצבעות בעד כדי להבטיח שספאם לא ייכנס למסד הנתונים. התוסף שולח הודעה לשרת בכל פעם שאתה מדלג על קטע. אני מקווה שרוב האנשים לא ישנו הגדרה זו כדי שהמספרים המוצגים יהיו מדויקים. :)"},"enableViewTrackingInPrivate":{"message":"אפשר מעקב ספירת דילוגים בכרטיסיות גלישה פרטית/גלישה בסתר"},"enableTrackDownvotes":{"message":"שמור דירוג קטעים"},"whatTrackDownvotes":{"message":"כל קטע שידורג על ידך יישאר חבוי, גם לאחר רענון"},"trackDownvotesWarning":{"message":"אזהרה: ביטול השמירה ימחק את הדירוגים שנשמרו"},"enableTrackDownvotesInPrivate":{"message":"אחסן הצבעות נמוכות של פלחים בכרטיסיות פרטיות/גלישה בסתר"},"enableQueryByHashPrefix":{"message":"שאילתה לפי גיבוב"},"whatQueryByHashPrefix":{"message":"במקום לבקש מקטעים מהשרת לפי מזהה סרטון, נשלחים ארבעת התווים הראשונים של ה-hash של מזהה הסרטון. שרת זה ישלח בחזרה נתונים לכל הסרטונים עם hash מתאים."},"enableShowCategoryWithoutPermission":{"message":"הצג קטגוריה בתפריט ההגשה גם ללא הרשאת הגשה"},"whatShowCategoryWithoutPermission":{"message":"חלק מהקטגוריות דורשות אישור הגשה בגלל דרישות מוניטין מינימליות"},"showNotice":{"message":"הצג הודעה שוב"},"showSkipNotice":{"message":"הצג הודעה לאחר דילוג על מקטע"},"showUpcomingNotice":{"message":"הצג הודעה לפני תחילת קטע"},"showCategoryGuidelines":{"message":"הצג עזרה לקטגוריה"},"noticeVisibilityMode0":{"message":"הודעות דילוג בגודל מלא"},"noticeVisibilityMode1":{"message":"התראות דילוג קטנות לדילוג אוטומטי"},"noticeVisibilityMode2":{"message":"כל הודעות דילוג קטנות"},"noticeVisibilityMode3":{"message":"התראות דילוג מתמוססות לדילוג אוטומטי"},"noticeVisibilityMode4":{"message":"כל התראות הדילוג המתמוססות"},"longDescription":{"message":"SponsorBlock מאפשר לך לדלג על נותני חסות, פתיחים/סגירים, תזכורות מנוי וחלקים מעצבנים אחרים בסרטוני יוטיוב. SponsorBlock הוא תוסף דפדפן במיקור המונים המאפשר לכל אחד לשלוח את זמני ההתחלה והסיום של קטעים ממומנים וקטעים אחרים של סרטוני YouTube. ברגע שאדם אחד ישלח את המידע הזה, כל השאר עם התוסף הזה ידלגו ישירות על הקטע הממומן. ניתן גם לדלג על קטעים שאינם מוזיקליים בסרטוני מוזיקה.","description":"Full description of the extension on the store pages."},"website":{"message":"אתר","description":"Used on Firefox Store Page"},"sourceCode":{"message":"קוד מקור","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"ההודעה שודרגה!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"אם אתה עדיין לא אוהב את זה, לחץ על הכפתור לעולם אל תציג.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"דלג קטע","description":"Keybind label"},"setStartSponsorShortcut":{"message":"התחל/עצור מקטע","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"פתח תפריט הגשה","description":"Keybind label"},"setSubmitKeybind":{"message":"הגש מקטעים","description":"Keybind label"},"setPreviewKeybind":{"message":"קטע בתצוגה מקדימה","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"סגור התראת דילוג","description":"Keybind label"},"setDownvoteKeybind":{"message":"דירוג שלילי מקטע","description":"Keybind label"},"setUpvoteKeybind":{"message":"דירוג חיובי לקטע","description":"Keybind label"},"nextChapterKeybind":{"message":"הפרק הבא","description":"Keybind label"},"previousChapterKeybind":{"message":"הפרק הקודם","description":"Keybind label"},"enableDeArrowKey":{"message":"החלף את הפעלת תמונת פתיחה","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"פתח תפריט הגשה","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"בחר מקש על ידי הקלדתו ובחר את כל מקשי השינוי שבהם ברצונך להשתמש."},"disableSkipping":{"message":"דילוג מופעל"},"enableSkipping":{"message":"דילוג כבוי"},"yourWork":{"message":"העבודה שלך","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"קוד שגיאה: "},"skip":{"message":"דילוג"},"mute":{"message":"השתקה"},"full":{"message":"וידיאו מלא","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"דילוג {0}?"},"mute_category":{"message":"השתק {0}?"},"skip_to_category":{"message":"דילוג אל {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"בקרוב {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} דולג","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} מושתק","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"דילוג אל {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"הצביעו על {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"השבתת דילוג אוטומטי"},"enableAutoSkip":{"message":"הפעלת דילוג אוטומטי"},"audioNotification":{"message":"הודעת שמע בעת דילוג"},"audioNotificationDescription":{"message":"בעת דילוג על קטע נשמיע צליל. אם כבוי (או הדילוג האוטומטי כבוי), לא יושמע צליל."},"showTimeWithSkips":{"message":"הצג זמן כולל דילוגים שהוסרו"},"showTimeWithSkipsDescription":{"message":"זמן זה מופיע בסוגריים ליד השעה הנוכחית מתחת לסרגל החיפוש. זה מציג את משך הווידאו הכולל פחות קטעים כלשהם. זה כולל קטעים המסומנים רק כ-\"Show In Seek Bar\"."},"youHaveSkipped":{"message":"דילגת "},"minLower":{"message":"דקה"},"minsLower":{"message":"דקות"},"hourLower":{"message":"שעה"},"hoursLower":{"message":"שעות"},"youHaveSavedTime":{"message":"חסכת לאנשים","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" מחייהם","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"בדוק את status.sponsor.ajay.app עבור סטטוס השרת."},"changeUserID":{"message":"ייבא/ייצא את מזהה המשתמש הפרטי שלך"},"whatChangeUserID":{"message":"המזהה צריך להישמר פרטי. זה כמו סיסמא ואסור לשתף אותו עם אף אחד. אם מישהו ישיג את המזהה, הוא יכול להתחזות אליך. אם אתה מחפש את מזהה המשתמש הציבורי שלך, לחץ על סמל הלוח בחלון הקופץ."},"setUserID":{"message":"הגדר מזהה משתמש פרטי"},"userIDChangeWarning":{"message":"אזהרה: שינוי מזהה המשתמש הפרטי הוא קבוע. האם אתה בטוח שתרצה לעשות זאת? הקפד לגבות את המזהה הישן שלך לכל מקרה."},"createdBy":{"message":"נוצר על ידי"},"supportOtherSites":{"message":"תמיכה באתרי יוטיוב של צד שלישי"},"supportOtherSitesDescription":{"message":"תמיכה בלקוחות יוטיוב של צד שלישי. כדי לאפשר תמיכה, עליך לאפשר הרשאות נוספות.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"אתרים נתמכים: "},"optionsInfo":{"message":"אפשר תמיכה ב-Invidious, השבת דילוג אוטומטי, הסתר כפתורים ועוד."},"addInvidiousInstance":{"message":"הוסף מופע לקוח של צד שלישי"},"addInvidiousInstanceDescription":{"message":"הוסף מופע מותאם אישית. זה חייב להיות בפורמט רק עם הדומיין. דוגמה: invidious.ajay.app"},"add":{"message":"הוסף"},"addInvidiousInstanceError":{"message":"זהו דומיין לא חוקי. צריך לכלול רק את החלק של הדומיין. דוגמה: invidious.ajay.app"},"resetInvidiousInstance":{"message":"אפס את רשימת המופעים של Invidious"},"resetInvidiousInstanceAlert":{"message":"אתה עומד לאפס את רשימת המופעים של Invidious"},"invidiousDisabledSafari":{"message":"תמיכה ב-Invidious אינה זמינה ב-Safari כרגע עקב באג ב-Safari. כאשר אפל תתקן את הבאג, הוא יתווסף בחזרה."},"currentInstances":{"message":"מופע נוכחי:"},"minDuration":{"message":"אורך מינימום (שניות):"},"minDurationDescription":{"message":"קטעים קצרים מהערך שנקבע לא ידולגו או יוצגו בנגן."},"enableManualSkipOnFullVideo":{"message":"השתמש בדילוג ידני כאשר קיימת תווית וידאו מלאה"},"whatManualSkipOnFullVideo":{"message":"לאנשים שרוצים לצפות בסרטון ללא הפרעה אם הוא ממומן במלואו או בקידום עצמי."},"skipNoticeDuration":{"message":"הסתרת התראה לאחר (שניות):"},"skipNoticeDurationDescription":{"message":"הודעת הדילוג תישאר על המסך לפחות מספר שניות. עבור דילוג ידני, ייתכן שהוא יהיה גלוי לזמן רב יותר."},"shortCheck":{"message":"ההגשה הבאה קצרה מהמינימום של משך הזמן הנדרש. יכול להיות שכבר הוגש, ופשוט התעלמו ממנו עקב אפשרות זו. האם אתה בטוח שברצונך להגיש שוב?"},"liveOrPremiere":{"message":"לא ניתן להגיש בשידור חי או בשידור בכורה פעילים. אנא המתן עד לסיום, ולאחר מכן רענן את הדף וודא שהקטעים עדיין תקפים."},"showUploadButton":{"message":"הצגת כפתור העלאה"},"customServerAddress":{"message":"כתובת שרת חסימת חסות"},"customServerAddressDescription":{"message":"הכתובת שבה משתמש SponsorBlock כדי לבצע שיחות לשרת.\nאלא אם כן יש לך מופע שרת משלך, אין לשנות זאת."},"dataFetchingServerAddress":{"message":"כתובת שרת לאיחזור נתונים"},"dataFetchingServerAddressDescription":{"message":"הכתובת המשמשת לביצוע שיחות לשרת איחזור הנתונים.\nאלא אם כן יש לך מופע שרת משלך, אין לשנות זאת."},"thumbnailCacheServerAddress":{"message":"כתובת שרת מטמון של תמונות ממוזערות"},"save":{"message":"שמירה"},"reset":{"message":"איתחול"},"customAddressError":{"message":"כתובת זו אינה בטופס הנכון. ודא שיש לך http:// או https:// בהתחלה וללא לוכסנים נגררים."},"areYouSureReset":{"message":"האם אתה בטוח שברצונך לאפס זאת?"},"mobileUpdateInfo":{"message":"m.youtube.com נתמך עכשיו"},"exportOptions":{"message":"ייבוא/ייצוא כל האפשרויות"},"exportOtherData":{"message":"ייבוא/ייצוא של כל הנתונים האחרים"},"exportOptionsCopy":{"message":"עריכה/העתקה"},"exportOptionsDownload":{"message":"שמירה לקובץ"},"exportOptionsUpload":{"message":"טעינה מקובץ"},"whatExportOptions":{"message":"כל התצורה שלך ב-JSON. כולל המזהה משתמש הפרטי שלך, אז הקפד לשתף את זה בחוכמה."},"setOptions":{"message":"שמור אפשרויות"},"exportOptionsWarning":{"message":"אזהרה: שינוי האפשרויות הוא קבוע ועלול לשבור את ההתקנה שלך. האם אתה בטוח שתרצה לעשות זאת? הקפד לגבות את האפשרויות הישנות שלך לכל מקרה."},"incorrectlyFormattedOptions":{"message":"קובץ ה-JSON אינו מעוצב כראוי. האפשרויות שלך לא השתנו."},"confirmNoticeTitle":{"message":"הגשת מקטע"},"submit":{"message":"הגשה"},"cancel":{"message":"ביטול"},"delete":{"message":"מחיקה"},"preview":{"message":"תצוגה מקדימה"},"unsubmitted":{"message":"לא מוגש"},"inspect":{"message":"סקירה"},"edit":{"message":"עריכה"},"copyDebugLogs":{"message":"העתק יומן באגים"},"copyDebugInformation":{"message":"העתק מידע על ניפוי באגים ללוח"},"copyDebugInformationFailed":{"message":"ההעתקה ללוח נכשלה"},"copyDebugInformationOptions":{"message":"מעתיק מידע ללוח שיסופק למפתח בעת העלאת באג / כאשר מפתח מבקש זאת. מידע רגיש כמו מזהה המשתמש שלך, ערוצים ברשימת ההיתרים וכתובת שרת מותאמת אישית הוסרו. עם זאת, הטקסט מכיל מידע כגון סוכן המשתמש, הדפדפן, מערכת ההפעלה ומספר הגרסא שלך. "},"copyDebugInformationComplete":{"message":"מידע ניפוי הבאגים הועתק ללוח העתקה. אל תהסס להסיר כל מידע שאתה מעדיף לא לשתף. שמור את זה בקובץ טקסט או הדבק בדיוח הבאג."},"keyAlreadyUsed":{"message":"קיצור דרך זה כבר בשימוש לפעולה אחרת. אנא בחר אחד אחר."},"to":{"message":"עד ל","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"הועתק!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"כלול מעברי סגה"},"generic_guideline2":{"message":"המשך כאילו שום דבר לא דולג"},"category_sponsor":{"message":"נותן חסות"},"category_sponsor_description":{"message":"קידום בתשלום, הפניות בתשלום ופרסומות ישירות. לא לקידום עצמי או פירסום חינם למטרות/יוצרים/אתרים/מוצרים שהם אוהבים."},"category_sponsor_guideline1":{"message":"מבצעים בתשלום"},"category_sponsor_guideline2":{"message":"לא לתרומות או סחורה בהתאמה אישית"},"category_selfpromo":{"message":"קידום עצמי / לא ממומן"},"category_selfpromo_description":{"message":"דומה ל\"נותן חסות\" למעט קידום ללא תשלום או קידום עצמי. זה כולל קטעים על סחורה, תרומות או מידע על מי הם שיתפו פעולה."},"category_selfpromo_guideline1":{"message":"תרומות, חברות וסחורה בהתאמה אישית"},"category_selfpromo_guideline2":{"message":"פרסומות חינם שלא מוסיפות לסרטון"},"category_selfpromo_guideline3":{"message":"לא עבור מוצרים וסחורה בעיצוב תאגידי"},"category_exclusive_access":{"message":"גישה אקסקלוסיבית"},"category_exclusive_access_description":{"message":"רק לתיוג סרטונים שלמים. משמש כאשר סרטון מציג מוצר, שירות או מיקום שהם קיבלו אליהם גישה בחינם או מסובסדת."},"category_exclusive_access_pill":{"message":"סרטון זה מציג מוצר, שירות או מיקום שהוא קיבל גישה חינם או מסובסדת אליו","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"סרטון זה מציג מוצר, שירות או מיקום שהוא קיבל גישה חינם או מסובסדת אליו"},"category_interaction":{"message":"תזכורת למעקב (הירשם כמנוי)"},"category_interaction_description":{"message":"כשיש תזכורת קצרה לעשות לייק, להירשם או לעקוב באמצע התוכן. אם זה ארוך או על משהו ספציפי, זה צריך להיות בקידום עצמי במקום זאת."},"category_interaction_guideline1":{"message":"תזכורות קצרות ללייק, להירשם או לעקוב"},"category_interaction_guideline2":{"message":"כולל תזכורות עקיפות להגיב"},"category_interaction_guideline3":{"message":"לא לקידום כללי, רק קריאות לפעולה"},"category_interaction_short":{"message":"תזכורת לפעולה"},"category_intro":{"message":"אנימציית הפסקה/הקדמה"},"category_intro_description":{"message":"מרווח ללא תוכן ממשי. יכול להיות הפסקה, פריים סטטי, אנימציה חוזרת. אין להשתמש בזה למעברים המכילים מידע."},"category_intro_short":{"message":"הפסקה"},"category_intro_guideline1":{"message":"מרווח ללא תוכן ממשי"},"category_intro_guideline2":{"message":"לא למעברים עם מידע"},"category_outro":{"message":"כרטיסי סיום/קרדיטים"},"category_outro_description":{"message":"קרדיטים או כאשר כרטיסי הסיום של YouTube מופיעים. לא בשביל סיכום עם מידע."},"category_outro_guideline1":{"message":"אל תכלול תוכן, גם אם מופיעים כרטיסי קצה על המסך"},"category_preview_description":{"message":"אוסף קליפים המציגים מה עולה בסרטון זה או סרטונים אחרים בסדרה שבה כל המידע חוזר על עצמו בהמשך הסרטון."},"category_preview_guideline1":{"message":"קליפים שמופיעים מאוחר יותר, או בסרטון עתידי"},"category_preview_guideline2":{"message":"תקציר של סרטון קודם"},"category_preview_guideline3":{"message":"לא לקטעים שמציגים תוכן נוסף"},"category_filler":{"message":"טנג'נטים/בדיחות"},"category_filler_description":{"message":"סצנות או בדיחות טנגנטיות שאינן נדרשות כדי להבין את התוכן העיקרי של הסרטון. זה לא אמור לכלול קטעים המספקים פרטי הקשר או רקע. זוהי קטגוריה מאוד אגרסיבית המיועדת כאשר אתה לא במצב רוח ל\"כיף\"."},"category_filler_short":{"message":"טנגנטים"},"category_filler_guideline1":{"message":"סצנות או בדיחות טנגנטיות"},"category_filler_guideline2":{"message":"הסחות דעת, בלופרים, שידורים חוזרים"},"category_filler_guideline3":{"message":"לא לסצנות הנדרשות כדי להבין את הנושא"},"category_music_offtopic":{"message":"מוזיקה: קטעים ללא מוזיקה"},"category_music_offtopic_description":{"message":"לשימוש רק בסרטוני מוזיקה. יש להשתמש בזה רק עבור קטעים של סרטוני מוזיקה שעדיין אינם מכוסים בקטגוריה אחרת."},"category_music_offtopic_short":{"message":"ללא מוזיקה"},"category_music_offtopic_guideline1":{"message":"סעיפים שאינם במהדורות רשמיות"},"category_music_offtopic_guideline2":{"message":"ללא מוזיקה בהופעה חיה"},"category_poi_highlight":{"message":"קטע חשוב"},"category_poi_highlight_description":{"message":"החלק בסרטון שרוב האנשים מחפשים. בדומה להערות \"הסרטון מתחיל ב-x\"."},"category_poi_highlight_guideline1":{"message":"קטע שרוב האנשים מחפשים"},"category_poi_highlight_guideline2":{"message":"ניתן לדלג על הקשר"},"category_poi_highlight_guideline3":{"message":"ניתן לדלג לכותרת או לתמונה הממוזערת"},"category_chapter":{"message":"פרק"},"category_chapter_description":{"message":"פרקים בשם בהתאמה אישית המתארים קטעים מרכזיים בסרטון."},"category_chapter_guideline1":{"message":"אל תזכיר שמות מותגים נותנים חסות"},"category_chapter_guideline2":{"message":"השתמש בפרקים גדולים יותר עבור קטעים כלליים"},"category_chapter_guideline3":{"message":"ניתן להציב פרקים קטנים יותר בתוך גדולים יותר"},"category_livestream_messages":{"message":"שידור חי: בקשות לתרומה/הודעות"},"category_livestream_messages_short":{"message":"קריאת הודעה"},"autoSkip":{"message":"דילוג אוטומטי"},"manualSkip":{"message":"דילוג ידני"},"showOverlay":{"message":"הצג בשורת חיפוש"},"disable":{"message":"כבוי"},"autoSkip_POI":{"message":"דלג אוטומטית להתחלה"},"manualSkip_POI":{"message":"שאל בעת טעינת וידאו"},"showOverlay_POI":{"message":"הצג בשורת חיפוש"},"showOverlay_full":{"message":"הצגת תוית"},"showOverlay_chapter":{"message":"הצגת פרקים"},"autoSkipOnMusicVideos":{"message":"דלג אוטומטית על כל הקטעים כשיש קטע שאינו מוסיקה"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"דילוג אוטומטי ב-music.youtube.com בלבד"},"muteSegments":{"message":"אפשר קטעי אודיו מושתקים במקום לדלג"},"fullVideoSegments":{"message":"הצג אייקון כאשר הסרטון כולו פרסומת","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"הצג תוויות גם על תמונות ממוזערות וידאו","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"צבע בלתי מוגבל","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"צבע סרגל חיפוש"},"category":{"message":"קטגוריה"},"skipOption":{"message":"אפשרות דילוג","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"אפשר שרת בדיקת בטא"},"whatEnableTestingServer":{"message":"ההגשות וההצבעות שלך לא ישמרו בשרת הראשי. השתמש בזה רק לבדיקה."},"testingServerWarning":{"message":"כל ההגשות וההצבעות לא יחשבו בשרת הראשי מתוך חיבור לשרת הבדיקה. הקפד להשבית זאת כאשר ברצונך לבצע הגשות אמיתיות."},"bracketNow":{"message":"(עכשיו)"},"moreCategories":{"message":"עוד קטגוריות"},"chooseACategory":{"message":"בחירת קטגוריה"},"enableThisCategoryFirst":{"message":"כדי להגיש קטעים עם הקטגוריה של \"{0}\", עליך לאפשר זאת באפשרויות. תופנה לאפשרויות כעת.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"אזהרה: סוג זה של קטע יכול להציג מקסימום פעילות אחת בכל פעם. הגשת מרובה תגרום להצגת אחד אקראי."},"youMustSelectACategory":{"message":"עליך לבחור קטגוריה עבור כל הקטעים שאתה מגיש!"},"bracketStart":{"message":"(התחלה)"},"bracketEnd":{"message":"(סוף)"},"End":{"message":"סוף","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"מוסתר: דירוג שלילי"},"hiddenDueToDuration":{"message":"מוסתר: קצר מדי"},"manuallyHidden":{"message":"מוסתר ידנית"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"מזהה הערוץ עדיין לא נטען. אם אתה משתמש בסרטון מוטמע, נסה להשתמש בדף הבית של יוטיוב במקום זאת. זה יכול להיגרם גם כתוצאה משינויים בעיצוב יוטיוב, אם אתה חושב שזה אפשרי, השאר כאן תגובה:"},"invidiousPermissionRefresh":{"message":"הדפדפן ביטל את ההרשאה הדרושה לתפקוד באתרי אינדיבידואיים ואחרים של צד שלישי. אנא לחץ על הכפתור למטה כדי להפעיל מחדש הרשאה זו."},"acceptPermission":{"message":"אפשר הרשאה"},"permissionRequestSuccess":{"message":"בקשת הרשאה הצליחה!"},"permissionRequestFailed":{"message":"בקשת ההרשאה נכשלה, האם דחייתה את הבקשה?"},"adblockerIssueWhitelist":{"message":"אם אינך מצליח לפתור זאת, השבת את ההגדרה 'כפה בדיקת הערוץ לפני הדילוג', מכיוון חוסם החסויות אינו מסוגל לאחזר את פרטי הערוץ עבור סרטון זה"},"forceChannelCheck":{"message":"כפה בדיקת הערוץ לפני דילוג"},"whatForceChannelCheck":{"message":"כברירת מחדל, נדלג על קטעים מיד לפני שנדע מהו הערוץ. כברירת מחדל, חלק מהקטעים בתחילת הסרטון עשויים לדלג בערוצים שנמצאים ברשימות הלבנות. הפעלת אפשרות זו תמנע זאת, אך לגרום לכל דילוג יש עיכוב קל שכן קבלת הערוץ יכול לקחת זמן מה. עיכוב זה עשוי להיות בלתי מורגש אם יש לך אינטרנט מהיר."},"forceChannelCheckPopup":{"message":"שקול להפעיל \"כפה בדיקת הערוץ לפני דילוג\""},"downvoteDescription":{"message":"זמן שגוי/לא נכון"},"incorrectVote":{"message":"שגוי"},"harmfulVote":{"message":"פוגעני","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"שינוי קטגוריה"},"nonMusicCategoryOnMusic":{"message":"סרטון זה מסווג כמוזיקה. האם אתה בטוח שיש בו נותן חסות? אם זהו למעשה \"קטע שאינו מוסיקה\", פתח את אפשרויות ההרחבה ואפשר קטגוריה זו. לאחר מכן, באפשרותך להגיש את הקטע הזה כ- \"לא מוזיקה\" במקום נותן חסות. אנא קרא את ההנחיות אם אתה בספק."},"multipleSegments":{"message":"מספר מקטעים"},"guidelines":{"message":"הנחיות"},"readTheGuidelines":{"message":"קראו את ההנחיות!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"קטגוריות נמצאות כאן!"},"categoryUpdate2":{"message":"פתח את האפשרויות לדלג על Intros, Outros, Merch וכו '."},"help":{"message":"עזרה"},"GotIt":{"message":"הבנתי","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"זהו קטע גדול. אם הסרטון כולו עוסק בנושא אחד, שנה מ\"דלג\" ל\"ווידיאו מלא\". עיין בהנחיות למידע נוסף."},"categoryPillTitleText":{"message":"הסרטון כולו מסומן כקטגוריה זו ומשולב כדי להיות מסוגל להפריד"},"chapterNameTooltipWarning":{"message":"אחד משמות הפרקים שלך דומה לקטגוריה. עליך להשתמש בקטגוריות במידת האפשר במקום."},"experiementOptOut":{"message":"לא מעוניין להשתתף בניסויים עתידיים","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"הסתרה לעד"},"warningChatInfo":{"message":"שמנו לב שאתה עושה כמה טעויות נפוצות. אנו מעריכים מאוד את העבודה שלך עד כה, אך אנו שואפים לשלמות כאן, כך שאפילו טעויות קטנות מאוד חשובות :)"},"questionButton":{"message":"יש לי שאלה נוספת"},"askAQuestion":{"message":"שאל שאלה"},"warningConfirmButton":{"message":"הבנתי את הסיכונים"},"warningError":{"message":"שגיאה בעת ניסיון לאשר אזהרה:"},"deArrowMessageRecieved":{"message":"קיבלת טיפ מהמנחה"},"Donate":{"message":"תרומה"},"considerDonating":{"message":"עזרו לממן את הפיתוח"},"hideDonationLink":{"message":"הסתרת כפתור תרומה"},"darkModeOptionsPage":{"message":"מצב כהה בדף האפשרויות"},"helpPageThanksForInstalling":{"message":"תודה שהתקנת את ספונסרבלוק."},"helpPageReviewOptions":{"message":"נא לסקור את האפשרויות הבאות"},"helpPageFeatureDisclaimer":{"message":"תכונות רבות כבויות כברירת מחדל. אם אתה רוצה לדלג על פתיחים/סגירים, השתמש ב- Invidious וכו ', הפעל את זה למטה. אתה יכול גם להסתיר/להציג אלמנטים של ממשק משתמש."},"helpPageHowSkippingWorks2":{"message":"בכל פעם שתדלג על קטע, תבחין. אם התזמון נראה לא נכון הצבעה על ידי לחיצה על הדיסלייק! אתה יכול גם להצביע בלייק."},"Submitting":{"message":"שולח"},"helpPageCopyOfDatabase2":{"message":"קוד המקור זמין באופן חופשי ובחינם. אז, אפילו אם משהו יקרה לי, המקטעים שהגשתם לא יאבדו."},"Credits":{"message":"קרדיטים"},"LearnMore":{"message":"למידע נוסף"},"FullDetails":{"message":"פרטים מלאים"},"CopyDownvoteButtonInfo":{"message":"הצבעה שלילית ויצירת עותק מקומי שניתן לשלוח מחדש"},"OpenCategoryWikiPage":{"message":"פתיחת דף הוויקי של קטגוריה זו."},"CopyAndDownvote":{"message":"העתקה ודירוג שלילי"},"ContinueVoting":{"message":"המשך הצבעה"},"ChangeCategoryTooltip":{"message":"זה מיידית ישפיע על כל המקטעים שלך"},"downvote":{"message":"דירוג שלילי"},"upvote":{"message":"דירוג חיובי"},"hideSegment":{"message":"הסתרת מקטע"},"skipSegment":{"message":"דילוג מקטע"},"playChapter":{"message":"הפעלת פרק"},"SponsorTimeEditScrollNewFeature":{"message":"השתמש בגלגלת בזמן שהעכבר מעל הזמן בשלב העריכה על מנת לשנות את הזמן יותר מהר. שילוב של הלחצן Ctrl/Shift יכולים לשנות את מהירות השינוי."},"categoryPillNewFeature":{"message":"חדש! ראה מתי וידאו בשלמותו הוא פרסומת או פרסום עצמי"},"yearAbbreviation":{"message":"y","description":"100y"},"dayAbbreviation":{"message":"י","description":"100d"},"hourAbbreviation":{"message":"ש'","description":"100h"},"optionsTabBehavior":{"message":"התנהגות","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"ממשק","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"קיצורי מקלדת","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"גיבוי/שחזור","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"שונות","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"דילוג על הופעת הודעה","description":"Option label"},"unbind":{"message":"ביטול שיוך","description":"Unbind keyboard shortcut"},"notSet":{"message":"לא הוגדר"},"change":{"message":"שנה"},"youtubeKeybindWarning":{"message":"זה הוא קיצור דרך מובנה ביוטיוב. האם אתה בטוח שאתה רוצה להשתמש בו?"},"betaServerWarning":{"message":"שרת ביטא מופעל!"},"openOptionsPage":{"message":"פתיחת דף האפשרויות"},"resetToDefault":{"message":"איפוס הגדרות לברירת המחדל"},"confirmResetToDefault":{"message":"האם אתה בטוח שברצונך לאפס את כל ההגדרות לערכי ברירת המחדל שלהן? פעולה זו בלתי הפיכה."},"exportSegments":{"message":"ייצוא מקטעים"},"importSegments":{"message":"ייבוא מקטעים"},"Import":{"message":"ייבוא","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"המימוש הצליח!"},"redeemFailed":{"message":"רשיון מפתח שגוי"},"hideUpsells":{"message":"הסתרת אפשרויות שאינן זמינות ללא תשלום נוסף"},"hideNewFeatureUpdates":{"message":"הסתר הנחיות לגבי תכונות חדשות"},"redeem":{"message":"מימוש"},"enterLicenseKey":{"message":"הזנת מפתח רישיון"},"unsubmittedSegmentCounts":{"message":"כרגע יש לך {0} ב-{1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"אין לך כרגע מקטעים שלא הוגשו","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"מקטע שלא הוגש","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"מקטעים שלא הוגשו","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"סרטון","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"סרטונים","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"ניקוי כל המקטעים","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"האם בוודאות ברצונך למחוק את כל המקטעים שלא הוגשוו?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"הצגת מקטעים","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"הסתרת מקטעים","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"מזהה סרטון","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"ספירת מקטעים","description":"Header of the unsubmitted segments list"},"actions":{"message":"פעולות","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"שיתוף כקישור"},"segmentFetchFailureWarning":{"message":"אזהרה: השרת עדיין לא הגיב עם מקטעים. ייתכן שיש קטעים בסרטון הזה שכבר נשלחו אבל פשוט לא קיבלת אותם בגלל בעיות בשרת."},"allowScrollingToEdit":{"message":"אפשר גלילה כדי לערוך זמנים"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - כותרות ותמונות ממוזערות טובות יותר ביוטיוב","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"כותרות ותמונות ממוזערות במיקור המונים יהיו תיאוריות ולא סנסציוניות","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"בחר את התיאורי ביותר"},"Original":{"message":"מקורי"},"OriginalTitle":{"message":"כותרת מקורית"},"CurrentTime":{"message":"זמן נוכחי"},"resetCustomTitle":{"message":"איפוס הכותרת חזרה לטקסט המקורי"},"resetIcon":{"message":"אפס סמל"},"TypeYourOwnTitleHere":{"message":"הקלד כאן את הכותרת שלך"},"VideoNotReady":{"message":"סרטון לא מוכן"},"FailedToRender":{"message":"נכשל בהצגה","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"חסר קנבס","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"חריג בעת רינדור","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"טעינה נכשלה","description":"Thumbnail failed to load"},"titleFormatting":{"message":"פורמט כותרת"},"Disabled":{"message":"כבוי"},"CapitalizeWords":{"message":"מילים באותיות גדולות"},"TitleCase":{"message":"רישיות כל מילה"},"SentenceCase":{"message":"רישיות כל משפט"},"LowerCase":{"message":"אותיות קטנות"},"FirstLetterUppercase":{"message":"אות ראשונה באות גדולה"},"shouldCleanEmojis":{"message":"הסר אימוגים"},"onlyFormatCustomTitles":{"message":"עיצוב רק כותרות שהוגשו על ידי משתמשים"},"onlyTitleCaseInEnglish":{"message":"כתבו מילים באותיות גדולות עבור כותרות שאינן באנגלית"},"onlyTitleCaseInEnglishDescription":{"message":"זיהוי השפה אינו מושלם ומזהה כותרות באנגלית כ- לא באנגלית."},"thumbnailFallbackOption":{"message":"כאשר לא נמצא תמונה ממוזערת שהוגשה"},"whatThumbnailFallbackOption":{"message":"בעת בחירת זמן אקראי, המערכת תשתמש בנתוני SponsorBlock כדי להבטיח שלא ייבחר זמן בקטע קידום מכירות.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"הצג צילום מסך מזמן אקראי"},"TheOriginalThumbnail":{"message":"הצג את התמונה הממוזערת המקורית"},"showABlankBox":{"message":"הצג תיבה ריקה"},"AutoGenerated":{"message":"הצג תמונה ממוזערת שנוצרה אוטומטית על ידי YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"התחלה"},"Middle":{"message":"אמצע"},"keepUnsubmitted":{"message":"אחסן הצבעות שהוגשו"},"showLiveCover":{"message":"הצג אווטאר של הערוץ בסרטונים הקרובים","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"לעולם אל תשתמשו בתמונות ממוזערות שנבדקו על ידי A/B"},"ignoreAbThumbnailsDescription":{"message":"ערוצים יכולים להגדיר בדיקות לסרטונים שלהם שבהן יוטיוב יציג תמונות ממוזערות שונות לכל משתמש. אפשרות זו תמיד תשתמש בתמונות הממוזערות הראשונות כדי לשמור על עקביות."},"abThumbnailsWarning":{"message":"אזהרה: בסרטון זה פועלת כעת בדיקת A/B של תמונה ממוזערת. משמעות הדבר היא שהתמונה הממוזערת עשויה להשתנות לעתים קרובות. כנראה שלא כדאי להצביע לתמונה הממוזערת המקורית עקב סיכון זה."},"whatKeepUnsubmitted":{"message":"שמור את ההצבעות שהוגשו לאחר ההצבעה כדי להציג את הכותרות והתמונות הממוזערות שבחרת במקום הכותרת שהצבעת בהצבעה הגבוהה ביותר בשרת."},"keepUnsubmittedInPrivate":{"message":"אחסן הצבעות שהוגשו מכרטיסיות פרטיות"},"useThumbnailGenerationService":{"message":"השתמש בשירות יצירת תמונות ממוזערות"},"titleMaxLines":{"message":"מקסימום שורות עבור כותרת"},"titleMaxLinesDescription":{"message":"כותרות הסרטונים יתפרסו על פני כל כך הרבה שורות בהצעות."},"thumbnailSaturationLevel":{"message":"רמת הרוויה של תמונות ממוזערות"},"whatSaturateThumbnails":{"message":"הפוך תמונות ממוזערות kפחות תוססות על ידי צמצום הצבע שלהן"},"hideDetailsWhileFetching":{"message":"הסתר פרטים בעת אחזור"},"hideDetailsWhileFetchingDescription":{"message":"הסתר כותרות ותמונות ממוזערות בעת אחזור נתונים מהשרת. אם האפשרות מושבתת, תראה הבהוב כאשר הכותרות והתמונות הממוזערות משתנות."},"ignoreTranslatedTitles":{"message":"אל תציג את הכותרות המתורגמות של YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"יוטיוב לפעמים מתרגמת כותרות באופן אוטומטי לשפת האם שלך. אפשרות זו חלה רק כאשר כותרת שנוצרו על ידי הקהילה אינם זמינות."},"onAllPages":{"message":"בכל הדפים","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"בכל הדפים מלבד דפי וידאו","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"לעולם לא"},"thumbnailGeneratorDescription1":{"message":"שירות יצירת התמונות הממוזערות מאיץ משמעותית את יצירתן על ידי שליחת בקשה אנונימית עם מזהה הווידאו לשרת מרוחק. לאחר מכן, התמונה הממוזערת תיווצר, או תישלף ממטמון אם היא כבר נוצרה."},"thumbnailGeneratorDescription2":{"message":"אם נעשה שימוש בדפי וידאו, פעולה זו עלולה לדלוף מזהי וידאו לא רשומים לשרת זה. הגדרת אפשרות זו ל\"בכל הדפים למעט דפי וידאו\" תמנע בעיה זו. אפשרות נוספת היא לארח שירות יצירת תמונות ממוזערות משלך."},"thumbnailGeneratorDescription3":{"message":"אם השימוש בשירות יצירת תמונות ממוזערות מושבת, כל הבקשות ישתמשו במערכת שאילתות k-anonymity, מה שמקשה על השרת לחזות אילו סרטונים נלקחו, וייעשה שימוש בשירות יצירת תמונות ממוזערות מקומי איטי יותר.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"קוד מקור של שירות יצירת תמונות ממוזערות"},"moreAboutKAnonymity":{"message":"עוד אודות אנונימיות K","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"הצג תמיד את כפתור \"הצג מקור\""},"whatAlwaysShowShowOriginalButton":{"message":"אם ברצונך לדעת תמיד אם כותרת/תמונה ממוזערת השתנתה, הפעל אפשרות זו."},"showOriginalOnHover":{"message":"החלפה בין פרטים מותאמים אישית לפרטים מקוריים בעת העכבר"},"showOriginalOnHoverOfVideo":{"message":"החלף בין פרטים מותאמים אישית לפרטים מקוריים על ידי העברת העכבר מעל מקום כלשהו בכרטיס המסך"},"showOriginalOnHoverOfVideoDescription":{"message":"פעולה זו תשבית את ההפעלה האוטומטית בעת ריחוף"},"showCustomOnHoverIfCasual":{"message":"הצג כותרת מותאמת אישית בעת ריחוף אם מוצגת כותרת במצב קז'ואל"},"showIconForFormattedTitles":{"message":"הצג כפתור \"הצג מקור\" עבור כותרות בעיצוב אוטומטי"},"Enable":{"message":"אפשר"},"Titles":{"message":"כותרות","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"תמונה ממוזערת","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"הצבעות אקראיות","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"שגיאה"},"ShowOriginal":{"message":"הצג פרטים מקוריים"},"ShowModified":{"message":"הצג פרטים ערוכים"},"ShowFormatted":{"message":"הצג פרטים מעוצבים"},"FillerWarning":{"message":"אזהרה: זו קטגוריה אגרסיבית מאוד. סביר להניח שתצטרך לבטל דברים, או להשבית אותם לפעמים. היזהרו כי סרטונים רבים מדלגים על 50% או יותר מהסרטון! עם זאת, זכור כי עדיין יש הנחיות ספציפיות שיש לעקוב בעת הגשתם.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"הצטרף ל- דיסקורד או מטריקס כדי להישאר בצ'אט זה לתמיד","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"הצג עזרה בהנחיות","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"הימנע מהבעות פנים מוגזמות","description":"Referring to the thumbnail of a video"},"tip2":{"message":"חשבו על כל התמונה, אל תענו רק על שאלת הכותרת המקורית","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"הימנע מתיאור תגובות לסרטון (\"מזעזע\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"ספק מספיק מידע כדי לבחור בחירה מושכלת לפני לחיצה"},"tip5":{"message":"לנצל את זה כמו משפט","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"בדוק את כל ההנחיות להגשה","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"הכותרת שלי בקפיטלייז כמו משפט","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"הכותרת שלי לא עונה רק על שאלה המוצגת בכותרת","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"כותרות צריכות לתאר את הסרטון, או את הסיפור בכלל. עליכם לדאוג לצפות בסרטון המלא כדי לדעת על מה הוא בפועל במקום להסתמך על כותרת מקורית מסקרנת.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"הכותרת שלי לא מסכמת מסקנה או הורסת שלא לצורך","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"כותרות לא נועדו להחליף את הצפייה בסרטון לחלוטין, אלא במקום זאת נועדו להבין אם ברצונך לצפות או לא.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"הכותרת שלי אינה בודקת, לועג או מבקרת את הסרטון או את היוצר","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"כותרות נועדו להיות מנקודת המבט של היוצר והסרטון. דירוג או בדיקת עובדות של הסרטון עצמו הוא מחוץ להיקף של Dearrow. כותרות לא נועדו כקטע תגובות.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"מילה מזוהה: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"אין להשתמש בפעלים מיותרים בתחילת הכותרת","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"התחילו את כל הכותרות באות גדולה. יש לעצב את הכותרות כמשפט","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"כותרות לא יכולות להסתיים ב- '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"אל תוסיפו רק תשובה לשאלה בכותרת המקורית. כותרות צריכות לתאר את הסרטון, או את הסיפור באופן כללי","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"אין לבדוק עובדות, ללעוג או לבקר את הסרטון או את היוצר בכותרות","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"כותרות לא צריכות להימנע מאלמנטים סנסציוניים מהכותרת המקורית","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"כותרות לא יכולות להכיל אימוג'ים","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"עליך לתקן את האזהרה לפני השליחה"},"dearrowHelpSponsorBlockImported":{"message":"הערה: הגדרות SponsorBlock שלך יובאו אוטומטית!"},"howItWorks":{"message":"איך זה עובד"},"discordPromotion":{"message":"בואו לתרום, להציע הצעות ולעזור ב-{discord} או ב-{matrix}"},"deArrowDonationText":{"message":"אם אהבתם את מה שעשיתי עד כה, ורוצים לעזור לי עם כסף, הנה קישור"},"termsAgreement":{"message":"על ידי שימוש בתוסף זה, הנך מסכים ל-{privacy-policy} ול-{terms}"},"privacyPolicy":{"message":"מדיניות פרטיות"},"termsOfUse":{"message":"תנאי שימוש"},"openSourceLicenses":{"message":"רישיונות קוד פתוח"},"defaultToOriginals":{"message":"ברירת מחדל למידע וידאו מקורי"},"whatDefaultToOriginals":{"message":"הצג את הכותרת והתמונות הממוזערות המקוריות כברירת מחדל, אך השתמש בכפתור שמופיע בעת ריחוף כדי לראות את הכותרות והתמונות הממוזערות המותאמות אישית."},"replaceTitles":{"message":"החלף כותרות"},"replaceThumbnails":{"message":"החלף תמונות ממוזערות"},"useCrowdsourcedTitles":{"message":"השתמש בכותרות מבוססות על מיקור המונים"},"whatUseCrowdsourcedTitles":{"message":"אם כבוי, הכותרות יעוצבו אך לא נשתמש בכותרות שהוגשו על ידי הקהילה","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"האם אתה בטוח שברצונך למחוק תצורה זו?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"תצורה חדשה"},"DeleteConfiguration":{"message":"מחק תצורה"},"ChannelAllowlist":{"message":"הגדרות ערוץ ספציפיות"},"ConfigurationName":{"message":"שם תצורה"},"ChannelListInstructions":{"message":"הזן את כל הערוצים שברצונך להחיל עליהם תצורה זו בתיבה למטה, מופרדים על ידי שורות חדשות. גם מזהי ערוצים וגם שמות תצוגה נתמכים. שמות משתמש @ אינם נתמכים. ניתן לקבל מזהי ערוצים על ידי לחיצה על כפתור השיתוף בדף 'אודות' של הערוץ. כדי להגיע לדף 'אודות', לחץ על תיאור הערוץ שמופיע מתחת לשם הערוץ בדף הערוץ.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"עדיין לא הוגדרו תצורות. לחץ על הכפתור בחלק העליון כדי להוסיף תצורה חדשה.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"עצור את הקליקבייט על ידי החלפת כותרות ותמונות ממוזערות בכותרות מדויקות יותר"},"DeArrowPromotionMessage2":{"message":"נמאס לך מקליקבייט? בדוק את התוסף החדש שלי לשיפור כותרות ותמונות ממוזערות"},"DeArrowPromotionMessage3":{"message":"בדוק גם את DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"לא מוצא חן בעיניך? אם אתה מעדיף את הכותרת למטה, שקול לבדוק את תכונת החלפת הכותרת ב-DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"תמונה ממוזערת זו נבחרה מחותמת זמן אקראית מכיוון שעדיין לא הוגש סרטון זה","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"תמונה ממוזערת זו נבחרה מתוך חותמת זמן אקראית והכותרת מעוצבת אוטומטית מכיוון שעדיין לא הוגש סרטון זה","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"ניתן לשנות את ברירת המחדל הזו למטה","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"כותרות {titles} ותמונות ממוזערות {thumbnails} הוחלפו מאז שהתקנת תוסף זה","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} כותרת ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} כותרות ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"ותמונה ממוזערת של {thumbnails}","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"ותמונות ממוזערות של {thumbnails}","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} הוחלפו מאז שהתקנת תוסף זה","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"ספירת כותרות והחלפות תמונות ממוזערות"},"countReplacementsDescription":{"message":"משמש כדי להציג לך סטטיסטיקות בחלון קופץ.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"הוסף רשימת סינון לחסימת סקרים, מדפי מוצרים ואלמנטים אחרים של דפי קידום מכירות באמצעות yt-neuter"},"requiresUblock":{"message":"דורש Origin uBlock"},"videoIDWrongWhenSubmittingError":{"message":"משהו השתבש בזיהוי מזהה הווידאו. נא לנסות לרענן לפני השליחה כדי לוודא שהיא נשלחת עבור הסרטון הנכון. אם זה קורה הרבה, אנא שלח דיווח על כך יחד עם הרחבות אחרות או סקריפטים מותקנים דרך גיטהאב, דיסקורד או מטריקס."},"dearrowLogoCredit":{"message":"לוגו מבוסס על Twemoji ברישיון CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock אינו תואם לתוסף \"Zoom to Fill\". ישנן חלופות רבות בהן ניתן להשתמש במקום זאת שיעבדו כראוי."},"freeTrialStarted":{"message":"תקופת הניסיון החינמית שלך החלה בהצלחה. בקר ביוטיוב כדי לנסות אותה"},"freeTrialEnded":{"message":"תקופת הנסיון של הסתיימה"},"freeTrialPrompt":{"message":"אם אתה רוצה לנסות את זה, תוכל להתחיל תקופת ניסיון בחינם באמצעות הכפתור למטה."},"startFreeTrial":{"message":"התחל תקופת ניסיון חינם"},"freeAccessRequested":{"message":"נרשמת בהצלחה לגישה חופשית. תקבל הודעה כאשר תינתן גישה חופשית."},"freeAccessComplete":{"message":"מזל טוב! כעת יש לך גישה חינמית ל-DeArrow"},"DeArrowNotActivated":{"message":"DeArrow אינו מופעל"},"ActivateDeArrow":{"message":"הפעל DeArrow"},"DeArrowIsActivated":{"message":"DeArrow הופעל בהצלחה"},"Close":{"message":"סגור"},"ViewLicenseKey":{"message":"הצג פתח רישיון"},"SharingIsCaring":{"message":"שיתוף הוא אכפתיות"},"cleanPopup":{"message":"הסתר פריטים מיותרים בחלון רשימת המקטעים"},"syncDisabledWarning":{"message":"אזהרה: אחסון התוספים הושבת בדפדפן שלך. הגדרות לא יישמרו אם תנסה לשמור אותן."},"syncDisabledWarningDeArrow":{"message":"DeArrow לא יפעל ללא אחסון."},"syncDisabledFirefoxSuggestions":{"message":"ניתן להפעיל זאת על ידי מעבר אל about:config והגדרת הערך \"webextensions.storage.sync.enabled\" ל-true."},"storageFull":{"message":"שטח האחסון של התוסף מלא. אנא מחק קטעים שלא הוגשו מהאפשרויות."},"previewSegmentRequired":{"message":"אנא הצג תצוגה מקדימה של הקטעים שלך לפני שליחתם. ניתן לעשות זאת על ידי לחיצה על כפתור התצוגה המקדימה או באמצעות קיצור הדרך הבא:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"לפעול כ-VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"לא ניתן לקבל הגשות מהדפדפן שלך כרגע מכיוון שנראה שיוטיוב הכניס כמה פרסומות בצד השרת שהתוסף לא מצליח להסיר. אנא צור קשר אם אתה מקבל שגיאה זו."},"DeArrowIsDisabled":{"message":"DeArrow כבוי - לחץ כדי להפעיל","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"האם אתה בטוח שתמונה ממוזערת מקורית זו עומדת בהנחיות של DeArrow? אם אתה מעדיף לראות תמונות ממוזערות מקוריות באופן כללי, שקול לשנות את האפשרות \"כאשר לא קיימת תמונה ממוזערת שהוגש\" בהגדרות DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"ב-YouTube TV, SponsorBlock אינו תואם לתוכן בשידור חי ותוכן שהוקלט לאחרונה. אם מדובר בהקלטה עדכנית, אנא המתן מספר שעות עד שהגרסה המעובדת של ההקלטה תהיה זמינה.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"הוספה לרשימת היתרים של ערוצים אינה נתמכת ב-tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"אהבת את הכותרת המקורית?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"כן"},"No":{"message":"לא"},"votes":{"message":"{0} הצבעות","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} הצבעה","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"מצחיק","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"יצירתי","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"חכמות","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"תיאורי","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"אחר","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"מצב קלאסי","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"כותרות מוחלפות בפורמטים סטנדרטיים המבוססים על ההנחיות בכל הסרטונים שבהם קיים כותרת של מיקור המונים."},"CasualMode":{"message":"מצב מזדמן","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"שמור על כותרות מקוריות כאשר הן מתארות את הסרטון מספיק טוב והן חכמות או מצחיקות. בחרו אילו קטגוריות של כותרות תרצו לראות. תוכלו להצביע אם כותרת מתאימה לקטגוריה או לא."},"minimumVotes":{"message":"מינימום הצבעות","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"הצג תמונה ממוזערת מקורית בסרטונים שהצבעתם הוגשה במצב אורח","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"תכונה חדשה: מצב מזדמן","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"הצג סמל מצב מזדמן רק כאשר כותרת מותאמת אישית זמינה"},"OpenSettings":{"message":"פתח הגדרות"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/hi/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/hi/messages.json @@ -0,0 +1 @@ +{"400":{"message":"सर्वर ने कहा कि यह अनुरोध अमान्य था"},"409":{"message":"यह पहले भी प्रस्तुत किया जा चुका है"},"fullName":{"message":"YouTube के लिए SponsorBlock - प्रायोजन छोड़ें","description":"Name of the extension."},"Description":{"message":"YouTube वीडियो पर प्रायोजन, सदस्यता भीख और अधिक छोड़ें। दूसरों के समय को बचाने के लिए आपके द्वारा देखे जाने वाले वीडियो पर प्रायोजकों की रिपोर्ट करें।","description":"Description of the extension."},"channelWhitelisted":{"message":"चैनल श्वेतसूची में!"},"Segment":{"message":"खंड"},"Segments":{"message":"खंडों"},"SegmentsCap":{"message":"खंड"},"Chapters":{"message":"चैप्टर"},"renderAsChapters":{"message":"खंडो को चैप्टर के रूप में दिखाएँ","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"वीडियो समय के अलावा वर्तमान खंड दिखाएँ"},"upvoteButtonInfo":{"message":"इस प्रस्तुतीकरण को वॉट दें"},"reportButtonTitle":{"message":"रिपोर्ट"},"reportButtonInfo":{"message":"इस प्रस्तुतीकरण को गलत रिपोर्ट करें"},"Dismiss":{"message":"रद्द करें"},"Loading":{"message":"लोड कर रहा है..."},"Hide":{"message":"कभी नही दिखाएँ"},"hitGoBack":{"message":"जहाँ से आप आये थी वहां पर जाने के लिए अनस्किप दबाएं।"},"unskip":{"message":"अनस्किप"},"reskip":{"message":"रिस्किप"},"unmute":{"message":"अनम्यूट"},"paused":{"message":"रुका हुआ"},"manualPaused":{"message":"टाइम रुका"},"confirmMSG":{"message":"अलग-अलग मानों को संपादित करने या हटाने के लिए, जानकारी बटन पर क्लिक करें या ऊपरी दाएं कोने में एक्सटेंशन आइकन पर क्लिक करके एक्सटेंशन पॉपअप खोलें।"},"clearThis":{"message":"क्या आप वाकई इसे साफ़ करना चाहते हैं?\n\n"},"Unknown":{"message":"आपका प्रायोजक समय सबमिट करने में एक त्रुटि हुई, कृपया बाद में पुन: प्रयास करें।"},"sponsorFound":{"message":"इस वीडियो के खंड डेटाबेस में हैं!"},"sponsor404":{"message":"कोई खंड नहीं मिले"},"sponsorStart":{"message":"खंड अभी शुरू करें"},"sponsorEnd":{"message":"खंड अब समाप्त होता है"},"sponsorCancel":{"message":"खंड बनाना रद्द करें"},"noVideoID":{"message":"कोई YouTube वीडियो नही मिली।\nअगर यह गलत है, तो इस तब को रिफ्रेश कीजिये।"},"refreshSegments":{"message":"खंड रिफ्रेश करें"},"success":{"message":"सफल!"},"voted":{"message":"वॉट किया!"},"serverDown":{"message":"ऐसा लगता है की सर्वर डाउन है। कृपया डेवलपर से तुरंत संपर्क करें।"},"connectionError":{"message":"एक संपर्क गलती हो गयी है। गलती कूट: "},"clearTimes":{"message":"खंड हटाएँ"},"openPopup":{"message":"SponsorBlock पॉपअप खोलें"},"closePopup":{"message":"पॉपअप बंद करें"},"closeIcon":{"message":"आइकॉन बंद करें"},"sortSegments":{"message":"खंड छांटें"},"submitCheck":{"message":"क्या आप वाकई इसे दर्ज करना चाहते हैं?"},"whitelistChannel":{"message":"चैनल व्हाइटलिस्ट करें"},"removeFromWhitelist":{"message":"चैनल को व्हाइटलिस्ट से हटाएँ"},"voteOnTime":{"message":"एक खंड को वॉट करें"},"Submissions":{"message":"प्रविष्टियां"},"savedPeopleFrom":{"message":"आपने लोगो को बचाया है "},"viewLeaderboard":{"message":"लीडरबोर्ड"},"recordTimesDescription":{"message":"दर्ज करें"},"submissionEditHint":{"message":"सबमिट पर क्लिक करने के बाद अनुभाग सम्पादन दिखाई देगा","description":"Appears in the popup to inform them that editing has been moved to the video player."},"Options":{"message":"विकल्प"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/hr/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/hr/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Veza istekla. Provjerite svoju internetski vezu. Ako vaš internet radi, poslužitelj je vjerojatno preopterećen ili nedostupan."},"400":{"message":"Server je rekao da je zahtjev neispravan"},"409":{"message":"Ovo je već unešeno prije"},"502":{"message":"Čini se da je poslužitelj preopterećen. Pokušajte ponovno za nekoliko sekundi."},"fullName":{"message":"SponsorBlock za YouTube - preskoči sponzore","description":"Name of the extension."},"Description":{"message":"Preskoči sponzore, zamolbe za pretplatu i drugo na YouTube videima. Prijavi sponzore na videima koje gledaš kako bi uštedio drugima vrijeme.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanal je dodan na popis dopuštenih!"},"Segment":{"message":"odsječak"},"Segments":{"message":"odsječci"},"SegmentsCap":{"message":"Segmenti"},"Chapters":{"message":"Poglavlja"},"renderAsChapters":{"message":"Prikaži segmente kao poglavlja","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"upvoteButtonInfo":{"message":"Glasaj za ovaj unos"},"reportButtonTitle":{"message":"Prijavi"},"reportButtonInfo":{"message":"Prijavi unos kao nesipravan."},"Dismiss":{"message":"Odbaci"},"Loading":{"message":"Učitavanje..."},"Hide":{"message":"Nikad ne prikazuj"},"hitGoBack":{"message":"Klikni unskip kako bi se vratio otkuda si došao."},"unskip":{"message":"Ne preskači"},"reskip":{"message":"Preskoči opet"},"unmute":{"message":"Uključi zvuk"},"paused":{"message":"Pauzirano"},"manualPaused":{"message":"Timer zaustavljen"},"confirmMSG":{"message":"Kako bi uredio ili obrisao pojedinačne vrijednosti, klikni na gumb info ili otvori okvir dodatka klikom na ikonu dodatka u gornjem desnom kutu."},"clearThis":{"message":"Jesi li siguran da želiš očistiti ovo?\n\n"},"Unknown":{"message":"Dogodila se pogreška pri unošenju tvojih vremena sponzora, molim te probaj ponovno kasnije."},"sponsorFound":{"message":"Ovaj video ima isječke u bazi podataka!"},"sponsor404":{"message":"Nije pronađen isječak"},"sponsorStart":{"message":"Isječak započinje sada"},"sponsorEnd":{"message":"Isječak završava sada"},"sponsorCancel":{"message":"Otkaži Kreiranje Segmenta"},"noVideoID":{"message":"Nijedan YouTube video nije pronađen.\nAko ovo nije točno, osvježite karticu."},"refreshSegments":{"message":"Osvježi segmente"},"success":{"message":"Uspjeh!"},"voted":{"message":"Glas podnešen!"},"serverDown":{"message":"Čini se da server ne radi. Kontaktiraj razvojne programere odmah."},"connectionError":{"message":"Dogodija se greška u povezivanju. Kod pogreške: "},"segmentsStillLoading":{"message":"Segmenti se učitavaju..."},"clearTimes":{"message":"Očisti isječke"},"openPopup":{"message":"Otvori okvir SponsorBlock"},"closePopup":{"message":"Zatvori izbornik"},"closeIcon":{"message":"Ikona za zatvaranje"},"OpenSubmissionMenu":{"message":"Otvori preglednik prijava"},"sortSegments":{"message":"Razvrstaj segmente"},"submitCheck":{"message":"Jesi li siguran da želiš unijeti ovo?"},"whitelistChannel":{"message":"Dopusti kanal"},"removeFromWhitelist":{"message":"Izbaci kanal iz bijele liste"},"voteOnTime":{"message":"Glasaj za isječak"},"Submissions":{"message":"Prijava"},"savedPeopleFrom":{"message":"Spasili ste ljude od "},"viewLeaderboard":{"message":"Rang-lista"},"recordTimesDescription":{"message":"Pošalji"},"submissionEditHint":{"message":"Uređivanje dijela prikazat će se nakon što pritisneš gumb za slanje","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Savjet: Možete namjestiti tipke za podnošenje u opcijama"},"clearTimesButton":{"message":"Očisti vremena"},"Username":{"message":"Korisničko ime"},"setUsername":{"message":"Postavi korisničko ime"},"copyPublicID":{"message":"Kopiraj javni UserID"},"copySegmentID":{"message":"Kopiraj ID segmenta"},"hideThis":{"message":"Sakrij ovo"},"Options":{"message":"Opcije"},"showButtons":{"message":"Prikaži gumbe na YouTube Playeru"},"hideButtonsDescription":{"message":"Ovo skriva gumbe koji se pojavljuju na YouTube playeru za slanje odsječaka za preskakanje."},"showSkipButton":{"message":"Zadržite gumb za preskakanje i označavanje na playeru"},"showInfoButton":{"message":"Prikaži gumb za informacije na YouTube Playeru"},"autoHideInfoButton":{"message":"Automatski sakrij info gumb"},"showDeleteButton":{"message":"Pokaži gumb za brisanje na YouTube sviraču"},"enableViewTracking":{"message":"Omogući brojanje preskakanja"},"whatViewTracking":{"message":"Ova značajka prati koje dijelove ste preskočili, kako bi korisnicima dali doznanja koliko je njihova prijava pomogla drugima, koristi se kao mjerni podatak zajedni s goreglasom, kako bi se osiguralo da spam ne ulazi u bazu podataka. Proširenje šalje poruku poslužitelju svaki put kada preskočite dio. Nadamo se da puno ljudi neće mijenjati ovu postavku, kako bi broj pregleda bio točan. :)"},"enableViewTrackingInPrivate":{"message":"Omogući praćenje broja preskakanja u Privatnim/Incognito karticama"},"enableTrackDownvotes":{"message":"Spremi glasanja protiv segmenta"},"whatTrackDownvotes":{"message":"Svako glasanje protiv segmenta će ostati skriveno čak i nakon aktualiziranja prikaza"},"trackDownvotesWarning":{"message":"Upozorenje: Onemogućavanjem ovoga izbrisati će svi prijašnje spremljeni doljeglasovi"},"enableTrackDownvotesInPrivate":{"message":"Spremi glasanja protiv segmenta u privatne/inkognito kartice"},"enableQueryByHashPrefix":{"message":"Upit po prefiksu kontrolnog identifikacijskog broja"},"whatQueryByHashPrefix":{"message":"Umjesto zahtijeva za segmentima s poslužitelja koristeći videoID, prva 4 znaka sigurnosnog kontrolnog broja video ID-a su poslani. Taj poslužitelj poslat će nazad podatke za sva videa sa sličnim sigurnosnim kontrolnim brojevima."},"showNotice":{"message":"Prikaži napomenu opet"},"showSkipNotice":{"message":"Pokaži obavijest nakon preskakanja isječka"},"showCategoryGuidelines":{"message":"Prikaži pomoć za kategorije"},"website":{"message":"Web-stranica","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Izvorni kod","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Napomena je nadograđena!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Ako ti se i dalje ne sviđa, pritisni gumb „Nikad ne prikazuj”.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Preskoči segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Pokreni/prekini segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Otvori preglednik prijava","description":"Keybind label"},"setSubmitKeybind":{"message":"Pošalji segmente","description":"Keybind label"},"setPreviewKeybind":{"message":"Pregledaj segment","description":"Keybind label"},"nextChapterKeybind":{"message":"Sljedeće poglavlje","description":"Keybind label"},"previousChapterKeybind":{"message":"Prethodno poglavlje","description":"Keybind label"},"keybindDescription":{"message":"Odaberi tipku upisom tipke i odaberi modifikatorske tipke koje želiš koristiti."},"disableSkipping":{"message":"Preskakanje je aktivirano"},"enableSkipping":{"message":"Preskakanje je deaktivirano"},"yourWork":{"message":"Tvoja slanja","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Kȏd greške: "},"skip":{"message":"Preskoči"},"mute":{"message":"Isključi zvuk"},"full":{"message":"Cijeli video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Preskočiti {0}?"},"mute_category":{"message":"Utišati {0}?"},"skip_to_category":{"message":"Preskočiti na {0}?","description":"Used for skipping to things (Skip to Highlight)"},"skipped":{"message":"Preskočeno: {0}","description":"Example: Sponsor Skipped"},"muted":{"message":"Isključen zvuk: {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Preskočeno na {0}","description":"Used for skipping to things (Skipped to Highlight)"},"disableAutoSkip":{"message":"Deaktiviraj automatsko preskakanje"},"enableAutoSkip":{"message":"Aktiviraj automatsko preskakanje"},"audioNotification":{"message":"Zvučna obavijest pri preskakanju"},"audioNotificationDescription":{"message":"Zvučna obavijest o preskakanju reproducirat će zvuk kad god se segment preskoči. Ako je deaktivirano (ili je automatsko preskakanje deaktivirano), zvuk se neće reproducirati."},"youHaveSkipped":{"message":"Do sad ste preskočili "},"minLower":{"message":"min"},"minsLower":{"message":"min"},"hourLower":{"message":"h"},"hoursLower":{"message":"h"},"youHaveSavedTime":{"message":"Spasio/la si ljude od","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" njihova života","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Provjerite status.sponsor.ajay.app za status poslužitelja."},"changeUserID":{"message":"Uvezi/Izvezi svoj privatni UserID"},"setUserID":{"message":"Postavi Privatni UserID"},"createdBy":{"message":"Izradio"},"supportedSites":{"message":"Podržane stranice: "},"optionsInfo":{"message":"Omogući podržavanje Invidiousa, onemogući automatsko preskakanje, sakrij gumbe i drugo."},"add":{"message":"Dodaj"},"addInvidiousInstanceError":{"message":"Ova domena je neispravna. Trebaš unijeti SAMO domenu. Primjer: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Resetiraj popis instanci Invidiousa"},"resetInvidiousInstanceAlert":{"message":"Upravo ćeš resetirati popis instanci Invidiousa"},"currentInstances":{"message":"Trenutne instance:"},"minDuration":{"message":"Minimalno trajanje (u sekundama):"},"minDurationDescription":{"message":"Isječci kraći od postavljene vrijednosti neće biti preskočeni ili prikazani u playeru."},"enableManualSkipOnFullVideo":{"message":"Koristi ručno preskakanje kad postoji etiketa za potuni video"},"whatManualSkipOnFullVideo":{"message":"Za osobe koji žele gledati video bez prekida ako je u potpunosti sponzoriran ili samopromocija."},"skipNoticeDuration":{"message":"Duljina trajanja obavijesti o preskakanju (sekunde):"},"skipNoticeDurationDescription":{"message":"Obavijest o preskakanju ostat će na zaslonu barem ovoliko dugo. Za ručno preskakanje može biti duže vidljivo."},"showUploadButton":{"message":"Prikaži gumb za prijenos"},"customServerAddress":{"message":"Adresa SponsorBlock poslužitelja"},"dataFetchingServerAddress":{"message":"Adresa poslužitelja za preuzimanje podataka"},"dataFetchingServerAddressDescription":{"message":"Adresa koja se koristi za upućivanje poziva poslužitelju za preuzimanje podataka.\nUkoliko nemaš vlastitu instancu poslužitelja, ovo nemoj mijenjati."},"save":{"message":"Spremi"},"reset":{"message":"Resetiraj"},"mobileUpdateInfo":{"message":"Sada se podržava m.youtube.com"},"exportOptions":{"message":"Uvezi/Izvezi sve postavke"},"exportOptionsCopy":{"message":"Uredi/kopiraj"},"exportOptionsDownload":{"message":"Spremi u datoteku"},"exportOptionsUpload":{"message":"Učitaj iz datoteke"},"setOptions":{"message":"Postavi opcije"},"incorrectlyFormattedOptions":{"message":"Ovaj JSON nije ispravno formatiran. Tvoje opcije nisu promijenjene."},"confirmNoticeTitle":{"message":"Pošalji segment"},"submit":{"message":"Pošalji"},"cancel":{"message":"Odustani"},"delete":{"message":"Izbriši"},"preview":{"message":"Pregledaj"},"unsubmitted":{"message":"Neposlano"},"inspect":{"message":"Provjeri"},"edit":{"message":"Uredi"},"copyDebugLogs":{"message":"Kopiraj zapisnike o otklanjanju grešaka"},"copyDebugInformation":{"message":"Kopiraj Informaciju Za Otklanjanje Pogrešaka U Međuspremnik"},"copyDebugInformationFailed":{"message":"Pisanje u međuspremnik nije uspjelo"},"copyDebugInformationOptions":{"message":"Kopira informacije u međuspremnik koje treba dati razvojnom programeru kada otkrije grešku / kada to programer zatraži. Osjetljive informacije kao što su vaš korisnički ID, kanali s popisa dopuštenih i prilagođena adresa poslužitelja uklonjeni su. Međutim, sadrži informacije kao što su vaš korisnički agent, preglednik, operativni sustav i broj verzije proširenja. "},"to":{"message":"do","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Kopirano!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Uključi glatke prijelaze"},"generic_guideline2":{"message":"Reproducira kao da ništa nije preskočeno"},"category_sponsor":{"message":"Sponzor"},"category_sponsor_description":{"message":"Plaćene promocije, plaćene preporuke i izravne reklame. Nije za samopromociju ili besplatno pozivanje na događaje/kreatore/web stranice/proizvode koji im se sviđaju."},"category_sponsor_guideline1":{"message":"Plaćeni oglasi"},"category_sponsor_guideline2":{"message":"Ne za donacije ili proizvode"},"category_selfpromo":{"message":"Neplaćena promocija ili samopromocija"},"category_selfpromo_description":{"message":"Slično kao „sponzor”, osim za neplaćenu promociju i samopromociju. To uključuje odlomke marketinga, donacija ili informacija o tome, s kim su surađivali."},"category_selfpromo_guideline1":{"message":"Donacije, članarine i roba"},"category_exclusive_access":{"message":"Eksluzivni pristup"},"category_exclusive_access_description":{"message":"Samo za označavanje cijelih videa. Koristi se kad video prikazuje proizvod, uslugu ili lokaciju za koje su dobili besplatan ili subvencionirani pristup."},"category_interaction":{"message":"Podsjetnik interakcije (Pretplati se)"},"category_interaction_short":{"message":"Podsjetnik interakcije"},"category_intro":{"message":"Stanka/Uvodna animacija"},"category_intro_description":{"message":"Interval bez stvarnog sadržaja. Može biti stanka, statični kadar, ponavljajuća animacija. Ovo se ne bi trebalo koristiti za prijelaze koji sadrže informacije."},"category_intro_short":{"message":"Stanka"},"category_intro_guideline1":{"message":"Interval bez stvarnog sadržaja"},"category_outro":{"message":"Završni kadrovi/Zasluge"},"category_preview_description":{"message":"Zbirka isječaka koji pokazuju što dolazi u ovom videu ili drugim videima u nizu gdje se sve informacije kasnije ponavljaju u videu."},"category_music_offtopic":{"message":"Glazba: Ne-glazbeni dio"},"category_music_offtopic_description":{"message":"Samo za videospotove. Ovo bi se trebalo koristiti samo za dijelove videospotova koji još nisu obuhvaćeni drugom kategorijom."},"category_music_offtopic_short":{"message":"Ne-glazbeni"},"category_poi_highlight":{"message":"Istaknuto"},"category_chapter":{"message":"Poglavlje"},"category_chapter_description":{"message":"Prilagođeno imenovana poglavlja koja opisuju glavne dijelove videa."},"category_chapter_guideline1":{"message":"Ne spominji imena brendova sponzora"},"category_chapter_guideline2":{"message":"Koristi veća poglavlja za opće dijelove"},"category_chapter_guideline3":{"message":"Manja poglavlja se mogu smjestiti unutar većih"},"category_livestream_messages":{"message":"Livestream: čitanje donacija/poruka"},"category_livestream_messages_short":{"message":"Čitanje poruka"},"autoSkip":{"message":"Automatsko preskakanje"},"manualSkip":{"message":"Ručno preskakanje"},"disable":{"message":"Deaktiviraj"},"autoSkip_POI":{"message":"Automatski skoči na početak"},"manualSkip_POI":{"message":"Pitaj kad se učitava video"},"showOverlay_full":{"message":"Prikaži oznaku"},"showOverlay_chapter":{"message":"Prikaži poglavlja"},"muteSegments":{"message":"Dopustite segmente koji isključuju zvuk umjesto da ga preskaču"},"previewColor":{"message":"Boja neposlanog","description":"Referring to submissions that have not been sent to the server yet."},"category":{"message":"Kategorija"},"skipOption":{"message":"Preskoči opciju","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"Omogućite poslužitelj za beta testiranje"},"testingServerWarning":{"message":"Svi podnesci i glasovi NEĆE BROJATI u glavnom poslužitelju dok se povezuješ s testnim poslužiteljem. Obavezno deaktiviraj ovo kada želiš slati podneske."},"bracketNow":{"message":"(sada)"},"moreCategories":{"message":"Više kategorija"},"chooseACategory":{"message":"Odaberi kategoriju"},"enableThisCategoryFirst":{"message":"Za slanje segmenata kategorije „{0}”, moraš je aktivirati u postavkama. Sada ćemo te preusmjeriti na postavke.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"youMustSelectACategory":{"message":"Moraš odabrati kategoriju za sve segmente koje šalješ!"},"bracketStart":{"message":"(Početak)"},"bracketEnd":{"message":"(kraj)"},"End":{"message":"Kraj","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"skriveno: glasaj protiv"},"hiddenDueToDuration":{"message":"sakriveno: redak je prekratak"},"manuallyHidden":{"message":"ručno skriveno"},"invidiousPermissionRefresh":{"message":"Preglednik je opozvao dopuštenje potrebno za funkcioniranje na Invidiousu i drugim stranicama trećih strana. Pritisni donji gumb za ponovno aktiviranje ove dozvole."},"acceptPermission":{"message":"Prihvati dozvolu"},"permissionRequestSuccess":{"message":"Zahtjev za dozvolom je uspio!"},"permissionRequestFailed":{"message":"Zahtjev za dozvolom nije uspio. Jesi li ga odbio/la?"},"downvoteDescription":{"message":"Neispravno/krivo vrijeme"},"incorrectVote":{"message":"Neispravno"},"harmfulVote":{"message":"Štetno","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Promijenite kategoriju"},"nonMusicCategoryOnMusic":{"message":"Ovaj je video kategoriziran kao glazba. Je li stvarno ima sponzora? Ako je ovo zapravo „Ne-glazbeni segment”, otvori opcije proširenja i aktiviraj ovu kategoriju. Zatim ovaj segment možeš posalti kao „Ne-glazbeni” umjesto sponzora. Pročitaj smjernice ako nešto nije jasno."},"multipleSegments":{"message":"Više segmenata"},"guidelines":{"message":"Smjernice"},"readTheGuidelines":{"message":"Pročitaj Smjernice!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Stigle su kategorije!"},"categoryUpdate2":{"message":"Otvori opcije za preskakanje uvoda, kraja, proizvoda itd."},"help":{"message":"Pomoć"},"GotIt":{"message":"Razumijem","description":"Used as the button to dismiss a tooltip"},"categoryPillTitleText":{"message":"Ovaj cijeli video označen je kao ova kategorija i previše je integriran da bi se mogao odvojiti"},"chapterNameTooltipWarning":{"message":"Jedno od tvojih imena poglavlja je slično kategoriji. Kad god moguće koristi kategorije."},"hideForever":{"message":"Sakrij zauvijek"},"warningChatInfo":{"message":"Primjetili smo da ste radili neke uobičajene pogreške. Mi cijenimo vaš trud, ali ovdje težimo perfekciji, pa i jako male pogreške su važne :)"},"questionButton":{"message":"Imam pitanje"},"warningConfirmButton":{"message":"Razumijem razlog"},"Donate":{"message":"Doniraj"},"darkModeOptionsPage":{"message":"Tamni Način Na Stranici Opcija"},"helpPageThanksForInstalling":{"message":"Hvala na instaliranju SponsorBlocka."},"helpPageFeatureDisclaimer":{"message":"Mnoge funkcije su standardno deaktivirane. Ako želiš preskočiti uvode, završne dijelove, koristiti Invidious, itd., aktiviraj ih niže dolje. Također možeš sakriti/prikazati elemente korisničkog sučelja."},"helpPageHowSkippingWorks2":{"message":"Kadgod preskoči segment, dobit ćeš obavijest. Ako se vrijeme čini pogrešnim, glasaj protiv pritiskom gumba „Glasaj protiv”! Glasati možeš i u skočnom prozoru."},"Submitting":{"message":"Slanje"},"Credits":{"message":"Zasluge"},"LearnMore":{"message":"Saznajte više"},"FullDetails":{"message":"Potpuni detalji"},"CopyDownvoteButtonInfo":{"message":"Glasuje protiv i stvara lokalnu kopiju za ponovno slanje"},"OpenCategoryWikiPage":{"message":"Otvorite wiki stranicu ove kategorije."},"CopyAndDownvote":{"message":"Kopiraj i glasaj protiv"},"ContinueVoting":{"message":"Nastavite glasati"},"ChangeCategoryTooltip":{"message":"Ovo će se odmah primijeniti na tvoje segmente"},"downvote":{"message":"Glasaj protiv"},"upvote":{"message":"Glasaj za"},"hideSegment":{"message":"Sakrij segment"},"skipSegment":{"message":"Preskoči segment"},"yearAbbreviation":{"message":" god.","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Ponašanje","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Sučelje","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Tipkovni prečaci","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Sigurnosna kopija/Obnova","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Razno","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Izgled napomene preskakanja","description":"Option label"},"notSet":{"message":"Nije postavljeno"},"change":{"message":"Promijeni"},"youtubeKeybindWarning":{"message":"Ovo je ugrađeni YouTube prečac. Stvarno ga želiš koristiti?"},"betaServerWarning":{"message":"BETA poslužitelj je aktiviran!"},"openOptionsPage":{"message":"Otvori stranicu opcija"},"resetToDefault":{"message":"Vrati standardne postavke"},"confirmResetToDefault":{"message":"Stvarno želiš vratiti sve postavke na standardne vrijednosti? To je nepovratna radnja."},"exportSegments":{"message":"Izvezi segmente"},"importSegments":{"message":"Uvezi segmente"},"Import":{"message":"Uvezi","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Uspješno korištenje kupona!"},"redeemFailed":{"message":"Licencni ključ je neispravan"},"hideUpsells":{"message":"Sakrij opcije koje nisu dostupne bez dodatnog plaćanja"},"redeem":{"message":"Iskoristi kupon"},"enterLicenseKey":{"message":"Upiši licencni ključ"},"unsubmittedSegmentCounts":{"message":"Trenutačno imaš {0} od {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Trenutačno nemaš neposlanih segmenata","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"neposlani segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"neposlana segmenta","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videa","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Izbriši sve segmente","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Stvarno želiš izbrisati sve tvoje neposlane segmente?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Prikaži segmente","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Sakrij segmente","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID videa","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Broj segmenata","description":"Header of the unsubmitted segments list"},"actions":{"message":"Radnje","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Dijeli kao URL"},"NoticeTimeAfterSkip":{"message":"%{seconds} s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow – Bolji YouTube naslovi i minijature","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Crowdsourcing naslovi i minijature za bolje opise","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Odaberi one s najboljim opisom"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Naslov originala"},"CurrentTime":{"message":"Trenutačno vrijeme"},"resetCustomTitle":{"message":"Vrati naslov na izvorni tekst"},"resetIcon":{"message":"Resetiraj ikonu"},"TypeYourOwnTitleHere":{"message":"Ovdje upiši vlastiti naslov"},"VideoNotReady":{"message":"Video nije spreman"},"FailedToRender":{"message":"Neuspio prikaz","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Nedostaje HTML <canvas> element","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Greška tijekom prikazivanja","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Učitavanje nije uspjelo","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Format nalsova"},"Disabled":{"message":"Isključeno"},"CapitalizeWords":{"message":"Koristi velika početna slova za riječi"},"TitleCase":{"message":"Velika početna slova u naslovu"},"SentenceCase":{"message":"Veliko početno slovo u rečenici"},"LowerCase":{"message":"Mala slova"},"FirstLetterUppercase":{"message":"Prvi znak velikim slovom"},"shouldCleanEmojis":{"message":"Ukloni emojije"},"TheOriginalThumbnail":{"message":"Prikaži izvornu sličicu"},"showABlankBox":{"message":"Prikaži prazno polje"},"AutoGenerated":{"message":"Prikaži automatski generiranu YouTube sličicu","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Početak"},"Middle":{"message":"Sredina"},"keepUnsubmitted":{"message":"Spremi poslane glasove"},"whatKeepUnsubmitted":{"message":"Zadrži poslane glasove nakon glasovanja za prikazivanje tvojih odabranih naslova i minijatura na poslužitelju umjesto onih s najviše glasova."},"titleMaxLines":{"message":"Maksimalni broj redaka za naslov"},"onAllPages":{"message":"Na svim stranicama","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Na svim stranicama osim na video stranicama","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Nikada"},"moreAboutKAnonymity":{"message":"Više o svojstvu k-anonimnost","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Uvijek prikaži gumb „Prikaži original”"},"Enable":{"message":"Uključi"},"Titles":{"message":"Naslovi","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Minijature","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"Greška"},"ShowOriginal":{"message":"Prikaži izvorne detalje"},"privacyPolicy":{"message":"Politika privatnosti"},"termsOfUse":{"message":"Uvjeti korištenja"},"openSourceLicenses":{"message":"Licence otvorenog koda"},"replaceTitles":{"message":"Zamijeni naslove"},"replaceThumbnails":{"message":"Zamijeni minijature"},"useCrowdsourcedTitles":{"message":"Koristi naslove zajednice"},"NewConfiguration":{"message":"Nova konfiguracija"},"DeleteConfiguration":{"message":"Izbriši konfiguraciju"},"ConfigurationName":{"message":"Ime konfiguracije"},"dearrowStatsMessage":{"message":"{titles} naslova i {thumbnails} minijatura su zamijenjeni otkad si instalirao/la ovo proširenje","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} naslov ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} naslova ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"i {thumbnails} minijaturu","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"i {thumbnails} minijature(a)","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} su zamijenjeni otkad si instalirao/la ovo proširenje","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Broji zamjene naslova i sličica"},"countReplacementsDescription":{"message":"Koristi se za prikaz statistike u skočnom prozoru.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"dearrowLogoCredit":{"message":"Logotip temeljen na Twemojiju pod licencom CC-BY 4.0"},"freeTrialStarted":{"message":"Tvoje besplatna proba je uspješno započela. Za probu posjeti YouTube"},"freeTrialEnded":{"message":"Vrijeme tvoje besplatne probe je prošlo"},"freeTrialPrompt":{"message":"Ako ga želiš isprobati, pritisni donji gumb za pokretanje besplatne probne verzije."},"startFreeTrial":{"message":"Pokreni besplatnu probu"},"freeAccessRequested":{"message":"Uspješno si registriran/a za besplatan pristup. Dobit ćeš obavijest o odobrenju besplatnog pristupa."},"DeArrowNotActivated":{"message":"DeArrow nije aktiviran"},"ActivateDeArrow":{"message":"Aktivirajte DeArrow"},"DeArrowIsActivated":{"message":"DeArrow je uspješno aktiviran"},"Close":{"message":"Zatvori"},"ViewLicenseKey":{"message":"Pogledaj ključ za licencu"},"actAsVip":{"message":"Agiraj kao VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"DeArrowIsDisabled":{"message":"DeArrow je deaktivirano – klikni za aktiviranje","description":"Appears as a button on the video page when DeArrow is disabled"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/hu/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/hu/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Kapcsolati időtúllépés. Ellenőrizd az internetkapcsolatodat! Ha az internet működik, a kiszolgáló valószínűleg túlterhelt vagy leállt."},"400":{"message":"Szerver: Ez a kérés érvénytelen"},"409":{"message":"Ez már korábban be lett küldve"},"502":{"message":"Úgy tűnik, hogy a szerver túlterhelt. Próbálkozz újra néhány másodperc múlva."},"fullName":{"message":"SponsorBlock YouTube-ra - Szponzorok átugrására","description":"Name of the extension."},"Description":{"message":"Szponzorok, feliratkozás-kérelmek és több átugrása a YouTube videókon. Jelöljön meg szponzorokat videókon amiket néz, hogy mások idejét is megtakarítsa.","description":"Description of the extension."},"channelWhitelisted":{"message":"A csatorna az engedélyezőlistára került!"},"Segment":{"message":"szegmens"},"Segments":{"message":"szegmens"},"SegmentsCap":{"message":"Szegmensek"},"Chapters":{"message":"Fejezetek"},"renderAsChapters":{"message":"Szegmensek megjelenítése fejezetekként","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Aktuális szegmens megjelenítése a videó ideje mellett"},"showAutogeneratedChapters":{"message":"YouTube által automatikusan generált fejezetek mutatása"},"upvoteButtonInfo":{"message":"Részlet felszavazása"},"reportButtonTitle":{"message":"Jelentés"},"reportButtonInfo":{"message":"Szegmens jelentése helytelenként."},"Dismiss":{"message":"Elvetés"},"Loading":{"message":"Betöltés..."},"Hide":{"message":"Ne mutassa többé"},"hitGoBack":{"message":"Kattints a visszaugrásra, hogy visszakerülj oda, ahonnan ugrottál."},"unskip":{"message":"Visszaugrás"},"reskip":{"message":"Újra-átugrás"},"unmute":{"message":"Némítás feloldása"},"paused":{"message":"Szüneteltetve"},"manualPaused":{"message":"Időzítő megállítva"},"confirmMSG":{"message":"Az egyes értékek szerkesztéséhez vagy törléséhez kattints az info gombra, vagy nyisd meg a bővítmény felugró ablakát a bővítmény ikonjával a jobb felső sarokban."},"clearThis":{"message":"Biztosan törölni szeretnéd?\n\n"},"Unknown":{"message":"Hiba történt a szponzoridők beküldésekor. Kérjük, próbáld újra később."},"sponsorFound":{"message":"Ennek a videónak már vannak szegmensei az adatbázisban!"},"sponsor404":{"message":"Nem találhatóak szegmensek"},"sponsorStart":{"message":"Szegmens eleje"},"sponsorEnd":{"message":"Szegmens vége"},"sponsorCancel":{"message":"Szegmens készítés visszavonása"},"noVideoID":{"message":"Nem találtunk YouTube videót.\nHa ez helytelen, frissítsd a lapot."},"refreshSegments":{"message":"Szegmensek frissítése"},"success":{"message":"Siker!"},"voted":{"message":"Szavaztál!"},"serverDown":{"message":"Úgy tűnik, a szerver nem működik. Kérjük, mihamarabb értesítsd a fejlesztőket!"},"connectionError":{"message":"Kapcsolódási probléma merült fel. Hibakód: "},"segmentsStillLoading":{"message":"Szegmensek betöltése folyamatban..."},"clearTimes":{"message":"Szegmensek törlése"},"openPopup":{"message":"SponsorBlock felugró ablak megnyitása"},"closePopup":{"message":"Felugró ablak bezárása"},"closeIcon":{"message":"Bezárás ikon"},"OpenSubmissionMenu":{"message":"Beküldés menü megnyitása"},"OpenCasualVoteMenu":{"message":"Alkalmi mód menü megnyitása"},"sortSegments":{"message":"Szegmensek rendezése"},"submitCheck":{"message":"Biztosan be akarod küldeni?"},"whitelistChannel":{"message":"Csatorna fehérlistára tétele"},"removeFromWhitelist":{"message":"Csatorna törlése fehérlistáról"},"voteOnTime":{"message":"Szavazzon a szegmensről"},"Submissions":{"message":"Beküldések"},"savedPeopleFrom":{"message":"Megspóroltál másoknak: "},"viewLeaderboard":{"message":"Ranglista"},"recordTimesDescription":{"message":"Beküldés"},"submissionEditHint":{"message":"A szegmens szerkesztés azután fog megjelenni, hogy a beküldésre kattintasz","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Tipp: A beállításokban megadhatsz gyorsbillentyűket a beküldéshez"},"clearTimesButton":{"message":"Időpontok törlése"},"Username":{"message":"Felhasználónév"},"setUsername":{"message":"Felhasználónév megadása"},"copyPublicID":{"message":"Nyilvános UserID másolása"},"copySegmentID":{"message":"Szegmens ID másolása"},"loopChapter":{"message":"Fejezet ismétlése"},"unloopChapter":{"message":"Fejezet ismétlésének befejezése"},"hideThis":{"message":"Elrejtés"},"Options":{"message":"Beállítások"},"showButtons":{"message":"Gombok mutatása a YouTube lejátszón"},"hideButtonsDescription":{"message":"Ez elrejti az átugrandó szegmensek megjelöléséhez használt gombokat a YouTube lejátszón."},"showSkipButton":{"message":"Kiemeléshez ugrás gomb maradjon a lejátszón"},"showInfoButton":{"message":"Info gomb mutatása a YouTube lejátszón"},"autoHideInfoButton":{"message":"Info gomb automatikus elrejtése"},"showDeleteButton":{"message":"Törlés gomb mutatása a YouTube lejátszón"},"enableViewTracking":{"message":"Átugrás-számláló követés bekapcsolása"},"whatViewTracking":{"message":"Ez a funkció követi, mely szegmenseket ugrottad át, hogy a felhasználók megtudhassák mennyit segítettek a bejelentéseik, és a szavazatokkal együtt egy mértékegységként van használva, hogy ne kerülhessen szemét az adatbázisba. A bővítmény küld egy üzenetet a szervernek, minden alkalommal, mikor átugrasz egy szegmenst. Remélhetőleg nem sokan állítják át ezt a beállítást, hogy a számok pontosak maradhassanak. :)"},"enableViewTrackingInPrivate":{"message":"Átugrások számlálásának engedélyezése privát/inkognitó füleken"},"enableTrackDownvotes":{"message":"Leszavazások tárolása"},"whatTrackDownvotes":{"message":"Minden szegmens amit leszavazol rejtve marad újratöltés után is"},"trackDownvotesWarning":{"message":"Figyelem: A beállítás kikapcsolása letöröl minden korábban eltárolt szavazatot"},"enableTrackDownvotesInPrivate":{"message":"Leszavazások tárolása privát/inkognitó füleken"},"enableQueryByHashPrefix":{"message":"Lekérdezés Hash előtaggal"},"whatQueryByHashPrefix":{"message":"A szerverről videoID helyett, a videoID hash első négy karaktere lesz elküldve szegmenslekéréskor. A szerver visszaküldi az összes hasonló hashel rendelkező videó adatait."},"enableShowCategoryWithoutPermission":{"message":"Kategóriák megjelenítése a beküldési menüben beküldési engedély nélkül is"},"whatShowCategoryWithoutPermission":{"message":"Néhány kategóriánál a beküldés engedélyhez kötött, ami egy minimum hírnév-szinttől függ"},"showNotice":{"message":"Értesítés megjelenítése ismét"},"showSkipNotice":{"message":"Jelezzen, ha egy szegmens át lett ugorva"},"showUpcomingNotice":{"message":"Értesítés mutatása szegmens kezdete előtt"},"showCategoryGuidelines":{"message":"Kategória útmutató megjelenítése"},"noticeVisibilityMode0":{"message":"Teljes méretű átugrási értesítők"},"noticeVisibilityMode1":{"message":"Kis méretű átugrási értesítők Auto átugrás esetén"},"noticeVisibilityMode2":{"message":"Csak kis méretű átugrási értesítők"},"noticeVisibilityMode3":{"message":"Halvány átugrási értesítők Auto átugrás esetén"},"noticeVisibilityMode4":{"message":"Csak halvány átugrási értesítők"},"longDescription":{"message":"A SponsorBlockkal átugorhatja a szponzorokat, introkat, outrokat, feliratkozás emlékeztetőket és a YouTube videók többi idegesítő részeit. A SponsorBlock egy közösség által vezérelt böngészőbővítmény, ami lehetővé teszi bárkinek, hogy megjelölhesse egy szponzor vagy más szegmens kezdő és végpontjait. Amint valaki megosztja ezt az információt, mindenki más ennek a bővítménynek a birtokában egyenesen átugorja majd ezt a szponzorszegmenst. Emellett például a videóklipek nem-zene részei is átugorhatóak.","description":"Full description of the extension on the store pages."},"website":{"message":"Weboldal","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Forráskód","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Az értesítést frissítettük!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Ha még mindig nem tetszik, kattints a ne mutassa többé gombra.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Szegmens átugrása","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Szegmens kezdése/befejezése","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Beküldő menü megnyitása","description":"Keybind label"},"setSubmitKeybind":{"message":"Szegmensek beküldése","description":"Keybind label"},"setPreviewKeybind":{"message":"Szegmens előnézete","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Átugrási értesítő bezárása","description":"Keybind label"},"setDownvoteKeybind":{"message":"Szegmens leszavazása","description":"Keybind label"},"setUpvoteKeybind":{"message":"Szegmens felszavazása","description":"Keybind label"},"nextChapterKeybind":{"message":"Következő fejezet","description":"Keybind label"},"previousChapterKeybind":{"message":"Előző fejezet","description":"Keybind label"},"enableDeArrowKey":{"message":"DeArrow engedélyezése/tiltása","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Beküldő menü megnyitása","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Válassz egy billentyűt azzal, hogy lenyomod és válaszd ki a módosító billentyű(ke)t, amiket használni szeretnél."},"disableSkipping":{"message":"Átugrás bekapcsolva"},"enableSkipping":{"message":"Átugrás kikapcsolva"},"yourWork":{"message":"Te munkád","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Hibakód: "},"skip":{"message":"Átugrás"},"mute":{"message":"Némítás"},"full":{"message":"Teljes videó","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Átugorja ezt: {0}?"},"mute_category":{"message":"{0} némítása?"},"skip_to_category":{"message":"Ugrás ide: {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"{0} következik","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} átugorva","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} némítva","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Ide ugorva: {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Sikeres szavazat: {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Auto átugrás kikapcsolása"},"enableAutoSkip":{"message":"Auto átugrás bekapcsolása"},"audioNotification":{"message":"Hangjelzés átugráskor"},"audioNotificationDescription":{"message":"A hangjelzés átugráskor lejátszik egy hangot minden alkalommal, amikor egy szegmens átugrásra kerül. Ha kikapcsolod (vagy az auto átugrás ki van kapcsolva), nem lesz hangjelzés lejátszva."},"showTimeWithSkips":{"message":"Idő megtekintése az átugrandók nélkül"},"showTimeWithSkipsDescription":{"message":"Ez az idő zárójelben jelenik meg az aktuális idő mellett a keresősáv alatt. Megmutatja a videó teljes időtartamát, levonva a szegmenseket. Beletartoznak a csak \"Megjelenítés a keresősávban\" jelöléssel ellátott szegmensek is."},"youHaveSkipped":{"message":"Átugrottál: "},"minLower":{"message":"perc"},"minsLower":{"message":"perc"},"hourLower":{"message":"óra"},"hoursLower":{"message":"óra"},"youHaveSavedTime":{"message":"Megspóroltál másoknak","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" az életükből","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"A szerver állapotához tekintsd meg a status.sponsor.ajay.app oldalt."},"changeUserID":{"message":"Titkos UserID importálása / exportálása"},"whatChangeUserID":{"message":"Ez privát információnak minősül. Ez olyan, mint egy jelszó, így nem ajánlott megosztani senkivel. Ha valakinek birtokában van, megszemélyesíthet téged. Ha a nyilvános userID-dat keresed, kattints a vágólap ikonra a felugró ablakban."},"setUserID":{"message":"Titkos UserID beállítása"},"userIDChangeWarning":{"message":"Figyelem: A Titkos UserID megváltoztatása végleges. Biztosan szeretnéd megtenni? Minden esetben készíts biztonsági másolatot a régiről!"},"createdBy":{"message":"Készítette"},"supportOtherSites":{"message":"Harmadik fél Youtube oldalainak támogatása"},"supportOtherSitesDescription":{"message":"Harmadik fél YouTube klienseineik támogatása. A támogatáshoz el kell fogadni az extra engedélyeket.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Támogatott oldalak: "},"optionsInfo":{"message":"Invidious támogatás engedélyezése, autoátugrás kikapcsolása, gombok eltűntetése és több."},"addInvidiousInstance":{"message":"Harmadik fél kliens példányának hozzáadása"},"addInvidiousInstanceDescription":{"message":"Egyedi példány hozzáadása. Formátuma CSAK a domain legyen. Például: invidious.ajay.app"},"add":{"message":"Hozzáadás"},"addInvidiousInstanceError":{"message":"Érvénytelen domain. CSAK a domain részt tartalmazhatja. Például: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Invidious példányok listájának visszaállítása"},"resetInvidiousInstanceAlert":{"message":"Az Invidious példányok listájának visszaállítására készülsz"},"invidiousDisabledSafari":{"message":"Safariban jelenleg nem elérhető az Invidious támogatás egy Safari hiba miatt. A funkció vissza fog kerülni, amint az Apple kijavítja a hibát."},"currentInstances":{"message":"Jelenlegi példányok:"},"minDuration":{"message":"Minimális időtartam (másodpercekben):"},"minDurationDescription":{"message":"A beállított értéknél rövidebb szegmenseket nem ugorja át és nem jeleníti meg a lejátszó."},"enableManualSkipOnFullVideo":{"message":"Manuális átugrás használata, ha van teljes videó címke"},"whatManualSkipOnFullVideo":{"message":"Azoknak, akik megszakítás nélkül szeretnék végignézni a videót, ha az teljes egészében szponzorált, vagy önpromóció."},"skipNoticeDuration":{"message":"Átugrási értesítés hossza (másodpercekben):"},"skipNoticeDurationDescription":{"message":"Az átugrási értesítés ennyi ideig marad a képernyőn. Manuális átugrásnál tovább is látható maradhat."},"shortCheck":{"message":"A következő szegmens rövidebb, mint az általad beállított minimális időtartam. Ez azt jelentheti, hogy már beküldhették, csak emiatt az opció miatt nálad nem jelenik meg. Biztosan beküldöd?"},"liveOrPremiere":{"message":"Aktív élő közvetítés vagy premier közben nem lehet szegmenseket beküldeni. Kérjük várd meg a végét, majd frissítsd az oldalt és ellenőrizd, hogy a szegmensek nem csúsztak-e el."},"showUploadButton":{"message":"Feltöltés gomb megjelenítése"},"customServerAddress":{"message":"SponsorBlock szerver címe"},"customServerAddressDescription":{"message":"A SponsorBlock által használt cím a szerverre történő hívások kezdeményezésére szolgál.\nHacsak nincs saját szerverpéldányod, ezt nem szabad megváltoztatni."},"dataFetchingServerAddress":{"message":"Adatszolgáltató szerver címe"},"dataFetchingServerAddressDescription":{"message":"A cím, amin keresztül a bővítmény hívásokat küld az adatszolgáltató szerver felé.\nHacsak nincs saját szerverpéldányod, ezt nem szabad megváltoztatni."},"thumbnailCacheServerAddress":{"message":"Indexkép-gyorsítótár szerver címe"},"save":{"message":"Mentés"},"reset":{"message":"Visszaállítás"},"customAddressError":{"message":"A cím helytelenül van formázva. Győződj meg róla, hogy http:// vagy https:// van az elején, és nincsenek perjelek a végén."},"areYouSureReset":{"message":"Biztosan vissza szeretnéd állítani?"},"mobileUpdateInfo":{"message":"az m.youtube.com már támogatott"},"exportOptions":{"message":"Összes beállítás importálása / exportálása"},"exportOtherData":{"message":"Egyéb adatok importálása / exportálása"},"exportOptionsCopy":{"message":"Szerkesztés/másolás"},"exportOptionsDownload":{"message":"Mentés fájlba"},"exportOptionsUpload":{"message":"Betöltés fájlból"},"whatExportOptions":{"message":"Ez az összes beállításod JSON formátumban. Ebbe bele tartozik a Titkos UserID-d is, úgyhogy csak elővigyázatosan oszd meg."},"setOptions":{"message":"Beállítások módosítása"},"exportOptionsWarning":{"message":"Figyelem: A beállítások megváltoztatása végleges, és tönkreteheti a bővítményed. Biztosan meg szeretnéd tenni? Készíts egy biztonsági mentést a régi beállításaidról, biztos, ami biztos."},"incorrectlyFormattedOptions":{"message":"Ez a JSON helytelenül van formázva. A beállításaid nem lettek megváltoztatva."},"confirmNoticeTitle":{"message":"Szegmens beküldése"},"submit":{"message":"Beküld"},"cancel":{"message":"Mégse"},"delete":{"message":"Törlés"},"preview":{"message":"Előnézet"},"unsubmitted":{"message":"Nincs beküldve"},"inspect":{"message":"Megvizsgál"},"edit":{"message":"Szerkesztés"},"copyDebugLogs":{"message":"Hibakeresési napló másolása"},"copyDebugInformation":{"message":"Hibakeresési információ másolása a vágólapra"},"copyDebugInformationFailed":{"message":"Hiba a vágólapra másoláskor"},"copyDebugInformationOptions":{"message":"Információt másol a vágólapra, amit megadhatsz egy fejlesztőnek, ha bejelentesz egy hibát, vagy egy fejlesztő kéri tőled. Az érzékeny információkat, például a userID-t, az engedélyezőlistán szereplő csatornákat és az egyéni szerver címét eltávolítottuk. Azonban tartalmaz olyan információkat, mint a böngésző, az operációs rendszer és a bővítmény verziószáma. "},"copyDebugInformationComplete":{"message":"A hibakeresési információ másolva lett a vágólapjára. Nyugodtan távolíts el belőle olyan információkat, amiket nem szívesen osztanál meg. Mentsd el szöveges fájlként, vagy másold a hibajelentésbe."},"keyAlreadyUsed":{"message":"Ez a billentyűparancs egy másik művelethez tartozik. Kérjük, válassz egy újat."},"to":{"message":"–","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Másolva!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Tartalmazza a felkonferálást/átvezetőket is"},"generic_guideline2":{"message":"Olyan a lejátszás, mintha semmi sem lett volna átugorva"},"category_sponsor":{"message":"Szponzor"},"category_sponsor_description":{"message":"Fizetett promóció, vagy közvetlen reklám. Nem önpromóció, vagy ingyenes említése ügyeknek/tartalomkészítőknek/weboldalaknak/termékeknek amik tetszenek nekik."},"category_sponsor_guideline1":{"message":"Fizetett promóciók"},"category_sponsor_guideline2":{"message":"Nem adományok vagy saját termékek"},"category_selfpromo":{"message":"Nem fizetett/önpromóció"},"category_selfpromo_description":{"message":"Hasonló a szponzorhoz, de nem fizetett, vagy önpromóció. Beletartozik a saját ruhaáru, adományok, vagy infó arról, hogy kivel működtek együtt."},"category_selfpromo_guideline1":{"message":"Adományok, tagságok és saját termékek"},"category_selfpromo_guideline2":{"message":"Ingyenes köszönetnyilvánítások/említések, amik nem adnak hozzá a videóhoz"},"category_selfpromo_guideline3":{"message":"Nem cégek által tervezett termékekhez"},"category_exclusive_access":{"message":"Exkluzív hozzáférés"},"category_exclusive_access_description":{"message":"Csak teljes videók megjelölésére. Akkor használt, amikor egy videó egy olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak."},"category_exclusive_access_pill":{"message":"Ez a videó olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"A teljes videó olyan dolgot mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak"},"category_interaction":{"message":"Emlékeztető (Feliratkozás)"},"category_interaction_description":{"message":"Egy rövid emlékeztető arról, hogy likeoljunk, iratkozzunk fel, vagy kövessük a tartalom közben. Ha hosszabb szakasz, vagy egy adott témáról van, inkább az önpromóció alá tartozik."},"category_interaction_guideline1":{"message":"Rövid emlékeztető lájkolásra, feliratkozásra, vagy követésre"},"category_interaction_guideline2":{"message":"Beletartoznak a közvetett emlékeztetők kommentelésre"},"category_interaction_guideline3":{"message":"Nem általános promóciók, csak felhívások cselekvésre"},"category_interaction_short":{"message":"Emlékeztető"},"category_intro":{"message":"Megszakítás/Intro animáció"},"category_intro_description":{"message":"Egy részlet tartalom nélkül. Lehet szünet, álló képkocka, vagy ismétlődő animáció. Nem használandó információt tartalmazó átmeneteknél."},"category_intro_short":{"message":"Megszakítás"},"category_intro_guideline1":{"message":"Tényleges tartalom nélküli szakasz"},"category_intro_guideline2":{"message":"Nem információt is tartalmazó átmenetekhez"},"category_outro":{"message":"Záróképernyő/ Stáblista"},"category_outro_description":{"message":"Stáblista, vagy amikor megjelennek a YouTube zárókártyák. Nem használandó információt tartalmazó következtetésekkor."},"category_outro_guideline1":{"message":"Ne legyen benne tartalom, akkor sem, ha a zárókártyák már a képernyőn vannak"},"category_preview_description":{"message":"Olyan klipek gyűjteménye, amik azt mutatják, hogy mi következik majd ebben, vagy a sorozat más videóiban és minden információ megismétlődik később a videóban."},"category_preview_guideline1":{"message":"Klipek amik megjelennek később, vagy egy jövőbeli videóban"},"category_preview_guideline2":{"message":"Korábbi videó összefoglalója"},"category_preview_guideline3":{"message":"Nem olyan részekhez, amik új tartalmat adnak a videóhoz"},"category_filler":{"message":"Kitérők/viccek"},"category_filler_description":{"message":"Lazán kapcsolódó jelenetek vagy viccek, amik nem szükségesek a videó fő tartalmának megértéséhez. Ne tartalmazzon olyan szegmenseket, amik kontextust, vagy alapvető információkat szolgáltatnak. Ez egy nagyon agresszív kategória arra, amikor nincs kedved a \"szórakozáshoz\"."},"category_filler_short":{"message":"Kitérők"},"category_filler_guideline1":{"message":"Lazán kapcsolódó jelenetek vagy viccek"},"category_filler_guideline2":{"message":"Figyelemelterelődés, bakik, újrajátszások"},"category_filler_guideline3":{"message":"Nem olyan jelenetek, amik a téma megértéséhez szükségesek"},"category_music_offtopic":{"message":"Zene: nem-zene szegmens"},"category_music_offtopic_description":{"message":"Csak videóklipekhez. Ezt csak videóklipek olyan részeihez szabad használni, amiket nem fed le a többi kategória."},"category_music_offtopic_short":{"message":"Nem-Zene"},"category_music_offtopic_guideline1":{"message":"Olyan részek, amik nincsenek a hivatalos kiadásokban"},"category_music_offtopic_guideline2":{"message":"Nem zene egy élő előadásban"},"category_poi_highlight":{"message":"Kiemelés"},"category_poi_highlight_description":{"message":"A videónak az a része, amelyiket a legtöbb ember látni szeretne. Hasonlít az \"A videó x percnél kezdődik\" jellegű hozzászólásokhoz."},"category_poi_highlight_guideline1":{"message":"A rész, amit a legtöbb ember keres"},"category_poi_highlight_guideline2":{"message":"Segíthet a kontextus átugrásában"},"category_poi_highlight_guideline3":{"message":"A címhez, vagy indexképhez ugorhat"},"category_chapter":{"message":"Fejezet"},"category_chapter_description":{"message":"Egyedileg elnevezett fejezetek a videó nagyobb részeinek leírására."},"category_chapter_guideline1":{"message":"Ne említs szponzor márkaneveket"},"category_chapter_guideline2":{"message":"Használj hosszabb fejezeteket általános részekhez"},"category_chapter_guideline3":{"message":"Nagyobb fejezeteken belül lehetnek kisebb fejezetek"},"category_livestream_messages":{"message":"Élő adás: Adomány / üzenet olvasások"},"category_livestream_messages_short":{"message":"Üzenet beolvasása"},"autoSkip":{"message":"Auto átugrás"},"manualSkip":{"message":"Átugrás manuálisan"},"showOverlay":{"message":"Megjelenítés a keresősávban"},"disable":{"message":"Kikapcsol"},"autoSkip_POI":{"message":"Auto ugrás a kezdetéhez"},"manualSkip_POI":{"message":"Kérdezzen rá a videó betöltésekor"},"showOverlay_POI":{"message":"Megjelenítés a keresősávban"},"showOverlay_full":{"message":"Címke megjelenítése"},"showOverlay_chapter":{"message":"Fejezetek megtekintése"},"autoSkipOnMusicVideos":{"message":"Minden szegmens automatikus átugrása, ha van nem-zene szegmens"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Csak a music.youtube.com-on ugorja át automatikusan"},"muteSegments":{"message":"Szegmensek engedélyezése, amelyek lenémítják a hangot az átugrás helyett"},"fullVideoSegments":{"message":"Mutasson egy ikont, amikor egy videó egésze reklám","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Címkék megjelenítése a videók indexképein is","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Beküldetlen színe","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Keresősáv színe"},"category":{"message":"Kategória"},"skipOption":{"message":"Átugrás beállítása","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Haladó átugrási beállítások megnyitása"},"advancedSkipNotSaved":{"message":"Szintaktikai hiba: A beállításaid nem lettek elmentve"},"advancedSkipSettingsHelp":{"message":"Hogyan működik","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Bétateszt szerver bekapcsolása"},"whatEnableTestingServer":{"message":"A beküldéseid és szavazataid NEM FOGNAK SZÁMÍTANI a fő szerveren. Csak tesztelésre használd."},"testingServerWarning":{"message":"Egyik beküldésed vagy szavazatod SEM FOG SZÁMÍTANI a fő szerverhez, amíg a tesztszerverhez kapcsolódsz. Győződj meg róla, hogy ki van kapcsolva, ha valódi beküldéseket akarsz végezni."},"bracketNow":{"message":"(Most)"},"moreCategories":{"message":"További kategóriák"},"chooseACategory":{"message":"Válassz egy kategóriát"},"enableThisCategoryFirst":{"message":"Hogy \"{0}\" kategóriájú szegmenst küldhess be, először engedélyezned kell a beállításokban. Most átirányításra kerülsz a beállításokhoz.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Figyelem: Az ilyen típusú szegmensekből egyszerre csak egy lehet aktív. Több beküldése esetén véletlenszerűen az egyik fog megjelenni."},"youMustSelectACategory":{"message":"Minden szegmenshez kategóriát kell választani beküldés előtt!"},"bracketStart":{"message":"(Eleje)"},"bracketEnd":{"message":"(Vége)"},"End":{"message":"Vége","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"elrejtve: leszavazva"},"hiddenDueToDuration":{"message":"elrejtve: túl rövid"},"manuallyHidden":{"message":"kézzel elrejtve"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"A csatorna ID még nem került betöltésre. Ha beágyazott videót használsz, próbáld meg inkább a YouTube oldalon keresztül. Ezt okozhatja még a YouTube elrendezésének változása is. Ha így gondolod, hagyj egy kommentet itt:"},"invidiousPermissionRefresh":{"message":"A böngésző visszavonta az engedélyt, ami az Invidious és egyéb oldalakon való működéshez szükséges. Kérjük, kattints a lenti gombra az engedély újbóli megadásához!"},"acceptPermission":{"message":"Engedély jóváhagyása"},"permissionRequestSuccess":{"message":"Engedélykérés sikeres!"},"permissionRequestFailed":{"message":"Engedélykérés sikertelen. Nem nyomtál az elutasításra?"},"adblockerIssueWhitelist":{"message":"Ha nem sikerül megoldani a problémát, kapcsold ki a \"Csatorna ellenőrzése átugrás előtt\" opciót, mert a SponsorBlock nem tudja megszerezni a csatorna-információkat ehhez a videóhoz"},"forceChannelCheck":{"message":"Csatorna ellenőrzése átugrás előtt"},"whatForceChannelCheck":{"message":"Alapértelmezett állapotban a bővítmény átugorhat szegmenseket, mielőtt tudná melyik csatornán van. Alapból ezért néhány videó eleji szegmens engedélyezett csatornákon is átugródhat. Ennek a bekapcsolásával ez elkerülhető, de minden átugrás előtt lesz egy kis késleltetés, hiszen a channelID megszerzéséhez kell egy kis idő. Ez a késleltetés akár észrevehetetlen is lehet, ha elég gyors a kapcsolatod."},"forceChannelCheckPopup":{"message":"Fontold meg a \"Csatorna ellenőrzése átugrás előtt\" bekapcsolását"},"downvoteDescription":{"message":"Helytelen/rossz időzítés"},"incorrectVote":{"message":"Helytelen"},"harmfulVote":{"message":"Káros","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Kategória módosítása"},"nonMusicCategoryOnMusic":{"message":"Ez a videó zeneként van kategorizálva. Biztos vagy benne, hogy ennek van szponzora? Ha ez valójában egy \"nem-zene szegmens\", nyisd meg a bővítmény beállításait és kapcsold be ezt a kategóriát. Ezt követően beküldheted a szegmenst \"nem-zene\"-ként szponzor helyett. Ha nem érthető, kérjük olvasd el az irányelveket."},"multipleSegments":{"message":"Több szegmens"},"guidelines":{"message":"Irányelvek"},"readTheGuidelines":{"message":"Olvasd el az irányelveket!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Itt vannak a kategóriák!"},"categoryUpdate2":{"message":"Nyisd meg a beállításokat, hogy átugorhass introkat, outrokat stb."},"help":{"message":"Segítség"},"GotIt":{"message":"Értettem","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Ez a szegmens nagy. Ha az egész videó egy témáról szól, akkor válts \"Átugrás\"-ról \"Teljes videó\"-ra. További információkért lásd az irányelveket."},"categoryPillTitleText":{"message":"Az egész videó ezzel a kategóriával van megjelölve és túl szorosan kapcsolódik hozzá, hogy le lehessen választani"},"chapterNameTooltipWarning":{"message":"Az egyik fejezeted neve hasonlít egy kategóriára. Amikor lehetséges, mindig használj kategóriákat."},"experiementOptOut":{"message":"Minden további kísérlet elutasítása","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Eltüntetés örökre"},"warningChatInfo":{"message":"Észrevettük, hogy néhány gyakran előforduló hibát vétettél. Nagyra értékeljük az eddigi munkádat, de a tökéletességre törekszünk, úgyhogy a legkisebb hibák is számítanak :)"},"questionButton":{"message":"Kérdésem van"},"askAQuestion":{"message":"Kérdezz"},"warningConfirmButton":{"message":"Megértettem az okot"},"warningError":{"message":"Hiba a figyelmeztetés nyugtázása közben:"},"deArrowMessageRecieved":{"message":"Javaslatot kaptál egy moderátortól"},"Donate":{"message":"Támogatás"},"considerDonating":{"message":"Segíts a fejlesztés támogatásában"},"supportSponsorBlock":{"message":"Támogasd a teljes idejű munkámat a SponsorBlockon"},"hideDonationLink":{"message":"Támogatás link elrejtése"},"darkModeOptionsPage":{"message":"Sötét téma a Beállításokban"},"helpPageThanksForInstalling":{"message":"Köszönjük, hogy telepítetted a SponsorBlockot."},"helpPageReviewOptions":{"message":"Kérjük, nézd át az alábbi beállításokat"},"helpPageFeatureDisclaimer":{"message":"Sok funkció le van tiltva alapból. Ha át akarsz ugrani bevezetőket, záróképernyőket, Invidioust használnál, stb., engedélyezd őket alább. Lehetőség van a felület különböző elemeinek elrejtésére/megjelenítésére is."},"helpPageHowSkippingWorks":{"message":"Hogy működik"},"helpPageHowSkippingWorks1":{"message":"Minden szponzort olyan felhasználók küldenek be, mint te. Megnézheted a beküldött szponzorok listáját az adatbázisban, ha megnyitod a felugró ablakot a böngésződ jobb felső részében."},"helpPageHowSkippingWorks2":{"message":"Ahányszor átugrasz egy szegmenst, kapni fogsz egy értesítést. Ha rossznak tűnik az időzítés, szavazd le a leszavazás gombra kattintva! A felugró ablakban is szavazhatsz."},"Submitting":{"message":"Beküldés"},"helpPageSubmitting1":{"message":"Beküldéshez kattints a SponsorBlock logóra a videó lejátszón!"},"helpPageSubmitting2":{"message":"A lejátszás gombot megnyomva a szegmens elejét, a stop gombbal pedig a végét jelezheted. A felfele mutató nyíl gombbal megnyitható a beküldések menü, ahol ellenőrizheted a szegmenseidet az előnézettel és szerkesztheted őket, hogy tökéletesek legyenek. Fontos a pontosság, kérlek olvasd el az irányelveket a beküldés előtt."},"helpPageCopyOfDatabase":{"message":"Hová kerülnek a beküldések?"},"helpPageCopyOfDatabase1":{"message":"Minden beküldés a SponsorBlock adatbázisba kerül, ami nyilvánosan elérhető mindenki számára itt:"},"helpPageCopyOfDatabase2":{"message":"A forráskód szabadon elérhető. Tehát még ha valami történne is velem, a beküldések nem vesznek el."},"AdviceForSubmitting":{"message":"Tanácsok a beküldéshez"},"Credits":{"message":"Készítők"},"LearnMore":{"message":"Tudj meg többet"},"FullDetails":{"message":"Teljes adatok"},"CopyDownvoteButtonInfo":{"message":"Leszavazza és készít egy helyi másolatot, amit beküldhetsz"},"OpenCategoryWikiPage":{"message":"A kategória wiki lapjának megnyitása."},"CopyAndDownvote":{"message":"Másol és leszavaz"},"ContinueVoting":{"message":"Szavazás folytatása"},"ChangeCategoryTooltip":{"message":"Ez azonnal érvényes lesz a szegmenseidre"},"downvote":{"message":"Leszavazás"},"upvote":{"message":"Felszavazás"},"hideSegment":{"message":"Szegmens elrejtése"},"skipSegment":{"message":"Szegmens átugrása"},"playChapter":{"message":"Fejezet lejátszása"},"SponsorTimeEditScrollNewFeature":{"message":"Használd egérgörgődet a szerkesztő mező fölött, hogy gyorsan módosíthasd az időt. A ctrl vagy shift billentyűk kombinációjával finomhangolhatod a változás mértékét."},"categoryPillNewFeature":{"message":"Új! Láthatod, ha egy videó teljes egészében szponzorált, vagy önpromóció"},"yearAbbreviation":{"message":"év","description":"100y"},"dayAbbreviation":{"message":"n","description":"100d"},"hourAbbreviation":{"message":"ó","description":"100h"},"optionsTabBehavior":{"message":"Működés","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Felület","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Gyorsbillentyűk","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Biztonsági mentés","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Egyéb","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Átugrási értesítés kinézete","description":"Option label"},"unbind":{"message":"Megszüntetés","description":"Unbind keyboard shortcut"},"notSet":{"message":"Nincs beállítva"},"change":{"message":"Megváltoztat"},"youtubeKeybindWarning":{"message":"Ez egy beépített YouTube gyorsbillentyű. Biztosan ezt szeretnéd használni?"},"betaServerWarning":{"message":"BÉTA szerver engedélyezve van!"},"openOptionsPage":{"message":"Beállítások megnyitása"},"resetToDefault":{"message":"Beállítások visszaállítása alapértelmezettre"},"confirmResetToDefault":{"message":"Biztosan vissza szeretnéd állítani az összes beállítást az alapértelmezett értékekre? A műveletet nem lehet visszavonni."},"exportSegments":{"message":"Szegmensek exportálása"},"importSegments":{"message":"Szegmensek importálása"},"Import":{"message":"Importálás","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Beváltás sikeres!"},"redeemFailed":{"message":"A licenc kulcs érvénytelen"},"hideUpsells":{"message":"Fizetős opciók elrejtése"},"hideNewFeatureUpdates":{"message":"Üzenetek elrejtése új funkciókról"},"redeem":{"message":"Beváltás"},"enterLicenseKey":{"message":"Add meg a licenc kulcsot"},"unsubmittedSegmentCounts":{"message":"Jelenleg {0} van {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Jelenleg nincsenek beküldetlen szegmensek","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"beküldetlen szegmensed","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"beküldetlen szegmensed","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"videón","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videón","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Szegmensek törlése","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Biztosan törölni szeretnéd az összes beküldetlen szegmensedet?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Szegmensek mutatása","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Szegmensek elrejtése","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Videó ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Szegmensek","description":"Header of the unsubmitted segments list"},"actions":{"message":"Műveletek","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Megosztás linkként"},"segmentFetchFailureWarning":{"message":"Figyelem: A szerver még nem válaszolt szegmensekkel. Elképzelhető, hogy már vannak beküldött szegmensek ezen a videón, csak még nem töltődtek be szerver-problémák miatt."},"allowScrollingToEdit":{"message":"Görgő használatának engedélyezése az idők szerkesztéséhez"},"NoticeTimeAfterSkip":{"message":"{seconds}mp","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Jobb címek és indexképek a YouTube-on","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Címek és indexképek lecserélése a közösség által, hogy szenzációhajhászás helyett leírók legyenek","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Válaszd ki a legleíróbbat"},"Original":{"message":"Eredeti"},"OriginalTitle":{"message":"Eredeti cím"},"CurrentTime":{"message":"Aktuális idő"},"resetCustomTitle":{"message":"Cím visszaállítása az eredeti szövegre"},"resetIcon":{"message":"Visszaállítás ikon"},"TypeYourOwnTitleHere":{"message":"Írd ide a saját címedet"},"VideoNotReady":{"message":"A videó nem áll készen"},"FailedToRender":{"message":"Kirajzolás nem sikerült","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas hiányzik","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Kivétel kirajzolás közben","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Sikertelen betöltés","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Cím formátum"},"Disabled":{"message":"Letiltva"},"CapitalizeWords":{"message":"Nagybetűvel kezdődő szavak"},"TitleCase":{"message":"Nagybetűvel kezdődő szavak, kivéve kötőszavak, névelők"},"SentenceCase":{"message":"Mondatok és tulajdonnevek kezdődjenek nagybetűvel"},"LowerCase":{"message":"Kisbetűk"},"FirstLetterUppercase":{"message":"Első karakter nagybetű"},"shouldCleanEmojis":{"message":"Hangulatjelek eltávolítása"},"onlyFormatCustomTitles":{"message":"Csak felhasználók által beküldött címeket formázzon"},"onlyTitleCaseInEnglish":{"message":"Nagybetűs szavak nem angol címek esetén"},"onlyTitleCaseInEnglishDescription":{"message":"A nyelvfelismerés nem tökéletes és néhány angol címet nem angolként ismer fel."},"thumbnailFallbackOption":{"message":"Ha nincs beküldött indexkép"},"whatThumbnailFallbackOption":{"message":"Véletlen pillanat esetén a SponsorBlock adatok használatával olyan időpont kerül kiválasztásra, ami nem esik bele promóciós szegmensbe.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Képernyőkép mutatása egy véletlen pillanatról"},"TheOriginalThumbnail":{"message":"Eredeti indexkép mutatása"},"showABlankBox":{"message":"Üres doboz mutatása"},"AutoGenerated":{"message":"YouTube által automatikusan generált indexkép mutatása","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Eleje"},"Middle":{"message":"Közepe"},"keepUnsubmitted":{"message":"Beküldött szavazatok tárolása"},"showLiveCover":{"message":"Csatorna avatár mutatása a következő videókon","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Soha ne használjon A/B tesztben résztvevő indexképeket"},"ignoreAbThumbnailsDescription":{"message":"A csatornák teszteket végezhetnek a videóikon, amik során a YouTube különböző felhasználóknak különböző indexképeket fog mutatni. Ez a beállítás mindig az első indexképet fogja használni az állandóság kedvéért."},"abThumbnailsWarning":{"message":"Figyelem: Ezen a videón éppen indexkép-A/B teszt fut. Ez azt jelenti, hogy az indexkép gyakran változhat. Ezen kockázat miatt nem ajánlatos az eredeti indexképre szavazni."},"whatKeepUnsubmitted":{"message":"Megtartja a beküldött szavazatokat a szavazás után, hogy mindig azok a címek és indexképek jelenjenek meg, amiket te választottál, a szerver szerint legjobbra értékeltek helyett."},"keepUnsubmittedInPrivate":{"message":"Beküldött szavazatok tárolása inkognitó füleken"},"useThumbnailGenerationService":{"message":"Indexkép készítő szolgáltatás használata"},"titleMaxLines":{"message":"Címek sorainak maximális száma"},"titleMaxLinesDescription":{"message":"A videók címei ennyi sorban lesznek elosztva a javaslatokban."},"thumbnailSaturationLevel":{"message":"Indexkép szaturációs szint"},"whatSaturateThumbnails":{"message":"Tedd az indexképeket kevésbé élénkké a színeik csökkentésével"},"hideDetailsWhileFetching":{"message":"Adatok elrejtése betöltés közben"},"hideDetailsWhileFetchingDescription":{"message":"Címek és indexképek elrejtése, amíg az adatok betöltődnek a szerverről. Ha le van tiltva, villanásokat fogsz látni, amikor a címek és indexképek megváltoznak."},"ignoreTranslatedTitles":{"message":"Ne mutassa a YouTube fordított címeit","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"A YouTube néha automatikusan lefordít címeket a te nyelvedre. Ez a beállítás csak akkor számít, ha nincs közösség által beküldött cím."},"onAllPages":{"message":"Minden oldalon","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Minden oldalon, kivéve videók oldalain","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Soha"},"thumbnailGeneratorDescription1":{"message":"Az indexkép készítő szolgáltatás jelentősen felgyorsítja az indexkép elkészülését azzal, hogy egy névtelen kérést küld egy szervernek a videó azonosítójával. Ezután az indexkép elkészítésre kerül, vagy gyorsítótárból kerül betöltésre, ha már korábban el lett készítve."},"thumbnailGeneratorDescription2":{"message":"Ha egy videó oldalán használják, ez potenciálisan kiszivárogtathat nem nyilvános videó ID-kat a szervernek. A \"Minden oldalon, kivéve videók oldalain\" beállítás megoldja ezt a problémát. Egy másik lehetőség egy saját indexkép készítő szolgáltatás futtatása."},"thumbnailGeneratorDescription3":{"message":"Ha az indexkép készítő szolgáltatás le van tiltva, minden kérés egy k-anonimitásos lekérdezési módszert fog használni, ami nehezebben felismerhetővé teszi a szerver számára, hogy melyik videók kerültek betöltésre, és egy lassabb, helyi indexkép készítő szolgáltatás kerül használatra.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Indexkép készítő szolgáltatás forráskódja"},"moreAboutKAnonymity":{"message":"Részletesebben a k-anonimitásról","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Mindig látszódjon az \"Eredeti tulajdonságok megjelenítése\" gomb"},"whatAlwaysShowShowOriginalButton":{"message":"Engedélyezd, ha mindig tudni szeretnéd, ha megváltozott egy cím/indexkép."},"showOriginalOnHover":{"message":"Váltson eredeti és módosított adatok között, ha felé visszük a kurzort"},"showOriginalOnHoverOfVideo":{"message":"Váltás egyedi és eredeti adatok között, ha a kurzor a videó kártyája fölött van"},"showOriginalOnHoverOfVideoDescription":{"message":"Ez letiltja az automatikus lejátszást"},"showCustomOnHoverIfCasual":{"message":"Módosított cím mutatása a kurzor felé vitele esetén, ha épp egy alkalmi módos cím látható"},"showIconForFormattedTitles":{"message":"\"Eredeti tulajdonságok megjelenítése\" gomb mutatása az automatikusan formázott címeknél"},"Enable":{"message":"Engedélyez"},"Titles":{"message":"Címek","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Indexképek","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Alkalmi szavazatok","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Hiba"},"ShowOriginal":{"message":"Eredeti adatok megjelenítése"},"ShowModified":{"message":"Módosított adatok mutatása"},"ShowFormatted":{"message":"Formázott adatok mutatása"},"FillerWarning":{"message":"Figyelem: Ez egy nagyon agresszív kategória. Valószínűleg kell majd visszaugranod, vagy néha letiltanod. Vedd figyelembe, hogy sok videónak több, mint fele átugrásra kerülhet. Azonban emlékezz rá, hogy még így is vannak követendő irányelvek a beküldésnél.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Csatlakozz Discordhoz vagy Mátrixhoz, hogy véglegesen ebben a beszélgetésben maradhass","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Irányelvek mutatása","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Kerüld az eltúlzott arckifejezéseket","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Gondolkozz általánosabban, ne csak az eredeti címben feltett kérdést válaszold meg","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Kerüld a videóra való reakciók leírását (pl. \"meglepő\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Nyújts elég információt, hogy mások tájékozott döntést hozhassanak, mielőtt kattintanának"},"tip5":{"message":"Úgy használj nagybetűket, mintha egy mondat lenne","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Olvass el minden irányelvet a beküldéshez","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"A címem kis-/nagybetűi úgy vannak formázva, mint egy mondat (az angolban szokásos \"minden szó nagybetű\" helyett)","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"A címem nem csak megválaszol egy, az eredeti címben feltett kérdést","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"A címeknek a videót, vagy a történetet kellene leírniuk. Nézd meg a teljes videót, hogy tudd, miről szól valójában, ahelyett, hogy egy figyelemfelkeltő eredeti címre támaszkodnál.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"A címem nem egy konklúziót foglal össze és nem tartalmaz felesleges spoilert","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"A címek nem arra vannak, hogy kiváltsák a videó megtekintését, hanem abban segítenek, hogy tudd, hogy rákattints-e vagy sem.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"A címem nem ellenőrzi, gúnyolja, vagy kritizálja a videót, vagy a készítőt","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"A címek a készítő és a videó szemszögéből írandók. A videó értékelése vagy ellenőrizése nem tartozik a DeArrow szándékai közé. A címek nem használandók komment szekcióként.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Észlelt szó: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Ne használj felesleges igéket a cím elején","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Minden címet nagybetűvel kezdj! A címek kis-/nagybetűit úgy kell formázni, mint egy mondatban (az angolban szokásos \"minden szó nagybetű\" helyett)","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"A címek ne végződjenek ponttal","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Ne csak hozzáadj egy választ az eredeti címben feltett kérdéshez! A címeknek a videót, vagy magát a történetet kell leírniuk","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"A címeknek nem szabad ellenőrizni, gúnyolni, vagy kritizálni a videót, vagy a készítőt","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"A címek ne tartsanak meg szenzációhajhász elemeket az eredeti címből","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"A címek ne tartalmazzanak emojikat","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Tegyél eleget a figyelmeztetésnek a beküldés előtt"},"dearrowHelpSponsorBlockImported":{"message":"Megjegyzés: A SponsorBlock beállításaid automatikusan betöltésre kerültek!"},"howItWorks":{"message":"Hogyan működik"},"discordPromotion":{"message":"Gyere, járulj hozzá a fejlesztéshez, tegyél javaslatokat és segíts {discord}on vagy {matrix}on"},"deArrowDonationText":{"message":"Ha tetszik amit eddig csináltam és szeretnél pénzzel segíteni, itt egy link"},"termsAgreement":{"message":"A bővítmény használatával hozzájárulsz a következőkhöz: {privacy-policy}, {terms}"},"privacyPolicy":{"message":"Adatvédelmi irányelvek"},"termsOfUse":{"message":"Használati feltételek"},"openSourceLicenses":{"message":"Nyílt forráskódú licencek"},"defaultToOriginals":{"message":"Eredeti videó információk alapértelmezetten"},"whatDefaultToOriginals":{"message":"Az eredeti címet és indexképet mutassa alapból, de legyen egy gomb az egyedi címek és indexképek megjelenítésére, ha feléjük visszük a kurzort."},"replaceTitles":{"message":"Címek lecserélése"},"replaceThumbnails":{"message":"Indexképek lecserélése"},"useCrowdsourcedTitles":{"message":"Közösség által beküldött címek használata"},"whatUseCrowdsourcedTitles":{"message":"Ha le van tiltva, akkor a címek formázásra kerülnek, de nem lesznek lecserélve a felhasználók által beküldöttekre","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Biztosan törölni szeretnéd ezt a konfigurációt?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Új konfiguráció"},"DeleteConfiguration":{"message":"Konfiguráció törlése"},"ChannelAllowlist":{"message":"Csatornára vonatkozó beállítások"},"ConfigurationName":{"message":"Konfiguráció neve"},"ChannelListInstructions":{"message":"Add azokat a csatornákat a lenti dobozhoz külön-külön sorokban, amiket hozzá szeretnél rendelni ehhez a konfigurációhoz. Csatornaazonosítók és megjelenítési nevek is támogatottak. @-os felhasználónevek nem támogatottak. A csatornaazonosítót megkaphatod a \"Csatorna megosztása\" gombra kattintva a csatorna Névjegyén. A Névjegyhez kattints a csatorna leírására a név alatt a csatorna oldalán.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Még nincsenek konfigurációk. Kattints a fenti gombra egy új konfiguráció hozzáadásához.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Szüntesd meg a kattintásvadász tartalmakat a címek és indexképek lecserélésével!"},"DeArrowPromotionMessage2":{"message":"Eleged van a kattintásvadász videókból? Nézd meg az új bővítményem, ami a címek és indexképek minőségén próbál javítani"},"DeArrowPromotionMessage3":{"message":"Próbáld ki a DeArrow bővítményt is","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Nem tetszik ez a cím? Ha inkább a lenti címet preferálod, próbáld ki a DeArrow cím-lecserélő funkcióját.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Ez az indexkép egy véletlenszerű időpontról lett választva, mert még nincsenek beküldések ehhez a videóhoz","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Ez az indexkép egy véletlenszerű időpontról lett választva, a cím pedig automatikusan formázásra került, mert még nincsenek beküldések ehhez a videóhoz","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Ezeket az alap beállításokat megváltoztathatod lent","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} cím és {thumbnails} indexkép került lecserélésre a bővítmény telepítése óta","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} cím ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} cím ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"és {thumbnails} indexkép","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"és {thumbnails} indexkép","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} került lecserélésre a bővítmény telepítése óta","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Cím és indexkép cserék számolása"},"countReplacementsDescription":{"message":"A felugró ablakban megjelenő statisztikákhoz.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Szűrő lista hozzáadása közvélemény-kutatások, termékpolcok és az oldal egyéb promóciós elemeinek elrejtésére yt-neuter használatával"},"requiresUblock":{"message":"uBlock Origin szükséges hozzá"},"videoIDWrongWhenSubmittingError":{"message":"A videó ID felismerése problémába ütközött. Próbáld meg frissíteni az oldalt beküldés előtt, hogy biztosan a helyes videóhoz küldje az adatokat. Ha ez gyakran előfordul, kérlek küldj egy jelentést az egyéb telepített bővítményekkel és userscriptekkel együtt GitHubon, Discordon, vagy Matrixon."},"dearrowLogoCredit":{"message":"Logó a Twemoji alapján, CC-BY 4.0 alatt licencelve"},"zoomToFillUnsupported":{"message":"A SponsorBlock nem kompatibilis a Zoom to Fill bővítménnyel. Sok alternatíva létezik, amik rendesen működnek."},"freeTrialStarted":{"message":"Az ingyenes próbaverziód sikeresen elkezdődött. Látogasd meg a YouTube-ot, hogy kipróbáld"},"freeTrialEnded":{"message":"Az ingyenes próbaverziód lejárt"},"freeTrialPrompt":{"message":"Ha ki szeretnéd próbálni egy óráig, hozzáférhetsz egy ingyenes próbaverzióhoz a lenti gomb segítségével."},"startFreeTrial":{"message":"Ingyenes próbaverzió indítása"},"freeAccessRequested":{"message":"Sikeresen regisztráltál ingyenes az hozzáféréshez. Értesíteni fogunk, ha megkaptad az ingyenes hozzáférést."},"freeAccessComplete":{"message":"Gratulálunk! Mostantól ingyenesen hozzáférhetsz a DeArrowhoz"},"DeArrowNotActivated":{"message":"DeArrow nincs aktiválva"},"ActivateDeArrow":{"message":"DeArrow aktiválása"},"DeArrowIsActivated":{"message":"DeArrow sikeresen aktiválva"},"Close":{"message":"Bezárás"},"ViewLicenseKey":{"message":"Licenc megtekintése"},"SharingIsCaring":{"message":"A megosztás törődés"},"cleanPopup":{"message":"Nem szükséges elemek elrejtése a szegmens lista ablakban"},"hideSegmentCreationInPopup":{"message":"Szegmens készítési gombok elrejtése a felugró ablakban"},"syncDisabledWarning":{"message":"Figyelem: A bővítménytárhely le lett tiltva a böngésződben. A beállítások nem lesznek elmentve, ha menteni próbálod őket."},"syncDisabledWarningDeArrow":{"message":"A DeArrow nem fog működni tárhely nélkül."},"syncDisabledFirefoxSuggestions":{"message":"Engedélyezheted, ha elmész az about:config címre, és a \"webextensions.storage.sync.enabled\" értéket true-ra állítod."},"storageFull":{"message":"A bővítmény tárhelye megtelt. Kérlek, törölj néhány beküldetlen szegmenst a beállításokban."},"previewSegmentRequired":{"message":"Kérlek, ellenőrizd a szegmenseidet beküldés előtt. Ezt az Előnézet gomb segítségével teheted meg, vagy ide kattintva:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"VIP-ként","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"A beküldés jelenleg nem lehetséges a böngésződből, mert a YouTube szerveroldali hirdetéseket illesztett a videóba, amit a bővítmény nem tud eltávolítani. Kérlek jelentkezz, ha ezt a hibát kapod."},"DeArrowIsDisabled":{"message":"DeArrow le van tiltva - kattints az engedélyezéshez","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Biztos vagy benne, hogy ez az eredeti indexkép megfelel a DeArrow irányelveinek? Ha inkább csak az eredeti indexképeket szeretnéd látni, fontold meg a \"Ha nincs beküldött indexkép\" opció használatát a DeArrow beállításokban.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"YouTube TV-n a SponsorBlock nem kompatibilis élő és nemrég felvett tartalommal. Ha ez egy új felvétel, kérlek várj néhány órát, hogy a feldolgozott verzió elérhetővé váljon.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Az engedélyezőlistára tétel nem támogatott tv.youtube.com-on.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Tetszik az eredeti cím?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Igen"},"No":{"message":"Nem"},"votes":{"message":"{0} szavazat","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} szavazat","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Vicces","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Kreatív","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Okos","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Leíró","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Egyéb","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Klasszikus mód","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"A címek lecserélésre kerülnek az irányelveken alapuló egységes formázás alapján minden olyan videón, ahol van közösség által beküldött cím."},"CasualMode":{"message":"Alkalmi mód","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Maradjanak meg az eredeti címek, ha megfelelően leírják a videót és találóak vagy viccesek.\nVálaszd ki, hogy milyen kategóriájú címeket szeretnél látni.\nSzavazni tudsz majd, hogy egy cím beleillik-e egy kategóriába, vagy sem."},"minimumVotes":{"message":"Minimális szavazatszám","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Eredeti indexképek mutatása alkalmi módban szavazott videókon","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Új funkció: Alkalmi mód","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Csak akkor mutassa az alkalmi mód ikonját, ha elérhető egy egyedi cím"},"OpenSettings":{"message":"Beállítások megnyitása"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/id/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/id/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Koneksi Timeout. Cek koneksi internet anda. Jika internet anda berfungsi, server mungkin kewalahan atau down."},"400":{"message":"Server menyatakan permintaan ini tidak valid"},"409":{"message":"Ini sudah dikirim sebelumnya"},"502":{"message":"Tampaknya server sedang kewalahan. Coba lagi beberapa detik."},"fullName":{"message":"SponsorBlock untuk YouTube - Lewati Sponsor","description":"Name of the extension."},"Description":{"message":"Lewati sponsor, meminta subscriber dan lain-lain di video YouTube. Laporkan sponsor di video yang anda tonton untuk menghemat waktu orang lain.","description":"Description of the extension."},"channelWhitelisted":{"message":"Channel Didaftar-putihkan!"},"Segment":{"message":"segmen"},"Segments":{"message":"segmen"},"SegmentsCap":{"message":"Segmen"},"Chapters":{"message":"Bab"},"renderAsChapters":{"message":"Jadikan segmen sebagai bab","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Tampilkan Segmen Saat Ini di Samping Waktu Video"},"showAutogeneratedChapters":{"message":"Tunjukkan bab video yang dibuat otomatis oleh YouTube"},"upvoteButtonInfo":{"message":"Upvote submisi ini"},"reportButtonTitle":{"message":"Laporkan"},"reportButtonInfo":{"message":"Laporkan submisi ini sebagai kesalahan."},"Dismiss":{"message":"Hilangkan"},"Loading":{"message":"Memuat..."},"Hide":{"message":"Jangan tampilkan"},"hitGoBack":{"message":"Tekan jangan lewati untuk kembali ke asal."},"unskip":{"message":"Jangan Lewati"},"reskip":{"message":"Lewati Ulang"},"unmute":{"message":"Batalkan bisu"},"paused":{"message":"Dijeda"},"manualPaused":{"message":"Timer Berhenti"},"confirmMSG":{"message":"Untuk mengedit atau menghapus nilai masing-masing, klik tombol info atau buka popup ekstensi dengan mengklik ikon ekstensi di ujung kanan atas."},"clearThis":{"message":"Apa anda yakin ingin menghapus ini?\n\n"},"Unknown":{"message":"Terjadi kesalahan mengirim waktu sponsor, mohon coba lagi nanti."},"sponsorFound":{"message":"Video ini memiliki segmen di basis data!"},"sponsor404":{"message":"Tidak ada segmen ditemukan"},"sponsorStart":{"message":"Segmen Dimulai Sekarang"},"sponsorEnd":{"message":"Segmen Berakhir Sekarang"},"sponsorCancel":{"message":"Batalkan Membuat Segmen"},"noVideoID":{"message":"Video YouTube tidak ditemukan.\nJika terjadi kesalahan, segarkan halaman."},"refreshSegments":{"message":"Perbarui segmen"},"success":{"message":"Sukses!"},"voted":{"message":"Divote!"},"serverDown":{"message":"Sepertinya server sedang down. Kontak pengembang segera."},"connectionError":{"message":"Kesalahan koneksi terjadi. Kode kesalahan: "},"segmentsStillLoading":{"message":"Segmen masih dimuat..."},"clearTimes":{"message":"Hapus Segmen"},"openPopup":{"message":"Buka Popup SponsorBlock"},"closePopup":{"message":"Tutup Popup"},"closeIcon":{"message":"Tutup Ikon"},"OpenSubmissionMenu":{"message":"Buka Menu Pengajuan"},"OpenCasualVoteMenu":{"message":"Buka menu mode sederhana"},"sortSegments":{"message":"Urutkan Segmen"},"submitCheck":{"message":"Apakah anda yakin ingin mengirim ini?"},"whitelistChannel":{"message":"Daftar putih channel"},"removeFromWhitelist":{"message":"Hapus channel dari daftar putih"},"voteOnTime":{"message":"Beri Segmen Vote"},"Submissions":{"message":"Submisi"},"savedPeopleFrom":{"message":"Anda telah menyelamatkan orang dari "},"viewLeaderboard":{"message":"Papan peringkat"},"recordTimesDescription":{"message":"Kirim"},"submissionEditHint":{"message":"Pengeditan bagian akan muncul setelah anda mengklik kirim","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Petunjuk: Anda dapat mengatur keybinds untuk pengiriman dalam opsi"},"clearTimesButton":{"message":"Hapus Waktu"},"Username":{"message":"Nama pengguna"},"setUsername":{"message":"Atur Nama Pengguna"},"copyPublicID":{"message":"Salin UserID Publik"},"copySegmentID":{"message":"Salin ID Segmen"},"loopChapter":{"message":"Aktifkan Mengulang bab"},"unloopChapter":{"message":"Batalkan Mengulang bab"},"hideThis":{"message":"Sembunyikan ini"},"Options":{"message":"Opsi"},"showButtons":{"message":"Tampilkan Tombol Di Pemutar Video YouTube"},"hideButtonsDescription":{"message":"Ini akan menyembunyikan tombol yang muncul di pemutar YouTube untuk mengirimkan segmen yang dilewati."},"showSkipButton":{"message":"Biarkan Tombol Lewati ke Sorotan Tetap Tampil di Pemutar"},"showInfoButton":{"message":"Tampilkan Tombol Info Di Pemutar Video YouTube"},"autoHideInfoButton":{"message":"Otomatis Sembunyikan Tombol Info"},"showDeleteButton":{"message":"Tampilkan Tombol Hapus Di Pemutar Video YouTube"},"enableViewTracking":{"message":"Aktifkan Pelacakan Jumlah Lewati"},"whatViewTracking":{"message":"Fitur ini melacak segmen mana yang sudah anda lewati untuk memberitahu pengguna berapa banyak submisi mereka telah membantu orang lain dan digunakan sebagai metrik bersamaan dengan upvote untuk memastikan tidak ada spam dalam basis data. Ekstensi mengirim pesan ke server tiap kali anda melewati segmen. Harapannya kebanyakan orang tidak akan mengubah opsi ini agar jumlah tayangan akurat. :)"},"enableViewTrackingInPrivate":{"message":"Aktifkan Pelacakan Jumlah Lewati Pada Tab Privat/Penyamaran"},"enableTrackDownvotes":{"message":"Tampung segmen yang dijempolbawahkan"},"whatTrackDownvotes":{"message":"Semua segmen yang dijempolbawahkan akan tetap tersembunyi bahkan jika disegarkan"},"trackDownvotesWarning":{"message":"Peringatan: Menonaktifkan ini akan menghapus semua jempol bawah yang ditampung"},"enableTrackDownvotesInPrivate":{"message":"Simpan penilaian negatif terhadap segmen dalam tab privat/penyamaran"},"enableQueryByHashPrefix":{"message":"Kueri dengan Hash Prefix"},"whatQueryByHashPrefix":{"message":"Daripada meminta segmen dari server menggunakan videoID, 4 huruf pertama dari hash dari videoID dikirim. Server akan mengirim kembali data untuk semua video dengan hash yang mirip."},"enableShowCategoryWithoutPermission":{"message":"Tampilkan kategori di dalam menu submisi bahkan tanpa izin submisi"},"whatShowCategoryWithoutPermission":{"message":"Beberapa kategori memerlukan izin pengajuan karena persyaratan reputasi minimum"},"showNotice":{"message":"Tampilkan Pemberitahuan Lagi"},"showSkipNotice":{"message":"Tampilkan pemberitahuan setelah melewati segmen"},"showUpcomingNotice":{"message":"Berikan peringatan sebelum segmen dimulai"},"showCategoryGuidelines":{"message":"Tampilkan Bantuan Kategori"},"noticeVisibilityMode0":{"message":"Pemberitahuan Lewati Ukuran Penuh"},"noticeVisibilityMode1":{"message":"Pemberitahuan Lewati Kecil untuk Lewati Otomatis"},"noticeVisibilityMode2":{"message":"Semua Pemberitahuan Lewati Kecil"},"noticeVisibilityMode3":{"message":"Pemberitahuan Lewati Pudar untuk Lewati Otomatis"},"noticeVisibilityMode4":{"message":"Semua Pemberitahuan Lewati Pudar"},"longDescription":{"message":"SponsorBlock membuat anda melewati sponsor, intro, outro, pengingat berlangganan dan segmen mengganggu lainnya di video YouTube. SponsorBlock adalah ekstensi browser crowdsourced yang membolehkan siapa saja mengirim waktu awal dan akhir dari segmen sponsor dan segmen video YouTube lainnya. Setelah seseorang mengirim informasi ini, orang lain yang memakai ekstensi ini akan melewati segmen sponsor di video yang sama. Anda juga dapat melewati bagian non-musik di musik video.","description":"Full description of the extension on the store pages."},"website":{"message":"Situs","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Kode Sumber","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Pemberitahuan sudah ditingkatkan!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Jika anda masih tidak menyukainya, tekan tombol jangan tampilkan.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Lewati segmen","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Mulai/hentikan segmen","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Buka menu submisi","description":"Keybind label"},"setSubmitKeybind":{"message":"Ajukan segmen","description":"Keybind label"},"setPreviewKeybind":{"message":"Pratinjau Segmen","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Tutup pemberitahuan lewati","description":"Keybind label"},"setDownvoteKeybind":{"message":"Beri penilaian negatif ke segmen","description":"Keybind label"},"setUpvoteKeybind":{"message":"Dukung segmen","description":"Keybind label"},"nextChapterKeybind":{"message":"Bab selanjutnya","description":"Keybind label"},"previousChapterKeybind":{"message":"Bab sebelumnya","description":"Keybind label"},"openDeArrowMenu":{"message":"Buka menu pengajuan","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Pilih sebuah tombol dengan mengetikkannya dan pilih tombol modifier apa saja yang Anda ingin gunakan."},"disableSkipping":{"message":"Melewati diaktifkan"},"enableSkipping":{"message":"Melewati dinonaktifkan"},"yourWork":{"message":"Hasil Kerja Anda","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Kode Kesalahan: "},"skip":{"message":"Lewati"},"mute":{"message":"Bisukan"},"full":{"message":"Video Penuh","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Lewati {0}?"},"mute_category":{"message":"Bisukan {0}?"},"skip_to_category":{"message":"Lompat ke {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Yang akan datang {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} dilewati","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} Dibisukan","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Melewati ke {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Dinilai di {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Nonaktifkan Lewati Otomatis"},"enableAutoSkip":{"message":"Aktifkan Lewati Otomatis"},"audioNotification":{"message":"Notifikasi Audio Saat Dilewati"},"audioNotificationDescription":{"message":"Notifikasi audio akan berbunyi saat melewati sebuah segmen. Jika nonaktif (atau lewati otomatis nonaktif), tidak ada suara yang akan diputar."},"showTimeWithSkips":{"message":"Tampilkan Waktu Dikurangi Yang Dilewati"},"showTimeWithSkipsDescription":{"message":"Waktu ini muncul di dalam kurung disamping waktu asli di bilah waktu. Ini menunjukkan durasi total video yang tidak termasuk segmen apapun. Ini termasuk segmen yang ditandai hanya \"Tampilkan Di Bilah Waktu\"."},"youHaveSkipped":{"message":"Anda sudah melewati "},"minLower":{"message":"menit"},"minsLower":{"message":"menit"},"hourLower":{"message":"jam"},"hoursLower":{"message":"jam"},"youHaveSavedTime":{"message":"Anda sudah menghemat waktu orang lain","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" dari hidup mereka","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Cek status.sponsor.ajay.app untuk status server."},"changeUserID":{"message":"Impor/Ekspor UserID Pribadi Anda"},"whatChangeUserID":{"message":"Ini harus dirahasiakan. Ini seperti kata sandi dan tidak boleh dibagikan kepada siapa pun. Jika seseorang mempunyai ini, mereka bisa menyamar jadi Anda. Jika Anda mencari userID publik Anda, klik ikon papan tulis di popup."},"setUserID":{"message":"Atur UserID pribadi"},"userIDChangeWarning":{"message":"Peringatan: Mengubah UserID Pribadi bersifat permanen. Apakah Anda yakin ingin melakukan ini? Pastikan Anda telah mencadangkan yang lama untuk berjaga-jaga."},"createdBy":{"message":"Dibuat Oleh"},"supportOtherSites":{"message":"Dukung Situs Youtube Pihak Ketiga"},"supportOtherSitesDescription":{"message":"Mendukung klien Youtube pihak ketiga. Untuk mengaktifkannya, terima dulu izin tambahan.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Situs yang didukung: "},"optionsInfo":{"message":"Aktifkan dukungan Invidious, nonaktifkan lewati otomatis, tombol sembunyi dan lainnya."},"addInvidiousInstance":{"message":"Tambah Instansi Klien Pihak Ketiga"},"addInvidiousInstanceDescription":{"message":"Tambahkan instansi khusus. Ini harus diformat Hanya dengan domain. Contoh: invidious.ajay.app"},"add":{"message":"Tambah"},"addInvidiousInstanceError":{"message":"Domain ini tidak valid. Ini harus HANYA mengandung bagian domainnya. Contoh: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Reset Daftar Instansi Invidious"},"resetInvidiousInstanceAlert":{"message":"Anda akan mereset daftar instansi invidious"},"currentInstances":{"message":"Instansi sekarang:"},"minDuration":{"message":"Durasi minimal (detik):"},"minDurationDescription":{"message":"Segmen yang lebih kecil dari nilai yang diatur tidak akan dilewati atau tampil di pemutar."},"enableManualSkipOnFullVideo":{"message":"Gunakan lewati manual jika ada label seluruh video"},"whatManualSkipOnFullVideo":{"message":"Untuk yang ingin menonton video tanpa gangguan jika sepenuhnya disponsori atau promosi sendiri."},"skipNoticeDuration":{"message":"Lewati maklumat berdurasi (detik):"},"skipNoticeDurationDescription":{"message":"Maklumat lewati akan tetap di layar setidaknya selama ini. Untuk lewati manual, mungkin akan terlihat lebih lama."},"shortCheck":{"message":"Submisi ini lebih pendek dari opsi durasi minimalmu. Ini dapat berarti ini sudah dikirim, dan hanya akan diabaikan karena opsi ini. Apakah anda yakin ingin mengirim?"},"liveOrPremiere":{"message":"Mengirim pada livestream atau premiere tidak diperbolehkan. Mohon tunggu sampai selesai, lalu muat ulang halamannya dan verifikasi bahwa segmentnya masih valid."},"showUploadButton":{"message":"Tampilkan Tombol Unggah"},"customServerAddress":{"message":"Alamat Server SponsorBlock"},"customServerAddressDescription":{"message":"Alamat yang SponsorBlock gunakan untuk memanggil server.\nKecuali jika anda mempunyai instansi server sendiri, ini tidak perlu diubah."},"dataFetchingServerAddress":{"message":"Alamat Server Ambil Data"},"dataFetchingServerAddressDescription":{"message":"Alamat yang digunakan untuk membuat panggilan ke server pengambilan data.\nKecuali anda memiliki server instansi anda sendiri, ini tidak perlu diubah."},"save":{"message":"Simpan"},"reset":{"message":"Atur ulang"},"customAddressError":{"message":"Alamat ini tidak berada di bentuk yang benar. Pastikan kamu menggunakan http:// atau https:// di awal dan tidak ada garis mengikuti."},"areYouSureReset":{"message":"Apakah anda yakin ingin mengatur ulang ini?"},"mobileUpdateInfo":{"message":"m.youtube.com sekarang didukung"},"exportOptions":{"message":"Impor/Ekspor Semua Pengaturan"},"exportOtherData":{"message":"Impor/Ekspor Semua Data Lain"},"exportOptionsCopy":{"message":"Edit/salin"},"exportOptionsDownload":{"message":"Simpan ke file"},"exportOptionsUpload":{"message":"Muat dari file"},"whatExportOptions":{"message":"Ini adalah seluruh konfigurasi Anda di JSON. Ini mencakup UserID Pribadi Anda, maka pastikan Anda membagikan ini dengan bijak."},"setOptions":{"message":"Atur Opsi"},"exportOptionsWarning":{"message":"Peringatan: Mengubah opsi bersifat permanen dan bisa merusak pemasangan anda. Apakah anda yakin ingin melakukan ini? Pastikan untuk mencadangkan yang lama untuk berjaga."},"incorrectlyFormattedOptions":{"message":"JSON ini tidak diformat dengan benar. Pengaturan anda tidak berubah."},"confirmNoticeTitle":{"message":"Kirim Segmen"},"submit":{"message":"Kirim"},"cancel":{"message":"Batal"},"delete":{"message":"Hapus"},"preview":{"message":"Pratinjau"},"unsubmitted":{"message":"Belum dikirim"},"inspect":{"message":"Inspeksi"},"edit":{"message":"Ubah"},"copyDebugLogs":{"message":"Salin Log Awakutu"},"copyDebugInformation":{"message":"Salin Informasi Debug Ke Papan Klip"},"copyDebugInformationFailed":{"message":"Gagal menyalin ke papan klip"},"copyDebugInformationOptions":{"message":"Salin informasi ke papan klip untuk menyediakan pengembang saat mengangkat bug / saat pengembang memintanya. Informasi sensitif seperti user ID, channel yang didaftar-putihkan, dan alamat server kustom akan dihapus. Namun itu mengandung informasi seperti useragent anda, browser, sistem operasi, dan nomor versi ekstensi. "},"copyDebugInformationComplete":{"message":"Informasi debug telah disalin ke papan klip. Jangan ragu untuk menghapus informasi yang tidak ingin anda bagikan. Simpan ini di file teks atau salin ke laporan bug."},"keyAlreadyUsed":{"message":"Pintasan ini telah diatur ke aksi yang lain. Mohon pilih yang lain."},"to":{"message":"sampai","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Tersalin!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Tampilkan transisi segue"},"generic_guideline2":{"message":"Memainkan sebagai tidak apa pun yang dilewati"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Promosi dibayar, tautan dibayar dan iklan langsung. Tidak untuk promosi diri sendiri atau dukungan gratis untuk gerakan/kreator/situs/produk yang mereka suka."},"category_sponsor_guideline1":{"message":"Promosi berbayar"},"category_sponsor_guideline2":{"message":"Bukan untuk donasi atau barang dagangan kustom"},"category_selfpromo":{"message":"Promosi Diri Sendiri/Tidak Dibayar"},"category_selfpromo_description":{"message":"Mirip dengan \"sponsor\" kecuali ini tidak dibayar atau promosi diri sendiri. Ini termasuk merchandise, donasi, atau informasi tentang siapa yang berkolaborasi dengan mereka."},"category_selfpromo_guideline1":{"message":"Donasi, langganan, dan barang dagangan kustom"},"category_selfpromo_guideline2":{"message":"Sebutan gratis yang tidak menambahkan apa pun ke videonya"},"category_selfpromo_guideline3":{"message":"Bukan untuk produk dan barang dagangan yang didesain oleh koperasi"},"category_exclusive_access":{"message":"Akses Eksklusif"},"category_exclusive_access_description":{"message":"Hanya untuk menandai seluruh video. Digunakan ketika sebuah video mempromosikan sebuah produk, layanan atau lokasi yang diterima secara gratis atau mendapatkan izin."},"category_exclusive_access_pill":{"message":"Video ini mempromosikan sebuah produk, layanan atau lokasi yang diterima secara gratis atau mendapatkan izin","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Seluruh video pertunjukkan sesuatu dengan akses gratis atau berbayar"},"category_interaction":{"message":"Pengingat Interaksi (Berlangganan)"},"category_interaction_description":{"message":"Saat ada pengingat singkat untuk meminta suka, berlangganan atau mengikuti mereka di tengah konten. Jika panjang atau tentang sesuatu yang spesifik, sebaiknya pakai kategori promosi diri sendiri."},"category_interaction_guideline1":{"message":"Pengingat pendek untuk menyukai video, berlangganan, atau ikuti"},"category_interaction_guideline2":{"message":"Menampilkan pengingat tidak langsung untuk berkomentar"},"category_interaction_guideline3":{"message":"Bukan untuk promosi umum, hanya bilang untuk melakukan tindakan"},"category_interaction_short":{"message":"Pengingat Interaksi"},"category_intro":{"message":"Jeda/Animasi Intro"},"category_intro_description":{"message":"Bagian yang bukan konten sebenarnya. Dapat berupa jeda, gambar statik, atau animasi berulang. Ini tidak boleh digunakan untuk transisi yang berisi informasi."},"category_intro_short":{"message":"Jeda"},"category_intro_guideline1":{"message":"Interval tanpa konten aslinya"},"category_intro_guideline2":{"message":"Bukan untuk transisi dengan informasi"},"category_outro":{"message":"Kartu Akhir/Kredit"},"category_outro_description":{"message":"Kredit atau saat kartu akhir YouTube muncul. Tidak untuk kesimpulan dengan informasi."},"category_outro_guideline1":{"message":"Jangan tampilkan konten, bahkan jika kartu akhir ada di layar"},"category_preview_description":{"message":"Koleksi klip yang menampilkan hal yang akan hadir di video ini atau video lain dalam suatu seri, di mana segala informasinya diulang dalam video tersebut."},"category_preview_guideline1":{"message":"Klip yang ditampilkan nanti, atau di video di masa mendatang"},"category_preview_guideline2":{"message":"Rekap dari video sebelumnya"},"category_preview_guideline3":{"message":"Bukan untuk bagian yang menambahkan konten tambahan"},"category_filler":{"message":"Candaan atau bagian yang menyimpang dari isi cerita"},"category_filler_short":{"message":"Penyimpangan cerita"},"category_filler_guideline1":{"message":"Adegan atau lelucon yang kurang relevan dengan isi video"},"category_filler_guideline2":{"message":"Gangguan, blooper, replay"},"category_filler_guideline3":{"message":"Bukan untuk scene yang dibutuhkan untuk mengerti topik"},"category_music_offtopic":{"message":"Musik: Bagian Non-Musik"},"category_music_offtopic_description":{"message":"Hanya digunakan untuk video musik. Ini seharusnya hanya digunakan untuk bagian dari video musik yang tidak tercakup kategori lain."},"category_music_offtopic_short":{"message":"Non-Musik"},"category_music_offtopic_guideline1":{"message":"Bagian bukan di rilis resmi"},"category_music_offtopic_guideline2":{"message":"Non-musik di pertunjukkan langsung"},"category_poi_highlight":{"message":"Sorotan"},"category_poi_highlight_description":{"message":"Bagian video yang banyak orang lihat. Sama untuk komentar \"Video dimulai di x\"."},"category_poi_highlight_guideline1":{"message":"Bagian banyak orang yang mencari"},"category_poi_highlight_guideline2":{"message":"Dapat melewati topik"},"category_poi_highlight_guideline3":{"message":"Dapat melewati ke judul atau thumbnail"},"category_chapter":{"message":"Bab"},"category_chapter_description":{"message":"Bab bernama khusus yang menjelaskan bagian utama video."},"category_chapter_guideline1":{"message":"Jangan menyebutkan nama merek sponsor"},"category_chapter_guideline2":{"message":"Gunakan bab yang lebih besar untuk bagian umum"},"category_chapter_guideline3":{"message":"Bab yang lebih kecil dapat ditempatkan di dalam yang lebih besar"},"category_livestream_messages":{"message":"Livestream: Baca Pesan/Donasi"},"category_livestream_messages_short":{"message":"Membaca Pesan Chat"},"autoSkip":{"message":"Lewati Otomatis"},"manualSkip":{"message":"Lewati Manual"},"showOverlay":{"message":"Tampilkan Di Bilah Waktu"},"disable":{"message":"Nonaktif"},"autoSkip_POI":{"message":"Otomatis lewati ke awal"},"manualSkip_POI":{"message":"Tanya saat video dimuat"},"showOverlay_POI":{"message":"Tampilkan di Bilah Waktu"},"showOverlay_full":{"message":"Tampilkan Label"},"showOverlay_chapter":{"message":"Tampilkan Bab"},"autoSkipOnMusicVideos":{"message":"Lewati semua segmen secara otomatis ketika ada segmen non-music"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Hanya lewati otomatis di music.youtube.com"},"muteSegments":{"message":"Perbolehkan segmen untuk bisu daripada melewati"},"fullVideoSegments":{"message":"Tunjukkan ikon ketika keseluruhan video merupakan iklan","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Perlihatkan label di thumbnail video juga","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Warna yang Belum Dikirim","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Warna Bilah Waktu"},"category":{"message":"Kategori"},"skipOption":{"message":"Opsi Lewati","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"advancedSkipNotSaved":{"message":"Galat pada sintaks: Pilihan kamu mungkin tidak tersipan"},"advancedSkipSettingsHelp":{"message":"Cara kerja","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Aktifkan Server Beta Testing"},"whatEnableTestingServer":{"message":"Submisi dan vote anda TIDAK TERHITUNG pada server utama. Hanya gunakan ini untuk percobaan."},"testingServerWarning":{"message":"Semua submisi dan vote TIDAK TERHITUNG pada server utama saat terkoneksi ke server percobaan."},"bracketNow":{"message":"(Sekarang)"},"moreCategories":{"message":"Kategori Lain"},"chooseACategory":{"message":"Pilih Kategori"},"enableThisCategoryFirst":{"message":"Untuk mengirimkan segmen dengan kategori \"{0}\", Anda harus mengaktifkannya di opsi. Anda akan diarahkan ke opsi sekarang.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Perhatian: Tipe segmen ini hanya bisa maksimum aktif satu kali. Mengirimkan beberapa dapat mengakibatkan muncul pada kondisi acak."},"youMustSelectACategory":{"message":"Anda harus memilih kategori untuk semua segmen yang anda kirimkan!"},"bracketStart":{"message":"(Mulai)"},"bracketEnd":{"message":"(Selesai)"},"End":{"message":"Akhir","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"disembunyikan: voting rendah"},"hiddenDueToDuration":{"message":"disembunyikan: terlalu pendek"},"manuallyHidden":{"message":"disembunyikan sendiri"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID Channel belum dimuat. Apabila anda menggunakan video yang tersematkan, coba menggunakan halaman utama YouTube. Hal ini juga dapat disebabkan oleh perubahan yang ada pada tampilan YouTUbe, apabila anda mengira seperti itu, buat komentar disini:"},"invidiousPermissionRefresh":{"message":"Peramban telah mencabut izin yang diperlukan untuk berfungsi di Invidious dan situs pihak ketiga lainnya. Klik tombol di bawah untuk mengaktifkan kembali izin ini."},"acceptPermission":{"message":"Terima permintaan izin"},"permissionRequestSuccess":{"message":"Permintaan izin berhasil!"},"permissionRequestFailed":{"message":"Permintaan izin gagal, apakah anda mengklik tolak?"},"adblockerIssueWhitelist":{"message":"Apabila anda tidak dapat menyelesaikan masalah ini, maka nonaktifkan pengaturan 'Paksa Cek Channel Sebelum Melewati', dikarenakan SponsorBlock tidak dapat menerima informasi channel untuk video ini"},"forceChannelCheck":{"message":"Paksa Cek Channel Sebelum Melewati"},"whatForceChannelCheck":{"message":"Secara standar, ini akan melewati segmen segera bahkan sebelum tahu apa channelnya. Secara standar, beberapa segmen pada awal video mungkin terlewati pada channel yang didaftar-putihkan. Mengaktifkan opsi ini akan mencegah ini namun membuat semua pelewatan mempunyai sedikit delay karena mendapatkan channelID membutuhkan waktu. Delay ini mungkin menjadi tidak terasa jika anda mempunyai internet yang cepat."},"forceChannelCheckPopup":{"message":"Pertimbangkan Mengaktifkan \"Paksa Pengecekan Channel Sebelum Pelewatan\""},"downvoteDescription":{"message":"Salah, Waktu Tidak Tepat"},"incorrectVote":{"message":"Salah"},"harmfulVote":{"message":"Berbahaya","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Ubah Kategori"},"nonMusicCategoryOnMusic":{"message":"Video ini dikategorikan sebagai musik. Apakah anda yakin ini berisi sponsor? Jika ini ternyata adalah \"Segmen non-musik\", buka pengaturan ekstensi dan aktifkan kategorinya. Lalu, anda bisa mengirim segmen ini sebagai \"Non-musik\" bukannya sponsor. Harap membaca panduan jika anda kebingungan."},"multipleSegments":{"message":"Banyak Segmen"},"guidelines":{"message":"Pedoman"},"readTheGuidelines":{"message":"Baca Pedomannya!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategori disini!"},"categoryUpdate2":{"message":"Buka opsi untuk melewati intro, outro, merch, dll."},"help":{"message":"Bantuan"},"GotIt":{"message":"Mengerti","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Segmen ini besar. Jika seluruh video tentang satu topik, ubah dari \"Lewati\" ke \"Video Penuh\". Lihat pedoman untuk informasi lanjutan."},"categoryPillTitleText":{"message":"Seluruh video ini ditandai sebagai kategori ini dan terlalu terintegrasi untuk dapat dipisahkan"},"chapterNameTooltipWarning":{"message":"Salah satu nama bab Anda mirip dengan sebuah kategori. Anda harus menggunakan kategori jika memungkinkan sebagai gantinya."},"experiementOptOut":{"message":"Tidak ikut eksperimen masa depan","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Sembunyikan selamanya"},"warningChatInfo":{"message":"Kami perhatikan Anda membuat beberapa kesalahan umum. Kami hargai sekali yang Anda kerjakan sejauh ini, tapi di sini kami berjuang mencapai sempurna, sehingga kesalahan sangat kecil pun berarti :)"},"questionButton":{"message":"Saya memiliki pertanyaan"},"askAQuestion":{"message":"Berikan pertanyaan"},"warningConfirmButton":{"message":"Saya mengerti alasannya"},"warningError":{"message":"Terjadi kesalahan ketika mengakui peringatan:"},"deArrowMessageRecieved":{"message":"Anda telah menerima petunjuk dari moderator"},"Donate":{"message":"Donasi"},"considerDonating":{"message":"Bantu danai perkembangan"},"hideDonationLink":{"message":"Sembunyikan tautan donasi"},"darkModeOptionsPage":{"message":"Mode Gelap Di Halaman Opsi"},"helpPageThanksForInstalling":{"message":"Terima kasih telah menginstall SponsorBlock."},"helpPageReviewOptions":{"message":"Haram ditinjau opsi di bawah ini"},"helpPageFeatureDisclaimer":{"message":"Banyak fitur yang dinonaktifkan secara bawaan. Jika Anda ingin melewati intro, outro, mengunakan Invidious, dll, aktifkan mereka dibawah ini. Anda juga bisa menyembunyikan/menampilkan elemen UI."},"helpPageHowSkippingWorks2":{"message":"Kapanpun Anda melewati segmen, Anda akan mendapatkan pemberitahuan. Jika pengaturan waktu terlihat salah tolak dengan mengklik jempol bawah! Anda juga dapat memilih dalam popup."},"Submitting":{"message":"Mengajukan"},"helpPageCopyOfDatabase2":{"message":"Sumber kode tersedia secara bebas. Jadi, jika sesuatu terjadi pada saya, pengajuan kamu tidak akan hilang."},"Credits":{"message":"Kredit"},"LearnMore":{"message":"Pelajari Lebih Lanjut"},"FullDetails":{"message":"Detail Penuh"},"CopyDownvoteButtonInfo":{"message":"Menurunkan suara dan membuat salinan lokal untuk Anda kirim ulang"},"OpenCategoryWikiPage":{"message":"Membuka halaman wiki kategori ini."},"CopyAndDownvote":{"message":"Salin dan berikan turunkan suara"},"ContinueVoting":{"message":"Lanjutkan Memvoting"},"ChangeCategoryTooltip":{"message":"Ini akan menerapkan ke segmen Anda"},"downvote":{"message":"Jempol bawah"},"upvote":{"message":"Jempol atas"},"hideSegment":{"message":"Sembunyikan segmen"},"skipSegment":{"message":"Lewati segmen"},"playChapter":{"message":"Mulai bab"},"SponsorTimeEditScrollNewFeature":{"message":"Gunakan roda mouse ketika berada di kotak edit untuk mengatur waktu dengan cepat. Kombinasi dengan tombol [Ctrl + Shift] bisa digunakan untuk perubahan yang halus."},"categoryPillNewFeature":{"message":"Baru! Lihat jika sebuah video disponsori seluruhnya atau mempromosikan diri"},"yearAbbreviation":{"message":"t","description":"100y"},"dayAbbreviation":{"message":"h","description":"100d"},"hourAbbreviation":{"message":"j","description":"100h"},"optionsTabBehavior":{"message":"Perilaku","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Tampilan","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Pintasan keyboard","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Cadangkan/Pulihkan","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Lain-lain","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Lewati pelihatan pemberitahuan","description":"Option label"},"unbind":{"message":"Lepaskan","description":"Unbind keyboard shortcut"},"notSet":{"message":"Tidak diatur"},"change":{"message":"Ubah"},"youtubeKeybindWarning":{"message":"Ini adalah pintasan YouTube. Apakah Anda yakin untuk menggunakannya?"},"betaServerWarning":{"message":"Server BETA diaktifkan!"},"openOptionsPage":{"message":"Buka laman opsi"},"resetToDefault":{"message":"Atur ulang pengaturan ke bawaan"},"confirmResetToDefault":{"message":"Apakah Anda yakin ingin mengatur ulang semua pengaturan ke nilai bawaan?\nTindakan ini tidak dapat diurungkan."},"exportSegments":{"message":"Ekspor segmen"},"importSegments":{"message":"Impor segmen"},"Import":{"message":"Impor","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Penukaran Berhasil!"},"redeemFailed":{"message":"Kunci lisensi tidak valid"},"hideUpsells":{"message":"Sembunyikan opsi yang tidak tersedia tanpa pembayaran tambahan"},"hideNewFeatureUpdates":{"message":"Sembunyikan petunjuk tentang fitur baru"},"redeem":{"message":"Tukar"},"enterLicenseKey":{"message":"Masukkan Kode Lisensi"},"unsubmittedSegmentCounts":{"message":"Kamu mempunyai {0} dalam {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Anda tidak mempunyai segmen yang belum dikirim","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"segmen belum diajukan","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"segmen belum diajukan","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"video","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Kosongkan segmen","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Yakin ingin menghapus semua segmen yang belum diajukan?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Tampilkan segmen","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Sembunyikan segmen","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID Video","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Jumlah Segmen","description":"Header of the unsubmitted segments list"},"actions":{"message":"Tindakan","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Bagikan sebagai Tautan"},"segmentFetchFailureWarning":{"message":"Peringatan: Server belum merespon dengan segmen. Mungkin sebenarnya sudah ada segmen di video ini namun Anda belum menerimanya karena ada masalah dengan server."},"allowScrollingToEdit":{"message":"Izinkan Menggulir Untuk Menyunting Waktu"},"NoticeTimeAfterSkip":{"message":"{seconds}dtk","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Judul dan Gambar Mini lebih baik untuk YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Judul dan gambar mini harus deskriptif dan tidak sensasional","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Pilih yang lebih detail"},"Original":{"message":"Orisinil"},"OriginalTitle":{"message":"Judul asli"},"CurrentTime":{"message":"Waktu Sekarang"},"resetCustomTitle":{"message":"Kembalikan Judul ke Versi Asli"},"resetIcon":{"message":"Atur Ulang Ikon"},"TypeYourOwnTitleHere":{"message":"Ketik judul kamu di sini"},"VideoNotReady":{"message":"Video belum siap"},"FailedToRender":{"message":"Gagal me-render","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Kanvas hilang","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Pengecualian saat me-render","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Gagal memuat","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Format Judul"},"Disabled":{"message":"Nonaktif"},"CapitalizeWords":{"message":"Buat Judul Berkapital"},"TitleCase":{"message":"Huruf Kapital"},"SentenceCase":{"message":"Kapital awal kalimat"},"LowerCase":{"message":"Huruf kecil"},"FirstLetterUppercase":{"message":"Kapital Awal Huruf"},"shouldCleanEmojis":{"message":"Hapus Emoji"},"onlyTitleCaseInEnglish":{"message":"Buat Judul Kapital Untuk Judul Non-Inggris"},"thumbnailFallbackOption":{"message":"Ketika Tidak Ada Gambar Video yang Dimasukkan"},"whatThumbnailFallbackOption":{"message":"Ketika memilih waktu acak, data SponsorBlock akan digunakan agar segmen promosi tidak terpilih.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Menunjukkan sebuah screenshot dari waktu video secara acak"},"TheOriginalThumbnail":{"message":"Tampilkan gambar asli"},"showABlankBox":{"message":"Tunjukkan kotak kosong"},"AutoGenerated":{"message":"Tampilkan gambar yang dibuat otomatis oleh YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Awal"},"Middle":{"message":"Tengah"},"keepUnsubmitted":{"message":"Tampung Suara Teraju"},"ignoreAbThumbnails":{"message":"Jangan Gunakan Gambar pada Uji A/B"},"titleMaxLines":{"message":"Kalimat Maksimum untuk Judul"},"hideDetailsWhileFetching":{"message":"S'bunyikan rincian saat ambil data"},"ignoreTranslatedTitles":{"message":"Jangan terjemahkan judul video","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube terkadang otomatis menerjemahkan judul ke bahasa bawaan. Opsi ini hanya berlaku jika judul urun daya tidak ada."},"onAllPages":{"message":"Pada Semua Halaman","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Di Semua Laman kecuali Video","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Tidak pernah"},"moreAboutKAnonymity":{"message":"Pelajari lebih lanjut tentang K-Anonymity","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Selalu tampilkan tombol \"Tampikan Asli\""},"Enable":{"message":"Aktifkan"},"Titles":{"message":"Judul","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Gambar kecil","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"Galat"},"ShowOriginal":{"message":"Lihat Detail Original"},"ShowModified":{"message":"Perlihatkan detail yang dimodifikasi"},"ShowFormatted":{"message":"Perlihatkan detail yang diformat"},"FillerWarning":{"message":"Peringatan: Ini adalah kategori yang sangat agresif. Kamu kemungkinan besar akan harus melewati beberapa hal, atau terkadang mematikannya. Kamu sudah diperingatkan bahwa banyak video memiliki memiliki 50% atau lebih yang isi videonya dilewatkan! Tetapi, ingat bahwa ada pedoman spesifik yang harus diikuti ketika ingin mengirim.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Masuk ke Discord atau Matrix untuk tetap berbicara di percakapan ini","description":"Appears on the top of the integrated chatbox"},"tip5":{"message":"Besarkan huruf seperti kalimat","description":"Tip about submitting titles to DeArrow"},"termsOfUse":{"message":"Ketentuan Penggunaan"},"openSourceLicenses":{"message":"Lisensi Sumber Terbuka"},"Close":{"message":"Tutup"},"ViewLicenseKey":{"message":"Lihat Kode Lisensi"},"SharingIsCaring":{"message":"Membagi adalah peduli"},"syncDisabledWarningDeArrow":{"message":"DeArrow tidak akan berfunsi tanpa penyimpanan."},"storageFull":{"message":"Penyimpanan sudah penuh. Mohon hapus beberapa segmen teraju di opsi."}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/it/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/it/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."},"400":{"message":"Richiesta non valida"},"409":{"message":"Questo è già stato inviato"},"502":{"message":"Il server sembra essere sovraccaricato. Riprova tra pochi secondi."},"fullName":{"message":"SponsorBlock per YouTube - Salta gli sponsor","description":"Name of the extension."},"Description":{"message":"Salta sponsorizzazioni, richieste d'iscrizione ai canali e molto altro sui video di YouTube. Segnala gli sponsor sui video che guardi per salvare il tempo agli altri.","description":"Description of the extension."},"channelWhitelisted":{"message":"Canale aggiunto alla lista delle esclusioni!"},"Segment":{"message":"segmento"},"Segments":{"message":"segmenti"},"SegmentsCap":{"message":"Segmenti"},"Chapters":{"message":"Capitoli"},"renderAsChapters":{"message":"Visualizza segmenti come capitoli","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Mostra il segmento corrente accanto alla durata del video"},"showAutogeneratedChapters":{"message":"Mostra i capitoli auto-generati da YouTube"},"upvoteButtonInfo":{"message":"Vota questo contributo"},"reportButtonTitle":{"message":"Segnala"},"reportButtonInfo":{"message":"Segnala questo contributo come non corretto."},"Dismiss":{"message":"Chiudi"},"Loading":{"message":"Caricamento..."},"Hide":{"message":"Non mostrare più"},"hitGoBack":{"message":"Premi non saltare per tornare da dove sei venuto."},"unskip":{"message":"Non saltare"},"reskip":{"message":"Salta ancora"},"unmute":{"message":"Riattiva il microfono"},"paused":{"message":"In pausa"},"manualPaused":{"message":"Timer fermato"},"confirmMSG":{"message":"\n\nPer modificare o eliminare valori specifici, premi il pulsante delle informazioni o apri il popup cliccando l'icona dell'estensione nell'angolo in alto a destra."},"clearThis":{"message":"Sei sicuro di volerlo cancellare?\n\n"},"Unknown":{"message":"Si è verificato un errore durante l'invio del segmento, per favore riprova più tardi."},"sponsorFound":{"message":"Questo video ha dei segmenti nel database!"},"sponsor404":{"message":"Nessun segmento trovato"},"sponsorStart":{"message":"Il segmento inizia qui"},"sponsorEnd":{"message":"Il segmento finisce ora"},"sponsorCancel":{"message":"Annulla Creazione del Segmento"},"noVideoID":{"message":"Nessun video YouTube trovato.\nSe è un errore, ricarica la scheda."},"refreshSegments":{"message":"Ricarica i segmenti"},"success":{"message":"Ha funzionato!"},"voted":{"message":"Votato!"},"serverDown":{"message":"Sembra che il server non funzioni. Contatta subito lo sviluppatore."},"connectionError":{"message":"Si è verificato un errore durante la connessione. Codice errore: "},"segmentsStillLoading":{"message":"Segmenti in caricamento..."},"clearTimes":{"message":"Rimuovi i segmenti"},"openPopup":{"message":"Apri il popup di SponsorBlock"},"closePopup":{"message":"Chiudi il popup"},"closeIcon":{"message":"Icona Chiudi"},"OpenSubmissionMenu":{"message":"Apri menu invio"},"OpenCasualVoteMenu":{"message":"Apri menu' modalità casuale"},"sortSegments":{"message":"Ordina segmenti"},"submitCheck":{"message":"Sei sicuro di volerlo inviare?"},"whitelistChannel":{"message":"Aggiungi il canale alle eccezioni"},"removeFromWhitelist":{"message":"Rimuovi il canale dalle eccezioni"},"voteOnTime":{"message":"Vota un segmento"},"Submissions":{"message":"Contributi"},"savedPeopleFrom":{"message":"Hai fatto risparmiare in totale "},"viewLeaderboard":{"message":"Classifica"},"recordTimesDescription":{"message":"Invia"},"submissionEditHint":{"message":"La modifica della sezione comparirà dopo che hai cliccato su Inviare","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Suggerimento: puoi configurare dei comandi rapidi nelle opzioni"},"clearTimesButton":{"message":"Cancella minutaggio"},"Username":{"message":"Nome utente"},"setUsername":{"message":"Imposta nome utente"},"copyPublicID":{"message":"Copia UserID Pubblico"},"copySegmentID":{"message":"Copia ID Segmento"},"hideThis":{"message":"Nascondi"},"Options":{"message":"Opzioni"},"showButtons":{"message":"Mostra i pulsanti sul video"},"hideButtonsDescription":{"message":"Nasconde i pulsanti che appaiono sul video per inviare i segmenti da nascondere."},"showSkipButton":{"message":"Mantieni l'Highlight del Video sulla Barra del Video"},"showInfoButton":{"message":"Mostra il pulsante delle informazioni sopra al video"},"autoHideInfoButton":{"message":"Nascondi in automatico il Pulsante di Informazioni"},"showDeleteButton":{"message":"Mostra il pulsante elimina"},"enableViewTracking":{"message":"Attiva il conteggio dei salti"},"whatViewTracking":{"message":"Questa funzionalità tiene traccia dei segmenti che hai saltato per far sapere agli utenti quanto il loro contributo abbia aiutato gli altri e anche come statistica, insieme ai voti positivi, per garantire che lo spam non entri nel database. L'estensione invierà un messaggio al server ogni volta che salterai un segmento. Si spera che la maggior parte delle persone non modifichino questa impostazione, in modo da non intaccare l'accuratezza dei numeri di visualizzazione. :)"},"enableViewTrackingInPrivate":{"message":"Abilita il conteggio dei salti nelle schede private/anonime"},"enableTrackDownvotes":{"message":"Memorizza i voti negativi ai segmenti"},"whatTrackDownvotes":{"message":"I segmenti votati negativamente rimarranno nascosti anche dopo aver ricaricato la pagina"},"trackDownvotesWarning":{"message":"Attenzione: Disabilitarlo eliminerà tutti i voti negativi precedentemente memorizzati"},"enableTrackDownvotesInPrivate":{"message":"Memorizza i voti negativi ai segmenti in schede private/in incognito"},"enableQueryByHashPrefix":{"message":"Ricerca tramite prefisso hash"},"whatQueryByHashPrefix":{"message":"Invece di richiedere i segmenti dal server utilizzando l'ID del video, viene inviato un hash dei primi 4 caratteri dell'ID. Questo server invierà i dati per tutti i video con hash simili."},"enableShowCategoryWithoutPermission":{"message":"Mostra le categorie nel menu d'invio anche senza l'autorizzazione all'invio"},"whatShowCategoryWithoutPermission":{"message":"Alcune categorie richiedono l'autorizzazione all'invio a causa dei requisiti sulla reputazione minima"},"showNotice":{"message":"Mostra di nuovo l'avviso"},"showSkipNotice":{"message":"Mostra Avviso Dopo Aver Saltato un Segmento"},"showUpcomingNotice":{"message":"Mostra Un Avviso Prima Dell'Inizio Di Un Segmento"},"showCategoryGuidelines":{"message":"Mostra Aiuto della Categoria"},"noticeVisibilityMode0":{"message":"Salta Avvisi di Dimensioni Complete"},"noticeVisibilityMode1":{"message":"Piccoli Salta Avvisi per Salto Automatico"},"noticeVisibilityMode2":{"message":"Tutti i Piccoli Salta Avvisi"},"noticeVisibilityMode3":{"message":"Salta Avvisi Offuscati per Salto Automatico"},"noticeVisibilityMode4":{"message":"Tutti i Salta Avvisi Offuscati"},"longDescription":{"message":"SponsorBlock ti consente di saltare sponsorizzazioni, introduzioni, conclusioni, promemoria di iscrizione e altri elementi fastidiosi dai video YouTube. SponsorBlock è un'estensione per browser di crowdsourcing, cioè che consente a chiunque di inviare l'ora di inizio e di fine dei segmenti sponsorizzati e di altro tipo. Quando una persona invia queste informazioni, chiunque altro in possesso di questa estensione sarà in grado di saltare automaticamente il segmento sponsorizzato. È possibile saltare anche le sezioni non musicali dei video musicali.","description":"Full description of the extension on the store pages."},"website":{"message":"Sito web","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Codice sorgente","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"L'avviso è stato aggiornato!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Se non ti piace ancora, premi il pulsante \"non mostrare mai\".","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Salta segmento","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Inizio/Fine segmento","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Apri menu di invio","description":"Keybind label"},"setSubmitKeybind":{"message":"Invia segmenti","description":"Keybind label"},"setPreviewKeybind":{"message":"Anteprima segmento","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Chiudi l'avviso di salto","description":"Keybind label"},"setDownvoteKeybind":{"message":"Vota negativamente segmento","description":"Keybind label"},"setUpvoteKeybind":{"message":"Vota positivamente segmento","description":"Keybind label"},"nextChapterKeybind":{"message":"Capitolo successivo","description":"Keybind label"},"previousChapterKeybind":{"message":"Capitolo precedente","description":"Keybind label"},"enableDeArrowKey":{"message":"Attiva/disattiva DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Apri menù di invio","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Seleziona un tasto digitandolo e scegli qualsiasi tasto modificatore che desideri utilizzare."},"disableSkipping":{"message":"Abilitato"},"enableSkipping":{"message":"Disabilitato"},"yourWork":{"message":"Il Tuo Lavoro","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Codice Errore: "},"skip":{"message":"Salta"},"mute":{"message":"Silenzia"},"full":{"message":"Video Completo","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Vuoi saltare {0}?"},"mute_category":{"message":"Silenziare {0}?"},"skip_to_category":{"message":"Salta a {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Prossimo {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} Saltato","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} silenziato","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Saltato a {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Votato il {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Disabilita Salto Automatico"},"enableAutoSkip":{"message":"Abilita Salto Automatico"},"audioNotification":{"message":"Notifiche Audio per Salta"},"audioNotificationDescription":{"message":"La notifica audio riprodurrà un suono ogni volta che un segmento verrà saltato. Se questa opzione (o quella del salto automatico) è disattivata, non verrà riprodotto alcun suono."},"showTimeWithSkips":{"message":"Mostra Tempo Con Salti Rimossi"},"showTimeWithSkipsDescription":{"message":"Questo tempo appare tra parentesi accanto al tempo attuale sotto alla barra di progresso. Questo mostra la durata totale del video meno gli spezzoni. Include spezzoni marcati come \"Mostra solo nella barra di progresso\"."},"youHaveSkipped":{"message":"Hai saltato "},"minLower":{"message":"minuto"},"minsLower":{"message":"minuti"},"hourLower":{"message":"ora"},"hoursLower":{"message":"ore"},"youHaveSavedTime":{"message":"Hai fatto risparmiare","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" delle loro vite","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Controlla status.sponsor.ajay.app per lo stato del server."},"changeUserID":{"message":"Importa/Esporta il Tuo UserID Privato"},"whatChangeUserID":{"message":"Questo dovrebbe esser mantenuto privato. È come una password e non dovrebbe esser condiviso con nessuno. Se qualcuno lo possiede, può impersonarti. Se stai cercando il tuo userID pubblico, clicca l'icona degli appunti nel popup."},"setUserID":{"message":"Imposta UserID Privato"},"userIDChangeWarning":{"message":"Attenzione: La modifica dell'UserID Privato è permanente. Sei sicuro di volerlo fare? Assicurati di effettuare il backup di quello precedente."},"createdBy":{"message":"Creato da"},"supportOtherSites":{"message":"Supporta siti di YouTube di terze parti"},"supportOtherSitesDescription":{"message":"Supporta client YouTube di terze parti. Per abilitare il supporto, devi accettare i permessi aggiuntivi.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Pagine supportate: "},"optionsInfo":{"message":"Abilita supporto invidioso, disabilita salto automatico, nascondi i pulsanti e altro ancora."},"addInvidiousInstance":{"message":"Aggiungi Istanza Client 3Rd-Party"},"addInvidiousInstanceDescription":{"message":"Aggiungi un'istanza personalizzata. Deve essere formattata SOLO con il dominio. Esempio: invidious.ajay.app"},"add":{"message":"Aggiungi"},"addInvidiousInstanceError":{"message":"Questo è un dominio non valido. Questo dovrebbe includere SOLO la parte del dominio. Esempio: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Reimposta la lista di istanze Invidious"},"resetInvidiousInstanceAlert":{"message":"Stai per reimpostare la lista di istanze di Invidious"},"currentInstances":{"message":"Istanze Attuali:"},"minDuration":{"message":"Durata minima (secondi):"},"minDurationDescription":{"message":"I segmenti più brevi del valore impostato non verranno saltati o visualizzati nel lettore."},"enableManualSkipOnFullVideo":{"message":"Usa il salto manuale quando c'è un'etichetta per il video completo"},"whatManualSkipOnFullVideo":{"message":"Per le persone che vogliono guardare il video senza interruzioni se è una sponsorizzazione o autopromozione."},"skipNoticeDuration":{"message":"Salta durata avviso (secondi):"},"skipNoticeDurationDescription":{"message":"L'avviso salta rimarrà sullo schermo per almeno questo tempo. Per saltarlo manualmente, potrebbe esser visibile più a lungo."},"shortCheck":{"message":"Il seguente contributo è più breve della tua opzione di durata minima. Ciò potrebbe significare che questo è già stato inviato e viene semplicemente ignorato a causa di questa opzione. Sei sicuro di voler inviare?"},"liveOrPremiere":{"message":"Inviare segmenti per una live o premiere non è consentito. Per favore aspetta che finisca, poi ricarica la pagina e verifica che i segmenti siano ancora validi."},"showUploadButton":{"message":"Mostra Pulsante di Caricamento"},"customServerAddress":{"message":"Indirizzo Server SponsorBlock"},"customServerAddressDescription":{"message":"L'indirizzo che SponsorBlock usa per effettuare richieste al server. Questo non dovrebbe essere modificato a meno che tu non abbia un tuo server."},"dataFetchingServerAddress":{"message":"Indirizzo del server di recupero dati"},"dataFetchingServerAddressDescription":{"message":"L'indirizzo utilizzato per effettuare le chiamate al server di recupero dati.\nA meno che tu non abbia una tua istanza del server, non dovrebbe essere modificato."},"thumbnailCacheServerAddress":{"message":"Indirizzo del server cache delle miniature"},"save":{"message":"Salva"},"reset":{"message":"Reimposta"},"customAddressError":{"message":"Questo indirizzo non è nel formatto corretto. Assicurati di avere http:// o https:// all'inizio e nessuno slash alla fine."},"areYouSureReset":{"message":"Sei sicuro di voler eseguire il reset?"},"mobileUpdateInfo":{"message":"m.youtube.com è ora supportato"},"exportOptions":{"message":"Importa/Esporta Tutte Le Opzioni"},"exportOtherData":{"message":"Importa/Esporta tutti gli altri dati"},"exportOptionsCopy":{"message":"Modifica/copia"},"exportOptionsDownload":{"message":"Salva su file"},"exportOptionsUpload":{"message":"Carica da file"},"whatExportOptions":{"message":"Questa è la tua intera configurazione in JSON. Ciò include il tuo UserID Privato, quindi assicurati di condividerla saggiamente."},"setOptions":{"message":"Imposta Opzioni"},"exportOptionsWarning":{"message":"Attezione: La modifica delle opzioni è permanente e può interrompere l'installazione. Sei sicuro di voler proseguire? Assicurati di aver eseguito un backup per ogni evenienza."},"incorrectlyFormattedOptions":{"message":"Questo JSON non è stato correttamente formattato. Le tue opzioni non sono state modificate."},"confirmNoticeTitle":{"message":"Invia Segmento"},"submit":{"message":"Invia"},"cancel":{"message":"Annulla"},"delete":{"message":"Elimina"},"preview":{"message":"Anteprima"},"unsubmitted":{"message":"Non inviato"},"inspect":{"message":"Esamina"},"edit":{"message":"Modifica"},"copyDebugLogs":{"message":"Copia log di debug"},"copyDebugInformation":{"message":"Copia Informazioni di Debug Negli Appunti"},"copyDebugInformationFailed":{"message":"Impossibile scrivere negli Appunti"},"copyDebugInformationOptions":{"message":"Copia le informazioni negli appunti da fornire a uno sviluppatore quando si registra un bug / quando uno sviluppatore lo richiede. Le informazioni sensibili come l'ID utente, i canali e l'indirizzo del server personalizzato sono stati rimossi. Tuttavia contiene informazioni come il tuo useragent, browser, sistema operativo e numero di versione di estensione. "},"copyDebugInformationComplete":{"message":"Le informazioni di debug sono state copiate nel clip board. Sentiti libero di rimuovere tutte le informazioni che preferisci non condividere. Salva in un file di testo o incollale nella segnalazione di bug."},"keyAlreadyUsed":{"message":"Questa scorciatoia è associata a un'altra azione. Selezionane una diversa."},"to":{"message":"a","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Copiato!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Includi transizioni"},"generic_guideline2":{"message":"Riprodotto come se non ci fossero salti"},"category_sponsor":{"message":"Sponsorizzazione"},"category_sponsor_description":{"message":"Promozione a pagamento, referral a pagamento e pubblicità diretta. Non per auto-promozione o ringraziamenti gratuiti a cause/creatori/siti web/ prodotti di loro gradimento."},"category_sponsor_guideline1":{"message":"Promozioni a pagamento"},"category_sponsor_guideline2":{"message":"Non per donazioni o merchandise personalizzato"},"category_selfpromo":{"message":"Promozione non pagata/Autopromozione"},"category_selfpromo_description":{"message":"Simile alle \"sponsorizzazioni\" tranne che per promozioni non pagate o autopromozioni. Ciò include sezioni riguardanti vendita di merce, donazioni o informazioni in merito a collaboratori."},"category_selfpromo_guideline1":{"message":"Donazioni, abbonamenti e merchandise personalizzato"},"category_selfpromo_guideline2":{"message":"Shoutout non pagati che non aggiungono nulla al video"},"category_selfpromo_guideline3":{"message":"Non per prodotti aziendali e merchandise"},"category_exclusive_access":{"message":"Accesso Esclusivo"},"category_exclusive_access_description":{"message":"Solo per etichettare interi video. Usato quando un video mostra un prodotto, un servizio o un luogo che è stato ricevuto gratuitamente o a cui si ha avuto un accesso sovvenzionato."},"category_exclusive_access_pill":{"message":"Questo video mostra un prodotto, un servizio o un luogo che è stato ricevuto gratuitamente o a cui si ha avuto un accesso sovvenzionato","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"L'intero video mostra qualcosa con accesso gratuito o sovvenzionato"},"category_interaction":{"message":"Promemoria d'Interazione (Iscrizione)"},"category_interaction_description":{"message":"Quando nel punto centrale del contenuto è presente un breve promemoria per like, iscrizione o follow. Se dovesse risultare esteso o riguardante qualcosa di specifico, potrebbe essere auto-promozione."},"category_interaction_guideline1":{"message":"Brevi inviti a mettere mi piace, follow o iscriversi"},"category_interaction_guideline2":{"message":"Include inviti indiretti a commentare"},"category_interaction_guideline3":{"message":"Non per promozione generale, solo inviti all'interazione"},"category_interaction_short":{"message":"Promemoria d'Interazione"},"category_intro":{"message":"Intermezzo/Intro Animata"},"category_intro_description":{"message":"Un intervallo senza contenuto effettivo. Potrebbe essere una pausa, una schermata statica, un'animazione ripetuta. Non dovrebbe essere usato per transizioni contenenti informazioni."},"category_intro_short":{"message":"Intermezzo"},"category_intro_guideline1":{"message":"Sezione senza contenuto effettivo"},"category_intro_guideline2":{"message":"Non per transizioni con informazioni"},"category_outro":{"message":"Conclusioni/Titoli di Coda"},"category_outro_description":{"message":"I titoli di coda o quando vengono mostrate annotazioni a fine video su YouTube. Non per conclusioni provviste di informazioni."},"category_outro_guideline1":{"message":"Non include contenuti, anche se le schede finali sono a schermo"},"category_preview_description":{"message":"Raccolta di clip che mostra cosa succederà in questo video o altri video in una serie, tutte le informazioni sono ripetute in seguito nel video."},"category_preview_guideline1":{"message":"Clip che appaiono in seguito in questo video, oppure in un video futuro"},"category_preview_guideline2":{"message":"Riepilogo di un video precedente"},"category_preview_guideline3":{"message":"Non per sezioni che aggiungono contenuti in più"},"category_filler_guideline2":{"message":"Distrazioni, bloopers, replay"},"category_filler_guideline3":{"message":"Non per scene necessarie a capire l'argomento"},"category_music_offtopic":{"message":"Musica: Sezione Non-Musicale"},"category_music_offtopic_description":{"message":"Solo per video musicali. Dovrebbe essere usata solo per sezioni di video musicali non già comprese in un'altra categoria."},"category_music_offtopic_short":{"message":"Non-Musicale"},"category_music_offtopic_guideline1":{"message":"Sezioni non presenti nelle release ufficiali"},"category_music_offtopic_guideline2":{"message":"Sezioni senza musica in una performance dal vivo"},"category_poi_highlight":{"message":"Highlight"},"category_poi_highlight_description":{"message":"La parte del video che gran parte delle persone stanno cercando. Simile ai commenti \"Il video inizia a x\"."},"category_poi_highlight_guideline1":{"message":"La parte che la maggior parte delle persone sta cercando"},"category_poi_highlight_guideline2":{"message":"Può ignorare il contesto"},"category_poi_highlight_guideline3":{"message":"Può saltare al contenuto del titolo o dell'anteprima"},"category_chapter":{"message":"Capitolo"},"category_chapter_description":{"message":"Capitoli personalizzati che descrivono le sezioni principali di un video."},"category_chapter_guideline1":{"message":"Non menzionare i nomi degli sponsor"},"category_chapter_guideline2":{"message":"Usa capitoli più grandi per le sezioni generali"},"category_chapter_guideline3":{"message":"Dei capitoli più piccoli possono essere collocati all'interno di quelli più grandi"},"category_livestream_messages":{"message":"Livestream: Donazione/Letture dei Messaggi"},"category_livestream_messages_short":{"message":"Lettura Messaggi"},"autoSkip":{"message":"Salta Automaticamente"},"manualSkip":{"message":"Salto Manuale"},"showOverlay":{"message":"Mostra nella Barra di Ricerca"},"disable":{"message":"Disattiva"},"autoSkip_POI":{"message":"Salta automaticamente all'avvio"},"manualSkip_POI":{"message":"Chiedi quando il video carica"},"showOverlay_POI":{"message":"Mostra Nella Barra di Ricerca"},"showOverlay_full":{"message":"Mostra Etichetta"},"showOverlay_chapter":{"message":"Mostra Capitoli"},"autoSkipOnMusicVideos":{"message":"Salta automaticamente tutti i segmenti quando c'è un segmento non musicale"},"muteSegments":{"message":"Silenzia i segmenti invece di saltarli, quando possibile"},"fullVideoSegments":{"message":"Mostra un'icona quando un video è interamente promozionale","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Mostra le etichette anche sulle copertine dei video","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Segmento non inviato","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Colore Barra di Ricerca"},"category":{"message":"Categoria"},"skipOption":{"message":"Salta Opzione","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"Attiva Server di Beta Testing"},"whatEnableTestingServer":{"message":"I tuoi invii e voti NON CONTERANNO nel il server principale. Usa questa opzione solo per test."},"testingServerWarning":{"message":"Tutti i contributi e i voti NON VERRANNO CONTATI verso il server principale durante la connessione al server di prova. Assicurarsi di disabilitare questa opzione quando si desidera fare reali contributi."},"bracketNow":{"message":"(Ora)"},"moreCategories":{"message":"Più Categorie"},"chooseACategory":{"message":"Scegli una Categoria"},"enableThisCategoryFirst":{"message":"Per inviare segmenti della categoria \"{0}\", è necessario abilitarlo nelle opzioni. Sarai reindirizzato alle opzioni.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Attenzione: questo tipo di segmento può essere presente una sola volta. Inviarne più di uno causerà la visualizzazione casuale di uno solo."},"youMustSelectACategory":{"message":"Devi selezionare una categoria per tutti i segmenti che stai inviando!"},"bracketStart":{"message":"(Inizio)"},"bracketEnd":{"message":"(Fine)"},"End":{"message":"Fine","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"nascosto: downvote"},"hiddenDueToDuration":{"message":"nascosto: troppo corto"},"manuallyHidden":{"message":"nascosto manualmente"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"L'ID del canale non è ancora caricato. Se stai usando un video incorporato, prova piuttosto a usare la pagina principale di YouTube. Questo potrebbe esser causato dalle modifiche al layout di YouTube, se pensi che sia così, scrivi qui un commento:"},"invidiousPermissionRefresh":{"message":"Il browser ha revocato il permesso necessario per funzionare su Invidious e altri siti di terze parti. Clicca sul pulsante qui sotto per riattivare questo permesso."},"acceptPermission":{"message":"Accetta autorizzazione"},"permissionRequestSuccess":{"message":"Richiesta di autorizzazione riuscita!"},"permissionRequestFailed":{"message":"Richiesta di assicurazione fallita, hai cliccato nega?"},"adblockerIssueWhitelist":{"message":"Se non riesci a risolverlo, disabilita allora l'impostazione 'Forza Controllo Canale Prima di Saltare', poiché SponsorBlock non è in grado di recuperare le informazioni del canale per questo video"},"forceChannelCheck":{"message":"Forza controllo canale prima di andare avanti"},"whatForceChannelCheck":{"message":"Di default, verranno saltati i segmenti immediatamente, anche prima di verificare se il canale è in whitelist. Di default, alcuni segmenti all'inizio del video potrebbero essere saltati anche sui canali in whitelist. L'attivazione di questa opzione eviterà che ciò accada, ma ogni salto avrà un leggero ritardo in quanto ottenere l'ID del canale può richiedere un certo tempo. Questo ritardo potrebbe essere impercettibile con una connessione internet veloce."},"forceChannelCheckPopup":{"message":"Considera l'Attivazione dell'opzione \"Forza la Verifica del Canale Prima del Salto\""},"downvoteDescription":{"message":"Tempo Non Corretto/Errato"},"incorrectVote":{"message":"Errato"},"harmfulVote":{"message":"Offensivo","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Cambia Categoria"},"nonMusicCategoryOnMusic":{"message":"Questo video è classificato come musica. Sei sicuro che questo video contenga uno sponsor? Se questo è in realtà un \"Segmento Non-Musica\", apri le opzioni di questa estensione e abilita questa categoria. Quindi, è possibile inviare questo segmento come \"Non-Music\" invece di sponsor. Si prega di leggere la guida se si è confusi."},"multipleSegments":{"message":"Segmenti Multipli"},"guidelines":{"message":"Linee guida"},"readTheGuidelines":{"message":"Leggi Le Linee Guide!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Le categorie sono qui!"},"categoryUpdate2":{"message":"Apri queste opzioni per saltare le introduzioni, conclusioni, vendita di prodotti ecc."},"help":{"message":"Aiuto"},"GotIt":{"message":"Capito","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Questo segmento è grande. Se l'intero video è su un unico argomento, passa da \"Salta\" a \"Video Completo\". Vedi le linee guida per ulteriori informazioni."},"categoryPillTitleText":{"message":"Questo intero video è etichettato con questa categoria ed è troppo integrato per poterlo separare"},"chapterNameTooltipWarning":{"message":"Uno dei nomi dei tuoi capitoli è simile a una categoria. Quando possibile dovresti usare le categorie."},"experiementOptOut":{"message":"Disiscriviti dagli esperimenti futuri","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Nascondi per sempre"},"warningChatInfo":{"message":"Abbiamo notato che hai fatto qualche errore comune. Noi apprezziamo molto il tuo lavoro fin'ora, ma qui puntiamo alla perfezione, quindi ogni errore, anche molto piccolo, conta :)"},"questionButton":{"message":"Ho una domanda"},"askAQuestion":{"message":"Fai una domanda"},"warningConfirmButton":{"message":"Capisco il motivo"},"warningError":{"message":"Errore durante il tentativo di riconoscere l'avviso:"},"deArrowMessageRecieved":{"message":"Hai ricevuto un suggerimento da un moderatore"},"Donate":{"message":"Dona"},"considerDonating":{"message":"Aiuta a finanziare lo sviluppo"},"hideDonationLink":{"message":"Nascondi Link di Donazione"},"darkModeOptionsPage":{"message":"Pagina Delle Opzioni In Modalità Scura"},"helpPageThanksForInstalling":{"message":"Grazie per aver installato SponsorBlock."},"helpPageReviewOptions":{"message":"Sei pregato di revisionare le seguenti opzioni"},"helpPageFeatureDisclaimer":{"message":"Molte funzionalità sono disabilitate di default. Se vuoi saltare intro, outro, usare Invidious, etc. abilitale sotto. Puoi anche nascondere/mostrare gli elementi dell'UI."},"helpPageHowSkippingWorks2":{"message":"Ogni volta che salti un segmento, sarai avvisato. Se il momento sembra sbagliato, vota in negativo cliccando downvote! Puoi anche votare nel popup."},"Submitting":{"message":"Inviando"},"helpPageCopyOfDatabase2":{"message":"Il codice sorgente è liberamente disponibile. Quindi, anche se mi succede qualcosa, i tuoi contributi non saranno persi."},"Credits":{"message":"Crediti"},"LearnMore":{"message":"Scopri di Più"},"FullDetails":{"message":"Visualizza Dettagli Completi"},"CopyDownvoteButtonInfo":{"message":"Vota negativamente e crea una copia locale da reinviare"},"OpenCategoryWikiPage":{"message":"Apri la pagina della wiki di questa categoria."},"CopyAndDownvote":{"message":"Copia e vota negativamente"},"ContinueVoting":{"message":"Continua a Votare"},"ChangeCategoryTooltip":{"message":"Questo si applicherà istantaneamente ai tuoi segmenti"},"downvote":{"message":"Voto negativo"},"upvote":{"message":"Voto positivo"},"hideSegment":{"message":"Nascondi segmento"},"skipSegment":{"message":"Salta segmento"},"playChapter":{"message":"Riproduci capitolo"},"SponsorTimeEditScrollNewFeature":{"message":"Usa la rotellina del mouse passando sulla casella di modifica per regolare rapidamente il tempo. Le combinazioni dei tasti ctrl o shift sono utilizzabili per perfezionare le modifiche."},"categoryPillNewFeature":{"message":"Novità! Vedi quando un video è interamente sponsorizzato o auto-promosso"},"yearAbbreviation":{"message":"y","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Comportamento","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interfaccia","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Scorciatoie da tastiera","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Backup/Ripristina","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Varie","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Aspetto dell'avviso di skip","description":"Option label"},"unbind":{"message":"Dissocia","description":"Unbind keyboard shortcut"},"notSet":{"message":"Non impostato"},"change":{"message":"Modifica"},"youtubeKeybindWarning":{"message":"Questa è una scorciatoia integrata da YouTube. Sei sicuro di volerla usare?"},"betaServerWarning":{"message":"Il server BETA è abilitato!"},"openOptionsPage":{"message":"Apri la pagina delle opzioni"},"resetToDefault":{"message":"Ripristina le impostazioni predefinite"},"confirmResetToDefault":{"message":"Sei sicuro di voler reimpostare tutte le impostazioni ai valori predefiniti? Questa azione è irreversibile."},"exportSegments":{"message":"Esporta segmenti"},"importSegments":{"message":"Importa segmenti"},"Import":{"message":"Importa","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Riscattato correttamente!"},"redeemFailed":{"message":"Chiave di licenza non valida"},"hideUpsells":{"message":"Nascondi opzioni non disponibili senza pagamento aggiuntivo"},"hideNewFeatureUpdates":{"message":"Nascondi suggerimenti sulle nuove funzionalità"},"redeem":{"message":"Riscatta"},"enterLicenseKey":{"message":"Inserisci chiave di licenza"},"unsubmittedSegmentCounts":{"message":"Al momento hai {0} su {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Al momento non hai segmenti non inviati","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"segmento non inviato","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"segmenti non inviati","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"video","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Cancella tutti i segmenti","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Sei sicuro di voler cancellare tutti i segmenti non inviati?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Mostra segmenti","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Nascondi segmenti","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID Video","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Numero di segmenti","description":"Header of the unsubmitted segments list"},"actions":{"message":"Azioni","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Condividi URL"},"segmentFetchFailureWarning":{"message":"Attenzione: Il server non ha ancora risposto con dei segmenti. Potrebbero effettivamente esistere dei segmenti su questo video già inviati, ma non li hai ancora ricevuti a causa di problemi con il server."},"allowScrollingToEdit":{"message":"Usa la Rotella per Modificare i Tempi"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Titoli e Miniature Migliori su YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Titoli e miniature in crowdsourcing per essere descrittivi e non sensazionali","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Scegli il più descrittivo"},"Original":{"message":"Originale"},"OriginalTitle":{"message":"Titolo Originale"},"CurrentTime":{"message":"Ora Attuale"},"resetCustomTitle":{"message":"Ripristina Titolo Al Testo Originale"},"resetIcon":{"message":"Ripristina Icona"},"TypeYourOwnTitleHere":{"message":"Digita il tuo titolo qui"},"VideoNotReady":{"message":"Video non pronto"},"FailedToRender":{"message":"Impossibile renderizzare","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Tela mancante","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Eccezione durante il rendering","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Impossibile caricare","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Formato del Titolo"},"Disabled":{"message":"Disabilitato"},"CapitalizeWords":{"message":"Maiuscole Iniziali"},"TitleCase":{"message":"Maiuscolo Titolo"},"SentenceCase":{"message":"Maiuscolo Inizio Frase"},"LowerCase":{"message":"Minuscolo"},"FirstLetterUppercase":{"message":"Iniziale maiuscola"},"shouldCleanEmojis":{"message":"Rimuovi Emoji"},"onlyFormatCustomTitles":{"message":"Formatta solo i titoli inviati dagli utenti"},"onlyTitleCaseInEnglish":{"message":"Rendi le parole maiuscole per i titoli non inglesi"},"onlyTitleCaseInEnglishDescription":{"message":"Il rilevamento linguistico non è perfetto e rileva alcuni titoli in inglese, come non in inglese."},"thumbnailFallbackOption":{"message":"Quando Non Esiste una Miniatura Inviata"},"whatThumbnailFallbackOption":{"message":"Selezionando una tempistica casuale, utilizzerà i dati di SponsorBlock per assicurare il tempo in un segmento promozionale non selezionato.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Mostra un'istantanea da un tempo casuale"},"TheOriginalThumbnail":{"message":"Mostra la miniatura originale"},"showABlankBox":{"message":"Mostra una casella vuota"},"AutoGenerated":{"message":"Mostra una miniatura generata automaticamente da YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Inizio"},"Middle":{"message":"Centro"},"keepUnsubmitted":{"message":"Memorizza Voti Inviati"},"showLiveCover":{"message":"Mostra l'Avatar del canale sui Video successivi","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Non utilizzarei mai Miniature A/B testate"},"ignoreAbThumbnailsDescription":{"message":"I canali possono configurare dei test sui propri video, in cui YouTube mostrerà miniature differenti per ogni persona. Quest'opzione utilizzerà sempre la prima miniatura per mantenere la coerenza."},"abThumbnailsWarning":{"message":"Attenzione: Questo video sta svolgendo un test della miniatura A/B. Ciò significa che la miniatura potrebbe cambiare spesso. Probabilmente, non dovresti votare la miniatura originale a causa di tale rischio."},"whatKeepUnsubmitted":{"message":"Mantiene i voti inviati dopo il voto per mostrare titoli e miniature scelte rispetto alle più popolari sul server."},"keepUnsubmittedInPrivate":{"message":"Conserva i voti inviati da schede anonime"},"useThumbnailGenerationService":{"message":"Utilizza Servizio di Generazione Miniature"},"titleMaxLines":{"message":"Righe Massime per il Titolo"},"titleMaxLinesDescription":{"message":"I titoli dei video saranno diffusi su questo numero di righe nei suggerimenti."},"thumbnailSaturationLevel":{"message":"Livello saturazione miniature"},"whatSaturateThumbnails":{"message":"Riduci il colore delle miniature"},"hideDetailsWhileFetching":{"message":"Nascondi i dettagli durante il loro recupero"},"hideDetailsWhileFetchingDescription":{"message":"Nascondi i titoli e le miniature durante il recupero dei dati dal server. Se disabilitato, i titoli e le anteprime potrebbero lampeggiare mentre cambiano."},"onAllPages":{"message":"Su Tutte le Pagine","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Su Tutte le Pagine Tranne le Pagine Video","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Mai"},"thumbnailGeneratorDescription1":{"message":"Il servizio di generazione delle miniature accelera significativamente la generazione delle miniature, inviando un richiesta anonima con il videoID a un server remoto. La miniatura sarà quindi generata o prelevata da una cache se è già stata generata."},"thumbnailGeneratorDescription2":{"message":"Se utilizzato sulle pagine dei video, potrebbe potenzialmente far trapelare i videoID a questo server. Impostarlo a \"Su Tutte le Pagine Tranne le Pagine Video\", eviterà tale problema. Un'altra opzione è ospitare il proprio servizio di generazione delle miniature."},"thumbnailGeneratorDescription3":{"message":"Se l'utilizzo del seervizio di generazione delle miniature è disabilitato, tutte le richieste utilizzeranno un sistema di richiesta di K-anonimato, che complica per il server la previsione di quali video sono stati recuperati; e sarà utilizzato un servizio di generazione delle miniature più lento, ma locale.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Codice Sorgente del Servizio di Generazione Miniature"},"moreAboutKAnonymity":{"message":"Di più sul K-Anonimato","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Mostra Sempre il Pulsante \"Mostra Originale\""},"whatAlwaysShowShowOriginalButton":{"message":"Se vuoi sapere sempre se un titolo/anteprima sono cambiati, abilita questo."},"showIconForFormattedTitles":{"message":"Mostra il pulsante \"Mostra Originale\" per i titoli formattati automaticamente"},"Enable":{"message":"Abilita"},"Titles":{"message":"Titoli","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniature","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"Errore"},"ShowOriginal":{"message":"Mostra Dettagli Originali"},"ShowModified":{"message":"Mostra i dettagli modificati"},"FillerWarning":{"message":"Attenzione: Questa è una categoria incredibilmente aggressiva. Dovrai probabilmente annullare il salto di determinate cose o, talvolta, disabilitarlo. Sappi che, per molti video, oltre il 50% viene saltato! Tuttavia, ricorda che sono comunque presenti delle linee guida specifiche da seguire, per l'invio.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Unisciti al nostro Discord o a Matrix per rimanere permanentemente in questa chat","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Mostra Supporto Linee Guida","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Evita espressioni facciali esagerate","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Pensa in grande, non rispondere soltanto alla domanda del titolo originale","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Evita la descrizione delle reazioni al video (\"scioccante\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Fornisci abbastanza informazioni per compiere una scelta informata prima di cliccare"},"tip5":{"message":"Maiuscole e minuscole come in una frase","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Accetta tutte le linee guida per inviare","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Le maiuscole nel mio titolo sono come in una frase","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Il mio titolo non risponde solo a una domanda posta nel titolo","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"I titoli dovrebbero descrivere il video, o la storia in generale. Dovresti guardare il video completo per sapere di cosa tratta invece di fare affidamento su un titolo originale intrigante.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Il mio titolo non riassume una conclusione o spoilera inutilmente","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"I titoli non devono sostituire completamente il video, ma servono solo per farti sapere se cliccare o no.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Il mio titolo non fa fact checking e non deride o critica il video o il creatore","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"I titoli si riferiscono alla prospettiva del creatore e del video. La valutazione o il fact-checking del video stesso non sono lo scopo di DeArrow. I titoli non sono intesi come una sezione di commenti.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Parola rilevata: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Non usare verbi inutili all'inizio del titolo","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Inizia tutti i titoli con una lettera maiuscola. I titoli dovrebbero essere formattati come una frase","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"I titoli non devono finire con un '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Non limitarti ad aggiungere una risposta a una domanda nel titolo originale. I titoli dovrebbero descrivere il video, o la storia in generale","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"I titoli non dovrebbero fare fact-checking, deridere o criticare il video o il creatore","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"I titoli non devono mantenere elementi sensazionalistici dal titolo originale","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"I titoli non devono contenere emoji","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Devi risolvere l'avviso prima di inviare"},"dearrowHelpSponsorBlockImported":{"message":"Nota: Le tue impostazioni di SponsorBlock sono state importate automaticamente!"},"howItWorks":{"message":"Come funziona"},"discordPromotion":{"message":"Vieni a contribuire, effettua qualche suggerimento e aiuta su {discord} o su {matrix}"},"deArrowDonationText":{"message":"Se ti piace ciò che ho fatto finora, e desideri aiutarmi donandomi, ecco un link"},"termsAgreement":{"message":"Utilizzando quest'estensione, acconsenti alla {privacy-policy} e ai {terms}"},"privacyPolicy":{"message":"Politica sulla Privacy"},"termsOfUse":{"message":"Termini di Utilizzo"},"openSourceLicenses":{"message":"Licenze Open Source"},"defaultToOriginals":{"message":"Imposta come predefinite le informazioni originali del video"},"whatDefaultToOriginals":{"message":"Mostra di default il titolo e anteprima originali, ma mostra un pulsante a comparsa per vedere i titoli e anteprime personalizzati."},"replaceTitles":{"message":"Sostituisci Titoli"},"replaceThumbnails":{"message":"Sostituisci Miniature"},"useCrowdsourcedTitles":{"message":"Usa i titoli in crowdsourcing"},"whatUseCrowdsourcedTitles":{"message":"Se disabilitato, formatterà i titoli ma non userà i titoli inviati dalla community","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Sei sicuro di voler eliminare questa configurazione?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Nuova Configurazione"},"DeleteConfiguration":{"message":"Elimina configurazione"},"ChannelAllowlist":{"message":"Opzioni specifiche del canale"},"ConfigurationName":{"message":"Nome Configurazione"},"ChannelListInstructions":{"message":"Inserisci qualsiasi canale a cui desideri applicare questa configurazione nella casella seguente, separata da nuove righe. Sia gli ID che i nomi visualizzati del canale sono supportati. I nomi utenti \"@\" non sono supportati. Puoi ottenere gli ID del canale cliccando sul pulsante di condivisione sulla pagina di informazioni del canale. Per raggiungere tale pagina, clicca sulla descrizione del canale che appare sotto il suo nome, sulla pagina del canale.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Ancora nessuna configurazione. Fare clic sul pulsante in alto per aggiungere una nuova configurazione.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Ferma il clickbait sostituendo titoli e anteprime per renderli più accurati"},"DeArrowPromotionMessage2":{"message":"Stanco del clickbait? Scopri la mia nuova estensione per migliorare i titoli e le anteprime"},"DeArrowPromotionMessage3":{"message":"Scopri anche DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Non ti piace questo titolo? Se preferisci il titolo qui sotto, vedi la funzione di sostituzione del titolo di DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Questa anteprima è tratta da un timestamp casuale perché non è stata inviata nessuna anteprima personalizzata per questo video","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Questa anteprima è tratta da un timestamp casuale ed il titolo è formattato automaticamente perché non sono ancora stati inviati titolo/anteprima personalizzati","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Puoi cambiare questo valore predefinito qui sotto","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} titoli e {thumbnails} anteprime sono stati sostituiti da quando hai installato questa estensione","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} titolo ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} titoli ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"e {thumbnails} anteprima","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"e {thumbnails} anteprime","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} sono stati sostituiti da quando hai installato questa estensione","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Conta il numero di sostituzioni di titoli e anteprime"},"countReplacementsDescription":{"message":"Utilizzato per fornire statistiche nel popup.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Aggiungi una lista di filtri per bloccare sondaggi, merchandising e altri elementi promozionali utilizzando yt-neuter"},"requiresUblock":{"message":"Richiede uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Qualcosa è andato storto con il rilevamento del videoID. Si prega di aggiornare prima di procedere con l'invio, in modo da potersi riferire al video corretto. Se questo errore persiste, inviaci un report dell'accaduto assieme ai nomi delle estensioni o script utente che sono stati installati attraverso i nostri canali GitHub, Discord o Matrix."},"dearrowLogoCredit":{"message":"Il logo è basato su Twemoji, con licenza CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock non è compatibile con l'estensione \"Zoom to Fill\". Ci sono molte alternative funzionanti che puoi usare al suo posto."},"freeTrialStarted":{"message":"La tua prova gratuita è stata avviata correttamente. Visita YouTube per testarla"},"freeTrialEnded":{"message":"La tua prova gratuita è terminata"},"freeTrialPrompt":{"message":"Se desideri testarla pr un'ora, puoi avviare una prova gratuita con il pulsante seguente."},"startFreeTrial":{"message":"Avvia la prova gratuita"},"freeAccessRequested":{"message":"Ti sei registrato correttamente per l'accesso gratuito. Riceverai una notifica quando sarà concesso l'accesso gratuito."},"freeAccessComplete":{"message":"Congratulazioni! Ora hai l'accesso gratuito a DeArrow"},"DeArrowNotActivated":{"message":"DeArrow non è attivato"},"ActivateDeArrow":{"message":"Attiva DeArrow"},"DeArrowIsActivated":{"message":"DeArrow è stato attivato correttamente"},"Close":{"message":"Chiudi"},"ViewLicenseKey":{"message":"Visualizza la Chiave di Licenza"},"SharingIsCaring":{"message":"La condivisione è amore"},"cleanPopup":{"message":"Nascondi disordine nel popup dell'elenco dei segmenti"},"syncDisabledWarning":{"message":"Attenzione: L'archiviazione d'estensione è stata disabilitata sul tuo browser. Le impostazioni non saranno salvate se proverai a salvarle."},"syncDisabledWarningDeArrow":{"message":"DeArrow non funzionerà senza archiviazione."},"syncDisabledFirefoxSuggestions":{"message":"Puoi abilitarla andando in about:config e impostando il valore \"webextensions.storage.sync.enabled\" a true."},"storageFull":{"message":"L'archiviazione dell'estensione è piena. Ti preghiamo di eliminare qualche segmento non inviato nelle opzioni."},"previewSegmentRequired":{"message":"Si prega di visualizzare i segmenti prima di inviarli. È possibile farlo cliccando sul pulsante di anteprima o utilizzando la seguente scorciatoia:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Agisci come VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Non possiamo accettare contributi dal tuo browser in questo momento perché sembra che YouTube abbia inserito delle pubblicità lato server nel video, che l'estensione non può rimuovere. Per favore contattaci se ricevi questo errore."},"DeArrowIsDisabled":{"message":"DeArrow è disabilitato - clicca per abilitare","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Sei sicuro che questa miniatura originale segue le linee guida di DeArrow? Se preferisci vedere le miniature originali in generale, considera di cambiare l'opzione per \"Quando non esiste nessuna miniatura presentata\" nelle impostazioni DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"No":{"message":"No"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ja/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ja/messages.json @@ -0,0 +1 @@ +{"0":{"message":"接続がタイムアウトになりました。インターネット接続をご確認ください。接続に問題がない場合、サーバーが混雑またはダウンしている可能性があります。"},"400":{"message":"サーバーがこのリクエストは無効であると返答しました"},"409":{"message":"既に登録済みです。"},"502":{"message":"サーバーが混雑中です。数秒後にもう一度お試しください。"},"fullName":{"message":"SponsorBlock for YouTube - 動画の広告シーンを自動スキップ","description":"Name of the extension."},"Description":{"message":"YouTube動画の提供表示や登録のお願いといった部分をスキップします。動画中の広告を報告し、みんなで時間を節約しましょう。","description":"Description of the extension."},"channelWhitelisted":{"message":"チャンネルをホワイトリストに登録しました!"},"Segment":{"message":"セグメント"},"Segments":{"message":"セグメント"},"SegmentsCap":{"message":"セグメント"},"Chapters":{"message":"チャプター"},"renderAsChapters":{"message":"セグメントをチャプターとして表示する","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"動画時間の横に現在のセグメントを表示"},"showAutogeneratedChapters":{"message":"YouTubeが自動生成したチャプターを表示"},"upvoteButtonInfo":{"message":"この登録を高評価"},"reportButtonTitle":{"message":"報告"},"reportButtonInfo":{"message":"不正確な登録として報告"},"Dismiss":{"message":"無視"},"Loading":{"message":"読み込み中..."},"Hide":{"message":"再度表示しない"},"hitGoBack":{"message":"「スキップ取消」を押すと元の位置へ戻ります"},"unskip":{"message":"スキップ取消"},"reskip":{"message":"再スキップ"},"unmute":{"message":"ミュート解除"},"paused":{"message":"一時停止中"},"manualPaused":{"message":"タイマーが停止しました"},"confirmMSG":{"message":"個々の値を編集・削除するには、情報ボタンをクリックするか右上隅にある拡張機能のアイコンをクリックして拡張機能のポップアップを表示します。"},"clearThis":{"message":"本当に消去しますか?\n\n"},"Unknown":{"message":"広告部分の登録中にエラーが発生しました。後で再度お試しください。"},"sponsorFound":{"message":"データベースにこの動画の省略部分の登録あり!"},"sponsor404":{"message":"省略シーンの登録なし"},"sponsorStart":{"message":"セグメント開始を記録"},"sponsorEnd":{"message":"セグメント終了を記録"},"sponsorCancel":{"message":"セグメントの作成を取り消す"},"noVideoID":{"message":"YouTube動画が見つかりませんでした。\nこれが正しくなければ、タブを再読み込みしてください。"},"refreshSegments":{"message":"セグメントを更新"},"success":{"message":"成功しました!"},"voted":{"message":"投票しました!\n"},"serverDown":{"message":"サーバーがダウンしているようです。今すぐ開発者にお知らせください。"},"connectionError":{"message":"接続エラーが発生しました。 エラーコード: "},"segmentsStillLoading":{"message":"セグメントはまだ読み込み中です..."},"clearTimes":{"message":"セグメントを消去"},"openPopup":{"message":"SponsorBlock のポップアップを開く"},"closePopup":{"message":"ポップアップを閉じる"},"closeIcon":{"message":"閉じるアイコン"},"OpenSubmissionMenu":{"message":"登録メニューを開く"},"OpenCasualVoteMenu":{"message":"カジュアルモードのメニューを開く"},"sortSegments":{"message":"セグメントを並び替え"},"submitCheck":{"message":"送信しますか?"},"whitelistChannel":{"message":"チャンネルをホワイトリストに追加"},"removeFromWhitelist":{"message":"ホワイトリストからチャンネルを削除"},"voteOnTime":{"message":"セグメントに投票"},"Submissions":{"message":"登録数"},"savedPeopleFrom":{"message":"あなたが節約したみんなの時間: "},"viewLeaderboard":{"message":"リーダーボード"},"recordTimesDescription":{"message":"登録"},"submissionEditHint":{"message":"登録のクリックでセクション編集画面を表示","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"ヒント: 登録用のキー割り当ても設定できます"},"clearTimesButton":{"message":"時間を消去"},"Username":{"message":"ユーザー名"},"setUsername":{"message":"ユーザー名を設定"},"copyPublicID":{"message":"パブリックユーザ ID をコピー"},"copySegmentID":{"message":"セグメントIDをコピー"},"loopChapter":{"message":"チャプターをループ"},"unloopChapter":{"message":"チャプターのループ解除"},"hideThis":{"message":"非表示にする"},"Options":{"message":"オプション"},"showButtons":{"message":"YouTube プレーヤーにボタンを表示"},"hideButtonsDescription":{"message":"YouTube プレーヤーのセグメント提出ボタンを非表示にします。"},"showSkipButton":{"message":"「ハイライトまでスキップ」ボタンをプレーヤーに常に表示する"},"showInfoButton":{"message":"YouTube プレーヤーに情報ボタンを表示する"},"autoHideInfoButton":{"message":"情報ボタンを自動的に隠す"},"showDeleteButton":{"message":"YouTube プレーヤーに削除ボタンを表示"},"enableViewTracking":{"message":"スキップの集計を有効にする"},"whatViewTracking":{"message":"この機能は、あなたがスキップしたセグメントを追跡して、そのセグメントがどれだけ役に立ったかを他のユーザーに知らせることで、スパムがデータベースに紛れないようにするための評価基準として使用されます。あなたがセグメントをスキップするたびに、拡張機能はサーバーにメッセージを送信します。使用回数の統計が正確になるよう、できる限り多くの人がこの設定を変更しないことを望みます。:)"},"enableViewTrackingInPrivate":{"message":"プライベート/シークレット タブでのスキップ回数の集計を有効にする"},"enableTrackDownvotes":{"message":"セグメントの低評価を記録"},"whatTrackDownvotes":{"message":"あなたが低評価したセグメントが再読み込み後も非表示のままになります"},"trackDownvotesWarning":{"message":"警告: 無効化するとこれまでの低評価記録がすべて削除されます"},"enableTrackDownvotesInPrivate":{"message":"プライベート/シークレットタブにセグメントの反対票を保存"},"enableQueryByHashPrefix":{"message":"ハッシュプレフィックスを使って要求"},"whatQueryByHashPrefix":{"message":"動画IDを使用してサーバーからセグメントを要求する代わりに、動画IDのハッシュから最初の4文字が送信されます。それに対して、サーバーは類似したハッシュを持つすべての動画のデータを返却します。"},"enableShowCategoryWithoutPermission":{"message":"登録権限のないカテゴリーも登録メニューに表示する"},"whatShowCategoryWithoutPermission":{"message":"一部のカテゴリーに登録するには、一定以上の信用が必要です"},"showNotice":{"message":"再度通知を表示する"},"showSkipNotice":{"message":"セグメントがスキップされた後に通知を表示する"},"showUpcomingNotice":{"message":"セグメント開始前に通知する"},"showCategoryGuidelines":{"message":"カテゴリーのヘルプを表示"},"noticeVisibilityMode0":{"message":"通常サイズのスキップ通知"},"noticeVisibilityMode1":{"message":"自動スキップ時に小サイズの通知"},"noticeVisibilityMode2":{"message":"常に小サイズのスキップ通知"},"noticeVisibilityMode3":{"message":"自動スキップ時に透過タイプの通知"},"noticeVisibilityMode4":{"message":"常に透過タイプのスキップ通知"},"longDescription":{"message":"SponsorBlockはスポンサー、イントロ、アウトロ、チャンネル登録のお願いなど、YouTube動画の煩わしい部分をスキップします。SponsorBlockはYouTube動画のスポンサー付きセグメントなどの開始時間と終了時間を誰でも投稿できる、クラウドソースのブラウザ拡張機能です。一人がセグメントの情報を送信すると、この拡張機能を使用している他の全員が、スポンサー付きセグメントをスキップできるようになります。また、ミュージックビデオの音楽がない部分をスキップすることもできます。","description":"Full description of the extension on the store pages."},"website":{"message":"ウェブサイト","description":"Used on Firefox Store Page"},"sourceCode":{"message":"ソースコード","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"お知らせが更新されました!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"それでも気に入らない場合、「再び表示しない」ボタンを押してください。","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"セグメントをスキップ","description":"Keybind label"},"setStartSponsorShortcut":{"message":"セグメントを開始/終了","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"登録メニューを開く","description":"Keybind label"},"setSubmitKeybind":{"message":"セグメントの登録","description":"Keybind label"},"setPreviewKeybind":{"message":"セグメントをプレビュー","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"スキップの通知を閉じる","description":"Keybind label"},"setDownvoteKeybind":{"message":"セグメントに反対票","description":"Keybind label"},"setUpvoteKeybind":{"message":"セグメントに賛成票","description":"Keybind label"},"nextChapterKeybind":{"message":"次のチャプター","description":"Keybind label"},"previousChapterKeybind":{"message":"前のチャプター","description":"Keybind label"},"enableDeArrowKey":{"message":"DeArrowの有効状態を切替","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"送信メニューを開く","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"使用したいキーをキーボードで入力し、修飾キーを以下から選択してください。"},"disableSkipping":{"message":"スキップ有効"},"enableSkipping":{"message":"スキップ無効"},"yourWork":{"message":"あなたの貢献","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"エラーコード: "},"skip":{"message":"スキップ"},"mute":{"message":"ミュート"},"full":{"message":"動画全体","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} をスキップしますか?"},"mute_category":{"message":"{0} をミュートしますか?"},"skip_to_category":{"message":"{0}までスキップしますか?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"もうすぐ {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0}を飛ばしました","description":"Example: Sponsor Skipped"},"muted":{"message":"{0}をミュートしました","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"{0}にスキップしました","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"{0}の投票","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"自動スキップを無効化"},"enableAutoSkip":{"message":"自動スキップを有効化"},"audioNotification":{"message":"スキップ時に通知音を鳴らす"},"audioNotificationDescription":{"message":"セグメントがスキップされた時に音を鳴らします。 無効 (もしくは自動スキップが無効) の場合、音は鳴りません。"},"showTimeWithSkips":{"message":"スキップした分を除いた時間を表示する"},"showTimeWithSkipsDescription":{"message":"この時間は、シークバーの下にある現在の時間の隣に表示されます。これは、動画の合計時間からすべてのセグメントの時間を差し引いたもので「シークバーに表示」として設定されているセグメントも含まれます。"},"youHaveSkipped":{"message":"スキップした数: "},"minLower":{"message":"分"},"minsLower":{"message":"分"},"hourLower":{"message":"時間"},"hoursLower":{"message":"時間"},"youHaveSavedTime":{"message":"みんなの時間を節約しました","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":"のみんなの人生","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"サーバーの状態についてはstatus.sponsor.ajay.appを確認してください。"},"changeUserID":{"message":"プライベートユーザーIDをインポート/エクスポート"},"whatChangeUserID":{"message":"これを公開しないでください。パスワードのように、誰とも共有すべきではありません。 誰かがこれを使い、あなたになりすますことができます。これではなくパブリックユーザーIDが必要なら、ポップアップ内のクリップボードアイコンをクリックして取得できます。"},"setUserID":{"message":"プライベートユーザーIDを設定"},"userIDChangeWarning":{"message":"警告: プライベートユーザーIDの変更は恒久的です。本当に実行しますか? 念のため以前のユーザーIDは控えておいてください。"},"createdBy":{"message":"作成者:"},"supportOtherSites":{"message":"サードパーティー製のYouTubeサイトに対応"},"supportOtherSitesDescription":{"message":"第三者が作成した YouTube クライアントに対応します。対応を有効化するには、追加の権限に承諾する必要があります。","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"対応サイト: "},"optionsInfo":{"message":"Invidious対応を有効にし、自動スキップを無効、GUIを非表示にします。"},"addInvidiousInstance":{"message":"サードパーティーのクライアントインスタンスを追加"},"addInvidiousInstanceDescription":{"message":"任意のインスタンスを追加できます。ドメイン名だけを記入してください。例: invidious.ajay.app"},"add":{"message":"追加"},"addInvidiousInstanceError":{"message":"無効なドメイン名です。ドメイン部分だけを含めてください。例: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Invidiousインスタンス一覧を再設定"},"resetInvidiousInstanceAlert":{"message":"Invidiousインスタンス一覧を初期化しようとしています"},"invidiousDisabledSafari":{"message":"現時点のSafariのバグのため、Safariでは Invidious に対応していません。 Appleがバグを修正すれば追加します。"},"currentInstances":{"message":"現在のインスタンス:"},"minDuration":{"message":"最小持続時間(秒):"},"minDurationDescription":{"message":"設定値より短いセグメントはスキップされず、プレーヤーにも表示されません。"},"enableManualSkipOnFullVideo":{"message":"動画全体のラベルが存在する場合は手動スキップを使用する"},"whatManualSkipOnFullVideo":{"message":"動画全体が広告または自己宣伝の時に、動画を途切れなく観たい方向け。"},"skipNoticeDuration":{"message":"スキップ通知の表示時間(秒):"},"skipNoticeDurationDescription":{"message":"スキップ通知が画面上に表示される時間です。手動でスキップした場合は、より長く表示される可能性があります。"},"shortCheck":{"message":"この登録の長さは、あなたが設定した最小持続時間よりも短いです。既に登録されているけど、この設定によって非表示になっているだけという可能性もあります。本当に提出しますか?"},"liveOrPremiere":{"message":"ライブ配信中の動画やプレミア公開の動画ではセグメントの登録はできません。配信が終了するまで待つか、ページを再読み込みしてセグメントがまだ有効かご確認ください。"},"showUploadButton":{"message":"アップロードボタンを表示"},"customServerAddress":{"message":"SponsorBlock サーバーアドレス"},"customServerAddressDescription":{"message":"SponsorBlockがサーバーへの呼び出しに用いるアドレスです。\n自分のサーバーインスタンスを持っていない限り、この設定を変更すべきではありません。"},"dataFetchingServerAddress":{"message":"データ取得サーバーのアドレス"},"dataFetchingServerAddressDescription":{"message":"データ取得サーバーの呼び出しに使うアドレスです。あなた所有のサーバーのインスタンスがなければ変更する必要はありません。"},"thumbnailCacheServerAddress":{"message":"サムネイルキャッシュ用のサーバーのアドレス"},"save":{"message":"保存"},"reset":{"message":"リセット"},"customAddressError":{"message":"このアドレスの形式は正しくありません。最初にhttp://あるいはhttps://があり、最後が斜線で終わっていないことを確かめてください。"},"areYouSureReset":{"message":"初期設定に戻します。よろしいですか?"},"mobileUpdateInfo":{"message":"m.youtube.com に対応しています"},"exportOptions":{"message":"すべての設定をインポート/エクスポート"},"exportOtherData":{"message":"ほかの全データををインポート/エクスポート"},"exportOptionsCopy":{"message":"編集/コピー"},"exportOptionsDownload":{"message":"ファイルに保存"},"exportOptionsUpload":{"message":"ファイルから読み込み"},"whatExportOptions":{"message":"これがJSON形式の設定項目全体になります。これにはあなたのプライベートユーザーIDが含まれているので、共有するときは注意してください。"},"setOptions":{"message":"オプションを設定"},"exportOptionsWarning":{"message":"警告: 設定の変更は恒久的で、本拡張機能を破壊する可能性があります。本当に実行しますか? 念のため、これまでの設定を控えておいてください。"},"incorrectlyFormattedOptions":{"message":"JSONの書式が正しくありません。設定は変更されませんでした。"},"confirmNoticeTitle":{"message":"セグメントを登録"},"submit":{"message":"送信"},"cancel":{"message":"キャンセル"},"delete":{"message":"削除"},"preview":{"message":"プレビュー"},"unsubmitted":{"message":"未送信"},"inspect":{"message":"調査"},"edit":{"message":"編集"},"copyDebugLogs":{"message":"デバッグのログをコピー"},"copyDebugInformation":{"message":"デバッグ情報をクリップボードにコピー"},"copyDebugInformationFailed":{"message":"クリップボードに書き込めませんでした"},"copyDebugInformationOptions":{"message":"不具合があった、あるいは開発者から要求があった際に提供する為の情報をクリップボードにコピーします。ユーザーID、ホワイトリストにあるチャンネル、およびカスタムサーバーのアドレスなどの機密情報は含まれていません。ただし、ユーザーエージェント、ブラウザ、OS、および拡張機能のバージョンなどの情報は含まれています。 "},"copyDebugInformationComplete":{"message":"診断用情報がクリップボードにコピーされました。共有したくない情報があればそこから削除できます。これをファイルに保存したり、不具合報告に貼り付けてください。"},"keyAlreadyUsed":{"message":"このショートカットは他のアクションに割り当てられています。別のショートカットを選択してください。"},"to":{"message":"~","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"コピーしました!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"場面転換のつなぎ目も含める"},"generic_guideline2":{"message":"スキップしても自然に見えるようにする"},"category_sponsor":{"message":"広告"},"category_sponsor_description":{"message":"報酬のある販売促進、紹介、および直接広告です。自己宣伝や、動機や好きな製作者・サイト・製品に対する無報酬での表明とは異なります。"},"category_sponsor_guideline1":{"message":"有料のプロモーション"},"category_sponsor_guideline2":{"message":"寄付やオリジナルグッズには使わない"},"category_selfpromo":{"message":"無報酬 / 自己の宣伝"},"category_selfpromo_description":{"message":"無報酬での宣伝あるいは自己販促であるという点を除いては「広告」と同様です。商品、寄付、コラボ情報に関する内容を含みます。"},"category_selfpromo_guideline1":{"message":"寄付、メンバーシップ、オリジナルグッズ"},"category_selfpromo_guideline2":{"message":"動画とは関係のない呼びかけ"},"category_selfpromo_guideline3":{"message":"企業がデザインした製品やグッズには使わない"},"category_exclusive_access":{"message":"独占的な広告"},"category_exclusive_access_description":{"message":"動画全体に対してのみ付与できます。無償または補助金を受けて、製品、サービス、場所を利用している動画に使用。"},"category_exclusive_access_pill":{"message":"この動画は無償または補助金を受けて利用した製品、サービス、または場所を紹介しています","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"無料または補助金を受けて利用したものを動画全体で紹介している"},"category_interaction":{"message":"行動のお願い (登録/寄付など)"},"category_interaction_description":{"message":"動画の途中に挿入される、高評価・チャンネル登録・通知オンなどを促す短いシーン。長かったり、特定の何かについてのシーンは、自己の宣伝に分類すべきです。"},"category_interaction_guideline1":{"message":"高評価、登録、フォローの短いお願い"},"category_interaction_guideline2":{"message":"間接的なコメントのお願いも含む"},"category_interaction_guideline3":{"message":"一般的なプロモーションではなく、直接的な呼びかけのみに使用すること"},"category_interaction_short":{"message":"行動のお願い"},"category_intro":{"message":"合間 / 導入アニメ"},"category_intro_description":{"message":"本編ではない動画の合間部分。一時停止、静止画面、繰り返しのアニメーションなどが相当します。本編の情報を含んだ場面転換に対しては使用しないでください。"},"category_intro_short":{"message":"合間"},"category_intro_guideline1":{"message":"実際のコンテンツではない間の部分"},"category_intro_guideline2":{"message":"情報を含む場面転換には使用しない"},"category_outro":{"message":"終了画面 / クレジット"},"category_outro_description":{"message":"クレジットやYouTubeの終了画面のシーンです。動画の内容を結論するシーンではありません。"},"category_outro_guideline1":{"message":"画面上にエンドカードが表示されているかに関わらず、コンテンツを含めない"},"category_preview_description":{"message":"この動画や他の動画でこのあと起きる内容など、今後再び登場する場面を連続的にまとめたクリップ。"},"category_preview_guideline1":{"message":"後で登場する場面や将来の場面の切り抜き"},"category_preview_guideline2":{"message":"以前の動画のあらすじ"},"category_preview_guideline3":{"message":"新たなコンテンツを含むセクションには使用しない"},"category_filler":{"message":"脱線/冗談"},"category_filler_description":{"message":"動画の主な話題を理解するのに不要な、脱線したシーンや冗談。文脈や背景の詳細を説明するシーンは含めないでください。「楽しい 」気分になれないシーンを強引に指定するカテゴリーです。"},"category_filler_short":{"message":"脱線"},"category_filler_guideline1":{"message":"脱線したシーンや冗談"},"category_filler_guideline2":{"message":"逸脱シーン、NGシーン、リプレイ"},"category_filler_guideline3":{"message":"主題の理解に必要な場面には使用しない"},"category_music_offtopic":{"message":"音楽: 音楽ではない区間"},"category_music_offtopic_description":{"message":"ミュージックビデオでの使用に限ります。他のカテゴリーに含まれていないミュージックビデオのシーンにのみ使用してください。"},"category_music_offtopic_short":{"message":"音楽以外の部分"},"category_music_offtopic_guideline1":{"message":"公式リリースには含まれないセクション"},"category_music_offtopic_guideline2":{"message":"ライブパフォーマンスにおける音楽以外の部分"},"category_poi_highlight":{"message":"ハイライト"},"category_poi_highlight_description":{"message":"多くの人が探しているシーン。「本編はXから開始」というコメントに似ています。"},"category_poi_highlight_guideline1":{"message":"多くの人が探しているシーン"},"category_poi_highlight_guideline2":{"message":"それまでの内容はスキップ可能"},"category_poi_highlight_guideline3":{"message":"題名やサムネイルのシーンまでスキップ可能"},"category_chapter":{"message":"チャプター"},"category_chapter_description":{"message":"動画の主な場面を説明する独自のチャプター名"},"category_chapter_guideline1":{"message":"広告主のブランド名には言及しない"},"category_chapter_guideline2":{"message":"全般的なセクションには大きなチャプターを使用する"},"category_chapter_guideline3":{"message":"大きいチャプターの中には小さいチャプターを設けられます"},"category_livestream_messages":{"message":"ライブ配信: 寄付/メッセージの読み上げ"},"category_livestream_messages_short":{"message":"メッセージの読み上げ"},"autoSkip":{"message":"自動スキップ"},"manualSkip":{"message":"手動スキップ"},"showOverlay":{"message":"シークバーに表示"},"disable":{"message":"無効"},"autoSkip_POI":{"message":"冒頭へ自動スキップ"},"manualSkip_POI":{"message":"動画を読み込んだ際に確認する"},"showOverlay_POI":{"message":"シークバーに表示"},"showOverlay_full":{"message":"ラベルを表示"},"showOverlay_chapter":{"message":"チャプターを表示"},"autoSkipOnMusicVideos":{"message":"音楽以外のセグメントがある場合に全セグメントを自動的にスキップする"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"music.youtube.comのみ自動スキップ"},"muteSegments":{"message":"スキップする代わりに音声をミュートしてセグメントを許可"},"fullVideoSegments":{"message":"動画全体が広告の場合にアイコンを表示","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"動画のサムネイル上にもラベルを表示","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"未送信の色","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"シークバーの色"},"category":{"message":"カテゴリ"},"skipOption":{"message":"スキップの設定","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"高度なスキップの設定を開く"},"advancedSkipNotSaved":{"message":"構文エラー: オプションは保存されていません"},"advancedSkipSettingsHelp":{"message":"仕組み","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"ベータテストサーバーを有効にする"},"whatEnableTestingServer":{"message":"登録したセグメントと投票がメインサーバーに「蓄積されなく」なります。試験目的にのみご利用ください。"},"testingServerWarning":{"message":"テストサーバーに接続中は、すべての登録・投票はメインサーバーに「蓄積されなく」なります。実際の登録・投票を行う場合、この設定を無効にしてください。"},"bracketNow":{"message":"(今)"},"moreCategories":{"message":"カテゴリーをさらに表示"},"chooseACategory":{"message":"カテゴリーを選択"},"enableThisCategoryFirst":{"message":"カテゴリ「{0}」のセグメントを送信するには、このカテゴリの設定を有効にする必要があります。今すぐ設定画面に転送します。","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"警告: この種類のセグメントは一度に最大一つだけ有効にすることができます。複数送信するとランダムなものが表示されます。"},"youMustSelectACategory":{"message":"登録するすべてのセグメントのカテゴリを選択してください!"},"bracketStart":{"message":"(開始)"},"bracketEnd":{"message":"(終了)"},"End":{"message":"終端へ","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"低評価のセグメントを無視する"},"hiddenDueToDuration":{"message":"あまりに短かい区間を無視する"},"manuallyHidden":{"message":"手動で非表示"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"チャンネルIDがまだ読み込まれていません。埋め込み動画でご覧になっている場合は、代わりにYouTubeの公式サイトで再生してみてください。この問題はYouTubeがレイアウトを変更した際にも発生する可能性があります。その場合は、こちらからお知らせください:"},"invidiousPermissionRefresh":{"message":"Invidiousなどのサードパーティーサイトで機能するために必要な権限をブラウザーが拒否しています。この権限を許可するには下のボタンをクリックしてください。"},"acceptPermission":{"message":"権限を承認する"},"permissionRequestSuccess":{"message":"権限リクエストが成功しました!"},"permissionRequestFailed":{"message":"権限要求に失敗しました。承認を拒否しましたか?"},"adblockerIssueWhitelist":{"message":"これを解決できない場合は、設定「スキップ前にチャンネルを強制的に確認」を無効にしてください。 SponsorBlockはこの動画のチャンネル情報を取得できません。"},"forceChannelCheck":{"message":"スキップ前にチャンネルを強制的に確認"},"whatForceChannelCheck":{"message":"標準設定では、チャンネル情報の取得前にすぐにシーンをスキップします。また標準設定では、ホワイトリストに追加されているチャンネルでも、その動画の先頭のシーンではスキップされる場合があります。この設定を有効にすると、この動作をやめます。しかしチャンネルIDの取得に時間がかかるため、すべてのスキップ時に遅延が少し発生します。高速なインターネット回線では気づかない程度です。"},"forceChannelCheckPopup":{"message":"「スキップ前にチャンネルを強制的に確認」を有効にしてみてください"},"downvoteDescription":{"message":"不正確/誤った再生時間"},"incorrectVote":{"message":"間違っている"},"harmfulVote":{"message":"有害である","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"カテゴリーを変更"},"nonMusicCategoryOnMusic":{"message":"この動画は音楽として分類されています。本当にこの動画に宣伝部分がありますか? このセグメントが実際には「音楽以外のセグメント」である場合、設定からこのカテゴリーを有効にしてください。「スポンサー」ではなく「音楽以外」としてセグメントを登録できます。お困りの場合は、ガイドラインを参照してください。"},"multipleSegments":{"message":"複数のセグメント"},"guidelines":{"message":"ガイドライン"},"readTheGuidelines":{"message":"ガイドラインをご覧ください!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"カテゴリーはこちらです!"},"categoryUpdate2":{"message":"導入/終了シーン・グッズ紹介などをスキップする設定を開く"},"help":{"message":"ヘルプ"},"GotIt":{"message":"了解","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"このセグメントは長すぎます。動画全体が一つのトピックに当てはまる場合は「スキップ」を「動画全体」に変更してください。詳しくはガイドラインを参照してください。"},"categoryPillTitleText":{"message":"この動画は全体がこのカテゴリーに指定されており、密に結合されているため分割できません"},"chapterNameTooltipWarning":{"message":"一部のチャプター名はカテゴリーにした方が良さそうです。可能な場合はカテゴリーを使用してください。"},"experiementOptOut":{"message":"実験的機能をすべて無効にする","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"再び表示しない"},"warningChatInfo":{"message":"どうやらあなたはよくある間違いを犯してしまったようです。これまでのあなたの協力には大きく感謝しています。ですが、私たちは完璧さを追求しており、小さなミスでも重要であることをご理解ください :)"},"questionButton":{"message":"質問があります"},"askAQuestion":{"message":"質問する"},"warningConfirmButton":{"message":"理由を理解しました"},"warningError":{"message":"警告の確認中にエラーが発生しました:"},"deArrowMessageRecieved":{"message":"調整役からの助言があります"},"Donate":{"message":"寄付"},"considerDonating":{"message":"開発を支援する"},"supportSponsorBlock":{"message":"SponsorBlockの私のフルタイム開発を支援してください"},"hideDonationLink":{"message":"寄付のお願いを表示しない"},"darkModeOptionsPage":{"message":"オプション画面でダークモードを使用"},"helpPageThanksForInstalling":{"message":"SponsorBlockをインストールいただきありがとうございます。"},"helpPageReviewOptions":{"message":"以下の設定をご確認ください"},"helpPageFeatureDisclaimer":{"message":"初期設定では多くの機能が無効になっています。導入/終了シーンをスキップしたり、Invidiousで使用するなど、以下から有効にできます。また表示されるパーツの設定もできます。"},"helpPageHowSkippingWorks":{"message":"動作の仕組み"},"helpPageHowSkippingWorks1":{"message":"すべての広告情報は、あなたのような個々のユーザーによって提出されます。提出されデータベースにある情報は、ブラウザの右上にあるポップアップを開くと表示されます。"},"helpPageHowSkippingWorks2":{"message":"セグメントをスキップする度に通知が表示されます。セグメントの範囲がおかしいと思ったら、そのセグメントを低評価してください。ポップアップ画面でも同様に投票ができます。"},"Submitting":{"message":"登録する"},"helpPageSubmitting1":{"message":"スポンサーブロックのロゴを動画プレーヤー内でクリックすることで、提出を行うことができます。"},"helpPageSubmitting2":{"message":"再生ボタンをクリックすると、セグメントの開始、停止アイコンをクリックすると終了が表示されます。 上向き矢印ボタンをクリックするとメニューが開き、完璧になるまでセグメントをプレビューして編集できます。 正確さは重要なので、送信前に必ずガイドラインをお読みください。"},"helpPageCopyOfDatabase":{"message":"データの送信先は?"},"helpPageCopyOfDatabase1":{"message":"すべての送信データはSponsorBlockのデータベースに登録されます。以下で公開され、誰でも利用可能になります"},"helpPageCopyOfDatabase2":{"message":"ソースコードは自由に利用できます。そのため、運営になにがあろうとも、あなたが登録したデータが失われることはありません。"},"AdviceForSubmitting":{"message":"広告シーン登録のヘルプ"},"Credits":{"message":"謝辞"},"LearnMore":{"message":"詳細を確認"},"FullDetails":{"message":"詳細"},"CopyDownvoteButtonInfo":{"message":"低評価を押し、再登録するためのローカルコピーを作成"},"OpenCategoryWikiPage":{"message":"このカテゴリーのWikiページを開きます。"},"CopyAndDownvote":{"message":"コピーして低評価"},"ContinueVoting":{"message":"投票を続ける"},"ChangeCategoryTooltip":{"message":"この変更はすぐにあなたのセグメントに適用されます"},"downvote":{"message":"低評価"},"upvote":{"message":"高評価"},"hideSegment":{"message":"セグメントを表示しない"},"skipSegment":{"message":"セグメントをスキップ"},"playChapter":{"message":"チャプターを再生"},"SponsorTimeEditScrollNewFeature":{"message":"編集ボックスにカーソルを合わせながらマウスホイールを使用すると、時間をすばやく調整できます。 CtrlキーまたはShiftキーの組み合わせを使用して変更を微調整できます。"},"categoryPillNewFeature":{"message":"新機能!動画全体が広告もしくは自己宣伝かがわかります"},"yearAbbreviation":{"message":"年","description":"100y"},"dayAbbreviation":{"message":"日","description":"100d"},"hourAbbreviation":{"message":"時間","description":"100h"},"optionsTabBehavior":{"message":"動作","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"表示","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"キーボードショートカット","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"バックアップ/復元","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"その他","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"スキップ通知の形式","description":"Option label"},"unbind":{"message":"解除","description":"Unbind keyboard shortcut"},"notSet":{"message":"未設定"},"change":{"message":"変更"},"youtubeKeybindWarning":{"message":"これはYouTubeにデフォルトで使用されているショートカットです。本当にこれを使用しますか?"},"betaServerWarning":{"message":"ベータサーバー利用中!"},"openOptionsPage":{"message":"オプションページを開く"},"resetToDefault":{"message":"設定を初期化する"},"confirmResetToDefault":{"message":"すべての設定を初期化しますか?元に戻すことはできません。"},"exportSegments":{"message":"セグメントをエクスポート"},"importSegments":{"message":"セグメントをインポート"},"Import":{"message":"インポート","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"適用に成功しました!"},"redeemFailed":{"message":"ライセンスキーが無効です"},"hideUpsells":{"message":"追加課金が必要なオプションを非表示にする"},"hideNewFeatureUpdates":{"message":"新機能に関する案内を非表示"},"redeem":{"message":"適用する"},"enterLicenseKey":{"message":"ライセンスキーを入力"},"unsubmittedSegmentCounts":{"message":"現在、{1} に {0} があります","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"未送信のセグメントなし","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"個の未送信セグメント","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"個の未送信セグメント","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"本の動画","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"本の動画","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"すべてのセグメントを消去","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"すべての未送信のセグメントを消去しますか?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"セグメントを表示","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"セグメントを非表示","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"動画ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"セグメント数","description":"Header of the unsubmitted segments list"},"actions":{"message":"操作","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"URLとして共有"},"segmentFetchFailureWarning":{"message":"警告: サーバーはまだセグメントへの応答をしていません。実際には、この動画のセグメントは既に送信済みかもしれません。一方、単にサーバーの問題により受信できていない可能性もあります。"},"allowScrollingToEdit":{"message":"スクロールで時間を編集できるようにする"},"NoticeTimeAfterSkip":{"message":"{seconds}秒","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - YouTube の題名や画像を改善","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"大げさな題名や画像をやめクラウドソーシングにより説明的な内容に改善","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"最も説明的なものを選択"},"Original":{"message":"元"},"OriginalTitle":{"message":"元の題名"},"CurrentTime":{"message":"現在の時間"},"resetCustomTitle":{"message":"題名を元の文字列に戻す"},"resetIcon":{"message":"アイコンを元に戻す"},"TypeYourOwnTitleHere":{"message":"あなたによる題名を入力"},"VideoNotReady":{"message":"動画はまだ準備できていません"},"FailedToRender":{"message":"描画に失敗","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"キャンバスがありません","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"描画中に例外","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"読み込みに失敗","description":"Thumbnail failed to load"},"titleFormatting":{"message":"題名の形式"},"Disabled":{"message":"無効"},"CapitalizeWords":{"message":"単語先頭を大文字"},"TitleCase":{"message":"題名用に大文字化"},"SentenceCase":{"message":"文の先頭単語を大文字"},"LowerCase":{"message":"小文字"},"FirstLetterUppercase":{"message":"1文字目を大文字"},"shouldCleanEmojis":{"message":"絵文字を除去"},"onlyFormatCustomTitles":{"message":"ユーザーが登録した題名のみを整形"},"onlyTitleCaseInEnglish":{"message":"英語ではない題名も大文字化する"},"onlyTitleCaseInEnglishDescription":{"message":"言語の検出は確実ではないので、英語の題名を英語でないと判定することもあります"},"thumbnailFallbackOption":{"message":"投稿されたサムネイルがないなら"},"whatThumbnailFallbackOption":{"message":"ランダムな時間を選択時には、SponsorBlock のデータを使って広告シーンが選ばれないようにします。","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"ランダムな時間のサムネイルを表示"},"TheOriginalThumbnail":{"message":"元のサムネイルを表示"},"showABlankBox":{"message":"空白のボックスを表示"},"AutoGenerated":{"message":"YouTubeが自動生成したサムネイルを表示","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"先頭"},"Middle":{"message":"途中"},"keepUnsubmitted":{"message":"送信済みの投票を保存"},"showLiveCover":{"message":"今後の動画でチャンネルアイコンを表示する","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"比較試験用サムネイルを用いない"},"ignoreAbThumbnailsDescription":{"message":"チャンネルは、視聴者ごとに異なるサムネイルを表示して比較試験をする場合があります。本機能を有効にすると、一貫性を保つためにつねに同じサムネイルを表示するようにします。"},"abThumbnailsWarning":{"message":"警告: この動画ではサムネイルの比較試験を行っており、サムネイルを頻繁に変更する可能性があります。混乱を避けるために元のサムネイルに投票しないでください。"},"whatKeepUnsubmitted":{"message":"送信済みの投票を投票後に保持し、サーバー上で投票上位のものの代わりに、あなたが選択した題名と画像を表示する。"},"keepUnsubmittedInPrivate":{"message":"プライベートモードのタブから送信した投票を保存する"},"useThumbnailGenerationService":{"message":"サムネイル生成サービスを使用"},"titleMaxLines":{"message":"題名の最大行数"},"titleMaxLinesDescription":{"message":"動画の題名を改行するさいの最大行数"},"thumbnailSaturationLevel":{"message":"サムネイルの彩度"},"whatSaturateThumbnails":{"message":"サムネイルの色を減らし鮮やかさを減らす"},"hideDetailsWhileFetching":{"message":"取得中の詳細を非表示"},"hideDetailsWhileFetchingDescription":{"message":"サーバーからデータ取得中に題名とサムネイルを非表示にします。無効なら、題名とサムネイルが変更されると点滅します。"},"ignoreTranslatedTitles":{"message":"YouTubeが自動翻訳した題名を表示しない","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTubeは題名をたまに自動翻訳します。このオプションは、クラウドソースに登録された題名がない場合にのみ適用されます。"},"onAllPages":{"message":"すべてのページで","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"動画のページ以外のすべてのページで","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"しない"},"thumbnailGeneratorDescription1":{"message":"サムネイル生成サービスは、動画IDを使用した匿名のリクエストをリモートサーバーに送信することで、サムネイル生成を大きく高速化します。そうしてサムネイルを生成するか、すでに生成済みであればそのキャッシュを使います。"},"thumbnailGeneratorDescription2":{"message":"動画のページに使うと、限定公開の動画IDがそのサーバーに漏洩する可能性があります。「動画のページ以外のすべてのページで」に設定すると、この問題を避けることができます。別の選択肢は、自分でサムネイル生成サービスを運用することです。"},"thumbnailGeneratorDescription3":{"message":"サムネイル生成サービスを使用しない場合、すべてのリクエストには、 k-anonymoity クエリのシステムを使います。これにより、サーバーに対しどの動画を取得したかを予測するのを難しくさせます。また低速なローカルのサムネイル生成サービス使われます。","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"サムネイル生成サービスのソースコード"},"moreAboutKAnonymity":{"message":"K-Anonymity の詳細","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"「元を表示」ボタンを常に表示する"},"whatAlwaysShowShowOriginalButton":{"message":"題名/サムネイルが変更されているかを常に知りたければ、これを有効化します。"},"showOriginalOnHover":{"message":"カーソルを乗せると、改善済みの詳細と元の詳細を入れ替え"},"showOriginalOnHoverOfVideo":{"message":"動画カードにカーソルを乗せると、改善済みの詳細と元の詳細を入れ替え"},"showOriginalOnHoverOfVideoDescription":{"message":"カーソルを乗せると自動再生を無効にします"},"showCustomOnHoverIfCasual":{"message":"カジュアルモードの題名が表示されている時、カーソルを乗せると改善済みの題名を表示"},"showIconForFormattedTitles":{"message":"自動整形された題名に「元を表示」ボタンを表示"},"Enable":{"message":"有効"},"Titles":{"message":"題名","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"サムネイル","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"カジュアルの投票数","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"エラー"},"ShowOriginal":{"message":"元の詳細を表示"},"ShowModified":{"message":"改善の詳細を表示"},"ShowFormatted":{"message":"改善の詳細を表示"},"FillerWarning":{"message":"警告: 非常に積極的な分類です。ほとんどの場合、スキップを取り消したり、時に無効にしなくてはなりません。多くの動画において、全体の半分以上がスキップされることに注意してください。登録には従うべき具体的なガイドラインがあることを忘れないでください。","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"DiscordまたはMatrixに参加していただくと、この会話を続けることができます。","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"ガイドラインの概要を表示","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"大げさな表情の使用を避ける","description":"Referring to the thumbnail of a video"},"tip2":{"message":"動画の全体の内容を踏まえてください。元の題名への単なる回答ではなく","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"動画への反応としての説明を避ける (驚かせる表現)","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"動画を視聴するかを判断できる十分な情報を提供する"},"tip5":{"message":"英語の題名は文章として大文字化する","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"送信前にすべてのガイドラインをご確認ください","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"新たな題名は、英文のように適切に大文字を使います","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"新たな題名は、その題名中の質問への返答だけにはしません","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"題名は、その動画、または話の筋を説明します。興味をそそるような元の題名には頼らず、動画全体を見て、実際になんであるかを確かめてください。","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"新たな題名は、結論をまとめたり、楽しみを損なうほどのネタバレはしません","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"題名は、動画を視聴する代わりにはしませんが、クリックすべきかを判断できるものです","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"新たな題名では、その動画や作成者について、真偽の確認を含めたり、馬鹿にしたり批判してはいけません","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"題名は、その作成者と動画の観点からにします。 動画自体の評価や事実確認はDeArrowの対象外です。題名は、コメントという意味ではありません。","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"検出された単語: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"題名の最初には、不要な英語の動詞を使わない","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"すべての題名の最初が英語なら大文字で始めます。題名は英文のように適切に整形してください","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"題名の終わりを . (ピリオド)にしない","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"元の題名の質問に答えたり、単に付け加えるだけにはしません。題名では、その動画または話の筋を説明してください","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"題名では、その動画や作成者について、真偽の確認を含めたり、馬鹿にしたり批判してはいけません","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"題名には元の題名にある大げさな内容を残しません","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"題名に絵文字を含めないでください","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"送信前に警告内容を解決してください"},"dearrowHelpSponsorBlockImported":{"message":"注: SponsorBlock の設定が自動でインポートされました!"},"howItWorks":{"message":"動作の説明"},"discordPromotion":{"message":"{discord}や{matrix}にて、あなたからの提案や貢献、お手伝いをお待ちしています"},"deArrowDonationText":{"message":"私の活動を気に入って頂けたら、寄付で支援してください。リンクはこちら。"},"termsAgreement":{"message":"この拡張機能の使用により、以下に同意します: {privacy-policy}と{terms}"},"privacyPolicy":{"message":"個人情報保護方針"},"termsOfUse":{"message":"利用規約"},"openSourceLicenses":{"message":"オープンソースライセンス"},"defaultToOriginals":{"message":"最初は動画の元の情報を表示"},"whatDefaultToOriginals":{"message":"最初は元の題名とサムネイルを表示します。カーソルを乗せると、改善された題名とサムネイルを表示するためのボタンが表示されます。"},"replaceTitles":{"message":"題名を置換"},"replaceThumbnails":{"message":"サムネイルを置換"},"useCrowdsourcedTitles":{"message":"クラウドソーシングによる題名を採用"},"whatUseCrowdsourcedTitles":{"message":"無効の場合、題名を整形しますが、コミュニティにより登録された題名は使われません","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"この設定を削除しますか?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"新しい設定"},"DeleteConfiguration":{"message":"設定を削除"},"ChannelAllowlist":{"message":"チャンネル固有の設定"},"ConfigurationName":{"message":"設定の名前"},"ChannelListInstructions":{"message":"この設定を適用するチャンネルを、改行で区切り下のボックスに入力します。チャンネルIDと表示名の両方に対応します。@username 形式には対応しません。 チャンネルの概要を表示し「共有」ボタンを押すと、チャンネルIDを取得できます。概要を表示するには、そのチャンネルのページのチャンネル名の下に表示されているチャンネルの説明を押します。","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"設定されていません。上のボタンをクリックし設定を新しく追加してください。","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"題名とサムネイルをより正確にし誇張された案内を置き換える"},"DeArrowPromotionMessage2":{"message":"誇張表現による案内にうんざりしませんか?題名とサムネイルを改善する、新しい拡張機能を開発しました"},"DeArrowPromotionMessage3":{"message":"DeArrow もご覧ください","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"この題名は気に入りませんか? 次のような題名にしたい場合は、DeArrowの題名置換機を用いることを検討してください。","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"この動画のサムネイルはまだ登録されていないので、サムネイルは動画からランダムに生成されています","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"この動画のサムネイルと題名はまだ登録されていないので、サムネイルは動画からランダムに生成、題名は自動整形されています","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"以下から既定の設定を変更できます","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"この拡張機能をインストール後、{titles}件の題名と{thumbnails}件のサムネイルを置換済み","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles}件の題名","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles}件の題名","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"と{thumbnails}枚のサムネイル","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"と{thumbnails}枚のサムネイル","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"この拡張機能のインストール後に {titleAndThumbnailMessage} を置換済み","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"題名とサムネイルの置換数を数える"},"countReplacementsDescription":{"message":"ポップアップ内に統計を表示するのに使用","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"yt-neuter を使いアンケート、商品表示、その他販促用のページ要素をブロックするためにフィルタリストを追加"},"requiresUblock":{"message":"uBlock Originが必要"},"videoIDWrongWhenSubmittingError":{"message":"videoIDの検出に問題が生じています。提出前に更新して、提出する動画が正しいものか確かめてください。この問題が頻繁に生じる場合は、GitHub、Discord、Matrixなどで報告してください。報告のさい、他の拡張機能やユーザースクリプトを導入している場合は、その旨もお伝えください。"},"dearrowLogoCredit":{"message":"ロゴは、CC-BY 4.0で利用許諾されているTwemojiに基づいています"},"zoomToFillUnsupported":{"message":"SponsorBlock は拡張機能 Zoom to Fill と互換性がありません。正常に動作する別の拡張機能がほかにもあります。"},"freeTrialStarted":{"message":"無料の試用期間を開始しました。YouTube上でお試しできます"},"freeTrialEnded":{"message":"無料の試用期間が過ぎています"},"freeTrialPrompt":{"message":"1時間の間、無料で試用することができます。下のボタンを押すと始まります。"},"startFreeTrial":{"message":"試用を始める"},"freeAccessRequested":{"message":"無料の試用にお申し込みいただきありがとうございます。試用期間が始まりましたら追ってお知らせいたします。"},"freeAccessComplete":{"message":"ようこそ!DeArrowを無料でお使いいただけます"},"DeArrowNotActivated":{"message":"DeArrow は有効化されていません"},"ActivateDeArrow":{"message":"DeAarrow を有効化"},"DeArrowIsActivated":{"message":"DeArrow の有効化に成功しました"},"Close":{"message":"閉じる"},"ViewLicenseKey":{"message":"ライセンスキーを表示"},"SharingIsCaring":{"message":"分けあうとは捧げあうこと"},"cleanPopup":{"message":"ポップアップのセグメント一覧をすっきり表示"},"hideSegmentCreationInPopup":{"message":"ポップアップ内のセグメント作成ボタンを隠す"},"syncDisabledWarning":{"message":"警告: このブラウザには、拡張機能が保存領域を使う許可がありません。設定を保存できません。"},"syncDisabledWarningDeArrow":{"message":"DeArrow は保存領域を使わないと動作しません。"},"syncDisabledFirefoxSuggestions":{"message":"有効化するには、about:config から webextensions.storage.sync.enabled の値を true に設定します。"},"storageFull":{"message":"拡張機能用の保存領域に空きがありません。オプションから未送信のセグメントを削除してください。"},"previewSegmentRequired":{"message":"送信前にセグメントを確認してください。プレビューボタンをクリックするか、次のショートカットから確認できます:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"VIPとして振る舞う","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"YouTube が、拡張機能で削除できないサーバーサイドの広告を挿入しているようです。そのため現時点では、このブラウザからの提出を受け付けできません。 このエラーが発生した場合、お問い合わせください。"},"DeArrowIsDisabled":{"message":"DeArrow は無効中 - クリックで有効にする","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"元のサムネイルはDeArrowのガイドラインに従っていますか?元のサムネイルを優先したいなら、DeArrowの設定「投稿されたサムネイルがないなら」があります。","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"SponsorBlockは、YouTube TV 上のライブ配信と最近録画されたコンテンツに対応していません。最近の録画では、変換済みの動画が利用可能になるまで数時間お待ちください。","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"チャンネルのホワイトリストは tv.youtube.com では対応していません。","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"元の題名が好きですか?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"はい"},"No":{"message":"いいえ"},"votes":{"message":"{0} 票","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} 票","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"面白い","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"独創的","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"上手","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"説明的","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"ほか","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"従来のモード","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"クラウドソース経由で登録された題名がある全動画で、ガイドラインに基づいて標準化された題名に置き換えられます。"},"CasualMode":{"message":"カジュアルモード","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"動画が十分に説明されているか、面白いか、上手なら元の題名のままにします。\n表示する題名の分類を選択します。\n題名が分類に適合するかどうかを投票できます。"},"minimumVotes":{"message":"投票数の下限","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"カジュアルモードで投票された動画で元のサムネイルを表示","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"新機能: カジュアルモード","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"改善された題名が利用可能な場合にのみカジュアルモードアイコンを表示"},"OpenSettings":{"message":"設定を開く"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/kn/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/kn/messages.json @@ -0,0 +1 @@ +{"0":{"message":"ಸಂಪರ್ಕ ಸಮಯ ಮೀರಿದೆ. ನಿಮ್ಮ ಅಂತರ್ಜಾಲವನ್ನು ಪರಿಶೀಲಿಸಿ. ನಿಮ್ಮ ಅಂತರ್ಜಾಲ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿದ್ದರೆ, ಸರ್ವರ್ ಬಹುಶಃ ಓವರ್‌ಲೋಡ್ ಅಥವಾ ನೆಲಕಚ್ಚಿರಬಹುದು."},"400":{"message":"ವಿನಂತಿಯು ಅಮಾನ್ಯವಾಗಿದೆ ಎಂದು ಸರ್ವರ್ ಹೇಳಿದೆ"},"409":{"message":"ಇದನ್ನು ಈಗಾಗಲೇ ಸಲ್ಲಿಸಲಾಗಿದೆ"},"502":{"message":"ಸರ್ವರ್ ಓವರ್‌ಲೋಡ್ ಆಗಿದೆ. ಕೆಲವು ಕ್ಷಣಗಳಲ್ಲಿ ಮರುಪ್ರಯತ್ನಿಸಿ."},"fullName":{"message":"ಯುಟ್ಯೂಬ್‌ಗಾಗಿ ಪ್ರಾಯೋಜಕತ್ವ ನಿರ್ಬಂಧ - ಪ್ರಾಯೋಜಕತ್ವಗಳನ್ನು ಬಿಟ್ಟುಬಿಡಿ","description":"Name of the extension."},"Description":{"message":"ಯುಟ್ಯೂಬ್ ವೀಡಿಯೊಗಳಲ್ಲಿ ಪ್ರಾಯೋಜಕತ್ವಗಳು, ಚಂದಾದಾರಿಕೆ ಭಿಕ್ಷಾಟನೆ ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಬಿಟ್ಟುಬಿಡಿ. ಇತರರ ಸಮಯವನ್ನು ಉಳಿಸಲು ನೀವು ನೋಡುವ ವೀಡಿಯೊಗಳ ಬಗ್ಗೆ ಪ್ರಾಯೋಜಕರನ್ನು ವರದಿ ಮಾಡಿ.","description":"Description of the extension."},"channelWhitelisted":{"message":"ಚಾನಲ್ ಶ್ವೇತಪಟ್ಟಿಗೆ ಸೇರಿಸಲಾಗಿದೆ!"},"Segment":{"message":"ವಿಭಾಗ"},"Segments":{"message":"ವಿಭಾಗಗಳು"},"SegmentsCap":{"message":"ವಿಭಾಗಗಳು"},"Chapters":{"message":"ಅಧ್ಯಾಯಗಳು"},"renderAsChapters":{"message":"ವಿಭಾಗಗಳನ್ನು ಅಧ್ಯಾಯಗಳನ್ನಾಗಿ ನಿರೂಪಿಸಿ","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"ವೀಡಿಯೊ ಸಮಯದ ಪಕ್ಕದಲ್ಲಿ ಪ್ರಸ್ತುತ ವಿಭಾಗವನ್ನು ತೋರಿಸಿ"},"showAutogeneratedChapters":{"message":"ಯೂಟ್ಯೂಬ್‌ನಿಂದ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಉತ್ಪತ್ತಿಯಾದ ಅಧ್ಯಾಯಗಳನ್ನು ತೋರಿಸಿ"},"upvoteButtonInfo":{"message":"ಈ ಸಲ್ಲಿಕೆಗೆ ಸಹಮತ ಹೆಚ್ಚಿಸಿ"},"reportButtonTitle":{"message":"ವರದಿಮಾಡಿ"},"reportButtonInfo":{"message":"ಈ ಸಲ್ಲಿಕೆಯು ತಪ್ಪಾಗಿದೆಯೆಂದು ವರದಿ ಮಾಡಿ."},"Dismiss":{"message":"ವಜಾಗೊಳಿಸಿ"},"Loading":{"message":"ಲೋಡ್ ಆಗುತ್ತಿದೆ..."},"Hide":{"message":"ಎಂದಿಗೂ ತೋರಿಸಬೇಡಿ"},"hitGoBack":{"message":"ಬಂದಲ್ಲಿಗೆ ಹಿಂತಿರುಗಲು ಅನ್-ಸ್ಕಿಪ್ ಒತ್ತಿರಿ."},"unskip":{"message":"ಅನ್-ಸ್ಕಿಪ್"},"reskip":{"message":"ರಿ-ಸ್ಕಿಪ್"},"unmute":{"message":"ಸದ್ದು ಮಾಡಿಸಿ"},"paused":{"message":"ನಿಲ್ಲಿಸಿದೆ"},"manualPaused":{"message":"ಟೈಮರ್ ನಿಲ್ಲಿಸಲಾಗಿದೆ"},"confirmMSG":{"message":"ಪ್ರತ್ಯೇಕ ಮೌಲ್ಯಗಳನ್ನು ಬದಲಿಸಲು ಅಥವಾ ಅಳಿಸಲು, ಮಾಹಿತಿ ಗುಂಡಿಯನ್ನು ಒತ್ತಿರಿ ಅಥವಾ ಮೇಲಿನ ಬಲ ಮೂಲೆಯಲ್ಲಿರುವ ಎಕ್ಸಟೆನ್ಶನ್ ಚಿಹ್ನೆಯನ್ನು ಒತ್ತುವ ಮೂಲಕ ಪಾಪ್ಅಪ್ ತೆರೆಯಿರಿ."},"clearThis":{"message":"ನೀವು ಇದನ್ನು ತೆರವುಗೊಳಿಸಲು ಖಚಿತಪಡಿಸುವಿರಾ?\n\n"},"Unknown":{"message":"ನಿಮ್ಮ ಪ್ರಾಯೋಜಕ ಸಮಯವನ್ನು ಸಲ್ಲಿಸುವಲ್ಲಿ ದೋಷವಿದೆ, ದಯವಿಟ್ಟು ಅನಂತರ ಮರುಪ್ರಯತ್ನಿಸಿ."},"sponsorFound":{"message":"ಈ ವೀಡಿಯೊ ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ವಿಭಾಗಗಳನ್ನು ಹೊಂದಿದೆ!"},"sponsor404":{"message":"ಯಾವುದೇ ವಿಭಾಗಗಳು ಕಂಡುಬಂದಿಲ್ಲ"},"sponsorStart":{"message":"ಈಗ ವಿಭಾಗವನ್ನು ಪ್ರಾರಂಭಿಸಿ"},"sponsorEnd":{"message":"ಈಗ ವಿಭಾಗವನ್ನು ಕೊನೆಗೊಳಿಸಿ"},"sponsorCancel":{"message":"ವಿಭಾಗ ರಚನೆಯನ್ನು ರದ್ದುಗೊಳಿಸಿ"},"noVideoID":{"message":"ಯಾವುದೇ ಯೂಟ್ಯೂಬ್ ವೀಡಿಯೊ ಕಂಡುಬಂದಿಲ್ಲ. ಇದು ತಪ್ಪಾಗಿದ್ದರೆ, ಟ್ಯಾಬ್ ಅನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ."},"refreshSegments":{"message":"ವಿಭಾಗಗಳನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ"},"success":{"message":"ಯಶಸ್ವಿಯಾಗಿದೆ!"},"voted":{"message":"ಮತ ಚಲಾಯಿಸಲಾಗಿದೆ!"},"serverDown":{"message":"ಸರ್ವರ್ ನೆಲಕಚ್ಚಿದಂತೆ ಭಾಸವಾಗುತ್ತಿದೆ. ತಕ್ಷಣ ಅಭಿವರ್ಧಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."},"connectionError":{"message":"ಸಂಪರ್ಕ ದೋಷ ಸಂಭವಿಸಿದೆ. ದೋಷ ಸಂಕೇತ: "},"segmentsStillLoading":{"message":"ವಿಭಾಗಗಳು ಇನ್ನೂ ಲೋಡ್ ಆಗುತ್ತಿವೆ..."},"clearTimes":{"message":"ವಿಭಾಗಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ"},"openPopup":{"message":"ಪ್ರಾಯೋಜಕಬ್ಲಾಕ್ ಪಾಪ್ಅಪ್ ತೆರೆಯಿರಿ"},"closePopup":{"message":"ಪಾಪ್ಅಪ್ ಮುಚ್ಚಿ"},"closeIcon":{"message":"ಮುಚ್ಚುವ ಚಿನ್ಹೆ"},"OpenSubmissionMenu":{"message":"ಸಲ್ಲಿಕೆ ಮೆನು ತೆರೆಯಿರಿ"},"OpenCasualVoteMenu":{"message":"ಕ್ಯಾಶುಯಲ್ ಮೋಡ್ ಮೆನು ತೆರೆಯಿರಿ"},"sortSegments":{"message":"ವಿಭಾಗಗಳನ್ನು ವಿಂಗಡಿಸಿ"},"submitCheck":{"message":"ನೀವು ಇದನ್ನು ಸಲ್ಲಿಸಲು ಖಚಿತಪಡಿಸುವಿರಾ?"},"whitelistChannel":{"message":"ಶ್ವೇತಪಟ್ಟಿಗೆ ಚಾನಲ್ ಸೇರಿಸಿ"},"removeFromWhitelist":{"message":"ಶ್ವೇತಪಟ್ಟಿಯಿಂದ ಚಾನಲ್ ತೆಗೆದುಹಾಕಿ"},"voteOnTime":{"message":"ವಿಭಾಗಕ್ಕೆ ಮತ ಚಲಾಯಿಸಿ"},"setPreviewKeybind":{"message":"ವಿಭಾಗದ ಪೂರ್ವವೀಕ್ಷಣೆ","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"ಸ್ಕಿಪ್ ಸೂಚನೆ ಮುಚ್ಚಿ","description":"Keybind label"},"setDownvoteKeybind":{"message":"ವಿಭಾಗಕ್ಕೆ ವಿರೋಧ ಮತ ಚಲಾಯಿಸಿ","description":"Keybind label"},"setUpvoteKeybind":{"message":"ವಿಭಾಗಕ್ಕೆ ಸಹಮತ ಚಲಾಯಿಸಿ","description":"Keybind label"},"nextChapterKeybind":{"message":"ಮುಂದಿನ ಅಧ್ಯಾಯ","description":"Keybind label"},"previousChapterKeybind":{"message":"ಹಿಂದಿನ ಅಧ್ಯಾಯ","description":"Keybind label"},"enableDeArrowKey":{"message":"ಡಿ-ಏರೋವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದನ್ನು ಟಾಗಲ್ ಮಾಡಿ","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"ಸಲ್ಲಿಕೆ ಮೆನು ತೆರೆಯಿರಿ","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"ಕೀಲಿಯನ್ನು ಬೆರಳಚ್ಚು ಮಾಡುವ ಮೂಲಕ ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು ನೀವು ಬಳಸಲು ಬಯಸುವ ಯಾವುದೇ ಮಾರ್ಪಡಕ ಕೀಲಿಗಳನ್ನು ಆರಿಸಿ."},"disableSkipping":{"message":"ಸ್ಕಿಪ್ಪಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"},"enableSkipping":{"message":"ಸ್ಕಿಪ್ಪಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"},"yourWork":{"message":"ನಿಮ್ಮ ಕೆಲಸ","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"ದೋಷ ಸಂಕೇತ: "},"skip":{"message":"ಸ್ಕಿಪ್ ಮಾಡಿ"},"mute":{"message":"ಸದ್ದಡಗಿಸಿ"},"full":{"message":"ಪೂರ್ಣ ವಿಡಿಯೋ","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?"},"mute_category":{"message":"{0} ಸದ್ದಡಗಿಸುವುದೇ?"},"skip_to_category":{"message":"{0} ಸ್ಕಿಪ್ ಮಾಡುವುದೇ?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"ಮುಂಬರುವ {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} ಸ್ಕಿಪ್ ಮಾಡಲಾಗಿದೆ","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} ಸದ್ದಡಗಿಸಿದೆ","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"{0} ವರೆಗೆ ಸ್ಕಿಪ್ ಮಾಡಲಾಗಿದೆ","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"{0} ಮತ ಚಲಾಯಿಸಲಾಗಿದೆ","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"ಆಟೋಸ್ಕಿಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"},"enableAutoSkip":{"message":"ಆಟೋಸ್ಕಿಪ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"},"audioNotification":{"message":"ಸ್ಕಿಪ್‌ ಮಾಡಿದಾಗ ಆಡಿಯೊ ಅಧಿಸೂಚನೆ ನೀಡಿ"},"audioNotificationDescription":{"message":"ಒಂದು ವಿಭಾಗವನ್ನು ಸ್ಕಿಪ್‌ ಮಾಡಿದಾಗ ಆಡಿಯೊ ಅಧಿಸೂಚನೆಯು ಧ್ವನಿ ನುಡಿಸುತ್ತದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ (ಅಥವಾ ಆಟೋ ಸ್ಕಿಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ) ಯಾವುದೇ ಧ್ವನಿಯನ್ನು ನುಡಿಸಲಾಗುವುದಿಲ್ಲ."},"showTimeWithSkips":{"message":"ಸ್ಕಿಪ್‌ ಮಾಡಿರುವುದನ್ನು ಹೊರತುಪಡಿಸಿ ಸಮಯವನ್ನು ತೋರಿಸಿ"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ko/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ko/messages.json @@ -0,0 +1 @@ +{"0":{"message":"연결 시간을 초과했어요. 인터넷 연결을 확인하세요. 인터넷이 작동 중이라면, 서버가 과부하 됐거나 다운된 것일 수도 있어요."},"400":{"message":"서버에서 이 요청이 잘못됐다고 응답했어요"},"409":{"message":"이전에 이미 제출된 적이 있어요"},"502":{"message":"서버가 과부하 된 것 같아요. 몇 초 후에 다시 시도해 보세요."},"fullName":{"message":"YouTube용 SponsorBlock - 스폰서 광고 차단","description":"Name of the extension."},"Description":{"message":"YouTube 영상의 스폰서 광고, '구독과 좋아요' 광고 같이 쓸데없는 광고를 모두 건너뛰세요. 영상의 스폰서 광고 구간을 신고하여 다른 사람들의 시간을 절약할 수 있게 해주세요.","description":"Description of the extension."},"channelWhitelisted":{"message":"채널을 허용 목록에 추가했어요!"},"Segment":{"message":"구간"},"Segments":{"message":"구간"},"SegmentsCap":{"message":"구간"},"Chapters":{"message":"챕터"},"renderAsChapters":{"message":"챕터처럼 구간을 불러오기","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"동영상 시간 옆에 현재 구간 표시"},"showAutogeneratedChapters":{"message":"YouTube가 자동 생성한 챕터 표시"},"upvoteButtonInfo":{"message":"이 제출을 추천해요"},"reportButtonTitle":{"message":"신고"},"reportButtonInfo":{"message":"잘못된 제출로 신고해요"},"Dismiss":{"message":"무시"},"Loading":{"message":"불러오는 중..."},"Hide":{"message":"창 닫기"},"hitGoBack":{"message":"다시 돌아가려면 건너뛰지 않기를 누르세요."},"unskip":{"message":"건너뛰지 않기"},"reskip":{"message":"다시 건너뛰기"},"unmute":{"message":"음소거 해제"},"paused":{"message":"중지됨"},"manualPaused":{"message":"타이머가 정지됨"},"confirmMSG":{"message":"각 값을 편집하거나 삭제하려면, 정보 버튼을 누르거나 우측 상단에 있는 확장 프로그램 아이콘을 눌러 확장 프로그램 팝업을 여세요."},"clearThis":{"message":"정말로 초기화할까요?\n\n"},"Unknown":{"message":"\"후원이나 협찬\" 구간을 제출하는 동안 오류가 발생했어요. 나중에 다시 시도해주세요."},"sponsorFound":{"message":"이 동영상은 데이터베이스에 있는 구간을 포함해요!"},"sponsor404":{"message":"구간을 찾지 못했어요"},"sponsorStart":{"message":"구간 시작"},"sponsorEnd":{"message":"구간 종료"},"sponsorCancel":{"message":"구간 생성 취소"},"noVideoID":{"message":"YouTube 동영상을 찾지 못했어요.\n오류라고 생각된다면, 탭을 새로고침하세요."},"refreshSegments":{"message":"구간 새로고침"},"success":{"message":"성공!"},"voted":{"message":"투표 완료!"},"serverDown":{"message":"서버가 다운된 것 같아요. 개발자에게 연락해 주세요."},"connectionError":{"message":"연결 오류가 발생했어요. 오류 코드: "},"segmentsStillLoading":{"message":"구간을 여전히 불러오는 중이에요..."},"clearTimes":{"message":"구간 초기화"},"openPopup":{"message":"SponsorBlock 팝업 열기"},"closePopup":{"message":"팝업 닫기"},"closeIcon":{"message":"닫기 아이콘"},"OpenSubmissionMenu":{"message":"제출 메뉴 열기"},"OpenCasualVoteMenu":{"message":"캐주얼 모드 메뉴 열기"},"sortSegments":{"message":"구간 정렬"},"submitCheck":{"message":"정말로 이걸 제출할까요?"},"whitelistChannel":{"message":"허용 목록에 채널 추가"},"removeFromWhitelist":{"message":"허용 목록에서 채널 제거"},"voteOnTime":{"message":"구간 투표"},"Submissions":{"message":"제출"},"savedPeopleFrom":{"message":"나 덕분에 다른 사람이 건너뛴 구간: "},"viewLeaderboard":{"message":"순위표"},"recordTimesDescription":{"message":"제출"},"submissionEditHint":{"message":"제출하고 나면 구간을 수정할 수 있게 돼요","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"도움말: 설정에서 제출용 단축키를 설정할 수 있어요"},"clearTimesButton":{"message":"구간 초기화"},"Username":{"message":"사용자명"},"setUsername":{"message":"사용자명 설정"},"copyPublicID":{"message":"공개 사용자 ID 복사"},"copySegmentID":{"message":"구간 ID 복사"},"loopChapter":{"message":"챕터 반복"},"unloopChapter":{"message":"챕터 반복 해제"},"hideThis":{"message":"숨기기"},"Options":{"message":"설정"},"showButtons":{"message":"YouTube 재생 바에서 버튼 표시"},"hideButtonsDescription":{"message":"건너뛸 구간을 제출할 수 있는 YouTube 재생 바에 있는 버튼을 숨겨요."},"showSkipButton":{"message":"재생 바에 하이라이트로 이동 버튼 표시"},"showInfoButton":{"message":"YouTube 탐색 바에서 정보 버튼 표시"},"autoHideInfoButton":{"message":"정보 버튼 자동 숨김"},"showDeleteButton":{"message":"YouTube 탐색 바에서 삭제 버튼 표시"},"enableViewTracking":{"message":"건너뛴 횟수 추적 사용"},"whatViewTracking":{"message":"이 기능으로 건너뛴 구간을 추적해서 사용자가 제출한 내용이 다른 분께 얼마나 도움이 되는지 알려주고 잘못된 구간이 데이터베이스에 들어가지 않도록 추천과 함께 분석에 사용해요. 이 확장 프로그램이 구간을 건너뛸 때마다 서버에 메시지를 보낼 거예요. 조회수가 정확하기 위해서는 이 설정을 변경하지 않기를 바라요. :)"},"enableViewTrackingInPrivate":{"message":"시크릿/사생활 보호 탭에서 건너뛴 횟수 추적 사용"},"enableTrackDownvotes":{"message":"비추천한 구간 저장"},"whatTrackDownvotes":{"message":"비추천한 구간을 새로고침 이후에도 계속 숨겨요"},"trackDownvotesWarning":{"message":"경고: 사용하지 않으면 이전에 저장된 비추천 구간이 삭제돼요"},"enableTrackDownvotesInPrivate":{"message":"시크릿/사생활 보호 탭에서 비추천한 구간 저장"},"enableQueryByHashPrefix":{"message":"해시 접두사로 요청 전송"},"whatQueryByHashPrefix":{"message":"동영상 ID로 구간을 요청하는 대신, 동영상 ID의 첫 해시 4자리를 보내요. 서버가 유사한 해시가 포함된 모든 동영상의 데이터를 보낼 거예요."},"enableShowCategoryWithoutPermission":{"message":"제출 권한이 없는 카테고리도 제출 메뉴에 표시"},"whatShowCategoryWithoutPermission":{"message":"일부 카테고리는 최소 평판 요건을 만족해야 제출할 수 있는 권한이 부여돼요"},"showNotice":{"message":"알림을 다시 표시하기"},"showSkipNotice":{"message":"구간을 건너뛴 후 알림 표시"},"showUpcomingNotice":{"message":"구간 시작 전 알림 표시"},"showCategoryGuidelines":{"message":"카테고리 도움말 표시"},"noticeVisibilityMode0":{"message":"모든 건너뛰기 알림 표시"},"noticeVisibilityMode1":{"message":"자동 건너뛰기 시 알림 축소"},"noticeVisibilityMode2":{"message":"모든 건너뛰기 알림 축소"},"noticeVisibilityMode3":{"message":"자동 건너뛰기 시 알림 숨김"},"noticeVisibilityMode4":{"message":"모든 건너뛰기 알림 숨김"},"longDescription":{"message":"SponsorBlock을 사용하면 영상에서 스폰서 광고, 인트로 영상, 아웃트로 영상, 구독 광고와 그 외 쓸데없는 부분을 즉시 건너뛸 수 있습니다. SponsorBlock은 모든 사람들이 참여하는 브라우저 확장 기능으로 확장 기능 사용자는 스폰서 광고 또는 다른 광고의 시작 시간과 끝 시간을 확인하여 서버로 전송할 수 있습니다. 이러한 정보가 전송되면 그 영상을 보는 다른 사용자들은 광고 구간이 나오기 전에 자동으로 건너뛸 수 있습니다. SponsorBlock을 사용하면 뮤직 비디오에서 음악이나 노래가 아닌 구간도 건너뛸 수 있습니다.","description":"Full description of the extension on the store pages."},"website":{"message":"웹 사이트","description":"Used on Firefox Store Page"},"sourceCode":{"message":"소스 코드","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"알림 창이 개선됐어요!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"여전히 알림 창이 마음에 들지 않는다면, 창 닫기 버튼을 누르세요.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"구간 건너뛰기","description":"Keybind label"},"setStartSponsorShortcut":{"message":"구간 시작/종료","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"제출 메뉴 열기","description":"Keybind label"},"setSubmitKeybind":{"message":"구간 제출","description":"Keybind label"},"setPreviewKeybind":{"message":"구간 미리 보기","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"건너뛰기 알림 닫기","description":"Keybind label"},"setDownvoteKeybind":{"message":"구간 비추천","description":"Keybind label"},"setUpvoteKeybind":{"message":"구간 추천","description":"Keybind label"},"nextChapterKeybind":{"message":"다음 챕터","description":"Keybind label"},"previousChapterKeybind":{"message":"이전 챕터","description":"Keybind label"},"enableDeArrowKey":{"message":"DeArrow 켜기/끄기 전환","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"제출 메뉴 열기","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"키를 입력해서 등록해 주세요. 필요하다면 보조 키를 선택해 주세요."},"disableSkipping":{"message":"건너뛰기 켜짐"},"enableSkipping":{"message":"건너뛰기 꺼짐"},"yourWork":{"message":"내가 한 일","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"오류 코드: "},"skip":{"message":"건너뛰기"},"mute":{"message":"음소거"},"full":{"message":"동영상 전체","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} 카테고리를 건너뛸까요?"},"mute_category":{"message":"{0} 카테고리를 음소거할까요?"},"skip_to_category":{"message":"{0}로 이동할까요?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"{0} 예고","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0}을 건너뜀","description":"Example: Sponsor Skipped"},"muted":{"message":"{0}이 음소거됨","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"{0}로 건너뛰었어요","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"{0}에 투표 완료","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"자동 건너뛰기 사용 안 함"},"enableAutoSkip":{"message":"자동 건너뛰기 사용"},"audioNotification":{"message":"건너뛸 때 소리 재생"},"audioNotificationDescription":{"message":"구간을 건너뛸 때마다 소리를 재생해요. 자동 건너뛰기를 사용하지 않는 경우, 아무 소리도 재생되지 않아요."},"showTimeWithSkips":{"message":"건너뛰기로 제외된 시간 표시"},"showTimeWithSkipsDescription":{"message":"이 시간은 탐색 바 아래에 있고 현재 시간 옆에 있는 대괄호로 표시돼요. 건너뛸 구간을 제외할 실제로 재생하게 될 동영상의 길이를 보여줘요. \"탐색 바에 표시\"로만 지정된 구간도 포함해요."},"youHaveSkipped":{"message":"건너뛴 구간: "},"minLower":{"message":"분"},"minsLower":{"message":"분"},"hourLower":{"message":"시간"},"hoursLower":{"message":"시간"},"youHaveSavedTime":{"message":"나 덕분에 다른 사람이 건너뛴 구간:","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" 정도를 절약함","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Status.sponsor.ajay.app에서 서버 상태를 확인하세요."},"changeUserID":{"message":"비공개 사용자 ID 가져오기/내보내기"},"whatChangeUserID":{"message":"이 정보를 다른 사람에게 공개하지 마세요. 이건 비밀번호와 같으며 누구와도 공유해서는 안 되는 정보랍니다. 다른 사람이 이 정보를 습득한다면, 나를 사칭할 수도 있어요. 공개 사용자 ID를 찾고 있다면, 팝업 내 클립보드 아이콘을 눌러주세요."},"setUserID":{"message":"비공개 사용자 ID 설정"},"userIDChangeWarning":{"message":"경고: 비공개 사용자 ID를 변경하면 되돌릴 수 없어요. 정말로 확실한가요? 혹시 모르니 예전 사용자 ID를 백업해두는 걸 권장해요."},"createdBy":{"message":"개발자: "},"supportOtherSites":{"message":"제삼자 YouTube 사이트 지원"},"supportOtherSitesDescription":{"message":"제삼자 YouTube 클라이언트에서도 기능을 지원하도록 해요. 이 기능을 사용하려면 추가 권한을 허용해야 해요.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"지원하는 사이트: "},"optionsInfo":{"message":"Invidious 지원 사용, 자동 건너뛰기 사용 안 함, 버튼 숨기기 등이 있어요."},"addInvidiousInstance":{"message":"제삼자 클라이언트 인스턴스 추가"},"addInvidiousInstanceDescription":{"message":"사용자 지정 인스턴스를 추가해요. 도메인 형식으로 되어있어야 해요. 예: invidious.ajay.app"},"add":{"message":"추가"},"addInvidiousInstanceError":{"message":"잘못된 도메인이에요. 도메인 부분만 포함해야 해요. 예: invious.ajay.app"},"resetInvidiousInstance":{"message":"Invidious 인스턴스 목록 초기화"},"resetInvidiousInstanceAlert":{"message":"Invidious 인스턴스 목록을 초기화할까요?"},"invidiousDisabledSafari":{"message":"Safari의 버그로 인해 Invidious 지원을 이용할 수 없어요. Apple이 버그를 수정하면, 다시 추가될 거예요."},"currentInstances":{"message":"현재 인스턴스:"},"minDuration":{"message":"최소 기간(초):"},"minDurationDescription":{"message":"설정한 값보다 작은 구간은 건너뛰지 않으며 탐색 바에 표시되지 않아요."},"enableManualSkipOnFullVideo":{"message":"동영상 전체 라벨이 존재할 때 수동 건너뛰기 사용"},"whatManualSkipOnFullVideo":{"message":"전반적인 동영상 내용이 협찬이거나 자체 홍보인 경우에도 동영상을 계속 시청하고자 하는 분을 위한 설정이에요."},"skipNoticeDuration":{"message":"건너뛰기 알림 길이(초):"},"skipNoticeDurationDescription":{"message":"최소 몇 초간 건너뛰기 알림이 표시될지 지정해요. 수동 건너뛰기의 경우, 알림이 더 길게 표시될 수 있어요."},"shortCheck":{"message":"이 제출은 설정된 최소 기간보다 작아요. 이미 제출되었을 수도 있으며, 설정으로 인해 무시되었을 수도 있어요. 그래도 제출할까요?"},"liveOrPremiere":{"message":"진행 중인 실시간 스트림 및 최초 공개 동영상에는 제출할 수 없어요. 끝날 때까지 기다리신 후, 페이지를 새로고침한 후 유효한 구간을 확인해주세요."},"showUploadButton":{"message":"업로드 버튼 표시"},"customServerAddress":{"message":"SponsorBlock 서버 주소"},"customServerAddressDescription":{"message":"SponsorBlock이 서버에 연결을 보낼 주소예요.\n따로 구축한 서버 인스턴스가 없으면, 이 주소를 변경하지 않아야 해요."},"dataFetchingServerAddress":{"message":"데이터를 가져올 서버 주소"},"dataFetchingServerAddressDescription":{"message":"데이터를 가져올 서버에 요청하는 데 사용되는 주소예요.\n따로 구축한 서버 인스턴스가 없다면, 변경하지 않아야 해요."},"thumbnailCacheServerAddress":{"message":"썸네일 캐시 서버 주소"},"save":{"message":"저장"},"reset":{"message":"초기화"},"customAddressError":{"message":"올바르지 않은 형식의 주소예요. http:// 또는 https://로 시작해야 하고 마지막 문자에 빗금이 없어야 해요."},"areYouSureReset":{"message":"이걸 정말로 초기화할까요?"},"mobileUpdateInfo":{"message":"이제 m.youtube.com 링크를 지원해요"},"exportOptions":{"message":"모든 설정 가져오기/내보내기"},"exportOtherData":{"message":"그 외 모든 데이터 가져오기/내보내기"},"exportOptionsCopy":{"message":"편집/복사"},"exportOptionsDownload":{"message":"파일로 저장하기"},"exportOptionsUpload":{"message":"파일에서 불러오기"},"whatExportOptions":{"message":"JSON의 전체 구성 파일이에요. 비공개 사용자 ID가 포함되어 있으니, 공유할 때 주의하세요."},"setOptions":{"message":"옵션 저장"},"exportOptionsWarning":{"message":"경고: 옵션을 변경하면 되돌릴 수 없고 불러올 때 오류가 발생할 수 있어요. 정말로 확실한가요? 혹시 모르니 예전 설정을 백업해두는 걸 권장해요."},"incorrectlyFormattedOptions":{"message":"JSON 형식이 잘못됐어요. 옵션이 변경되지 않았어요."},"confirmNoticeTitle":{"message":"구간 제출"},"submit":{"message":"제출하기"},"cancel":{"message":"취소"},"delete":{"message":"삭제"},"preview":{"message":"미리 보기"},"unsubmitted":{"message":"미제출됨"},"inspect":{"message":"구간 보기"},"edit":{"message":"편집"},"copyDebugLogs":{"message":"디버그 로그 복사"},"copyDebugInformation":{"message":"디버그 정보를 클립보드에 복사하기"},"copyDebugInformationFailed":{"message":"클립보드에 복사하지 못했어요."},"copyDebugInformationOptions":{"message":"버그를 신고할 때나 개발자가 요청했을 때 필요한 디버그 정보를 클립보드에 복사해요. 사용자 ID, 화이트리스트 채널 목록, 맞춤 서버 주소 같은 민감한 정보는 포함되지 않아요. 디버그 정보에는 사용자 에이전트, 브라우저 정보, 사용 중인 운영 체제, 확장 프로그램의 버전 정보가 포함돼요. "},"copyDebugInformationComplete":{"message":"디버그 정보가 클립보드에 복사됐어요. 공유하고 싶지 않은 정보를 지우셔도 돼요. 이걸 텍스트 파일로 저장하거나 버그 제보 시 이걸 붙여넣기해 주세요."},"keyAlreadyUsed":{"message":"이 단축키는 다른 동작에 할당됐어요. 다른 키로 선택해 주세요."},"to":{"message":"-","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"복사했어요!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"연속적인 전환이 포함된 구간이어야 함"},"generic_guideline2":{"message":"건너뛰더라도 동영상 내용이 자연스럽게 흘러가야 함"},"category_sponsor":{"message":"후원이나 협찬 구간"},"category_sponsor_description":{"message":"이 구간은 유료 광고, 유료 협찬과 같은 직접적인 광고 내용이 포함됐어요. 대가 없는 광고, 자발적인 홍보 등은 여기에 해당하지 않아요."},"category_sponsor_guideline1":{"message":"유료 광고 구간"},"category_sponsor_guideline2":{"message":"후원과 자체 상품은 해당하지 않음"},"category_selfpromo":{"message":"무대가 홍보 구간"},"category_selfpromo_description":{"message":"이 구간은 \"후원이나 협찬 구간\"과 유사하지만, 자발적으로 홍보하는 내용이 포함됐어요. 여기에는 채널 굿즈 광고, 기부 광고와 영상 제작에 참여한 사람을 홍보하는 광고가 해당돼요."},"category_selfpromo_guideline1":{"message":"후원, 멤버십, 자체 상품을 소개하는 구간이어야 함"},"category_selfpromo_guideline2":{"message":"동영상과 관련 없는 자발적인 홍보가 담긴 구간이어야 함"},"category_selfpromo_guideline3":{"message":"기업 제품과 상품은 해당하지 않음"},"category_exclusive_access":{"message":"홍보 동영상"},"category_exclusive_access_description":{"message":"이 구간은 동영상이 유/무료 협찬을 받은 제품, 서비스, 장소를 소개하는 내용이 포함됐어요. 또한 이 카테고리는 동영상 전체에 해당돼요."},"category_exclusive_access_pill":{"message":"이 구간 내 동영상은 유/무료 협찬을 받은 제품, 서비스, 장소를 소개하는 내용이 포함됐어요.","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"전체 동영상이 협찬 받은 대상을 소개해야 함."},"category_interaction":{"message":"상호작용 알림 구간"},"category_interaction_description":{"message":"이 구간은 동영상 속에 좋아요, 구독, 팔로우를 요청하는 내용이 포함됐어요. 특정 무언가에 관한 내용이라면, \"무대가 홍보 구간\" 카테고리로 지정해야 해요."},"category_interaction_guideline1":{"message":"좋아요, 구독, 팔로우 등을 요청하는 구간이어야 함"},"category_interaction_guideline2":{"message":"간접적인 댓글 작성을 유도하는 구간이어야 함"},"category_interaction_guideline3":{"message":"일반적인 홍보가 아닌 행동을 요청하는 구간이어야 함"},"category_interaction_short":{"message":"상호작용 알림 구간"},"category_intro":{"message":"인트로/무음 구간"},"category_intro_description":{"message":"이 구간은 동영상 속에 반복되는 애니메이션이나 정적 프레임과 같은 내용이 포함됐어요. 전환 시 정보를 포함하는 구간은 여기에 해당하지 않아요."},"category_intro_short":{"message":"인트로/무음 구간"},"category_intro_guideline1":{"message":"콘텐츠가 없는 구간이어야 함"},"category_intro_guideline2":{"message":"정보가 포함된 구간이 아니어야 함"},"category_outro":{"message":"최종 화면 구간"},"category_outro_description":{"message":"이 구간은 최종 화면이나 크레딧 내용이 포함됐어요. 정보가 포함된 결론 부분은 여기에 해당하지 않아요."},"category_outro_guideline1":{"message":"최종 화면이 표시됐더라도, 콘텐츠가 포함되는 구간이 아니어야 함"},"category_preview_description":{"message":"이 구간은 동영상의 뒷부분에서 반복되는 현재 동영상 또는 시리즈의 다른 동영상에 나온 정보를 보여주는 클립 모음이 해당돼요."},"category_preview_guideline1":{"message":"향후 동영상에 나타나는 장면이 있는 구간이어야 함"},"category_preview_guideline2":{"message":"이전 동영상을 요약해야 함"},"category_preview_guideline3":{"message":"추가 콘텐츠가 있는 구간이 아니어야 함"},"category_filler":{"message":"잡담/농담"},"category_filler_description":{"message":"이 구간은 전반적인 동영상의 주제를 이해하는 데 필요 없는 잡담이나 농담이 포함됐어요. 상세한 배경지식이나 맥락을 설명하는 구간은 여기에 해당하지 않아요. \"재미\"를 원치 않을 때 적용할 수 있는 적극적인 카테고리예요."},"category_filler_short":{"message":"잡담"},"category_filler_guideline1":{"message":"주제와 무관한 잡담이나 농담을 하는 구간이어야 함"},"category_filler_guideline2":{"message":"주제와 관련 없는 내용이 포함된 구간이어야 함"},"category_filler_guideline3":{"message":"주제 이해와 관련 없는 장면이어야 함"},"category_music_offtopic":{"message":"음악이 아닌 구간"},"category_music_offtopic_description":{"message":"이 구간은 뮤직비디오에서만 해당돼요. 다른 카테고리에 속하지 않는 뮤직비디오에서만 이 카테고리를 사용하세요."},"category_music_offtopic_short":{"message":"음악이 아닌 구간"},"category_music_offtopic_guideline1":{"message":"정식 음악에는 없는 구간이어야 함"},"category_music_offtopic_guideline2":{"message":"실시간 공연에서 음악이 아닌 구간이어야 함"},"category_poi_highlight":{"message":"하이라이트"},"category_poi_highlight_description":{"message":"이 구간은 많은 사람이 찾는 동영상의 부분이 포함됐어요. \"동영상은 x부터 시작해요\" 댓글과 유사해요."},"category_poi_highlight_guideline1":{"message":"많은 사람이 찾는 부분이어야 함"},"category_poi_highlight_guideline2":{"message":"전반적인 동영상의 맥락과 일치하는 구간이어야 함"},"category_poi_highlight_guideline3":{"message":"제목 또는 썸네일과 연관 있어야 함"},"category_chapter":{"message":"챕터"},"category_chapter_description":{"message":"챕터는 동영상의 주요 구간을 설명해요."},"category_chapter_guideline1":{"message":"스폰서 브랜드 이름을 언급하지 않아야 함"},"category_chapter_guideline2":{"message":"일반적인 부분에서는 큰 챕터를 사용해야 함"},"category_chapter_guideline3":{"message":"큰 챕터 속에 작은 챕터를 배치할 수 있음"},"category_livestream_messages":{"message":"실시간: 후원자 메시지 구간"},"category_livestream_messages_short":{"message":"후원자 메시지 구간"},"autoSkip":{"message":"자동 건너뛰기"},"manualSkip":{"message":"수동 건너뛰기"},"showOverlay":{"message":"탐색 바에 표시"},"disable":{"message":"사용 안 함"},"autoSkip_POI":{"message":"시점으로 자동 이동"},"manualSkip_POI":{"message":"동영상을 불러왔을 때 묻기"},"showOverlay_POI":{"message":"탐색 바에 표시"},"showOverlay_full":{"message":"라벨 표시"},"showOverlay_chapter":{"message":"챕터 표시"},"autoSkipOnMusicVideos":{"message":"음악이 아닌 구간이 있을 때 모든 구간 자동 건너뛰기"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"music.youtube.com에서만 자동 건너뛰기"},"muteSegments":{"message":"구간을 건너뛰지 않고 음소거 처리"},"fullVideoSegments":{"message":"동영상 전체가 광고일 때 아이콘 표시","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"동영상 썸네일에도 라벨 표시","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"미제출 색상","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"탐색 바 색상"},"category":{"message":"카테고리"},"skipOption":{"message":"건너뛰기 설정","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"고급 건너뛰기 옵션 열기"},"advancedSkipNotSaved":{"message":"구문 오류: 옵션이 저장되지 않았어요"},"advancedSkipSettingsHelp":{"message":"작동 원리","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"베타 테스트 서버 사용"},"whatEnableTestingServer":{"message":"제출과 투표가 메인 서버에 반영되지 않아요. 테스트용으로만 사용하세요."},"testingServerWarning":{"message":"제출과 투표가 테스트 서버에 연결하는 동안 메인 서버에 반영되지 않아요. 실제 제출 시에는 사용하지 않는 걸 잊지 마세요."},"bracketNow":{"message":"(현재)"},"moreCategories":{"message":"추가 카테고리"},"chooseACategory":{"message":"카테고리 선택"},"enableThisCategoryFirst":{"message":"\"{0}\" 카테고리의 구간을 제출하려면, 설정에서 사용해야 해요. 바로 설정 창으로 이동하실 거예요.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"경고: 이 유형의 구간은 한 번에 최대 한 개만 사용할 수 있어요. 여러 구간을 제출하면 구간 중 하나가 무작위로 표시돼요."},"youMustSelectACategory":{"message":"제출하는 모든 구간에 대해 카테고리를 선택해야 해요!"},"bracketStart":{"message":"(시작)"},"bracketEnd":{"message":"(끝)"},"End":{"message":"끝","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"숨겨짐: 비추천"},"hiddenDueToDuration":{"message":"숨겨짐: 너무 짧음"},"manuallyHidden":{"message":"수동으로 숨겨짐"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"채널 ID를 불러오지 못했어요. 임베디드 동영상인 경우, YouTube 홈페이지에서 시도해보세요. YouTube 레이아웃 변화로 인해 발생한 문제일 수도 있어요. 그렇게 생각하신다면 다음 사이트에서 의견을 남겨주세요: "},"invidiousPermissionRefresh":{"message":"브라우저가 Invidious와 다른 제삼자 사이트에서 동작하기 위한 권한을 회수했어요. 이 권한을 다시 부여하려면 아래 버튼을 눌러주세요."},"acceptPermission":{"message":"권한 허용"},"permissionRequestSuccess":{"message":"권한 요청에 성공했어요!"},"permissionRequestFailed":{"message":"권한 요청에 실패했어요. 거부를 누르셨나요?"},"adblockerIssueWhitelist":{"message":"이 문제를 해결할 수 없는 경우 SponsorBlock이 이 동영상의 채널 정보를 찾을 수 없는 것일 수 있으니, '건너뛰기 전 채널 강제 확인' 설정을 사용하지 않아야 해요"},"forceChannelCheck":{"message":"건너뛰기 전 채널 강제 확인"},"whatForceChannelCheck":{"message":"기본적으로, 무슨 채널인지 알기 전 구간을 건너뛰어요. 화이트리스트 내 채널의 동영상 시작 부분에 있는 일부 구간이 건너뛰는 현상을 방지할 수 있지만 채널 ID를 가져오는 데 시간이 소요되어 건너뛰기에 지연이 발생할 수 있어요. 고속 인터넷을 사용하고 있다면 체감하지 못할 수도 있어요."},"forceChannelCheckPopup":{"message":"\"건너뛰기 전 채널 강제 확인\"을 설정에서 사용하는 걸 고려해 보세요"},"downvoteDescription":{"message":"구간의 시간이 잘못 입력됐어요"},"incorrectVote":{"message":"잘못됨"},"harmfulVote":{"message":"유해함","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"카테고리 변경"},"nonMusicCategoryOnMusic":{"message":"이 동영상은 음악으로 분류되어 있어요. 동영상에 후원이나 협찬 구간이 있나요? \"음악이 아닌 구간\"으로 지정된 카테고리인 경우, 확장 프로그램 설정을 열어 이 카테고리를 사용하세요. 그러고 나서 이 구간을 \"후원이나 협찬 구간\" 대신 \"음악이 아닌 구간\"으로 지정하세요. 혼동된다면 지침을 읽어주세요."},"multipleSegments":{"message":"여러 구간"},"guidelines":{"message":"지침"},"readTheGuidelines":{"message":"지침을 꼭 읽어주세요!!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"카테고리가 여기 있어요!"},"categoryUpdate2":{"message":"인트로, 아웃트로 등을 건너뛸 수 있는 설정을 열어보세요."},"help":{"message":"도움말"},"GotIt":{"message":"확인","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"제출될 구간이 길어요. 전반적인 동영상의 내용이 한 주제에 대한 것이라면, \"건너뛰기\"를 \"동영상 전체\"로 변경해주세요. 자세한 정보는 지침을 확인하세요."},"categoryPillTitleText":{"message":"동영상 전체가 해당 카테고리로 지정됐고 부분적으로 나누기 어려워요"},"chapterNameTooltipWarning":{"message":"챕터의 이름 중 하나가 카테고리와 유사해요. 가능하다면 카테고리를 대신 사용해 주세요."},"experiementOptOut":{"message":"향후 모든 실험 기능 비활성화","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"다시 보지 않음"},"warningChatInfo":{"message":"자주 하는 실수를 저지르고 있으셔서 알려드려요. 지금까지 작업해 주신 것은 감사드리지만, 저희는 완벽을 추구하고 있기 때문에 아주 작은 실수라도 문제가 될 수 있어요 :)"},"questionButton":{"message":"질문이 있어요"},"askAQuestion":{"message":"질문하기"},"warningConfirmButton":{"message":"사유를 이해했어요"},"warningError":{"message":"경고를 확인하던 도중 오류가 발생했어요:"},"deArrowMessageRecieved":{"message":"관리자로부터 조언을 받았어요"},"Donate":{"message":"후원"},"considerDonating":{"message":"개발 자금을 지원해주세요"},"supportSponsorBlock":{"message":"SponsorBlock에서 제 전업 작업물을 지원해 주세요"},"hideDonationLink":{"message":"후원 링크 숨기기"},"darkModeOptionsPage":{"message":"설정 페이지에서 어두운 모드 사용"},"helpPageThanksForInstalling":{"message":"SponsorBlock을 설치해 주셔서 감사드려요."},"helpPageReviewOptions":{"message":"아래 설정을 검토해 보세요"},"helpPageFeatureDisclaimer":{"message":"기본적으로 많은 기능이 꺼져 있어요. 인트로, 아웃트로, Invidious 사용 등을 원한다면, 아래에서 켜야 해요. 또한 UI 요소를 숨기거나 표시할 수 있답니다."},"helpPageHowSkippingWorks":{"message":"작동 원리"},"helpPageHowSkippingWorks1":{"message":"모든 스폰서 광고 구간은 여러분과 같은 사용자분이 제출해요. 데이터베이스 내 제출된 스폰서 광고 구간의 목록을 브라우저 우측 상단의 팝업을 열어서 볼 수 있어요."},"helpPageHowSkippingWorks2":{"message":"구간을 건너뛰면 알림을 받게 돼요. 알림 창에서 투표를 진행할 수 있어서, 구간의 시간이 잘못 입력됐다면 비추천 버튼을 누르실 수도 있답니다."},"Submitting":{"message":"제출 방법"},"helpPageSubmitting1":{"message":"동영상 재생 바의 SponsorBlock 로고를 눌러서 제출할 수 있어요."},"helpPageSubmitting2":{"message":"재생 버튼을 누르는 것은 구간의 시점을, 정지 아이콘을 누르는 것은 구간의 종점을 나타내요. 위쪽 화살표를 눌러 제출 메뉴를 열 수 있어요. 제출 메뉴에서 구간을 미리 보면서 완벽해지도록 편집하며 검증할 수 있답니다. 정교함이 중요해요. 제출 전 지침을 읽도록 하세요."},"helpPageCopyOfDatabase":{"message":"제출하는 곳이 어디로 갔나요?"},"helpPageCopyOfDatabase1":{"message":"모든 제출은 SponsorBlock 데이터베이스에 들어가요. 데이터베이스는 누구나 공개적으로 사용할 수 있도록 개방돼요. 다음에서 사용 가능하답니다:"},"helpPageCopyOfDatabase2":{"message":"또한 소스 코드는 자유롭게 사용할 수 있어요. 그러므로, 저에게 무슨 일이 생겨도 제출이 사라지는 일은 없을 거예요."},"AdviceForSubmitting":{"message":"제출 조언"},"Credits":{"message":"크레딧"},"LearnMore":{"message":"자세히 보기"},"FullDetails":{"message":"모든 세부 정보"},"CopyDownvoteButtonInfo":{"message":"비추천 및 다시 제출할 수 있는 사본을 생성해요"},"OpenCategoryWikiPage":{"message":"이 카테고리의 위키 페이지를 열어요."},"CopyAndDownvote":{"message":"복사 및 비추천"},"ContinueVoting":{"message":"계속 투표"},"ChangeCategoryTooltip":{"message":"이게 내 구간에 바로 적용될 거예요"},"downvote":{"message":"비추천"},"upvote":{"message":"추천"},"hideSegment":{"message":"구간 숨기기"},"skipSegment":{"message":"구간 건너뛰기"},"playChapter":{"message":"챕터 재생"},"SponsorTimeEditScrollNewFeature":{"message":"편집 상자 위로 마우스 휠을 스크롤해서 시간을 빠르게 조정해 보세요. Ctrl이나 Shift 키로 세밀하게 조정할 수 있어요."},"categoryPillNewFeature":{"message":"신규! 이제 동영상 전체가 광고거나 자체 홍보인지 확인해 보세요"},"yearAbbreviation":{"message":"년","description":"100y"},"dayAbbreviation":{"message":"일","description":"100d"},"hourAbbreviation":{"message":"시간","description":"100h"},"optionsTabBehavior":{"message":"동작","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"인터페이스","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"키보드 단축키","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"백업/복원","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"기타","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"건너뛰기 알림 형식","description":"Option label"},"unbind":{"message":"할당 해제","description":"Unbind keyboard shortcut"},"notSet":{"message":"할당되지 않음"},"change":{"message":"변경"},"youtubeKeybindWarning":{"message":"기존 YouTube 단축키와 겹쳐요. 그래도 사용할까요?"},"betaServerWarning":{"message":"베타 서버를 사용 중이에요!"},"openOptionsPage":{"message":"설정 페이지 열기"},"resetToDefault":{"message":"기본 설정으로 초기화"},"confirmResetToDefault":{"message":"모든 설정을 기본값으로 초기화할까요? 되돌릴 수 없어요."},"exportSegments":{"message":"구간 내보내기"},"importSegments":{"message":"구간 불러오기"},"Import":{"message":"불러오기","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"등록에 성공했어요!"},"redeemFailed":{"message":"라이선스 키가 유효하지 않아요"},"hideUpsells":{"message":"추가 결제 없이는 숨김 설정을 사용할 수 없어요"},"hideNewFeatureUpdates":{"message":"신규 기능에 관한 프롬프트 숨기기"},"redeem":{"message":"등록"},"enterLicenseKey":{"message":"라이선스 키를 입력하세요"},"unsubmittedSegmentCounts":{"message":"You currently have {0} on {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"You currently have no unsubmitted segments","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"unsubmitted segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"unsubmitted segments","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videos","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"모든 구간 초기화","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"정말로 모든 미제출한 구간을 초기화할까요?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"구간 표시","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"구간 숨기기","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"동영상 ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"구간 개수","description":"Header of the unsubmitted segments list"},"actions":{"message":"동작","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"URL로 공유"},"segmentFetchFailureWarning":{"message":"경고: 서버에서 구간 정보를 가져오지 못했어요. 이 동영상에 이미 제출된 구간이 있을 수 있지만 서버 문제로 인해 수신하지 못했어요."},"allowScrollingToEdit":{"message":"스크롤로 구간 편집 허용"},"NoticeTimeAfterSkip":{"message":"{seconds}초","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - 더 나은 YouTube 제목과 미리 보기 이미지","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"여러분의 참여를 통해 자극적인 제목과 미리 보기 이미지를 유용하게 바꿔요","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"가장 유용한 쪽을 선택해주세요"},"Original":{"message":"원본"},"OriginalTitle":{"message":"원본 제목"},"CurrentTime":{"message":"현재 시간"},"resetCustomTitle":{"message":"제목을 원본 글자로 초기화"},"resetIcon":{"message":"아이콘 초기화"},"TypeYourOwnTitleHere":{"message":"나만의 제목을 입력해 보세요"},"VideoNotReady":{"message":"동영상이 준비되지 않았어요"},"FailedToRender":{"message":"렌더링에 실패했어요","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas가 누락됐어요","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"렌더링 중 예외가 발생했어요","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"불러오지 못했어요","description":"Thumbnail failed to load"},"titleFormatting":{"message":"제목 형식"},"Disabled":{"message":"사용 안 함"},"CapitalizeWords":{"message":"대문자 표기"},"TitleCase":{"message":"제목 형식"},"SentenceCase":{"message":"본문 형식"},"LowerCase":{"message":"소문자"},"FirstLetterUppercase":{"message":"첫 글자 대문자"},"shouldCleanEmojis":{"message":"이모지 제거"},"onlyFormatCustomTitles":{"message":"사용자가 제출한 제목만 형식 맞춤"},"onlyTitleCaseInEnglish":{"message":"영어 외 제목도 대문자 표기"},"onlyTitleCaseInEnglishDescription":{"message":"언어 감지는 완벽하지 않으며 일부 영어 제목을 영어가 아닌 것으로 감지할 수 있어요."},"thumbnailFallbackOption":{"message":"제출한 미리 보기 이미지가 없으면"},"whatThumbnailFallbackOption":{"message":"무작위 시간을 선택할 때, SponsorBlock 데이터를 사용해서 광고 구간 내 시간을 선택하지 않도록 해요.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"무작위 시간의 스크린샷 표시"},"TheOriginalThumbnail":{"message":"원본 미리 보기 이미지 표시"},"showABlankBox":{"message":"빈 상자 표시"},"AutoGenerated":{"message":"YouTube가 자동 생성한 썸네일 표시","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"시작"},"Middle":{"message":"중간"},"keepUnsubmitted":{"message":"제출된 투표 저장"},"showLiveCover":{"message":"다음 동영상에 채널 아바타 표시","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"A/B 테스트 중인 미리 보기 이미지 배제"},"ignoreAbThumbnailsDescription":{"message":"채널에서 테스트를 진행하면 YouTube 동영상의 미리 보기 이미지가 사람마다 다르게 보여요. 항상 첫 이미지를 표시해 일관성을 유지하도록 할 수 있어요."},"abThumbnailsWarning":{"message":"경고: 이 동영상에 A/B 테스트 중인 미리 보기 이미지가 있어요. 테스트 중에는 미리 보기 이미지가 자주 바뀔 수 있어요. 그러니 원본 미리 보기 이미지에는 투표하지 않는 것이 좋을 수도 있어요."},"whatKeepUnsubmitted":{"message":"서버에서 최다 득표된 제목과 미리 보기 이미지 대신 내가 고른 것을 표시하기 위해 투표 후에도 제출된 투표를 유지해요."},"keepUnsubmittedInPrivate":{"message":"비공개 탭에서 제출한 투표 저장"},"useThumbnailGenerationService":{"message":"썸네일 생성 서비스 사용"},"titleMaxLines":{"message":"제목의 최대 줄 수"},"titleMaxLinesDescription":{"message":"제안된 동영상 제목이 차지할 수 있는 최대 줄 수예요."},"thumbnailSaturationLevel":{"message":"썸네일 채도 수준"},"whatSaturateThumbnails":{"message":"미리 보기 이미지를 덜 선명하게 만들어요"},"hideDetailsWhileFetching":{"message":"가져오는 동안 세부 정보 숨기기"},"hideDetailsWhileFetchingDescription":{"message":"서버에서 데이터를 가져오는 동안 제목과 썸네일을 숨겨요. 사용하지 않는 경우, 제목과 썸네일이 변경될 때 깜박임이 발생해요."},"ignoreTranslatedTitles":{"message":"YouTube가 번역한 제목 표시 안 함","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"때로 YouTube가 제목을 사용자의 언어로 자동 번역하기도 해요. 이 설정은 사용자 참여 제목이 없는 경우에만 적용돼요."},"onAllPages":{"message":"모든 페이지에서","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"동영상 페이지를 제외한 모든 페이지에서","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"사용 안 함"},"thumbnailGeneratorDescription1":{"message":"썸네일 생성 서비스는 원격 서버로 동영상 ID가 담긴 익명 요청을 전송해 썸네일 생성 속도를 크게 높여줘요. 그런 다음 썸네일을 생성하거나, 이미 생성한 것이 있다면 캐시에서 가져와요."},"thumbnailGeneratorDescription2":{"message":"동영상 페이지에서 이용하면, '일부 공개' 동영상의 ID가 서버로 누출될 수 있어요. \"동영상 페이지를 제외한 모든 페이지에서\"로 설정하면 문제가 발생하지 않아요. 아니면 미리 보기 이미지 생성 서비스를 스스로 호스팅할 수도 있어요."},"thumbnailGeneratorDescription3":{"message":"썸네일 생성 서비스를 사용하지 않으면, 모든 요청을 K-anonymity 쿼리 시스템을 사용해 보내게 되어, 서버에서 어떤 동영상을 가져왔는지 예측하기 힘들어지고, 느린 썸네일 생성 서비스를 사용하게 돼요.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"썸네일 생성 서비스 소스 코드"},"moreAboutKAnonymity":{"message":"K-Anonymity 더 알아보기","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"항상 \"원본 보기\" 버튼 표시"},"whatAlwaysShowShowOriginalButton":{"message":"제목/썸네일이 변경됐는지 항상 확인하고 싶다면 이걸 켜세요."},"showOriginalOnHover":{"message":"마우스를 올렸을 때 사용자 지정 세부 정보를 원본 세부 정보로 교체"},"showOriginalOnHoverOfVideo":{"message":"동영상 카드의 어디에서나 마우스를 올렸을 때 사용자 지정 세부 정보를 원본 세부 정보로 교체해요"},"showOriginalOnHoverOfVideoDescription":{"message":"마우스를 올렸을 때 자동 재생을 끄게 돼요"},"showCustomOnHoverIfCasual":{"message":"마우스를 캐주얼 모드 제목에 올렸을 때 사용자 지정 제목 표시"},"showIconForFormattedTitles":{"message":"자동으로 지정된 형식의 제목에 \"원본 보기\" 버튼 표시"},"Enable":{"message":"사용"},"Titles":{"message":"제목","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"썸네일","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"캐주얼 모드 투표 수","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"오류"},"ShowOriginal":{"message":"원본 세부 정보 표시"},"ShowModified":{"message":"수정된 세부 정보 표시"},"ShowFormatted":{"message":"형식에 맞춘 세부 정보 표시"},"FillerWarning":{"message":"경고: 매우 공격적인 카테고리예요. '건너뛰지 않기'를 이용하거나, 가끔 '사용 안 함'으로 설정해야 할 가능성이 높아요. 많은 동영상에서 동영상의 50% 이상을 건너뛸 수 있으니 주의하세요! 하지만, 그럼에도 제출할 때 따라야 하는 지침이 분명히 있다는 사실을 잊지 마세요.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Discord나 Matrix에 참가해 이 대화에 영구적으로 머무르세요","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"지침 도움말 표시","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"과한 표현을 지양해야 함","description":"Referring to the thumbnail of a video"},"tip2":{"message":"원본 제목의 질문에 단순히 답하는 것이 아니라, 전체적인 맥락을 고려해야 함","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"동영상에 대한 반응(\"충격\")을 묘사하지 않아야 함","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"누르기 전 현명한 선택을 하도록 충분한 정보를 제공해야 함"},"tip5":{"message":"문장처럼 대소문자를 적용해야 함","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"제출하려면 모든 지침을 확인하세요","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"제목의 대소문자를 문장처럼 맞췄어요","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"제목을 단순히 원본 제목에 답변하는 내용으로 쓰지 않았어요","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"제목은 동영상이나 줄거리 전반을 설명해야 해요. 흥미를 끄는 원본 제목에 의존하지 말고, 반드시 전체 동영상을 보며 실제로 어떤 내용인지 숙지해야 해요.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"제목에 결론을 요약하거나 불필요한 스포일러를 넣지 않았어요","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"제목은 동영상 전체를 미리 보도록 대체하는 게 아니라, 동영상을 누를지 말지 알려줘야 해요.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"제목에서 동영상이나 제작자를 검증, 조롱, 비판하지 않았어요","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"제목은 창작자와 동영상의 관점을 따라요. 동영상을 평가하거나 검증하는 것은 DeArrow의 목적을 벗어나요. 제목은 댓글을 다는 곳이 아니예요.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"감지된 단어: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"제목의 시작 부분에서 필요하지 않은 동사를 사용하지 마세요.","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"제목은 대문자로 시작해주세요. 제목은 문장처럼 대소문자 형식을 갖춰야 해요","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"제목은 '.'으로 끝나지 않아야 해요","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"단순히 원본 제목의 답변을 제목으로 쓰지 마세요. 제목은 동영상이나 줄거리 전반을 설명해야 해요","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"제목은 동영상이나 제작자를 검증, 조롱, 비판하지 않아야 해요","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"제목에서 원본 제목의 선정적인 요소를 제거해주세요","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"제목은 이모지를 포함하지 않아야 해요","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"제출 전 경고를 해결해야 해요"},"dearrowHelpSponsorBlockImported":{"message":"참고: SponsorBlock 설정을 자동으로 가져왔어요!"},"howItWorks":{"message":"작동 원리"},"discordPromotion":{"message":"{discord} 혹은 {matrix}에서 기여하거나, 제안을 남기거나, 도와주세요"},"deArrowDonationText":{"message":"확장 프로그램이 마음에 들고, 금전적으로 지원하고 싶다면, 이 링크를 눌러주세요"},"termsAgreement":{"message":"이 확장 프로그램을 사용함으로써, {privacy-policy} 및 {terms}에 동의하시는 것이에요."},"privacyPolicy":{"message":"개인정보 처리방침"},"termsOfUse":{"message":"이용 약관"},"openSourceLicenses":{"message":"오픈 소스 라이선스"},"defaultToOriginals":{"message":"원본 동영상 정보를 기본값으로"},"whatDefaultToOriginals":{"message":"기본적으로 원본 제목과 미리 보기 이미지를 표시하지만, 마우스를 가져다 댔을 때 맞춤 제목과 미리 보기 이미지를 보여주는 버튼을 표시해요. "},"replaceTitles":{"message":"제목 대체"},"replaceThumbnails":{"message":"썸네일 대체"},"useCrowdsourcedTitles":{"message":"사용자 참여 제목 사용"},"whatUseCrowdsourcedTitles":{"message":"끄면, 제목을 형식에 맞게 변환하지만 커뮤니티에서 제출한 제목을 사용하지 않아요","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"정말로 이 구성을 삭제할까요?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"새 구성"},"DeleteConfiguration":{"message":"구성 삭제"},"ChannelAllowlist":{"message":"채널별 설정"},"ConfigurationName":{"message":"구성 이름"},"ChannelListInstructions":{"message":"아래 칸에 이 구성을 적용할 채널을 줄바꿈으로 구분해 입력하세요. 채널 ID나 채널 이름을 입력할 수 있어요. @핸들은 지원하지 않아요. 채널 ID는 채널 내 정보 페이지의 공유 버튼을 눌러 확인할 수 있어요. 정보 페이지로 가려면, 채널 페이지의 이름 아래에 표시되는 채널 설명을 누르세요.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"아직 설정한 구성이 없어요. 위쪽의 버튼을 눌러 새 구성을 추가하세요.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"제목과 미리 보기 이미지를 더 정확한 것으로 대체해 어그로를 멈춰요"},"DeArrowPromotionMessage2":{"message":"어그로에 지치나요? 제목과 미리 보기 이미지를 향상시키는 확장 프로그램을 확인해 보세요"},"DeArrowPromotionMessage3":{"message":"DeArrow도 확인해보세요","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"이 제목이 마음에 들지 않으세요? 아래 제목을 더 선호하신다면, DeArrow의 제목 변경 기능을 확인해보세요!","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"아직 이 동영상으로 제출된 항목이 없어서 미리 보기 이미지를 임의 시점의 사진으로 선택했어요","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"아직 이 동영상으로 제출된 항목이 없어서 미리 보기 이미지를 임의 시점의 사진으로 선택했고, 제목 형식은 자동으로 맞췄어요","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"아래에서 기본값을 바꿀 수 있어요","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"확장 프로그램을 설치한 후 제목 {titles}개와 썸네일 {thumbnails}개를 교체했어요","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"제목 {titles}개 ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"제목 {titles}개 ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"및 썸네일 {thumbnails}개","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"및 썸네일 {thumbnails}개","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"확장 프로그램을 설치한 후 {titleAndThumbnailMessage}를 교체했어요","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"제목과 썸네일 교체 횟수 세기"},"countReplacementsDescription":{"message":"팝업 창에서 통계를 표시할 때 이용해요.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"yt-neuter를 이용해 설문 조사, 상품 영역, 기타 홍보 요소를 차단하는 필터 목록 추가"},"requiresUblock":{"message":"uBlock Origin 필요"},"videoIDWrongWhenSubmittingError":{"message":"동영상 ID를 탐지할 때 문제가 생겼어요. 제출하기 전 새로고침을 시도해보시고, 올바른 동영상에 잘 제출되었는지 확인해주세요. 문제가 자주 생긴다면, 설치한 다른 확장 프로그램이나 사용자 스크립트 목록을 포함해서 GitHub, Discord 혹은 Matrix를 통해 신고해주세요."},"dearrowLogoCredit":{"message":"로고는 CC-BY 4.0 라이선스 하의 Twemoji를 기반으로 제작됨"},"zoomToFillUnsupported":{"message":"SponsorBlock은 \"Zoom to Fill\" 확장 프로그램과 호환되지 않아요. 잘 호환되는 대안 확장 프로그램이 많이 있어요."},"freeTrialStarted":{"message":"무료 체험을 시작했어요. YouTube에 방문해 시험해 보세요"},"freeTrialEnded":{"message":"무료 체험이 끝났어요"},"freeTrialPrompt":{"message":"시험해 보고 싶다면, 아래 버튼을 눌러 무료 체험을 시작하세요."},"startFreeTrial":{"message":"무료 체험 시작"},"freeAccessRequested":{"message":"무료 이용에 등록했어요. 무료 이용이 가능하게 되면 알려드릴게요."},"freeAccessComplete":{"message":"축하해요! 이제 DeArrow를 무료로 이용할 수 있어요"},"DeArrowNotActivated":{"message":"DeArrow가 활성화되지 않았어요"},"ActivateDeArrow":{"message":"DeArrow 활성화"},"DeArrowIsActivated":{"message":"DeArrow를 성공적으로 활성화했어요"},"Close":{"message":"닫기"},"ViewLicenseKey":{"message":"라이선스 키 확인"},"SharingIsCaring":{"message":"나눔은 사랑이죠"},"cleanPopup":{"message":"구간 목록 팝업 정리하기"},"hideSegmentCreationInPopup":{"message":"팝업 내 구간 생성 버튼 숨기기"},"syncDisabledWarning":{"message":"경고: 브라우저에서 확장 프로그램 저장 공간이 비활성화 되었어요. 설정이 저장되지 않아요."},"syncDisabledWarningDeArrow":{"message":"DeArrow는 저장 공간이 없으면 작동하지 않아요."},"syncDisabledFirefoxSuggestions":{"message":"about:config 에 방문해서 \"webextensions.storage.sync.enabled\" 값을 true로 설정해 활성화 할 수 있어요."},"storageFull":{"message":"확장 프로그램 저장 공간이 가득 찼어요. 설정에서 미제출한 구간 일부를 삭제해 주세요."},"previewSegmentRequired":{"message":"제출하기 전에 구간을 미리 확인해주세요. 미리보기 버튼이나 단축키를 눌러 확인할 수 있어요. 단축키:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"VIP 모드","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"지금은 브라우저로부터 제출을 받을 수 없어요. YouTube에서 확장 프로그램이 제거할 수 없는 서버측 광고를 삽입한 것 같아요. 이 오류를 겪고 있다면 문의해주세요."},"DeArrowIsDisabled":{"message":"DeArrow가 꺼져 있어요 - 켜려면 누르세요","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"정말로 원본 썸네일이 DeArrow 지침을 준수하나요? 기본값으로 원본 썸네일을 보고 싶다면, \"제출한 미리 보기 이미지가 없으면\" 설정을 변경해주세요.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"YouTube TV에서 SponsorBlock은 실시간 및 최근 녹화된 콘텐츠를 지원하지 않아요. 최근 녹화된 콘텐츠라면 녹화를 처리할 때까지 몇 시간 정도 기다려 주세요.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"tv.youtube.com에서는 채널을 허용 목록에 추가할 수 없어요.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"원본 제목이 좋으신가요?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"네"},"No":{"message":"아니요"},"votes":{"message":"{0}표","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0}표","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"재미있음","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"창의적임","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"기발함","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"설명적임","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"기타","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"클래식 모드","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"사용자 참여 제목이 있는 동영상의 제목을 모두 가이드라인에 따라 규격에 맞춘 형식으로 대체해요."},"CasualMode":{"message":"캐주얼 모드","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"기존 제목이 동영상을 충분히 잘 설명하고 기발하거나 재밌다면 그대로 둬요.\n보고 싶은 제목의 카테고리를 선택하세요.\n제목이 카테고리에 맞는지 아닌지 투표할 수 있어요."},"minimumVotes":{"message":"최소 투표 수","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"캐주얼 모드로 투표 받은 동영상은 원본 썸네일 표시","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"새 기능: 캐주얼 모드","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"사용자 지정 제목을 사용할 수 있을 때만 캐주얼 모드 아이콘 표시"},"OpenSettings":{"message":"설정 열기"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/lt/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/lt/messages.json @@ -0,0 +1 @@ +{"400":{"message":"Serveris pranešė, kad ši užklausa netinkama."},"409":{"message":"Tai jau buvo pateikta anksčiau."},"fullName":{"message":"„SponsorBlock“, skirta „YouTube“ – praleiskite rėmimus","description":"Name of the extension."},"Description":{"message":"Praleiskite rėmimus, prenumeratos maldavimus ir daugiau „YouTube“ vaizdo įrašuose. Praneškite apie žiūrėtų vaizdo įrašų rėmėjus, kad sutaupytumėte kitų laiko.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanalas įtrauktas į leidžiamąjį sąrašą."},"Segment":{"message":"segmentas"},"Segments":{"message":"segmentų"},"SegmentsCap":{"message":"Segmentai"},"Chapters":{"message":"Skyriai"},"renderAsChapters":{"message":"Atvaizduoti segmentus kaip skyrius","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Rodyti dabartinį segmentą šalia vaizdo įrašo laiko"},"showAutogeneratedChapters":{"message":"Rodyti automatiškai „YouTube“ sugeneruotus skyrius"},"upvoteButtonInfo":{"message":"Balsuoti už šią pateikiamą"},"reportButtonTitle":{"message":"Pranešti"},"reportButtonInfo":{"message":"Praneškite apie šį pateikimą kaip neteisingą."},"Dismiss":{"message":"Atmesti"},"Loading":{"message":"Įkeliama..."},"Hide":{"message":"Niekada nerodyti"},"hitGoBack":{"message":"Paspauskite Grąžinti praleistą, kad grįžtumėte ten, iš kur buvote."},"unskip":{"message":"Grąžinti praleistą"},"paused":{"message":"Pristabdyta"},"OpenCasualVoteMenu":{"message":"Atverti įprasto režimo meniu"},"Username":{"message":"Naudotojo vardas"},"website":{"message":"Svetainė","description":"Used on Firefox Store Page"},"skip":{"message":"Praleisti"},"mute":{"message":"Nutildyti"},"upcoming":{"message":"Netrukus: {0}","description":"Example: Upcoming Sponsor"},"minLower":{"message":"minutė"},"minsLower":{"message":"minučių"},"hourLower":{"message":"valanda"},"hoursLower":{"message":"valandų"},"add":{"message":"Pridėti"},"edit":{"message":"Redaguoti"},"category_music_offtopic_short":{"message":"Ne muzika"},"End":{"message":"Pabaiga","description":"Button that skips to the end of a segment"},"ignoreTranslatedTitles":{"message":"Nerodyti „YouTube“ išverstų pavadinimų","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"Kartais „YouTube“ automatiškai išverčia pavadinimus į jūsų gimtąją kalbą. Ši parinktis taikoma tik tada, kai nėra sutelktinio šaltinio pavadinimo."},"likeOriginalTitle":{"message":"Patinka originalus pavadinimas?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Taip"},"No":{"message":"Ne"},"votes":{"message":"{0} balsai (-ų)","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} balsas","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Juokingas","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Kūrybinis","description":"Category for DeArrow casual mode"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/lv/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/lv/messages.json @@ -0,0 +1 @@ +{"400":{"message":"Serveris ziņo, ka šis pieprasījums ir nederīgs"},"409":{"message":"Šis jau ir ticis aizsūtīts iepriekš"},"fullName":{"message":"SponsorBlock priekš YouTube - Izlaid sponsorus","description":"Name of the extension."},"Description":{"message":"Izlaidiet sponsorus, abonēšanas lūgumus un vairāk, skatoties YouTube video. Ziņojiet par sponsoriem video, kurus jūs skatāties, lai ietaupītu citu laiku.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanāls iekļauts baltajā sarakstā!"},"Segment":{"message":"segments"},"Segments":{"message":"segmentu"},"SegmentsCap":{"message":"Segmenti"},"Chapters":{"message":"Nodaļas"},"sponsorStart":{"message":"Sākt Segmentu Tagad"},"sponsorEnd":{"message":"Beigt segmentu"},"sponsorCancel":{"message":"Beigt segmenta izveidi"},"noVideoID":{"message":"YouTube video netika atrasts. Ja šis nav pareizi, pārlādē lapu"},"refreshSegments":{"message":"Pārlādēt segmentus"},"success":{"message":"Izdevās!"},"voted":{"message":"Nobalsots!"},"Username":{"message":"Lietotājvārds"},"website":{"message":"Tīmekļa vietne","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Pirmkods","description":"Used on Firefox Store Page"},"errorCode":{"message":"Kļūdas kods: "},"add":{"message":"Pievienot"},"cancel":{"message":"Atcelt"},"delete":{"message":"Dzēst"},"edit":{"message":"Rediģēt"},"questionButton":{"message":"Man ir jautājums"},"askAQuestion":{"message":"Uzdot jautājumu"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ml/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ml/messages.json @@ -0,0 +1 @@ +{"0":{"message":"കണക്ഷൻ കാലഹരണപ്പെട്ടു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക. നിങ്ങളുടെ ഇൻറർനെറ്റ് പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, സെർവർ ഓവർലോഡ് അല്ലെങ്കിൽ ഡ. ൺ ആയിരിക്കാം."},"400":{"message":"ഈ അഭ്യർത്ഥന അസാധുവാണെന്ന് സെർവർ പറഞ്ഞു"},"409":{"message":"ഇത് ഇതിനകം സമർപ്പിച്ചു"},"502":{"message":"സെർവർ ഓവർലോഡ് ചെയ്തതായി തോന്നുന്നു. കുറച്ച് നിമിഷങ്ങൾക്കുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."},"fullName":{"message":"YouTube- നായുള്ള സ്പോൺസർബ്ലോക്ക് - സ്പോൺസർഷിപ്പുകൾ ഒഴിവാക്കുക","description":"Name of the extension."},"Description":{"message":"YouTube വീഡിയോകളിൽ സ്പോൺസർഷിപ്പുകൾ, സബ്സ്ക്രിപ്ഷൻ ഭിക്ഷാടനം എന്നിവയും അതിലേറെയും ഒഴിവാക്കുക. മറ്റുള്ളവരുടെ സമയം ലാഭിക്കാൻ നിങ്ങൾ കാണുന്ന വീഡിയോകളിൽ സ്പോൺസർമാരെ റിപ്പോർട്ടുചെയ്യുക.","description":"Description of the extension."},"channelWhitelisted":{"message":"ചാനൽ വൈറ്റ്‌ലിസ്റ്റ് ചെയ്‌തു!"},"Segment":{"message":"സെഗ്മെന്റ്"},"Segments":{"message":"സെഗ്‌മെന്റുകൾ"},"SegmentsCap":{"message":"ഭാഗങ്ങൾ"},"Chapters":{"message":"അദ്ധ്യായങ്ങള്‍"},"renderAsChapters":{"message":"ഭാഗങ്ങൾ അധ്യായങ്ങളായി തർജ്ജിമചെയ്യുക","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"വീഡിയോ സമയത്തിനപ്പുറം നിലവിലെ ഭാഗം കാണിക്കുക"},"upvoteButtonInfo":{"message":"ഈ സമർപ്പണം ഉയർത്തുക"},"reportButtonTitle":{"message":"റിപ്പോർട്ട് ചെയ്യുക"},"reportButtonInfo":{"message":"ഈ സമർപ്പിക്കൽ തെറ്റാണെന്ന് റിപ്പോർട്ടുചെയ്യുക."},"Dismiss":{"message":"നിരസിക്കുക"},"Loading":{"message":"ലോഡിംഗ്..."},"Hide":{"message":"ഒരിക്കലും കാണിക്കരുത്"},"hitGoBack":{"message":"നിങ്ങൾ എവിടെ നിന്നാണ് വന്നതെന്ന് അൺസ്‌കിപ്പ് അമർത്തുക."},"unskip":{"message":"അൺ‌സ്കിപ്പ്"},"reskip":{"message":"റെസ്കിപ്പ്"},"unmute":{"message":"അൺമ്യൂട്ട് ചെയ്യുക"},"paused":{"message":"താൽക്കാലികമായി നിർത്തി"},"manualPaused":{"message":"ടൈമർ നിർത്തി"},"confirmMSG":{"message":"വ്യക്തിഗത മൂല്യങ്ങൾ എഡിറ്റുചെയ്യാനോ ഇല്ലാതാക്കാനോ, മുകളിൽ വലത് കോണിലുള്ള വിപുലീകരണ ഐക്കണിൽ ക്ലിക്കുചെയ്‌ത് വിവര ബട്ടൺ ക്ലിക്കുചെയ്യുക അല്ലെങ്കിൽ വിപുലീകരണ പോപ്പ്അപ്പ് തുറക്കുക."},"clearThis":{"message":"ഇത് മായ്‌ക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?\n\n"},"Unknown":{"message":"നിങ്ങളുടെ സ്പോൺസർ സമയം സമർപ്പിക്കുന്നതിൽ ഒരു പിശക് ഉണ്ടായിരുന്നു, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക."},"sponsorFound":{"message":"ഈ വീഡിയോയ്ക്ക് ഡാറ്റാബേസിൽ സെഗ്‌മെന്റുകളുണ്ട്!"},"sponsor404":{"message":"സെഗ്‌മെന്റുകളൊന്നും കണ്ടെത്തിയില്ല"},"sponsorStart":{"message":"സെഗ്മെന്റ് ഇപ്പോൾ ആരംഭിക്കുന്നു"},"sponsorEnd":{"message":"സെഗ്മെന്റ് ഇപ്പോൾ അവസാനിക്കുന്നു"},"sponsorCancel":{"message":"ഭാഗങ്ങൾ നിർമിക്കുന്നത് റദ്ദാക്കുക"},"noVideoID":{"message":"YouTube വീഡിയോകളൊന്നും കണ്ടെത്തിയില്ല.\nഇത് തെറ്റാണെങ്കിൽ, ടാബ് പുതുക്കുക."},"refreshSegments":{"message":"ഭാഗങ്ങൾ റിഫ്രഷ് ചെയ്യുക"},"success":{"message":"വിജയം!"},"voted":{"message":"വോട്ട് ചെയ്തു!"},"serverDown":{"message":"സെർവർ പ്രവർത്തനരഹിതമാണെന്ന് തോന്നുന്നു. ദേവിനെ ഉടൻ ബന്ധപ്പെടുക."},"connectionError":{"message":"ഒരു കണക്ഷൻ പിശക് സംഭവിച്ചു. പിശക് കോഡ്: "},"clearTimes":{"message":"സെഗ്‌മെന്റുകൾ മായ്‌ക്കുക"},"openPopup":{"message":"സ്പോൺസർബ്ലോക്ക് പോപ്പ്അപ്പ് തുറക്കുക"},"closePopup":{"message":"പോപ്പ്അപ്പ് അടയ്‌ക്കുക"},"OpenSubmissionMenu":{"message":"സമർപ്പണ മെനു തുറക്കുക"},"sortSegments":{"message":"ഭാഗങ്ങൾ തരം തിരിക്കുക"},"submitCheck":{"message":"ഇത് സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"},"whitelistChannel":{"message":"വൈറ്റ്‌ലിസ്റ്റ് ചാനൽ"},"removeFromWhitelist":{"message":"വൈറ്റ്‌ലിസ്റ്റിൽ നിന്ന് ചാനൽ നീക്കംചെയ്യുക"},"voteOnTime":{"message":"ഒരു സെഗ്‌മെന്റിൽ വോട്ടുചെയ്യുക"},"Submissions":{"message":"സമർപ്പിക്കലുകൾ"},"savedPeopleFrom":{"message":"നിങ്ങൾ ആളുകളെ സംരക്ഷിച്ചു "},"viewLeaderboard":{"message":"ലീഡർബോർഡ്"},"recordTimesDescription":{"message":"സമർപ്പിക്കുക"},"submissionEditHint":{"message":"സമർപ്പിക്കുക ക്ലിക്കുചെയ്‌തതിനുശേഷം വിഭാഗം എഡിറ്റിംഗ് ദൃശ്യമാകും","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"സൂചന: ഓപ്ഷനുകളിൽ സമർപ്പിക്കുന്നതിന് നിങ്ങൾക്ക് കീബൈൻഡുകൾ സജ്ജമാക്കാൻ കഴിയും"},"clearTimesButton":{"message":"ടൈംസ് മായ്‌ക്കുക"},"Username":{"message":"ഉപയോക്തൃനാമം"},"setUsername":{"message":"ഉപയോക്തൃനാമം സജ്ജമാക്കുക"},"copySegmentID":{"message":"ഭാഗത്തിന്റെ ഐഡി കോപ്പി ചെയ്യുക"},"hideThis":{"message":"ഇത് മറയ്ക്കുക"},"Options":{"message":"ഓപ്ഷനുകൾ"},"showButtons":{"message":"YouTube പ്ലെയറിൽ ബട്ടണുകൾ കാണിക്കുക"},"hideButtonsDescription":{"message":"ഒഴിവാക്കൽ സെഗ്‌മെന്റുകൾ സമർപ്പിക്കുന്നതിന് ഇത് YouTube പ്ലെയറിൽ ദൃശ്യമാകുന്ന ബട്ടണുകൾ മറയ്ക്കുന്നു."},"showInfoButton":{"message":"YouTube പ്ലെയറിൽ വിവര ബട്ടൺ കാണിക്കുക"},"showDeleteButton":{"message":"YouTube പ്ലെയറിൽ ഇല്ലാതാക്കുക ബട്ടൺ കാണിക്കുക"},"enableViewTracking":{"message":"ക Count ണ്ട് ട്രാക്കിംഗ് ഒഴിവാക്കുക പ്രാപ്തമാക്കുക"},"whatViewTracking":{"message":"ഡേറ്റാബേസിലേക്ക് സ്പാം വരില്ലെന്ന് ഉറപ്പുവരുത്തുന്നതിനായി ഉപയോക്താക്കളുടെ സമർപ്പിക്കൽ മറ്റുള്ളവരെ എത്രമാത്രം സഹായിച്ചിട്ടുണ്ടെന്നും അപ്‌വോട്ടുകൾക്കൊപ്പം ഒരു മെട്രിക്കായി ഉപയോഗിച്ചുവെന്നും ഉപയോക്താക്കളെ അറിയിക്കുന്നതിന് നിങ്ങൾ ഒഴിവാക്കിയ സെഗ്‌മെന്റുകൾ ഈ സവിശേഷത ട്രാക്കുചെയ്യുന്നു. നിങ്ങൾ ഒരു സെഗ്മെന്റ് ഒഴിവാക്കുമ്പോഴെല്ലാം വിപുലീകരണം സെർവറിലേക്ക് ഒരു സന്ദേശം അയയ്ക്കുന്നു. കാഴ്ച നമ്പറുകൾ കൃത്യമാകുന്നതിനായി മിക്ക ആളുകളും ഈ ക്രമീകരണം മാറ്റില്ലെന്ന് കരുതുന്നു. :)"},"enableTrackDownvotes":{"message":"ഭാഗത്തിൻറെ വിയോജിപ്പുകൾ സൂക്ഷിക്കുക"},"enableQueryByHashPrefix":{"message":"ഹാഷ് പ്രിഫിക്‌സ് പ്രകാരം അന്വേഷണം"},"whatQueryByHashPrefix":{"message":"വീഡിയോ ഐഡി ഉപയോഗിച്ച് സെർവറിൽ നിന്ന് സെഗ്‌മെന്റുകൾ അഭ്യർത്ഥിക്കുന്നതിനുപകരം, വീഡിയോ ഐഡിയുടെ ഹാഷിന്റെ ആദ്യ 4 പ്രതീകങ്ങൾ അയയ്‌ക്കുന്നു. സമാന ഹാഷുകളുള്ള എല്ലാ വീഡിയോകൾക്കുമായുള്ള ഡാറ്റ ഈ സെർവർ തിരികെ അയയ്ക്കും."},"showNotice":{"message":"അറിയിപ്പ് വീണ്ടും കാണിക്കുക"},"showSkipNotice":{"message":"ഒരു സെഗ്മെന്റ് ഒഴിവാക്കിയതിനുശേഷം അറിയിപ്പ് കാണിക്കുക"},"showCategoryGuidelines":{"message":"വിഭാഗത്തിന്റെ സഹായം കാണിക്കുക"},"longDescription":{"message":"സ്പോൺസർമാർ, ആമുഖങ്ങൾ, ros ട്ട്‌ട്രോകൾ, സബ്‌സ്‌ക്രിപ്‌ഷൻ ഓർമ്മപ്പെടുത്തലുകൾ, YouTube വീഡിയോകളുടെ മറ്റ് ശല്യപ്പെടുത്തുന്ന ഭാഗങ്ങൾ എന്നിവ ഒഴിവാക്കാൻ സ്‌പോൺസർബ്ലോക്ക് നിങ്ങളെ അനുവദിക്കുന്നു. സ്പോൺ‌സർ‌ബ്ലോക്ക് ഒരു ക്ര crow ഡ്സോഴ്സ്ഡ് ബ്ര browser സർ എക്സ്റ്റൻഷനാണ്, ഇത് സ്പോൺസർ ചെയ്ത സെഗ്‌മെന്റുകളുടെയും YouTube വീഡിയോകളുടെ മറ്റ് സെഗ്‌മെൻറുകളുടെയും ആരംഭ, അവസാന സമയങ്ങൾ സമർപ്പിക്കാൻ ആരെയും അനുവദിക്കുക. ഒരു വ്യക്തി ഈ വിവരങ്ങൾ‌ സമർപ്പിച്ചുകഴിഞ്ഞാൽ‌, ഈ വിപുലീകരണമുള്ള മറ്റെല്ലാവരും സ്പോൺ‌സർ‌ ചെയ്‌ത സെഗ്‌മെൻറിനെ മറികടക്കും. സംഗീത വീഡിയോകളുടെ സംഗീതേതര വിഭാഗങ്ങളും നിങ്ങൾക്ക് ഒഴിവാക്കാം.","description":"Full description of the extension on the store pages."},"website":{"message":"വെബ്സൈറ്റ്","description":"Used on Firefox Store Page"},"sourceCode":{"message":"സോഴ്സ് കോഡ്","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"അറിയിപ്പ് അപ്‌ഗ്രേഡുചെയ്‌തു!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"നിങ്ങൾക്ക് ഇപ്പോഴും ഇഷ്‌ടമായില്ലെങ്കിൽ, ഒരിക്കലും കാണിക്കരുത് ബട്ടൺ അമർത്തുക.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"ഭാഗം സ്കിപ് ചെയ്യുക","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"സമർപ്പണ മെനു തുറക്കുക","description":"Keybind label"},"setSubmitKeybind":{"message":"സെഗ്‌മെന്റുകൾ സമർപ്പിക്കുക","description":"Keybind label"},"setPreviewKeybind":{"message":"ഭാഗം പ്രിവ്യു ചെയ്യുക","description":"Keybind label"},"nextChapterKeybind":{"message":"അടുത്ത അധ്യായം","description":"Keybind label"},"previousChapterKeybind":{"message":"മുമ്പത്തെ അധ്യായം","description":"Keybind label"},"disableSkipping":{"message":"ഒഴിവാക്കൽ പ്രാപ്തമാക്കി"},"enableSkipping":{"message":"ഒഴിവാക്കുന്നത് പ്രവർത്തനരഹിതമാക്കി"},"yourWork":{"message":"നിങ്ങളുടെ ജോലി","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"പിശക് കോഡ്: "},"skip":{"message":"ഒഴിവാക്കുക"},"mute":{"message":"നിശബ്ദമാക്കുക"},"full":{"message":"മുഴുവൻ വിഡിയോയും","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} ഒഴിവാക്കുക?"},"mute_category":{"message":"നിശ്ശബ്ദമാക്കണോ {0}?"},"muted":{"message":"{0} നിശബ്‍ദമാക്കി","description":"Example: Sponsor Muted"},"disableAutoSkip":{"message":"യാന്ത്രിക ഒഴിവാക്കൽ പ്രവർത്തനരഹിതമാക്കുക"},"enableAutoSkip":{"message":"യാന്ത്രിക ഒഴിവാക്കൽ പ്രവർത്തനക്ഷമമാക്കുക"},"audioNotification":{"message":"ഒഴിവാക്കുന്ന ഓഡിയോ അറിയിപ്പ്"},"audioNotificationDescription":{"message":"ഒരു സെഗ്മെന്റ് ഒഴിവാക്കുമ്പോഴെല്ലാം സ്കിപ്പിലെ ഓഡിയോ അറിയിപ്പ് ശബ്‌ദം പ്ലേ ചെയ്യും. അപ്രാപ്‌തമാക്കിയിട്ടുണ്ടെങ്കിൽ (അല്ലെങ്കിൽ യാന്ത്രിക ഒഴിവാക്കൽ പ്രവർത്തനരഹിതമാക്കി), ശബ്‌ദമൊന്നും പ്ലേ ചെയ്യില്ല."},"showTimeWithSkips":{"message":"നീക്കംചെയ്‌ത സ്‌കിപ്പുകൾ ഉപയോഗിച്ച് സമയം കാണിക്കുക"},"showTimeWithSkipsDescription":{"message":"സീക്ക്ബാറിന് താഴെയുള്ള നിലവിലെ സമയത്തിന് അടുത്തുള്ള ബ്രാക്കറ്റുകളിൽ ഈ സമയം ദൃശ്യമാകുന്നു. ഏത് സെഗ്‌മെന്റുകളുടെയും മൈനസ് മൊത്തം വീഡിയോ ദൈർഘ്യം ഇത് കാണിക്കുന്നു. \"സീക്ക്ബാറിൽ കാണിക്കുക\" എന്ന് മാത്രം അടയാളപ്പെടുത്തിയ സെഗ്‌മെന്റുകൾ ഇതിൽ ഉൾപ്പെടുന്നു."},"youHaveSkipped":{"message":"നിങ്ങൾ ഒഴിവാക്കി "},"minLower":{"message":"മിനിറ്റ്"},"minsLower":{"message":"മിനിറ്റ്"},"hourLower":{"message":"മണിക്കൂർ"},"hoursLower":{"message":"മണിക്കൂറുകൾ"},"youHaveSavedTime":{"message":"നിങ്ങൾ ആളുകളെ സംരക്ഷിച്ചു","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" അവരുടെ ജീവിതത്തിന്റെ","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"സെർവർ നിലയ്ക്കായി status.sponsor.ajay.app പരിശോധിക്കുക."},"createdBy":{"message":"ഉണ്ടാക്കിയത്"},"supportedSites":{"message":"പിന്തുണയ്ക്കുന്ന സൈറ്റുകൾ: "},"optionsInfo":{"message":"ആക്രമണാത്മക പിന്തുണ പ്രാപ്തമാക്കുക, ഓട്ടോസ്കിപ്പ് അപ്രാപ്തമാക്കുക, ബട്ടണുകൾ മറയ്ക്കുക എന്നിവയും അതിലേറെയും."},"add":{"message":"ചേർക്കുക"},"addInvidiousInstanceError":{"message":"ഇതൊരു അസാധുവായ ഡൊമെയ്‌നാണ്. ഇതിൽ ഡൊമെയ്ൻ ഭാഗം ഉൾപ്പെടുത്തണം. ഉദാഹരണം: invidious.ajay.app"},"resetInvidiousInstance":{"message":"ആക്രമണാത്മക ഉദാഹരണ പട്ടിക പുന reset സജ്ജമാക്കുക"},"resetInvidiousInstanceAlert":{"message":"നിങ്ങൾ ഇൻ‌വിഡിയസ് ഇൻസ്റ്റൻസ് ലിസ്റ്റ് പുന reset സജ്ജമാക്കാൻ പോകുന്നു"},"currentInstances":{"message":"നിലവിലെ സംഭവങ്ങൾ:"},"minDuration":{"message":"കുറഞ്ഞ ദൈർഘ്യം (സെക്കൻഡ്):"},"minDurationDescription":{"message":"സെറ്റ് മൂല്യത്തേക്കാൾ കുറവുള്ള സെഗ്‌മെന്റുകൾ ഒഴിവാക്കുകയോ പ്ലെയറിൽ കാണിക്കുകയോ ചെയ്യില്ല."},"shortCheck":{"message":"ഇനിപ്പറയുന്ന സമർപ്പിക്കൽ നിങ്ങളുടെ മിനിമം ദൈർഘ്യ ഓപ്‌ഷനേക്കാൾ ചെറുതാണ്. ഇത് ഇതിനകം സമർപ്പിച്ചുവെന്നും ഈ ഓപ്ഷൻ കാരണം അവഗണിക്കപ്പെടുന്നുവെന്നും ഇതിനർത്ഥം. സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുവെന്ന് ഉറപ്പാണോ?"},"showUploadButton":{"message":"അപ്‌ലോഡ് ബട്ടൺ കാണിക്കുക"},"customServerAddress":{"message":"സ്പോൺസർബ്ലോക്ക് സെർവർ വിലാസം"},"customServerAddressDescription":{"message":"സെർവറിലേക്ക് കോളുകൾ ചെയ്യാൻ സ്പോൺസർബ്ലോക്ക് ഉപയോഗിക്കുന്ന വിലാസം.\nനിങ്ങൾക്ക് സ്വന്തമായി സെർവർ ഇൻസ്റ്റൻസ് ഇല്ലെങ്കിൽ, ഇത് മാറ്റാൻ പാടില്ല."},"save":{"message":"രക്ഷിക്കും"},"reset":{"message":"പുന et സജ്ജമാക്കുക"},"customAddressError":{"message":"ഈ വിലാസം ശരിയായ രൂപത്തിലല്ല. നിങ്ങൾക്ക് തുടക്കത്തിൽ http: // അല്ലെങ്കിൽ https: // ഉണ്ടെന്നും പിന്നിൽ സ്ലാഷുകളൊന്നുമില്ലെന്നും ഉറപ്പാക്കുക."},"areYouSureReset":{"message":"ഇത് പുന reset സജ്ജമാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"},"mobileUpdateInfo":{"message":"m.youtube.com ഇപ്പോൾ പിന്തുണയ്ക്കുന്നു"},"exportOptions":{"message":"എല്ലാ ഓപ്ഷനുകളും ഇറക്കുമതി ചെയ്യുക / കയറ്റുമതി ചെയ്യുക"},"exportOptionsDownload":{"message":"ഫയലിലേക്ക് സംരക്ഷിക്കുക"},"exportOptionsUpload":{"message":"ഫയലിൽ നിന്നും ലോഡ് ചെയ്യുക"},"setOptions":{"message":"ഓപ്ഷനുകൾ സജ്ജമാക്കുക"},"exportOptionsWarning":{"message":"മുന്നറിയിപ്പ്: ഓപ്ഷനുകൾ മാറ്റുന്നത് ശാശ്വതമായതിനാൽ നിങ്ങളുടെ ഇൻസ്റ്റാൾ തകർക്കാൻ കഴിയും. ഇത് ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുവെന്ന് ഉറപ്പാണോ? നിങ്ങളുടെ പഴയത് ബാക്കപ്പ് ചെയ്യുന്നത് ഉറപ്പാക്കുക."},"incorrectlyFormattedOptions":{"message":"ഈ JSON ശരിയായി ഫോർമാറ്റ് ചെയ്തിട്ടില്ല. നിങ്ങളുടെ ഓപ്ഷനുകൾ മാറ്റിയിട്ടില്ല."},"confirmNoticeTitle":{"message":"സെഗ്മെന്റ് സമർപ്പിക്കുക"},"submit":{"message":"സമർപ്പിക്കുക"},"cancel":{"message":"റദ്ദാക്കുക"},"delete":{"message":"ഇല്ലാതാക്കുക"},"preview":{"message":"പ്രിവ്യൂ"},"unsubmitted":{"message":"സമർപ്പിച്ചിട്ടില്ലാത്തത്"},"inspect":{"message":"പരിശോധിക്കുക"},"edit":{"message":"എഡിറ്റുചെയ്യുക"},"copyDebugInformation":{"message":"ഡീബഗ് വിവരങ്ങൾ ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക"},"copyDebugInformationFailed":{"message":"ക്ലിപ്പ്ബോർഡിലേക്ക് എഴുതുന്നതിൽ പരാജയപ്പെട്ടു"},"copyDebugInformationOptions":{"message":"ഒരു ബഗ് ഉയർത്തുമ്പോൾ / ഒരു ഡവലപ്പർ ആവശ്യപ്പെടുമ്പോൾ ഒരു ഡവലപ്പർക്ക് നൽകേണ്ട വിവരങ്ങൾ ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുന്നു. നിങ്ങളുടെ ഉപയോക്തൃ ഐഡി, വൈറ്റ്‌ലിസ്റ്റ് ചെയ്‌ത ചാനലുകൾ, ഇഷ്‌ടാനുസൃത സെർവർ വിലാസം എന്നിവ പോലുള്ള സെൻസിറ്റീവ് വിവരങ്ങൾ നീക്കംചെയ്‌തു. എന്നിരുന്നാലും നിങ്ങളുടെ ഉപയോഗശൂന്യമായ, ബ്ര browser സർ, ഓപ്പറേറ്റിംഗ് സിസ്റ്റം, വിപുലീകരണ പതിപ്പ് നമ്പർ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ അടങ്ങിയിരിക്കുന്നു. "},"copyDebugInformationComplete":{"message":"ഡീബഗ് വിവരങ്ങൾ ക്ലിപ്പ് ബോർഡിലേക്ക് പകർത്തി. നിങ്ങൾ പങ്കിടാൻ ആഗ്രഹിക്കാത്ത ഏതെങ്കിലും വിവരങ്ങൾ നീക്കംചെയ്യാൻ മടിക്കേണ്ട. ഇത് ഒരു ടെക്സ്റ്റ് ഫയലിൽ സംരക്ഷിക്കുക അല്ലെങ്കിൽ ബഗ് റിപ്പോർട്ടിൽ ഒട്ടിക്കുക."},"to":{"message":"ടു","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"പകർത്തി!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"category_sponsor":{"message":"സ്പോൺസർ"},"category_sponsor_description":{"message":"പണമടച്ചുള്ള പ്രമോഷൻ, പണമടച്ചുള്ള റഫറലുകൾ, നേരിട്ടുള്ള പരസ്യങ്ങൾ. സ്വയം പ്രൊമോഷനോ അല്ലെങ്കിൽ കാരണങ്ങൾ / സ്രഷ്‌ടാക്കൾ / വെബ്‌സൈറ്റുകൾ / ഉൽപ്പന്നങ്ങൾ എന്നിവയ്‌ക്ക് സ shout ജന്യ ശബ്ദമുയർത്തുന്നതിനോ അല്ല."},"category_sponsor_guideline1":{"message":"പണമടച്ചുള്ള പ്രമോഷനുകൾ"},"category_selfpromo":{"message":"പണമടയ്ക്കാത്ത / സ്വയം പ്രമോഷൻ"},"category_selfpromo_description":{"message":"പണമടയ്ക്കാത്ത അല്ലെങ്കിൽ സ്വയം പ്രമോഷൻ ഒഴികെ \"സ്പോൺസർ\" എന്നതിന് സമാനമാണ്. ചരക്കുകൾ, സംഭാവനകൾ, അല്ലെങ്കിൽ അവർ ആരുമായി സഹകരിച്ചു എന്നതിനെക്കുറിച്ചുള്ള വിവരങ്ങൾ എന്നിവ ഇതിൽ ഉൾപ്പെടുന്നു."},"category_exclusive_access":{"message":"പ്രത്യേകമായ ആക്സസ്"},"category_exclusive_access_description":{"message":"മുഴുവൻ വീഡിയോകളും ലേബൽ ചെയ്യുന്നതിന് മാത്രം. അവർക്ക് സൗജന്യമോ സബ്‌സിഡിയോ ആയ ആക്‌സസ് ലഭിച്ച ഉൽപ്പന്നമോ സേവനമോ ലൊക്കേഷനോ ഒരു വീഡിയോ കാണിക്കുമ്പോൾ ഉപയോഗിക്കുന്നു."},"category_exclusive_access_pill":{"message":"അവർക്ക് സൗജന്യമോ സബ്‌സിഡിയോ ആയ ആക്‌സസ് ലഭിച്ച ഒരു ഉൽപ്പന്നമോ സേവനമോ ലൊക്കേഷനോ ഈ വീഡിയോ കാണിക്കുന്നു","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"മുഴുവൻ വീഡിയോയും സൗജന്യ അല്ലെങ്കിൽ സബ്‌സിഡി ആക്‌സസ് ഉള്ള എന്തെങ്കിലും പ്രദർശിപ്പിക്കുന്നു"},"category_interaction":{"message":"ഇന്ററാക്ഷൻ ഓർമ്മപ്പെടുത്തൽ (സബ്‌സ്‌ക്രൈബുചെയ്യുക)"},"category_interaction_description":{"message":"ഉള്ളടക്കത്തിന്റെ മധ്യത്തിൽ ഇഷ്‌ടപ്പെടാനോ സബ്‌സ്‌ക്രൈബുചെയ്യാനോ പിന്തുടരാനോ ഒരു ഹ്രസ്വ ഓർമ്മപ്പെടുത്തൽ ഉണ്ടാകുമ്പോൾ. ഇത് ദൈർഘ്യമേറിയതോ നിർദ്ദിഷ്ടമായതോ ആയ കാര്യങ്ങളാണെങ്കിൽ, അത് സ്വയം പ്രൊമോഷന് കീഴിലായിരിക്കണം."},"category_interaction_guideline1":{"message":"ലൈക്ക് ചെയ്യാനോ സബ്‌സ്‌ക്രൈബ് ചെയ്യാനോ പിന്തുടരാനോ ഉള്ള ചെറിയ ഓർമ്മപ്പെടുത്തലുകൾ"},"category_interaction_guideline2":{"message":"അഭിപ്രായമിടാനുള്ള പരോക്ഷ ഓർമ്മപ്പെടുത്തലുകൾ ഉൾപ്പെടുന്നു"},"category_interaction_short":{"message":"ഇടപെടൽ ഓർമ്മപ്പെടുത്തൽ"},"category_intro":{"message":"ഇടവേള / ആമുഖ ആനിമേഷൻ"},"category_intro_description":{"message":"യഥാർത്ഥ ഉള്ളടക്കമില്ലാത്ത ഇടവേള. ഒരു താൽക്കാലികമായി നിർത്താം, സ്റ്റാറ്റിക് ഫ്രെയിം, ആവർത്തിക്കുന്ന ആനിമേഷൻ. വിവരങ്ങൾ അടങ്ങിയ സംക്രമണങ്ങൾക്ക് ഇത് ഉപയോഗിക്കരുത്."},"category_intro_short":{"message":"ഇടവേള"},"category_intro_guideline1":{"message":"യഥാർത്ഥ ഉള്ളടക്കം ഇല്ലാത്ത ഇടവേള"},"category_outro":{"message":"എൻഡ്‌കാർഡുകൾ / ക്രെഡിറ്റുകൾ"},"category_outro_description":{"message":"ക്രെഡിറ്റുകൾ അല്ലെങ്കിൽ YouTube എൻഡ്‌കാർഡുകൾ ദൃശ്യമാകുമ്പോൾ. വിവരങ്ങളുമായുള്ള നിഗമനങ്ങളിൽ അല്ല."},"category_preview_guideline1":{"message":"പിന്നീടോ, ഭാവി വിഡിയോയിലോ ദൃശ്യമാകുന്ന ക്ലിപ്പുകൾ"},"category_preview_guideline2":{"message":"മുമ്പത്തെ വീഡിയോയുടെ റീക്യാപ്പ്"},"category_filler_guideline2":{"message":"ശ്രദ്ധതിരിക്കുന്നത്, അമ്പരിപ്പിക്കുന്ന തെറ്റുകൾ, റീപ്ലേകൾ"},"category_music_offtopic":{"message":"സംഗീതം: സംഗീതേതര വിഭാഗം"},"category_music_offtopic_description":{"message":"സംഗീത വീഡിയോകളിൽ മാത്രം ഉപയോഗിക്കുന്നതിന് മാത്രം. ഇതിനകം മറ്റൊരു വിഭാഗത്തിൽ ഉൾപ്പെടാത്ത സംഗീത വീഡിയോകളുടെ വിഭാഗങ്ങൾക്കായി മാത്രമേ ഉപയോഗിക്കാവൂ."},"category_music_offtopic_short":{"message":"നോൺ-മ്യൂസിക്"},"category_music_offtopic_guideline1":{"message":"ഔദ്യോഗിക റിലീസുകളിൽ ഇല്ലാത്ത വിഭാഗങ്ങൾ"},"category_music_offtopic_guideline2":{"message":"ഒരു തത്സമയ പ്രകടനത്തിൽ സംഗീതം അല്ലാത്തത്"},"category_chapter":{"message":"അധ്യായം"},"category_chapter_description":{"message":"ഒരു വീഡിയോയുടെ പ്രധാന ഭാഗങ്ങൾ വിവരിക്കുന്ന ഇഷ്‌ടാനുസൃത പേരുള്ള ചാപ്റ്ററുകൾ."},"category_chapter_guideline2":{"message":"പൊതു വിഭാഗങ്ങൾക്കായി വലിയ അധ്യായങ്ങൾ ഉപയോഗിക്കുക"},"category_chapter_guideline3":{"message":"വലിയവയ്ക്കുള്ളിൽ ചെറിയ അധ്യായങ്ങൾ സ്ഥാപിക്കാം"},"category_livestream_messages":{"message":"ലൈവ്സ്ട്രീം: സംഭാവന / സന്ദേശ വായന"},"category_livestream_messages_short":{"message":"സന്ദേശ വായന"},"autoSkip":{"message":"യാന്ത്രിക ഒഴിവാക്കുക"},"manualSkip":{"message":"സ്വമേധയാലുള്ള ഒഴിവാക്കൽ"},"showOverlay":{"message":"സീക്ക് ബാറിൽ കാണിക്കുക"},"disable":{"message":"പ്രവർത്തനരഹിതമാക്കുക"},"manualSkip_POI":{"message":"വീഡിയോ ലോഡുചെയ്യുമ്പോൾ ചോദിക്കുക"},"showOverlay_POI":{"message":"സീക്ക് ബാറിൽ കാണിക്കുക"},"showOverlay_full":{"message":"ലേബൽ കാണിക്കുക"},"showOverlay_chapter":{"message":"അധ്യായങ്ങൾ കാണിക്കുക"},"previewColor":{"message":"സമർപ്പിക്കാത്ത നിറം","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"ബാർ കളർ തേടുക"},"category":{"message":"വിഭാഗം"},"skipOption":{"message":"ഓപ്ഷൻ ഒഴിവാക്കുക","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"ബീറ്റ ടെസ്റ്റിംഗ് സെർവർ പ്രാപ്തമാക്കുക"},"whatEnableTestingServer":{"message":"നിങ്ങളുടെ സമർപ്പിക്കലുകളും വോട്ടുകളും പ്രധാന സെർവറിലേക്ക് കണക്കാക്കില്ല. പരിശോധനയ്ക്കായി മാത്രം ഇത് ഉപയോഗിക്കുക."},"testingServerWarning":{"message":"ടെസ്റ്റ് സെർവറിലേക്ക് കണക്റ്റുചെയ്യുമ്പോൾ എല്ലാ സമർപ്പിക്കലുകളും വോട്ടുകളും പ്രധാന സെർവറിലേക്ക് കണക്കാക്കില്ല. നിങ്ങൾക്ക് യഥാർത്ഥ സമർപ്പിക്കലുകൾ നടത്താൻ താൽപ്പര്യപ്പെടുമ്പോൾ ഇത് പ്രവർത്തനരഹിതമാക്കുന്നത് ഉറപ്പാക്കുക."},"bracketNow":{"message":"(ഇപ്പോൾ)"},"moreCategories":{"message":"കൂടുതൽ വിഭാഗങ്ങൾ"},"chooseACategory":{"message":"ഒരു വിഭാഗം തിരഞ്ഞെടുക്കുക"},"enableThisCategoryFirst":{"message":"\"{0}\" വിഭാഗത്തിൽ സെഗ്‌മെന്റുകൾ സമർപ്പിക്കുന്നതിന്, നിങ്ങൾ ഇത് ഓപ്ഷനുകളിൽ പ്രവർത്തനക്ഷമമാക്കണം. നിങ്ങളെ ഇപ്പോൾ ഓപ്ഷനുകളിലേക്ക് റീഡയറക്ട് ചെയ്യും.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"youMustSelectACategory":{"message":"നിങ്ങൾ സമർപ്പിക്കുന്ന എല്ലാ സെഗ്‌മെന്റുകൾക്കും നിങ്ങൾ ഒരു വിഭാഗം തിരഞ്ഞെടുക്കണം!"},"bracketEnd":{"message":"(അവസാനിക്കുന്നു)"},"End":{"message":"അവസാനം","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"മറഞ്ഞിരിക്കുന്നു: താഴേക്ക്"},"hiddenDueToDuration":{"message":"മറഞ്ഞിരിക്കുന്നു: വളരെ ചെറുതാണ്"},"manuallyHidden":{"message":"സ്വമേധയാ മറച്ചിരിക്കുന്നു"},"acceptPermission":{"message":"അനുമതി സ്വീകരിക്കുക"},"permissionRequestSuccess":{"message":"അനുമതി അഭ്യർത്ഥന വിജയിച്ചു!"},"permissionRequestFailed":{"message":"അനുമതി അഭ്യർത്ഥന പരാജയപ്പെട്ടു, നിങ്ങൾ നിരസിക്കുക എന്നതിൽ ക്ലിക്ക് ചെയ്തോ?"},"forceChannelCheck":{"message":"ഒഴിവാക്കുന്നതിനുമുമ്പ് ചാനൽ പരിശോധന നിർബന്ധിക്കുക"},"whatForceChannelCheck":{"message":"സ്ഥിരസ്ഥിതിയായി, ചാനൽ എന്താണെന്ന് അറിയുന്നതിന് മുമ്പായി അത് സെഗ്‌മെന്റുകൾ ഉടൻ തന്നെ ഒഴിവാക്കും. സ്ഥിരസ്ഥിതിയായി, വീഡിയോയുടെ തുടക്കത്തിലെ ചില സെഗ്‌മെന്റുകൾ വൈറ്റ്‌ലിസ്റ്റ് ചെയ്‌ത ചാനലുകളിൽ ഒഴിവാക്കാം. ഈ ഓപ്‌ഷൻ പ്രവർത്തനക്ഷമമാക്കുന്നത് ഇത് തടയും എന്നാൽ ചാനൽ ഐഡി ലഭിക്കാൻ കുറച്ച് സമയമെടുക്കുന്നതിനാൽ എല്ലാ ഒഴിവാക്കലിനും ചെറിയ കാലതാമസം നേരിടുന്നു. നിങ്ങൾക്ക് വേഗതയേറിയ ഇന്റർനെറ്റ് ഉണ്ടെങ്കിൽ ഈ കാലതാമസം ശ്രദ്ധിക്കപ്പെടില്ല."},"forceChannelCheckPopup":{"message":"\"ഒഴിവാക്കുന്നതിനുമുമ്പ് ഫോഴ്‌സ് ചാനൽ പരിശോധന\" പ്രവർത്തനക്ഷമമാക്കുന്നത് പരിഗണിക്കുക"},"downvoteDescription":{"message":"തെറ്റായ / തെറ്റായ സമയം"},"harmfulVote":{"message":"ഹാനികരമായത്","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"വിഭാഗം മാറ്റുക"},"nonMusicCategoryOnMusic":{"message":"ഈ വീഡിയോയെ സംഗീതമായി വർഗ്ഗീകരിച്ചിരിക്കുന്നു. ഇതിന് ഒരു സ്പോൺസർ ഉണ്ടെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് യഥാർത്ഥത്തിൽ \"സംഗീതേതര വിഭാഗമാണ്\" എങ്കിൽ, വിപുലീകരണ ഓപ്ഷനുകൾ തുറന്ന് ഈ വിഭാഗം പ്രാപ്തമാക്കുക. തുടർന്ന്, സ്പോൺസറിന് പകരം \"നോൺ-മ്യൂസിക്\" എന്ന് നിങ്ങൾക്ക് ഈ സെഗ്മെന്റ് സമർപ്പിക്കാൻ കഴിയും. നിങ്ങൾ ആശയക്കുഴപ്പത്തിലാണെങ്കിൽ ദയവായി മാർഗ്ഗനിർദ്ദേശങ്ങൾ വായിക്കുക."},"multipleSegments":{"message":"ഒന്നിലധികം സെഗ്‌മെന്റുകൾ"},"guidelines":{"message":"മാർഗ്ഗനിർദ്ദേശങ്ങൾ"},"readTheGuidelines":{"message":"മാർഗ്ഗനിർദ്ദേശങ്ങൾ വായിക്കുക!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"വിഭാഗങ്ങൾ ഇവിടെയുണ്ട്!"},"categoryUpdate2":{"message":"ആമുഖങ്ങൾ, ഉൽ‌പ്പന്നങ്ങൾ‌, ചരക്കുകൾ‌ മുതലായവ ഒഴിവാക്കുന്നതിനുള്ള ഓപ്ഷനുകൾ‌ തുറക്കുക."},"help":{"message":"സഹായം"},"hideForever":{"message":"എന്നേക്കും മറയ്ക്കുക"},"Donate":{"message":"സംഭാവന ചെയ്യുക"},"LearnMore":{"message":"കൂടുതൽ അറിയുക"},"hideSegment":{"message":"ഭാഗം മറയ്ക്കുക"},"skipSegment":{"message":"ഭാഗം സ്കിപ് ചെയ്യുക"},"yearAbbreviation":{"message":"വർ","description":"100y"},"dayAbbreviation":{"message":"ദിവ","description":"100d"},"hourAbbreviation":{"message":"മണി","description":"100h"},"optionsTabInterface":{"message":"ഇൻ്റർഫേസ്","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"change":{"message":"മാറ്റുക"},"exportSegments":{"message":"ഭാഗങ്ങൾ എക്സ്‌പോർട് ചെയ്യുക"},"importSegments":{"message":"ഭാഗങ്ങൾ ഇമ്പോർറ്റ് ചെയ്യു"},"Import":{"message":"ഇമ്പോർട്ട്‌","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"unsubmittedSegmentCountsZero":{"message":"നിങ്ങൾക്ക് നിലവിൽ സമർപ്പിക്കാത്ത ഭാഗങ്ങളൊന്നുമില്ല","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"സമർപ്പിക്കാത്ത ഭാഗം","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"സമർപ്പിക്കാത്ത ഭാഗങ്ങൾ","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"വീഡിയോ","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"വീഡിയോകൾ","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"എല്ലാ ഭാഗങ്ങളും മായ്‌ക്കുക","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"നിങ്ങളുടെ സമർപ്പിക്കാത്ത എല്ലാ ഭാഗങ്ങളും മായ്‌ക്കണമെന്ന് തീർച്ചയാണോ?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"ഭാഗങ്ങൾ പ്രദർശിപ്പിക്കുക","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"ഭാഗങ്ങൾ മറയ്ക്കുക","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"വീഡിയോ ഐഡി","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"ഭാഗങ്ങളുടെ എണ്ണം","description":"Header of the unsubmitted segments list"},"actions":{"message":"പ്രവർത്തികൾ","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"യുആർഎൽ ആയി പങ്കിടുക"},"segmentFetchFailureWarning":{"message":"മുന്നറിയിപ്പ്: ഭാഗങ്ങളുമായി സെർവർ ഇതുവരെ പ്രതികരിച്ചിട്ടില്ല. ഈ വീഡിയോയിൽ ഇതിനകം സമർപ്പിച്ചിരിക്കുന്ന ഭാഗങ്ങൾ യഥാർത്ഥത്തിൽ ഉണ്ടായിരിക്കാം, എന്നാൽ സെർവറിലെ പ്രശ്‌നങ്ങൾ കാരണം നിങ്ങൾക്ക് അവ ലഭിച്ചിട്ടുണ്ടാവില്ല."},"Original":{"message":"ഒറിജിനൽ"},"OriginalTitle":{"message":"യഥാർത്ഥ തലക്കെട്ട്"},"CurrentTime":{"message":"നിലവിലെ സമയം"},"resetCustomTitle":{"message":"ശീർഷകം യഥാർത്ഥ വാചകത്തിലേക്ക് പുനഃക്രമീകരിക്കുക"},"resetIcon":{"message":"ഐക്കൺ പുനഃക്രമീകരിക്കുക"},"TypeYourOwnTitleHere":{"message":"നിങ്ങളുടെ സ്വന്തം തലക്കെട്ട് ഇവിടെ ടൈപ്പുചെയ്യുക"},"VideoNotReady":{"message":"വീഡിയോ തയ്യാറായിട്ടില്ല"},"FailedToLoad":{"message":"ലോഡ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു","description":"Thumbnail failed to load"},"Disabled":{"message":"പ്രവർത്തന രഹിതമാണ്‌"},"CapitalizeWords":{"message":"വാക്കുകൾ വലിയക്ഷരമാക്കുക"},"TitleCase":{"message":"തലക്കെട്ട് കേസ്"},"SentenceCase":{"message":"ശിക്ഷാ കേസ്"},"LowerCase":{"message":"ചെറിയക്ഷരം"},"FirstLetterUppercase":{"message":"ആദ്യ അക്ഷരം വലിയക്ഷരം"},"shouldCleanEmojis":{"message":"ഇമോജികൾ നീക്കം ചെയ്യുക"},"onlyTitleCaseInEnglish":{"message":"ഇംഗ്ലീഷ് ഇതര തലക്കെട്ടുകൾക്കുള്ള വാക്കുകൾ വലിയക്ഷരമാക്കുക"},"thumbnailFallbackOption":{"message":"സമർപ്പിച്ച ലഘുചിത്രം നിലവിലില്ലാത്തപ്പോൾ"},"RandomTime":{"message":"ക്രമാനുസൃതമല്ലാത്ത സമയത്തിൽ നിന്നുള്ള ഒരു സ്ക്രീൻഷോട്ട് കാണിക്കുക"},"TheOriginalThumbnail":{"message":"യഥാർത്ഥ ലഘുചിത്രം കാണിക്കുക"},"showABlankBox":{"message":"ഒരു ശൂന്യ ബോക്സ് കാണിക്കുക"},"AutoGenerated":{"message":"യൂട്യൂബ് സ്വയമേവ സൃഷ്‌ടിച്ച ഒരു ലഘുചിത്രം കാണിക്കുക","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"തുടക്കം"},"Middle":{"message":"മദ്ധ്യം"},"keepUnsubmitted":{"message":"സമർപ്പിച്ച വോട്ടുകൾ സംഭരിക്കുക"},"useThumbnailGenerationService":{"message":"ലഘുചിത്ര ജനറേഷൻ സേവനം ഉപയോഗിക്കുക"},"titleMaxLines":{"message":"ശീർഷകത്തിനുള്ള പരമാവധി വരികൾ"},"titleMaxLinesDescription":{"message":"നിർദ്ദേശങ്ങളിൽ വീഡിയോ ശീർഷകങ്ങൾ ഇത്രയധികം വരികളിൽ വ്യാപിക്കും."},"onAllPages":{"message":"എല്ലാ പേജുകളിലും","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"വീഡിയോ പേജുകൾ ഒഴികെ എല്ലാ പേജുകളിലും","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"alwaysShowShowOriginalButton":{"message":"എല്ലായ്പ്പോഴും \"ഒറിജിനൽ കാണിക്കുക\" ബട്ടൺ പ്രദർശിപ്പിക്കുക"},"whatAlwaysShowShowOriginalButton":{"message":"ഒരു ശീർഷകം/ലഘുചിത്രം മാറിയിട്ടുണ്ടോ എന്ന് നിങ്ങൾക്ക് എപ്പോഴും അറിയണമെങ്കിൽ, ഇത് പ്രവർത്തനക്ഷമമാക്കുക."},"Enable":{"message":"പ്രവർത്തനക്ഷമമാക്കുക"},"Titles":{"message":"തലക്കെട്ട്","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"ലഘുചിത്രങ്ങൾ","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"എറർ"},"ShowOriginal":{"message":"യഥാർത്ഥ വിശദാംശങ്ങൾ കാണിക്കുക"},"ShowModified":{"message":"പരിഷ്കരിച്ച വിശദാംശങ്ങൾ കാണിക്കുക"},"chatboxDescription":{"message":"ഈ ചാറ്റിൽ സ്ഥിരമായി തുടരാൻ ഡിസ്കോഡ് അല്ലെങ്കിൽ മാട്രിക്സിൽ ചേരുക","description":"Appears on the top of the integrated chatbox"},"tip1":{"message":"അതിശയോക്തി കലർന്ന മുഖഭാവങ്ങൾ ഒഴിവാക്കുക","description":"Referring to the thumbnail of a video"},"tip5":{"message":"ഒരു വാചകം പോലെ വലിയക്ഷരമാക്കുക","description":"Tip about submitting titles to DeArrow"},"howItWorks":{"message":"ഇത് എങ്ങനെ പ്രവർത്തിക്കുന്നു"},"privacyPolicy":{"message":"സ്വകാര്യതാ നയം"},"termsOfUse":{"message":"ഉപയോഗ നിബന്ധനകൾ"},"openSourceLicenses":{"message":"ഓപ്പൺ സോഴ്‌സ് ലൈസൻസുകൾ"},"replaceThumbnails":{"message":"ലഘുചിത്രങ്ങൾ മാറ്റുക"},"requiresUblock":{"message":"യുബ്ലോക്ക് ഒറിജിൻ ആവശ്യമാണ്"},"freeTrialEnded":{"message":"നിങ്ങളുടെ സൗജന്യ ട്രയൽ അവസാനിച്ചിരിക്കുന്നു"},"freeTrialPrompt":{"message":"നിങ്ങൾക്ക് ഇത് പരീക്ഷിക്കാൻ താൽപ്പര്യമുണ്ടെങ്കിൽ, ചുവടെയുള്ള ബട്ടൺ ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഒരു സൗജന്യ ട്രയൽ ആരംഭിക്കാം."},"startFreeTrial":{"message":"സൗജന്യ ട്രയൽ ആരംഭിക്കുക"},"freeAccessRequested":{"message":"സൗജന്യ പ്രവേശനത്തിനായി നിങ്ങൾ വിജയകരമായി രജിസ്റ്റർ ചെയ്തിരിക്കുന്നു. സൗജന്യ ആക്സസ് അനുവദിക്കുമ്പോൾ നിങ്ങളെ അറിയിക്കുന്നതാണ്."},"freeAccessComplete":{"message":"അഭിനന്ദനങ്ങൾ! നിങ്ങൾക്ക് ഇപ്പോൾ ഡീആരോവിലേക്ക് സൗജന്യ ആക്സസ് ലഭിച്ചിരിക്കുന്നു"},"ActivateDeArrow":{"message":"ഡിആരോ ആക്റ്റവേറ്റ് ചെയ്യുക"},"Close":{"message":"അടയ്ക്കുക"},"ViewLicenseKey":{"message":"ലൈസൻസ് കീ കാണുക"},"syncDisabledWarningDeArrow":{"message":"സ്റ്റോറേജ് ഇല്ലാതെ ഡീആരോ പ്രവർത്തിക്കില്ല."},"actAsVip":{"message":"വി ഐ പി ആയി പ്രവർത്തിക്കുക","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ms/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ms/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Masa sambungan telah tamat. Periksa sambungan internet anda. Sekiranya internet anda berfungsi, pelayan mungkin berlebihan atau tidak berfungsi."},"400":{"message":"Pelayan mengatakan permintaan ini tidak sah"},"409":{"message":"Perkara ini telah dikemukakan sebelumnya"},"502":{"message":"Pelayan nampaknya berlebihan. Cuba lagi dalam beberapa saat."},"fullName":{"message":"SponsorBlock untuk YouTube - Lewati Sponsor","description":"Name of the extension."},"Description":{"message":"Lewati sponsor, meminta subscriber dan lain-lain di video YouTube. Laporkan sponsor di video yang anda tonton untuk menghemat waktu orang lain.","description":"Description of the extension."},"channelWhitelisted":{"message":"Saluran Senarai Putih!"},"Segment":{"message":"segmen"},"Segments":{"message":"segmen"},"SegmentsCap":{"message":"Segmen"},"Chapters":{"message":"Bab"},"renderAsChapters":{"message":"Render segmen sebagai bab","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Tunjukkan Segmen Semasa Di Sebelah Masa Video"},"upvoteButtonInfo":{"message":"Sokong penyerahan ini"},"reportButtonTitle":{"message":"Lapor"},"reportButtonInfo":{"message":"Laporkan penyerahan ini sebagai tidak betul."},"Dismiss":{"message":"Ketepikan"},"Loading":{"message":"Memuat..."},"Hide":{"message":"Jangan Tunjukkan"},"hitGoBack":{"message":"Tekan langgan untuk sampai ke tempat asal anda."},"unskip":{"message":"Hentikan"},"reskip":{"message":"Reskip"},"unmute":{"message":"Nyahredam"},"paused":{"message":"Dijeda"},"manualPaused":{"message":"Pemasa Berhenti"},"confirmMSG":{"message":"Untuk mengedit atau menghapus nilai individu, klik butang maklumat atau buka pop timbul pelanjutan dengan mengklik ikon pelanjutan di sudut kanan atas."},"clearThis":{"message":"Adakah anda pasti mahu membersihkannya?\n\n"},"Unknown":{"message":"Terdapat kesalahan semasa menghantar masa penaja anda, sila cuba sebentar lagi."},"sponsorFound":{"message":"Video ini mempunyai segmen dalam pangkalan data!"},"sponsor404":{"message":"Tidak terdapat segmen"},"sponsorStart":{"message":"Segmen Bermula Sekarang"},"sponsorEnd":{"message":"Segmen Berakhir Sekarang"},"sponsorCancel":{"message":"Batalkan Membuat Segmen"},"noVideoID":{"message":"Tiada video YouTube dijumpai.\nSekiranya ini tidak betul, muat semula tab."},"refreshSegments":{"message":"Muat semula segmen"},"success":{"message":"Berjaya!"},"voted":{"message":"Mengundi!"},"serverDown":{"message":"Nampaknya pelayan tidak berfungsi. Segera hubungi dev."},"connectionError":{"message":"Ralat sambungan telah berlaku. Kod salah: "},"segmentsStillLoading":{"message":"Segmen masih dimuatkan..."},"clearTimes":{"message":"Kosongkan Segmen"},"openPopup":{"message":"Buka Pop timbul PenajaBlokir"},"closePopup":{"message":"Tutup Pop timbul"},"closeIcon":{"message":"Tutup Ikon"},"sortSegments":{"message":"Susun Segmen"},"submitCheck":{"message":"Adakah anda pasti mahu menghantarnya?"},"whitelistChannel":{"message":"Saluran senarai putih"},"removeFromWhitelist":{"message":"Alih keluar saluran dari senarai putih"},"voteOnTime":{"message":"Undi Segmen"},"Submissions":{"message":"Penyerahan"},"savedPeopleFrom":{"message":"Anda telah menyelamatkan orang dari "},"viewLeaderboard":{"message":"Papan pendahulu"},"recordTimesDescription":{"message":"Hantar"},"submissionEditHint":{"message":"Penyuntingan bahagian akan muncul setelah anda mengklik hantar","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Petunjuk: Anda boleh menetapkan kunci untuk dihantar dalam pilihan"},"clearTimesButton":{"message":"Jelas Masa"},"Username":{"message":"Nama pengguna"},"setUsername":{"message":"Tetapkan Nama Pengguna"},"copyPublicID":{"message":"Salin PenggunaID Awam"},"copySegmentID":{"message":"Salin ID Segmen"},"hideThis":{"message":"Sembunyikan ini"},"Options":{"message":"Pilihan"},"showButtons":{"message":"Tunjukkan Butang Pada Pemain YouTube"},"hideButtonsDescription":{"message":"Ini menyembunyikan butang yang muncul di pemain YouTube untuk menyerahkan segmen langkau."},"showSkipButton":{"message":"Simpan Butang Langkau Ke Sorotan Di Pemain"},"showInfoButton":{"message":"Tunjukkan Butang Maklumat Pada Pemain YouTube"},"autoHideInfoButton":{"message":"Auto-sembunyikan Butang Maklumat"},"showDeleteButton":{"message":"Tunjukkan Butang Padam Pada Pemain YouTube"},"enableViewTracking":{"message":"Dayakan Skip Count Tracking"},"whatViewTracking":{"message":"Fungsi ini mengesan segmen mana yang telah anda lewati untuk memberi tahu pengguna seberapa banyak penyerahan mereka telah membantu orang lain dan digunakan sebagai metrik bersama dengan suara positif untuk memastikan bahawa spam tidak masuk ke dalam pangkalan data. Sambungan tersebut menghantar mesej ke pelayan setiap kali anda melewatkan segmen. Mudah-mudahan kebanyakan orang tidak mengubah tetapan ini supaya nombor paparan tepat. :)"},"enableViewTrackingInPrivate":{"message":"Bolehkan Penjejakan kiraan Langkau Di Dalam Tab Persendirian/Inkognito"},"enableTrackDownvotes":{"message":"Simpan segmen undi turun"},"whatTrackDownvotes":{"message":"Segmen yang anda undi turun akan kekal tersembunyi walaupun selepas memuat semulakan"},"trackDownvotesWarning":{"message":"Amaran: Melumpuhkan ini akan padam semua undi turun yang tersimpan sebelum ini"},"enableQueryByHashPrefix":{"message":"Pertanyaan Oleh Awalan Hash"},"whatQueryByHashPrefix":{"message":"Daripada meminta segmen dari pelayan menggunakan videoID, 4 watak pertama hash videoID dihantar. Pelayan ini akan menghantar kembali data untuk semua video dengan hash yang serupa."},"enableShowCategoryWithoutPermission":{"message":"Tunjuk kategori dalam menu penghantaran walaupun tanpa kebenaran penghantaran"},"whatShowCategoryWithoutPermission":{"message":"Beberapa kategori memerlukan kebenaran untuk hantar disebabkan keperluan reputasi minimum"},"showNotice":{"message":"Tunjukkan Notis Lagi"},"showSkipNotice":{"message":"Tunjukkan Makluman Setelah Segmen Dilangkau"},"showCategoryGuidelines":{"message":"Tunjukkan Bantuan Kategori"},"noticeVisibilityMode0":{"message":"Saiz Penuh Langkau Notis"},"noticeVisibilityMode1":{"message":"Notis Langkau Kecil untuk Auto Langkau"},"noticeVisibilityMode2":{"message":"Semua Kecil Notis Langkau"},"noticeVisibilityMode3":{"message":"Notis Langkau Pudar untuk Auto Langkau"},"noticeVisibilityMode4":{"message":"Semua Pudar Notis Langkau"},"longDescription":{"message":"SponsorBlock membolehkan anda melewati penaja, intro, outro, peringatan langganan, dan bahagian lain dari video YouTube yang menjengkelkan. SponsorBlock adalah pelanjutan penyemak imbas yang banyak untuk membolehkan sesiapa sahaja menghantar segmen tajaan dan masa tayangan dari segmen video YouTube yang lain. Setelah satu orang menyerahkan maklumat ini, semua orang yang mempunyai pelanjutan ini akan melangkau segmen yang ditaja. Anda juga boleh melangkau bahagian muzik video muzik bukan.","description":"Full description of the extension on the store pages."},"website":{"message":"Laman web","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Kod sumber","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Notis telah ditingkatkan!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Sekiranya anda masih tidak menyukainya, tekan butang jangan tunjukkan.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Langkau segmen","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Mula/berhenti segmen","description":"Keybind label"},"setSubmitKeybind":{"message":"Hantar segmen","description":"Keybind label"},"nextChapterKeybind":{"message":"Bab seterusnya","description":"Keybind label"},"previousChapterKeybind":{"message":"Bab sebelumnya","description":"Keybind label"},"keybindDescription":{"message":"Pilih kekunci dengan menaipnya dan pilih mana-mana kekunci pengubah suai yang anda ingin gunakan."},"disableSkipping":{"message":"Melangkau diaktifkan"},"enableSkipping":{"message":"Melangkau dilumpuhkan"},"yourWork":{"message":"Kerja awak","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Kod ralat: "},"skip":{"message":"Langkau"},"mute":{"message":"Redam"},"full":{"message":"Seluruh Video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Langkau {0}?"},"mute_category":{"message":"Redam {0}?"},"skip_to_category":{"message":"Langkau kepada {0}?","description":"Used for skipping to things (Skip to Highlight)"},"skipped":{"message":"{0} Melangkau","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} Diredam","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Melangkau kepada {0}","description":"Used for skipping to things (Skipped to Highlight)"},"disableAutoSkip":{"message":"Lumpuhkan Langkau Auto"},"enableAutoSkip":{"message":"Dayakan Langkau Auto"},"audioNotification":{"message":"Pemberitahuan Audio Semasa Langkau"},"audioNotificationDescription":{"message":"Pemberitahuan audio di langkau akan memainkan suara setiap kali segmen dilangkau. Sekiranya dilumpuhkan (atau langkau automatik dinonaktifkan), suara tidak akan dimainkan."},"showTimeWithSkips":{"message":"Tunjukkan Masa Dengan Langkau Dihapus"},"showTimeWithSkipsDescription":{"message":"Kali ini muncul dalam tanda kurung di sebelah waktu semasa di bawah bar carian. Ini menunjukkan jumlah durasi video tolak segmen mana pun. Ini merangkumi segmen yang ditandai sebagai \"Show In Seekbar\" sahaja."},"youHaveSkipped":{"message":"Anda telah melangkau "},"minLower":{"message":"minit"},"minsLower":{"message":"minit"},"hourLower":{"message":"jam"},"hoursLower":{"message":"jam"},"youHaveSavedTime":{"message":"Anda telah menyelamatkan orang","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" kehidupan mereka","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Periksa status.sponsor.ajay.app untuk status pelayan."},"changeUserID":{"message":"Import/Eksport PenggunaID Persendirian Anda"},"whatChangeUserID":{"message":"Ini patut dirahsiakan. Ini seperti kata laluan dan tidak patut untuk dikongsi dengan sesiapa. Jika seseorang mempunyai ini, mereka boleh menyamar sebagai anda. Jika anda sedang mencari untuk penggunaID awam anda, tekan ikon papan keratan di dalam pop timbul."},"setUserID":{"message":"Tetapkan PenggunaanID Peribadi"},"userIDChangeWarning":{"message":"Amaran: Mengubah PenggunaanID Peribadi adalah kekal. Adakah anda pasti anda mahu melakukan ini? Pastikan untuk membuat sandaran anda yang lama untuk berjaga-jaga."},"createdBy":{"message":"Dicipta oleh"},"supportOtherSites":{"message":"Sokong Pihak Ke-3 Laman YouTube"},"supportedSites":{"message":"Laman Disokong: "},"optionsInfo":{"message":"Dayakan sokongan Invidious, lumpuhkan autoskip, sembunyikan butang dan banyak lagi."},"addInvidiousInstance":{"message":"Tambah Pihak Ke-3 Contoh Klien"},"addInvidiousInstanceDescription":{"message":"Tambah contoh tersuai. Ini mesti diformat HANYA dengan domain. Contoh: invidious.ajay.app"},"add":{"message":"Tambah"},"addInvidiousInstanceError":{"message":"Ini adalah domain yang tidak sah. Ini mesti HANYA merangkumi bahagian domain. Contoh: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Tetapkan semula Senarai Instance Invidious yang Tidak Diingini"},"resetInvidiousInstanceAlert":{"message":"Anda akan menetapkan semula senarai contoh Invidious"},"currentInstances":{"message":"Contoh Semasa:"},"minDuration":{"message":"Tempoh minimum (saat):"},"minDurationDescription":{"message":"Segmen yang lebih pendek daripada nilai yang ditetapkan tidak akan dilangkau atau ditunjukkan dalam pemain."},"enableManualSkipOnFullVideo":{"message":"Gunakan langkau manual apabila label video penuh wujud"},"whatManualSkipOnFullVideo":{"message":"Untuk orang yang ingin menonton video penuh tanpa gangguan jika ia adalah ditaja sepenuhnya atau promosi diri."},"skipNoticeDuration":{"message":"Tenpoh masa notis langkau (saat):"},"skipNoticeDurationDescription":{"message":"Notis langkau akan kekal di skrin untuk sekurang-kurangnya beberapa saat ini. Untuk melangkau secara manual, ia mungkin dilihat lebih lama."},"shortCheck":{"message":"Penyerahan berikut lebih pendek daripada pilihan tempoh minimum anda. Ini mungkin bermaksud ini sudah dihantar, dan hanya diabaikan kerana pilihan ini. Adakah anda pasti mahu menghantar?"},"liveOrPremiere":{"message":"Menghantar pada siaran langsung aktif atau tayangan perdana tidak dibenarkan. Sila tunggu sehingga ia selesai, kemudian muat semula halaman dan mengesahkan yang segmen masih sah."},"showUploadButton":{"message":"Tunjukkan Butang Muat Naik"},"customServerAddress":{"message":"Alamat Pelayan Sponsorblock"},"customServerAddressDescription":{"message":"Alamat yang digunakan SponsorBlock untuk membuat panggilan ke pelayan.\nKecuali anda mempunyai contoh pelayan anda sendiri, ini tidak boleh diubah."},"save":{"message":"Simpan"},"reset":{"message":"Tetapkan semula"},"customAddressError":{"message":"Alamat ini tidak dalam bentuk yang betul. Pastikan anda mempunyai http: // atau https: // pada awalnya dan tiada garis miring."},"areYouSureReset":{"message":"Adakah anda pasti mahu menetapkan semula ini?"},"mobileUpdateInfo":{"message":"m.youtube.com kini disokong"},"exportOptions":{"message":"Import / Eksport Semua Pilihan"},"exportOptionsCopy":{"message":"Sunting/salin"},"exportOptionsDownload":{"message":"Simpan ke fail"},"exportOptionsUpload":{"message":"Muatkan dari fail"},"whatExportOptions":{"message":"Ini adalah keseluruhan konfigurasi anda dalam JSON. Ini termasuk PenggunaanID Persendirian anda, jadi pastikan untuk kongsi ini dengan bijak."},"setOptions":{"message":"Tetapkan Pilihan"},"exportOptionsWarning":{"message":"Amaran: Mengubah pilihan adalah kekal dan boleh menghentikan pemasangan anda. Adakah anda pasti mahu melakukan ini? Pastikan untuk membuat sandaran lama anda sekiranya berlaku."},"incorrectlyFormattedOptions":{"message":"JSON ini tidak diformat dengan betul. Pilihan anda belum diubah."},"confirmNoticeTitle":{"message":"Hantar Segmen"},"submit":{"message":"Hantar"},"cancel":{"message":"Batal"},"delete":{"message":"Padam"},"preview":{"message":"Pratonton"},"unsubmitted":{"message":"Belum Diserahkan"},"inspect":{"message":"Periksa"},"edit":{"message":"Sunting"},"copyDebugInformation":{"message":"Salin Maklumat Debug Ke Papan Keratan"},"copyDebugInformationFailed":{"message":"Gagal menulis ke papan keratan"},"copyDebugInformationOptions":{"message":"Menyalin maklumat ke papan keratan untuk diberikan kepada pembangun semasa menaikkan pepijat / ketika pembangun memintanya. Maklumat sensitif seperti ID pengguna anda, saluran dalam senarai putih, dan alamat pelayan tersuai telah dikeluarkan. Namun, ia mengandungi maklumat seperti agen pengguna, penyemak imbas, sistem operasi, dan nombor versi pelanjutan anda. "},"copyDebugInformationComplete":{"message":"Maklumat debug telah disalin ke papan klip. Jangan ragu untuk membuang maklumat yang anda tidak mahu kongsi Simpan ini dalam fail teks atau tampal ke laporan pepijat."},"keyAlreadyUsed":{"message":"Pintasan ini terikat kepada tindakan lain. Sila pilih yang lain."},"to":{"message":"ke","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Disalin!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Termasuk peralihan segue"},"generic_guideline2":{"message":"Main seperti seolah-olahnya tiada apa-apa yang melangkau"},"category_sponsor":{"message":"Penaja"},"category_sponsor_description":{"message":"Promosi berbayar, rujukan berbayar dan iklan langsung. Bukan untuk promosi diri atau sapaan percuma kepada penyebab / pencipta / laman web / produk yang mereka suka."},"category_sponsor_guideline1":{"message":"Promosi dibayar"},"category_sponsor_guideline2":{"message":"Bukan untuk derma atau barangan tersuai"},"category_selfpromo":{"message":"Promosi Tanpa Bayaran / Diri"},"category_selfpromo_description":{"message":"Sama dengan \"penaja\" kecuali untuk promosi tanpa gaji atau diri. Ini merangkumi bahagian mengenai barang dagangan, sumbangan, atau maklumat tentang siapa mereka bekerjasama."},"category_selfpromo_guideline1":{"message":"Dermaan, keahlian dan barangan tersuai"},"category_selfpromo_guideline2":{"message":"Shoutout percuma yang tidak menambah kepada video"},"category_selfpromo_guideline3":{"message":"Bukan untuk produk reka bentuk korporat dan barang dagangan"},"category_exclusive_access":{"message":"Akses Eksklusif"},"category_exclusive_access_description":{"message":"Hanya untuk melabelkan keseluruhan video. Digunakan apabila video menunjukkan sesuatu produk, servis atau lokasi yang mereka menerima dengan percuma atau akses bersubsidi kepada."},"category_exclusive_access_pill":{"message":"Video ini menunjukkan sesuatu produk, servis atau lokasi yang mereka menerima dengan percuma atau akses bersubsidi kepada","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Keseluruhan video menunjukkan benda yang percuma atau akses bersubsidi"},"category_interaction":{"message":"Peringatan Interaksi (Langgan)"},"category_interaction_description":{"message":"Apabila ada peringatan pendek untuk menyukai, melanggan atau mengikutinya di tengah-tengah kandungan. Sekiranya ia panjang atau mengenai sesuatu yang spesifik, ia harus dipromosikan sendiri."},"category_interaction_guideline1":{"message":"Peringatan pendek untuk suka, melanggan atau ikut"},"category_interaction_guideline2":{"message":"Termasuk peringatan tidak langsung untuk komen"},"category_interaction_guideline3":{"message":"Bukan untuk promosi umum, hanya seruan untuk bertindak"},"category_interaction_short":{"message":"Peringatan Interaksi"},"category_intro":{"message":"Intermission / Pengenalan Animasi"},"category_intro_description":{"message":"Selang tanpa kandungan sebenar. Boleh jadi jeda, bingkai statik, mengulangi animasi. Ini tidak boleh digunakan untuk peralihan yang mengandungi maklumat."},"category_intro_short":{"message":"Selang"},"category_intro_guideline1":{"message":"Selang waktu tanpa kandungan sebenar"},"category_intro_guideline2":{"message":"Bukan untuk transisi dengan maklumat"},"category_outro":{"message":"Kad Akhir / Kredit"},"category_outro_description":{"message":"Kredit atau ketika kad akhir YouTube muncul. Bukan untuk kesimpulan dengan maklumat."},"category_outro_guideline1":{"message":"Jangan termasuk kandungan, walaupun kad akhir pada skrin"},"category_preview_description":{"message":"Koleksi klip yang menunjukkan apa yang akan datang di dalam video ini atau video lain di dalam siri di mana semua maklumat diulang kemudian di dalam video."},"category_preview_guideline1":{"message":"Klip yang muncul kemudian, atau di dalam video masa depan"},"category_preview_guideline2":{"message":"Imbas kembali video sebelum ini"},"category_preview_guideline3":{"message":"Bukan untuk bahagian yang menambah kandungan tambahan"},"category_filler_guideline2":{"message":"Gangguan, blooper, ulang tayang"},"category_filler_guideline3":{"message":"Bukan untuk adegan diperlukan untuk memahami topik"},"category_music_offtopic":{"message":"Muzik: Bahagian Bukan Muzik"},"category_music_offtopic_description":{"message":"Hanya untuk digunakan dalam video muzik. Ini hanya harus digunakan untuk bahagian video muzik yang belum dilindungi oleh kategori lain."},"category_music_offtopic_short":{"message":"Bukan Muzik"},"category_music_offtopic_guideline1":{"message":"Bahagian bukan dalam keluaran rasmi"},"category_music_offtopic_guideline2":{"message":"Bukan muzik di dalam persembahan secara langsung"},"category_poi_highlight":{"message":"Sorotan"},"category_poi_highlight_description":{"message":"Bahagian video yang kebanyakan orang sedang mencari. Sama seperti komen \"Video bermula pada x\"."},"category_poi_highlight_guideline1":{"message":"Bahagian kebanyakan orang sedang mencari"},"category_poi_highlight_guideline2":{"message":"Boleh langkau konteks"},"category_poi_highlight_guideline3":{"message":"Boleh langkau ke tajuk atau thumbnail"},"category_chapter":{"message":"Bab"},"category_chapter_description":{"message":"Nama bab tersuai menerangkan bahagian utama video."},"category_chapter_guideline1":{"message":"Jangan menyebut nama jenama penaja"},"category_chapter_guideline2":{"message":"Gunakan bab lebih besar untuk bahagian umum"},"category_chapter_guideline3":{"message":"Kandungan yang lebih kecil boleh diletakkan di dalam yang lebih besar"},"category_livestream_messages":{"message":"Strim Langsung: Bacaan Derma / Mesej"},"category_livestream_messages_short":{"message":"Bacaan Mesej"},"autoSkip":{"message":"Langkau Auto"},"manualSkip":{"message":"Langkau Manual"},"showOverlay":{"message":"Tunjukkan Di Bar Mencari"},"disable":{"message":"Nyahaktifkan"},"autoSkip_POI":{"message":"Langkau ke permulaan secara automatik"},"manualSkip_POI":{"message":"Tanya apabila video dimuatkan"},"showOverlay_POI":{"message":"Tunjuk Dalam Bar Mencari"},"showOverlay_full":{"message":"Tunjuk Label"},"showOverlay_chapter":{"message":"Tunjukkan bab"},"autoSkipOnMusicVideos":{"message":"Auto langkau semua segmen apabila terdapat segmen bukan-muzik"},"muteSegments":{"message":"Benarkan segmen yang meredamkan audio sebaliknya langkau"},"fullVideoSegments":{"message":"Tunjukkan ikon apabila video ialah iklan sepenuhnya","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"previewColor":{"message":"Warna Belum Diserahkan","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Cari Warna Bar"},"category":{"message":"Kategori"},"skipOption":{"message":"Langkau Pilihan","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"Dayakan Pelayan Pengujian Beta"},"whatEnableTestingServer":{"message":"Penyerahan dan undian anda TIDAK AKAN DITUNTUT ke pelayan utama. Gunakan ini hanya untuk ujian."},"testingServerWarning":{"message":"Semua penyerahan dan undian TIDAK AKAN DITETAPKAN ke pelayan utama semasa menyambung ke pelayan ujian. Pastikan untuk melumpuhkan ini semasa anda ingin membuat penghantaran sebenar."},"bracketNow":{"message":"(Sekarang)"},"moreCategories":{"message":"Lebih banyak kategori"},"chooseACategory":{"message":"Pilih Kategori"},"enableThisCategoryFirst":{"message":"Untuk menghantar segmen dengan kategori \"{0}\", anda mesti mengaktifkannya dalam pilihan. Anda akan diarahkan ke pilihan sekarang.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Amaran: Segmen jenis ini hanya boleh mempunyai maksimum satu aktif pada satu masa. Menghantar pelbagai lagi akan menyebabkan satu ditunjukkan secara rawak."},"youMustSelectACategory":{"message":"Anda mesti memilih kategori untuk semua segmen yang anda kirimkan!"},"bracketEnd":{"message":"(Tamat)"},"End":{"message":"Tamat","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"tersembunyi: undi"},"hiddenDueToDuration":{"message":"tersembunyi: terlalu pendek"},"manuallyHidden":{"message":"disembunyikan secara manual"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID saluran tidak dimuatkan lagi. Jika anda menggunakan video terbenam, cuba gunakan laman utama YouTube sebaliknya. Ini juga boleh disebabkan perubahan di dalam susun atur YouTube, jika anda fikir begitu, buat komen di sini:"},"invidiousPermissionRefresh":{"message":"Pelayar telah membatalkan kebenaran diperlukan untuk berfungsi di Invidious dan laman pihak ke-3 yang lain. Sila tekan butang di bawah untuk aktifkan semula kebenaran ini."},"acceptPermission":{"message":"Terima kebenaran"},"permissionRequestSuccess":{"message":"Permintaan kebenaran berjaya!"},"permissionRequestFailed":{"message":"Permintaan kebenaran gagal, adakah anda menekan menafikan?"},"adblockerIssueWhitelist":{"message":"Jika anda tidak dapat menyelesaikan perkara ini, kemudian lumpuhkan tetapan 'Paksa Semak Saluran Sebelum Langkau', kerana SponsorBlock tidak dapat mengambil semula maklumat saluran untuk video ini"},"forceChannelCheck":{"message":"Pakai Pemeriksaan Saluran Sebelum Melangkau"},"whatForceChannelCheck":{"message":"Secara lalai, ia akan melangkau segmen dengan segera sebelum mengetahui saluran itu. Secara lalai, beberapa segmen pada permulaan video mungkin dilangkau pada saluran yang disenaraikan. Mengaktifkan pilihan ini akan mengelakkannya tetapi membuat semua melangkau sedikit kelewatan kerana mendapatkan saluran Id memerlukan sedikit masa. Kelewatan ini mungkin tidak dapat dilihat jika anda mempunyai internet yang pantas."},"forceChannelCheckPopup":{"message":"Pertimbangkan untuk Mengaktifkan \"Paksa Pemeriksaan Saluran Sebelum Melangkau\""},"downvoteDescription":{"message":"Pemasaan Tidak Betul / Salah"},"incorrectVote":{"message":"Salah"},"harmfulVote":{"message":"Memudaratkan","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Tukar Kategori"},"nonMusicCategoryOnMusic":{"message":"Video ini dikategorikan sebagai muzik. Adakah anda pasti ini mempunyai penaja? Sekiranya ini sebenarnya adalah \"Segmen Bukan Muzik\", buka pilihan peluasan dan aktifkan kategori ini. Kemudian, anda boleh menghantar segmen ini sebagai \"Bukan Muzik\" dan bukannya penaja. Sila baca panduan sekiranya anda keliru."},"multipleSegments":{"message":"Pelbagai Segmen"},"guidelines":{"message":"Garis Panduan"},"readTheGuidelines":{"message":"Baca Garis Panduan!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategori ada di sini!"},"categoryUpdate2":{"message":"Buka pilihan untuk melangkau perkenalan, pengeluaran luar, barang dagangan, dll."},"help":{"message":"Bantuan"},"GotIt":{"message":"Dah dapat","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Segmen ini besar. Jika seluruh video adalah mengenai satu topik, kemudian tukar daripada \"Langkau\" ke \"Seluruh Video\". Lihat garis panduan untuk maklumat lanjut."},"categoryPillTitleText":{"message":"Keseluruhan video ini dilabel sebagai kategori ini dan terlalu bersepadu erat untuk dapat dipisah"},"chapterNameTooltipWarning":{"message":"Sebuah nama bab anda ialah serupa dengan kategori. Anda patut guna kategori apabila mungkin sebaliknya."},"experiementOptOut":{"message":"Menarik diri daripada semua eksperimen masa depan","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Sembunyikan selamanya"},"questionButton":{"message":"Saya ada soalan"},"askAQuestion":{"message":"Tanya soalan"},"warningConfirmButton":{"message":"Saya memahami sebabnya"},"warningError":{"message":"Kesilapan apabila mencuba untuk mengakui amaran:"},"Donate":{"message":"Derma"},"considerDonating":{"message":"Bantu pembangunan dana"},"hideDonationLink":{"message":"Sembunyikan Pautan Derma"},"darkModeOptionsPage":{"message":"Mod Gelap Di Halaman Pilihan"},"helpPageThanksForInstalling":{"message":"Terima kasih kerana memasang SponsorBlock."},"helpPageReviewOptions":{"message":"Tolong semak pilihan di bawah"},"helpPageFeatureDisclaimer":{"message":"Banyak ciri dilumpuhkan secara lalai. Jika anda ingin langkau intro, outro, gunakan Invidious, dll. Bolehkan mereka di bawah. Anda boleh juga sembunyi/tunjuk elemen UI."},"helpPageHowSkippingWorks2":{"message":"Apabila anda melangkau sebuah segmen, anda akan dapat notis. Jika masa nampak salah mengundi turun dengan menekan undi turun! Anda boleh juga undi di dalam pop timbul."},"Submitting":{"message":"Menghantar"},"helpPageCopyOfDatabase2":{"message":"Kod sumber tersedia secara percuma. Jadi, walaupun sesuatu berlaku pada saya, penghantaran anda tidak hilang."},"Credits":{"message":"Penghargaan"},"LearnMore":{"message":"Ketahui Lebih Lanjut"},"FullDetails":{"message":"Perincian Penuh"},"CopyDownvoteButtonInfo":{"message":"Undi turun dan membuat salinan tempatan untuk anda hantar semula"},"OpenCategoryWikiPage":{"message":"Buka halaman wiki kategori ini."},"CopyAndDownvote":{"message":"Salin dan undi turun"},"ContinueVoting":{"message":"Teruskan Undian"},"ChangeCategoryTooltip":{"message":"Ini akan serta merta dikenakan pada segmen anda"},"downvote":{"message":"Undi turun"},"upvote":{"message":"Undi naik"},"hideSegment":{"message":"Sembunyikan segmen"},"skipSegment":{"message":"Langkau segmen"},"playChapter":{"message":"Main bab"},"SponsorTimeEditScrollNewFeature":{"message":"Gunakan roda tetikus anda sambil di atas kotak edit untuk melaraskan masa dengan cepat. Gabungan kekunci ctrl atau shift boleh digunakan untuk membaiki perubahan."},"categoryPillNewFeature":{"message":"Baharu! Tengok apabila video ialah penaja atau promosi diri sepenuhnya"},"dayAbbreviation":{"message":"h","description":"100d"},"hourAbbreviation":{"message":"j","description":"100h"},"optionsTabBehavior":{"message":"Tingkah Laku","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Antaramuka","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Pintasan papan kekunci","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Sandaran/Memulihkan","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Lain-Lain","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Langkau notis penampilan","description":"Option label"},"unbind":{"message":"Buka Ikatan","description":"Unbind keyboard shortcut"},"notSet":{"message":"Tidak ditetapkan"},"change":{"message":"Tukar"},"youtubeKeybindWarning":{"message":"Ini adalah dibina dalam pintasan YouTube. Adakah anda pasti anda mahu menggunakannya?"},"betaServerWarning":{"message":"Pelayan BETA ialah didayakan!"},"openOptionsPage":{"message":"Buka halaman pilihan"},"resetToDefault":{"message":"Set semula tetapan kepada asal"},"confirmResetToDefault":{"message":"Adakah anda pasti anda mahu menetapkan semula semua tetapan kepada nilai asalnya? Perkara ini tidak boleh diubah."},"exportSegments":{"message":"Eksport segmen"},"importSegments":{"message":"Import segmen"},"Import":{"message":"Import","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Tebusan Berjaya!"},"redeemFailed":{"message":"Kunci lesen tidak sah"},"hideUpsells":{"message":"Sembunyikan pilihan tidak tersedia tanpa pembayaran tambahan"},"redeem":{"message":"Tebus"},"enterLicenseKey":{"message":"Masukkan Kunci Lesen"},"unsubmittedSegmentCounts":{"message":"Anda pada masa ini mempunyai {0} di {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Anda pada masa ini tiada segmen belum dihantar","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"segmen belum dihantar","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"segmen belum dihantar","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"video","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Kosongkan semua segmen","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Adakah anda pasti anda mahu kosongkan semua segmen belum dihantar anda?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Tunjuk segmen","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Sembunyikan segmen","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID Video","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Kiraan Segmen","description":"Header of the unsubmitted segments list"},"actions":{"message":"Tindakan","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Kongsi sebagai URL"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/nl/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/nl/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Time-out van de verbinding. Controleer uw internetverbinding. Als uw internet werkt, is de server waarschijnlijk overbelast of offline."},"400":{"message":"Server zegt dat het verzoek ongeldig is"},"409":{"message":"Dit is al eerder ingediend"},"502":{"message":"De server lijkt overbelast te zijn. Probeer het over een paar seconden opnieuw."},"fullName":{"message":"SponsorBlock voor YouTube - Sponsorberichten overslaan","description":"Name of the extension."},"Description":{"message":"Overslaan van sponsors, vragen om te abonneren en meer in YouTube-video's. Rapporteer sponsors in video's die u bekijkt om anderen tijd te besparen.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanaal gewhitelist!"},"Segment":{"message":"segment"},"Segments":{"message":"segmenten"},"SegmentsCap":{"message":"Segmenten"},"Chapters":{"message":"Hoofdstukken"},"renderAsChapters":{"message":"Segmenten weergeven als hoofdstukken","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Huidig segment weergeven naast videotijd"},"showAutogeneratedChapters":{"message":"Toon hoofdstukken die automatisch gegenereerd zijn door YouTube"},"upvoteButtonInfo":{"message":"Stemmen op deze inzending"},"reportButtonTitle":{"message":"Rapporteren"},"reportButtonInfo":{"message":"Deze inzending als onjuist rapporteren."},"Dismiss":{"message":"Verwerpen"},"Loading":{"message":"Laden..."},"Hide":{"message":"Nooit weergeven"},"hitGoBack":{"message":"Druk op \"overslaan ongedaan maken\" om terug te gaan naar waar u vandaan komt."},"unskip":{"message":"Overslaan ongedaan maken"},"reskip":{"message":"Opnieuw overslaan"},"unmute":{"message":"Niet meer dempen"},"paused":{"message":"Gepauzeerd"},"manualPaused":{"message":"Timer gestopt"},"confirmMSG":{"message":"Om individuele waarden te bewerken of te verwijderen, klikt u op de info-knop of opent u de extensie-pop-up door op het extensie-pictogram in de rechterbovenhoek te klikken."},"clearThis":{"message":"Weet u zeker dat u dit wilt wissen?\n\n"},"Unknown":{"message":"Er was een fout bij het indienen van uw sponsortijdstippen. Probeer het later nog eens."},"sponsorFound":{"message":"Deze video heeft segmenten in de database!"},"sponsor404":{"message":"Geen segmenten gevonden"},"sponsorStart":{"message":"Segment begint nu"},"sponsorEnd":{"message":"Segment eindigt nu"},"sponsorCancel":{"message":"Segment aanmaken annuleren"},"noVideoID":{"message":"Geen YouTube-video gevonden.\nVernieuw het tabblad als dit onjuist is."},"refreshSegments":{"message":"Segmenten vernieuwen"},"success":{"message":"Gelukt!"},"voted":{"message":"Gestemd!"},"serverDown":{"message":"Het lijkt erop dat de server offline is. Neem onmiddellijk contact op met de ontwikkelaar."},"connectionError":{"message":"Er is een verbindingsfout opgetreden. Foutcode: "},"segmentsStillLoading":{"message":"Segmenten worden nog steeds geladen..."},"clearTimes":{"message":"Segmenten verwijderen"},"openPopup":{"message":"SponsorBlock-pop-up openen"},"closePopup":{"message":"Pop-up sluiten"},"closeIcon":{"message":"Pictogram voor sluiten"},"OpenSubmissionMenu":{"message":"Inzending-menu openen"},"sortSegments":{"message":"Segmenten sorteren"},"submitCheck":{"message":"Weet u zeker dat u dit wilt indienen?"},"whitelistChannel":{"message":"Kanaal whitelisten"},"removeFromWhitelist":{"message":"Kanaal verwijderen van whitelist"},"voteOnTime":{"message":"Stemmen op een segment"},"Submissions":{"message":"Inzendingen"},"savedPeopleFrom":{"message":"U heeft mensen gered van "},"viewLeaderboard":{"message":"Ranglijst"},"recordTimesDescription":{"message":"Indienen"},"submissionEditHint":{"message":"Sectiebewerking verschijnt nadat u op indienen hebt geklikt","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Tip: u kunt sneltoetsen voor het indienen instellen in de opties"},"clearTimesButton":{"message":"Tijdstippen wissen"},"Username":{"message":"Gebruikersnaam"},"setUsername":{"message":"Gebruikersnaam instellen"},"copyPublicID":{"message":"Publieke gebruikers-ID kopiëren"},"copySegmentID":{"message":"Segment-ID kopiëren"},"hideThis":{"message":"Dit verbergen"},"Options":{"message":"Opties"},"showButtons":{"message":"Knoppen op YouTube-speler weergeven"},"hideButtonsDescription":{"message":"Dit verbergt de knoppen die verschijnen op de YouTube-speler om segmenten over te slaan."},"showSkipButton":{"message":"Knop voor \"overslaan naar hoogtepunt\" op speler houden"},"showInfoButton":{"message":"Info-knop op YouTube-speler weergeven"},"autoHideInfoButton":{"message":"Infoknop automatisch verbergen"},"showDeleteButton":{"message":"Verwijderen-knop op YouTube-speler weergeven"},"enableViewTracking":{"message":"Bijhouden van het aantal keren overslaan inschakelen"},"whatViewTracking":{"message":"Deze functie houdt bij welke segmenten u heeft overgeslagen om gebruikers te laten weten hoezeer hun inzending anderen heeft geholpen en wordt samen met upvotes als meetwaarde gebruikt om ervoor te zorgen dat spam niet in de database terechtkomt. De extensie stuurt telkens wanneer u een segment overslaat een bericht naar de server. Hopelijk veranderen de meeste mensen deze instelling niet zodat de weergavenummers accuraat zijn. :)"},"enableViewTrackingInPrivate":{"message":"Bijhouden van het aantal keren overslaan inschakelen in privé-/incognito-tabbladen"},"enableTrackDownvotes":{"message":"Segment-tegenstemmen opslaan"},"whatTrackDownvotes":{"message":"Segmenten waarop u een tegenstem doet, blijven verborgen, zelfs na vernieuwen"},"trackDownvotesWarning":{"message":"Waarschuwing: als u dit uitschakelt, worden alle eerder opgeslagen tegenstemmen verwijderd"},"enableTrackDownvotesInPrivate":{"message":"Segmet downvotes in privé/incognito tabs opslaan"},"enableQueryByHashPrefix":{"message":"Opvragen via hash-voorvoegsel"},"whatQueryByHashPrefix":{"message":"In plaats van segmenten op te vragen bij de server met behulp van de video-ID, worden de eerste 4 tekens van de hash van de video-ID verzonden. Deze server zal gegevens terugsturen voor alle video's met een vergelijkbare hash."},"enableShowCategoryWithoutPermission":{"message":"Categorieën in indieningsmenu weergeven, zelfs zonder toestemming voor indienen"},"whatShowCategoryWithoutPermission":{"message":"Voor sommige categorieën is toestemming nodig om in te dienen vanwege minimale reputatie-eisen"},"showNotice":{"message":"Melding opnieuw weergeven"},"showSkipNotice":{"message":"Melding weergeven nadat een segment is overgeslagen"},"showUpcomingNotice":{"message":"Toon een melding voor een segment start"},"showCategoryGuidelines":{"message":"Categorie-hulp weergeven"},"noticeVisibilityMode0":{"message":"Volledige grootte overslaan-meldingen"},"noticeVisibilityMode1":{"message":"Kleine overslaan-meldingen voor automatisch overslaan"},"noticeVisibilityMode2":{"message":"Allemaal kleine overslaan-meldingen"},"noticeVisibilityMode3":{"message":"Vervaagde overslaan-meldingen"},"noticeVisibilityMode4":{"message":"Allemaal vervaagde overslaan-meldingen"},"longDescription":{"message":"SponsorBlock laat u sponsoring, intro's, outro's, herinneringen om te abonneren en andere vervelende onderdelen van YouTube-video's overslaan. SponsorBlock is een gecrowdsourcete browser-extensie waarmee iedereen de begin- en eindtijd van gesponsorde segmenten en andere segmenten van YouTube-video's kan indienen. Zodra één persoon deze informatie indient, zal iedereen met deze extensie het gesponsorde segment overslaan. U kunt ook secties zonder muziek in muziekvideo's overslaan.","description":"Full description of the extension on the store pages."},"website":{"message":"Website","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Broncode","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"De melding is bijgewerkt!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Als het u nog steeds niet bevalt, druk dan op de knop \"nooit weergeven\".","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Segment overslaan","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Segment starten/stoppen","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Inzending-menu openen","description":"Keybind label"},"setSubmitKeybind":{"message":"Segmenten indienen","description":"Keybind label"},"setPreviewKeybind":{"message":"Bekijk segment","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Overslaanbericht sluiten","description":"Keybind label"},"nextChapterKeybind":{"message":"Volgend hoofdstuk","description":"Keybind label"},"previousChapterKeybind":{"message":"Vorig hoofdstuk","description":"Keybind label"},"keybindDescription":{"message":"Selecteer een toets door hem in te typen en kies de modificatietoetsen die u wilt gebruiken."},"disableSkipping":{"message":"Overslaan is ingeschakeld"},"enableSkipping":{"message":"Overslaan is uitgeschakeld"},"yourWork":{"message":"Uw werk","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Foutcode: "},"skip":{"message":"Overslaan"},"mute":{"message":"Dempen"},"full":{"message":"Volledige video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} overslaan?"},"mute_category":{"message":"{0} dempen?"},"skip_to_category":{"message":"Overslaan naar {0}?","description":"Used for skipping to things (Skip to Highlight)"},"skipped":{"message":"{0} overgeslagen","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} gedempt","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Overgeslagen naar {0}","description":"Used for skipping to things (Skipped to Highlight)"},"disableAutoSkip":{"message":"Automatisch overslaan uitschakelen"},"enableAutoSkip":{"message":"Automatisch overslaan inschakelen"},"audioNotification":{"message":"Geluidsmelding bij overslaan"},"audioNotificationDescription":{"message":"Geluidsmelding bij overslaan zal een geluid afspelen wanneer een segment wordt overgeslagen. Indien uitgeschakeld (of als automatisch overslaan uitgeschakeld is), wordt er geen geluid afgespeeld."},"showTimeWithSkips":{"message":"Tijd weergeven met overslaan verwijderd"},"showTimeWithSkipsDescription":{"message":"Deze tijd verschijnt tussen haakjes naast de huidige tijd onder de tijdbalk. Dit geeft de totale videoduur min alle segmenten weer. Dit is inclusief segmenten die gemarkeerd zijn als alleen \"weergeven in tijdbalk\"."},"youHaveSkipped":{"message":"U heeft overgeslagen: "},"minLower":{"message":"minuut"},"minsLower":{"message":"minuten"},"hourLower":{"message":"uur"},"hoursLower":{"message":"uren"},"youHaveSavedTime":{"message":"U heeft mensen bespaard:","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" van hun leven","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Controleer status.sponsor.ajay.app voor de serverstatus."},"changeUserID":{"message":"Uw privé-gebruikers-ID importeren/exporteren"},"whatChangeUserID":{"message":"Dit moet privé gehouden worden. Dit is als een wachtwoord en mag met niemand gedeeld worden. Als iemand dit heeft, kan hij zich voordoen als u. Klik op het klembordpictogram in de pop-up als u op zoek bent naar uw publieke gebruikers-ID."},"setUserID":{"message":"Privé-gebruikers-ID instellen"},"userIDChangeWarning":{"message":"Waarschuwing: wijzigen van de privé-gebruikers-ID is permanent. Weet u zeker dat u dit wilt doen? Zorg ervoor dat u een back-up maakt van uw oude ID, voor het geval dat."},"createdBy":{"message":"Gemaakt door"},"supportOtherSites":{"message":"Ondersteuning voor YouTube-sites van derden"},"supportOtherSitesDescription":{"message":"YouTube-clients van derden ondersteunen. Om ondersteuning in te schakelen, moet u de extra machtigingen accepteren.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Ondersteunde sites: "},"optionsInfo":{"message":"Ondersteuning voor Invidious inschakelen, automatisch overslaan uitschakelen, knoppen verbergen en meer."},"addInvidiousInstance":{"message":"Client-instantie van derden toevoegen"},"addInvidiousInstanceDescription":{"message":"Een aangepaste instantie toevoegen. Dit moet worden opgemaakt met ALLEEN het domein. Bijvoorbeeld: invidious.ajay.app"},"add":{"message":"Toevoegen"},"addInvidiousInstanceError":{"message":"Dit is een ongeldig domein. Dit moet ALLEEN het domeindeel bevatten. Voorbeeld: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Lijst met Invidious-instanties herstellen"},"resetInvidiousInstanceAlert":{"message":"U staat op het punt om de lijst met Invidious-instanties te herstellen"},"currentInstances":{"message":"Huidige instanties:"},"minDuration":{"message":"Minimale tijdsduur (seconden):"},"minDurationDescription":{"message":"Segmenten korter dan de ingestelde waarde worden niet overgeslagen of weergegeven in de speler."},"enableManualSkipOnFullVideo":{"message":"Handmatig overslaan gebruiken wanneer een label voor volledige video bestaat"},"whatManualSkipOnFullVideo":{"message":"Voor mensen die de video ononderbroken willen bekijken als deze volledig gesponsord of zelfpromotie is."},"skipNoticeDuration":{"message":"Duur van overslaan-melding (seconden):"},"skipNoticeDurationDescription":{"message":"De overslaan-melding blijft ten minste zo lang op het scherm staan. Voor handmatig overslaan kan dit misschien zelfs langer zichtbaar zijn."},"shortCheck":{"message":"De volgende inzending is korter dan uw \"minimale tijdsduur\"-instelling. Dit kan betekenen dat dit al is ingediend en genegeerd wordt door deze optie. Weet u zeker dat u dit wilt indienen?"},"liveOrPremiere":{"message":"Indienen op een actieve livesteam of première is niet toegestaan. Wacht tot hij geëindigd is, vernieuw dan de pagina en controleer of de segmenten nog geldig zijn."},"showUploadButton":{"message":"Uploaden-knop weergeven"},"customServerAddress":{"message":"SponsorBlock-serveradres"},"customServerAddressDescription":{"message":"Het adres dat SponsorBlock gebruikt om oproepen te doen naar de server.\nTenzij u uw eigen serverinstantie heeft, moet dit niet worden gewijzigd."},"save":{"message":"Opslaan"},"reset":{"message":"Herstellen"},"customAddressError":{"message":"Dit adres is niet in de juiste vorm. Zorg ervoor dat u http:// of https:// aan het begin heeft staan en geen schuine streep op het einde."},"areYouSureReset":{"message":"Weet u zeker dat u dit wilt herstellen?"},"mobileUpdateInfo":{"message":"m.youtube.com wordt nu ondersteund"},"exportOptions":{"message":"Alle opties importeren/exporteren"},"exportOptionsCopy":{"message":"Bewerken/kopiëren"},"exportOptionsDownload":{"message":"Opslaan naar bestand"},"exportOptionsUpload":{"message":"Laden uit bestand"},"whatExportOptions":{"message":"Dit is uw volledige configuratie in JSON. Dit is inclusief uw privé-gebruikers-ID, dus zorg ervoor dat u dit verstandig deelt."},"setOptions":{"message":"Opties instellen"},"exportOptionsWarning":{"message":"Waarschuwing: het wijzigen van de opties is permanent en kan uw installatie breken. Weet u zeker dat u dit wilt doen? Zorg ervoor dat u een back-up maakt van uw oude installatie, voor het geval dat."},"incorrectlyFormattedOptions":{"message":"Deze JSON is niet correct opgemaakt. Uw opties zijn niet gewijzigd."},"confirmNoticeTitle":{"message":"Segment indienen"},"submit":{"message":"Indienen"},"cancel":{"message":"Annuleren"},"delete":{"message":"Verwijderen"},"preview":{"message":"Voorbeeld"},"unsubmitted":{"message":"Niet ingediend"},"inspect":{"message":"Inspecteren"},"edit":{"message":"Bewerken"},"copyDebugInformation":{"message":"Foutopsporingsinformatie kopiëren naar klembord"},"copyDebugInformationFailed":{"message":"Kon niet schrijven naar klembord"},"copyDebugInformationOptions":{"message":"Kopieert informatie naar het klembord die aan een ontwikkelaar moet worden doorgegeven bij het melden van een bug of wanneer een ontwikkelaar dit vraagt. Gevoelige informatie zoals uw gebruikers-ID, gewhiteliste kanalen en aangepast serveradres zijn verwijderd. Het bevat echter wel informatie zoals uw useragent, browser, besturingssysteem en extensie-versienummer. "},"copyDebugInformationComplete":{"message":"De foutopsporingsinformatie is gekopieerd naar het klembord. Voel u vrij om alle informatie die u liever niet wilt delen, te verwijderen. Sla dit op in een tekstbestand of plak het in het foutenrapport."},"keyAlreadyUsed":{"message":"Deze snelkoppeling is gebonden aan een andere actie. Kies een andere."},"to":{"message":"tot","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Gekopieerd!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Inclusief vlotte overgangen"},"generic_guideline2":{"message":"Speelt af alsof niets overgeslagen werd"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Betaalde promotie, betaalde aanbevelingen en directe reclame. Niet voor zelfpromotie of gratis uitroepen naar zaken/makers/websites/producten waar ze van houden."},"category_sponsor_guideline1":{"message":"Betaalde promoties"},"category_sponsor_guideline2":{"message":"Niet voor donaties of aangepaste koopwaar"},"category_selfpromo":{"message":"Onbetaalde promotie of zelfpromotie"},"category_selfpromo_description":{"message":"Vergelijkbaar met \"sponsor\", behalve voor onbetaalde of zelfpromotie. Dit is inclusief secties over koopwaar, donaties of informatie over met wie ze hebben samengewerkt."},"category_selfpromo_guideline1":{"message":"Donaties, lidmaatschappen en aangepaste koopwaar"},"category_selfpromo_guideline2":{"message":"Gratis uitroepen die niets aan de video toevoegen"},"category_selfpromo_guideline3":{"message":"Niet voor bedrijfsontworpen producten en koopwaar"},"category_exclusive_access":{"message":"Exclusieve toegang"},"category_exclusive_access_description":{"message":"Alleen voor het labelen van volledige video's. Wordt gebruikt wanneer een video een product, dienst of locatie laat zien waartoe men gratis of gesubsidieerd toegang heeft gekregen."},"category_exclusive_access_pill":{"message":"Deze video toont een product, dienst of locatie waartoe men gratis of gesubsidieerd toegang heeft gekregen","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Volledige video laat iets zien met gratis of gesubsidieerde toegang"},"category_interaction":{"message":"Interactieherinnering (abonneren)"},"category_interaction_description":{"message":"Als er een korte herinnering is om ze leuk te vinden, u te abonneren of ze te volgen in het midden van de inhoud. Als het lang is of over iets specifieks gaat, moet het in plaats daarvan onder zelfpromotie vallen."},"category_interaction_guideline1":{"message":"Korte herinneringen om leuk te vinden, te abonneren of te volgen"},"category_interaction_guideline2":{"message":"Bevat indirecte herinneringen voor commentaar"},"category_interaction_guideline3":{"message":"Niet voor algemene promotie, roept alleen op tot actie"},"category_interaction_short":{"message":"Interactieherinnering"},"category_intro":{"message":"Onderbreking/intro-animatie"},"category_intro_description":{"message":"Een interval zonder werkelijke inhoud. Kan een pauze zijn, een statisch beeld, een herhalende animatie. Dit moet niet worden gebruikt voor overgangen die informatie bevatten."},"category_intro_short":{"message":"Onderbreking"},"category_intro_guideline1":{"message":"Interval zonder werkelijke inhoud"},"category_intro_guideline2":{"message":"Niet voor overgangen met informatie"},"category_outro":{"message":"Eindkaarten/aftiteling"},"category_outro_description":{"message":"Aftiteling of wanneer de YouTube-eindkaarten verschijnen. Niet voor conclusies met informatie."},"category_outro_guideline1":{"message":"Inhoud niet toevoegen, zelfs niet als eindkaarten op het scherm staan"},"category_preview_description":{"message":"Collectie van clips die laten zien wat er in deze video of andere video's komt in een serie waar alle informatie later in de video wordt herhaald."},"category_preview_guideline1":{"message":"Clips die later of in een toekomstige video verschijnen"},"category_preview_guideline2":{"message":"Samenvatting van een vorige video"},"category_preview_guideline3":{"message":"Niet voor secties die extra inhoud toevoegen"},"category_filler_guideline2":{"message":"Afleidingen, bloopers, herhalingen"},"category_filler_guideline3":{"message":"Niet voor scènes vereist om het onderwerp te begrijpen"},"category_music_offtopic":{"message":"Muziek: sectie niet-muziek"},"category_music_offtopic_description":{"message":"Alleen voor gebruik in muziekvideo's. Dit mag alleen worden gebruikt voor secties van muziekvideo's die nog niet door een andere categorie worden bedekt."},"category_music_offtopic_short":{"message":"Niet-muziek"},"category_music_offtopic_guideline1":{"message":"Secties niet in officiële releases"},"category_music_offtopic_guideline2":{"message":"Niet-muziek in een live optreden"},"category_poi_highlight":{"message":"Hoogtepunt"},"category_poi_highlight_description":{"message":"Het deel van de video waar de meeste mensen naar op zoek zijn. Gelijkaardig aan \"video begint bij x\"-opmerkingen."},"category_poi_highlight_guideline1":{"message":"Sectie die de meeste mensen zoeken"},"category_poi_highlight_guideline2":{"message":"Kan context overslaan"},"category_poi_highlight_guideline3":{"message":"Kan naar titel of pictogram overslaan"},"category_chapter":{"message":"Hoofdstuk"},"category_chapter_description":{"message":"Hoofdstukken met een aangepaste naam die de belangrijkste delen van een video beschrijven."},"category_chapter_guideline1":{"message":"Merknamen van sponsors niet vermelden"},"category_chapter_guideline2":{"message":"Grotere hoofdstukken gebruiken voor algemene secties"},"category_chapter_guideline3":{"message":"Kleinere hoofdstukken kunnen in grotere worden geplaatst"},"category_livestream_messages":{"message":"Livestream: donaties/lezen van berichten"},"category_livestream_messages_short":{"message":"Lezen van berichten"},"autoSkip":{"message":"Automatisch overslaan"},"manualSkip":{"message":"Handmatig overslaan"},"showOverlay":{"message":"Weergeven in tijdbalk"},"disable":{"message":"Uitschakelen"},"autoSkip_POI":{"message":"Automatisch overslaan naar het begin"},"manualSkip_POI":{"message":"Vragen wanneer de video wordt geladen"},"showOverlay_POI":{"message":"Weergeven in tijdbalk"},"showOverlay_full":{"message":"Label weergeven"},"showOverlay_chapter":{"message":"Hoofdstukken weergeven"},"autoSkipOnMusicVideos":{"message":"Automatisch alle segmenten overslaan wanneer er een niet-muziek-segment is"},"muteSegments":{"message":"Segmenten toestaan die audio dempen in plaats van overslaan"},"fullVideoSegments":{"message":"Een pictogram weergeven wanneer de volledige video een advertentie is","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"previewColor":{"message":"Niet ingediend kleur","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Kleur van tijdbalk"},"category":{"message":"Categorie"},"skipOption":{"message":"Manier van overslaan","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"Bèta-testserver inschakelen"},"whatEnableTestingServer":{"message":"Uw inzendingen en stemmen ZULLEN NIET GEREGISTREERD WORDEN op de hoofdserver. Gebruik dit alleen om te testen."},"testingServerWarning":{"message":"Alle inzendingen en stemmen ZULLEN NIET GEREGISTREERD WORDEN op de hoofdserver wanneer u met de testserver verbonden bent. Zorg ervoor dat u dit uitschakelt wanneer u echte inzendingen wilt maken."},"bracketNow":{"message":"(nu)"},"moreCategories":{"message":"Meer categorieën"},"chooseACategory":{"message":"Een categorie kiezen"},"enableThisCategoryFirst":{"message":"Om segmenten met de categorie \"{0}\" in te dienen, moet u deze in de opties inschakelen. U wordt nu doorgestuurd naar de opties.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Waarschuwing: dit type segment kan maximaal één keer tegelijk actief zijn. Meerdere segmenten indienen zal weergave van een willekeurig segment veroorzaken."},"youMustSelectACategory":{"message":"U moet een categorie selecteren voor alle segmenten die u indient!"},"bracketEnd":{"message":"(einde)"},"End":{"message":"Einde","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"verborgen: tegenstem"},"hiddenDueToDuration":{"message":"verborgen: te kort"},"manuallyHidden":{"message":"handmatig verborgen"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Kanaal-ID is nog niet geladen. Als u een ingesloten video gebruikt, probeer dan in plaats daarvan de YouTube-homepagina. Dit kan ook worden veroorzaakt door wijzigingen in de YouTube-lay-out. Als u denkt dat dit het geval is, maak dan hier een opmerking:"},"invidiousPermissionRefresh":{"message":"De browser heeft de toestemming ingetrokken die nodig is om te functioneren op Invidious en andere sites van derden. Klik op de knop hieronder om deze toestemming opnieuw te activeren."},"acceptPermission":{"message":"Machtiging accepteren"},"permissionRequestSuccess":{"message":"Verzoek om machtiging gelukt!"},"permissionRequestFailed":{"message":"Verzoek om machtiging mislukt. Heeft u op geweigerd geklikt?"},"adblockerIssueWhitelist":{"message":"Als u dit niet kunt oplossen, schakel dan de instelling 'kanaalcontrole forceren vóór overslaan' uit omdat SponsorBlock niet in staat is de kanaalinformatie voor deze video op te halen"},"forceChannelCheck":{"message":"Kanaalcontrole forceren vóór overslaan"},"whatForceChannelCheck":{"message":"Standaard worden segmenten direct overgeslagen voordat het kanaal bekend is. Sommige segmenten aan het begin van de video kunnen worden overgeslagen op gewhiteliste kanalen. Het inschakelen van deze optie voorkomt dit, maar zorgt ervoor dat het overslaan een kleine vertraging heeft omdat het verkrijgen van de kanaal-ID enige tijd kan duren. Deze vertraging kan onopgemerkt blijven als u snel internet heeft."},"forceChannelCheckPopup":{"message":"Overweeg om \"kanaalcontrole forceren vóór overslaan\" in te schakelen"},"downvoteDescription":{"message":"Verkeerde timing"},"incorrectVote":{"message":"Onjuist"},"harmfulVote":{"message":"Schadelijk","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Categorie wijzigen"},"nonMusicCategoryOnMusic":{"message":"Deze video is gecategoriseerd als muziek. Weet u zeker dat dit een sponsor heeft? Als dit eigenlijk een \"niet-muzieksegment\" is, open dan de extensie-opties en schakel deze categorie in. Vervolgens kunt u dit segment indienen als \"niet-muziek\" in plaats van als sponsor. Lees de richtlijnen als u in de war bent."},"multipleSegments":{"message":"Meerdere segmenten"},"guidelines":{"message":"Richtlijnen"},"readTheGuidelines":{"message":"Lees de richtlijnen!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Categorieën zijn er!"},"categoryUpdate2":{"message":"Open de opties om intro's, outro's, koopwaar,... over te slaan."},"help":{"message":"Help"},"GotIt":{"message":"Begrepen","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Dit segment is groot. Als de hele video over één onderwerp gaat, verander dan van \"overslaan\" naar \"volledige video\". Zie de richtlijnen voor meer informatie."},"categoryPillTitleText":{"message":"De hele video is gelabeld als deze categorie en is te strak geïntegreerd om te kunnen scheiden"},"chapterNameTooltipWarning":{"message":"Een van uw hoofdstuknamen lijkt op een categorie. Gebruik in plaats daarvan waar mogelijk categorieën."},"experiementOptOut":{"message":"Uitschrijven van alle toekomstige experimenten","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Voor altijd verbergen"},"warningChatInfo":{"message":"Het viel ons op dat u enkele veel voorkomende fouten maakte. We waarderen uw werk tot nu toe zeer, maar we streven hier naar perfectie, dus zelfs heel kleine foutjes zijn belangrijk :)"},"questionButton":{"message":"Ik heb een vraag"},"warningConfirmButton":{"message":"Ik begrijp de reden"},"warningError":{"message":"Fout bij het bevestigen van de waarschuwing:"},"deArrowMessageRecieved":{"message":"Je hebt een tip van een moderator ontvangen"},"Donate":{"message":"Doneren"},"considerDonating":{"message":"Ontwikkeling steunen"},"hideDonationLink":{"message":"Donatiekoppeling verbergen"},"darkModeOptionsPage":{"message":"Donkere modus op opties-pagina"},"helpPageThanksForInstalling":{"message":"Bedankt voor het installeren van SponsorBlock."},"helpPageReviewOptions":{"message":"Bekijk de onderstaande opties"},"helpPageFeatureDisclaimer":{"message":"Veel functies zijn standaard uitgeschakeld. Als u intro's of outro's wilt overslaan, Invidious wilt gebruiken, enz., schakelt u ze hieronder in. U kunt ook UI-elementen verbergen/weergeven."},"helpPageHowSkippingWorks2":{"message":"Als u een segment overslaat, krijgt u een bericht. Als de timing verkeerd lijkt, stem dan door op tegenstemmen te klikken! U kunt ook stemmen in de pop-up."},"Submitting":{"message":"Indienen"},"helpPageCopyOfDatabase2":{"message":"De broncode is vrij beschikbaar. Dus, zelfs als mij iets overkomt, zijn uw inzendingen niet verloren."},"Credits":{"message":"Dank aan"},"LearnMore":{"message":"Meer informatie"},"FullDetails":{"message":"Volledige details"},"CopyDownvoteButtonInfo":{"message":"Doet een tegenstem en maakt een lokale kopie aan die u opnieuw kunt indienen"},"OpenCategoryWikiPage":{"message":"Wikipagina van deze categorie openen."},"CopyAndDownvote":{"message":"Kopiëren en tegenstemmen"},"ContinueVoting":{"message":"Doorgaan met stemmen"},"ChangeCategoryTooltip":{"message":"Dit is direct van toepassing op uw segmenten"},"downvote":{"message":"Tegenstemmen"},"upvote":{"message":"Stemmen"},"hideSegment":{"message":"Segment verbergen"},"skipSegment":{"message":"Segment overslaan"},"playChapter":{"message":"Hoofdstuk afspelen"},"SponsorTimeEditScrollNewFeature":{"message":"Gebruik het muiswiel terwijl u over het invoerveld beweegt om de tijd snel aan te passen. Combinaties van de ctrl- of shift-toets kunnen worden gebruikt om de wijzigingen te verfijnen."},"categoryPillNewFeature":{"message":"Nieuw! Zie wanneer een video volledig gesponsord of zelfpromotie is"},"dayAbbreviation":{"message":" d","description":"100d"},"hourAbbreviation":{"message":" h","description":"100h"},"optionsTabBehavior":{"message":"Gedrag","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interface","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Sneltoetsen","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Back-up maken/herstellen","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Overige","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Uiterlijk van overslaan-meldingen","description":"Option label"},"unbind":{"message":"Ontkoppelen","description":"Unbind keyboard shortcut"},"notSet":{"message":"Niet ingesteld"},"change":{"message":"Wijzigen"},"youtubeKeybindWarning":{"message":"Dit is een ingebouwde YouTube-snelkoppeling. Weet u zeker dat u deze wilt gebruiken?"},"betaServerWarning":{"message":"BETAserver is ingeschakeld!"},"openOptionsPage":{"message":"Pagina met opties openen"},"resetToDefault":{"message":"Instellingen terugzetten op standaard"},"confirmResetToDefault":{"message":"Weet u zeker dat u alle instellingen wilt terugzetten naar hun standaardwaarden? Dit kan niet ongedaan gemaakt worden."},"exportSegments":{"message":"Segmenten exporteren"},"importSegments":{"message":"Segmenten importeren"},"Import":{"message":"Importeren","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Inwisselen geslaagd!"},"redeemFailed":{"message":"Licentiesleutel is ongeldig"},"hideUpsells":{"message":"Opties verbergen die niet beschikbaar zijn zonder extra betaling"},"redeem":{"message":"Inwisselen"},"enterLicenseKey":{"message":"Licentiesleutel invoeren"},"unsubmittedSegmentCounts":{"message":"U hebt momenteel {0} in {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"U hebt momenteel geen niet-ingediende segmenten","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"niet-ingediend segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"niet-ingediende segmenten","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"video's","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Alle segmenten wissen","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Weet u zeker dat u al uw niet-ingediende segmenten wilt wissen?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Segmenten weergeven","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Segmenten verbergen","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video-ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Aantal segmenten","description":"Header of the unsubmitted segments list"},"actions":{"message":"Acties","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Delen als URL"},"allowScrollingToEdit":{"message":"Scrollen toestaan om tijdstippen te bewerken"},"CanvasMissing":{"message":"Canvas ontbreekt","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"FailedToLoad":{"message":"Laden mislukt","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Titel formaat"},"Disabled":{"message":"Uitgeschakeld"},"onAllPages":{"message":"Op alle pagina's","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Op alle pagina's behalve videopagina's","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Enable":{"message":"Inschakelen"},"Titles":{"message":"Titels","description":"Referring to titles of YouTube videos"},"ShowOriginal":{"message":"Originele details weergeven"},"ShowModified":{"message":"Gewijzigde details weergeven"},"showGuidelineHelp":{"message":"Richtlijn hulp weergeven","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Vermijd overdreven gezichtsuitdrukkingen","description":"Referring to the thumbnail of a video"},"howItWorks":{"message":"Hoe het werkt"},"privacyPolicy":{"message":"Privacybeleid"},"termsOfUse":{"message":"Gebruiksvoorwaarden"},"areYouSureDeleteConfig":{"message":"Weet u zeker dat u deze configuratie wilt verwijderen?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Nieuwe configuratie"},"DeleteConfiguration":{"message":"Configuratie verwijderen"},"ConfigurationName":{"message":"Configuratienaam"},"dearrowStatsMessageTitlePart":{"message":"{titles} titel ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} titels ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"requiresUblock":{"message":"uBlock Origin vereist"},"zoomToFillUnsupported":{"message":"SponsorBlock is niet compatibel met de extensie \"Zoom to Fill\". Er zijn veel alternatieven die u in plaats daarvan kunt gebruiken die naar behoren zullen werken."},"freeTrialStarted":{"message":"Uw gratis proefperiode is met succes gestart. Bezoek YouTube om het te testen"},"freeTrialEnded":{"message":"Uw gratis proefperiode is voorbij"},"freeTrialPrompt":{"message":"Als u het een uurtje wilt uitproberen, dan kunt u via de onderstaande knop een gratis proefperiode starten."},"startFreeTrial":{"message":"Start gratis proefperiode"},"freeAccessRequested":{"message":"U bent met succes geregistreerd voor gratis toegang. U krijgt een melding wanneer gratis toegang is verleend."},"freeAccessComplete":{"message":"Gefeliciteerd! U heeft nu gratis toegang tot DeArrow"},"DeArrowNotActivated":{"message":"DeArrow is niet geactiveerd"},"ActivateDeArrow":{"message":"Activeer DeArrow"},"DeArrowIsActivated":{"message":"DeArrow is met succes geactiveerd"},"Close":{"message":"Sluiten"},"ViewLicenseKey":{"message":"Licentiesleutel weergeven"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/no/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/no/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Tidsavbrudd for tilkobling. Sjekk internettilkoblingen din. Hvis internettet ditt virker, er tjeneren sannsynligvis overbelastet eller nede."},"400":{"message":"Tjeneren sa at denne forespørselen var ugyldig"},"409":{"message":"Dette har allerede blitt sendt inn tidligere"},"502":{"message":"Tjeneren ser ut til å være overbelastet. Prøv igjen om noen sekunder."},"fullName":{"message":"SponsorBlock for YouTube - Hopp over sponsinger","description":"Name of the extension."},"Description":{"message":"Hopp over sponsinger, abonnementstigging og mer på YouTube-videoer. Rapporter inn sponsorer på videoer du ser på for å spare andre sin tid.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanalen ble hvitelistet!"},"Segment":{"message":"segment"},"Segments":{"message":"segmenter"},"SegmentsCap":{"message":"Segmenter"},"Chapters":{"message":"Kapitler"},"renderAsChapters":{"message":"Vis segmenter som kapitler","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Vis gjeldende Segment utenom videotid"},"showAutogeneratedChapters":{"message":"Vis kapitler automatisk generert av YouTube"},"upvoteButtonInfo":{"message":"Gi plusstemme til denne innsendingen"},"reportButtonTitle":{"message":"Rapporter"},"reportButtonInfo":{"message":"Rapporter inn denne innsendingen som en feil."},"Dismiss":{"message":"Lukk"},"Loading":{"message":"Laster..."},"Hide":{"message":"Aldri vis"},"hitGoBack":{"message":"Klikk \"Angre hopp\" for å gå til dit du hoppet fra."},"unskip":{"message":"Angre hopp"},"reskip":{"message":"Hopp igjen"},"unmute":{"message":"Skru av demping"},"paused":{"message":"På pause"},"manualPaused":{"message":"Tidtaker stoppet"},"confirmMSG":{"message":"For å redigere eller slette individuelle verdier, klikk på infoknappen eller åpne utvidelsens oppsprett ved å klikke på utvidelsesikonet i øvre høyre hjørne."},"clearThis":{"message":"Er du sikker på at du vil tømme dette?\n\n"},"Unknown":{"message":"Det oppstod en feil under innsending av sponsortidene dine, vennligst prøv igjen senere."},"sponsorFound":{"message":"Denne videoen har segmenter i databasen!"},"sponsor404":{"message":"Ingen segmenter ble funnet"},"sponsorStart":{"message":"Segmentet starter nå"},"sponsorEnd":{"message":"Segmentet slutter nå"},"sponsorCancel":{"message":"Avbryt opprettelse av segment"},"noVideoID":{"message":"Ingen YouTube-video ble funnet.\nHvis dette er feil, oppfrisk fanen."},"refreshSegments":{"message":"Oppdater segmenter"},"success":{"message":"Suksess!"},"voted":{"message":"Du har stemt!"},"serverDown":{"message":"Det ser ut til at tjeneren er nede. Kontakt utvikleren umiddelbart."},"connectionError":{"message":"En tilkoblingsfeil har oppstått. Feilkode: "},"segmentsStillLoading":{"message":"Segmenter laster fortsatt..."},"clearTimes":{"message":"Tøm segmenter"},"openPopup":{"message":"Åpne SponsorBlock-oppsprett"},"closePopup":{"message":"Lukk oppsprett"},"closeIcon":{"message":"Lukk ikon"},"OpenSubmissionMenu":{"message":"Åpne innsendingsmenyen"},"OpenCasualVoteMenu":{"message":"Åpne menyen i uformell modus"},"sortSegments":{"message":"Sorter Segmenter"},"submitCheck":{"message":"Er du sikker på at du vil sende inn dette?"},"whitelistChannel":{"message":"Hvitelist kanalen"},"removeFromWhitelist":{"message":"Fjern kanalen fra hvitelisten"},"voteOnTime":{"message":"Stem på et segment"},"Submissions":{"message":"Innsendinger"},"savedPeopleFrom":{"message":"Du har spart folk fra "},"viewLeaderboard":{"message":"Toppliste"},"recordTimesDescription":{"message":"Send"},"submissionEditHint":{"message":"Seksjonsredigering vil dukke opp etter at du har klikket på «Send inn»","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Hint: Du kan sette opp hurtigtaster for innsending i innstillingene"},"clearTimesButton":{"message":"Tøm tidspunkter"},"Username":{"message":"Brukernavn"},"setUsername":{"message":"Angi brukernavn"},"copyPublicID":{"message":"Kopiér offentlig bruker-ID"},"copySegmentID":{"message":"Kopier Segment-ID"},"hideThis":{"message":"Skjul dette"},"Options":{"message":"Valg"},"showButtons":{"message":"Vis knapper på YouTube-avspilleren"},"hideButtonsDescription":{"message":"Dette skjuler knappene som dukker opp på YouTube-avspilleren for å sende inn hoppesegmenter."},"showSkipButton":{"message":"Behold Hopp til høydepunkt-knappen på avspilleren"},"showInfoButton":{"message":"Vis infoknappen på YouTube-avspilleren"},"autoHideInfoButton":{"message":"Skjul infoknappen automatisk"},"showDeleteButton":{"message":"Vis Slett-knappen på YouTube-avspilleren"},"enableViewTracking":{"message":"Skru på telling av hopp"},"whatViewTracking":{"message":"Denne funksjonen sporer hvilke segmenter du har hoppet over, sånn at brukere vet hvor mye bidragene deres har hjulpet andre, og brukes som et målesystem sammen med plusstemmer for å sikre at spam ikke kommer inn i databasen. Utvidelsen sender en melding til tjeneren hver gang du hopper over et segment. Forhåpentligvis endrer ikke de fleste folk på denne innstillingene, sånn at visningstallene er nøyaktige. :)"},"enableViewTrackingInPrivate":{"message":"Aktiver telling av antall hopp i privat/inkognito-faner"},"enableTrackDownvotes":{"message":"Lagre segment-downvotes"},"whatTrackDownvotes":{"message":"Alle segmenter du stemmer ned, vil forbli skjult selv etter oppdatering"},"trackDownvotesWarning":{"message":"Advarsel: Deaktivering av dette vil slette alle tidligere lagrede nedstemmer"},"enableTrackDownvotesInPrivate":{"message":"Lagre segment nedstemming i privat-/inkognitofane"},"enableQueryByHashPrefix":{"message":"Forespør ut i fra saltings-prefiks"},"whatQueryByHashPrefix":{"message":"I stedet for å forespørre segmenter fra tjeneren ut i fra video-ID-en, blir de første 4 tegnene i saltingskoden til video-ID-en sendt. Denne tjeneren vil svare tilbake med data for alle videoer med lignende saltingskoder."},"showNotice":{"message":"Vis varselet igjen"},"showSkipNotice":{"message":"Vis varsel etter at et segment har blitt hoppet over"},"showCategoryGuidelines":{"message":"Vis kategorihjelp"},"noticeVisibilityMode0":{"message":"Hopp over-varsel i full størrelse"},"noticeVisibilityMode1":{"message":"Små hopp over-varsler for autohopp"},"noticeVisibilityMode2":{"message":"Alle små hopp over-varsler"},"noticeVisibilityMode3":{"message":"Tonet hopp over-varsel for autohopp"},"noticeVisibilityMode4":{"message":"Alle tonede hopp over-varsler"},"longDescription":{"message":"SponsorBlock lar deg hoppe over sponsorer, introer, outro-er, abonnementspåminnelser, og andre irriterende deler av YouTube-videoer. SponsorBlock er en fellesskapsdrevet nettleserutvidelser som lar alle sende inn start- og sluttidspunktene til sponsede segmenter og andre segmenter i YouTube-videoer. Når en person sender inn denne informasjonen, vil alle andre med denne utvidelsen hoppe rett over det sponsede segmentet. Du kan også hoppe over ikke-musikk-seksjoner i musikkvideoer.","description":"Full description of the extension on the store pages."},"website":{"message":"Nettsted","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Kildekode","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Varselet har blitt oppgradert!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Hvis du fortsatt ikke liker det, klikk på «Aldri vis»-knappen.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Hopp over segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Start/stopp segment","description":"Keybind label"},"setSubmitKeybind":{"message":"Send inn segmenter","description":"Keybind label"},"setPreviewKeybind":{"message":"Forhåndsvis segmentet","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Lukk hopp over-beskjed","description":"Keybind label"},"setDownvoteKeybind":{"message":"Stem segmentet ned","description":"Keybind label"},"setUpvoteKeybind":{"message":"Stem segmentet opp","description":"Keybind label"},"nextChapterKeybind":{"message":"Neste kapittel","description":"Keybind label"},"previousChapterKeybind":{"message":"Forrige kapittel","description":"Keybind label"},"enableDeArrowKey":{"message":"Skru DeArrow av/på","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Velg en tast ved å trykke på den, velg deretter hvilke modifikasjonstaster du ønsker å bruke."},"disableSkipping":{"message":"Hopping er skrudd på"},"enableSkipping":{"message":"Hopping er skrudd av"},"yourWork":{"message":"Arbeidet ditt","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Feilkode: "},"skip":{"message":"Hopp over"},"mute":{"message":"Lydløs"},"full":{"message":"Full video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Vil du hoppe over {0}?"},"mute_category":{"message":"Gjør {0} lydløs?"},"skip_to_category":{"message":"Hopp til {0}?","description":"Used for skipping to things (Skip to Highlight)"},"skipped":{"message":"{0} hoppet over","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} lydløs","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Hoppet til {0}","description":"Used for skipping to things (Skipped to Highlight)"},"disableAutoSkip":{"message":"Skru av autohopping"},"enableAutoSkip":{"message":"Skru på autohopping"},"audioNotification":{"message":"Lydvarsel ved hopp"},"audioNotificationDescription":{"message":"Lydvarsling ved hopp vil spille av en lyd når enn et segment blir hoppet over. Hvis det er skrudd av (eller at autohopping er skrudd av), vil det ikke bli spilt av en slik lyd."},"showTimeWithSkips":{"message":"Vis tiden der hoppene er trukket fra"},"showTimeWithSkipsDescription":{"message":"Denne tiden vises i parentes ved siden av den nåværende tiden under tidsstripen. Dette viser den totale videolengden minus evt. segmenter. Dette inkluderer segmenter som kun er markert som «Vis i tidsstripen»."},"youHaveSkipped":{"message":"Du har hoppet over "},"minLower":{"message":"minutt"},"minsLower":{"message":"minutter"},"hourLower":{"message":"time"},"hoursLower":{"message":"timer"},"youHaveSavedTime":{"message":"Du har spart folk for","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":"av sine liv","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Sjekk status.sponsor.ajay.app for tjenerstatus."},"whatChangeUserID":{"message":"Dette bør holdes privat. Det er som et passord og bør ikke deles med noen. Hvis noen har dette kan de utgi seg som deg. Hvis du leter etter din offentlige bruker-ID, klikker du på utklippstavlen i oppsprettsvinduet."},"setUserID":{"message":"Bestem privat bruker-ID"},"createdBy":{"message":"Opprettet av"},"supportOtherSites":{"message":"Støtt tredjeparts YouTube-nettsteder"},"supportedSites":{"message":"Støttede nettsteder: "},"optionsInfo":{"message":"Skru på Invidious-støtte, skru av autohopp, skjul knapper, og mer."},"addInvidiousInstance":{"message":"Legg til tredjeparts klientinstans"},"addInvidiousInstanceDescription":{"message":"Legg til en egendefinert instans. Den må formatteres med KUN domenet. Eksempel: invidious.ajay.app"},"add":{"message":"Legg til"},"addInvidiousInstanceError":{"message":"Dette er et ugyldig domene. Dette skal BARE inkludere domenedelen. Eksempel: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Tilbakestill Invidious-instansliste"},"resetInvidiousInstanceAlert":{"message":"Du er i ferd med å tilbakestille Invidious-instanslisten"},"currentInstances":{"message":"Gjeldende instanser:"},"minDuration":{"message":"Minimumsvarighet (i sekunder):"},"minDurationDescription":{"message":"Segmenter som er kortere enn den valgte verdien, vil ikke bli hoppet over eller vises i avspilleren."},"skipNoticeDuration":{"message":"Varighet for hopp over-varsel (sekunder):"},"skipNoticeDurationDescription":{"message":"Hopp over-varselet vil bli værende på skjermen i minst så mange sekunder. For manuell hopping kan det være synlig lenger."},"shortCheck":{"message":"Den følgende innsendingen er kortere enn din valgte minimumsvarighetsinnstilling. Dette kan bety at den allerede er sendt inn, og at den simpelthen blir ignorert på grunn av denne innstillingen. Er du sikker på at du vil sende den inn?"},"liveOrPremiere":{"message":"Innsendelse på en aktiv direktesending eller premiere er ikke tillatt. Vennligst vent til den er ferdig, last så siden på nytt og kontroller at segmentene fortsatt er gyldige."},"showUploadButton":{"message":"Vis opplastingsknapp"},"customServerAddress":{"message":"SponsorBlock-tjeneradresse"},"customServerAddressDescription":{"message":"Adressen som SponsorBlock bruker til å kalle på tjeneren.\nMed mindre du har din egen tjenerinstans, burde du ikke endre på det."},"save":{"message":"Lagre"},"reset":{"message":"Nullstill"},"customAddressError":{"message":"Adressen har ikke riktig format. Sørg for at du har https:// eller http:// i starten, og at det ikke slutter med en skråstrek."},"areYouSureReset":{"message":"Er du sikker på at du vil tilbakestille dette?"},"mobileUpdateInfo":{"message":"m.youtube.com er nå støttet"},"exportOptions":{"message":"Importer/Eksporter alle innstillinger"},"exportOptionsCopy":{"message":"Rediger/kopiér"},"exportOptionsDownload":{"message":"Lagre til fil"},"exportOptionsUpload":{"message":"Last fra fil"},"setOptions":{"message":"Angi innstillinger"},"exportOptionsWarning":{"message":"Advarsel: Å endre på innstillingene er permanent og kan knekke installasjonen din. Er du sikker på at du vil gjøre dette? Sørg for å ta sikkerhetskopi av de gamle for sikkerhets skyld."},"incorrectlyFormattedOptions":{"message":"Denne JSON-koden er ikke formattert riktig. Dine innstillinger har ikke blitt endret på."},"confirmNoticeTitle":{"message":"Send inn segment"},"submit":{"message":"Send"},"cancel":{"message":"Avbryt"},"delete":{"message":"Slett"},"preview":{"message":"Forhåndsvisning"},"unsubmitted":{"message":"Ikke innsendt"},"inspect":{"message":"Inspiser"},"edit":{"message":"Rediger "},"copyDebugInformation":{"message":"Kopier avlusingsinformasjon til utklippstavlen"},"copyDebugInformationFailed":{"message":"Klarte ikke å skrive til utklippstavlen"},"copyDebugInformationOptions":{"message":"Kopierer informasjon til utklippstavlen som skal gis til en utvikler i feilrapporter eller når en utvikler ber om det. Sensitiv informasjon som bruker-ID-en din, hvitelistede kanaler, og tilpassede tjeneradresser har blitt fjernet. Men det inneholder informasjon som brukeragenten din, nettleseren, operativsystemet, og utvidelsesversjonsnummeret. "},"copyDebugInformationComplete":{"message":"Avlusingsinformasjonen har blitt kopiert til utklippstavlen. Du er velkommen til å fjerne det av informasjon som du helst ikke vil dele. Lagre dette i en tekstfil, eller lim det inn i feilrapporten."},"keyAlreadyUsed":{"message":"Denne hurtigtasten er knyttet til en annen handling. Vennligst velg en annen kombinasjon."},"to":{"message":"til","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Kopiert!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Betalt promotering, betalte henvisninger, og reklamer direkte til seerne. Ikke for selvpromotering eller gratis hyllester av saker/skapere/nettsteder/produkter som de liker."},"category_sponsor_guideline1":{"message":"Betalte kampanjer"},"category_selfpromo":{"message":"Ubetalt/Selvpromotering"},"category_selfpromo_description":{"message":"Minner om «Sponsor», men er ubetalt eller selvpromotering. Dette inkluderer segmenter om merchandise, donasjoner, eller info om hvem de samarbeidet med."},"category_exclusive_access":{"message":"Ekslusiv tilgang"},"category_exclusive_access_description":{"message":"Kun for merking av hele videoer. Brukes når en video demonstrerer et produkt, tjeneste eller sted de har fått gratis eller subsidiert tilgang til."},"category_exclusive_access_pill":{"message":"Denne videoen demonstrerer et produkt, tjeneste eller sted som de har fått gratis eller subsidiert tilgang til","description":"Short description for this category"},"category_interaction":{"message":"Samhandlingspåminnelse (Abonner)"},"category_interaction_description":{"message":"Når det er en kort påminnelse om å like, abonnere på eller følge dem midt i innholdet. Hvis det er langt eller handler om noe spesifikt, burde det føres opp som selvpromotering i stedet."},"category_interaction_guideline1":{"message":"Kort påminnelse om å like, abonnere, eller følge"},"category_interaction_short":{"message":"Samhandlingspåminnelse"},"category_intro":{"message":"Midtpause-/Introanimasjon"},"category_intro_description":{"message":"En intervall uten noe faktisk innhold. Kan være en pause, statisk bilde, eller repetitiv animasjon. Dette burde ikke brukes til overgangsanimasjoner som inneholder informasjon."},"category_intro_short":{"message":"Midtpause"},"category_outro":{"message":"Rulletekster"},"category_outro_description":{"message":"Rulletekster eller når YouTube-sluttkortene dukker opp. Ikke for avslutninger med informasjon."},"category_music_offtopic":{"message":"Musikk: Seksjon uten musikk"},"category_music_offtopic_description":{"message":"Kun for bruk i musikkvideoer. Dette burde kun brukes for seksjoner i musikkvideoer som ikke allerede dekkes av en annen kategori."},"category_music_offtopic_short":{"message":"Ikke-musikk"},"category_music_offtopic_guideline1":{"message":"Seksjoner om ikke er i offisielle utgivelser"},"category_poi_highlight":{"message":"Høydepunkt"},"category_poi_highlight_description":{"message":"Den del av videoen som de fleste er interessert i. Tilsvarende kommentarer som \"Videoen begynner på x\"."},"category_chapter":{"message":"Kapittel"},"category_livestream_messages":{"message":"Direktesending: Donasjons-/Meldingshøytlesninger"},"category_livestream_messages_short":{"message":"Høytlesning av meldinger"},"autoSkip":{"message":"Hopp over automatisk"},"manualSkip":{"message":"Manuelt hopp"},"showOverlay":{"message":"Vis i tidsstripen"},"disable":{"message":"Deaktiver"},"autoSkip_POI":{"message":"Autohopp til starten"},"manualSkip_POI":{"message":"Spør når videoen laster"},"showOverlay_POI":{"message":"Vis i tidsstripen"},"showOverlay_full":{"message":"Vis merke"},"showOverlay_chapter":{"message":"Vis kapitler"},"autoSkipOnMusicVideos":{"message":"Autohopp over alle segmenter når det er et segment uten musikk"},"muteSegments":{"message":"Tillat segmenter som slår av lyden i stedet for å hoppe over"},"fullVideoSegments":{"message":"Vis et ikon når en video utelukkende er reklame","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"previewColor":{"message":"Ikke innsendt-farge","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Tidsstripefarge"},"category":{"message":"Kategori"},"skipOption":{"message":"Hoppinnstilling","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"Skru på betatestingstjeneren"},"whatEnableTestingServer":{"message":"Dine innsendinger og stemmer BLIR IKKE REGNET MED med tanke på hovedtjeneren. Kun bruk dette til testing."},"testingServerWarning":{"message":"Alle innsendinger og stemmer BLIR IKKE REGNET MED med tanke på hovedtjeneren når du kobler til testtjeneren. Sørg for å skru dette av når du vil sende inn ekte innsendinger."},"bracketNow":{"message":"(Nå)"},"moreCategories":{"message":"Flere kategorier"},"chooseACategory":{"message":"Velg en kategori"},"enableThisCategoryFirst":{"message":"For å sende inn segmenter i «{0}»-kategorien, må du skru det på i innstillingene. Du vil nå bli omdirigert til innstillingene.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Advarsel: Denne type segment kan ha maksimalt én aktiv om gangen. Å legge inn flere vil forårsake en tilfeldig framvisning."},"youMustSelectACategory":{"message":"Du må velge en kategori for alle segmentene du sender inn!"},"bracketStart":{"message":"(Start)"},"bracketEnd":{"message":"(Slutt)"},"End":{"message":"Slutt","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"skjult: stemt ned"},"hiddenDueToDuration":{"message":"skjult: for kort"},"manuallyHidden":{"message":"manuelt skjult"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Kanal-ID er ikke lastet enda. Hvis du bruker en innebygd video, prøv å bruke YouTube-hjemmesiden i stedet. Dette kan også forårsakes av endringer i YouTube-oppsett, hvis du mistenker det, kommenter her:"},"acceptPermission":{"message":"Godta tillatelse"},"permissionRequestSuccess":{"message":"Tillatelsesforespørselen lyktes!"},"permissionRequestFailed":{"message":"Tillatelsesforespørselen mislyktes, klikket du på Avvis?"},"adblockerIssueWhitelist":{"message":"Om du ikke er i stand til å løse dette, forsøk å deaktiver innstillingen 'Fremtving kanalsjekk før hopp', siden SponsorBlock ikke kan hente kanalinformasjon for denne videoen"},"forceChannelCheck":{"message":"Fremtving kanalsjekk før hopp"},"whatForceChannelCheck":{"message":"Som standard, vil den hoppe over segmenter umiddelbart før den engang vet hvilken kanal det er. Som standard vil noen segmenter i begynnelsen av videoen bli hoppet over på hvitelistede kanaler. Å skru på denne innstillingen vil forhindre dette, men også føre til at all hopping har en liten forsinkelse siden innhentingen av kanal-ID-en kan ta litt tid. Denne forsinkelsen vil kanskje ikke bli lagt merke til hvis du har raskt internett."},"forceChannelCheckPopup":{"message":"Vurder å skru på «Fremtving kanalsjekk før hopp»"},"downvoteDescription":{"message":"Feil tidtaking"},"incorrectVote":{"message":"Feil"},"harmfulVote":{"message":"Skadelig","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Endre kategori"},"nonMusicCategoryOnMusic":{"message":"Denne videoen er kategorisert som musikk. Er du sikker på at dette har en sponsor? Hvis det egentlig er et \"Ikke-musikk-segment\", åpne opp innstillingene til utvidelsen og skru på denne kategorien. Deretter kan du sende dette segmentet som \"Ikke-musikk\" i stedet for som sponsing. Vennligst les retningslinjene hvis du er forvirret."},"multipleSegments":{"message":"Flere segmenter"},"guidelines":{"message":"Retningslinjer"},"readTheGuidelines":{"message":"Les retningslinjene!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategorier er her!"},"categoryUpdate2":{"message":"Åpne innstillingene for å hoppe over introer, outro-er, merchandise, osv."},"help":{"message":"Hjelp"},"GotIt":{"message":"Jeg forstår","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Dette segmentet er stort. Dersom hele videoen er omtrent ett emne, så endre fra \"Hopp Over\" til \"Full Video\". Se retningslinjene for mer informasjon."},"categoryPillTitleText":{"message":"Hele denne videoen er merket som denne kategorien og er for tett knyttet til å kunne separeres"},"experiementOptOut":{"message":"Reservér deg mot alle fremtidige eksperimenter","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Skjul for alltid"},"questionButton":{"message":"SpørsmålsKnapp"},"askAQuestion":{"message":"Still et spørsmål"},"warningConfirmButton":{"message":"Jeg forstår grunnen"},"Donate":{"message":"Donér"},"hideDonationLink":{"message":"Skjul donasjonslenke"},"darkModeOptionsPage":{"message":"Mørk modus på instillingssiden"},"helpPageThanksForInstalling":{"message":"Takk for at du installerte SponsorBlock."},"helpPageReviewOptions":{"message":"Vennligst se gjennom innstillingene nedenfor"},"helpPageFeatureDisclaimer":{"message":"Mange funksjoner er deaktivert som standard. Om du vil hoppe over introer, outro-er, benytte Invidious osv., aktiver dem nedenfor. Du kan også vise eller skjule UI-elementer."},"helpPageHowSkippingWorks2":{"message":"Hver gang du hopper over et segment vil du få et varsel. Hvis tidtakingen ser feil ut stem ned ved å klikke på nedstemme! Du kan også stemme i oppsprettsvinduet."},"Submitting":{"message":"Innsending"},"helpPageCopyOfDatabase2":{"message":"Kildekoden er fritt tilgjengelig. Så selv om noe skulle skje med meg vil ikke dine bidrag gå tapt."},"Credits":{"message":"Anerkjennelser"},"LearnMore":{"message":"Les mer"},"CopyDownvoteButtonInfo":{"message":"Stemmer ned og oppretter en lokal kopi som du kan sende inn på nytt"},"OpenCategoryWikiPage":{"message":"Åpne denne kategoriens wiki-side."},"CopyAndDownvote":{"message":"Kopiér og stem ned"},"ContinueVoting":{"message":"Fortsett å stemme"},"ChangeCategoryTooltip":{"message":"Dette vil umiddelbart gjelde for dine segmenter"},"downvote":{"message":"Stem ned"},"upvote":{"message":"Stem opp"},"hideSegment":{"message":"Skjul segment"},"skipSegment":{"message":"Hopp over segment"},"playChapter":{"message":"Spill av kapittel"},"SponsorTimeEditScrollNewFeature":{"message":"Bruk musehjulet mens du peker over redigeringsboksen for å raskt justere tiden. Kombinasjoner av ctrl- eller shift-tasten kan brukes til å finjustere endringene."},"categoryPillNewFeature":{"message":"Nyhet! Se om en video er fullstendig sponset eller selvpromotert"},"yearAbbreviation":{"message":"å","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"t","description":"100h"},"optionsTabBehavior":{"message":"Oppførsel","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Grensesnitt","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Hurtigtaster","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Sikkerhetskopiér/gjenskap","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Diverse","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Hopp over-varselutseende","description":"Option label"},"unbind":{"message":"Fjern","description":"Unbind keyboard shortcut"},"notSet":{"message":"Ikke angitt"},"change":{"message":"Endre"},"youtubeKeybindWarning":{"message":"Dette er en innebygget YouTube-hurtigtast. Er du sikker på at du vil bruke den?"},"betaServerWarning":{"message":"BETA Server er aktivert!"},"openOptionsPage":{"message":"Åpne innstillingsside"},"resetToDefault":{"message":"Tilbakestill innstillinger til standard"},"confirmResetToDefault":{"message":"Er du sikker på at du vil tilbakestille alle innstillingene til standardverdiene? Dette kan ikke angres."},"exportSegments":{"message":"Eksporter segmenter"},"importSegments":{"message":"Importer segmenter"},"Import":{"message":"Importér","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Innløsning vellykket!"},"redeemFailed":{"message":"Lisensnøkkelen er ugyldig"},"hideUpsells":{"message":"Skjul alternativer som krever ekstra betaling"},"redeem":{"message":"Løs inn"},"enterLicenseKey":{"message":"Skriv inn lisensnøkkel"},"unsubmittedSegmentCounts":{"message":"Du har for øyeblikket {0} på {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Du har ingen segmenter som ikke er sendt inn","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"ikke-innsendt segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"ikke-innsendte segmenter","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videoer","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"showUnsubmittedSegments":{"message":"Vis segmenter","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Skjul segmenter","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video-ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Antall segmenter","description":"Header of the unsubmitted segments list"},"actions":{"message":"Handlinger","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Del som en URL"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Bedre titler og miniatyrbilder på YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Originaltittel"},"CurrentTime":{"message":"Nåværende tidspunkt"},"resetIcon":{"message":"Tilbakestill ikon"},"VideoNotReady":{"message":"Videoen er ikke klar"},"CanvasMissing":{"message":"Canvas mangler","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"FailedToLoad":{"message":"Mislyktes i å lastes inn","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Tittelformat"},"Disabled":{"message":"Skrudd av"},"LowerCase":{"message":"Småbokstaver"},"shouldCleanEmojis":{"message":"Fjern emojier"},"showABlankBox":{"message":"Vis en tom boks"},"Start":{"message":"Start"},"Middle":{"message":"I midten"},"keepUnsubmitted":{"message":"Lagre innsendte stemmer"},"onAllPages":{"message":"På alle sider","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Aldri"},"Enable":{"message":"Skru på"},"Titles":{"message":"Titteler","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniatyrbilder","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"Feil"},"ShowOriginal":{"message":"Vis opprinnelige detaljer"},"ShowModified":{"message":"Vis endrede detaljer"},"showGuidelineHelp":{"message":"Vis retningslinje-hjelp","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Unngå overdrevne ansiktsuttrykk","description":"Referring to the thumbnail of a video"},"tip5":{"message":"Skriv den med stor bokstav først som en setning","description":"Tip about submitting titles to DeArrow"},"dearrowHelpSponsorBlockImported":{"message":"Merk: Dine SponsorBlock innstillinger har blitt automatisk importert!"},"howItWorks":{"message":"Hvordan det virker"},"privacyPolicy":{"message":"Personvernretningslinjer"},"termsOfUse":{"message":"Vilkår for bruk"},"openSourceLicenses":{"message":"Åpenkilde-lisenser"},"replaceTitles":{"message":"Erstatt Tittler"},"replaceThumbnails":{"message":"Erstatt Miniatyrbilder"},"NewConfiguration":{"message":"Nytt oppsett"},"DeleteConfiguration":{"message":"Slett oppsett"},"ConfigurationName":{"message":"Oppsettets navn"},"DeArrowPromotionMessage3":{"message":"Sjekk også ut DeArrow","description":"DeArrow is the name of the extension"},"dearrowStatsMessageTitlePart":{"message":"{titles} tittel","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} titler","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"requiresUblock":{"message":"Krever uBlock Origin"},"dearrowLogoCredit":{"message":"Logoen er basert på Twemoji som er lisensiert under CC-BY 4.0"},"freeTrialEnded":{"message":"Din gratis prøveperiode er over"},"startFreeTrial":{"message":"Start gratis prøveperiode"},"DeArrowNotActivated":{"message":"DeArrow er ikke aktivert"},"ActivateDeArrow":{"message":"Aktiver DeArrow"},"DeArrowIsActivated":{"message":"DeArrow har nå blitt aktivert"},"Close":{"message":"Lukk"},"ViewLicenseKey":{"message":"Vis Lisensnøkkel"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/pl/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/pl/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Połączenie przerwane z powodu braku odpowiedzi. Sprawdź swoje połączenie z internetem. Jeśli wszystko z nim w porządku oznacza to, że serwer jest prawdopodobnie przeciążony lub nie działa."},"400":{"message":"Serwer odpowiedział, że to zapytanie jest niepoprawne"},"409":{"message":"To już zostało wysłane wcześniej"},"502":{"message":"Serwer jest prawdopodobnie przeciążony, spróbuj ponownie za kilka sekund."},"fullName":{"message":"SponsorBlock na YouTube - Pomiń fragmenty sponsorowane","description":"Name of the extension."},"Description":{"message":"Pomijaj sponsorów, prośby o subskrypcje i inne fragmenty filmów na YouTube. Zgłaszaj segmenty sponsorów na filmach, które oglądasz, by oszczędzić czas innym.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanał dodany do wyjątków!"},"Segment":{"message":"segment"},"Segments":{"message":"segmenty(-ów)"},"SegmentsCap":{"message":"Segmenty"},"Chapters":{"message":"Rozdziały"},"renderAsChapters":{"message":"Pokazuj segmenty jako rozdziały","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Pokaż bieżący segment poza czasem wideo"},"showAutogeneratedChapters":{"message":"Pokaż rozdziały wygenerowane automatycznie przez YouTube"},"upvoteButtonInfo":{"message":"Zagłosuj na ten segment"},"reportButtonTitle":{"message":"Zgłoś"},"reportButtonInfo":{"message":"Zgłoś ten segment jako nieprawidłowy."},"Dismiss":{"message":"Odrzuć"},"Loading":{"message":"Ładowanie..."},"Hide":{"message":"Nie pokazuj więcej"},"hitGoBack":{"message":"Kliknij cofnij aby przenieść się do miejsca przed przewinięciem."},"unskip":{"message":"Cofnij"},"reskip":{"message":"Pomiń"},"unmute":{"message":"Anuluj wyciszenie"},"paused":{"message":"Zatrzymany"},"manualPaused":{"message":"Timer zatrzymany"},"confirmMSG":{"message":"Aby edytować lub usuwać poszczególne wartości, kliknij na przycisk info lub otwórz okno rozszerzenia, klikając na ikonę rozszerzenia w prawym górnym rogu."},"clearThis":{"message":"Czy na pewno chcesz to usunąć?\n\n"},"Unknown":{"message":"Wystąpił błąd podczas przesyłania twojego segmentu. Proszę spróbować ponownie później."},"sponsorFound":{"message":"Ten film ma segmenty w bazie danych!"},"sponsor404":{"message":"Nie znaleziono segmentów"},"sponsorStart":{"message":"Początek segmentu"},"sponsorEnd":{"message":"Koniec segmentu"},"sponsorCancel":{"message":"Anuluj tworzenie segmentu"},"noVideoID":{"message":"Nie znaleziono filmu YouTube.\nJeżeli to błąd, odśwież stronę."},"refreshSegments":{"message":"Odśwież segmenty"},"success":{"message":"Sukces!"},"voted":{"message":"Zagłosowano!"},"serverDown":{"message":"Wygląda na to, że serwer nie działa. Skontaktuj się niezwłocznie z deweloperem."},"connectionError":{"message":"Wystąpił błąd połączenia. Kod błędu: "},"segmentsStillLoading":{"message":"Segmenty nadal się ładują..."},"clearTimes":{"message":"Wyczyść segmenty"},"openPopup":{"message":"Otwórz okno SponsorBlock"},"closePopup":{"message":"Zamknij okno"},"closeIcon":{"message":"Wyłącz ikonę"},"OpenSubmissionMenu":{"message":"Otwórz menu zgłoszenia"},"OpenCasualVoteMenu":{"message":"Otwórz menu trybu casual"},"sortSegments":{"message":"Sortuj segmenty"},"submitCheck":{"message":"Czy na pewno chcesz to zamieścić?"},"whitelistChannel":{"message":"Dodaj kanał do wyjątków"},"removeFromWhitelist":{"message":"Usuń kanał z listy wyjątków"},"voteOnTime":{"message":"Oceń segment"},"Submissions":{"message":"Zgłoszenia"},"savedPeopleFrom":{"message":"Oszczędziłeś innym "},"viewLeaderboard":{"message":"Ranking"},"recordTimesDescription":{"message":"Wyślij"},"submissionEditHint":{"message":"Edycja sekcji pojawi się po wciśnięciu „Wyślij”","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Wskazówka: Możesz skonfigurować skróty klawiszowe do zatwierdzania w opcjach"},"clearTimesButton":{"message":"Usuń czasy"},"Username":{"message":"Nazwa użytkownika"},"setUsername":{"message":"Ustaw nazwę użytkownika"},"copyPublicID":{"message":"Kopiuj publiczny identyfikator użytkownika"},"copySegmentID":{"message":"Kopiuj ID segmentu"},"loopChapter":{"message":"Zapętl rozdział"},"unloopChapter":{"message":"Wyłącz zapętlenie rozdziału"},"hideThis":{"message":"Ukryj to"},"Options":{"message":"Opcje"},"showButtons":{"message":"Pokaż przyciski na odtwarzaczu YouTube"},"hideButtonsDescription":{"message":"Ta opcja ukrywa przyciski do zamieszczania segmentów pojawiające się na odtwarzaczu YouTube."},"showSkipButton":{"message":"Wyświetlaj przycisk \"Przejść do wyróżnione?\" na odtwarzaczu"},"showInfoButton":{"message":"Pokaż przycisk informacyjny na odtwarzaczu YouTube"},"autoHideInfoButton":{"message":"Autoukrywanie przycisku informacji"},"showDeleteButton":{"message":"Pokaż przycisk usuwania na odtwarzaczu YouTube"},"enableViewTracking":{"message":"Włącz monitorowanie liczby pominięć"},"whatViewTracking":{"message":"Ta opcja monitoruje pomijane przez Ciebie segmenty, by dać znać użytkownikom, jak bardzo ich wkład pomógł innym, oraz w połączeniu z systemem głosowania zapobiegać dostawaniu się spamu do bazy danych. Rozszerzenie wysyła wiadomość do serwera za każdym razem, kiedy pomijasz segment. Miejmy nadzieję, że większość ludzi tego nie wyłączy i liczniki wyświetleń będą wiarygodne. :)"},"enableViewTrackingInPrivate":{"message":"Włącz licznik śledzenia pominięć w zakładkach Prywatnych/Incognito"},"enableTrackDownvotes":{"message":"Zapamiętaj segmenty z łapkami w dół"},"whatTrackDownvotes":{"message":"Wszystkie segmenty, którym dasz łapkę w dół, pozostaną ukryte nawet po odświeżeniu"},"trackDownvotesWarning":{"message":"Uwaga: Wyłączenie tego usunie wszystkie poprzednio zapisane łapki w dół"},"enableTrackDownvotesInPrivate":{"message":"Zapisuj segmenty z łapką w dół na kartach prywatnych / w trybie incognito"},"enableQueryByHashPrefix":{"message":"Zapytanie według prefiksu Hash"},"whatQueryByHashPrefix":{"message":"Zamiast wysyłać do serwera zapytanie o segmenty używając ID filmu, wysyłane są 4 pierwsze znaki hashu tego ID. Serwer zwróci dane dla wszystkich filmów z podobnymi hashami."},"enableShowCategoryWithoutPermission":{"message":"Pokaż kategorie w menu zgłoszeń, nawet bez uprawnień do zgłaszania"},"whatShowCategoryWithoutPermission":{"message":"Niektóre kategorie wymagają specjalnych uprawnień, by przesłać segment ze względu na minimalne wymogi reputacji"},"showNotice":{"message":"Pokaż informacje ponownie"},"showSkipNotice":{"message":"Pokaż informację po pominięciu segmentu"},"showUpcomingNotice":{"message":"Wyświetl powiadomienie przed rozpoczęciem segmentu"},"showCategoryGuidelines":{"message":"Pokaż pomoc kategorii"},"noticeVisibilityMode0":{"message":"Pełnowymiarowe powiadomienia o przewinięciu"},"noticeVisibilityMode1":{"message":"Małe powiadomienia o automatycznym przewinięciu"},"noticeVisibilityMode2":{"message":"Małe powiadomienia o przewinięciu"},"noticeVisibilityMode3":{"message":"Półprzezroczyste powiadomienie o automatycznym przewinięciu"},"noticeVisibilityMode4":{"message":"Półprzezroczyste powiadomienie dla wszystkich przewinięć"},"longDescription":{"message":"SponsorBlock pozwala pomijać sponsorów, intra, outra, przypomnienia o subskrypcjach i inne irytujące fragmenty filmów na YouTube. SponsorBlock jest opartym na crowdsourcingu rozszerzeniem do przeglądarki, które pozwala każdemu zgłosić początek i koniec segmentów sponsorowanych oraz innych segmentów w filmach na YouTube. Kiedy ktoś już zamieści te informacje, wszyscy pozostali z tym rozszerzeniem będą pomijać segment sponsorowany. Możesz również pomijać fragmenty teledysków bez muzyki.","description":"Full description of the extension on the store pages."},"website":{"message":"Strona","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Kod źródłowy","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Informacje zostały zaktualizowane!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Jeśli nadal jej nie lubisz wybierz opcje nie pokazuj więcej.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Pomiń segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Rozpocznij/zatrzymaj segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Otwórz menu zgłoszenia","description":"Keybind label"},"setSubmitKeybind":{"message":"Prześlij segmenty","description":"Keybind label"},"setPreviewKeybind":{"message":"Podgląd segmentu","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Zamknij powiadomienie o pominięciu","description":"Keybind label"},"setDownvoteKeybind":{"message":"Oceń segment negatywnie","description":"Keybind label"},"setUpvoteKeybind":{"message":"Oceń segment pozytywnie","description":"Keybind label"},"nextChapterKeybind":{"message":"Następny rozdział","description":"Keybind label"},"previousChapterKeybind":{"message":"Poprzedni rozdział","description":"Keybind label"},"enableDeArrowKey":{"message":"Włącz/wyłącz DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Otwórz menu zgłoszenia","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Wybierz przycisk, wpisując go i wybierz dowolne klucze modyfikujące, których chcesz użyć."},"disableSkipping":{"message":"Pomijanie jest włączone"},"enableSkipping":{"message":"Pomijanie jest wyłączone"},"yourWork":{"message":"Twój wkład","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Kod błędu: "},"skip":{"message":"Pomiń"},"mute":{"message":"Wycisz"},"full":{"message":"Cały film","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} — pominąć?"},"mute_category":{"message":"{0} — wyciszyć?"},"skip_to_category":{"message":"Przejść do {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Wkrótce: {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} — pominięto","description":"Example: Sponsor Skipped"},"muted":{"message":"Wyciszono {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Przewinięto do {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Zagłosowano na {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Wyłącz autopomijanie"},"enableAutoSkip":{"message":"Włącz autopomijanie"},"audioNotification":{"message":"Powiadomienie dźwiękowe przy pominięciu"},"audioNotificationDescription":{"message":"Powiadomienie dźwiękowe będzie odtwarzane za każdym razem, gdy pomijany jest segment. Jeśli jest wyłączone (lub automatyczne pomijanie jest wyłączone), nie będzie żadnego dźwięku."},"showTimeWithSkips":{"message":"Pokaż czas po usunięciu segmentów"},"showTimeWithSkipsDescription":{"message":"Czas ten pojawia się w nawiasie obok czasu bieżącego, pod paskiem postępu. Pokazuje on długość całego filmu po odjęciu wszystkich segmentów. Wliczają się w to segmenty ustawione jako \"pokaż na pasku\"."},"youHaveSkipped":{"message":"Przewinięto "},"minLower":{"message":"min"},"minsLower":{"message":"min"},"hourLower":{"message":"godz."},"hoursLower":{"message":"godz."},"youHaveSavedTime":{"message":"Oszczędzono innym","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" życia","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Sprawdź status serwera na status.sponsor.ajay.app"},"changeUserID":{"message":"Importuj/Eksportuj swój prywatny UserID"},"whatChangeUserID":{"message":"To powinno pozostać prywatne. Jest to niczym hasło i nie powinno zostać nikomu udostępnione. Przy jego użyciu ktoś może się pod ciebie podszywać. Jeśli szukasz publicznego ID użytkownika, kliknij ikonę schowka w wyskakującym oknie."},"setUserID":{"message":"Ustaw prywatny UserID"},"userIDChangeWarning":{"message":"Uwaga: Zmiana ID użytkownika jest trwała. Czy na pewno chcesz to zrobić? Na wszelki wypadek skopiuj swój poprzedni ID."},"createdBy":{"message":"Stworzony przez"},"supportOtherSites":{"message":"Obsługa stron YouTube firm trzecich"},"supportOtherSitesDescription":{"message":"Obsługa zewnętrznych klientów YouTube. Aby włączyć obsługę, należy zaakceptować dodatkowe uprawnienia.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Wspierane strony: "},"optionsInfo":{"message":"Włącz wsparcie dla Invidious, wyłącz autopomijanie, ukryj przyciski i więcej."},"addInvidiousInstance":{"message":"Dodaj instancję zewnętrznego klienta"},"addInvidiousInstanceDescription":{"message":"Dodaj niestandardową instancję. Musi to być w formie samej domeny. Przykładowo: invidious.ajay.app"},"add":{"message":"Dodaj"},"addInvidiousInstanceError":{"message":"Ta domena jest nieprawidłowa. Wartość powinna zawierać TYLKO domenę. Na przykład: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Zresetuj listę instancji Invidious"},"resetInvidiousInstanceAlert":{"message":"Zresetujesz listę instancji Invidious"},"invidiousDisabledSafari":{"message":"Wsparcie dla Invidious jest niedostępne w Safari z powodu błędu Safari. Zostanie dodane z powrotem, gdy Apple naprawi błąd."},"currentInstances":{"message":"Obecne instancje:"},"minDuration":{"message":"Minimalny czas trwania (sekundy):"},"minDurationDescription":{"message":"Segmenty krótsze niż ustawiona wartość nie będą pomijane ani pokazywane w odtwarzaczu."},"enableManualSkipOnFullVideo":{"message":"Użyj ręcznego pomijania, gdy istnieje etykieta na całym filmie"},"whatManualSkipOnFullVideo":{"message":"Dla osób, które chcą oglądać film nieprzerwanie, jeśli film jest w pełni sponsorowany lub autopromocyjny."},"skipNoticeDuration":{"message":"Czas trwania powiadomienia pominięcia (sekundy):"},"skipNoticeDurationDescription":{"message":"Powiadomienie o pominięciu pozostanie na ekranie przez co najmniej tyle. Po ręcznym pominięciu, może być widoczna przez dłuższy czas."},"shortCheck":{"message":"Ten segment jest krótszy od ustawionego przez Ciebie minimalnego czasu trwania. Może to oznaczać, że ktoś już to zamieścił, ale nie widzisz tego przez to ustawienie. Czy na pewno chcesz to zamieścić?"},"liveOrPremiere":{"message":"Przesyłanie segmentów podczas transmisji na żywo lub trwającej premiery jest niedozwolone. Poczekaj, aż się zakończy, a następnie odśwież stronę i sprawdź, czy te segmenty są nadal prawidłowe."},"showUploadButton":{"message":"Pokaż przycisk wysyłania"},"customServerAddress":{"message":"Adres serwera SponsorBlock"},"customServerAddressDescription":{"message":"Adres, którego SponsorBlock używa do wykonywania połączeń z serwerem. O ile nie posiadasz własnego serwera, nie powinno to być zmieniane."},"dataFetchingServerAddress":{"message":"Adres serwera z danymi"},"dataFetchingServerAddressDescription":{"message":"Adres używany do wykonywania połączeń z serwerem danych.\nO ile nie posiadasz własnego serwera, nie powinno to być zmieniane."},"thumbnailCacheServerAddress":{"message":"Adres usługi generowania miniatur"},"save":{"message":"Zapisz"},"reset":{"message":"Resetuj"},"customAddressError":{"message":"Ten adres nie jest w prawidłowej formie. Upewnij się, że http:// lub https:// znajduje się na początku i nie ma końcowych ukośników."},"areYouSureReset":{"message":"Czy na pewno chcesz to zresetować?"},"mobileUpdateInfo":{"message":"m.youtube.com jest teraz wspierany"},"exportOptions":{"message":"Importuj/Eksportuj wszystkie ustawienia"},"exportOtherData":{"message":"Importuj/eksportuj wszystkie pozostałe dane"},"exportOptionsCopy":{"message":"Edytuj/kopiuj"},"exportOptionsDownload":{"message":"Zapisz do pliku"},"exportOptionsUpload":{"message":"Wczytaj z pliku"},"whatExportOptions":{"message":"Jest to cała twoja konfiguracja w formacie JSON. Zawarty jest w niej twój prywatny UserID, więc uważaj, komu ją udostępniasz."},"setOptions":{"message":"Zapisz ustawienia"},"exportOptionsWarning":{"message":"Uwaga: Zmiana ustawień jest trwała i może popsuć twoją instalację. Czy na pewno chcesz to zrobić? Na wszelki wypadek utwórz kopię poprzednich."},"incorrectlyFormattedOptions":{"message":"Ten JSON nie został poprawnie sformatowany. Twoje opcje nie zostały zmienione."},"confirmNoticeTitle":{"message":"Zgłoś segment"},"submit":{"message":"Wyślij"},"cancel":{"message":"Anuluj"},"delete":{"message":"Usuń"},"preview":{"message":"Podgląd"},"unsubmitted":{"message":"Niewysłane"},"inspect":{"message":"Sprawdź"},"edit":{"message":"Edytuj"},"copyDebugLogs":{"message":"Kopiuj dzienniki debugowania"},"copyDebugInformation":{"message":"Skopiuj informacje debugowania do schowka"},"copyDebugInformationFailed":{"message":"Nie udało się skopiować do schowka"},"copyDebugInformationOptions":{"message":"Kopiuje do schowka informacje do dostarczenia deweloperowi podczas zgłaszania błędu / gdy deweloper ich sobie zażyczy. Poufne informacje, takie jak ID użytkownika, kanały dodane do wyjątków i adres niestandardowego serwera zostały usunięte. Wciąż zawiera to jednak informacje takie jak twój user agent, przeglądarka, system operacyjny i wersja rozszerzenia. "},"copyDebugInformationComplete":{"message":"Informacje do debugowania zostały skopiowane do schowka. Możesz usunąć dane, których nie chcesz udostępniać. Zapisz je w pliku tekstowym albo wklej do raportu podczas zgłaszania błędu."},"keyAlreadyUsed":{"message":"Ten skrót jest przypisany do innej czynności. Wybierz inny."},"to":{"message":"do","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Skopiowano!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Zawiera płynne przejścia"},"generic_guideline2":{"message":"Pominięcie bez zauważalnego przeskoku"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Płatna promocja, płatne rekomendacje oraz bezpośrednie reklamy. Nie do autopromocji ani darmowych wyrazów uznania dla kwestii/twórców/stron/produktów, które im się podobają."},"category_sponsor_guideline1":{"message":"Segmenty sponsorowane"},"category_sponsor_guideline2":{"message":"Nie dla donateów lub merchu"},"category_selfpromo":{"message":"Nieopłacona/Własna promocja"},"category_selfpromo_description":{"message":"Podobnie jak \"sponsor\", ale nieodpłatnie bądź w ramach promocji własnej. Obejmuje to sekcje o własnych produktach, donacjach czy informacje o tym, z kim współpracowali."},"category_selfpromo_guideline1":{"message":"Dotacje, płatne członkostwo i merch"},"category_selfpromo_guideline2":{"message":"Szybkie przypomnienia, które nie wnoszą nic do filmu"},"category_selfpromo_guideline3":{"message":"Nie dla produktów zaprojektowanych przez duże firmy"},"category_exclusive_access":{"message":"Dostęp na wyłączność"},"category_exclusive_access_description":{"message":"Tylko do oznaczania całych filmów. Używane, gdy materiał wideo przedstawia produkt, usługę lub miejsce, do którego dostęp został otrzymany bezpłatnie lub dzięki dofinansowaniu."},"category_exclusive_access_pill":{"message":"Ten materiał wideo przedstawia produkt, usługę lub miejsce, do którego dostęp został otrzymany bezpłatnie lub dzięki dofinansowaniu","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Cały film jest poświęcony czemuś z darmowym lub płatnym dostępem"},"category_interaction":{"message":"Przypomnienie o interakcji (Subskrybuj)"},"category_interaction_description":{"message":"Gdy w materiale zostaje zawarte krótkie przypomnienie o polubieniu, subskrypcji lub obserwowaniu. Jeśli trwa długo lub dotyczy czegoś konkretnego, powinno być oznaczone jako autopromocja."},"category_interaction_guideline1":{"message":"Krótkie przypomnienia, by polubić lub zasubskrybować"},"category_interaction_guideline2":{"message":"Zawiera niebezpośrednie zachęcanie do komentowania"},"category_interaction_guideline3":{"message":"Nie dla ogólnej promocji, tylko zaproszenia do działania"},"category_interaction_short":{"message":"Przypomnienie o interakcji"},"category_intro":{"message":"Przerwa/Animowane intro"},"category_intro_description":{"message":"Fragment bez faktycznej treści. Może to być pauza, statyczna klatka, powtarzająca się animacja. Nie powinno to być używane do przejść zawierających informacje."},"category_intro_short":{"message":"Przerwa"},"category_intro_guideline1":{"message":"Przerwy bez rzeczywistej zawartości"},"category_intro_guideline2":{"message":"Nie dla przejść zawierających informacje"},"category_outro":{"message":"Ekran końcowy/Napisy"},"category_outro_description":{"message":"Napisy końcowe lub gdy pojawia się ekran końcowy. Nie do konkluzji zawierających informacje."},"category_outro_guideline1":{"message":"Nie zawiera treści, nawet jeśli na ekranie są karty końcowe"},"category_preview_description":{"message":"Zbiór klipów pokazujących to, co pojawi się w tym filmie lub innych filmach w serii, w której wszystkie informacje są powtarzane później w filmie."},"category_preview_guideline1":{"message":"Klipy, które pojawiają się później lub w następnym filmie"},"category_preview_guideline2":{"message":"Podsumowanie poprzedniego filmu"},"category_preview_guideline3":{"message":"Nie dla sekcji, które zawierają potrzebne informacje"},"category_filler":{"message":"Wypełniacze/Żarty"},"category_filler_description":{"message":"Wypełniacze lub żarty, które nie są wymagane do zrozumienia głównej treści filmu. Nie powinno to obejmować segmentów dostarczających kontekstu lub szczegółów tła. To bardzo agresywna kategoria przeznaczona na momenty, gdy nie masz ochoty na \"zabawę\"."},"category_filler_short":{"message":"Wypełniacze"},"category_filler_guideline1":{"message":"Sceny wypełniające lub żarty"},"category_filler_guideline2":{"message":"Rozpraszacze, wpadki, powtórki"},"category_filler_guideline3":{"message":"Nie nadaje się do scen wymaganych do zrozumienia tematu"},"category_music_offtopic":{"message":"Muzyka: Sekcja niemuzyczna"},"category_music_offtopic_description":{"message":"Do użytku jedynie w filmach muzycznych. Powinno to być używane jedynie do tych sekcji filmów muzycznych, które nie są uwzględnione w innej kategorii."},"category_music_offtopic_short":{"message":"Bez muzyki"},"category_music_offtopic_guideline1":{"message":"Sekcje, których nie ma w oficjalnych wydaniach"},"category_music_offtopic_guideline2":{"message":"Niemuzyczna część wystąpienia na żywo"},"category_poi_highlight":{"message":"Wyróżnione"},"category_poi_highlight_description":{"message":"Część filmu, która interesuje większość osób. Podobne do komentarzy typu „Filmik zaczyna się od x”."},"category_poi_highlight_guideline1":{"message":"Część filmu, której szuka większość osób"},"category_poi_highlight_guideline2":{"message":"Może pomóc pominąć kontekst"},"category_poi_highlight_guideline3":{"message":"Może pominąć do karty tytułowej lub miniaturki"},"category_chapter":{"message":"Rozdział"},"category_chapter_description":{"message":"Innaczej nazwane rozdziały opisujące znaczące fragmenty filmu."},"category_chapter_guideline1":{"message":"Nie wspominaj o nazwach sponsorów"},"category_chapter_guideline2":{"message":"Używaj większych rozdziałów dla ogólnych sekcji"},"category_chapter_guideline3":{"message":"Mniejsze rozdziały mogą być wstawione w większe"},"category_livestream_messages":{"message":"Transmisja live: Dotacja/Czytanie wiadomości"},"category_livestream_messages_short":{"message":"Czytanie wiadomości"},"autoSkip":{"message":"Autopomijanie"},"manualSkip":{"message":"Ręczne pomijanie"},"showOverlay":{"message":"Pokaż na pasku"},"disable":{"message":"Wyłączone"},"autoSkip_POI":{"message":"Automatycznie przewiń do początku"},"manualSkip_POI":{"message":"Zapytaj, gdy film się załaduje"},"showOverlay_POI":{"message":"Pokaż na pasku"},"showOverlay_full":{"message":"Wyświetl etykietę"},"showOverlay_chapter":{"message":"Pokaż rozdziały"},"autoSkipOnMusicVideos":{"message":"Automatycznie pomiń wszystkie segmenty, gdy istnieje segment niemuzyczny"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Pomijaj automatycznie tylko na music.youtube.com"},"muteSegments":{"message":"Zezwalaj na segmenty, które wyciszą dźwięk zamiast pomijać"},"fullVideoSegments":{"message":"Pokaż ikonę, gdy film jest w całości reklamą","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Pokaż etykiety również na miniaturach filmów","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Kolor nieprzesłanego segmentu","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Kolor paska postępu"},"category":{"message":"Kategoria"},"skipOption":{"message":"Tryb pomijania","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Otwórz zaawansowane opcje pomijania"},"advancedSkipNotSaved":{"message":"Błąd składniowy: Opcje nie zostały zapisane"},"advancedSkipSettingsHelp":{"message":"Jak to działa","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Aktywuj serwer beta-testów"},"whatEnableTestingServer":{"message":"Twoje segmenty i głosy NIE BĘDĄ uwzględniane na głównym serwerze. Używaj tego tylko do testowania."},"testingServerWarning":{"message":"Żadne segmenty ani głosy NIE BĘDĄ uwzględniane na głównym serwerze podczas połączenia z serwerem testowym. Pamiętaj, żeby to wyłączyć, gdy zechcesz dodać realny wkład."},"bracketNow":{"message":"(Teraz)"},"moreCategories":{"message":"Więcej kategorii"},"chooseACategory":{"message":"Wybierz kategorię"},"enableThisCategoryFirst":{"message":"Aby przesyłać segmenty o kategorii „{0}”, musisz ją włączyć w opcjach. Za chwilę nastąpi przekierowanie do ustawień.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Ostrzeżenie: Ten typ segmentu może być maksymalnie jeden. Przesyłanie kilku na raz spowoduje, że pojawi się losowy."},"youMustSelectACategory":{"message":"Musisz wybrać kategorię dla każdego segmentu, który zamieszczasz!"},"bracketStart":{"message":"(Początek)"},"bracketEnd":{"message":"(Koniec)"},"End":{"message":"Koniec","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"ukryty: zminusowany"},"hiddenDueToDuration":{"message":"ukryty: zbyt krótki"},"manuallyHidden":{"message":"ręcznie ukryty"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID kanału nie zostało jeszcze załadowane. Jeśli używasz embeddowanego filmu, spróbuj użyć strony głównej YouTube'a. Może to być również spowodowane zmianami w layout'cie YouTube'a, jeśli myślisz, że to przez to, dodaj swój komentarz tutaj:"},"invidiousPermissionRefresh":{"message":"Przeglądarka cofnęła uprawnienia potrzebne do działania na witrynach Invidious i innych witrynach stron trzecich. Kliknij poniższy przycisk, aby reaktywować to uprawnienie."},"acceptPermission":{"message":"Zaakceptuj uprawnienie"},"permissionRequestSuccess":{"message":"Uzyskano uprawnienia!"},"permissionRequestFailed":{"message":"Prośba odrzucona. Może kliknięto „Odmów”?"},"adblockerIssueWhitelist":{"message":"Jeśli nie możesz rozwiązać tego problemu, wyłącz opcję „Wymuś sprawdzanie kanału przed pomijaniem”, ponieważ SponsorBlock nie jest w stanie pobrać informacji o kanale dla tego wideo"},"forceChannelCheck":{"message":"Wymuś sprawdzanie kanału przed pomijaniem"},"whatForceChannelCheck":{"message":"Domyślnie, rozszerzenie pominie segmenty od razu, jeszcze zanim dowie się jaki to kanał. Domyślnie, pewne segmenty na początku filmu mogą zostać pominięte na kanałach dodanych do wyjątków. Włączenie tej opcji temu zapobiegnie, ale wszystkie pominięcia będą nieco opóźnione, gdyż uzyskanie ID kanału może chwilę potrwać. Opóźnienie to może być nieodczuwalne, jeśli masz szybki internet."},"forceChannelCheckPopup":{"message":"Rozważ włączenie opcji \"Wymuś sprawdzanie kanału przed pomijaniem\""},"downvoteDescription":{"message":"Niepoprawne/Zły czas"},"incorrectVote":{"message":"Nieprawidłowy"},"harmfulVote":{"message":"Szkodliwy","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Zmień kategorię"},"nonMusicCategoryOnMusic":{"message":"Ten film jest skategoryzowany jako muzyka. Czy masz pewność, że jest tutaj sponsor? Jeśli w rzeczywistości jest to „Sekcja Niemuzyczna”, otwórz opcje rozszerzenia i włącz tę kategorię. Wtedy będziesz w stanie zamieścić ten segment jako „Bez Muzyki” zamiast sponsora. Przeczytaj proszę wytyczne, jeśli masz wątpliwości."},"multipleSegments":{"message":"Wiele segmentów"},"guidelines":{"message":"Wytyczne"},"readTheGuidelines":{"message":"Przeczytaj wytyczne!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategorie są tutaj!"},"categoryUpdate2":{"message":"Otwórz opcje, aby pominąć intra, outra, merch, itp."},"help":{"message":"Pomoc"},"GotIt":{"message":"Rozumiem","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Ten segment jest duży. Jeśli cały film dotyczy jednego tematu, zmień z \"Pomiń\" na \"Cały film\". Zobacz wytyczne, po więcej informacji."},"categoryPillTitleText":{"message":"Cały film jest oznaczony jako ta kategoria i jest za bardzo zintegrowany, aby można było go podzielić"},"chapterNameTooltipWarning":{"message":"Jedna z nazw twojego rozdziału jest podobna do kategorii. Powinieneś używać kategorii, jeśli to możliwe."},"experiementOptOut":{"message":"Wyłączenie wszystkich przyszłych eksperymentów","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Schowaj na zawsze"},"warningChatInfo":{"message":"Zauważyliśmy, że popełniłeś pewne powszechne błędy. Bardzo doceniamy dotychczasową pracę, ale dążymy tutaj do doskonałości, więc nawet bardzo małe błędy mają znaczenie :)"},"questionButton":{"message":"Mam pytanie"},"askAQuestion":{"message":"Zadaj pytanie"},"warningConfirmButton":{"message":"Rozumiem powód"},"warningError":{"message":"Błąd podczas próby potwierdzenia ostrzeżenia:"},"deArrowMessageRecieved":{"message":"Otrzymana wiadomość od moderatora"},"Donate":{"message":"Wesprzyj nas"},"considerDonating":{"message":"Wesprzyj rozwój wtyczki"},"hideDonationLink":{"message":"Ukryj link do darowizny"},"darkModeOptionsPage":{"message":"Tryb ciemny na stronie opcji"},"helpPageThanksForInstalling":{"message":"Dziękujemy za zainstalowanie SponsorBlock."},"helpPageReviewOptions":{"message":"Przejrzyj poniższe opcje"},"helpPageFeatureDisclaimer":{"message":"Wiele funkcji jest domyślnie wyłączonych. Jeśli chcesz pomijać intra, outra, używać Invidious, itp., włącz je poniżej. Możesz również ukryć/pokazać elementy interfejsu użytkownika."},"helpPageHowSkippingWorks2":{"message":"Za każdym razem, gdy pominiesz segment, otrzymasz powiadomienie. Jeśli moment nie wydaje się być poprawny, kliknij łapkę w dół! Możesz również głosować w okienku pop-up."},"Submitting":{"message":"Przesyłanie"},"helpPageCopyOfDatabase2":{"message":"Kod źródłowy jest dostępny. Tak więc, nawet jeśli coś się ze mną stanie, wasze zgłoszenia nie zostaną utracone."},"Credits":{"message":"Autorzy"},"LearnMore":{"message":"Dowiedz się więcej"},"FullDetails":{"message":"Pełne szczegóły"},"CopyDownvoteButtonInfo":{"message":"Daje łapkę w dół i tworzy lokalną kopię, abyś mógł przesłać poprawioną wersję"},"OpenCategoryWikiPage":{"message":"Otwórz stronę wiki dla tej kategorii."},"CopyAndDownvote":{"message":"Skopiuj i daj łapkę w dół"},"ContinueVoting":{"message":"Kontynuuj głosowanie"},"ChangeCategoryTooltip":{"message":"To natychmiastowo zostanie zastosowane do twoich segmentów"},"downvote":{"message":"Głos przeciw"},"upvote":{"message":"Głos za"},"hideSegment":{"message":"Ukryj segment"},"skipSegment":{"message":"Pomiń segment"},"playChapter":{"message":"Odtwórz rozdział"},"SponsorTimeEditScrollNewFeature":{"message":"Użyj pokrętła myszy po najechaniu nad pole edycji, aby szybko dostosować czas. Można użyć kombinacji z klawiszami Ctrl lub Shift, aby doszlifować zmiany."},"categoryPillNewFeature":{"message":"Nowość! Zobacz, kiedy film jest w całości sponsorowany lub jest autopromocją"},"yearAbbreviation":{"message":"r","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Zachowanie","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interfejs","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Skróty klawiszowe","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Kopia/przywracanie","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Różne","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Wygląd okna pomijania","description":"Option label"},"unbind":{"message":"Usuń przypisanie","description":"Unbind keyboard shortcut"},"notSet":{"message":"Nie ustawiono"},"change":{"message":"Zmień"},"youtubeKeybindWarning":{"message":"To jest wbudowany skrót YouTube. Czy na pewno chcesz go użyć?"},"betaServerWarning":{"message":"Serwer BETA jest włączony!"},"openOptionsPage":{"message":"Otwórz stronę ustawień"},"resetToDefault":{"message":"Resetuj do ustawień domyślnych"},"confirmResetToDefault":{"message":"Czy na pewno chcesz przywrócić wszystkie ustawienia do ich domyślnych wartości? Tego nie można cofnąć."},"exportSegments":{"message":"Eksportuj segmenty"},"importSegments":{"message":"Importuj segmenty"},"Import":{"message":"Importuj","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Pomyślnie zrealizowano!"},"redeemFailed":{"message":"Klucz licencji jest nieprawidłowy"},"hideUpsells":{"message":"Ukryj opcje niedostępne bez dodatkowej płatności"},"hideNewFeatureUpdates":{"message":"Ukryj powiadomienia o nowych funkcjach"},"redeem":{"message":"Wykorzystaj"},"enterLicenseKey":{"message":"Wprowadź klucz licencyjny"},"unsubmittedSegmentCounts":{"message":"Aktualnie masz {0} na {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Aktualnie nie masz żadnych nieprzesłanych segmentów","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"nieprzesłany segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"nieprzesłanych segmentów","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"filmie","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"filmach","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Wyczyść wszystkie segmenty","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Czy na pewno chcesz wyczyścić wszystkie nieprzesłane segmenty?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Pokaż segmenty","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Ukryj segmenty","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID filmu","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Liczba segmentów","description":"Header of the unsubmitted segments list"},"actions":{"message":"Akcje","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Udostępnij jako adres URL"},"segmentFetchFailureWarning":{"message":"Ostrzeżenie: Serwer nie odpowiedział jeszcze na segmenty. Być może segmenty na tym filmie są już wysłane, ale po prostu nie otrzymano ich z powodu problemów z serwerem."},"allowScrollingToEdit":{"message":"Zezwalaj na scroll'owanie do edycji czasów"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Lepsze tytuły i miniatury na YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Pozyskiwanie tytułów i miniaturek przez społeczność, aby były opisowe, a nie sensacyjne","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Wybierz najbardziej opisowe"},"Original":{"message":"Oryginalne"},"OriginalTitle":{"message":"Oryginalny tytuł"},"CurrentTime":{"message":"Aktualny czas"},"resetCustomTitle":{"message":"Zresetuj tytuł do oryginalnego tekstu"},"resetIcon":{"message":"Resetuj ikonę"},"TypeYourOwnTitleHere":{"message":"Wpisz tutaj swój własny tytuł"},"VideoNotReady":{"message":"Wideo nie jest gotowe"},"FailedToRender":{"message":"Nie udało się zrenderować","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Brakuje elementu canvas","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Wyjątek podczas renderowania","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Nie udało się załadować","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Format tytułu"},"Disabled":{"message":"Wyłączone"},"CapitalizeWords":{"message":"Każde Słowo Dużą Literą"},"TitleCase":{"message":"Jak w Tytule"},"SentenceCase":{"message":"Jak w zdaniu"},"LowerCase":{"message":"Małe litery"},"FirstLetterUppercase":{"message":"Zaczynaj od wielkiej litery"},"shouldCleanEmojis":{"message":"Usuń Emoji"},"onlyFormatCustomTitles":{"message":"Formatuj tylko przesłane tytuły"},"onlyTitleCaseInEnglish":{"message":"Używaj samych wielkich liter w nieanglojęzycznych tytułach"},"onlyTitleCaseInEnglishDescription":{"message":"Wykrywanie języka nie jest doskonałe i czasami oznacza angielskie tytuły jako nieanglojęzyczne."},"thumbnailFallbackOption":{"message":"Gdy nie przesłano żadnej miniatury dla filmu"},"whatThumbnailFallbackOption":{"message":"Przy wyborze losowej klatki użyte zostaną dane z SponsorBlock, by zapewnić, że nie zostanie wybrana klatka z segmentu promocyjnego.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Pokaż losową klatkę z filmu"},"TheOriginalThumbnail":{"message":"Pokaż oryginalną miniaturę"},"showABlankBox":{"message":"Pokaż puste pole"},"AutoGenerated":{"message":"Pokaż miniaturkę automatycznie wygenerowaną przez YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Początek"},"Middle":{"message":"Środek"},"keepUnsubmitted":{"message":"Zapisz przesłane głosy"},"showLiveCover":{"message":"Pokaż awatar kanału na ekranie następnych filmów","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Nigdy nie używaj miniatur testowanych metodą A/B"},"ignoreAbThumbnailsDescription":{"message":"Kanały mogą konfigurować testy, podczas których YouTube wyświetla różne miniatury w zależności od osoby. Ta opcja zawsze będzie używać pierwszej miniatury, aby zachować spójność."},"abThumbnailsWarning":{"message":"Uwaga: dla tego filmu wideo przeprowadzany jest obecnie test A/B miniatur. Oznacza to, że miniatura może często się zmieniać. Ze względu na ryzyko należy unikać głosowania na oryginalną miniaturę."},"whatKeepUnsubmitted":{"message":"Zapisz wysłane głosy i pokazuj tytuły i miniatury, które wybrałeś zamiast najwyżej ocenionych na serwerze."},"keepUnsubmittedInPrivate":{"message":"Zapisuj zgłoszenia z kart prywatnych"},"useThumbnailGenerationService":{"message":"Używaj usługi generowania miniatur"},"titleMaxLines":{"message":"Maksymalna ilość wierszy w tytule"},"titleMaxLinesDescription":{"message":"Tytuły filmów zostaną rozmieszczone w tylu wierszach na liście polecanych filmów."},"thumbnailSaturationLevel":{"message":"Poziom nasycenia miniaturki"},"whatSaturateThumbnails":{"message":"Zmniejsz intensywność miniaturek redukując ich kolor"},"hideDetailsWhileFetching":{"message":"Ukryj szczegóły podczas pobierania"},"hideDetailsWhileFetchingDescription":{"message":"Ukryj tytuły i miniaturki podczas pobierania danych z serwera. Jeśli to ustawienie zostanie wyłączone, tytuły i miniaturki będą migać podczas zamiany."},"ignoreTranslatedTitles":{"message":"Nie pokazuj tytułów przetłumaczonych przez YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube czasami automatycznie tłumaczy tytuły filmów na język interfejsu. Ta opcja ma zastosowanie tylko wtedy, gdy żaden tytuł nie został jeszcze wysłany."},"onAllPages":{"message":"Na wszystkich stronach","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Na wszystkich stronach z wyjątkiem stron filmów","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Nigdy"},"thumbnailGeneratorDescription1":{"message":"Usługa generowania miniatur znacznie przyspiesza generowanie miniatur, wysyłając anonimowe żądanie z identyfikatorem filmu na zdalny serwer. Miniaturka zostanie wtedy wygenerowana lub pobrana z pamięci podręcznej, jeśli została już wygenerowana."},"thumbnailGeneratorDescription2":{"message":"Jeżeli zostanie użyta na stronach filmów, może spowodować wyciek niepublicznych filmów na ten serwer. Wybranie opcji \"Na wszystkich stronach z wyjątkiem stron filmów\" pozwoli uniknąć tego problemu. Inną opcją jest hostowanie własnej usługi generowania miniatur."},"thumbnailGeneratorDescription3":{"message":"Jeśli korzystanie z usługi generowania miniatur jest wyłączone, wszystkie żądania będą korzystać z systemu zapytań typu k-anonymity, co utrudnia serwerowi przewidzenie, które filmy zostały pobrane i będzie używana wolniejsza lokalna usługa generowania miniatur.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Kod źródłowy usługi generowania miniatur"},"moreAboutKAnonymity":{"message":"Więcej o systemie zapytań typu k-anonimity","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Zawsze wyświetlaj przycisk \"Pokaż oryginalny\""},"whatAlwaysShowShowOriginalButton":{"message":"Jeśli chcesz zawsze wiedzieć, czy tytuł/miniaturka uległa zmianie, włącz tę opcję."},"showOriginalOnHover":{"message":"Zamień między niestandardowymi a oryginalnymi szczegółami po najechaniu na nie"},"showOriginalOnHoverOfVideoDescription":{"message":"Spowoduje to wyłączenie autoodtwarzania po najechaniu kursorem"},"showCustomOnHoverIfCasual":{"message":"Pokaż niestandardowy tytuł po najechaniu, jeżeli tytuł trybu casual jest pokazywany"},"showIconForFormattedTitles":{"message":"Wyświetl przycisk \"Pokaż oryginał\" dla automatycznie sformatowanych tytułów"},"Enable":{"message":"Włącz"},"Titles":{"message":"Tytuły","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniaturki","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Głosy casual","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Błąd"},"ShowOriginal":{"message":"Pokaż oryginał"},"ShowModified":{"message":"Pokaż zmienione szczegóły"},"ShowFormatted":{"message":"Pokaż Sformatowane Szczegóły"},"FillerWarning":{"message":"Uwaga: To jest niezwykle agresywna kategoria. Najprawdopodobniej będziesz musiał często cofać lub czasami nawet wyłączyć automatyczne pomijanie. Wiele filmów ma ponad 50% filmu oznaczonego tą kategorią! Należy jednak pamiętać, że nadal istnieją szczegółowe wytyczne, których należy przestrzegać przy wysyłaniu segmentów.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Dołącz poprzez Discord lub Matrix, by pozostać na tym czacie na stałe","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Pokaż skrócone wytyczne w menu edycji","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Unikaj przesadnych wyrazów twarzy","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Myśl szerzej niż po prostu o odpowiedzi na pytanie w oryginalnym tytule","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Unikaj opisywania reakcji na film (np. \"niewiarygodne\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Uwzględnij wystarczająco informacji, by użytkownik mógł podjąć świadomy wybór o kliknięciu"},"tip5":{"message":"Zacznij od wielkiej litery jak w zdaniu ","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Zaznacz wszystkie pola wytycznych, aby przesłać","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Mój tytuł zaczyna się wielką literą, tak jak zdanie","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Mój tytuł to nie tylko odpowiedź na postawione w tytule pytanie","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Tytuły powinny opisywać film lub fabułę w ogóle. Zamiast polegać na ciekawym, oryginalnym tytule, obejrzyj cały film, aby dowiedzieć się, o czym on właściwie jest.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Mój tytuł nie podsumowuje wniosków i nie spoileruje bez potrzeby","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Tytuły nie mają na celu zastąpienia obejrzenia filmu, lecz dają znać, czy warto na niego kliknąć.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Mój tytuł nie weryfikuje faktów, nie wyśmiewa ani nie krytykuje filmu ani jego twórcy","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Tytuły mają być przedstawiane z perspektywy twórcy i filmu. Ocenianie lub sprawdzanie faktów dotyczących samego filmu nie jest tym, czym zajmuje się DeArrow. Tytuły nie mają być sekcją komentarzy.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Wykryte słowo: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Nie używaj zbędnych czasowników na początku tytułu","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Rozpocznij wszystkie tytuły wielką literą. Tytuły powinny być pisane jak zdania","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Tytuły nie powinny kończyć się znakiem '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Nie ma potrzeby odpowiadać na pytanie w oryginalnym tytule. Tytuły powinny opisywać film lub fabułę w ogóle","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Tytuły nie powinny weryfikować faktów, wyśmiewać ani krytykować filmu ani jego twórcy","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Tytuły nie powinny zawierać elementów sensacyjnych z tytułu oryginalnego","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Tytuły nie powinny zawierać emoji","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Przed wysłaniem należy rozwiązać ostrzeżenie"},"dearrowHelpSponsorBlockImported":{"message":"Twoje ustawienia z SponsorBlock zostały automatycznie zaimportowane!"},"howItWorks":{"message":"Jak to działa"},"discordPromotion":{"message":"Wnieś swój wkład, zasugeruj zmiany i pomóż innym na {discord} lub {matrix}"},"deArrowDonationText":{"message":"Jeśli podoba ci się to, co stworzyłem do tej pory, i chcesz pomóc mi za pomocą pieniędzy, oto link"},"termsAgreement":{"message":"Używając tego rozszerzenia, zgadzasz się z {privacy-policy} i {terms}"},"privacyPolicy":{"message":"polityką prywatności"},"termsOfUse":{"message":"warunkami użytkowania"},"openSourceLicenses":{"message":"Licencje Open Source"},"defaultToOriginals":{"message":"Domyślnie wyświetlaj oryginalne informacje o filmie"},"whatDefaultToOriginals":{"message":"Domyślnie pokazuj oryginalny tytuł i miniaturkę, ale po najechaniu wskaźnikiem wyświetlaj proponowane tytuł i miniaturkę."},"replaceTitles":{"message":"Podmień tytuły"},"replaceThumbnails":{"message":"Podmień miniaturki"},"useCrowdsourcedTitles":{"message":"Używaj tytułów pochodzących od społeczności"},"whatUseCrowdsourcedTitles":{"message":"Po wyłączeniu nadal będzie formatować tytuły, ale nie będzie używać tytułów przesłanych przez społeczność","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Czy na pewno chcesz usunąć tę konfigurację?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Nowa konfiguracja"},"DeleteConfiguration":{"message":"Usuń konfigurację"},"ChannelAllowlist":{"message":"Ustawienia specyficzne dla kanału"},"ConfigurationName":{"message":"Nazwa konfiguracji"},"ChannelListInstructions":{"message":"Wprowadź kanały, które chcesz zastosować do tej konfiguracji w polu poniżej, oddzielone nowymi wierszami. Obsługiwane są zarówno identyfikatory kanałów, jak i nazwy wyświetlane. Nazwy użytkowników z @ nie są obsługiwane. Identyfikator kanału można uzyskać, klikając przycisk udostępniania na stronie informacji o kanale. Aby uzyskać dostęp do informacji o kanale, kliknij opis kanału, wyświetlany pod nazwą użytkownika na stronie kanału.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Nie skonfigurowano jeszcze SponsorBlock, aby to zrobić, kliknij przycisk powyżej, aby dodać nową konfigurację.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Pozbądź się clickbait'ów, zastępuj tytuły bardziej adekwatnymi do treści"},"DeArrowPromotionMessage2":{"message":"Zmęczony clickbait'ami? Sprawdź nowy dodatek do przeglądarki, który poprawia tytuły filmów oraz ich miniatury, tak aby były adekwatne do treści"},"DeArrowPromotionMessage3":{"message":"Wypróbuj także rozszerzenie DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Nie podoba Ci się ten tytuł? Jeśli wolisz poniższy tytuł, rozważ skorzystanie z funkcji zamiany tytułu w rozszerzeniu DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Ta miniaturka została utworzona z losowej klatki, ponieważ nie było jeszcze zgłoszenia do tego filmu","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Ta miniaturka została utworzona z losowej klatki, a tytuł został sformatowany automatycznie, ponieważ nie było jeszcze zgłoszenia do tego filmu","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Można to zmienić poniżej","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} tytułów i {thumbnails} miniaturek zostało zastąpionych od czasu zainstalowania tego rozszerzenia","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} tytuł ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} tytułów ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"i {thumbnails} miniaturka","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"i {thumbnails} miniaturek","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} zostało zastąpionych od czasu zainstalowania tego rozszerzenia","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Policz zamiany tytułów i miniaturek"},"countReplacementsDescription":{"message":"Służy do wyświetlania statystyk w wyskakującym okienku.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Dodaj listę filtrów do blokowania ankiet, sekcji merch i innych promocyjnych elementów strony za pomocą yt-neuter"},"requiresUblock":{"message":"Wymaga uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Coś poszło nie tak z wykrywaniem videoID. Spróbuj odświeżyć stronę przed przesłaniem zgłoszenia, aby upewnić się, że zostanie ono przesłane dla właściwego filmu. Jeśli zdarza się to często, wyślij zgłoszenie wraz z listą innych zainstalowanych rozszerzeń i skryptów za pośrednictwem GitHub, Discord lub Matrix."},"dearrowLogoCredit":{"message":"Logo na podstawie Twemoji na licencji CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock nie jest kompatybilny z rozszerzeniem \"Zoom to Fill\". Istnieje wiele alternatyw, których można użyć zamiast tego i które będą działać poprawnie."},"freeTrialStarted":{"message":"Twój bezpłatny okres próbny został rozpoczęty pomyślnie. Odwiedź YouTube, aby go wypróbować"},"freeTrialEnded":{"message":"Twój bezpłatny okres próbny dobiegł końca"},"freeTrialPrompt":{"message":"Aby uzyskać godzinę na przetestowanie, możesz rozpocząć bezpłatny okres próbny za pomocą przycisku poniżej."},"startFreeTrial":{"message":"Wypróbuj za darmo"},"freeAccessRequested":{"message":"Pomyślnie zarejestrowano w celu uzyskania bezpłatnego dostępu. Poczekaj na powiadomienie, aż bezpłatny dostęp zostanie przyznany."},"freeAccessComplete":{"message":"Gratulacje! Masz teraz bezpłatny dostęp do DeArrow"},"DeArrowNotActivated":{"message":"DeArrow nie jest aktywowany"},"ActivateDeArrow":{"message":"Aktywuj rozszerzenie DeArrow"},"DeArrowIsActivated":{"message":"Rozszerzenie DeArrow zostało aktywowane pomyślnie"},"Close":{"message":"Zamknij"},"ViewLicenseKey":{"message":"Wyświetl klucz licencyjny"},"SharingIsCaring":{"message":"Dzielenie się to troska"},"cleanPopup":{"message":"Kompaktowy interfejs wyskakującego okienka listy segmentów"},"syncDisabledWarning":{"message":"Uwaga: pamięć rozszerzeń nie jest włączona w tej przeglądarce. Ustawienia nie zostaną zapisane, jeśli spróbujesz je ustawić."},"syncDisabledWarningDeArrow":{"message":"DeArrow nie będzie działać bez zapisania ustawień."},"syncDisabledFirefoxSuggestions":{"message":"Aby włączyć przechowywanie, przejdź do about:config i ustaw \"webextensions.storage.sync.enabled\" na wartość true."},"storageFull":{"message":"Pamięć rozszerzenia jest przepełniona. Wyczyść nieprzesłane segmenty w ustawieniach, aby zwolnić miejsce."},"previewSegmentRequired":{"message":"Sprawdź segmenty przed przesłaniem. Można to zrobić korzystając z przycisku „Podgląd” lub z następującego skrótu:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Działaj jako VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"W tej chwili nie można wysyłać zgłoszeń z Twojej przeglądarki, ponieważ wydaje się, że zostały wstawione wstępnie wyrenderowane reklamy po stronie serwera YouTube, których rozszerzenie nie jest w stanie usunąć. Jeśli widzisz ten błąd, skontaktuj się z nami."},"DeArrowIsDisabled":{"message":"DeArrow jest wyłączony - kliknij, aby włączyć","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Czy na pewno ta oryginalna miniatura jest zgodna z wytycznymi DeArrow? Jeśli wolisz po prostu oglądać oryginalne miniatury, sprawdź opcję \"Gdy nie przesłano żadnej miniatury dla filmu\" w ustawieniach DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"SponsorBlock nie jest kompatybilny z treściami nagranymi niedawno i na żywo na YouTube TV. Jeśli to jest niedawne nagranie, proszę poczekać kilka godzin na dostępność przetworzonej wersji nagrania.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Dodawanie kanałów do wyjątków nie jest obsługiwane na tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Podoba ci się oryginalny tytuł?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Tak"},"No":{"message":"Nie"},"votes":{"message":"{0} głosy(-ów)","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} głos","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Zabawne","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Kreatywne","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Pomysłowe","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Opisowe","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Inne","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Tryb klasyczny","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Tytuły są zastępowane ustandaryzowanymi formatami opartymi na wytycznych we wszystkich filmach, w których istnieje tytuł stworzony przez społeczność."},"CasualMode":{"message":"Tryb casual","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Zachowaj oryginalne tytuły, jeśli trafnie opisują one film i są pomysłowe lub zabawne.\nWybierz kategorie tytułów, które chcesz widzieć.\nBędziesz mógł głosować, czy dany tytuł pasuje do danej kategorii, czy nie."},"minimumVotes":{"message":"Minimalna liczba głosów","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"newCasualMode":{"message":"Nowa funkcja: tryb casual","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Wyświetlaj ikonę trybu casual tylko wtedy, gdy dostępny jest niestandardowy tytuł"},"OpenSettings":{"message":"Otwórz ustawienia"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/pt_BR/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/pt_BR/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Tempo limite de conexão excedida. Verifique a sua conexão de internet. Se a sua internet estiver funcionando, o servidor está provavelmente sobrecarregado ou fora do ar."},"400":{"message":"O servidor disse que esse pedido foi inválido"},"409":{"message":"Esse segmento já foi enviado."},"502":{"message":"O servidor parece estar sobrecarregado. Tente novamente em alguns segundos."},"fullName":{"message":"SponsorBlock para YouTube - Pule Patrocínios","description":"Name of the extension."},"Description":{"message":"Pule patrocinadores, pedidos para se inscrever e mais em vídeos do YouTube. Denuncie patrocinadores em vídeos que você assistir para economizar o tempo dos outros.","description":"Description of the extension."},"channelWhitelisted":{"message":"Canal adicionado à lista de permissões!"},"Segment":{"message":"segmento"},"Segments":{"message":"segmentos"},"SegmentsCap":{"message":"Segmentos"},"Chapters":{"message":"Capítulos"},"renderAsChapters":{"message":"Renderizar segmentos como capítulos","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Mostrar segmento atual ao lado do tempo do vídeo"},"showAutogeneratedChapters":{"message":"Mostrar capítulos gerados automaticamente pelo YouTube"},"upvoteButtonInfo":{"message":"Aprovar este segmento"},"reportButtonTitle":{"message":"Denunciar"},"reportButtonInfo":{"message":"Denunciar este segmento como inválido."},"Dismiss":{"message":"Ignorar"},"Loading":{"message":"Carregando..."},"Hide":{"message":"Nunca mostrar"},"hitGoBack":{"message":"Aperte \"reverter pulo\" para voltar onde você estava."},"unskip":{"message":"Reverter pulo"},"reskip":{"message":"Pular novamente"},"unmute":{"message":"Reativar o som"},"paused":{"message":"Pausado"},"manualPaused":{"message":"Temporizador parado"},"confirmMSG":{"message":"Para editar ou remover valores individuais, clique no botão de informações ou abra o pop-up da extensão clicando no ícone no canto superior direito."},"clearThis":{"message":"Tem certeza de que deseja limpar isso?\n\n"},"Unknown":{"message":"Ocorreu um erro ao enviar seus segmentos, tente novamente mais tarde."},"sponsorFound":{"message":"Este vídeo tem segmentos no banco de dados!"},"sponsor404":{"message":"Nenhum segmento encontrado"},"sponsorStart":{"message":"O segmento começa agora"},"sponsorEnd":{"message":"O segmento termina agora"},"sponsorCancel":{"message":"Cancelar criação de segmento"},"noVideoID":{"message":"Nenhum vídeo do YouTube encontrado.\nSe isso for um erro, atualize a página."},"refreshSegments":{"message":"Atualizar segmentos"},"success":{"message":"Sucesso!"},"voted":{"message":"Votado!"},"serverDown":{"message":"Parece que o servidor está fora do ar. Entre em contato com o desenvolvedor imediatamente."},"connectionError":{"message":"Ocorreu um erro de conexão. Código de erro: "},"segmentsStillLoading":{"message":"Segmentos ainda carregando..."},"clearTimes":{"message":"Limpar segmentos"},"openPopup":{"message":"Abrir pop-up do SponsorBlock"},"closePopup":{"message":"Fechar pop-up"},"closeIcon":{"message":"Ícone de fechar"},"OpenSubmissionMenu":{"message":"Abrir menu de envio"},"OpenCasualVoteMenu":{"message":"Abrir menu do modo casual"},"sortSegments":{"message":"Organizar segmentos"},"submitCheck":{"message":"Você tem certeza que deseja enviar isto?"},"whitelistChannel":{"message":"Adicionar canal à lista de permissões"},"removeFromWhitelist":{"message":"Remover canal da lista de permissões"},"voteOnTime":{"message":"Votar em um segmento"},"Submissions":{"message":"Envios"},"savedPeopleFrom":{"message":"Você poupou as pessoas de "},"viewLeaderboard":{"message":"Placar de classificação"},"recordTimesDescription":{"message":"Enviar"},"submissionEditHint":{"message":"A edição da seção aparecerá após você clicar em enviar","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Dica: Você pode configurar os atalhos de tecla para enviar nas opções"},"clearTimesButton":{"message":"Limpar intervalos"},"Username":{"message":"Nome de usuário"},"setUsername":{"message":"Definir nome de usuário"},"copyPublicID":{"message":"Copiar ID público de usuário"},"copySegmentID":{"message":"Copiar ID do segmento"},"loopChapter":{"message":"Repetir continuamente o capítulo"},"unloopChapter":{"message":"Parar de Repetir continuamente o capítulo"},"hideThis":{"message":"Ocultar isto"},"Options":{"message":"Opções"},"showButtons":{"message":"Mostrar botões no reprodutor do YouTube"},"hideButtonsDescription":{"message":"Esta opção oculta os botões que aparecem para enviar segmentos no reprodutor do YouTube."},"showSkipButton":{"message":"Mostrar botão pular para os destaques no reprodutor"},"showInfoButton":{"message":"Mostrar botão de informações no reprodutor do YouTube"},"autoHideInfoButton":{"message":"Ocultar automaticamente o botão de informações"},"showDeleteButton":{"message":"Mostrar botão de apagar no reprodutor do YouTube"},"enableViewTracking":{"message":"Ativar contador de segmentos pulados"},"whatViewTracking":{"message":"Este recurso rastreia quais segmentos você pulou para permitir que os usuários saibam o quanto o envio deles ajudou outras pessoas e é usado como uma métrica junto com votos positivos para garantir que spam não entre no banco de dados. A extensão envia uma mensagem ao servidor toda vez que você pula um segmento. Espera-se que a maioria das pessoas não altere essa configuração para que os números de exibição sejam precisos. :)"},"enableViewTrackingInPrivate":{"message":"Ativar rastreamento de contagem de pulos nas guias privadas/anônimas"},"enableTrackDownvotes":{"message":"Armazenar votos negativos de segmentos"},"whatTrackDownvotes":{"message":"Quaisquer segmentos em que você votou negativamente permanecerão ocultos mesmo após a atualização"},"trackDownvotesWarning":{"message":"Aviso: Desativar isto excluirá todos os votos negativos armazenados anteriormente"},"enableTrackDownvotesInPrivate":{"message":"Armazenar segmento de votos negativos em abas privadas/incógnitas"},"enableQueryByHashPrefix":{"message":"Consulta por prefixo de hash"},"whatQueryByHashPrefix":{"message":"Em vez de solicitar segmentos do servidor usando o videoID, são enviados os 4 primeiros caracteres da hash do videoID. Este servidor enviará dados de volta para todos os vídeos com hashes similares."},"enableShowCategoryWithoutPermission":{"message":"Mostrar categorias no menu de envios mesmo sem permissão de envio"},"whatShowCategoryWithoutPermission":{"message":"Algumas categorias exigem autorização de envio devido a requisitos mínimos de reputação"},"showNotice":{"message":"Mostrar notificação outra vez"},"showSkipNotice":{"message":"Mostrar aviso após um segmento ser ignorado"},"showUpcomingNotice":{"message":"Mostrar aviso antes do início de um segmento"},"showCategoryGuidelines":{"message":"Mostrar categoria de ajuda"},"noticeVisibilityMode0":{"message":"Avisos de pulo de duração normal"},"noticeVisibilityMode1":{"message":"Avisos de pulo automático, mesmo de curta duração"},"noticeVisibilityMode2":{"message":"Todos os avisos de pulo, mesmo de curta duração"},"noticeVisibilityMode3":{"message":"Avisos de pulo semitransparentes no pulo automático"},"noticeVisibilityMode4":{"message":"Todos os avisos de pulo semitransparentes"},"longDescription":{"message":"O SponsorBlock permite que você pule patrocinadores, introduções, créditos finais, lembretes de inscrição, e outras partes irritantes dos vídeos do YouTube. O SponsorBlock é uma extensão de navegador de colaboração coletiva que permite enviar a qualquer um o tempo inicial e final de segmentos patrocinados de vídeos do YouTube. Assim que uma pessoa enviar essa informação, todas as outras pessoas com essa extensão irão pular o segmento patrocinado. Você também pode pular seções sem música em vídeos de música.","description":"Full description of the extension on the store pages."},"website":{"message":"Site","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Código fonte","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"A notificação foi atualizada!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Se você ainda não gostar, aperte o botão nunca mostrar.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Pular segmento","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Iniciar/parar segmento","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Abrir menu de envios","description":"Keybind label"},"setSubmitKeybind":{"message":"Enviar segmentos","description":"Keybind label"},"setPreviewKeybind":{"message":"Pré-visualizar segmento","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Fecha notificação de pulo","description":"Keybind label"},"setDownvoteKeybind":{"message":"Segmento de Downvote","description":"Keybind label"},"setUpvoteKeybind":{"message":"Segmento de Downvote","description":"Keybind label"},"nextChapterKeybind":{"message":"Próximo capítulo","description":"Keybind label"},"previousChapterKeybind":{"message":"Capítulo anterior","description":"Keybind label"},"enableDeArrowKey":{"message":"Ativar/desativar o DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Abrir menu de Envio","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Selecione uma tecla, digitando-a e escolha as teclas modificadoras que deseja usar."},"disableSkipping":{"message":"Pular está habilitado"},"enableSkipping":{"message":"Pular está desabilitado"},"yourWork":{"message":"Seus envios","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Código do erro: "},"skip":{"message":"Pular"},"mute":{"message":"Silenciar"},"full":{"message":"Vídeo Completo","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Pular {0}?"},"mute_category":{"message":"Silenciar {0}?"},"skip_to_category":{"message":"Pular para {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Em breve{0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} pulado","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} silenciado","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Pulado para {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Votou em {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Desativar pulo automático"},"enableAutoSkip":{"message":"Ativar pulo automático"},"audioNotification":{"message":"Notificação de áudio ao pular"},"audioNotificationDescription":{"message":"A notificação de áudio ao pular irá tocar um som sempre que um segmento for pulado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido."},"showTimeWithSkips":{"message":"Mostrar tempo com pulos removidos"},"showTimeWithSkipsDescription":{"message":"Este tempo aparece em parênteses ao lado do tempo atual, abaixo da barra de progresso. Isto mostra a duração total do vídeo sem qualquer segmento. Isto inclui segmentos marcados apenas como \"Mostrar na barra de progresso\"."},"youHaveSkipped":{"message":"Você pulou "},"minLower":{"message":"minuto"},"minsLower":{"message":"minutos"},"hourLower":{"message":"hora"},"hoursLower":{"message":"horas"},"youHaveSavedTime":{"message":"Você poupou as pessoas","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" de suas vidas","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Verifique status.sponsor.ajay.app para ver o estado do servidor."},"changeUserID":{"message":"Importar/exportar seu ID de usuário privado"},"whatChangeUserID":{"message":"Esta informação deve se mantida privada. Ela é como uma senha e não deve ser compartilhada. Outras pessoas poderão se passar por você caso obtenham acesso. Se estiver procurando por sua ID pública de usuário, clique no ícone de prancheta no pop-up."},"setUserID":{"message":"Definir ID de usuário privado"},"userIDChangeWarning":{"message":"Aviso: A alteração do ID de usuário privado é permanente. Tem certeza de que gostaria de fazer isso? Certifique-se de fazer backup do seu antigo por precaução."},"createdBy":{"message":"Criado por"},"supportOtherSites":{"message":"Suporte a sites do YouTube de terceiros"},"supportOtherSitesDescription":{"message":"Suporte a clientes do YouTube de terceiros. Para habilitar o suporte, você deve aceitar as permissões extras.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Sites suportados: "},"optionsInfo":{"message":"Ativar apoio ao Invidious, desativar pulo automático, ocultar botões e mais."},"addInvidiousInstance":{"message":"Adicionar instância de cliente de terceiros"},"addInvidiousInstanceDescription":{"message":"Adicionar uma instância personalizada. Isso deve ser formatado APENAS com o domínio. Exemplo: invidious.ajay.app"},"add":{"message":"Adicionar"},"addInvidiousInstanceError":{"message":"Este é um domínio inválido. Ele deve incluir APENAS a parte do domínio. Exemplo: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Redefinir lista de instâncias do Invidious"},"resetInvidiousInstanceAlert":{"message":"Você está prestes a redefinir a lista de instâncias do Invidious"},"invidiousDisabledSafari":{"message":"No momento, o suporte ao Invidious não está disponível no Safari devido a um bug no navegador. Quando a Apple corrigir o bug, ele será adicionado novamente."},"currentInstances":{"message":"Instâncias atuais:"},"minDuration":{"message":"Duração mínima (segundos):"},"minDurationDescription":{"message":"Segmentos menores do que o valor definido não serão pulados ou mostrados no reprodutor."},"enableManualSkipOnFullVideo":{"message":"Usar o pulo manual quando houver um rótulo de vídeo completo"},"whatManualSkipOnFullVideo":{"message":"Para pessoas que desejam assistir ao vídeo sem interrupção se ele for totalmente patrocinado ou de auto-promoção."},"skipNoticeDuration":{"message":"Duração do aviso prévio de pulo (segundos):"},"skipNoticeDurationDescription":{"message":"O aviso de pulo ficará na tela por pelo menos este tempo. Para o pulo manual, pode ser visível por mais tempo."},"shortCheck":{"message":"O seguinte envio é mais curto do que sua opção de duração mínima. Isto significa que já foi enviada e está sendo ignorada devido a esta opção. Tem certeza que deseja enviar mesmo assim?"},"liveOrPremiere":{"message":"Não é permitido o envio de segmentos em transmissões ao vivo ou estreias ainda em andamento. Por favor, aguarde até que terminem, e em seguida, atualize a página e verifique se os segmentos ainda são válidos."},"showUploadButton":{"message":"Mostrar botão de envio"},"customServerAddress":{"message":"Endereço do servidor do SponsorBlock"},"customServerAddressDescription":{"message":"Endereço que o SponsorBlock usa para fazer chamadas ao servidor.\nA menos que você tenha sua própria instância de servidor, isso não deve ser alterado."},"dataFetchingServerAddress":{"message":"Endereço do servidor para busca de dados"},"dataFetchingServerAddressDescription":{"message":"O endereço usado para fazer chamadas para o servidor de busca de dados.\nA menos que você tenha sua própria instância de servidor, isso não deve ser alterado."},"thumbnailCacheServerAddress":{"message":"Endereço do arquivo de miniaturas"},"save":{"message":"Salvar"},"reset":{"message":"Redefinir"},"customAddressError":{"message":"Este endereço não está na forma correta. Certifique-se de que possui http:// ou https:// no início e sem barras no final."},"areYouSureReset":{"message":"Tem certeza que deseja redefinir?"},"mobileUpdateInfo":{"message":"m.youtube.com agora é suportado"},"exportOptions":{"message":"Importar/Exportar todas as opções"},"exportOtherData":{"message":"Importar/Exportar Todos os Outros Dados"},"exportOptionsCopy":{"message":"Editar/copiar"},"exportOptionsDownload":{"message":"Exportar para arquivo"},"exportOptionsUpload":{"message":"Importar de um arquivo"},"whatExportOptions":{"message":"Essa é a sua configuração completa em JSON. Inclui sua identificação de usuário particular, então não compartilhe."},"setOptions":{"message":"Definir opções"},"exportOptionsWarning":{"message":"Aviso: Alterar as opções é permanente e pode fazer a extensão parar de funcionar. Tem certeza que deseja fazer isso? Certifique-se de fazer um backup por precaução."},"incorrectlyFormattedOptions":{"message":"Este JSON não está formatado corretamente. Suas opções não foram alteradas."},"confirmNoticeTitle":{"message":"Enviar segmento"},"submit":{"message":"Enviar"},"cancel":{"message":"Cancelar"},"delete":{"message":"Deletar"},"preview":{"message":"Prévia"},"unsubmitted":{"message":"Não enviado"},"inspect":{"message":"Inspecionar"},"edit":{"message":"Editar"},"copyDebugLogs":{"message":"Copiar Logs de Depuração"},"copyDebugInformation":{"message":"Copiar informações de depuração para a área de transferência"},"copyDebugInformationFailed":{"message":"Erro ao copiar para a área de transferência"},"copyDebugInformationOptions":{"message":"Copia informações para a área de transferência para serem fornecidas a um desenvolvedor quando houver um bug ou quando solicitado por um desenvolvedor. Informações sensíveis como seu ID de usuário, canais na lista de permissões e endereço personalizado do servidor foram removidos. No entanto, ele contém informações como seu useragent, navegador, sistema operacional e número de versão da extensão. "},"copyDebugInformationComplete":{"message":"A informação de depuração foi copiada para a área de transferência. Sinta-se à vontade para remover qualquer informação que prefira não compartilhar. Salve em um arquivo de texto ou cole-a no relatório de erro."},"keyAlreadyUsed":{"message":"Este atalho está vinculado a outra ação. Por favor, selecione um atalho diferente."},"to":{"message":"até","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Copiado!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Inclui âncoras de transição"},"generic_guideline2":{"message":"Reproduzir como se nada tivesse sido pulado"},"category_sponsor":{"message":"Patrocinador"},"category_sponsor_description":{"message":"Promoção paga, referências pagas e anúncios diretos. Não deve ser usado para auto-promoção ou mensagens grátis para causas/criadores/sites/produtos que eles gostam."},"category_sponsor_guideline1":{"message":"Promoções pagas"},"category_sponsor_guideline2":{"message":"Não é para doações ou mercadoria personalizada"},"category_selfpromo":{"message":"Não-pago/Autopromoção"},"category_selfpromo_description":{"message":"Similar a \"patrocinador\", exceto para não-pago ou auto-promoção. Isso inclui seções sobre mercadorias, doações ou informações sobre com quem eles colaboraram."},"category_selfpromo_guideline1":{"message":"Doações, programa de membros e mercadoria personalizada"},"category_selfpromo_guideline2":{"message":"Divulgação gratuita que não acrescenta ao vídeo"},"category_selfpromo_guideline3":{"message":"Não é para produtos de origem corporativa ou mercadorias"},"category_exclusive_access":{"message":"Acesso exclusivo"},"category_exclusive_access_description":{"message":"Apenas para rotular vídeos inteiros. Usado quando um vídeo apresenta um produto, serviço ou local ao qual eles receberam acesso gratuito ou subsidiado."},"category_exclusive_access_pill":{"message":"Este vídeo apresenta um produto, serviço ou local ao qual eles receberam acesso gratuito ou subsidiado","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Todo o vídeo promove algo de acesso gratuito ou subsidiado"},"category_interaction":{"message":"Lembrete de interação (inscrever-se)"},"category_interaction_description":{"message":"Quando houver um pequeno lembrete para curtir, inscrever-se ou seguir no meio do conteúdo. Se é longo ou sobre algo em específico, deveria estar sob auto-promoção."},"category_interaction_guideline1":{"message":"Lembretes rápidos para curtir, inscrever ou seguir"},"category_interaction_guideline2":{"message":"Inclui lembretes indiretos para comentar"},"category_interaction_guideline3":{"message":"Não é para promoção geral, apenas um chamado para à ação"},"category_interaction_short":{"message":"Lembrete de interação"},"category_intro":{"message":"Intervalo/Vinheta de abertura"},"category_intro_description":{"message":"Um intervalo sem conteúdo real. Pode ser uma pausa, um quadro estático, uma animação repetitiva. Isso não deve ser usado em transições que contenham informação."},"category_intro_short":{"message":"Intervalo"},"category_intro_guideline1":{"message":"Intervalo sem conteúdo real"},"category_intro_guideline2":{"message":"Não é para transições com informações"},"category_outro":{"message":"Finalização/Créditos"},"category_outro_description":{"message":"Créditos ou quando os cards finais do YouTube aparecem. Não deve ser usado para conclusões informativas."},"category_outro_guideline1":{"message":"Não inclui conteúdo, mesmo que cartões de finalização estejam na tela"},"category_preview_description":{"message":"Coleção de clipes que mostram o que está por vir neste vídeo ou em outros vídeos em uma série onde todas as informações são repetidas mais tarde no vídeo."},"category_preview_guideline1":{"message":"Clipes que aparecem mais tarde ou em um vídeo futuro"},"category_preview_guideline2":{"message":"Recapitulação de um vídeo anterior"},"category_preview_guideline3":{"message":"Não é para seções que adicionam conteúdo adicional"},"category_filler":{"message":"Enrolação/Piadas"},"category_filler_description":{"message":"Cenas ou piadas que não são necessárias para entender o conteúdo principal do vídeo. Isto não deve incluir segmentos fornecendo contexto ou detalhes de fundo. Esta categoria é muito agressiva para quando você não está com o humor para \"divertir\"."},"category_filler_short":{"message":"Tangentes"},"category_filler_guideline1":{"message":"Cenas ou piadas tangenciais"},"category_filler_guideline2":{"message":"Distrações, erros de gravação, repetições"},"category_filler_guideline3":{"message":"Não é para cenas necessárias para o entendimento do tópico"},"category_music_offtopic":{"message":"Música: trecho sem música"},"category_music_offtopic_description":{"message":"Apenas para uso em vídeos musicais. Deve ser usado exclusivamente para seções de vídeos musicais que já não pertençam à outra categoria."},"category_music_offtopic_short":{"message":"Sem música"},"category_music_offtopic_guideline1":{"message":"Seções que não estão nos lançamentos oficiais"},"category_music_offtopic_guideline2":{"message":"Sem música numa performance ao vivo"},"category_poi_highlight":{"message":"Destaques"},"category_poi_highlight_description":{"message":"A parte do vídeo que a maioria das pessoas procura. Similar aos comentários \"Vídeo começa em x\"."},"category_poi_highlight_guideline1":{"message":"A seção que maioria das pessoas está procurando"},"category_poi_highlight_guideline2":{"message":"Pode pular o contexto"},"category_poi_highlight_guideline3":{"message":"Pode pular para o título ou miniatura"},"category_chapter":{"message":"Capítulo"},"category_chapter_description":{"message":"Capítulos personalizados que descrevem as principais seções de um vídeo."},"category_chapter_guideline1":{"message":"Não mencione os nomes dos patrocinadores"},"category_chapter_guideline2":{"message":"Use capítulos maiores para seções gerais"},"category_chapter_guideline3":{"message":"Capítulos menores podem ser colocados em capítulos maiores"},"category_livestream_messages":{"message":"Transmissão ao vivo: Leituras de Doação/Mensagem"},"category_livestream_messages_short":{"message":"Leitura de Mensagens"},"autoSkip":{"message":"Pular automaticamente"},"manualSkip":{"message":"Pular manualmente"},"showOverlay":{"message":"Mostrar na barra de progresso"},"disable":{"message":"Desativar"},"autoSkip_POI":{"message":"Pular automaticamente para o início"},"manualSkip_POI":{"message":"Perguntar quando o vídeo carregar"},"showOverlay_POI":{"message":"Mostrar na barra de progresso"},"showOverlay_full":{"message":"Mostrar rótulo"},"showOverlay_chapter":{"message":"Mostrar capítulos"},"autoSkipOnMusicVideos":{"message":"Pular automaticamente todos os segmentos quando houver trechos sem música"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Apenas pule automaticamente em music.youtube.com"},"muteSegments":{"message":"Permitir segmentos que silenciem o áudio ao invés de pular"},"fullVideoSegments":{"message":"Mostrar um ícone quando um vídeo é inteiramente um anúncio","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Mostrar rótulos nas miniaturas de vídeo também","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Cor não enviada","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Cor da barra de progresso"},"category":{"message":"Categoria"},"skipOption":{"message":"Opção de pulo","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Abrir opções avançadas de saltos"},"advancedSkipNotSaved":{"message":"Erro de sintaxe: Suas opções não foram salvas"},"advancedSkipSettingsHelp":{"message":"Como isso funciona","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Habilitar servidor de testes beta"},"whatEnableTestingServer":{"message":"Seus envios e votos NÃO SERÃO ENVIADOS para o servidor principal. Use isso apenas para testes."},"testingServerWarning":{"message":"Todos os envios e votos NÃO SERÃO ENVIADOS para o servidor principal quando conectado ao servidor de teste. Desative quando você quiser fazer envios reais."},"bracketNow":{"message":"(Agora)"},"moreCategories":{"message":"Mais categorias"},"chooseACategory":{"message":"Selecione uma categoria"},"enableThisCategoryFirst":{"message":"Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-la nas opções. Você será redirecionado para as opções agora.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Aviso: este tipo de segmento pode ter no máximo um ativo por vez. Enviar múltiplos fará com que um aleatório seja mostrado."},"youMustSelectACategory":{"message":"Você deve selecionar uma categoria para todos os segmentos que você está enviando!"},"bracketStart":{"message":"(Início)"},"bracketEnd":{"message":"(Fim)"},"End":{"message":"Fim","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"oculto: voto negativo"},"hiddenDueToDuration":{"message":"oculto: muito curto"},"manuallyHidden":{"message":"oculto manualmente"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"O ID do canal ainda não foi carregado. Se você estiver usando um vídeo incorporado, tente usar a página inicial do YouTube. Isso também pode ser causado por mudanças no layout do YouTube, se este for o caso, comente aqui:"},"invidiousPermissionRefresh":{"message":"O navegador revogou a permissão necessária para funcionar em Invidious e em outros sites de terceiros. Por favor, clique no botão abaixo para reativar essa permissão."},"acceptPermission":{"message":"Aceitar permissão"},"permissionRequestSuccess":{"message":"Solicitação de permissão bem-sucedida!"},"permissionRequestFailed":{"message":"Falha na solicitação de permissão, você clicou em negar?"},"adblockerIssueWhitelist":{"message":"Se você não consegue resolver isso, desative a opção 'Forçar verificação do canal antes de pular', pois o SponsorBlock não pode recuperar as informações deste vídeo"},"forceChannelCheck":{"message":"Forçar verificação do canal antes de pular"},"whatForceChannelCheck":{"message":"Por padrão, ele pulará segmentos imediatamente antes mesmo de saber qual é o canal. Alguns segmentos no início do vídeo podem ser ignorados nos canais da lista de permissões. A ativação dessa opção evitará isso, mas irá fazer com que todos os pulos tenham um pequeno atraso, pois a obtenção do ID do canal pode levar algum tempo. Esse atraso pode ser imperceptível se você possuir uma internet rápida."},"forceChannelCheckPopup":{"message":"Considere ativar \"Forçar verificação do canal antes de pular\""},"downvoteDescription":{"message":"Tempo incorreto"},"incorrectVote":{"message":"Incorreto"},"harmfulVote":{"message":"Nocivo","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Mudar categoria"},"nonMusicCategoryOnMusic":{"message":"Esse vídeo é categorizado como música. Tem certeza de que é patrocinado? Se realmente for um trecho sem música, abra as opções da extensão e ative a categoria. Assim, você pode enviar esse segmento como \"sem música\" em vez de \"patrocinador\". Leia as diretrizes se tiver dúvidas."},"multipleSegments":{"message":"Múltiplos segmentos"},"guidelines":{"message":"Diretrizes"},"readTheGuidelines":{"message":"Leia as diretrizes!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"As categorias estão aqui!"},"categoryUpdate2":{"message":"Abrir opções para ignorar introduções, créditos finais, promoção de mercadoria, etc."},"help":{"message":"Ajuda"},"GotIt":{"message":"Entendi","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Este segmento é grande. Se o vídeo inteiro for sobre um tópico, altere de \"Pular\" para \"Vídeo completo\". Consulte as diretrizes para obter mais informações."},"categoryPillTitleText":{"message":"Este vídeo inteiro está rotulado como esta categoria e está muito integrado para poder ser separado"},"chapterNameTooltipWarning":{"message":"Um de seus nomes de capítulo é semelhante a uma categoria. Sempre que possível, você deve usar categorias."},"experiementOptOut":{"message":"Optar por sair de todos os experimentos futuros","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Ocultar para sempre"},"warningChatInfo":{"message":"Percebemos que você estava cometendo alguns erros comuns. Apreciamos muito o seu trabalho até agora, mas nos esforçamos para alcançar a perfeição aqui, então mesmo os pequenos erros são importantes :)"},"questionButton":{"message":"Eu tenho uma dúvida"},"askAQuestion":{"message":"Pergunte algo"},"warningConfirmButton":{"message":"Eu entendo o motivo"},"warningError":{"message":"Erro ao tentar reconhecer o aviso:"},"deArrowMessageRecieved":{"message":"Você recebeu uma dica de um moderador"},"Donate":{"message":"Doar"},"considerDonating":{"message":"Ajude a financiar o desenvolvimento"},"hideDonationLink":{"message":"Ocultar o link de doação"},"darkModeOptionsPage":{"message":"Modo escuro na página de opções"},"helpPageThanksForInstalling":{"message":"Obrigado por instalar o SponsorBlock."},"helpPageReviewOptions":{"message":"Por favor, revise as opções abaixo"},"helpPageFeatureDisclaimer":{"message":"Muitos recursos são desativados por padrão. Se você deseja pular introduções, encerramentos, usar o Invidious, entre outros, ative as opções abaixo. Você também pode ocultar/mostrar elementos da interface."},"helpPageHowSkippingWorks2":{"message":"Sempre que você pular um segmento, você receberá um aviso. Se o tempo estiver errado vote contra clicando no voto negativo! Você também pode votar no pop-up."},"Submitting":{"message":"Enviando"},"helpPageCopyOfDatabase2":{"message":"O código-fonte está disponível gratuitamente. Então, mesmo que algo aconteça comigo, seus envios não estarão perdidos."},"Credits":{"message":"Créditos"},"LearnMore":{"message":"Saiba mais"},"FullDetails":{"message":"Detalhes completos"},"CopyDownvoteButtonInfo":{"message":"Vota negativamente e cria uma cópia local para você reenviar"},"OpenCategoryWikiPage":{"message":"Abrir a página wiki desta categoria."},"CopyAndDownvote":{"message":"Copiar e votar negativamente"},"ContinueVoting":{"message":"Continuar votando"},"ChangeCategoryTooltip":{"message":"Isto irá aplicar instantaneamente aos seus segmentos"},"downvote":{"message":"Voto negativo"},"upvote":{"message":"Voto positivo"},"hideSegment":{"message":"Ocultar segmento"},"skipSegment":{"message":"Pular segmento"},"playChapter":{"message":"Reproduzir capítulo"},"SponsorTimeEditScrollNewFeature":{"message":"Use a roda do mouse enquanto mantêm o cursor sobre a caixa de edição para ajustar o tempo rapidamente. Combinações das teclas ctrl e shift podem ser usadas para refinar as mudanças."},"categoryPillNewFeature":{"message":"Novidade! Veja quando um vídeo é inteiramente patrocinado ou de auto-promoção"},"yearAbbreviation":{"message":"a","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Comportamento","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interface","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Teclas de atalho","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Backup/Restauração","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Diversos","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Quando mostrar aviso de pulo","description":"Option label"},"unbind":{"message":"Desvincular","description":"Unbind keyboard shortcut"},"notSet":{"message":"Não configurado"},"change":{"message":"Alterar"},"youtubeKeybindWarning":{"message":"Este já é um atalho padrão do YouTube. Tem certeza que deseja utilizá-lo?"},"betaServerWarning":{"message":"O servidor BETA está habilitado!"},"openOptionsPage":{"message":"Abrir página de opções"},"resetToDefault":{"message":"Redefinir configurações para o padrão"},"confirmResetToDefault":{"message":"Tem certeza de que deseja redefinir todas as configurações para os valores padrão? Essa ação não poderá ser desfeita."},"exportSegments":{"message":"Exportar segmentos"},"importSegments":{"message":"Importar segmentos"},"Import":{"message":"Importar","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Resgatado com sucesso!"},"redeemFailed":{"message":"A chave de licença é inválida"},"hideUpsells":{"message":"Ocultar opções não disponíveis sem pagamento extra"},"hideNewFeatureUpdates":{"message":"Ocultar avisos sobre novos recursos"},"redeem":{"message":"Resgatar"},"enterLicenseKey":{"message":"Inserir chave de licença"},"unsubmittedSegmentCounts":{"message":"Você tem atualmente {0} em {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"No momento, você não tem segmentos não enviados","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"segmento não enviado","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"segmentos não enviados","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"vídeo","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"vídeos","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Limpar todos os segmentos","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Tem certeza de que deseja limpar todos os segmentos não enviados?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Mostrar segmentos","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Ocultar segmentos","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID do vídeo","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Contagem de segmentos","description":"Header of the unsubmitted segments list"},"actions":{"message":"Ações","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Compartilhar como URL"},"segmentFetchFailureWarning":{"message":"Alerta: o servidor ainda não respondeu com segmentos. Pode ser que os segmentos desse vídeo já tenham sido enviados, mas ainda não foram recebidos devido a problemas do servidor."},"allowScrollingToEdit":{"message":"Permitir rolagem para editar tempos"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Melhores títulos e miniaturas no YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Miniaturas e títulos selecionados pela comunidade para descrever os vídeos de forma objetiva, sem sensacionalismo e sem truques para ganhar cliques.","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Escolha o que mais bem descreve"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Título original"},"CurrentTime":{"message":"Momento atual"},"resetCustomTitle":{"message":"Voltar ao título original"},"resetIcon":{"message":"Redefinir ícone"},"TypeYourOwnTitleHere":{"message":"Digite um título melhor"},"VideoNotReady":{"message":"O vídeo não está pronto"},"FailedToRender":{"message":"Falha ao renderizar","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Quadro não encontrado","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Erro ao renderizar","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Falha ao carregar","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Formatação do título"},"Disabled":{"message":"Desativado (recomendado para PT-BR)"},"CapitalizeWords":{"message":"Todas As Palavras Começam Com Letras Maiúsculas"},"TitleCase":{"message":"Maioria em Maiúsculas, Exceto Preposições"},"SentenceCase":{"message":"Só a primeira letra maiúscula"},"LowerCase":{"message":"tudo minúsculo"},"FirstLetterUppercase":{"message":"Primeira letra em maiúscula"},"shouldCleanEmojis":{"message":"Remover emojis"},"onlyFormatCustomTitles":{"message":"Apenas formatar títulos enviados pelo usuário"},"onlyTitleCaseInEnglish":{"message":"Palavras em maiúsculas para títulos não ingleses"},"onlyTitleCaseInEnglishDescription":{"message":"Detecção de idiomas não é perfeita! Pode detecta alguns títulos em inglês como não-inglês."},"thumbnailFallbackOption":{"message":"Quando não houver nenhuma miniatura enviada"},"whatThumbnailFallbackOption":{"message":"Ao optar por aleatório, dados do SponsorBlock vão garantir que nenhum segmento promocional seja selecionado.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Usar quadro de momento aleatório"},"TheOriginalThumbnail":{"message":"Usar a miniatura original"},"showABlankBox":{"message":"Usar em branco"},"AutoGenerated":{"message":"Exibir as miniaturas auto-geradas pelo YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Início"},"Middle":{"message":"Meio"},"keepUnsubmitted":{"message":"Armazenar votos enviados"},"showLiveCover":{"message":"Mostrar Avatar do Canal nos Próximos Vídeos","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Nunca usar miniaturas testadas por A/B"},"ignoreAbThumbnailsDescription":{"message":"Assim como na Netflix, alguns canais podem configurar testes em seus vídeos onde o YouTube mostrará miniaturas diferentes para cada pessoa. Esta opção sempre usará a primeira miniatura para manter a consistência."},"abThumbnailsWarning":{"message":"Aviso: Este vídeo atualmente tem um teste de miniatura A/B em execução. Isto significa que a miniatura pode mudar com frequência. Provavelmente, não deverá votar a favor da miniatura original devido a este risco."},"whatKeepUnsubmitted":{"message":"Manter votos enviados após votar para mostrar os títulos e miniaturas que você escolheu em vez do mais votado no servidor."},"keepUnsubmittedInPrivate":{"message":"Registrar votos de navegação anônima"},"useThumbnailGenerationService":{"message":"Usar serviço de geração de miniaturas"},"titleMaxLines":{"message":"Máximo de linhas para o título"},"titleMaxLinesDescription":{"message":"Os títulos do vídeo serão quebrados por esta quantidade de linhas nas sugestões."},"thumbnailSaturationLevel":{"message":"Nível de saturação da Miniatura"},"whatSaturateThumbnails":{"message":"Torne as miniaturas menos vibrantes reduzindo sua cor (Também uma solução para Daltônicos)"},"hideDetailsWhileFetching":{"message":"Não mostrar detalhes enquanto busca dados no servidor"},"hideDetailsWhileFetchingDescription":{"message":"Ocultar títulos e miniaturas ao buscar dados do servidor. Se desativado, você terá a experiência de ver tudo piscando na sua frente quando os títulos e miniaturas mudarem."},"ignoreTranslatedTitles":{"message":"Não exibir títulos traduzidos do YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"O YouTube às vezes irá traduzir títulos automaticamente para o seu idioma nativo. Esta opção só se aplica quando um título crowdsourced não está disponível."},"onAllPages":{"message":"Em todas as páginas","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Em todas as páginas, exceto de vídeos","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Nunca"},"thumbnailGeneratorDescription1":{"message":"O serviço de geração de miniaturas acelera bastante o processo porque envia anonimamente a identificação do vídeo para um servidor remoto. Uma miniatura será então gerada, ou captada de um arquivo pré-existente."},"thumbnailGeneratorDescription2":{"message":"Usar o serviço em páginas de vídeos traz o risco de vazar identificação de vídeos não-listados para o servidor. Selecione a opção \"Em todas as páginas, exceto de vídeos\" para que isso não ocorra. Outra opção é hospedar seu próprio serviço de geração de miniaturas."},"thumbnailGeneratorDescription3":{"message":"Se o serviço de geração de miniaturas estiver desativado, todas as solicitações usarão um sistema anônimo de consultas, dificultando para o servidor prever quais vídeos já foram buscados, e um servidor local mais lento será usado.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Código-fonte do serviço de geração de miniaturas"},"moreAboutKAnonymity":{"message":"Mais informações sobre o anonimato","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Sempre exibir o botão \"Mostrar Original\""},"whatAlwaysShowShowOriginalButton":{"message":"Se você sempre quiser saber se um título/miniatura mudou, ative isso."},"showOriginalOnHover":{"message":"Trocar entre detalhes personalizados e detalhes originais no hover"},"showOriginalOnHoverOfVideo":{"message":"Trocar entre detalhes personalizados e detalhes originais ao passar o mouse sobre qualquer lugar na placa de vídeo"},"showOriginalOnHoverOfVideoDescription":{"message":"Isto irá desativar a reprodução automática ao passar o mouse"},"showCustomOnHoverIfCasual":{"message":"Mostrar título personalizado ao passar o mouse se um título de modo casual estiver sendo mostrado"},"showIconForFormattedTitles":{"message":"Mostre o botão \"Mostrar original\" para Títulos Auto-Formatados"},"Enable":{"message":"Ativar"},"Titles":{"message":"Títulos","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniaturas","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Votos casuais","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Erro"},"ShowOriginal":{"message":"Mostrar detalhes originais"},"ShowModified":{"message":"Mostrar Detalhes Modificados"},"ShowFormatted":{"message":"Exibir detalhes formatados"},"FillerWarning":{"message":"Atenção: essa categoria é altamente rigorosa. Pode ser que você precise reverter pulos ou desabilitá-los por um tempo. Saiba que alguns vídeos podem ter pulos com mais da metade da duração total. Entretanto, lembre-se de que ainda há orientações específicas a seguir ao submeter segmentos.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Entre no Discord ou Matrix para continuarmos a conversa","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Exibir orientações","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Evite expressões faciais exageradas","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Reflita aquilo que assistiu e escreva algo revelante ao Video, não responda apenas a pergunta do título original","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Evite descrever reações sobre o vídeo (\"chocante\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Antes de clicar, forneça informações suficientes para uma melhor seleção"},"tip5":{"message":"Comece as frases com maiúsculas","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Verifique todas as diretrizes para enviar","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Meu título tem letra maiúscula como uma frase","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Meu título não responde apenas a uma pergunta colocada no título","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Os títulos devem descrever o vídeo, ou a história em geral. Você deve se certificar de assistir ao vídeo completo para saber o que é de fato em vez de depender de um título original intrigante.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Meu título não resume uma conclusão ou estraga desnecessariamente","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Títulos não devem ser substituídos por assistir o vídeo inteiramente, mas sim para que você saiba se você deve clicar ou não.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Meus títulos não verificam fatos, zombam ou criticam o vídeo e/ou seu criador","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Os títulos devem ser do ponto de vista do criador e do vídeo. Avaliar ou checar fatos sobre o vídeo em si está fora do escopo do DeArrow. Os títulos não devem ser uma seção de comentários.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Palavra detectada: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Não use verbos desnecessários no início do título","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Inicia todos os títulos com letra maiúscula. Títulos devem ser formatados como uma frase","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Os títulos não devem terminar com um '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Não basta adicionar uma resposta a uma pergunta no título original. Os títulos devem descrever o vídeo ou a história em geral","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Os títulos não devem verificar fatos, zombar ou criticar o vídeo e seu criador","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Títulos não devem manter elementos sensacionais do título original","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Os títulos não devem conter emojis","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Você deve resolver o aviso antes de enviar"},"dearrowHelpSponsorBlockImported":{"message":"Observação: suas configurações do SponsorBlock foram importadas automaticamente!"},"howItWorks":{"message":"Como funciona"},"discordPromotion":{"message":"Deixe sua contribuição, sugestões ou ajude outros usuários no {discord} ou {matrix}"},"deArrowDonationText":{"message":"Se você está satisfeito com a extensão e gostaria de fazer uma contribuição em dinheiro, acesse este link"},"termsAgreement":{"message":"Ao usar essa extensão, você concorda com a {privacy-policy} e {terms}"},"privacyPolicy":{"message":"Política de privacidade"},"termsOfUse":{"message":"Termos de uso"},"openSourceLicenses":{"message":"Licenças de código aberto"},"defaultToOriginals":{"message":"Informações padrão para o vídeo original"},"whatDefaultToOriginals":{"message":"Exibir o título e a miniatura original por padrão, mas tem um botão que aparece ao passar o mouse para ver os títulos e miniaturas personalizados."},"replaceTitles":{"message":"Substituir títulos"},"replaceThumbnails":{"message":"Substituir miniaturas"},"useCrowdsourcedTitles":{"message":"Use as alterações dos Títulos da Comunidade de DeArrow"},"whatUseCrowdsourcedTitles":{"message":"Se desabilitado, formatação de títulos ainda funcionará, mas não usará os títulos da comunidade","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Deseja mesmo apagar esse ajuste?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Novo ajuste"},"DeleteConfiguration":{"message":"Apagar Configuração"},"ChannelAllowlist":{"message":"Configurações específicas do canal"},"ConfigurationName":{"message":"Nome do ajuste"},"ChannelListInstructions":{"message":"Digite todos os canais que você deseja aplicar esta configuração na caixa abaixo, separados por novas linhas. IDs de canal e nomes de exibição são suportados. @ nomes de usuário não são suportados. Você pode obter a ID do canal ao clicar no botão Compartilhar na página sobre isso do canal. Para chegar à página \"Sobre\", clique na descrição do canal que aparece abaixo do nome do canal na página do canal.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Nenhum ajuste salvo. Clique no botão Novo ajuste.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Parar clickbait substituindo títulos e miniaturas com mais precisão"},"DeArrowPromotionMessage2":{"message":"Cansado de clickbait? Confira minha nova extensão para melhorar os títulos e miniaturas"},"DeArrowPromotionMessage3":{"message":"Confira também o DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Não gostou deste título? Se interessou pelo título abaixo? Considere conferir o recurso de substituição de título DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Esta miniatura é escolhida de um horário aleatório porque ainda não há envio neste vídeo","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Esta miniatura é escolhida de um horário aleatório porque ainda não há envio neste vídeo","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Você pode alterar este padrão abaixo","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} títulos e miniaturas de {thumbnails} foram substituídos desde que você instalou esta extensão","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} título","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} títulos ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"e {thumbnails} miniaturas","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"e {thumbnails} miniaturas","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} títulos e miniaturas foram substituídos desde que você instalou esta extensão","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Contagem de títulos e miniaturas substituídos"},"countReplacementsDescription":{"message":"Usado para fornecer estatísticas no popup.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Adicionar uma lista de filtros para bloquear pesquisas, juntar prateleiras e outros elementos promocionais da página usando yt-neuter"},"requiresUblock":{"message":"Requer o uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Algo deu errado com a detecção de videoID. Por favor, tente atualizar antes de enviar para garantir que ele seja enviado para o vídeo correto. Se isso está acontecendo muito, por favor, envie um relatório disso junto com outras extensões ou scripts que você instalou através do GitHub, Discord ou Matriz."},"dearrowLogoCredit":{"message":"Logotipo baseado em Twemoji licenciado sob CC-BY 4.0"},"zoomToFillUnsupported":{"message":"O SponsorBlock não é compatível com a extensão \"Zoom to Fill\". Há muitas alternativas que você pode usar que funcionarão corretamente."},"freeTrialStarted":{"message":"Sua avaliação gratuita foi iniciada com sucesso. Visite o YouTube para testá-lo"},"freeTrialEnded":{"message":"Sua avaliação gratuita terminou"},"freeTrialPrompt":{"message":"Se você quiser testá-lo, você pode iniciar um teste gratuito com o botão abaixo."},"startFreeTrial":{"message":"Iniciar teste grátis"},"freeAccessRequested":{"message":"Você está registrado com sucesso para acesso gratuito. Você será notificado quando o acesso gratuito for concedido."},"freeAccessComplete":{"message":"Parabéns! Agora você tem acesso gratuito ao DeArrow"},"DeArrowNotActivated":{"message":"DeArrow não está ativado"},"ActivateDeArrow":{"message":"Ativar DeArrow"},"DeArrowIsActivated":{"message":"DeArrow foi ativado com sucesso"},"Close":{"message":"Fechar"},"ViewLicenseKey":{"message":"Visualizar chave de licença"},"SharingIsCaring":{"message":"Compartilhar é cuidar"},"cleanPopup":{"message":"Esconder desordem da lista de segmentos no popup"},"syncDisabledWarning":{"message":"Aviso: O armazenamento da extensão foi desativado no seu navegador. As configurações não serão salvas se você tentar salvá-las."},"syncDisabledWarningDeArrow":{"message":"O DeArrow não irá funcionar sem armazenamento."},"syncDisabledFirefoxSuggestions":{"message":"Você pode ativar isso acessando about:config e definir o valor de \"webextensions.storage.sync.enabled\" como true."},"storageFull":{"message":"O armazenamento da extensão está cheio. Por favor, exclua alguns segmentos não enviados nas opções."},"previewSegmentRequired":{"message":"Por favor, pré-visualize seus segmentos antes de enviar. Você pode fazer isso clicando no botão pré-visualizar ou usando o seguinte atalho:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Ativar modo VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Envios não podem ser aceitos do seu navegador no momento porque o YouTube parece ter injetado alguns anúncios do lado do servidor que a extensão não é capaz de remover. Por favor, entre em contato se estiver recebendo este erro."},"DeArrowIsDisabled":{"message":"DeArrow está desabilitado - Clique aqui para habilitar","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Tem certeza que esta miniatura original segue as diretrizes Derow? Se você apenas prefere ver as miniaturas originais em geral, considere alterar a opção \"Quando nenhuma miniatura enviada existe\" nas configurações da Derow","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"No YouTube TV, o SponsorBlock não é compatível com conteúdo ao vivo e gravado recentemente. Se esta for uma gravação recente, por favor, espere algumas horas para que a versão processada da gravação fique disponível.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Lista branca de canais não é suportada em tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Gostou do título original?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Sim"},"No":{"message":"Não"},"votes":{"message":"{0} votos","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} voto","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Engraçado","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Criativo","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Inteligente","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Descritiva","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Outro","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Modo clássico","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Títulos são substituídos por formatos padronizados com base nas diretrizes de todos os vídeos onde existe um título de crowdsource."},"CasualMode":{"message":"Modo casual","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Mantenha títulos originais quando eles descreverem o vídeo bem o suficiente e forem inteligentes ou engraçados.\nEscolha quais categorias de títulos você quer ver.\nVocê será capaz de votar se um título se encaixa em uma categoria ou não."},"minimumVotes":{"message":"Mínimo de votos","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Mostrar miniatura original de vídeos no modo casual","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Novo recurso: Modo casual","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Mostrar apenas o ícone do modo casual quando um título personalizado estiver disponível"},"OpenSettings":{"message":"Abrir configurações"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/pt_PT/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/pt_PT/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Tempo limite de conexão excedida. Verifique a sua conexão de internet. Se a sua internet estiver funcionando, o servidor está provavelmente sobrecarregado ou fora do ar."},"400":{"message":"O servidor disse que este pedido foi inválido"},"409":{"message":"Isso já foi enviado antes"},"502":{"message":"O servidor parece estar sobrecarregado. Tente novamente em alguns segundos."},"fullName":{"message":"SponsorBlock para o YouTube - Ignore patrocínios","description":"Name of the extension."},"Description":{"message":"Ignore patrocínios, pedidos para se inscrever e mais em vídeos do YouTube. Denuncie patrocinadores em vídeos que assistir para economizar o tempo dos outros.","description":"Description of the extension."},"channelWhitelisted":{"message":"Canal adicionado à lista de autorizados!"},"Segment":{"message":"segmento"},"Segments":{"message":"segmentos"},"SegmentsCap":{"message":"Segmentos"},"Chapters":{"message":"Capítulos"},"renderAsChapters":{"message":"Renderizar segmentos como capítulos","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Mostrar segmento atual ao lado do tempo do vídeo"},"showAutogeneratedChapters":{"message":"Mostrar capítulos gerados automaticamente pelo YouTube"},"upvoteButtonInfo":{"message":"Aprovar este segmento"},"reportButtonTitle":{"message":"Reportar"},"reportButtonInfo":{"message":"Denunciar este segmento como inválido."},"Dismiss":{"message":"Ignorar"},"Loading":{"message":"A carregar..."},"Hide":{"message":"Nunca mostrar"},"hitGoBack":{"message":"Carregue em reverter salto para voltar a onde estava"},"unskip":{"message":"Reverter salto"},"reskip":{"message":"Ignorar novamente"},"unmute":{"message":"Reativar o som"},"paused":{"message":"Pausado"},"manualPaused":{"message":"Temporizador parado"},"confirmMSG":{"message":"\n\nPara editar ou remover linhas individuais, carregue com o botão direito ou abra o popup da extensão pelo icone no canto superior direito."},"clearThis":{"message":"Tem certeza que deseja limpar isto?\n\n"},"Unknown":{"message":"Erro ao enviar os seus segmentos, tente novamente mais tarde."},"sponsorFound":{"message":"Este vídeo tem segmentos na base de dados!"},"sponsor404":{"message":"Nenhum segmento encontrado"},"sponsorStart":{"message":"O segmento começa agora"},"sponsorEnd":{"message":"O segmento termina agora"},"sponsorCancel":{"message":"Cancelar criação de segmento"},"noVideoID":{"message":"Nenhum vídeo do YouTube encontrado.\nSe isto estiver errado, atualize a guia."},"refreshSegments":{"message":"Atualizar segmentos"},"success":{"message":"Sucesso!"},"voted":{"message":"Votado!"},"serverDown":{"message":"Parece que o servidor está fora do ar. Entre em contato com o desenvolvedor imediatamente."},"connectionError":{"message":"Deu-se um erro de conecção: Código: "},"segmentsStillLoading":{"message":"Segmentos ainda carregando..."},"clearTimes":{"message":"Limpar segmentos"},"openPopup":{"message":"Abrir o Popup SponsorBlock"},"closePopup":{"message":"Fechar pop-up"},"closeIcon":{"message":"Ícone de fechar"},"OpenSubmissionMenu":{"message":"Abrir menu de envio"},"OpenCasualVoteMenu":{"message":"Abrir o menu do modo casual"},"sortSegments":{"message":"Organizar segmentos"},"submitCheck":{"message":"Tem a certeza que pretende submeter?"},"whitelistChannel":{"message":"Adicionar canal à lista de permissões"},"removeFromWhitelist":{"message":"Remover canal da lista de permissões"},"voteOnTime":{"message":"Votar em um segmento"},"Submissions":{"message":"Envios"},"savedPeopleFrom":{"message":"Poupou as pessoas de "},"viewLeaderboard":{"message":"Placar de classificação"},"recordTimesDescription":{"message":"Enviar"},"submissionEditHint":{"message":"A edição da secção aparecerá após clicar em enviar","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Dica: pode configurar as teclas de atalho ao submeter nas opções"},"clearTimesButton":{"message":"Limpar Intervalos"},"Username":{"message":"Nome de utilizador"},"setUsername":{"message":"Criar nome de utilizador"},"copyPublicID":{"message":"Copiar ID de utilizador pública"},"copySegmentID":{"message":"Copiar ID do segmento"},"hideThis":{"message":"Esconder isto"},"Options":{"message":"Opções"},"showButtons":{"message":"Mostrar botões no player do Youtube"},"hideButtonsDescription":{"message":"Isto esconde os botões que aparecem no player do Youtube para submeter patrocínios. Entendemos que possa ser\n incómodo a algumas pessoas. Em vez de usar esses botões pode usar os do popup. Para esconder a mensagem que aparece, \n ususe o botão na mesma que diz \"Don't show this again\". Pode sempre reactivar estas definições novamente."},"showSkipButton":{"message":"Mostrar botão ignorar para os destaques no reprodutor"},"showInfoButton":{"message":"Mostrar botão de Informações no player do Youtube"},"autoHideInfoButton":{"message":"Ocultar automaticamente o Botão de Informação"},"showDeleteButton":{"message":"Mostrar botão de Apagar no player do Youtube"},"enableViewTracking":{"message":"Ativar contador de segmentos pulados"},"whatViewTracking":{"message":"Esta funcionalidade regista os segmentos que ignorou para que os utilizadores saibam o quanto a sua submissão ajudou os outros e é utilizada como uma métrica juntamente com os votos positivos para garantir que o spam não entra na base de dados. A extensão envia uma mensagem para o servidor sempre que salta um segmento. Esperemos que a maioria das pessoas não altere esta definição para que os números de visualizações sejam exactos :)"},"enableViewTrackingInPrivate":{"message":"Ativar rastreamento de contagem de pulos nas guias privadas/anônimas"},"enableTrackDownvotes":{"message":"Armazenar votos negativos de segmentos"},"whatTrackDownvotes":{"message":"Quaisquer segmentos em que você votou negativamente permanecerão ocultos mesmo após a atualização"},"trackDownvotesWarning":{"message":"Aviso: Desativar isto excluirá todos os votos negativos armazenados anteriormente"},"enableTrackDownvotesInPrivate":{"message":"Armazenar segmento de votos negativos em separadores privados/incógnitos"},"enableQueryByHashPrefix":{"message":"Consulta por prefixo de hash"},"whatQueryByHashPrefix":{"message":"Em vez de solicitar segmentos do servidor usando o videoID, são enviados os 4 primeiros caracteres da hash do videoID. Este servidor enviará dados de volta para todos os vídeos com hashes similares."},"enableShowCategoryWithoutPermission":{"message":"Mostrar categorias no menu de envios mesmo sem permissão de envio"},"whatShowCategoryWithoutPermission":{"message":"Algumas categorias exigem autorização de envio devido a requisitos mínimos de reputação"},"showNotice":{"message":"Mostrar notificação outra vez"},"showSkipNotice":{"message":"Mostrar aviso após um segmento ser ignorado"},"showUpcomingNotice":{"message":"Mostrar aviso antes do início de um segmento"},"showCategoryGuidelines":{"message":"Mostrar categoria de ajuda"},"noticeVisibilityMode0":{"message":"Avisos de pulo de duração normal"},"noticeVisibilityMode1":{"message":"Avisos de pulo automático, mesmo de curta duração"},"noticeVisibilityMode2":{"message":"Todos os avisos de pulo, mesmo de curta duração"},"noticeVisibilityMode3":{"message":"Avisos de pulo semitransparente no pulo automático"},"noticeVisibilityMode4":{"message":"Todos os avisos de pulo semitransparente"},"longDescription":{"message":"O SponsorBlock permite que ignore patrocinadores, introduções, créditos finais, lembretes de inscrição, e outras partes irritantes dos vídeos do YouTube. O SponsorBlock é uma extensão de navegador de colaboração coletiva que permite enviar a qualquer um o tempo inicial e final de segmentos patrocinados de vídeos do YouTube. Assim que uma pessoa enviar essa informação, todas as outras pessoas com essa extensão irão pular o segmento patrocinado. Você também pode pular seções sem música em vídeos de música.","description":"Full description of the extension on the store pages."},"website":{"message":"Site","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Código-fonte","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"A notificação foi atualizada!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Se você ainda não gostar, aperte o botão nunca mostrar.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Pular segmento","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Iniciar/parar segmento","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Abrir menu de submissão","description":"Keybind label"},"setSubmitKeybind":{"message":"Enviar segmentos","description":"Keybind label"},"setPreviewKeybind":{"message":"Pré-visualizar segmento","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Fechar aviso de ignorar","description":"Keybind label"},"nextChapterKeybind":{"message":"Capítulo seguinte","description":"Keybind label"},"previousChapterKeybind":{"message":"Capítulo anterior","description":"Keybind label"},"enableDeArrowKey":{"message":"Ativação do DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Abrir menu de submissão","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Selecione uma tecla, digitando-a e escolha as teclas modificadoras que deseja usar."},"disableSkipping":{"message":"O ignorar está ativado"},"enableSkipping":{"message":"O ignorar está desativado"},"yourWork":{"message":"Seus envios","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Código do erro: "},"skip":{"message":"Ignorar"},"mute":{"message":"Silenciar"},"full":{"message":"Vídeo Completo","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Ignorar {0}?"},"mute_category":{"message":"Silenciar {0}?"},"skip_to_category":{"message":"Avançar para {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Próximos {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} pulado","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} silenciado","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Pulado para {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Votado em {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Desativar pulo automático"},"enableAutoSkip":{"message":"Ativar pulo automático"},"audioNotification":{"message":"Notificação de áudio ao ignorar"},"audioNotificationDescription":{"message":"A notificação de áudio ao ignorar irá tocar um som sempre que um segmento for ignorado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido."},"showTimeWithSkips":{"message":"Mostrar tempo com pulos removidos"},"showTimeWithSkipsDescription":{"message":"Este tempo aparece em parênteses ao lado do tempo atual, abaixo da barra de progresso. Isto mostra a duração total do vídeo sem qualquer segmento. Isto inclui segmentos marcados apenas como \"Mostrar na barra de progresso\"."},"youHaveSkipped":{"message":"Você pulou "},"minLower":{"message":"minuto"},"minsLower":{"message":"minutos"},"hourLower":{"message":"hora"},"hoursLower":{"message":"horas"},"youHaveSavedTime":{"message":"Você poupou as pessoas","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" de suas vidas","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Verifique status.sponsor.ajay.app para ver o estado do servidor."},"changeUserID":{"message":"Importar/exportar o seu ID de utilizador privado"},"whatChangeUserID":{"message":"Isto deve ser mantido privado. É como uma palavra-passe e não deve ser partilhada com ninguém. Se alguém o tiver, pode fazer-se passar por si. Se estiver à procura do seu ID de utilizador público, clique no ícone da área de transferência na janela pop-up."},"setUserID":{"message":"Definir ID de utilizador privado"},"userIDChangeWarning":{"message":"Aviso: A alteração do ID de utilizador privado é permanente. Tens a certeza de que queres fazer isto? Não se esqueça de fazer uma cópia de segurança da antiga, para prevenir."},"createdBy":{"message":"Criado por"},"supportOtherSites":{"message":"Suporte a sites do YouTube de terceiros"},"supportOtherSitesDescription":{"message":"Suporte a clientes do YouTube de terceiros. Para habilitar o suporte, você deve aceitar as permissões extras.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Sites suportados: "},"optionsInfo":{"message":"Ativar apoio ao Invidious, desativar pulo automático, ocultar botões e mais."},"addInvidiousInstance":{"message":"Adicionar instância de cliente de terceiros"},"addInvidiousInstanceDescription":{"message":"Adicionar uma instância personalizada. Isso deve ser formatado APENAS com o domínio. Exemplo: invidious.ajay.app"},"add":{"message":"Adicionar"},"addInvidiousInstanceError":{"message":"Este é um domínio inválido. Ele deve incluir APENAS a parte do domínio. Exemplo: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Redefinir lista de instâncias do Invidious"},"resetInvidiousInstanceAlert":{"message":"Você está prestes a redefinir a lista de instâncias do Invidious"},"currentInstances":{"message":"Instâncias atuais:"},"minDuration":{"message":"Duração mínima (segundos):"},"minDurationDescription":{"message":"Segmentos menores do que o valor definido não serão pulados ou mostrados no reprodutor."},"enableManualSkipOnFullVideo":{"message":"Usar o pulo manual quando houver um rótulo de vídeo completo"},"whatManualSkipOnFullVideo":{"message":"Para pessoas que desejam assistir ao vídeo sem interrupção se ele for totalmente patrocinado ou de auto-promoção."},"skipNoticeDuration":{"message":"Duração do aviso prévio de pulo (segundos):"},"skipNoticeDurationDescription":{"message":"O aviso de pulo ficará na tela por pelo menos este tempo. Para o pulo manual, pode ser visível por mais tempo."},"shortCheck":{"message":"O seguinte envio é mais curto do que sua opção de duração mínima. Isto significa que já foi enviada e está sendo ignorada devido a esta opção. Tem certeza que deseja enviar mesmo assim?"},"liveOrPremiere":{"message":"Não é permitido o envio de segmentos em transmissões ao vivo ou estreias ainda em andamento. Por favor, aguarde até que terminem, e em seguida, atualize a página e verifique se os segmentos ainda são válidos."},"showUploadButton":{"message":"Mostrar botão de envio"},"customServerAddress":{"message":"Endereço do servidor do SponsorBlock"},"customServerAddressDescription":{"message":"Endereço que o SponsorBlock usa para fazer chamadas ao servidor.\nA menos que você tenha sua própria instância de servidor, isso não deve ser alterado."},"dataFetchingServerAddress":{"message":"Endereço do servidor para busca de dados"},"dataFetchingServerAddressDescription":{"message":"O endereço usado para fazer chamadas para o servidor de busca de dados.\nA menos que você tenha sua própria instância de servidor, isso não deve ser alterado."},"thumbnailCacheServerAddress":{"message":"Endereço do arquivo de miniaturas"},"save":{"message":"Salvar"},"reset":{"message":"Redefinir"},"customAddressError":{"message":"Este endereço não está na forma correta. Certifique-se de que possui http:// ou https:// no início e sem barras no final."},"areYouSureReset":{"message":"Tem certeza que deseja redefinir?"},"mobileUpdateInfo":{"message":"m.youtube.com agora é suportado"},"exportOptions":{"message":"Importar/Exportar todas as opções"},"exportOtherData":{"message":"Importar/Exportar Todos os outros dados"},"exportOptionsCopy":{"message":"Editar/copiar"},"exportOptionsDownload":{"message":"Exportar para arquivo"},"exportOptionsUpload":{"message":"Importar de um arquivo"},"whatExportOptions":{"message":"Esta é a sua configuração completa no ficheiro JSON. Isto inclui o seu ID de utilizador privado, por isso certifique-se de que o partilha de forma sensata."},"setOptions":{"message":"Definir opções"},"exportOptionsWarning":{"message":"Aviso: Alterar as opções é permanente e pode fazer a extensão parar de funcionar. Tem a certeza que pretende fazer isto? Certifique-se de fazer uma cópia de segurança por precaução."},"incorrectlyFormattedOptions":{"message":"Este JSON não está formatado corretamente. Suas opções não foram alteradas."},"confirmNoticeTitle":{"message":"Enviar segmento"},"submit":{"message":"Enviar"},"cancel":{"message":"Cancelar"},"delete":{"message":"Deletar"},"preview":{"message":"Prévia"},"unsubmitted":{"message":"Não enviado"},"inspect":{"message":"Inspecionar"},"edit":{"message":"Editar"},"copyDebugLogs":{"message":"Copiar registos de depuração"},"copyDebugInformation":{"message":"Copiar informações de depuração para a área de transferência"},"copyDebugInformationFailed":{"message":"Erro ao copiar para a área de transferência"},"copyDebugInformationOptions":{"message":"Copia informações para a área de transferência para serem fornecidas a um programador quando levanta um bug / quando um programador o solicita. As informações sensíveis, como o seu ID de utilizador, os canais da lista branca e o endereço do servidor personalizado, foram removidas. No entanto, contém informações como o seu agente de utilizador, navegador, sistema operativo e número da versão da extensão. "},"copyDebugInformationComplete":{"message":"A informação de depuração foi copiada para a área de transferência. Sinta-se à vontade para remover qualquer informação que prefira não compartilhar. Salve em um arquivo de texto ou cole-a no relatório de erro."},"keyAlreadyUsed":{"message":"Este atalho está vinculado a outra ação. Por favor, selecione um atalho diferente."},"to":{"message":"até","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Copiado!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Inclui âncoras de transição"},"generic_guideline2":{"message":"Reproduzir como se nada tivesse sido pulado"},"category_sponsor":{"message":"Patrocinador"},"category_sponsor_description":{"message":"Promoção paga, referências pagas e anúncios diretos. Não deve ser usado para auto-promoção ou mensagens grátis para causas/criadores/sites/produtos que eles gostam."},"category_sponsor_guideline1":{"message":"Promoções pagas"},"category_sponsor_guideline2":{"message":"Não é para doações ou mercadoria personalizada"},"category_selfpromo":{"message":"Não-pago/Autopromoção"},"category_selfpromo_description":{"message":"Similar a \"patrocinador\", exceto para não-pago ou auto-promoção. Isso inclui seções sobre mercadorias, doações ou informações sobre com quem eles colaboraram."},"category_selfpromo_guideline1":{"message":"Doações, programa de membros e mercadoria personalizada"},"category_selfpromo_guideline2":{"message":"Divulgação gratuita que não acrescenta ao vídeo"},"category_selfpromo_guideline3":{"message":"Não é para produtos de origem corporativa ou mercadorias"},"category_exclusive_access":{"message":"Acesso exclusivo"},"category_exclusive_access_description":{"message":"Apenas para rotular vídeos inteiros. Usado quando um vídeo apresenta um produto, serviço ou local ao qual eles receberam acesso gratuito ou subsidiado."},"category_exclusive_access_pill":{"message":"Este vídeo apresenta um produto, serviço ou local ao qual eles receberam acesso gratuito ou subsidiado","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Todo o vídeo promove algo de acesso gratuito ou subsidiado"},"category_interaction":{"message":"Lembrete de interação (inscrever-se)"},"category_interaction_description":{"message":"Quando houver um pequeno lembrete para curtir, inscrever-se ou seguir no meio do conteúdo. Se é longo ou sobre algo em específico, deveria estar sob auto-promoção."},"category_interaction_guideline1":{"message":"Lembretes rápidos para curtir, inscrever ou seguir"},"category_interaction_guideline2":{"message":"Inclui lembretes indiretos para comentar"},"category_interaction_guideline3":{"message":"Não é para promoção geral, apenas um chamado para à ação"},"category_interaction_short":{"message":"Lembrete de interação"},"category_intro":{"message":"Intervalo/Vinheta de abertura"},"category_intro_description":{"message":"Um intervalo sem conteúdo real. Pode ser uma pausa, um quadro estático, uma animação repetitiva. Isso não deve ser usado em transições que contenham informação."},"category_intro_short":{"message":"Intervalo"},"category_intro_guideline1":{"message":"Intervalo sem conteúdo real"},"category_intro_guideline2":{"message":"Não é para transições com informações"},"category_outro":{"message":"Finalização/Créditos"},"category_outro_description":{"message":"Créditos ou quando os cards finais do YouTube aparecem. Não deve ser usado para conclusões informativas."},"category_outro_guideline1":{"message":"Não inclui conteúdo, mesmo que cartões de finalização estejam na tela"},"category_preview_description":{"message":"Coleção de clipes que mostram o que está por vir neste vídeo ou em outros vídeos em uma série onde todas as informações são repetidas mais tarde no vídeo."},"category_preview_guideline1":{"message":"Clipes que aparecem mais tarde ou em um vídeo futuro"},"category_preview_guideline2":{"message":"Recapitulação de um vídeo anterior"},"category_preview_guideline3":{"message":"Não é para seções que adicionam conteúdo adicional"},"category_filler":{"message":"Tangentes/Piadas"},"category_filler_description":{"message":"Cenas tangenciais ou piadas que não são necessárias para compreender o conteúdo principal do vídeo. Isto não deve incluir segmentos que forneçam contexto ou pormenores de fundo. Esta é uma categoria muito agressiva, destinada a ser utilizada quando não está com disposição para “diversão”."},"category_filler_short":{"message":"Tangentes"},"category_filler_guideline1":{"message":"Cenas ou piadas tangenciais"},"category_filler_guideline2":{"message":"Distrações, erros de gravação, repetições"},"category_filler_guideline3":{"message":"Não é para cenas necessárias para o entendimento do tópico"},"category_music_offtopic":{"message":"Música: trecho sem música"},"category_music_offtopic_description":{"message":"Apenas para uso em vídeos musicais. Deve ser usado exclusivamente para seções de vídeos musicais que já não pertençam à outra categoria."},"category_music_offtopic_short":{"message":"Sem música"},"category_music_offtopic_guideline1":{"message":"Seções que não estão nos lançamentos oficiais"},"category_music_offtopic_guideline2":{"message":"Sem música numa performance ao vivo"},"category_poi_highlight":{"message":"Destaques"},"category_poi_highlight_description":{"message":"A parte do vídeo que a maioria das pessoas procura. Similar aos comentários \"Vídeo começa em x\"."},"category_poi_highlight_guideline1":{"message":"A seção que maioria das pessoas está procurando"},"category_poi_highlight_guideline2":{"message":"Pode ignorar o contexto"},"category_poi_highlight_guideline3":{"message":"Pode avançar para o título ou miniatura"},"category_chapter":{"message":"Capítulo"},"category_chapter_description":{"message":"Capítulos personalizados que descrevem as principais seções de um vídeo."},"category_chapter_guideline1":{"message":"Não mencione os nomes dos patrocinadores"},"category_chapter_guideline2":{"message":"Use capítulos maiores para seções gerais"},"category_chapter_guideline3":{"message":"Capítulos menores podem ser colocados em capítulos maiores"},"category_livestream_messages":{"message":"Transmissão ao vivo: Leituras de Doação/Mensagem"},"category_livestream_messages_short":{"message":"Leitura de Mensagens"},"autoSkip":{"message":"Ignorar automaticamente"},"manualSkip":{"message":"Ignorar manualmente"},"showOverlay":{"message":"Mostrar na barra de progresso"},"disable":{"message":"Desativar"},"autoSkip_POI":{"message":"Avançar automaticamente para o início"},"manualSkip_POI":{"message":"Perguntar quando o vídeo carregar"},"showOverlay_POI":{"message":"Mostrar na barra de progresso"},"showOverlay_full":{"message":"Mostrar rótulo"},"showOverlay_chapter":{"message":"Mostrar capítulos"},"autoSkipOnMusicVideos":{"message":"Ignorar automaticamente todos os segmentos quando houver segmentos sem música"},"muteSegments":{"message":"Permitir segmentos que silenciem o áudio ao invés de ignorar"},"fullVideoSegments":{"message":"Mostrar um ícone quando um vídeo é inteiramente um anúncio","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Mostrar rótulos nas miniaturas de vídeo também","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Cor não enviada","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Cor da barra de progresso"},"category":{"message":"Categoria"},"skipOption":{"message":"Opção de pulo","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"Habilitar servidor de testes beta"},"whatEnableTestingServer":{"message":"Seus envios e votos NÃO SERÃO ENVIADOS para o servidor principal. Use isso apenas para testes."},"testingServerWarning":{"message":"Todos os envios e votos NÃO SERÃO ENVIADOS para o servidor principal quando conectado ao servidor de teste. Desative quando você quiser fazer envios reais."},"bracketNow":{"message":"(Agora)"},"moreCategories":{"message":"Mais categorias"},"chooseACategory":{"message":"Selecione uma categoria"},"enableThisCategoryFirst":{"message":"Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-la nas opções. Você será redirecionado para as opções agora.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Aviso: este tipo de segmento pode ter no máximo um ativo por vez. Enviar múltiplos fará com que um aleatório seja mostrado."},"youMustSelectACategory":{"message":"Você deve selecionar uma categoria para todos os segmentos que você está enviando!"},"bracketStart":{"message":"(Início)"},"bracketEnd":{"message":"(Fim)"},"End":{"message":"Fim","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"oculto: voto negativo"},"hiddenDueToDuration":{"message":"oculto: muito curto"},"manuallyHidden":{"message":"oculto manualmente"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"O ID do canal ainda não foi carregado. Se você estiver usando um vídeo incorporado, tente usar a página inicial do YouTube. Isso também pode ser causado por mudanças no layout do YouTube, se este for o caso, comente aqui:"},"invidiousPermissionRefresh":{"message":"O navegador revogou a permissão necessária para funcionar em Invidious e em outros sites de terceiros. Por favor, clique no botão abaixo para reativar essa permissão."},"acceptPermission":{"message":"Aceitar permissão"},"permissionRequestSuccess":{"message":"Solicitação de permissão bem-sucedida!"},"permissionRequestFailed":{"message":"Falha na solicitação de permissão, você clicou em negar?"},"adblockerIssueWhitelist":{"message":"Se não consegue resolver isto, desative a opção 'Forçar verificação do canal antes de ignorar', pois o SponsorBlock não pode recuperar as informações deste vídeo"},"forceChannelCheck":{"message":"Forçar verificação do canal antes de ignorar"},"whatForceChannelCheck":{"message":"Por predefinição, ignora imediatamente os segmentos antes mesmo de saber qual é o canal. Por predefinição, alguns segmentos no início do vídeo podem ser ignorados em canais da lista branca. A ativação desta opção evitará isto, mas fará com que todos os 'ignorar' tenham um ligeiro atraso, uma vez que a obtenção do ID do canal pode demorar algum tempo. Este atraso pode ser impercetível se tiveres uma Internet rápida."},"forceChannelCheckPopup":{"message":"Considere ativar \"Forçar verificação do canal antes de ignorar\""},"downvoteDescription":{"message":"Tempo errado/incorreto"},"incorrectVote":{"message":"Incorreto"},"harmfulVote":{"message":"Nocivo","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Mudar categoria"},"nonMusicCategoryOnMusic":{"message":"Esse vídeo é categorizado como música. Tem certeza de que é patrocinado? Se realmente for um trecho sem música, abra as opções da extensão e ative a categoria. Assim, você pode enviar esse segmento como \"sem música\" em vez de \"patrocinador\". Leia as diretrizes se tiver dúvidas."},"multipleSegments":{"message":"Múltiplos segmentos"},"guidelines":{"message":"Diretrizes"},"readTheGuidelines":{"message":"Leia as Diretrizes!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"As categorias estão aqui!"},"categoryUpdate2":{"message":"Abra as opções para ignorar as introduções, créditos finais, promoção de mercadoria, etc."},"help":{"message":"Ajuda"},"GotIt":{"message":"Entendi","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Este segmento é grande. Se o vídeo inteiro for sobre um tópico, altere de \"Ignorar\" para \"Vídeo completo\". Consulte as diretrizes para obter mais informações."},"categoryPillTitleText":{"message":"Este vídeo inteiro está rotulado como esta categoria e está muito integrado para poder ser separado"},"chapterNameTooltipWarning":{"message":"Um de seus nomes de capítulo é semelhante a uma categoria. Sempre que possível, você deve usar categorias."},"experiementOptOut":{"message":"Optar por sair de todos os experimentos futuros","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Ocultar para sempre"},"warningChatInfo":{"message":"Percebemos que você estava cometendo alguns erros comuns. Apreciamos muito o seu trabalho até agora, mas nos esforçamos para alcançar a perfeição aqui, então mesmo os pequenos erros são importantes :)"},"questionButton":{"message":"Eu tenho uma dúvida"},"askAQuestion":{"message":"Pergunte algo"},"warningConfirmButton":{"message":"Eu entendo o motivo"},"warningError":{"message":"Erro ao tentar reconhecer o aviso:"},"deArrowMessageRecieved":{"message":"Você recebeu uma dica de um moderador"},"Donate":{"message":"Doar"},"considerDonating":{"message":"Ajude a financiar o desenvolvimento"},"hideDonationLink":{"message":"Ocultar o link de doação"},"darkModeOptionsPage":{"message":"Modo escuro na página de opções"},"helpPageThanksForInstalling":{"message":"Obrigado por instalar o SponsorBlock."},"helpPageReviewOptions":{"message":"Por favor, revise as opções abaixo"},"helpPageFeatureDisclaimer":{"message":"Muitas funcionalidades estão desativadas por predefinição. Se pretende ignorar introduções, encerramentos, usar o Invidious, entre outros, ative as opções abaixo. Também pode ocultar/mostrar elementos da interface."},"helpPageHowSkippingWorks2":{"message":"Sempre que ignorar um segmento, irá receber um aviso. Se o tempo estiver errado vote contra clicando no voto negativo! Também pode votar no pop-up."},"Submitting":{"message":"Enviando"},"helpPageCopyOfDatabase2":{"message":"O código-fonte está disponível gratuitamente. Então, mesmo que algo aconteça comigo, seus envios não estarão perdidos."},"Credits":{"message":"Créditos"},"LearnMore":{"message":"Saiba mais"},"FullDetails":{"message":"Detalhes completos"},"CopyDownvoteButtonInfo":{"message":"Vota negativamente e cria uma cópia local para você reenviar"},"OpenCategoryWikiPage":{"message":"Abrir a página wiki desta categoria."},"CopyAndDownvote":{"message":"Copiar e votar negativamente"},"ContinueVoting":{"message":"Continuar votando"},"ChangeCategoryTooltip":{"message":"Isto irá aplicar instantaneamente aos seus segmentos"},"downvote":{"message":"Voto negativo"},"upvote":{"message":"Voto positivo"},"hideSegment":{"message":"Ocultar segmento"},"skipSegment":{"message":"Ignorar segmento"},"playChapter":{"message":"Reproduzir capítulo"},"SponsorTimeEditScrollNewFeature":{"message":"Use a roda do mouse enquanto mantêm o cursor sobre a caixa de edição para ajustar o tempo rapidamente. Combinações das teclas ctrl e shift podem ser usadas para refinar as mudanças."},"categoryPillNewFeature":{"message":"Novo! Veja quando um vídeo é inteiramente patrocinado ou de auto-promoção"},"yearAbbreviation":{"message":"a","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Comportamento","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interface","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Teclas de atalho","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Backup/Restauração","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Diversos","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Quando mostrar aviso de pulo","description":"Option label"},"unbind":{"message":"Desvincular","description":"Unbind keyboard shortcut"},"notSet":{"message":"Não configurado"},"change":{"message":"Alterar"},"youtubeKeybindWarning":{"message":"Este já é um atalho padrão do YouTube. Tem certeza que deseja utilizá-lo?"},"betaServerWarning":{"message":"O servidor BETA está habilitado!"},"openOptionsPage":{"message":"Abrir página de opções"},"resetToDefault":{"message":"Redefinir configurações para o padrão"},"confirmResetToDefault":{"message":"Tem certeza de que deseja redefinir todas as configurações para os valores padrão? Essa ação não poderá ser desfeita."},"exportSegments":{"message":"Exportar segmentos"},"importSegments":{"message":"Importar segmentos"},"Import":{"message":"Importar","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Resgatado com sucesso!"},"redeemFailed":{"message":"A chave de licença é inválida"},"hideUpsells":{"message":"Ocultar opções não disponíveis sem pagamento extra"},"hideNewFeatureUpdates":{"message":"Ocultar avisos sobre novos recursos"},"redeem":{"message":"Resgatar"},"enterLicenseKey":{"message":"Inserir chave de licença"},"unsubmittedSegmentCounts":{"message":"Você tem atualmente {0} em {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"No momento, você não tem segmentos não enviados","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"segmento não enviado","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"segmentos não enviados","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"vídeo","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"vídeos","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Limpar todos os segmentos","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Tem certeza de que deseja limpar todos os segmentos não enviados?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Mostrar segmentos","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Ocultar segmentos","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID do vídeo","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Contagem de segmentos","description":"Header of the unsubmitted segments list"},"actions":{"message":"Ações","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Compartilhar como URL"},"segmentFetchFailureWarning":{"message":"Alerta: o servidor ainda não respondeu com segmentos. Pode ser que os segmentos desse vídeo já tenham sido enviados, mas ainda não foram recebidos devido a problemas do servidor."},"allowScrollingToEdit":{"message":"Permitir rolagem para editar tempos"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Miniaturas e títulos objetivos no YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Miniaturas e títulos selecionados pela comunidade para descrever os vídeos de forma objetiva, sem sensacionalismo e sem truques para ganhar cliques","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Escolha o que mais bem descreve"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Título original"},"CurrentTime":{"message":"Momento atual"},"resetCustomTitle":{"message":"Voltar ao título original"},"resetIcon":{"message":"Redefinir ícone"},"TypeYourOwnTitleHere":{"message":"Digite um título melhor"},"VideoNotReady":{"message":"O vídeo não está pronto"},"FailedToRender":{"message":"Falha ao renderizar","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Quadro não encontrado","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Erro ao renderizar","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Falha ao carregar","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Formatação do título"},"Disabled":{"message":"Desativado (recomendado para PT-BR)"},"CapitalizeWords":{"message":"Todas As Palavras Começam Com Letras Maiúsculas"},"TitleCase":{"message":"Maioria em Maiúsculas, Exceto Preposições em Inglês"},"SentenceCase":{"message":"Só a primeira letra maiúscula, todo o resto, incluindo substantivos próprios, em minúsculas"},"LowerCase":{"message":"Letra minúscula"},"FirstLetterUppercase":{"message":"Primeira letra em maiúscula"},"shouldCleanEmojis":{"message":"Remover emojis"},"onlyFormatCustomTitles":{"message":"Apenas formatar títulos enviados pelo utilizador"},"onlyTitleCaseInEnglish":{"message":"Colocar palavras em maiúsculas em títulos que não sejam em inglês"},"onlyTitleCaseInEnglishDescription":{"message":"A deteção de idiomas não é perfeita e deteta alguns títulos em inglês como não ingleses."},"thumbnailFallbackOption":{"message":"Quando não houver nenhuma miniatura enviada"},"whatThumbnailFallbackOption":{"message":"Ao optar por aleatório, dados do SponsorBlock vão garantir que nenhum segmento promocional seja selecionado.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Usar quadro de momento aleatório"},"TheOriginalThumbnail":{"message":"Usar a miniatura original"},"showABlankBox":{"message":"Usar em branco"},"AutoGenerated":{"message":"Exibir as miniaturas auto-geradas pelo YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Inicio"},"Middle":{"message":"Meio"},"keepUnsubmitted":{"message":"Armazenar votos enviados"},"showLiveCover":{"message":"Mostrar o avatar do canal nos próximos vídeos","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Nunca usar miniaturas testadas por A/B"},"ignoreAbThumbnailsDescription":{"message":"Assim como na Netflix, alguns canais podem configurar testes em seus vídeos onde o YouTube mostrará miniaturas diferentes para cada pessoa. Esta opção sempre usará a primeira miniatura para manter a consistência."},"abThumbnailsWarning":{"message":"Aviso: Este vídeo atualmente tem um teste de miniatura A/B em execução. Isto significa que a miniatura pode mudar com frequência. Provavelmente, não deverá votar a favor da miniatura original devido a este risco."},"whatKeepUnsubmitted":{"message":"Manter votos enviados após votar para mostrar os títulos e miniaturas que você escolheu em vez do mais votado no servidor."},"keepUnsubmittedInPrivate":{"message":"Registrar votos de navegação anônima"},"useThumbnailGenerationService":{"message":"Usar serviço de geração de miniaturas"},"titleMaxLines":{"message":"Máximo de linhas para o título"},"titleMaxLinesDescription":{"message":"Os títulos do vídeo serão quebrados por esta quantidade de linhas nas sugestões."},"thumbnailSaturationLevel":{"message":"Nível de saturação das miniaturas"},"whatSaturateThumbnails":{"message":"Tornar as miniaturas menos vibrantes reduzindo a sua cor"},"hideDetailsWhileFetching":{"message":"Ocultar detalhes durante a pesquisa"},"hideDetailsWhileFetchingDescription":{"message":"Oculta títulos e miniaturas durante a obtenção de dados do servidor. Se estiver desativado, os títulos e as miniaturas ficarão intermitentes à medida que forem mudando."},"ignoreTranslatedTitles":{"message":"Não mostrar os títulos traduzidos do YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"Por vezes, o YouTube traduz automaticamente os títulos para a sua língua materna. Esta opção só se aplica quando não está disponível um título de recolha coletiva de dados."},"onAllPages":{"message":"Em todas as páginas","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Em todas as páginas, exceto de vídeos","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Nunca"},"thumbnailGeneratorDescription1":{"message":"O serviço de geração de miniaturas acelera bastante o processo porque envia anonimamente a identificação do vídeo para um servidor remoto. Uma miniatura será então gerada, ou captada de um arquivo pré-existente."},"thumbnailGeneratorDescription2":{"message":"Usar o serviço em páginas de vídeos traz o risco de vazar identificação de vídeos não-listados para o servidor. Selecione a opção \"Em todas as páginas, exceto de vídeos\" para que isso não ocorra. Outra opção é hospedar seu próprio serviço de geração de miniaturas."},"thumbnailGeneratorDescription3":{"message":"Se o serviço de geração de miniaturas estiver desativado, todas as solicitações usarão um sistema anónimo de consultas, dificultando para o servidor prever quais vídeos já foram obtidos, e um servidor local mais lento será usado.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Código-fonte do serviço de geração de miniaturas"},"moreAboutKAnonymity":{"message":"Mais informações sobre o anonimato","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Sempre exibir o botão \"Mostrar Original\""},"whatAlwaysShowShowOriginalButton":{"message":"Se você sempre quiser saber se um título/miniatura mudou, ative isso."},"showIconForFormattedTitles":{"message":"Mostre o botão \"Mostrar original\" para Títulos Auto-Formatados"},"Enable":{"message":"Ativar"},"Titles":{"message":"Títulos","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniaturas","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Votos casuais","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Erro"},"ShowOriginal":{"message":"Mostrar detalhes originais"},"ShowModified":{"message":"Mostrar Detalhes Modificados"},"FillerWarning":{"message":"Atenção: essa categoria é altamente rigorosa. Pode ser que você precise reverter pulos ou desabilitá-los por um tempo. Saiba que alguns vídeos podem ter pulos com mais da metade da duração total. Entretanto, lembre-se de que ainda há orientações específicas a seguir ao submeter segmentos.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Entre no Discord ou Matrix para continuarmos a conversa","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Exibir orientações","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Evite expressões faciais exageradas","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Reflita aquilo que assistiu e escreva algo revelante ao Video, não responda apenas a pergunta do título original","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Evite descrever reações sobre o vídeo (\"chocante\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Antes de clicar, forneça informações suficientes para uma melhor seleção"},"tip5":{"message":"Comece as frases com maiúsculas","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Verificar todas as diretrizes a enviar","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"O meu título está em maiúsculas como uma frase","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"O meu título não responde apenas a uma pergunta colocada no título","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Os títulos devem descrever o vídeo ou a história em geral. Deve certificar-se de que vê o vídeo completo para saber do que se trata realmente, em vez de se basear num título original intrigante.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"O meu título não resume uma conclusão ou estraga desnecessariamente","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Os títulos não se destinam a substituir totalmente o visionamento do vídeo, mas sim a indicar-lhe se deve clicar ou não.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"O meu título não verifica os factos, não ridiculariza nem critica o vídeo ou o seu criador","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Os títulos devem ser apresentados na perspetiva do criador e do vídeo. A classificação ou verificação de factos do vídeo em si está fora do âmbito DeArrow. Os títulos não se destinam a ser uma secção de comentários.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Palavra detetada: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Não utilize verbos desnecessários no início do título","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Todos os títulos devem começar com uma letra maiúscula. Os títulos devem ser formatados como uma frase","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Os títulos não devem terminar com um '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Não se limite a adicionar uma resposta a uma pergunta no título original. Os títulos devem descrever o vídeo ou a história em geral","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Os títulos não devem verificar os factos, gozar ou criticar o vídeo ou o criador","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Os títulos não devem manter os elementos sensacionalistas do título original","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Os títulos não devem conter emojis","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"É necessário resolver o aviso antes de apresentar"},"dearrowHelpSponsorBlockImported":{"message":"Observação: suas configurações do SponsorBlock foram importadas automaticamente!"},"howItWorks":{"message":"Como funciona"},"discordPromotion":{"message":"Deixe sua contribuição, sugestões ou ajude outros usuários no {discord} ou {matrix}"},"deArrowDonationText":{"message":"Se você está satisfeito com a extensão e gostaria de fazer uma contribuição em dinheiro, acesse este link"},"termsAgreement":{"message":"Ao usar essa extensão, você concorda com a {privacy-policy} e {terms}"},"privacyPolicy":{"message":"Política de privacidade"},"termsOfUse":{"message":"Termos de uso"},"openSourceLicenses":{"message":"Licenças de código aberto"},"defaultToOriginals":{"message":"Informações padrão para o vídeo original"},"whatDefaultToOriginals":{"message":"Exibir o título e a miniatura original por padrão, mas tem um botão que aparece ao passar o mouse para ver os títulos e miniaturas personalizados."},"replaceTitles":{"message":"Substituir títulos"},"replaceThumbnails":{"message":"Substituir miniaturas"},"useCrowdsourcedTitles":{"message":"Use as alterações dos Títulos da Comunidade de DeArrow"},"whatUseCrowdsourcedTitles":{"message":"Se desabilitado, formatação de títulos ainda funcionará, mas não usará os títulos da comunidade","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Deseja mesmo apagar esse ajuste?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Novo ajuste"},"DeleteConfiguration":{"message":"Apagar Configuração"},"ChannelAllowlist":{"message":"Definições específicas do canal"},"ConfigurationName":{"message":"Nome do ajuste"},"ChannelListInstructions":{"message":"Introduza os canais aos quais pretende aplicar esta configuração na caixa abaixo, separados por novas linhas. São suportados IDs de canal e nomes de apresentação. Os nomes de utilizador @ não são suportados. Pode obter IDs de canal ao clicar no botão de partilha na página acerca do canal. Para aceder a página sobre, clique na descrição do canal que aparece abaixo do nome do canal na página do canal.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Nenhum ajuste salvo. Clique no botão Novo ajuste.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Parar clickbait substituindo títulos e miniaturas com mais precisão"},"DeArrowPromotionMessage2":{"message":"Cansado de clickbait? Confira minha nova extensão para melhorar os títulos e miniaturas"},"DeArrowPromotionMessage3":{"message":"Confira também o DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Não gostou deste título? Se interessou pelo título abaixo? Considere conferir o recurso de substituição de título DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Esta miniatura é escolhida de um horário aleatório porque ainda não há envio neste vídeo","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Esta miniatura é escolhida de um horário aleatório porque ainda não há envio neste vídeo","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Você pode alterar este padrão abaixo","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} títulos e miniaturas de {thumbnails} foram substituídos desde que você instalou esta extensão","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} título","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} títulos ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"e {thumbnails} miniaturas","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"e {thumbnails} miniaturas","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} títulos e miniaturas foram substituídos desde que você instalou esta extensão","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Contagem de títulos e miniaturas substituídos"},"countReplacementsDescription":{"message":"Usado para fornecer estatísticas no popup.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Adicionar uma lista de filtros para bloquear pesquisas, juntar prateleiras e outros elementos promocionais da página usando yt-neuter"},"requiresUblock":{"message":"Requer o uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Algo correu mal com a deteção do ID do vídeo. Tente atualizar antes de enviar para garantir que é enviado para o vídeo correto. Se isto estiver a acontecer muitas vezes, envie um relatório com as outras extensões ou userscripts que tem instalados através do GitHub, Discord ou Matrix."},"dearrowLogoCredit":{"message":"Logotipo baseado em Twemoji licenciado sob CC-BY 4.0"},"zoomToFillUnsupported":{"message":"O SponsorBlock não é compatível com a extensão \"Zoom para preencher\". Há muitas alternativas que pode usar que funcionarão corretamente."},"freeTrialStarted":{"message":"Sua avaliação gratuita foi iniciada com sucesso. Visite o YouTube para testá-lo"},"freeTrialEnded":{"message":"Sua avaliação gratuita terminou"},"freeTrialPrompt":{"message":"Se você quiser testá-lo por uma hora, você pode iniciar um teste gratuito com o botão abaixo."},"startFreeTrial":{"message":"Iniciar avaliação gratuita"},"freeAccessRequested":{"message":"Você está registrado com sucesso para acesso gratuito. Você será notificado quando o acesso gratuito for concedido."},"freeAccessComplete":{"message":"Parabéns! Agora você tem acesso gratuito à DeArrow <3"},"DeArrowNotActivated":{"message":"DeArrow não está ativado"},"ActivateDeArrow":{"message":"Ative DeArrow"},"DeArrowIsActivated":{"message":"DeArrow foi ativado com sucesso"},"Close":{"message":"Fechar"},"ViewLicenseKey":{"message":"Visualizar Chave de Licença"},"SharingIsCaring":{"message":"Compartilhar é cuidar"},"cleanPopup":{"message":"Esconder desordem da lista de segmentos no popup"},"syncDisabledWarning":{"message":"Aviso: o armazenamento da extensão foi desativado no seu navegador. As definições não serão guardadas se tentar gravá-las."},"syncDisabledWarningDeArrow":{"message":"O DeArrow não irá funcionar sem armazenamento."},"syncDisabledFirefoxSuggestions":{"message":"Pode ativar, acedendo a about:config e definindo o valor de \"webextensions.storage.sync.enabled\" como verdadeiro."},"storageFull":{"message":"O armazenamento da extensão está cheio. Elimine alguns segmentos não submetidos nas opções."},"previewSegmentRequired":{"message":"Pré-visualize os seus segmentos antes de submeter. Pode fazer isto ao clicar no botão pré-visualizar ou usando o seguinte atalho:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Aja como VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"De momento, não é possível aceitar envios a partir do seu navegador porque o YouTube parece ter injetado alguns anúncios do lado do servidor que a extensão não consegue remover. Contacte-nos se estiver a receber este erro."},"DeArrowIsDisabled":{"message":"DeArrow está desativado - clique para ativar","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Tem a certeza de que esta miniatura original segue as diretrizes DeArrow? Se preferir ver miniaturas originais em geral, considere alterar a opção “Quando não existe uma miniatura apresentada” nas definições DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"likeOriginalTitle":{"message":"Gostou do título original?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Sim"},"No":{"message":"Não"},"votes":{"message":"{0} votos","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} voto","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Engraçado","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Criativo","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Inteligente","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Descritivo","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Outros","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Modo clássico","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Os títulos são substituídos por formatos normalizados com base nas diretrizes em todos os vídeos em que existe um título de crowdsourcing."},"CasualMode":{"message":"Modo casual","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Mantenha os títulos originais quando estes descreverem o vídeo suficientemente bem e forem inteligentes ou divertidos.\nEscolha as categorias de títulos que quer ver.\nPoderá votar se um título se enquadra numa categoria ou não."},"minimumVotes":{"message":"Votação mínima","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Mostrar a miniatura original de vídeos no modo casual","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Nova funcionalidade: Modo casual","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Mostrar o ícone do modo casual apenas quando estiver disponível um título personalizado"},"OpenSettings":{"message":"Abrir as definições"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ro/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ro/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Eroare de Conexiune. Verifică-ți conexiunea la internet. Daca internetul functionează, serverul este probabil supraîncărcat sau a căzut."},"400":{"message":"Serverul a spus că această cerere este invalidă"},"409":{"message":"Acest lucru a fost deja trimis înainte"},"502":{"message":"Serverul pare să fie supraîncărcat. Încercați din nou în câteva secunde."},"fullName":{"message":"SponsorBlock pentru YouTube - Omiteți spoturi sponsorizate","description":"Name of the extension."},"Description":{"message":"Omiteți cu ușurință spoturi sponsorizate, cereri de abonare și alte întreruperi pe YouTube. Semnalați-le pentru a economisi timp altora.","description":"Description of the extension."},"channelWhitelisted":{"message":"Canalul a fost adăugat la excepții!"},"Segment":{"message":"segment"},"Segments":{"message":"segmente"},"SegmentsCap":{"message":"Segmente"},"Chapters":{"message":"Capitolele"},"renderAsChapters":{"message":"Afișați segmentele folosind formatul capitolelor","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Afișați segmentul curent lângă indicatorul de timp"},"showAutogeneratedChapters":{"message":"Afișați capitolele generate automat de YouTube"},"upvoteButtonInfo":{"message":"Apreciați propunerea"},"reportButtonTitle":{"message":"Semnalați"},"reportButtonInfo":{"message":"Semnalați propunerea ca fiind incorectă."},"Dismiss":{"message":"Renunță"},"Loading":{"message":"Se încarcă..."},"Hide":{"message":"Nu afișați din nou"},"hitGoBack":{"message":"Apăsați butonul „Anulați“ pentru a reveni."},"unskip":{"message":"Anulați"},"reskip":{"message":"Omiteți"},"unmute":{"message":"Porniți sunetul"},"paused":{"message":"Pauză"},"manualPaused":{"message":"Cronometru oprit"},"confirmMSG":{"message":"Pentru a edita sau a șterge valori individuale, apasă butonul de informații sau deschide popup-ul extensiei apăsând iconița extensiei din colțul dreapta sus."},"clearThis":{"message":"Ești sigur că vrei să ștergi asta?\n\n"},"Unknown":{"message":"A apărut o eroare în trimiterea timpilor sponsorizărilor, încearcă din nou mai târziu."},"sponsorFound":{"message":"S-au identificat următoarele segmente:"},"sponsor404":{"message":"Niciun segment găsit"},"sponsorStart":{"message":"Creați segment nou"},"sponsorEnd":{"message":"Marcați finalul segmentului"},"sponsorCancel":{"message":"Renunțați"},"noVideoID":{"message":"Momentan, nu urmăriți un videoclip YouTube.\nPentru a scana din nou, reîmprospătați pagina."},"refreshSegments":{"message":"Reîmprospătare segmente"},"success":{"message":"Succes!"},"voted":{"message":"Vot trimis!"},"serverDown":{"message":"Se pare că serverul este oprit. Contactează imediat dezvoltatorul."},"connectionError":{"message":"A apărut o eroare de conexiune. Cod de eroare: "},"segmentsStillLoading":{"message":"Încă se încarcă segmentele..."},"clearTimes":{"message":"Ștergeți propunerea"},"openPopup":{"message":"Deschide meniul principal de informații"},"closePopup":{"message":"Închide pop-up"},"closeIcon":{"message":"Închide pictograma"},"OpenSubmissionMenu":{"message":"Deschideți meniul de propuneri"},"sortSegments":{"message":"Sortare Segmente"},"submitCheck":{"message":"Sunteți sigur că doriți să trimiteți asta?"},"whitelistChannel":{"message":"Adaugă canalul la excepții"},"removeFromWhitelist":{"message":"Șterge canalul de la excepții"},"voteOnTime":{"message":"Votează pe un Segment"},"Submissions":{"message":"Propuneri"},"savedPeopleFrom":{"message":"Ați facilitat altora omiterea a "},"viewLeaderboard":{"message":"Clasament"},"recordTimesDescription":{"message":"Trimiteți"},"submissionEditHint":{"message":"Editând secțiunea va apărea după ce faceți clic trimiteți","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Sugestie: În pagina de opțiuni, puteți configura combinații de taste pentru acțiunile de aici"},"clearTimesButton":{"message":"Șterge Timpii"},"Username":{"message":"Nume de utilizator"},"setUsername":{"message":"Setează Numele De Utilizator"},"copyPublicID":{"message":"Copiază ID-Utilizator Public"},"copySegmentID":{"message":"Copiați ID-ul segmentului"},"hideThis":{"message":"Ascunde asta"},"Options":{"message":"Opțiuni"},"showButtons":{"message":"Afișați butoane în playerul YouTube"},"hideButtonsDescription":{"message":"Opțiunea adaugă butoane în playerul YouTube care permit gestionarea segmentelor."},"showSkipButton":{"message":"Afișați butonul de redare de la Punct de interes în playerul YouTube"},"showInfoButton":{"message":"Afișați butonul principal de informații în playerul YouTube"},"autoHideInfoButton":{"message":"Ascundeți automat butonul principal de informații"},"showDeleteButton":{"message":"Show delete button on YouTube player"},"enableViewTracking":{"message":"Permiteți contabilizarea omiterilor"},"whatViewTracking":{"message":"Opțiunea permite colectarea informațiilor despre segmentele omise de dv., pentru a comunica autorilor lor cât de folositoare sunt. De asemenea, informațiile aceastea, împreună cu sistemul de votare sunt folosite pentru a înlătura și preveni conținutul irelevant. Bifarea opțiunii permite extensiei să informeze serverul nostru de fiecare dată când omiteți un segment. Sperăm să nu dezactivați opțiunea, pentru a păstra precizia contoarelor propunerilor. :)"},"enableViewTrackingInPrivate":{"message":"Permiteți contabilizarea omiterilor în file private"},"enableTrackDownvotes":{"message":"Rețineți propunerile neapreciate"},"whatTrackDownvotes":{"message":"Segmentele neapreciate vor fi ascunse, chiar și după reîncărcarea paginii"},"trackDownvotesWarning":{"message":"Atenție: Dezactivarea acestei opțiuni va șterge toate neaprecierile stocate anterior"},"enableTrackDownvotesInPrivate":{"message":"Rețineți propunerile neapreciate în file private"},"enableQueryByHashPrefix":{"message":"Interogare după Prefix Hash"},"whatQueryByHashPrefix":{"message":"În loc să solicite segmente de pe server folosind ID-ul video, primele 4 caractere ale hash-ului ID-ul videoului sunt trimise. Acest server va trimite înapoi date pentru toate videoclipurile cu hash-uri similare."},"enableShowCategoryWithoutPermission":{"message":"Arată categoriile în meniul de adăugare chiar fără permisiunea de adăugare"},"whatShowCategoryWithoutPermission":{"message":"Unele categorii necesită permisiunea de a depune din cauza cerințelor minime de reputație"},"showNotice":{"message":"Arată Notificarea Din Nou"},"showSkipNotice":{"message":"Arată o notificare după ce un segment este sărit"},"showUpcomingNotice":{"message":"Afișați o notificare înainte de începerea unui segment"},"showCategoryGuidelines":{"message":"Afișați descrieri pentru categorii"},"noticeVisibilityMode0":{"message":"Dimensiune completă"},"noticeVisibilityMode1":{"message":"Dimensiune redusă la omitere automată"},"noticeVisibilityMode2":{"message":"Dimensiune mică"},"noticeVisibilityMode3":{"message":"Estompată la omitere automată"},"noticeVisibilityMode4":{"message":"Estompată"},"longDescription":{"message":"SponsorBlock vă permite să săriți peste sponsori, intro, outros, memento-uri pentru abonament și alte părți enervante ale videoclipurilor YouTube SponsorBlock este o extensie crowdsourced de browser, care hai să trimită oricui timpul de început și de sfârșit pentru segmente sponsorizate și alte segmente de videoclipuri YouTube. Odată ce o persoană transmite aceste informații, toți ceilalți cu această extensie vor sări peste segmentul sponsorizat. De asemenea, poți sări peste secțiunile non-muzicale ale videoclipurilor.","description":"Full description of the extension on the store pages."},"website":{"message":"Website","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Cod Sursă","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Notificarea a fost actualizată!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Dacă nu îți place, apasă butonul nu mai arăta niciodată.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Omitere segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Delimitați unui segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Deschidere meniu de propuneri","description":"Keybind label"},"setSubmitKeybind":{"message":"Predă segmentele","description":"Keybind label"},"setPreviewKeybind":{"message":"Previzualizare segment","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Închideți notificarea de ignorare","description":"Keybind label"},"setDownvoteKeybind":{"message":"Votați negativ segmentul","description":"Keybind label"},"setUpvoteKeybind":{"message":"Apreciați segmentul","description":"Keybind label"},"nextChapterKeybind":{"message":"Capitolul următor","description":"Keybind label"},"previousChapterKeybind":{"message":"Capitolul anterior","description":"Keybind label"},"enableDeArrowKey":{"message":"Activați DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Deschidere meniu de propuneri","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Pentru modificare, apăsați tasta dorită și bifați tastele auxiliare."},"disableSkipping":{"message":"Omiterea este activată"},"enableSkipping":{"message":"Omiterea este dezactivată"},"yourWork":{"message":"Munca Ta","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Codul Erorii: "},"skip":{"message":"Omiteți"},"mute":{"message":"Opriți sunetul"},"full":{"message":"Întregul videoclip","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Omiteți {0}?"},"mute_category":{"message":"Opriți sunetul pentru {0}?"},"skip_to_category":{"message":"Redați de la {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"{0} în curând","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} a fost omis","description":"Example: Sponsor Skipped"},"muted":{"message":"Sunet oprit pentru {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Se redă de la {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Ați votat {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Dezactivare omitere automată"},"enableAutoSkip":{"message":"Activare omitere automată"},"audioNotification":{"message":"Notificare Audio Când Sari"},"audioNotificationDescription":{"message":"Semnalul sonor se va reda atunci când omiteți un segment. Dacă dezactivați această setare sau omiterea automată, nu se va reda niciun sunet."},"showTimeWithSkips":{"message":"Afișare durată totală după omiterea segmentelor"},"showTimeWithSkipsDescription":{"message":"Acest timp apare în paranteze lângă ora curentă sub bara de progres. Aceasta arată durata totală a videoclipului minus orice segment. Aceasta include segmente marcate doar ca \"Afișare în Seekbar\"."},"youHaveSkipped":{"message":"Ai omis "},"minLower":{"message":"minut"},"minsLower":{"message":"minute"},"hourLower":{"message":"oră"},"hoursLower":{"message":"ore"},"youHaveSavedTime":{"message":"Tu ai salvat alte persoane","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" din viața lor","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Verificați status.sponsor.ajay.app pentru starea serverului."},"changeUserID":{"message":"Gestionați ID-ul utilizatorului dv."},"whatChangeUserID":{"message":"Nu partajați ID-ul privat. Acesta poate fi folosit pentru a acționa în numele dv. în cadrul acestei extensii. În cazul în care vă căutați ID-ul public, acesta se găsește în meniul principal de informații al extensiei."},"setUserID":{"message":"Stabiliți ID-ul privat"},"userIDChangeWarning":{"message":"Avertisment: Modificarea Id-ului de utilizator privat este permanentă. Sunteți sigur că doriți să faceți acest lucru? Asigurați-vă că ați făcut o copie de rezervă pe cea veche, pentru orice eventualitate."},"createdBy":{"message":"Creat De"},"supportOtherSites":{"message":"Sprijină Site-uri YouTube 3rd Party"},"supportOtherSitesDescription":{"message":"Susține clienții YouTube terți. Pentru a activa asistența, trebuie să accepți permisiunile suplimentare.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Site-uri cu Sprijin: "},"optionsInfo":{"message":"Activează suportul Invidious, dezactivează autoskip-ul, ascunde butoanele și altele."},"addInvidiousInstance":{"message":"Adaugă Instanță pentru clienți 3rd-party"},"addInvidiousInstanceDescription":{"message":"Adăugați o instanță personalizată. Aceasta trebuie să fie formatată DOAR cu domeniul. Exemplu: invidious.ajay.app"},"add":{"message":"Adaugă"},"addInvidiousInstanceError":{"message":"Acesta este un domeniu invalid. Acesta trebuie să includă DOAR partea de domeniu. Exemplu: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Resetează Lista De Instanțe Invidious"},"resetInvidiousInstanceAlert":{"message":"Sunteți pe cale să resetați lista de instanțe Invidious"},"currentInstances":{"message":"Instanțele curente:"},"minDuration":{"message":"Durată minimă (secunde):"},"minDurationDescription":{"message":"Segmentele mai scurte decât valoarea setată nu vor fi omise sau afișate în player."},"enableManualSkipOnFullVideo":{"message":"Utilizați omiterea manuală atunci când există o etichetă video completă"},"whatManualSkipOnFullVideo":{"message":"Pentru persoanele care doresc să vizioneze videoclipul neîntrerupt dacă acesta este sponsorizat în totalitate sau dacă este autopromovat."},"skipNoticeDuration":{"message":"Durata notificărilor de omitere (secunde):"},"skipNoticeDurationDescription":{"message":"Durata de afișare a notificării de omitere. Dacă omiteți manual, e posibil ca notificarea să fie vizibilă mai mult timp."},"shortCheck":{"message":"Următoarea înregistrare este mai mică decât opțiunea voastră de durată minimă. Acest lucru ar putea însemna că a fost deja trimisă și a fost ignorat datorită acestei opțiuni. Sunteți sigur că doriți să trimiteți?"},"liveOrPremiere":{"message":"Nu este permisă adăugarea pe un live stream sau pe o primă. Vă rugăm să așteptați până se termină, apoi reîmprospătați pagina și verificați dacă segmentele sunt încă valide."},"showUploadButton":{"message":"Arată Butonul De Încărcare"},"customServerAddress":{"message":"Adresa Serverului SponsorBlock"},"customServerAddressDescription":{"message":"Adresa SponsorBlock este folosită pentru a se efectua apeluri către server.\nDacă nu ai propriul tău server, acesta nu ar trebui modificat."},"dataFetchingServerAddress":{"message":"Adresa serverului pentru preluarea datelor"},"dataFetchingServerAddressDescription":{"message":"Adresa folosită pentru a efectua apeluri către serverul de preluare a datelor.\nDacă nu ai propria ta instanță de server, acest lucru nu ar trebui schimbat."},"thumbnailCacheServerAddress":{"message":"Adresa serverului cache miniaturi"},"save":{"message":"Salvează"},"reset":{"message":"Resetează"},"customAddressError":{"message":"Adresa nu este în forma corectă. Asigurați-vă că http:// sau https:// se află la început."},"areYouSureReset":{"message":"Sunteți sigur că doriți să resetați asta?"},"mobileUpdateInfo":{"message":"m.youtube.com este acum suportat"},"exportOptions":{"message":"Importă/Exportă Toate Opțiunile"},"exportOtherData":{"message":"Gestionați statisticile dv."},"exportOptionsCopy":{"message":"Editați"},"exportOptionsDownload":{"message":"Salvați în fișier"},"exportOptionsUpload":{"message":"Încărcați din fișier"},"whatExportOptions":{"message":"Aici este întreaga configurație a extensiei, în format JSON, inclusiv ID-ul dv. privat. Partajați cu grijă!"},"setOptions":{"message":"Setează Opțiuni"},"exportOptionsWarning":{"message":"Atenție: Schimbarea acestei opțiuni este permanentă și poate strica instalarea. Sunteți sigur că doriți să faceți asta? Asigurati-vă că ați făcut o copie de rezervă."},"incorrectlyFormattedOptions":{"message":"Acest JSON nu este formatat corect. Opțiunile dumneavoastră nu au fost modificate."},"confirmNoticeTitle":{"message":"Trimite Segment"},"submit":{"message":"Trimite"},"cancel":{"message":"Anulează"},"delete":{"message":"Șterge"},"preview":{"message":"Previzualizare"},"unsubmitted":{"message":"Nepredat"},"inspect":{"message":"Inspectează"},"edit":{"message":"Editare"},"copyDebugLogs":{"message":"Copiați informațiile de depanare"},"copyDebugInformation":{"message":"Copiază Informațiile de Depanare În Clipboard"},"copyDebugInformationFailed":{"message":"Eroare la scrierea în clipboard"},"copyDebugInformationOptions":{"message":"Copiază informația în clipboard pentru a fi furnizată dezvoltatorului când se găsește o eroare / când un dezvoltator o cere. Informațiile sensibile precum ID-ul de utilizator, canale exceptate, și adresa serverului personalizat au fost șterse. Însă conține informații precum useragent-ul, browser-ul, sistemul de operare, și numărul versiunii extensiei. "},"copyDebugInformationComplete":{"message":"Informația de depanare a fost copiată în clipboard. Puteți elimina orice informație pe care nu doriți să o partajați. Salvați într-un fișier sau lipiți-o în raportul de erori."},"keyAlreadyUsed":{"message":"Această scurtătură este legată de o altă acțiune. Vă rugăm să selectați una diferită."},"to":{"message":"până la","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Copiat!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Includeți tranzițiile dintre scene"},"generic_guideline2":{"message":"Se poate omite în mod imperceptibil"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Promovare plătită, refferali plătiți și reclame directe. Nu pentru autopromovări sau promovări gratis ale cauzelor/creatorilor/website-urilor/produselor."},"category_sponsor_guideline1":{"message":"Promovări plătite"},"category_sponsor_guideline2":{"message":"Categoria exclude donații sau mărfuri personalizate"},"category_selfpromo":{"message":"Promovare neplătită/autopromovare"},"category_selfpromo_description":{"message":"Similar cu \"sponsorizare\" doar că este neplătit sau autopromovare. Aceasta include secțiuni despre merchandise, donații, sau informații despre cei cu care au colaborat."},"category_selfpromo_guideline1":{"message":"Donații, abonamente și mărfuri personalizate"},"category_selfpromo_guideline2":{"message":"Mențiuni gratuite fără valoare adăugată conținutului"},"category_selfpromo_guideline3":{"message":"Categoria exclude produsele unor firme mari"},"category_exclusive_access":{"message":"Acces exclusiv"},"category_exclusive_access_description":{"message":"Etichetă pentru videoclipuri întregi. Folosită pentru prezentarea unui produs, a unui serviciu sau a unei locații cu acces gratuit sau subvenționat pentru creator."},"category_exclusive_access_pill":{"message":"Acest videoclip prezintă un produs, un serviciu sau o locație la care creatorul a primit acces gratuit sau subvenționat","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Întreaga înregistrare video prezintă ceva cu acces liber sau subvenționat"},"category_interaction":{"message":"Cerere de interacțiune sau de abonare"},"category_interaction_description":{"message":"Când există o scurtă remintire pentru like, abonare sau urmărire în mijlocul conținutului. Daca este mai lung sau despre ceva specific, folosiți autopromovarea."},"category_interaction_guideline1":{"message":"Scurte cereri de apreciere, abonare sau de urmărire"},"category_interaction_guideline2":{"message":"Categoria include cereri indirecte de comentarii"},"category_interaction_guideline3":{"message":"Categoria nu include promovarea, ci doar cererile de interacțiune"},"category_interaction_short":{"message":"Reamintire de Interacțiune"},"category_intro":{"message":"Tranziție / introducere"},"category_intro_description":{"message":"Un interval fără conținut. Poate fi o pauză, un cadru static, o animație care se repeta. Nu ar trebui sa fie folosit pentru tranziții care conțin informații."},"category_intro_short":{"message":"Pauză"},"category_intro_guideline1":{"message":"Scene fără conținut"},"category_intro_guideline2":{"message":"Categoria exclude tranzițiile cu informații"},"category_outro":{"message":"Ecran De Final/Credite"},"category_outro_description":{"message":"Credite sau atunci când apare ecranul de final YouTube. Nu pentru concluzii cu informații."},"category_outro_guideline1":{"message":"Nu marcați conținut informativ, chiar dacă sunt suprapuse carduri de final"},"category_preview_description":{"message":"Colecția de clipuri care arată ce se află în acest videoclip sau alte videoclipuri într-o serie în care toate informațiile sunt repetate mai târziu în videoclip."},"category_preview_guideline1":{"message":"Scene care apar mai târziu sau într-un videoclip viitor"},"category_preview_guideline2":{"message":"Recapitulare din videoclipuri anterioare"},"category_preview_guideline3":{"message":"Categoria exclude scene ce adaugă valoare conținutului"},"category_filler":{"message":"Subiecte tangențiale și glume"},"category_filler_description":{"message":"Scene tangențiale pentru distracție care nu sunt necesare pentru a înțelege ideea principală a clipului video. Nu sugerați segmente în care se oferă informații suplimentare. Categoria este deosebit de agresivă și este menită a se folosi strict pentru a omite diverse „glume“."},"category_filler_short":{"message":"Subiecte tangențiale"},"category_filler_guideline1":{"message":"Scene tangențiale pentru distracție sau umplutură"},"category_filler_guideline2":{"message":"Glume, gafe, reluări"},"category_filler_guideline3":{"message":"Categoria exclude scenele valoroase pentru subiectul videoclipului"},"category_music_offtopic":{"message":"Muzică: Secţiune Non-Muzicală"},"category_music_offtopic_description":{"message":"Doar pentru videoclipuri muzicale. Categoria include scene non-muzicale din spectacole în direct sau secțiuni care nu apar în lansări oficiale. Folosită doar dacă segmentele nu sunt deja acoperite de o altă categorie."},"category_music_offtopic_short":{"message":"Non-Muzical"},"category_music_offtopic_guideline1":{"message":"Secțiuni care nu sunt în lansări oficiale"},"category_music_offtopic_guideline2":{"message":"Scene non-muzicale dintr-un spectacol în direct"},"category_poi_highlight":{"message":"Punct de interes"},"category_poi_highlight_description":{"message":"Partea de interes major din cadrul videoclipului, indicată și prin comentarii de forma \"Videoclipul începe la momentul X\"."},"category_poi_highlight_guideline1":{"message":"Secțiunea pe care majoritatea persoanelor o caută"},"category_poi_highlight_guideline2":{"message":"Puteți omite context"},"category_poi_highlight_guideline3":{"message":"Puteți omite până la subiectul din titlu sau din miniatură"},"category_chapter":{"message":"Capitol"},"category_chapter_description":{"message":"Capitolele cu nume personalizate care descriu secțiuni majore ale unui videoclip."},"category_chapter_guideline1":{"message":"Nu menţiona numele de marcă sponsor"},"category_chapter_guideline2":{"message":"Folosește capitole mai mari pentru secțiunile generale"},"category_chapter_guideline3":{"message":"Capitolele mai mici pot fi plasate în interiorul capitolelor mai mari"},"category_livestream_messages":{"message":"Transmisiune În Direct: Donație/Citirea Mesajelor"},"category_livestream_messages_short":{"message":"Citire Mesaj"},"autoSkip":{"message":"Omitere automată"},"manualSkip":{"message":"Omitere manuală"},"showOverlay":{"message":"Afișare în bara de derulare"},"disable":{"message":"Dezactivare"},"autoSkip_POI":{"message":"Omitere automată la început"},"manualSkip_POI":{"message":"Notificare după încărcarea paginii"},"showOverlay_POI":{"message":"Afișare în bara de derulare"},"showOverlay_full":{"message":"Afișare etichetă"},"showOverlay_chapter":{"message":"Afișează Capitolele"},"autoSkipOnMusicVideos":{"message":"Omiteți automat toate segmentele atunci când există un segment non-muzical"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Omiteți automat doar pe music.youtube.com"},"muteSegments":{"message":"Permiteți și segmente care opresc sunetul"},"fullVideoSegments":{"message":"Afișați o pictogramă în dreptul videoclipurilor publicitare","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Afișați pictograma și în miniaturile din interfață","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Culoare pentru propuneri nefinalizate","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Culoarea barei de derulare"},"category":{"message":"Categorie"},"skipOption":{"message":"Mod de omitere","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"Activează Serverul de Teste"},"whatEnableTestingServer":{"message":"Înregistrările și voturile dumneavoastră NU VOR FI CONTORIZATE pe serverul principal. Utilizați asta doar pentru teste."},"testingServerWarning":{"message":"Toate înregistrările și voturile dumneavoastră NU VOR FI CONTORIZATE pe serverul principal în timp ce vă conectați la serverul de teste. Asigurați-vă că dezactivați asta când vreți să trimiteți înregistrări reale."},"bracketNow":{"message":"(Acum)"},"moreCategories":{"message":"Mai multe categorii"},"chooseACategory":{"message":"Alege o categorie"},"enableThisCategoryFirst":{"message":"Pentru a trimite segmente cu categoria \"{0}\", trebuie să o activați în opțiuni. Veți fi redirecționat către opțiuni acum.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Atenție: Acest tip de segment poate avea un singur segment activ. Predarea mai multor segmente va cauza un segment aleatoriu să fie afișat."},"youMustSelectACategory":{"message":"Trebuie să selectaţi o categorie pentru toate segmentele pe care le trimiteţi!"},"bracketStart":{"message":"(Start)"},"bracketEnd":{"message":"(Sfârșit)"},"End":{"message":"Sfârșit","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"ascuns: downvote"},"hiddenDueToDuration":{"message":"ascuns: prea scurt"},"manuallyHidden":{"message":"ascuns manual"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID-ul canalului nu este încă încărcat. Dacă utilizați un videoclip încorporat, încercați în schimb să utilizați pagina de pornire YouTube. Acest lucru ar putea fi cauzat și de modificările aduse aspectului YouTube, dacă credeți că faceți un comentariu aici:"},"invidiousPermissionRefresh":{"message":"Browserul a revocat permisiunea necesară pentru a funcționa pe site-urile Invidioase și pe alte site-uri de 3 părți. Vă rugăm să faceți clic pe butonul de mai jos pentru a reactiva această permisiune."},"acceptPermission":{"message":"Acceptă permisiunea"},"permissionRequestSuccess":{"message":"Solicitarea permisiunii reușită!"},"permissionRequestFailed":{"message":"Solicitarea permisiunii a eșuat, ai dat clic pe refuz?"},"adblockerIssueWhitelist":{"message":"Dacă nu puteți rezolva acest lucru, apoi dezactivați setarea 'Forțați verificarea canalului înainte de sărit', deoarece SponsorBlock nu poate prelua informațiile canalului pentru acest videoclip"},"forceChannelCheck":{"message":"Forțează verificarea canalului înainte de a sări"},"whatForceChannelCheck":{"message":"În mod implicit, va sări peste sponsorizări chiar și înainte de a ști ce canal este. În mod implicit, unele segmente la începutul videoclipului poate fi omis din canalele excluse. Activând această opțiune va preveni asta, dar va face ca toate săriturile să aibă o ușoară întârziere, deoarece obținerea ID-ul canalului poate dura ceva timp. Această întărziere poate fi neobservată daca aveți internet rapid."},"forceChannelCheckPopup":{"message":"Consideră activarea \"Forțează verificarii canalului înainte de a sări\""},"downvoteDescription":{"message":"Timpi Incorecți/Greșiți"},"incorrectVote":{"message":"Incorect"},"harmfulVote":{"message":"Periculos","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Schimbare categorie"},"nonMusicCategoryOnMusic":{"message":"Acest videoclip este categorisit ca muzică. Ești sigur ca există un sponsor? Dacă acesta este defapt un segment non-muzical, deschideți opțiunile extensiei și activați această categorie. Apoi, puteți trimite acest segment ca non-muzical în loc de sponsol. Vă rugăm să citiți ghidul dacă sunteți confuz."},"multipleSegments":{"message":"Segmente Multiple"},"guidelines":{"message":"Instrucțiuni"},"readTheGuidelines":{"message":"Citește Instrucțiunile!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Categoriile sunt aici!"},"categoryUpdate2":{"message":"Deschide opțiunile pentru a sări peste intro-uri, outro-uri, merch, etc."},"help":{"message":"Ajutor"},"GotIt":{"message":"Am înțeles","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Acest segment este mare. Dacă întregul videoclip se încadrează într-o categorie, atunci schimbați de la \"Săriți\" la \"Videoclip întreg\". Vedeți instrucțiunile pentru mai multe informații."},"categoryPillTitleText":{"message":"Întregul videoclip se încadrează în categoria menționată și nu poate fi separat în segmente"},"chapterNameTooltipWarning":{"message":"Unul dintre numele capitolelor tale este similar cu o categorie. Ar trebui să folosești categorii atunci când este posibil."},"experiementOptOut":{"message":"Renunțarea tuturor experimentelor viitoare","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Ascunde pentru totdeauna"},"warningChatInfo":{"message":"Am observat că faci niște greșeli comune. Apreciem foarte mult munca ta de până acum, însă noi tindem spre perfecțiune aici, așa că fiecare mică greșeală contează :)"},"questionButton":{"message":"Am o întrebare"},"askAQuestion":{"message":"Pune o întrebare"},"warningConfirmButton":{"message":"Înțeleg motivul"},"warningError":{"message":"Eroare la încercarea de a confirma avertismentul:"},"deArrowMessageRecieved":{"message":"Ați primit un sfat de la un moderator"},"Donate":{"message":"Donează"},"considerDonating":{"message":"Ajută la dezvoltarea fondului"},"hideDonationLink":{"message":"Nu afișați buton de donare în cadrul extensiei"},"darkModeOptionsPage":{"message":"Temă întunecată pentru pagina de opțiuni"},"helpPageThanksForInstalling":{"message":"Vă mulțumim pentru instalarea SponsorBlock."},"helpPageReviewOptions":{"message":"Vă rugăm să analizați opțiunile de mai jos"},"helpPageFeatureDisclaimer":{"message":"Multe caracteristici sunt dezactivate în mod implicit. Dacă doriți să săriți peste introduceri, outros, utilizați Invidios, etc., activați-le mai jos. De asemenea, puteți ascunde/afișa elemente UI."},"helpPageHowSkippingWorks2":{"message":"Ori de câte ori săriți peste un segment, veți primi observație. Dacă sincronizarea pare greșită votând în jos făcând clic pe vot! De asemenea, poți vota în pop-up."},"Submitting":{"message":"Se transmite"},"helpPageCopyOfDatabase2":{"message":"Codul sursă este disponibil gratuit. Deci, chiar dacă ceva mi se întâmplă mie, trimiterile tale nu sunt pierdute."},"Credits":{"message":"Contribuții"},"LearnMore":{"message":"Aflați mai multe"},"FullDetails":{"message":"Detalii Complete"},"CopyDownvoteButtonInfo":{"message":"Butonul acordă un vot negativ și creează o copie pentru a retrimite"},"OpenCategoryWikiPage":{"message":"Deschide pagina wiki a acestei categorii."},"CopyAndDownvote":{"message":"Copiați și votați negativ"},"ContinueVoting":{"message":"Continuă votarea"},"ChangeCategoryTooltip":{"message":"Acest lucru se va aplica instantaneu segmentelor dvs"},"downvote":{"message":"Nu apreciați"},"upvote":{"message":"Apreciați"},"hideSegment":{"message":"Ascunde segmentul"},"skipSegment":{"message":"Sari peste segment"},"playChapter":{"message":"Reda capitolul"},"SponsorTimeEditScrollNewFeature":{"message":"Folosiți rotița mouse-ului când cursorul este deasupra casetei pentru a modifica marcajul de timp. Tastele Ctrl sau Shift pot fi folosite pentru ajustări mai precise."},"categoryPillNewFeature":{"message":"Nou! Vezi când un videoclip este sponsorizat în întregime sau auto-promovat"},"yearAbbreviation":{"message":"Y","description":"100y"},"dayAbbreviation":{"message":" zile","description":"100d"},"hourAbbreviation":{"message":" ore","description":"100h"},"optionsTabBehavior":{"message":"Comportament","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Interfață","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Combinații de taste","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Copie de rezervă","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Diverse","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Aspect","description":"Option label"},"unbind":{"message":"Ștergeți","description":"Unbind keyboard shortcut"},"notSet":{"message":"Nesetat"},"change":{"message":"Schimbă"},"youtubeKeybindWarning":{"message":"Aceasta este o scurtătură YouTube integrată. Ești sigur că vrei să o folosești?"},"betaServerWarning":{"message":"Serverul BETA este activat!"},"openOptionsPage":{"message":"Deschide pagina de opțiuni"},"resetToDefault":{"message":"Restabiliți valorile implicite"},"confirmResetToDefault":{"message":"Ești sigur că vrei sa resetezi toate setările la valorile lor implicite? Această acțiune nu poate fi anulată."},"exportSegments":{"message":"Copiați propunerea"},"importSegments":{"message":"Importare segmente"},"Import":{"message":"Importă","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Revendicare cu succes!"},"redeemFailed":{"message":"Cheia de licență nu este validă"},"hideUpsells":{"message":"Nu afișați opțiuni indisponibile fără plată suplimentară"},"hideNewFeatureUpdates":{"message":"Nu afișați notificări pentru funcționalități noi"},"redeem":{"message":"Folosește"},"enterLicenseKey":{"message":"Introdu cheia de licență"},"unsubmittedSegmentCounts":{"message":"Aveți {0} în cadrul a {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Nu aveți propuneri netransmise","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"segment netransmis","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"segmente netransmise","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"videoclip","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videoclipuri","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Ștergeți propunerile netransmise","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Sigur doriți ștergerea tuturor propunerilor netransmise?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Afișați lista","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Ascundeți lista","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID videoclip","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Numărul de segmente","description":"Header of the unsubmitted segments list"},"actions":{"message":"Acțiuni","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Link către propunere"},"segmentFetchFailureWarning":{"message":"Atenție: Serverul nu a răspuns încă cu segmente. Ar putea fi segmente în acest videoclip deja trimise, dar pur și simplu nu le-ai primit din cauza problemelor cu serverul."},"allowScrollingToEdit":{"message":"Permiteți modificarea timpilor cu rotița mouse-ului"},"NoticeTimeAfterSkip":{"message":"{seconds} secunde","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Titluri și miniaturi mai bune pe YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Titlurile Crowdsourcing și miniaturile vor fi descriptive și nu senzaționale","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Alege cel mai descriptiv"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Titlu original"},"CurrentTime":{"message":"Ora curentă"},"resetCustomTitle":{"message":"Resetează titlul înapoi la textul original"},"resetIcon":{"message":"Resetează Pictogramă"},"TypeYourOwnTitleHere":{"message":"Scrieți propriul titlu aici"},"VideoNotReady":{"message":"Videoclipul nu este gata"},"FailedToRender":{"message":"Randare eșuată","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Lipsește canvas","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Excepție în timpul redării","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Încărcare eșuată","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Formatul titlului"},"Disabled":{"message":"Dezactivat"},"CapitalizeWords":{"message":"Capitalizează cuvintele"},"TitleCase":{"message":"Majuscule de Titlu"},"SentenceCase":{"message":"Majuscule de propoziție"},"LowerCase":{"message":"fără majuscule"},"FirstLetterUppercase":{"message":"Prima literă majuscule"},"shouldCleanEmojis":{"message":"Eliminați Emoji"},"onlyTitleCaseInEnglish":{"message":"Aplcați majuscule de titlu nu doar în limba engleză"},"onlyTitleCaseInEnglishDescription":{"message":"Detectarea limbii nu este perfectă și detectează unele titluri în limba engleză ca non-engleze."},"thumbnailFallbackOption":{"message":"Când nu există nicio miniatură trimisă"},"RandomTime":{"message":"Arată o captură de ecran dintr-un timp aleatoriu"},"TheOriginalThumbnail":{"message":"Arată miniatura originală"},"showABlankBox":{"message":"Arată o casetă goală"},"AutoGenerated":{"message":"Arată o miniatură auto-generată de YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Început"},"Middle":{"message":"Centru"},"keepUnsubmitted":{"message":"Stochează voturile trimise"},"showLiveCover":{"message":"Arată avatarul canalului la videoclipurile viitoare","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Nu utilizați niciodată miniaturile testate A/B"},"ignoreAbThumbnailsDescription":{"message":"Canalele pot seta teste pe videoclipurile lor, unde YouTube va afișa miniaturi diferite pentru fiecare persoană. Această opțiune va utiliza întotdeauna prima miniatură pentru a menține coerența."},"abThumbnailsWarning":{"message":"Avertisment: Acest videoclip are în prezent o miniatură de testare A/B pornită. Acest lucru înseamnă că miniatura se poate schimba frecvent. Probabil că nu ar trebui să votați pentru miniatura originală din cauza acestui risc."},"whatKeepUnsubmitted":{"message":"Păstrați voturile depuse după vot pentru a afișa titlurile și miniaturile pe care le-ați ales în loc de cea de sus votată pe server."},"keepUnsubmittedInPrivate":{"message":"Stochează voturile trimise din file private"},"useThumbnailGenerationService":{"message":"Utilizați serviciul de generare miniatură"},"titleMaxLines":{"message":"Linii maxime pentru titlu"},"thumbnailSaturationLevel":{"message":"Nivelul saturaţiei miniaturii"},"Enable":{"message":"Activare"},"Titles":{"message":"Titluri","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniaturi","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"Eroare"},"FillerWarning":{"message":"Atenție: Aceasta este o categorie deosebit de agresivă. Probabil va trebui să anulați diverse omiteri sau chiar să dezactivați opțiunea. Multe videoclipuri vor avea omiteri de peste 50% din durata lor! Cu toate acestea, rețineți că există niște reguli clare pentru propuneri.","description":"Warning that appears when enabling the filler tangent category"},"tip5":{"message":"Aplicați majuscule precum într-o propoziție","description":"Tip about submitting titles to DeArrow"},"DetectedWord":{"message":"Cuvânt problemă: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"cleanPopup":{"message":"Simplificați meniul principal de informații"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ru/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ru/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Время ожидания подключения превышено. Проверьте ваше соединение с интернетом. Если ваш интернет работает, сервер, скорее всего, перегружен или отключён."},"400":{"message":"Сервер отклонил этот запрос"},"409":{"message":"Этот запрос был отправлен ранее"},"502":{"message":"Похоже, сервер перегружен. Попробуйте ещё раз через несколько секунд."},"fullName":{"message":"SponsorBlock для YouTube - Пропускайте спонсорские вставки","description":"Name of the extension."},"Description":{"message":"Пропускайте спонсорские вставки, просьбы подписаться и другое в видео на YouTube. Отправляйте информацию о спонсорах в видео, чтобы экономить другим время.","description":"Description of the extension."},"channelWhitelisted":{"message":"Канал добавлен в белый список!"},"Segment":{"message":"сегмент"},"Segments":{"message":"сегментов"},"SegmentsCap":{"message":"Сегменты"},"Chapters":{"message":"Эпизоды"},"renderAsChapters":{"message":"Отображать сегменты как эпизоды","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Показывать название текущего сегмента рядом со временем"},"showAutogeneratedChapters":{"message":"Показывать главы, автоматически созданные YouTube"},"upvoteButtonInfo":{"message":"Проголосовать за этот сегмент"},"reportButtonTitle":{"message":"Пожаловаться"},"reportButtonInfo":{"message":"Сообщить об ошибке в этом сегменте."},"Dismiss":{"message":"Закрыть"},"Loading":{"message":"Загрузка..."},"Hide":{"message":"Больше не показывать"},"hitGoBack":{"message":"Нажмите «Назад», чтобы вернуться обратно."},"unskip":{"message":"Назад"},"reskip":{"message":"Пропустить"},"unmute":{"message":"Включить звук"},"paused":{"message":"Пауза"},"manualPaused":{"message":"Таймер остановлен"},"confirmMSG":{"message":"Чтобы изменить или удалить отдельные значения, нажмите кнопку «Информация» или откройте всплывающее окно расширения, щелкнув на значок расширения в правом верхнем углу."},"clearThis":{"message":"Вы уверены, что хотите это удалить?\n\n"},"Unknown":{"message":"При отправке сегмента произошла ошибка. Попытайтесь отправить его позже."},"sponsorFound":{"message":"В базе есть сегменты для этого видео!"},"sponsor404":{"message":"Сегменты не найдены"},"sponsorStart":{"message":"Сегмент начинается отсюда"},"sponsorEnd":{"message":"Сегмент заканчивается здесь"},"sponsorCancel":{"message":"Отменить создание сегмента"},"noVideoID":{"message":"Видео YouTube не найдено.\nЕсли это не так, обновите вкладку."},"refreshSegments":{"message":"Обновить сегменты"},"success":{"message":"Успех!"},"voted":{"message":"Голос засчитан!"},"serverDown":{"message":"Кажется, сервер не отвечает. Свяжитесь с разработчиком."},"connectionError":{"message":"Ошибка соединения. Код ошибки: "},"segmentsStillLoading":{"message":"Сегменты всё ещё загружаются..."},"clearTimes":{"message":"Очистить сегменты"},"openPopup":{"message":"Открыть всплывающее окно SponsorBlock"},"closePopup":{"message":"Закрыть окно"},"closeIcon":{"message":"Кнопка закрытия"},"OpenSubmissionMenu":{"message":"Открыть меню отправки"},"OpenCasualVoteMenu":{"message":"Открыть меню обычного режима"},"sortSegments":{"message":"Сортировать сегменты"},"submitCheck":{"message":"Вы уверены, что хотите это отправить?"},"whitelistChannel":{"message":"Добавить канал в белый список"},"removeFromWhitelist":{"message":"Удалить канал из белого списка"},"voteOnTime":{"message":"Проголосовать за сегмент"},"Submissions":{"message":"Отправлено сегментов"},"savedPeopleFrom":{"message":"Вы помогли людям пропустить "},"viewLeaderboard":{"message":"Доска почёта"},"recordTimesDescription":{"message":"Отправить"},"submissionEditHint":{"message":"Редактирование сегментов появится после нажатия на кнопку «Отправить»","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Подсказка: Вы можете настроить сочетания клавиш для отправки в настройках"},"clearTimesButton":{"message":"Очистить время"},"Username":{"message":"Имя пользователя"},"setUsername":{"message":"Установить имя пользователя"},"copyPublicID":{"message":"Копировать публичный UserID"},"copySegmentID":{"message":"Копировать ID сегмента"},"loopChapter":{"message":"Зациклить"},"unloopChapter":{"message":"Снять зацикливание"},"hideThis":{"message":"Скрыть это"},"Options":{"message":"Настройки"},"showButtons":{"message":"Показывать кнопки в плеере YouTube"},"hideButtonsDescription":{"message":"Эта настройка скрывает кнопки для отправки сегментов, расположенные в плеере YouTube."},"showSkipButton":{"message":"Показывать кнопку «Пропустить до важного» в плеере YouTube"},"showInfoButton":{"message":"Показывать кнопку информации в плеере YouTube"},"autoHideInfoButton":{"message":"Автоматически скрывать кнопку информации"},"showDeleteButton":{"message":"Показывать кнопку удаления в плеере YouTube"},"enableViewTracking":{"message":"Включить отслеживание количества пропусков сегментов"},"whatViewTracking":{"message":"Эта возможность отслеживает, какие сегменты Вы пропустили, чтобы помочь пользователям узнать, насколько их вклад помог другим, и, наряду с голосами, используется как метрика, чтобы убедиться, что спам не попадает в базу данных. Расширение отправляет сообщение на сервер каждый раз, когда Вы пропускаете сегмент. Надеемся, большая часть пользователей не поменяет эту настройку, так что у нас будет точная статистика просмотров. :)"},"enableViewTrackingInPrivate":{"message":"Включить отслеживание пропусков во вкладках инкогнито"},"enableTrackDownvotes":{"message":"Хранить отрицательные оценки сегментов"},"whatTrackDownvotes":{"message":"Все сегменты, которым вы поставите отрицательную оценку, будут скрыты даже после обновления страницы"},"trackDownvotesWarning":{"message":"Предупреждение: Отключение этой настройки удалит все ранее сохранённые оценки"},"enableTrackDownvotesInPrivate":{"message":"Хранить голоса против в приватных/инкогнито вкладках"},"enableQueryByHashPrefix":{"message":"Запрос по префиксу хэша"},"whatQueryByHashPrefix":{"message":"Вместо отправки на сервер ID видео, для получения сегментов будут использоваться первые 4 символа хэша ID. Сервер вернёт данные для всех видео с похожими хэшами."},"enableShowCategoryWithoutPermission":{"message":"Показывать категории в меню отправки даже без разрешения на публикацию"},"whatShowCategoryWithoutPermission":{"message":"Некоторые категории требуют разрешения для отправки из-за минимальных требований к репутации"},"showNotice":{"message":"Показать уведомление снова"},"showSkipNotice":{"message":"Показывать уведомление после пропуска сегмента"},"showUpcomingNotice":{"message":"Показывать уведомление перед началом сегмента"},"showCategoryGuidelines":{"message":"Показать справку для категории"},"noticeVisibilityMode0":{"message":"Полноразмерные уведомления о пропусках"},"noticeVisibilityMode1":{"message":"Уменьшенные уведомления для автоматических пропусков"},"noticeVisibilityMode2":{"message":"Все уведомления уменьшенного размера"},"noticeVisibilityMode3":{"message":"Полупрозрачные уведомления для автоматических пропусков"},"noticeVisibilityMode4":{"message":"Полупрозрачные уведомления для всех пропусков"},"longDescription":{"message":"SponsorBlock позволяет пропускать спонсорские вставки, начальные и конечные заставки, просьбы подписаться и другое в видео на YouTube. SponsorBlock — коллективное расширение, которое позволяет каждому отправить время начала и конца подобных сегментов в видео. После того, как кто-нибудь отправляет эту информацию, все остальные пользователи расширения будут автоматически пропускать эти сегменты. Так же можно пропускать части клипов без музыки.","description":"Full description of the extension on the store pages."},"website":{"message":"Сайт","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Исходный код","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Уведомление было обновлено!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Если оно Вам всё равно не нравится, нажмите \"не показывать\".","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Пропустить сегмент","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Начало/конец сегмента","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Открыть меню отправки","description":"Keybind label"},"setSubmitKeybind":{"message":"Отправить сегменты","description":"Keybind label"},"setPreviewKeybind":{"message":"Предпросмотр сегмента","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Закрыть уведомление о пропуске","description":"Keybind label"},"setDownvoteKeybind":{"message":"Проголосовать против сегмента","description":"Keybind label"},"setUpvoteKeybind":{"message":"Проголосовать за сегмент","description":"Keybind label"},"nextChapterKeybind":{"message":"Следующий эпизод","description":"Keybind label"},"previousChapterKeybind":{"message":"Предыдущий эпизод","description":"Keybind label"},"enableDeArrowKey":{"message":"Включить/выключить DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Открыть меню отправки","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Нажмите на любую кнопку, чтобы выбрать её, а так же выберите модификаторы, если нужно."},"disableSkipping":{"message":"Пропуск включен"},"enableSkipping":{"message":"Пропуск выключен"},"yourWork":{"message":"Ваша работа","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Код ошибки: "},"skip":{"message":"Пропустить"},"mute":{"message":"Заглушить"},"full":{"message":"Всё видео","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Пропустить {0}?"},"mute_category":{"message":"Заглушить {0}?"},"skip_to_category":{"message":"Пропустить до {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Далее: {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"Пропущено: {0}","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} заглушен","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Пропущено до {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Голос за категорию {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Отключить автоматический пропуск"},"enableAutoSkip":{"message":"Включить автоматический пропуск"},"audioNotification":{"message":"Аудио уведомление при пропуске"},"audioNotificationDescription":{"message":"Звуковое уведомление при пропуске будет воспроизводиться каждый раз, когда сегмент пропущен. Если отключено (или автоматический пропуск отключён), звук не будет воспроизводиться."},"showTimeWithSkips":{"message":"Показывать длительность без сегментов"},"showTimeWithSkipsDescription":{"message":"Длительность отображается в скобках после фактической под полосой прокрутки. Показывает длительность видео без сегментов. Включает сегменты, для которых выбрано \"Отображать в полосе прокрутки\"."},"youHaveSkipped":{"message":"Вы пропустили "},"minLower":{"message":"минуту"},"minsLower":{"message":"минут"},"hourLower":{"message":"час"},"hoursLower":{"message":"часов"},"youHaveSavedTime":{"message":"Вы сэкономили людям","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" их жизни","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Смотрите состояние сервера на status.sponsor.ajay.app."},"changeUserID":{"message":"Импорт/Экспорт приватного UserID"},"whatChangeUserID":{"message":"Держите его в тайне. Относитесь к нему как к паролю и не передавайте никому. Если кто-то им завладеет, то сможет выдать себя за вас. Если вы ищете публичный ID пользователя, нажмите значок буфера обмена во всплывающем окне."},"setUserID":{"message":"Установить приватный UserID"},"userIDChangeWarning":{"message":"Внимание: изменение приватного UserID необратимо. Вы действительно хотите это сделать? Сделайте резервную копию на всякий случай."},"createdBy":{"message":"Создано"},"supportOtherSites":{"message":"Поддерживать сторонние YouTube-сайты"},"supportOtherSitesDescription":{"message":"Поддержка сторонних клиентов YouTube. Чтобы включить поддержку, вы должны принять дополнительные разрешения.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Поддерживаемые сайты: "},"optionsInfo":{"message":"Включить поддержку Invidious, выключить автоматический пропуск, скрыть кнопки и не только."},"addInvidiousInstance":{"message":"Добавить инстанс стороннего клиента"},"addInvidiousInstanceDescription":{"message":"Добавить свой инстанс. Формат: ТОЛЬКО домен. Например, invidious.ajay.app"},"add":{"message":"Добавить"},"addInvidiousInstanceError":{"message":"Это неправильный домен. Введите ТОЛЬКО домен. Например, invidious.ajay.app"},"resetInvidiousInstance":{"message":"Сбросить список инстансов Invidious"},"resetInvidiousInstanceAlert":{"message":"Вы собираетесь сбросить список инстансов Invidious"},"invidiousDisabledSafari":{"message":"В настоящее время из-за ошибки в Safari отсутствует поддержка Invidious. Она будет доступна вновь после того, как Apple исправит ошибку."},"currentInstances":{"message":"Текущие инстансы:"},"minDuration":{"message":"Минимальная длительность (в секундах):"},"minDurationDescription":{"message":"Сегменты короче этого значения не будут пропускаться и не будут показаны в плеере."},"enableManualSkipOnFullVideo":{"message":"Использовать пропуск вручную, когда видео помечено целиком"},"whatManualSkipOnFullVideo":{"message":"Для тех, кто хочет просматривать полностью проспонсированные или саморекламные видео без автоматических пропусков."},"skipNoticeDuration":{"message":"Отображение уведомления о пропуске (в секундах):"},"skipNoticeDurationDescription":{"message":"Уведомление о пропуске будет оставаться на экране как минимум в течение этого времени. Может быть активно дольше при пропуске вручную."},"shortCheck":{"message":"Следующий диапазон времени короче, чем Ваша настройка минимальной длительности. Это может означать, что он уже был отправлен, и просто игнорируется из-за этой настройки. Вы действительно хотите отправить?"},"liveOrPremiere":{"message":"Отправка сегментов на стримах или премьерах не допускается. Пожалуйста, дождитесь окончания видео, затем обновите страницу и убедитесь, что сегменты всё ещё верные."},"showUploadButton":{"message":"Показывать кнопку отправки"},"customServerAddress":{"message":"Адрес сервера SponsorBlock"},"customServerAddressDescription":{"message":"Адрес, по которому SponsorBlock обращается к серверу.\nМеняйте только если Вы подняли свой сервер."},"dataFetchingServerAddress":{"message":"Адрес сервера данных"},"dataFetchingServerAddressDescription":{"message":"Адрес, по которому расширение обращается к серверу данных.\nНе изменяйте значение, если у вас нет собственного сервера."},"thumbnailCacheServerAddress":{"message":"Адрес сервера для кэширования значков"},"save":{"message":"Сохранить"},"reset":{"message":"Сбросить"},"customAddressError":{"message":"Этот адрес неправильного формата. Убедитесь, что он начинается с http:// или https://, и что на конце нет слэшей."},"areYouSureReset":{"message":"Вы действительно хотите это сбросить?"},"mobileUpdateInfo":{"message":"m.youtube.com теперь поддерживается"},"exportOptions":{"message":"Импорт/Экспорт всех настроек"},"exportOtherData":{"message":"Импортировать/экспортировать остальные данные"},"exportOptionsCopy":{"message":"Редактировать/скопировать"},"exportOptionsDownload":{"message":"Сохранить в файл"},"exportOptionsUpload":{"message":"Загрузить из файла"},"whatExportOptions":{"message":"Все настройки в формате JSON. Этот файл содержит Ваш приватный UserID, будьте осторожны когда делитесь этими данными."},"setOptions":{"message":"Параметры установки"},"exportOptionsWarning":{"message":"Внимание: изменение настроек необратимо и может сломать расширение. Вы действительно хотите это сделать? Сделайте резервную копию на всякий случай."},"incorrectlyFormattedOptions":{"message":"JSON-файл некорректно отформатирован. Ваши настройки не были изменены."},"confirmNoticeTitle":{"message":"Отправить сегмент"},"submit":{"message":"Отправить"},"cancel":{"message":"Отмена"},"delete":{"message":"Удалить"},"preview":{"message":"Предпросмотр"},"unsubmitted":{"message":"Неопубликованный"},"inspect":{"message":"Исследовать"},"edit":{"message":"Редактировать"},"copyDebugLogs":{"message":"Скопировать логи отладки"},"copyDebugInformation":{"message":"Скопировать отладочную информацию в буфер обмена"},"copyDebugInformationFailed":{"message":"Не удалось скопировать в буфер"},"copyDebugInformationOptions":{"message":"Копирует в буфер обмена информацию, которая будет предоставлена разработчику при возникновении ошибки / по запросу разработчика. Такие сведения, как ID пользователя, список разрешенных каналов и адрес пользовательского сервера не передаются. Однако, отправляются ваш user agent, браузер, операционная система и номер версии расширения. "},"copyDebugInformationComplete":{"message":"Отладочная информация скопирована в буфер обмена. Вы можете удалить любую информацию, которой не хотите делиться. Сохраните ее в текстовом файле или вставьте в отчет об ошибке."},"keyAlreadyUsed":{"message":"Это сочетание клавиш привязано к другому действию. Пожалуйста, выберите другое сочетание."},"to":{"message":"до","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Скопировано!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Содержит плавный переход от одной темы к другой"},"generic_guideline2":{"message":"Пропуск должен произойти незаметно"},"category_sponsor":{"message":"Спонсор"},"category_sponsor_description":{"message":"Рекламные интеграции, реферальные ссылки и реклама напрямую. Не для саморекламы или рекомендаций разных событий/создателей/сайтов/продуктов, которые нравятся автору видео."},"category_sponsor_guideline1":{"message":"Реклама"},"category_sponsor_guideline2":{"message":"Не для доната или мерчендайза"},"category_selfpromo":{"message":"Безвозмездная или самореклама"},"category_selfpromo_description":{"message":"Похоже на \"Спонсора\", но для бесплатной рекламы и саморекламы. Включает себя вставки про мерчендайз, пожертвования или информацию о тех, вместе с кем было сделано видео."},"category_selfpromo_guideline1":{"message":"Донаты, платное членство и мерчендайз"},"category_selfpromo_guideline2":{"message":"Рекомендации, не добавляющие контекста видео"},"category_selfpromo_guideline3":{"message":"Не для корпоративной продукции"},"category_exclusive_access":{"message":"Эксклюзивный доступ"},"category_exclusive_access_description":{"message":"Категория для всего видео. Используется, когда видео демонстрирует продукт, сервис или местоположение, к которому автор получил бесплатный или субсидированный доступ."},"category_exclusive_access_pill":{"message":"Это видео демонстрирует продукт, сервис или местоположение, к которому автору видео был предоставлен бесплатный или субсидированный доступ","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Всё видео - демонстрация чего-либо, к чему автору видео был дан бесплатный или субсидированный доступ"},"category_interaction":{"message":"Напоминание о взаимодействии (подписка)"},"category_interaction_description":{"message":"Когда есть краткое напоминание поставить лайк, подписаться на канал или в соцсетях в середине содержимого. Если эта вставка длительная или о чём-то конкретном, она должна классифицироваться как самореклама."},"category_interaction_guideline1":{"message":"Краткие напоминания поставить лайк, подписаться или нажать на колокольчик"},"category_interaction_guideline2":{"message":"Включает косвенные предложения оставить комментарий"},"category_interaction_guideline3":{"message":"Не для рекламы, только призывы к действию"},"category_interaction_short":{"message":"Напоминание о взаимодействии"},"category_intro":{"message":"Пауза/интро"},"category_intro_description":{"message":"Часть видео без значимого контента. Может быть паузой, статическим кадром, повторяющейся анимацией. Это не должно использоваться для переходов, содержащих информацию."},"category_intro_short":{"message":"Заставка"},"category_intro_guideline1":{"message":"Сегмент без контента"},"category_intro_guideline2":{"message":"Не для переходных сегментов с информацией"},"category_outro":{"message":"Конечная заставка/титры"},"category_outro_description":{"message":"Титры или время появления конечных заставок YouTube. Не для подведения итогов сказанного в видео."},"category_outro_guideline1":{"message":"Не для сегментов с контентом, даже если на видео показываются конечные заставки"},"category_preview_description":{"message":"Коллекция клипов, которые показывают, что происходит в этом видео или других эпизодах, все клипы позже повторяются в видео."},"category_preview_guideline1":{"message":"Фрагменты, которые появляются позже или в будущем видео"},"category_preview_guideline2":{"message":"Пересказ предыдущего видео"},"category_preview_guideline3":{"message":"Не для сегментов с дополнительным контентом"},"category_filler":{"message":"Отвлечённые темы/шутки"},"category_filler_description":{"message":"Сегменты с отвлечёнными темами или шутками, которые не требуются для понимания основного содержания. Не должно иметь сегментов, объясняющих контекст или предысторию. Это очень агрессивная категория, используется тогда, когда вам не до \"веселья\"."},"category_filler_short":{"message":"Отвлечённые темы"},"category_filler_guideline1":{"message":"Сегменты с отвлечёнными темами или шутками"},"category_filler_guideline2":{"message":"Разговоры не по теме, неудачные дубли, повторы"},"category_filler_guideline3":{"message":"Не для сегментов, необходимых для понимания темы"},"category_music_offtopic":{"message":"Музыка: Сегмент без музыки"},"category_music_offtopic_description":{"message":"Только для использования в музыкальных клипах. Используется для сегментов музыкальных клипов, которые не относятся к другой категории."},"category_music_offtopic_short":{"message":"Без музыки"},"category_music_offtopic_guideline1":{"message":"Сегменты, не включённые в официальные релизы"},"category_music_offtopic_guideline2":{"message":"Сегменты без музыки во время живого выступления"},"category_poi_highlight":{"message":"Важное"},"category_poi_highlight_description":{"message":"Часть видео, которую ищет большинство людей. По сути заменяет комментарии типа \"Видео начинается с x:xx\"."},"category_poi_highlight_guideline1":{"message":"Момент, который будет интересен большинству людей"},"category_poi_highlight_guideline2":{"message":"Может помочь пропустить контекст"},"category_poi_highlight_guideline3":{"message":"Может пропустить до сути названия или значка видео"},"category_chapter":{"message":"Эпизод"},"category_chapter_description":{"message":"Пользовательские названия эпизодов, описывающие основные разделы видео."},"category_chapter_guideline1":{"message":"Не упоминайте названия спонсорских брендов"},"category_chapter_guideline2":{"message":"Используйте длинные эпизоды для разделов на общие темы"},"category_chapter_guideline3":{"message":"Короткие эпизоды могут быть помещены внутри длинных"},"category_livestream_messages":{"message":"Прямые трансляции: пожертвование/чтение сообщения"},"category_livestream_messages_short":{"message":"Чтение сообщений"},"autoSkip":{"message":"Автоматический пропуск"},"manualSkip":{"message":"Пропускать вручную"},"showOverlay":{"message":"Показывать в полосе прокрутки"},"disable":{"message":"Отключить"},"autoSkip_POI":{"message":"Автоматически пропускать к началу видео"},"manualSkip_POI":{"message":"Спрашивать после загрузки видео"},"showOverlay_POI":{"message":"Показывать в полосе прокрутки"},"showOverlay_full":{"message":"Показывать категорию"},"showOverlay_chapter":{"message":"Показывать эпизоды"},"autoSkipOnMusicVideos":{"message":"Пропускать все сегменты автоматически при наличии сегмента без музыки"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Пропускать автоматически только на music.youtube.com"},"muteSegments":{"message":"Разрешить сегменты, которые отключают звук вместо пропуска"},"fullVideoSegments":{"message":"Показывать иконку, когда всё видео является рекламой","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Также показывать категории на значке видео","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Цвет неотправленного сегмента","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Цвет в полосе прокрутки"},"category":{"message":"Категория"},"skipOption":{"message":"Способ пропуска","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Открыть расширенные настройки пропуска"},"advancedSkipNotSaved":{"message":"Синтаксическая ошибка: Ваши настройки не были сохранены"},"advancedSkipSettingsHelp":{"message":"Как это работает","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Включить сервера для бета-тестов"},"whatEnableTestingServer":{"message":"Отправленные вами сегменты и голоса НЕ БУДУТ УЧТЕНЫ на главном сервере. Используйте только для тестирования."},"testingServerWarning":{"message":"Все отправленные вами вставки и голоса НЕ БУДУТ ОТПРАВЛЕНЫ на главный сервер, пока вы подключены к серверу для тестов. Не забудьте отключить эту настройку, чтобы вновь отправлять на главный сервер."},"bracketNow":{"message":"(Сейчас)"},"moreCategories":{"message":"Прочие категории"},"chooseACategory":{"message":"Выберите категорию"},"enableThisCategoryFirst":{"message":"Чтобы отправить сегменты категории \"{0}\", вы должны включить её в настройках. Сейчас вы будете туда перенаправлены.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Предупреждение: Только один сегмент данного типа может быть активным. Отправка нескольких приведёт к отображению только одного случайно выбранного."},"youMustSelectACategory":{"message":"Вы должны выбрать категорию для всех сегментов, которые вы отправляете!"},"bracketStart":{"message":"(Начало)"},"bracketEnd":{"message":"(Конец)"},"End":{"message":"Конец","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"скрыто: проголосовали против"},"hiddenDueToDuration":{"message":"скрыто: слишком коротко"},"manuallyHidden":{"message":"скрыто вручную"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID канала еще не загружен. Если вы используете встроенное видео, попробуйте вместо этого воспользоваться домашней страницей YouTube. Это также может быть вызвано изменениями в дизайне YouTube, если вы считаете, что это так, оставьте комментарий здесь:"},"invidiousPermissionRefresh":{"message":"Браузер отозвал разрешение, необходимое для работы на Invidious и других сторонних сайтах. Пожалуйста, нажмите на кнопку ниже, чтобы восстановить это разрешение."},"acceptPermission":{"message":"Дать разрешение"},"permissionRequestSuccess":{"message":"Разрешение получено!"},"permissionRequestFailed":{"message":"Не удалось получить разрешение, вы нажали на \"Блокировать\"?"},"adblockerIssueWhitelist":{"message":"Если вы не можете решить эту проблему, попробуйте отключить \"Принудительная проверка каналов перед пропуском\" в настройках, т. к. SponsorBlock не может определить название канала для этого видео"},"forceChannelCheck":{"message":"Принудительная проверка каналов перед пропуском"},"whatForceChannelCheck":{"message":"По умолчанию расширение пропускает сегменты сразу же, не проверяя то, какой это канал. По умолчанию некоторые сегменты в начале видео могут быть пропущены на каналах из белого списка. Включение этой настройки предотвратит это, но все пропуски будут иметь небольшую задержку, так как получение ID канала может занять некоторое время. Эта задержка может быть незаметной, если у вас быстрый интернет."},"forceChannelCheckPopup":{"message":"Рекомендуем включить \"Принудительная проверка каналов перед пропуском\""},"downvoteDescription":{"message":"Не нужен/неверно указано время"},"incorrectVote":{"message":"Неверно"},"harmfulVote":{"message":"Оскорбительно","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Изменить категорию"},"nonMusicCategoryOnMusic":{"message":"Это видео классифицировано как музыкальное. Вы уверены, что в нём есть спонсоры? Если на самом деле это \"Сегмент без музыки\", откройте параметры расширения и включите эту категорию. Затем вы можете отправить этот сегмент как \"Без музыки\", а не как спонсора. Пожалуйста, прочтите руководство, если вы запутались."},"multipleSegments":{"message":"Несколько сегментов"},"guidelines":{"message":"Руководство"},"readTheGuidelines":{"message":"Прочитайте руководство!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Приветствуйте категории!"},"categoryUpdate2":{"message":"Откройте настройки, чтобы пропускать начальные и конечные заставки, саморекламу и другое."},"help":{"message":"Помощь"},"GotIt":{"message":"Ясно","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Этот сегмент большой. Если в видео только одна тема, то измените значение с «Пропустить» на «Всё видео». Дополнительную информацию смотрите в руководстве."},"categoryPillTitleText":{"message":"Данная категория применена для всего видео, так как она тесно интегрирована в него"},"chapterNameTooltipWarning":{"message":"Название одного из ваших эпизодов похоже на категорию. Постарайтесь использовать категории когда возможно."},"experiementOptOut":{"message":"Отказаться от всех будущих экспериментов","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Скрыть навсегда"},"warningChatInfo":{"message":"Мы заметили, что вы совершаете распространенные ошибки. Мы очень ценим вашу работу, но мы стремимся делать всё идеально, так что даже очень маленькие ошибки имеют большое значение :)"},"questionButton":{"message":"У меня есть вопрос"},"askAQuestion":{"message":"Задать вопрос"},"warningConfirmButton":{"message":"Я понимаю причину"},"warningError":{"message":"Не удалось подтвердить предупреждение:"},"deArrowMessageRecieved":{"message":"Вы получили сообщение от модератора"},"Donate":{"message":"Пожертвовать"},"considerDonating":{"message":"Помогите финансировать разработку"},"supportSponsorBlock":{"message":"Поддержите мою работу над SponsorBlock"},"hideDonationLink":{"message":"Скрыть ссылку на пожертвование"},"darkModeOptionsPage":{"message":"Тёмный режим на странице настроек"},"helpPageThanksForInstalling":{"message":"Спасибо за установку SponsorBlock."},"helpPageReviewOptions":{"message":"Пожалуйста, ознакомьтесь с настройками ниже"},"helpPageFeatureDisclaimer":{"message":"Многие функции по умолчанию отключены. Если вы хотите пропускать начальные и конечные заставки, использовать Invidious и т.д., включите их ниже. Вы также можете скрыть/показать элементы интерфейса."},"helpPageHowSkippingWorks":{"message":"Как это работает"},"helpPageHowSkippingWorks1":{"message":"Все сегменты предоставлены такими же пользователями, как и вы. Список доступных в базе данных сегментов можно увидеть, открыв всплывающее окно в правом верхнем углу браузера."},"helpPageHowSkippingWorks2":{"message":"Когда вы будете пропускать сегмент, вы получите уведомление. Если время покажется вам неправильным, проголосуйте против, нажав на палец вниз! Вы также можете проголосовать во всплывающем окне."},"Submitting":{"message":"Отправка"},"helpPageSubmitting1":{"message":"Отправка осуществляется нажатием на логотип SponsorBlock в проигрывателе видео."},"helpPageSubmitting2":{"message":"Нажатие на кнопку воспроизведения означает начало сегмента, нажатие на кнопку стоп - его конец. Нажмите на кнопку со стрелкой вверх, чтобы открыть меню отправки, где вы можете предварительно просмотреть ваши сегменты и отредактировать их. Важно быть точным, поэтому обязательно прочитайте правила перед отправкой."},"helpPageCopyOfDatabase":{"message":"Куда отправляются сегменты?"},"helpPageCopyOfDatabase1":{"message":"Все сегменты отправляются в публично доступную базу данных SponsorBlock, которая находится на сайте"},"helpPageCopyOfDatabase2":{"message":"Исходный код в открытом доступе, так что даже если что-то случится со мной, ваш вклад не пропадёт."},"AdviceForSubmitting":{"message":"Советы по отправке"},"Credits":{"message":"Авторы"},"LearnMore":{"message":"Узнать больше"},"FullDetails":{"message":"Полная информация"},"CopyDownvoteButtonInfo":{"message":"Голосует против и создаёт локальную копию сегмента для повторной отправки"},"OpenCategoryWikiPage":{"message":"Открыть вики-страницу этой категории."},"CopyAndDownvote":{"message":"Скопировать и проголосовать против"},"ContinueVoting":{"message":"Продолжить голосование"},"ChangeCategoryTooltip":{"message":"Это мгновенно применится к вашим сегментам"},"downvote":{"message":"Голос «против»"},"upvote":{"message":"Голос «за»"},"hideSegment":{"message":"Скрыть сегмент"},"skipSegment":{"message":"Пропустить сегмент"},"playChapter":{"message":"Воспроизвести эпизод"},"SponsorTimeEditScrollNewFeature":{"message":"Наведите курсор на поле редактирования и используйте колесо мыши для быстрой настройки времени. Клавиши Ctrl или Shift могут быть использованы для точной настройки."},"categoryPillNewFeature":{"message":"Новинка! Расширение покажет, когда видео полностью является спонсорским или саморекламой"},"yearAbbreviation":{"message":"г.","description":"100y"},"dayAbbreviation":{"message":"д","description":"100d"},"hourAbbreviation":{"message":"ч","description":"100h"},"optionsTabBehavior":{"message":"Поведение","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Интерфейс","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Сочетания клавиш","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Копия/Восстановление","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Разное","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Внешний вид уведомления о пропуске","description":"Option label"},"unbind":{"message":"Отвязать","description":"Unbind keyboard shortcut"},"notSet":{"message":"Не задано"},"change":{"message":"Изменить"},"youtubeKeybindWarning":{"message":"Это сочетание используется на сайте YouTube. Вы уверены, что хотите его использовать?"},"betaServerWarning":{"message":"Используется BETA сервер!"},"openOptionsPage":{"message":"Открыть страницу настроек"},"resetToDefault":{"message":"Восстановить настройки по умолчанию"},"confirmResetToDefault":{"message":"Вы уверены, что вы хотите восстановить настройки по умолчанию? Это действие не может быть отменено."},"exportSegments":{"message":"Экспортировать сегменты"},"importSegments":{"message":"Импортировать сегменты"},"Import":{"message":"Импортировать","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Купон активирован!"},"redeemFailed":{"message":"Ключ лицензии недействителен"},"hideUpsells":{"message":"Скрыть опции, недоступные без дополнительной платы"},"hideNewFeatureUpdates":{"message":"Скрыть подсказки о новых функциях"},"redeem":{"message":"Использовать"},"enterLicenseKey":{"message":"Введите лицензионный ключ"},"unsubmittedSegmentCounts":{"message":"Сейчас у вас есть {0} в {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"В настоящее время у вас нет неопубликованных сегментов","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"неопубликованный сегмент","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"неопубликованных сегмент(-а, -ов)","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"видео","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"видео","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Очистить все сегменты","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Вы уверены, что хотите очистить все неопубликованные сегменты?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Показать сегменты","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Скрыть сегменты","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID видео","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Количество сегментов","description":"Header of the unsubmitted segments list"},"actions":{"message":"Действия","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Поделиться ссылкой"},"segmentFetchFailureWarning":{"message":"Внимание: Сервер ещё не прислал существующие сегменты. Для этого видео уже могут быть существующие сегменты, но вы их ещё не получили из-за проблем с сервером."},"allowScrollingToEdit":{"message":"Разрешить прокрутку для редактирования времени"},"NoticeTimeAfterSkip":{"message":"{seconds} с","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Улучшенные названия и значки видео на YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Заменяет сенсационные названия и значки видео на более точные, предложенные сообществом","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Выберите самое точное"},"Original":{"message":"Оригинал"},"OriginalTitle":{"message":"Изначальное название"},"CurrentTime":{"message":"Текущее время"},"resetCustomTitle":{"message":"Сбросить название к изначальному"},"resetIcon":{"message":"Сбросить значок"},"TypeYourOwnTitleHere":{"message":"Введите ваше название здесь"},"VideoNotReady":{"message":"Видео не готово"},"FailedToRender":{"message":"Не удалось отрисовать","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Отсутствует Canvas","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Исключение при отрисовке","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Не удалось загрузить","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Формат названия"},"Disabled":{"message":"Отключено"},"CapitalizeWords":{"message":"Слова с заглавной буквы"},"TitleCase":{"message":"Первая заглавная"},"SentenceCase":{"message":"Как в предложении"},"LowerCase":{"message":"Строчные буквы"},"FirstLetterUppercase":{"message":"Первая буква — заглавная"},"shouldCleanEmojis":{"message":"Убирать эмодзи"},"onlyFormatCustomTitles":{"message":"Форматировать только предложенные названия"},"onlyTitleCaseInEnglish":{"message":"Заглавные буквы для заголовков на языках, отличных от английского"},"onlyTitleCaseInEnglishDescription":{"message":"Определение языка не идеально, некоторые англоязычные названия могут быть неправильно распознаны."},"thumbnailFallbackOption":{"message":"При отсутствии отправленного значка"},"whatThumbnailFallbackOption":{"message":"При выборе случайного кадра будут использоваться данные SponsorBlock для обеспечения того, чтобы кадр был выбран не из рекламного сегмента.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Показать случайный кадр из видео"},"TheOriginalThumbnail":{"message":"Показать оригинальный значок"},"showABlankBox":{"message":"Показать черный экран"},"AutoGenerated":{"message":"Показывать значок, сгенерированный YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Начало"},"Middle":{"message":"Середина"},"keepUnsubmitted":{"message":"Хранить отправленные оценки"},"showLiveCover":{"message":"Показывать аватарку канала на последующих видео","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Никогда не использовать значки, проверенные A/B тестами"},"ignoreAbThumbnailsDescription":{"message":"Владельцы каналов могут запускать тесты на своих видео, при которых YouTube будет показывать разные значки разным пользователям. Эта опция всегда будет использовать первоначальный значок ради сохранения согласованности."},"abThumbnailsWarning":{"message":"Предупреждение: На этом видео проводится A/B тест значка. Это означает, что значок может поменяться. В связи с этим не рекомендуется голосовать за исходный значок."},"whatKeepUnsubmitted":{"message":"Хранить отправленные оценки, чтобы показывались выбранные вами название и значок, а не топ по голосам на сервере."},"keepUnsubmittedInPrivate":{"message":"Хранить отправленные голоса из вкладок инкогнито"},"useThumbnailGenerationService":{"message":"Использовать сервис создания значков"},"titleMaxLines":{"message":"Максимальное количество строк для названий"},"titleMaxLinesDescription":{"message":"Предложенные названия видео будут расположены на этом количестве строк."},"thumbnailSaturationLevel":{"message":"Уровень насыщенности значков"},"whatSaturateThumbnails":{"message":"Сделать значки менее насыщенными, уменьшив их цвет"},"hideDetailsWhileFetching":{"message":"Скрыть сведения до получения"},"hideDetailsWhileFetchingDescription":{"message":"Скрыть оригинальные названия и значки до момента загрузки альтернатив с сервера. Если отключено, сведения будут заменяться по мере их получения, вызывая мерцание."},"ignoreTranslatedTitles":{"message":"Игнорировать автоперевод названий видео","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube иногда автоматически переводит названия на ваш язык. Настройка действительна только при отсутствии предложенных пользователями названий."},"onAllPages":{"message":"На всех страницах","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"На всех страницах, кроме страниц с видео","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Никогда"},"thumbnailGeneratorDescription1":{"message":"Сервис создания значков значительно ускоряет процесс, отправляя анонимный запрос с идентификатором видео на удаленный сервер. После этого значок будет сгенерирован или извлечён из кэша, если он уже был создан."},"thumbnailGeneratorDescription2":{"message":"Если используется на страницах с видео, это потенциально может привести к утечке идентификаторов видео, доступных только по ссылке, на сервер. Установка этого параметра на \"На всех страницах, кроме страниц с видео\" позволит избежать этой проблемы. Другой вариант – разместить собственный сервис создания значков."},"thumbnailGeneratorDescription3":{"message":"Если использование сервиса генерации значков отключено, все запросы будут использовать систему k-анонимности, что затрудняет прогнозирование того, какие видео были извлечены, а так же будет использоваться более медленный сервис генерации значков.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Исходный код сервиса создания значков"},"moreAboutKAnonymity":{"message":"Узнать больше про k-анонимность","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Всегда показывать кнопку \"Показать изначальные сведения\""},"whatAlwaysShowShowOriginalButton":{"message":"Если вы всегда хотите знать, что название или значок изменились, включите эту настройку."},"showOriginalOnHover":{"message":"Переключать между предложенными и оригинальными сведениями при наведении курсора"},"showOriginalOnHoverOfVideo":{"message":"Переключать предложенные и оригинальные сведения по наведению на карточку видео"},"showOriginalOnHoverOfVideoDescription":{"message":"Это отключит предпросмотр видео по наведению"},"showCustomOnHoverIfCasual":{"message":"Показывать предложенное название при наведении, если отображается название обычного режима"},"showIconForFormattedTitles":{"message":"Отображать кнопку \"Показать изначальные сведения\" для автоматически форматированных названий"},"Enable":{"message":"Включить"},"Titles":{"message":"Названия","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Значки","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Голосов в обычном режиме","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Ошибка"},"ShowOriginal":{"message":"Показать изначальные сведения"},"ShowModified":{"message":"Показать изменённые сведения"},"ShowFormatted":{"message":"Показать изменённые сведения"},"FillerWarning":{"message":"Внимание: эта категория - невероятно агрессивная. Вероятно, вам придётся перематывать назад или иногда отключать пропуск полностью. Имейте в виду, что во многих видео пропускается 50% хронометража или больше! Однако помните, что при отправке сегментов всё ещё действуют строгие правила.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Присоединяйтесь к Discord или Matrix, чтобы остаться в этом чате","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Показать помощь по руководству","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Избегайте вычурных выражений лица","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Старайтесь предложить название, отражающее суть всего видео, а не только отвечающее на вопрос из оригинального названия","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Избегайте описания реакций на видео (например, \"шок\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Предоставьте достаточно информации, чтобы пользователь мог сделать информированный выбор"},"tip5":{"message":"Начинать с прописной буквы как предложение ","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Ознакомьтесь с полным руководством перед отправкой","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Порядок заглавных букв в названии соответствует правилам языка","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Предложенное название не является ответом на вопрос из оригинального","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Названия должны описывать видео или историю в целом. Нельзя полагаться только на оригинальное название — необходимо изучить видео целиком, чтобы понять его замысел.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Название не подводит итоги видео и не служит спойлером без крайней необходимости","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Названия не призваны заменять просмотр всего видео, они лишь должны давать понимание, имеет ли смысл открывать видео.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Название не высмеивает и не критикует автора или видео, не оценивает его достоверность","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Подразумевается, что названия составлены от лица автора видео. Оценка и проверка достоверности видео — не задача DeArrow. Названия не должны служить комментариями.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Обнаруженное слово: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Не следует использовать ненужные глаголы в начале названия","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Название должно начинаться с заглавной буквы. Порядок заглавных букв должен соответствовать обычному предложению","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Названия не должны заканчиваться точкой","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Не следует отвечать на вопрос из исходного названия. Названия должны описывать видео или историю в целом","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Названия не должны высмеивать и критиковать автора или видео, не должны оценивать его достоверность","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Названия не должны содержать исходные элементы сенсации","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Названия не должны содержать эмодзи","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Необходимо устранить предупреждение перед отправкой"},"dearrowHelpSponsorBlockImported":{"message":"Примечание: Ваши настройки SponsorBlock были импортированы автоматически!"},"howItWorks":{"message":"Как это работает"},"discordPromotion":{"message":"Принять участие в разработке или предложить новую идею можно в {discord} или {matrix}"},"deArrowDonationText":{"message":"Если вам нравится то, что я сделал, и вы хотите помочь мне материально, вот ссылка"},"termsAgreement":{"message":"Используя это расширение, вы соглашаетесь с {privacy-policy} и {terms}"},"privacyPolicy":{"message":"политикой конфиденциальности"},"termsOfUse":{"message":"условиями использования "},"openSourceLicenses":{"message":"Лицензии исходного кода"},"defaultToOriginals":{"message":"Показывать изначальные сведения о видео"},"whatDefaultToOriginals":{"message":"Показывать по умолчанию изначальные название и значок с возможностью отображения предложенных при наведении на них."},"replaceTitles":{"message":"Заменять названия"},"replaceThumbnails":{"message":"Заменять значки"},"useCrowdsourcedTitles":{"message":"Использовать названия, присланные сообществом"},"whatUseCrowdsourcedTitles":{"message":"Если отключено, названия видео будут форматироваться, но не будут использоваться присланные сообществом названия","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Вы уверены, что хотите удалить эту конфигурацию?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Новая конфигурация"},"DeleteConfiguration":{"message":"Удалить конфигурацию"},"ChannelAllowlist":{"message":"Настройки для отдельных каналов"},"ConfigurationName":{"message":"Название конфигурации"},"ChannelListInstructions":{"message":"Введите в поле ниже с новой строки все каналы, к которым вы хотите применить к эту настройку. Поддерживаются как названия, так и идентификаторы каналов. @Псевдонимы не поддерживаются. Идентификатор канала можно получить, нажав на кнопку «Поделиться каналом» в разделе с его описанием. Чтобы попасть в этот раздел, нажмите на краткое описание на странице канала под его названием.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Конфигурации еще не настроены. Нажмите на кнопку вверху, чтобы добавить новую конфигурацию.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Боритесь с кликбейтом путём замены названий и значков на более корректные."},"DeArrowPromotionMessage2":{"message":"Устали от кликбейта? Попробуйте моё новое расширение, улучшающее названия и значки"},"DeArrowPromotionMessage3":{"message":"Также попробуйте DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Не нравится название? Если вы предпочитаете вариант ниже, попробуйте функцию замены названий в DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"В качестве значка установлен случайный кадр из видео, так как для видео не был предложен значок","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"В качестве значка установлен случайный кадр из видео и автоматически форматированное название, так как для видео не было ничего предложено","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Вы можете изменить значение по умолчанию ниже","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"С момента установки расширения было заменено {titles} названий и {thumbnails} значков","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} название ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} названий ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"и {thumbnails} значок","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"и {thumbnails} значков","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"С момента установки расширения было заменено {titleAndThumbnailMessage}","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Считать количество замен названий и значков"},"countReplacementsDescription":{"message":"Используется для предоставления статистики во всплывающем окне.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Добавить список фильтров yt-neuter для блокировки опросов, карточек с продукцией и прочих рекламных элементов страницы"},"requiresUblock":{"message":"Требуется uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Произошла ошибка при попытке определить ID видео. Пожалуйста, обновите страницу перед отправкой, чтобы убедиться, что оно будет отправлено для нужного видео. Если это происходит часто, пожалуйста, отправьте сообщение об этом через GitHub, Discord или Matrix, дополнительно указав другие ваши расширения или пользовательские скрипты, которые вы установили."},"dearrowLogoCredit":{"message":"Логотип на основе Twemoji с лицензией CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock не совместим с расширением \"Zoom to Fill\". Вы можете использовать другие подобные расширения, они будут работать."},"freeTrialStarted":{"message":"Пробный период начался успешно. Посетите YouTube, чтобы протестировать расширение"},"freeTrialEnded":{"message":"Пробный период закончился"},"freeTrialPrompt":{"message":"Если вы хотите опробовать расширение в течение следующего часа, нажмите на кнопку ниже."},"startFreeTrial":{"message":"Попробовать бесплатно"},"freeAccessRequested":{"message":"Вы успешно зарегистрировались на получение бесплатной лицензии. Вы будете уведомлены, когда она будет предоставлена."},"freeAccessComplete":{"message":"Поздравляем! Теперь у вас есть бесплатный доступ к DeArrow"},"DeArrowNotActivated":{"message":"DeArrow не активировано"},"ActivateDeArrow":{"message":"Активировать DeArrow"},"DeArrowIsActivated":{"message":"DeArrow успешно активировано"},"Close":{"message":"Закрыть"},"ViewLicenseKey":{"message":"Просмотреть лицензионный ключ"},"SharingIsCaring":{"message":"Не жмись - поделись"},"cleanPopup":{"message":"Упрощённый вид всплывающего окна"},"hideSegmentCreationInPopup":{"message":"Скрыть кнопки создания сегмента во всплывающем окне"},"syncDisabledWarning":{"message":"Внимание: В вашем браузере не включено хранилище расширений. При попытке изменить настройки, они не будут сохранены."},"syncDisabledWarningDeArrow":{"message":"DeArrow не может работать без хранилища."},"syncDisabledFirefoxSuggestions":{"message":"Вы можете включить его, перейдя на страницу about:config и установив значение для \"webextensions.storage.sync.enabled\" на true."},"storageFull":{"message":"Хранилище расширения заполнено. Пожалуйста, удалите несколько неотправленных сегментов в настройках."},"previewSegmentRequired":{"message":"Проверьте выделенные сегменты перед отправкой. Это можно сделать при помощи кнопки «Предпросмотр» или по нажатию сочетания клавиш:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Действовать как VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Сегменты, отправленные из вашего браузера, не могут быть приняты, так как YouTube, похоже, начал встраивать в видео рекламу таким образом, что SponsorBlock не может её удалить. Пожалуйста, свяжитесь с нами, если вы получили эту ошибку."},"DeArrowIsDisabled":{"message":"DeArrow отключён - нажмите, чтобы включить","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Вы уверены, что оригинальный значок соответствует правилам DeArrow? Если вы в целом предпочитаете оригинальные значки, можно изменить настройку DeArrow «При отсутствии отправленного значка».","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"SponsorBlock не поддерживает трансляции и недавно записанный контент на YouTube TV. Если это недавняя запись - пожалуйста, подождите несколько часов, пока не станет доступна обработанная версия.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Белый список каналов не поддерживается на tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Нравится оригинальное название?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Да"},"No":{"message":"Нет"},"votes":{"message":"голосов: {0}","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"голосов: {0}","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Забавные","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Креативные","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Хитроумные","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Информативные","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Прочие","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Классический режим","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Заменять названия стандартизированным форматом в соответствии с руководством у всех видео с предложенными названиями."},"CasualMode":{"message":"Обычный режим","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Сохранять забавные или хитроумные оригинальные названия, которые хорошо описывают видео.\nВыберите категории названий для отображения.\nВы сможете голосовать за (не)соответствие названия категории."},"minimumVotes":{"message":"Минимум голосов","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Показать оригинальный значок для видео с голосами обычного режима","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Новая функция: Обычный режим","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Отображать значок обычного режима только при наличии предложенного названия"},"OpenSettings":{"message":"Открыть настройки"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/sk/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/sk/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Spojenie vypršalo. Skontrolujte svoje internetové pripojenie. Ak vám internet funguje, server je pravdepodobne preťažený alebo nefunkčný."},"400":{"message":"Server hlási, že táto požiadavka je neplatná"},"409":{"message":"Tento segment už bol pridaný"},"502":{"message":"Zdá sa, že server je preťažený. Skúste to o pár sekúnd."},"fullName":{"message":"SponsorBlock pre YouTube - Preskočte sponzorstvá","description":"Name of the extension."},"Description":{"message":"Preskoč sponzorstvá, žiadosti o odber atď. v YouTube videách. Nahlás sponzorované segmenty vo videách čo sleduješ a ušetri ostatným čas.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanál pridaný do výnimiek!"},"Segment":{"message":"segment"},"Segments":{"message":"segmentov"},"SegmentsCap":{"message":"Segmenty"},"Chapters":{"message":"Kapitoly"},"renderAsChapters":{"message":"Zobraziť segmenty ako kapitoly","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Zobraziť aktuálny segment vedľa času videa"},"showAutogeneratedChapters":{"message":"Zobraziť kapitoly, ktoré automaticky vytvoril YouTube"},"upvoteButtonInfo":{"message":"Hlasovať pre tento príspevok"},"reportButtonTitle":{"message":"Nahlásiť"},"reportButtonInfo":{"message":"Nahlásiť tento segment ako nesprávny."},"Dismiss":{"message":"Zrušiť"},"Loading":{"message":"Načítavanie..."},"Hide":{"message":"Nikdy nezobrazovať"},"hitGoBack":{"message":"Stlačte Nepreskočiť, aby ste sa vrátili na miesto pred preskočením."},"unskip":{"message":"Nepreskočiť"},"reskip":{"message":"Znovu preskočiť"},"unmute":{"message":"Zrušiť stíšenie"},"paused":{"message":"Pozastavené"},"manualPaused":{"message":"Časovač zastavený"},"confirmMSG":{"message":"Pre úpravu alebo zmazanie viacerých hodnôt kliknite na info tlačidlo alebo otvorte okno rozšírenia kliknutím na ikonu v pravom hornom rohu."},"clearThis":{"message":"Naozaj to chcete vymazať?\n\n"},"Unknown":{"message":"Pri odosielaní segmentu nastala chyba, skúste to prosím neskôr."},"sponsorFound":{"message":"Toto video má segmenty v databáze!"},"sponsor404":{"message":"Nenašli sa žiadne segmenty"},"sponsorStart":{"message":"Začiatok segmentu"},"sponsorEnd":{"message":"Koniec segmentu"},"sponsorCancel":{"message":"Zrušiť vytváranie segmentu"},"noVideoID":{"message":"Nenašlo sa žiadne YouTube video.\nAk je to chyba, obnovte záložku."},"refreshSegments":{"message":"Znova načítať segmenty"},"success":{"message":"Hotovo!"},"voted":{"message":"Zahlasované!"},"serverDown":{"message":"Zdá sa, že server je nedostupný. Okamžite kontaktujte vývojára."},"connectionError":{"message":"Nastala chyba pripojenia. Kód chyby: "},"segmentsStillLoading":{"message":"Segmenty sa ešte nahrávajú..."},"clearTimes":{"message":"Zmazať segmenty"},"openPopup":{"message":"Otvoriť podokno SponsorBlock"},"closePopup":{"message":"Zavrieť okno"},"closeIcon":{"message":"Ikona pre zatvorenie"},"OpenSubmissionMenu":{"message":"Otvoriť menu pre odoslanie segmentu"},"OpenCasualVoteMenu":{"message":"Otvoriť ponuku normálneho režimu"},"sortSegments":{"message":"Triedenie segmentov"},"submitCheck":{"message":"Naozaj to chcete odoslať?"},"whitelistChannel":{"message":"Pridať kanál do výnimiek"},"removeFromWhitelist":{"message":"Odobrať kanál z výnimiek"},"voteOnTime":{"message":"Hlasovať za segment"},"Submissions":{"message":"Segmenty"},"savedPeopleFrom":{"message":"Ušetrili ste ľuďom "},"viewLeaderboard":{"message":"Rebríček"},"recordTimesDescription":{"message":"Odoslať"},"submissionEditHint":{"message":"Úprava sekcií sa objaví po odoslaní","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Tip: V nastaveniach si môžete zmeniť klávesovú skratku pre odoslanie"},"clearTimesButton":{"message":"Vymazať časy"},"Username":{"message":"Používateľské meno"},"setUsername":{"message":"Nastaviť Používateľské meno"},"copyPublicID":{"message":"Skopírovať verejné ID používateľa"},"copySegmentID":{"message":"Skopírovať ID segmentu"},"loopChapter":{"message":"Opakovať kapitolu"},"unloopChapter":{"message":"Zrušiť opakovanie kapitoly"},"hideThis":{"message":"Skryť"},"Options":{"message":"Nastavenia"},"showButtons":{"message":"Zobraziť tlačidlá v YouTube prehrávači"},"hideButtonsDescription":{"message":"Skryje tlačidlá pre preskočenie segmentov, ktoré sa zobrazujú v YouTube prehrávači."},"showSkipButton":{"message":"Zobrazovať tlačidlo preskočiť na hlavný obsah videa"},"showInfoButton":{"message":"Zobraziť info tlačidlo v YouTube prehrávači"},"autoHideInfoButton":{"message":"Automaticky skryť tlačidlo Info"},"showDeleteButton":{"message":"Zobraziť tlačidlo Zmazať v YouTube prehrávači"},"enableViewTracking":{"message":"Zapnúť počítanie preskočení"},"whatViewTracking":{"message":"Sleduje aké segmenty ste preskočili, aby sa ostatní používatelia dozvedeli ako prispeli a pomohli ostatným. Spolu s hlasmi to potom zaistí databázu bez spamu. Rozšírenie odošle správu na server vždy keď preskočíte segment. Dúfame, že si väčšina ľudí toto nastavenie nezmení, aby boli čísla presné. :)"},"enableViewTrackingInPrivate":{"message":"Zapnúť počítanie preskočení v inkognito oknách"},"enableTrackDownvotes":{"message":"Uložiť hlasovania proti"},"whatTrackDownvotes":{"message":"Všetky segmenty, ku ktorým zahlasujete proti, zostanú skryté aj po obnovení stránky"},"trackDownvotesWarning":{"message":"Varovanie: Vypnutím tohoto nastavenia sa zmažú všetky predtým uložené hlasovania proti"},"enableTrackDownvotesInPrivate":{"message":"Uloží hlasovania proti zo súkromných/inkognito záložiek"},"enableQueryByHashPrefix":{"message":"Dopyt podľa hash prefixu"},"whatQueryByHashPrefix":{"message":"Namiesto dopytovania segmentov zo servera podľa videoID sa použijú prvé 4 znaky hashu videoID. Server odošle späť dáta za všetky videá s podobným hashom."},"enableShowCategoryWithoutPermission":{"message":"Zobraziť kategórie v odosielacom menu aj bez oprávnenia na odosielanie"},"whatShowCategoryWithoutPermission":{"message":"Niektoré kategórie vyžadujú oprávnenie na odoslanie kvôli požiadavke na minimálnu reputáciu"},"showNotice":{"message":"Znovu zobraziť upozornenie"},"showSkipNotice":{"message":"Zobraziť upozornenie pri preskočení segmentu"},"showUpcomingNotice":{"message":"Upozorniť pred začatím segmentu"},"showCategoryGuidelines":{"message":"Zobraziť pomocníka ku kategórii"},"noticeVisibilityMode0":{"message":"Veľké upozornenia o preskočení"},"noticeVisibilityMode1":{"message":"Malé upozornenia o automatickom preskočení"},"noticeVisibilityMode2":{"message":"Malé upozornenia o všetkých preskočeniach"},"noticeVisibilityMode3":{"message":"Priehľadné upozornenia o automatickom preskočení"},"noticeVisibilityMode4":{"message":"Priehľadné upozornenia o všetkých preskočeniach"},"longDescription":{"message":"SponsorBlock umožňuje preskočiť sponzorov, úvodné časti, záverečné časti, pripomienky na odber, nehudobné časti videoklipov alebo iné otravné časti YouTube videí. SponsorBlock je crowdsourceové rozšírenie prehliadača, pomocou ktorého môže ktokoľvek označiť začiatok a koniec takéhoto segmentu. Po odoslaní potom všetci ostatní s týmto rozšírením tieto segmenty automaticky preskočia.","description":"Full description of the extension on the store pages."},"website":{"message":"Webstránka","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Zdrojový kód","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Upozornienie bolo aktualizované!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Ak sa vám to stále nepáčí, stlačte tlačidlo Nikdy nezobrazovať.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Preskočiť segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Segment štart/stop","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Otvoriť menu pre odoslanie segmentov","description":"Keybind label"},"setSubmitKeybind":{"message":"Odoslať segmenty","description":"Keybind label"},"setPreviewKeybind":{"message":"Náhľad segmentu","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Zatvoriť oznámenie o preskočení segmentov","description":"Keybind label"},"setDownvoteKeybind":{"message":"Hlasovať proti segmentu","description":"Keybind label"},"setUpvoteKeybind":{"message":"Hlasovať za segment","description":"Keybind label"},"nextChapterKeybind":{"message":"Ďalšia kapitola","description":"Keybind label"},"previousChapterKeybind":{"message":"Predošlá kapitola","description":"Keybind label"},"enableDeArrowKey":{"message":"Prepínač DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Otvoriť menu pre odoslanie segmentov","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Vyberte kláves jeho zadaním a vyberte všetky modifikačné klávesy, ktoré chcete použiť."},"disableSkipping":{"message":"Preskakovanie je zapnuté"},"enableSkipping":{"message":"Preskakovanie je vypnuté"},"yourWork":{"message":"Vaša Práca","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Kód chyby: "},"skip":{"message":"Preskočiť"},"mute":{"message":"Stíšiť"},"full":{"message":"Celé video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Preskočiť {0}?"},"mute_category":{"message":"Stíšiť {0}?"},"skip_to_category":{"message":"Preskočiť na {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Nasleduje {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} preskočené","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} stíšený","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Preskočené na {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Hlasované za {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Zakázať Automatické Preskočenie"},"enableAutoSkip":{"message":"Povoliť Automatické Preskočenie"},"audioNotification":{"message":"Zvuková notifikácia pri preskočení"},"audioNotificationDescription":{"message":"Zvuková notifikácia pri preskočení prehrá zvuk vždy, keď dôjde k preskočeniu segmentu. Ak je vypnutá (alebo je vypnuté automatické preskakovanie), neprehraje sa žiadny zvuk."},"showTimeWithSkips":{"message":"Zobraziť čas bez preskočených segmentov"},"showTimeWithSkipsDescription":{"message":"Tento čas sa zobrazuje vedľa času v zátvorkách pod časovou lištou. Je to celkový čas videa mínus všetky segmenty, a to aj vrátane segmentov, ktoré sa len zobrazujú v lište."},"youHaveSkipped":{"message":"Preskočili ste "},"minLower":{"message":"minúta"},"minsLower":{"message":"minút"},"hourLower":{"message":"hodina"},"hoursLower":{"message":"hodiny"},"youHaveSavedTime":{"message":"Ostatným ste ušetrili","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" z ich života","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Stav servera skontrolujete na status.sponsor.ajay.app."},"changeUserID":{"message":"Import/export vášho súkromného ID používateľa"},"whatChangeUserID":{"message":"Toto si starostlivo uchovajte. Podobne ako heslo by ste to nemali s nikým zdieľať. Ak by to získal niekto ďalší, mohol by vám uškodiť. Ak hľadáte vaše verejné ID používateľa, stlačte ikonu schránky v podokne."},"setUserID":{"message":"Nastavenie súkromného identifikátora používateľa"},"userIDChangeWarning":{"message":"Varovanie: Zmena súkromného ID používateľa je trvalá. Ste si istí, že to chcete urobiť? Pre istotu si zálohujte svoje staré."},"createdBy":{"message":"Vytvoril"},"supportOtherSites":{"message":"Podpora alternatívnych Youtube webov"},"supportOtherSitesDescription":{"message":"Podpora Youtube aplikácií tretích strán. Pre jej zapnutie musíte odsúhlasiť zvláštne oprávnenia.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Podporované weby: "},"optionsInfo":{"message":"Zapnúť podporu Invidious, vypnúť automatické preskočenie, skryť tlačidlá a iné."},"addInvidiousInstance":{"message":"Pridať inštanciu alternatívneho klienta"},"addInvidiousInstanceDescription":{"message":"Pridať vlastnú inštanciu. Musí byť vo formáte len doména. Napr. invidious.ajay.app"},"add":{"message":"Pridať"},"addInvidiousInstanceError":{"message":"Neplatná doména. Tu musí byť len doménová časť. Napr. invidious.ajay.app"},"resetInvidiousInstance":{"message":"Obnoviť zoznam inštancií Invidious"},"resetInvidiousInstanceAlert":{"message":"Chystáte sa obnoviť zoznam inštancií Invidious"},"invidiousDisabledSafari":{"message":"Podpora Invidious momentálne nie je dostupná v prehliadači Safari kvôli chybe v prehliadači. Akonáhle Apple chybu opraví, funkcia bude pridaná späť."},"currentInstances":{"message":"Aktuálne inštancie:"},"minDuration":{"message":"Minimálna dĺžka (v sekundách):"},"minDurationDescription":{"message":"Segmenty kratšie ako nastavená hodnota nebudú preskočené ani zobrazené v prehrávači."},"enableManualSkipOnFullVideo":{"message":"Používanie manuálneho preskočenia, ak existuje úplný štítok videa"},"whatManualSkipOnFullVideo":{"message":"Pre ľudí, ktorí chcú sledovať video bez prerušenia, ak je plne sponzorované alebo ide o vlastnú propagáciu."},"skipNoticeDuration":{"message":"Trvanie oznámenia o preskočení (v sekundách):"},"skipNoticeDurationDescription":{"message":"Oznámenie o preskočení zostane minimálne takto dlho zobrazené. Pri manuálnom preskočení to môže byť aj dlhšie."},"shortCheck":{"message":"Segment je kratší ako vami nastavená minimálna dĺžka. Možno už bol niekým odoslaný a kvôli tomuto nastaveniu je teraz ignorovaný. Naozaj ho chcete odoslať?"},"liveOrPremiere":{"message":"Vytváranie segmentov v aktívnom živom prenose alebo premiére nie je dovolené. Počkajte prosím na jeho ukončenie, potom obnovte stránku a skontrolujte, či sú segmenty správne vytvorené."},"showUploadButton":{"message":"Ukázať Nahrávacie Tlačidlo"},"customServerAddress":{"message":"Adresa serveru SponsorBlock"},"customServerAddressDescription":{"message":"Adresa, ktorú používa SponsorBlock pre komunikáciu so serverom.\nAk nemáte vlastný server, tak to nemeňte."},"dataFetchingServerAddress":{"message":"Adresa servera pre načítavanie dát"},"dataFetchingServerAddressDescription":{"message":"Adresa servera, z ktorého sa načítavajú dáta.\nNemeňte ak nemáte svoju vlastnú serverovú inštanciu."},"thumbnailCacheServerAddress":{"message":"Adresa servera pre cache náhľadov"},"save":{"message":"Uložiť"},"reset":{"message":"Vynulovať"},"customAddressError":{"message":"Táto adresa nie je platná. Musí začínať http:// alebo https:// a končiť bez lomky."},"areYouSureReset":{"message":"Naozaj to chcete obnoviť?"},"mobileUpdateInfo":{"message":"už je podporované aj m.youtube.com"},"exportOptions":{"message":"Import/export všetkých nastavení"},"exportOtherData":{"message":"Import/export všetkých ostatných dát"},"exportOptionsCopy":{"message":"Upraviť/kopírovať"},"exportOptionsDownload":{"message":"Uložiť do súboru"},"exportOptionsUpload":{"message":"Načítanie do súboru"},"whatExportOptions":{"message":"Toto je celá vaša konfigurácia vo formáte JSON. Zahŕňa vaše súkromné ID používateľa, preto ho nezabudnite rozumne zdieľať."},"setOptions":{"message":"Nastaviť Nastavenia"},"exportOptionsWarning":{"message":"Varovanie: zmena nastavení je nezvratná a môže poškodiť inštaláciu. Naozaj to chcete spraviť? Pre istotu si staré nastavenia zazálohujte."},"incorrectlyFormattedOptions":{"message":"Tento JSON súbor nemá správny formát. Nastavenia neboli zmenené."},"confirmNoticeTitle":{"message":"Odoslať segment"},"submit":{"message":"Poslať"},"cancel":{"message":"Zrušiť"},"delete":{"message":"Odstrániť"},"preview":{"message":"Ukážka"},"unsubmitted":{"message":"Neodoslané"},"inspect":{"message":"Kontrola"},"edit":{"message":"Upraviť"},"copyDebugLogs":{"message":"Skopírovať debug logy"},"copyDebugInformation":{"message":"Skopírovať debug informácie do schránky"},"copyDebugInformationFailed":{"message":"Nepodarilo sa skopírovať debug informácie"},"copyDebugInformationOptions":{"message":"Skopíruje informácie do schránky, ktoré môžu byť poskytnuté vývojárovi ako pomoc pri hľadaní chyby / keď si to vývojár požiada. Citlivé informácie ako vaše používateľské ID, kanály vo whiteliste, a vlastné adresy serverov poskytnuté nebudú. Avšak, budu poskytnuté informácie ako Váš useragent, prehliadač, operačný systém, a verzia rozšírenia."},"copyDebugInformationComplete":{"message":"Debug informácie boli skopírované do schránky. Ak chcete, môžete odstrániť akékoľvek informácie, ktoré nechcete zdieľať. Uložte si ich do textového súboru alebo ich vložte do nahlásenia chyby."},"keyAlreadyUsed":{"message":"Táto skratka je viazaná na inú akciu. Vyberte inú."},"to":{"message":"do","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Skopírované!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Zahŕňa plynulé prechody"},"generic_guideline2":{"message":"Prehrať tak, ako keby nebolo nič preskočené"},"category_sponsor":{"message":"Sponzor"},"category_sponsor_description":{"message":"Platená propagácia, platené odporúčania a priame reklamy. Neplatí pre vlastnú propagáciu alebo neplatenú propagáciu dobročinností/tvorcov/webových stránok/produktov, ktoré sa im páčia."},"category_sponsor_guideline1":{"message":"Platené promo"},"category_sponsor_guideline2":{"message":"Nie pre dary a vlastný merch"},"category_selfpromo":{"message":"Neplatená/Vlastná propagácia"},"category_selfpromo_description":{"message":"Podobné ako sponzor, okrem neplatenej alebo vlastnej propagácie. Patria sem sekcie týkajúce sa merchu, donatov alebo informácií o tom, s kým spolupracovali."},"category_selfpromo_guideline1":{"message":"Dary, členstvo a vlastný merch"},"category_selfpromo_guideline2":{"message":"Obsah mimo témy, ktorý nepridáva žiadne informácie"},"category_selfpromo_guideline3":{"message":"Nie pre firemne navrhnuté produkty a merch"},"category_exclusive_access":{"message":"Exkluzívny Prístup"},"category_exclusive_access_description":{"message":"Iba pre označovanie celých videí. Používa sa, keď video predstavuje produkt, službu alebo miesto, ku ktorým získali bezplatný alebo dotovaný prístup."},"category_exclusive_access_pill":{"message":"Toto video predstavuje produkt, službu alebo miesto, ku ktorým získali bezplatný alebo dotovaný prístup","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Celé video predstavuje niečo, kde sa dá získať voľný alebo zľavnený prístup"},"category_interaction":{"message":"Pripomienka interakcie (Prihlásiť sa na odber)"},"category_interaction_description":{"message":"Krátka výzva dať like, prihlásiť sa na odber alebo sledovať ich v strede obsahu. Ak je to dlhé alebo sa týka niečoho konkrétneho, malo by to radšej byť v ramci vlastnej propagácie."},"category_interaction_guideline1":{"message":"Krátke pripomienky na \"Páči sa mi to\", Odber a Sledovanie"},"category_interaction_guideline2":{"message":"Zahŕňa nepriame pripomienky na komentovanie"},"category_interaction_guideline3":{"message":"Nie pre všeobecné promo, iba výzvy k akcii"},"category_interaction_short":{"message":"Pripomienka interakcie"},"category_intro":{"message":"Prerušenie/Úvodná animácia"},"category_intro_description":{"message":"Interval bez obsahu. Môže to byť pauza, statický obraz, opakujúca sa animácia. Toto by nemalo byť použité pre prechody obsahujúce informácie."},"category_intro_short":{"message":"Prerušenie"},"category_intro_guideline1":{"message":"Interval bez samotného obsahu"},"category_intro_guideline2":{"message":"Nie pre prechody bez informácie"},"category_outro":{"message":"Koncové karty / titulky"},"category_outro_description":{"message":"Kredity alebo keď sa zobrazia YouTube koncové karty. Neplatí pre zhrnutia s informáciami."},"category_outro_guideline1":{"message":"Nezahrňte obsah, aj keby už boli vidieť koncové karty"},"category_preview_description":{"message":"Zbierka klipov, ktoré ukazujú, čo nasleduje v tomto alebo ďalších videách zo série, kde sa potom všetky informácie opakujú."},"category_preview_guideline1":{"message":"Ukážky, ktoré sa zobrazia neskôr alebo v budúcom videu"},"category_preview_guideline2":{"message":"Zhrnutie predošlého videa"},"category_preview_guideline3":{"message":"Nie pre sekcie, ktoré majú dodatočný obsah"},"category_filler":{"message":"Mimo tému/vtipy"},"category_filler_description":{"message":"Vedľajšie scény alebo vtipy, ktoré nie sú potrebné na pochopenie hlavného obsahu videa. Kategória by nemala zahŕňať segmenty poskytujúce podrobnosti o kontexte alebo pozadí. Ide o veľmi agresívnu kategóriu určenú na to, keď nemáte náladu na „zábavu“."},"category_filler_short":{"message":"Mimo tému"},"category_filler_guideline1":{"message":"Scény mimo tému alebo vtipy"},"category_filler_guideline2":{"message":"Nepodarené a opakované zábery"},"category_filler_guideline3":{"message":"Nie pre scény vyžadované pre pochopenie témy"},"category_music_offtopic":{"message":"Hudba: časť bez hudby"},"category_music_offtopic_description":{"message":"Len pre hudobné videá. Použite len ak segment nie je možné zaradiť do inej kategórie."},"category_music_offtopic_short":{"message":"Bez hudby"},"category_music_offtopic_guideline1":{"message":"Sekcie, ktoré nie sú v oficiálnom vydaní"},"category_music_offtopic_guideline2":{"message":"Sekcia bez hudby v živom vystúpení"},"category_poi_highlight":{"message":"Hlavný obsah videa"},"category_poi_highlight_description":{"message":"Tá časť videa, ktorú ľudia vyhľadávajú. Podobné komentárom \"Video začína v čase x\"."},"category_poi_highlight_guideline1":{"message":"Sekcia, ktorú vyhľadáva väčšina ľudí"},"category_poi_highlight_guideline2":{"message":"Môže pomôcť preskočiť predošlý obsah"},"category_poi_highlight_guideline3":{"message":"Môže preskočiť na hlavný obsah alebo náhľad"},"category_chapter":{"message":"Kapitola"},"category_chapter_description":{"message":"Vlastné pomenovania kapitol opisujúce hlavné sekcie videa."},"category_chapter_guideline1":{"message":"Nezmieňovať sponzorove značky"},"category_chapter_guideline2":{"message":"Použiť veľké kapitoly pre všeobecné sekcie"},"category_chapter_guideline3":{"message":"Menšie kapitoly môžu byť umiestnené vo väčších"},"category_livestream_messages":{"message":"Živé vysielanie: oznamy a dary"},"category_livestream_messages_short":{"message":"Oznamy"},"autoSkip":{"message":"Automatické Preskočenie"},"manualSkip":{"message":"Manuálne Preskočenie"},"showOverlay":{"message":"Zobraziť v časovej lište"},"disable":{"message":"Zakázať"},"autoSkip_POI":{"message":"Automaticky preskočiť na začiatok"},"manualSkip_POI":{"message":"Opýtať sa, keď sa video nahraje"},"showOverlay_POI":{"message":"Zobraziť v časovej lište"},"showOverlay_full":{"message":"Ukázať Označenie"},"showOverlay_chapter":{"message":"Zobraziť kapitoly"},"autoSkipOnMusicVideos":{"message":"Automaticky preskočiť všetky segmenty ak neexistuje segment bez hudby"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Automaticky preskočiť len na music.youtube.com"},"muteSegments":{"message":"Povoliť segmenty, ktoré namiesto preskočenia stíšía zvuk"},"fullVideoSegments":{"message":"Zobraziť ikonu, ak je celé video reklama","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Zobraziť označenia aj na miniatúrach videí","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Neodoslaná farba","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Farba časovej lišty"},"category":{"message":"Kategória"},"skipOption":{"message":"Možnosti preskočenia","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Otvoriť pokročilé možnosti preskočenia"},"advancedSkipNotSaved":{"message":"Syntaktická chyba: Vaše možnosti neboli uložené"},"advancedSkipSettingsHelp":{"message":"Ako to funguje","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Povoliť beta-test server"},"whatEnableTestingServer":{"message":"Vaše segmenty a hlasy NEBUDÚ ZAPOČÍTANÉ na hlavnom serveri. Slúži iba na testovanie."},"testingServerWarning":{"message":"Všetky segmenty a hlasy NEBUDÚ ZAPOČÍTANÉ na hlavnom serveri počas pripojenia na beta server. Nezabudnite si toto vypnúť ak chcete spraviť reálne segmenty."},"bracketNow":{"message":"(Teraz)"},"moreCategories":{"message":"Viac Kategórií"},"chooseACategory":{"message":"Vyberte kategóriu"},"enableThisCategoryFirst":{"message":"Pre odoslanie segmentov z kategórie \"{0}\" ju musíte zapnúť v nastaveniach. Teraz tam budete presmerovaní.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Varovanie: Tento typ segmentu môže byť aktívny len jeden. Odoslanie viacerých spôsobí zobrazenie náhodného z nich."},"youMustSelectACategory":{"message":"Musíte zvoliť kategóriu pre každý segment!"},"bracketStart":{"message":"(Začiatok)"},"bracketEnd":{"message":"(Koniec)"},"End":{"message":"Koniec","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"skryté: negatívne hlasy"},"hiddenDueToDuration":{"message":"skryté: príliš krátke"},"manuallyHidden":{"message":"ručne skryté"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID kanála sa ešte nenačítalo. Ak pozeráte video vložené na stránke, skúste ísť radšej priamo na YouTube. Problém mohli spôsobiť zmeny na YouTube. Ak je tomu tak, zanechajte komentár:"},"invidiousPermissionRefresh":{"message":"Prehliadač odmietol oprávnenia potrebné pre Invidious a iné stránky 3. strany. Pre opätovnú aktiváciu oprávnení kliknite na tlačidlo nižšie."},"acceptPermission":{"message":"Povoľte oprávnenie"},"permissionRequestSuccess":{"message":"Oprávnenie bolo úspešne povolené!"},"permissionRequestFailed":{"message":"Povolenie oprávnenia zlyhalo, stlačili ste odmietnuť?"},"adblockerIssueWhitelist":{"message":"Ak to neviete vyriešiť, vypnite nastavenie \"Vynútiť kontrolu kanála pred preskočením\", lebo SponsorBlock nevie zistiť informácie o kanále tohto videa"},"forceChannelCheck":{"message":"Vynútiť kontrolu kanála pred preskočením"},"whatForceChannelCheck":{"message":"V predvolenom nastavení sa preskočia segmenty hneď bez kontroly kanálu. V predvolenom nastavení môžu byť niektoré segmenty na začiatku videa na kanáloch pridaných na whitelist preskočené. Povolením tejto možnosti tomu zabránite, ale všetky preskakovania budú mať mierne oneskorenie, pretože získanie ID kanála môže chvíľu trvať. Toto oneskorenie nemusí byť viditeľné, ak máte rýchly internet."},"forceChannelCheckPopup":{"message":"Zvážte povolenie \"Vynútiť kontrolu kanála pred preskočením\""},"downvoteDescription":{"message":"Nesprávne/Zlé načasovanie"},"incorrectVote":{"message":"Nesprávne"},"harmfulVote":{"message":"Škodlivé","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Zmeniť kategóriu"},"nonMusicCategoryOnMusic":{"message":"Toto video je kategorizované ako hudobné. Ste si istý, že obsahuje sponzora? Ak sa skutočne jedná o časť bez hudby, otvorte možnosti rozšírenia a povoľte túto kategóriu. Potom môžete tento segment uložiť ako kategóriu \"Bez hudby\" namiesto sponzora. Ak si neviete rady, tak si prosím prečítajte pravidlá."},"multipleSegments":{"message":"Viac segmentov"},"guidelines":{"message":"Pravidlá"},"readTheGuidelines":{"message":"Prečítajte si pravidlá!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategórie sú tu!"},"categoryUpdate2":{"message":"Otvorte nastavenia pre preskočenie úvodov, záverov, podpory reklamných predmetov, atď."},"help":{"message":"Pomocník"},"GotIt":{"message":"Rozumiem","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Tento segment je dlhý. Ak je celé video o jednej téme, zmeňte \"Preskočiť\" na \"Celé video\". Pre ďalšie informácie si pozrite pravidlá."},"categoryPillTitleText":{"message":"Celé video je označené touto kategóriou a je príliš previazané, aby sa to dalo rozlíšiť"},"chapterNameTooltipWarning":{"message":"Jedna z vašich kapitol sa volá podobne ako kategória. Ak je to možné, použite radšej kategóriu."},"experiementOptOut":{"message":"Odmietnuť všetky budúce experimenty","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Navždy skryť"},"warningChatInfo":{"message":"Zaznamenali sme, že ste urobili obvyklú chybu. Vážime si vašej práce, ale ide nám o presnosť, takže aj na malých chybách záleží."},"questionButton":{"message":"Mám otázku"},"askAQuestion":{"message":"Položiť otázku"},"warningConfirmButton":{"message":"Rozumiem dôvodu"},"warningError":{"message":"Chyba pri pokuse o súhlas s upozornením:"},"deArrowMessageRecieved":{"message":"Dostali ste radu od moderátora"},"Donate":{"message":"Prispieť"},"considerDonating":{"message":"Zvážte darovanie"},"supportSponsorBlock":{"message":"Podporte moju prácu na plný úväzok na SponsorBlocku"},"hideDonationLink":{"message":"Skryť možnosti prispenia"},"darkModeOptionsPage":{"message":"Tmavý režim na stránke s možnosťami"},"helpPageThanksForInstalling":{"message":"Ďakujeme za inštaláciu SponsorBlock-u."},"helpPageReviewOptions":{"message":"Skontrolujte prosím možnosti nižšie"},"helpPageFeatureDisclaimer":{"message":"Veľa funkcií je vo východiskovom stave vypnutých. Ak chcete preskakovať úvody, závery, používať Invidious apod., zapnite ich nižšie. Taktiež môžete zobraziť alebo skryť niektoré ovládacie prvky."},"helpPageHowSkippingWorks":{"message":"Ako to funguje"},"helpPageHowSkippingWorks1":{"message":"Všetky sponzorské segmenty pridávajú používatelia ako vy. Zoznam segmentov v databáze si môžete zobraziť otvorením vyskakovacieho okna v pravom hornom rohu vášho prehliadača."},"helpPageHowSkippingWorks2":{"message":"Vždy keď preskočíte segment, tak dostanete oznam. Ak sa vám nepozdáva načasovanie, môžete o tom zahlasovať palcom dole! Zahlasovať tiež môžete vo vyskakovacom okne."},"Submitting":{"message":"Odosielam"},"helpPageSubmitting1":{"message":"Segment môžete pridať kliknutím na logo SponsorBlocku v prehrávači videa."},"helpPageSubmitting2":{"message":"Kliknutím na tlačidlo prehrávania označíte začiatok segmentu. Kliknutím na tlačidlo zastavenia označíte jeho koniec. Kliknutím na tlačidlo so šípkou nahor otvoríte ponuku odoslania, kde si môžete svoje segmenty skontrolovať pomocou náhľadu a upraviť ich, aby boli čo najlepšie. Presnosť je dôležitá, preto si pred odoslaním nezabudnite prečítať pokyny."},"helpPageCopyOfDatabase":{"message":"Kam sa segmenty odosielajú?"},"helpPageCopyOfDatabase1":{"message":"Všetky segmenty sa odosielajú do databázy SponsorBlock, ktorú môže ktokoľvek používať a je verejne dostupná na adrese"},"helpPageCopyOfDatabase2":{"message":"Zdrojový kód je voľne dostupný. Takže aj keby sa mi niečo stalo, vaše príspevky sa nestratia."},"AdviceForSubmitting":{"message":"Rady pre odosielanie"},"Credits":{"message":"Autori"},"LearnMore":{"message":"Zistiť viac"},"FullDetails":{"message":"Úplné podrobnosti"},"CopyDownvoteButtonInfo":{"message":"Dá palec dole a vytvorí kópiu, aby ste mohli segment znova odoslať"},"OpenCategoryWikiPage":{"message":"Otvoriť wiki stránku tejto kategórie."},"CopyAndDownvote":{"message":"Skopírovať a dať palec dole"},"ContinueVoting":{"message":"Pokračovať v hlasovaní"},"ChangeCategoryTooltip":{"message":"Týmto ihneď vykonáte zmeny v segmentoch"},"downvote":{"message":"Hlasovať proti"},"upvote":{"message":"Hlasovať za"},"hideSegment":{"message":"Skryť segment"},"skipSegment":{"message":"Preskočiť segment"},"playChapter":{"message":"Prehrať kapitolu"},"SponsorTimeEditScrollNewFeature":{"message":"Čas môžete rýchlo zmeniť kolieskom myši, ak je kurzor nad zadávacím políčkom. Pre jemné zmeny pritom držte kláves ctrl alebo shift."},"categoryPillNewFeature":{"message":"Nové! Zistite, kedy je video kompletne sponzorované alebo vlastná propagácia"},"yearAbbreviation":{"message":"r.","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Správanie","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Rozhranie","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Klávesové skratky","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Zálohovanie/obnova","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Rôzne","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Preskočiť vzhľad oznámenia","description":"Option label"},"unbind":{"message":"Zrušenie väzby","description":"Unbind keyboard shortcut"},"notSet":{"message":"Nie je nastavené"},"change":{"message":"Zmena"},"youtubeKeybindWarning":{"message":"Toto je zabudovaná skratka YouTube. Ste si istí, že ju chcete použiť?"},"betaServerWarning":{"message":"Je zapnutý BETA server!"},"openOptionsPage":{"message":"Otvoriť stránku s nastaveniami"},"resetToDefault":{"message":"Obnovenie predvolených nastavení"},"confirmResetToDefault":{"message":"Ste si istí, že chcete obnoviť všetky nastavenia na predvolené hodnoty? To sa nedá vrátiť späť."},"exportSegments":{"message":"Exportovať segmenty"},"importSegments":{"message":"Import segmentov"},"Import":{"message":"Import","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Prijatie úspešné!"},"redeemFailed":{"message":"Licenčný kľúč nie je platný"},"hideUpsells":{"message":"Skryť platené nastavenia"},"hideNewFeatureUpdates":{"message":"Skryť upozornenia na nové funkcie"},"redeem":{"message":"Uplatniť"},"enterLicenseKey":{"message":"Zadajte licenčný kľúč"},"unsubmittedSegmentCounts":{"message":"V súčasnosti máte {0} na {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"V súčasnosti nemáte žiadne neodoslané segmenty","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"neodoslaný segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"nezaslané segmenty","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"v","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Vymazať všetky segmenty","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Ste si istí, že chcete vymazať všetky neodoslané segmenty?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Zobraziť segmenty","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Skryť segmenty","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID videa","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Počet segmentov","description":"Header of the unsubmitted segments list"},"actions":{"message":"Akcie","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Zdieľať URL"},"segmentFetchFailureWarning":{"message":"Varovanie: Server zatiaľ neodpovedal so segmentmi. V tomto videu sa už môžu nachádzať odoslané segmenty, ale kvôli chybe na serveri ste ich neobdržali."},"allowScrollingToEdit":{"message":"Povoliť skrolovanie k časom úprav"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Lepšie názvy a miniatúry na YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Crowdsourcing názvov a miniatúr tak, aby boli opisné a nie senzačné","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Vyberte najvhodnejší opis"},"Original":{"message":"Originál"},"OriginalTitle":{"message":"Pôvodný názov"},"CurrentTime":{"message":"Aktuálny čas"},"resetCustomTitle":{"message":"Vrátiť späť pôvodný názov"},"resetIcon":{"message":"Reset ikona"},"TypeYourOwnTitleHere":{"message":"Sem napíšte váš názov"},"VideoNotReady":{"message":"Video nie je pripravené"},"FailedToRender":{"message":"Nepodarilo sa zobraziť","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Chýba okno pre zobrazenie náhľadu","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Chyba počas vykresľovania","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Nahrávanie neúspešné","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Formát názvu"},"Disabled":{"message":"Zakázané"},"CapitalizeWords":{"message":"Prvé Písmená Veľké"},"TitleCase":{"message":"Prvé písmená slov veľké"},"SentenceCase":{"message":"Prvé písmeno vety veľké"},"LowerCase":{"message":"Malé písmená"},"FirstLetterUppercase":{"message":"Prvé Písmená Veľké"},"shouldCleanEmojis":{"message":"Odstrániť emoji"},"onlyFormatCustomTitles":{"message":"Naformátovať len názvy odoslané používateľmi"},"onlyTitleCaseInEnglish":{"message":"Zobraziť názvy v inom ako anglickom jazyku s veľkými počiatočnými písmenami"},"onlyTitleCaseInEnglishDescription":{"message":"Rozpoznanie jazyka nie je dokonalé, a môže sa teda stať, že anglické názvy bude považovať za názvy v inom jazyku."},"thumbnailFallbackOption":{"message":"Ak neexistuje nahratý náhľad"},"whatThumbnailFallbackOption":{"message":"Pri výbere náhodného času použije dáta SponsorBlock pre zaručenie, že nebude vybraný čas v reklamnom segmente.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Zobraziť screenshot z náhodného času"},"TheOriginalThumbnail":{"message":"Zobraziť pôvodnú miniatúru"},"showABlankBox":{"message":"Zobraziť prázdny box"},"AutoGenerated":{"message":"Zobraziť náhľad, ktorý automaticky vytvoril YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Začiatok"},"Middle":{"message":"Stred"},"keepUnsubmitted":{"message":"Uložiť odoslané hlasy"},"showLiveCover":{"message":"Zobraziť ikonu kanálu nasledujúceho videa","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Nepoužívať náhľady A/B testovania"},"ignoreAbThumbnailsDescription":{"message":"Kanály môžu pre videá používať test, pri ktorom sa každému používateľovi zobrazí iný náhľad. Toto nastavanie zobrazí vždy prvý náhľad."},"abThumbnailsWarning":{"message":"Varovanie: Toto video používa náhľady A/B testovania. Znamená to, že sa môžu meniť. Asi by ste kvôli tomu nemali hlasovať za pôvodný náhľad."},"whatKeepUnsubmitted":{"message":"Po hlasovaní ponechajte odoslané hlasy, aby sa namiesto najlepšie hodnotených titulov na serveri zobrazovali tituly a náhľady, ktoré ste vybrali."},"keepUnsubmittedInPrivate":{"message":"Ukladať odoslané hlasy z anonymných kariet"},"useThumbnailGenerationService":{"message":"Použiť službu generovania miniatúr"},"titleMaxLines":{"message":"Maximálny počet riadkov pre názov"},"titleMaxLinesDescription":{"message":"V odporúčaniach budú názvy videí zobrazené na daný počet riadkov."},"thumbnailSaturationLevel":{"message":"Úroveň sýtosti náhľadov"},"whatSaturateThumbnails":{"message":"Zmenšiť výraznosť náhľadov znížením ich farby"},"hideDetailsWhileFetching":{"message":"Skryť podrobnosti počas načítavania"},"hideDetailsWhileFetchingDescription":{"message":"Skryť názvy a náhľady pri načítavaní dát zo servera. Ak je táto funkcia zakázaná, pri zmene názvov a náhľadov uvidíte blikanie."},"ignoreTranslatedTitles":{"message":"Nezobrazovať preložené názvy","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube niekedy automaticky preloží názvy do vášho jazyka. Toto nastavenie sa použije iba ak nie je dostupný názov z crowdsourcingu."},"onAllPages":{"message":"Na všetkých stránkach","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Na všetkých stránkach okrem stránky s videom","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Nikdy"},"thumbnailGeneratorDescription1":{"message":"Služba generovania miniatúr výrazne urýchľuje generovanie miniatúr odoslaním anonymnej požiadavky s ID videa na server. Miniatúra sa potom buď vygeneruje, alebo stiahne z vyrovnávacej pamäte, ak už bola vygenerovaná."},"thumbnailGeneratorDescription2":{"message":"Pri použití na stránkach s videom by mohlo dôjsť k úniku nezaradených ID videí na tento server. Nastavením tejto možnosti na „Na všetkých stránkach okrem stránok videí‘ sa tomuto problému vyhnete. Ďalšou možnosťou je hosťovať vlastnú službu generovania miniatúr."},"thumbnailGeneratorDescription3":{"message":"Ak je používanie služby generovania miniatúr zakázané, všetky požiadavky budú používať systém k-anonymných dopytov, čo sťažuje serveru predvídať, ktoré videá boli načítané, a bude použitá pomalšia miestna služba generovania miniatúr.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Zdrojový kód služby pre generovanie miniatúr"},"moreAboutKAnonymity":{"message":"Viac informácií o K-Anonymite","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Vždy zobrazovať tlačidlo „Zobraziť originál\""},"whatAlwaysShowShowOriginalButton":{"message":"Ak chcete vždy vedieť, či sa názov/miniatúra zmenila, zapnite si túto funkciu."},"showOriginalOnHover":{"message":"Pri prechode myšou prepni medzi vlastnými a pôvodnými podrobnosťami"},"showOriginalOnHoverOfVideo":{"message":"Prepínať medzi vlastnými a pôvodnými podrobnosťami po nabehnutí kurzora na ktorúkoľvek časť video karty"},"showOriginalOnHoverOfVideoDescription":{"message":"Toto zakáže automatické prehrávanie pri prejdení myšou"},"showCustomOnHoverIfCasual":{"message":"Zobraziť vlastný názov pri prejdení myšou, ak je zobrazený názov z normálneho režimu"},"showIconForFormattedTitles":{"message":"Zobraziť tlačidlo \"Ukázať originál\" pri automaticky upravených názvoch"},"Enable":{"message":"Povoliť"},"Titles":{"message":"Názvy","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Náhľady","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Hlasy v normálnom režime","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Chyba"},"ShowOriginal":{"message":"Zobraziť pôvodné detaily"},"ShowModified":{"message":"Zobraziť upravené podrobnosti"},"ShowFormatted":{"message":"Zobraziť naformátované podrobnosti"},"FillerWarning":{"message":"Varovanie: Toto je veľmi agresívna kategória. S najväčšou pravdepodobnosťou budete musieť niekedy zrušiť preskočenie alebo zakázať kategóriu. Upozorňujeme, že pri mnohých videách je preskočených viac ako 50 % videa! Nezabudnite však, že pri odosielaní je stále potrebné dodržiavať konkrétne pokyny.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Ak chcete v tomto chate zostať natrvalo, pripojte sa na Discord alebo Matrix","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Zobraziť inštrukcie","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Vyhýbajte sa prehnaným výrazom tváre","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Majte nadhľad, neodpovedzte len na pôvodnú otázku","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Vyhýbajte sa opisovaniu reakcií na video (\"šokujúce\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Poskytnite dostatok informácií, aby ste sa pred kliknutím mohli informovane rozhodnúť"},"tip5":{"message":"Vetu začnite veľkým písmenom","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Skontrolujte všetky pokyny na odoslanie","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Môj názov začína veľkým písmenom","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Môj názov neodpovedá len na otázku v aktuálnom názve","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Názov by mal opisovať video a jeho obsah. Mali by ste si pozrieť celé video namiesto toho, že si len prečítate zaujímavý pôvodný názov.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Môj názov nezhrňuje záver ani neprezrádza zápletku","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Názvy nemajú úplne nahradiť sledovanie videa, ale slúžia na to, aby si vedel, či naň kliknúť alebo nie.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Môj názov neoveruje fakty, nezosmiešňuje ani nekritizuje video alebo jeho autora","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Názvy majú vychádzať z pohľadu tvorcu a samotného videa. Hodnotenie alebo overovanie faktov vo videu nepatrí do rozsahu projektu DeArrow. Názvy nemajú slúžiť ako sekcia komentárov.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Rozpoznané slovo: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Na začiatku názvu nepoužívajte zbytočné slovesá","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Začnite všetky názvy veľkým písmenom. Nadpisy by mali byť naformátované ako veta","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Názvy by nemali končiť bodkou","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Nepridávajte len odpoveď na pôvodnú otázku. Názvy by mali všeobecne popisovať video alebo príbeh","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Názvy by nemali overovať fakty, nezosmiešňovať ani kritizovať video alebo tvorcu","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Názvy by nemali zachovávať senzáciechtivé prvky z pôvodného názvu","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Názvy by nemali obsahovať emoji","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Pred odoslaním musíte vyriešiť problém"},"dearrowHelpSponsorBlockImported":{"message":"Poznámka: Vaše nastavenia SponsorBlocku boli automaticky naimportované!"},"howItWorks":{"message":"Ako to funguje"},"discordPromotion":{"message":"Prispejte prosím, navrhnite vylepšenia a pomôžte na {discord} alebo {matrix}"},"deArrowDonationText":{"message":"Ak sa vám páči moja tvorba a chceli by ste finančne prispieť, tu je odkaz"},"termsAgreement":{"message":"Používaním tohto rozšírenia súhlasíte s {privacy-policy} a {terms}"},"privacyPolicy":{"message":"Ochrana súkromia"},"termsOfUse":{"message":"Podmienky používania"},"openSourceLicenses":{"message":"Open Source licencie"},"defaultToOriginals":{"message":"Pôvodné informácie o videu ako predvolené"},"whatDefaultToOriginals":{"message":"Zobraziť pôvodný názov a náhľad. Zobraziť tlačidlo pri prejdení myšou, čím sa ukáže vlastný názov a náhľad."},"replaceTitles":{"message":"Nahradiť názvy"},"replaceThumbnails":{"message":"Nahradiť náhľady"},"useCrowdsourcedTitles":{"message":"Používať crowdsource-ové názvy"},"whatUseCrowdsourcedTitles":{"message":"Pri zakázaní budú názvy formátované, ale nebudú použité ich verzie vytvorené komunitou","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Naozaj chcete toto nastavenie zmazať?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Nové nastavenie"},"DeleteConfiguration":{"message":"Zmazať nastavenia"},"ChannelAllowlist":{"message":"Špecifické nastavenie kanálu"},"ConfigurationName":{"message":"Názov nastavenia"},"ChannelListInstructions":{"message":"V textovom poli nižšie zadajte kanály, pre ktoré chcete použiť toto nastavenie. Podporované sú názov kanálu aj ID kanálu, @ používateľské mená nie. ID kanálu zistíte, keď dáte zdieľať kanál na stránke o kanáli. Tú nájdete na stránke kanálu v podrobnostiach pod názvom kanálu.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Zatiaľ neexistujú žiadne nastavenia. Pridať nastavenie môžete kliknutím na tlačidlo hore.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Zastavte clickbait presnejšími názvami a miniatúrami"},"DeArrowPromotionMessage2":{"message":"Nebaví Vás už clickbait? Vyskúšajte moje nové rozšírenie pre zlepšovanie názvov a miniatúr"},"DeArrowPromotionMessage3":{"message":"Vyskúšajte aj DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Nepáči sa vám tento názov? Ak by ste radšej videli názov nižšie, pozrite si funkciu nahradenia názvu v DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Tento náhľad bol vybraný náhodne, keďže toto video ešte nemá žiadne segmenty","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Tento náhľad bol vybraný náhodne a titulok bol automaticky sformátovaný, keďže toto video ešte nemá žiadne segmenty","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Nižsie môžete zmeniť toto východzie nastavenie","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"Od inštalácie tohto rozšírenia bolo nahradených {titles} názvov a {thumbnails} miniatúr","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} názov ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} názvov ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"a {thumbnails} náhľadov","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"a {thumbnails} miniatúr","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"Od inštalácie tohto rozšírenia sme nahradili {titleAndThumbnailMessage}","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Počítať nahradenie názvov a miniatúr"},"countReplacementsDescription":{"message":"Slúži na poskytovanie štatistík v pop-upe.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Pridať zoznam filtrov do blokových prieskumov, predaja merchandise a ďalších propagačných prvkov pomocou yt-neuter"},"requiresUblock":{"message":"Vyžaduje uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Nastala chyba pri detekcii videoID. Aby bol segment priradený k správenmu videu, skúste prosím znovu nahrať stránku. Ak sa vám táto chyba stáva často, odošlite správu so zoznamom nainštalovaných rozšírení a userscriptov cez GitHub, Discord alebo Matrix."},"dearrowLogoCredit":{"message":"Logo je založené na Twemoji, licencované podľa CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock nie je kompatibilný s rozšírením \"Zoom to Fill\". Môžete použiť veľa alternatív, ktoré fungujú správne."},"freeTrialStarted":{"message":"Začalo sa vám skúšobné obdobie. Vyskúšajte ho návštevou YouTube"},"freeTrialEnded":{"message":"Skúšobné obdobie vám skončilo"},"freeTrialPrompt":{"message":"Skúšobné obdobie zdarma na jednu hodinu môžete aktivovať tlačidlom nižšie."},"startFreeTrial":{"message":"Začať skúšobné obdobie"},"freeAccessRequested":{"message":"Úspešne ste sa zaregistrovali pre prístup zdarma. Po aktivácii vám príde oznámenie."},"freeAccessComplete":{"message":"Gratulujeme! Teraz máte k DeArrow prístup zdarma"},"DeArrowNotActivated":{"message":"DeArrow nie je aktivovaný"},"ActivateDeArrow":{"message":"Aktivovať DeArrow"},"DeArrowIsActivated":{"message":"DeArrow bol úspešne aktivovaný"},"Close":{"message":"Zavrieť"},"ViewLicenseKey":{"message":"Zobraziť licenčný kľúč"},"SharingIsCaring":{"message":"Zdieľanie je starostlivosť"},"cleanPopup":{"message":"Skryť zbytočnosti vo vyskakovacom okne zoznamu segmentov"},"hideSegmentCreationInPopup":{"message":"Skryť tlačidlá na tvorbu segmentov vo vyskakovacom okne"},"syncDisabledWarning":{"message":"Varovanie: úložisko pre doplnky je vo vašom prehliadači vypnuté. Nastavenia nebudú uložené."},"syncDisabledWarningDeArrow":{"message":"DeArrow nebude bez úložiska fungovať."},"syncDisabledFirefoxSuggestions":{"message":"Môžete ho zapnúť v about:config nastavením hodnoty \"webextensions.storage.sync.enabled\" na true."},"storageFull":{"message":"Úložisko rozšírenia je plné. Prosím, odstráňte niektoré neodoslané segmenty v možnostiach."},"previewSegmentRequired":{"message":"Skontrolujte si segmenty pred odoslaním. Môžete tak spraviť kliknutím na tlačidlo Náhľad alebo použite tento odkaz:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Vystupovať ako VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Segmenty teraz nemôžu byť akceptované, lebo Youtube vložil do videa reklamy, ktoré toto rozšírenie nevie odstrániť. Napíšte nám prosím."},"DeArrowIsDisabled":{"message":"DeArrow je vypnutý - kliknutím sem ho zapnete","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Ste si istí, že tento pôvodný náhľad je v súlade s pokynmi služby DeArrow? Ak vo všeobecnosti uprednostňujete zobraziť pôvodné náhľady, zvážte zmenu možnosti „Ak neexistuje žiadny komunitný náhľad\" v nastaveniach doplnku DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"Na YouTube TV nie je SponsorBlock kompatibilný s živým a nedávno nahraným obsahom. Ak ide o nedávno nahraný obsah, počkajte prosím niekoľko hodín, kým bude dostupná spracovaná verzia nahrávky.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Funkcia bielej listiny kanálov nie je podporovaná na tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Páči sa vám pôvodný názov?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Áno"},"No":{"message":"Nie"},"votes":{"message":"{0} hlasov","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} hlas","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Zábavné","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Kreatívne","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Chytré","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Popisné","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Iné","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Klasický režim","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Názvy budú nahradené štandardizovanými formátmi založenými na pokynoch pre všetky videá, kde existujú komunitné názvy."},"CasualMode":{"message":"Normálny režim","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Ponechať pôvodné názvy, ak dostatočne dobre popisujú video a sú chytré alebo zábavné.\nVyberte, ktoré kategórie názvov chcete vidieť.\nBudete môcť hlasovať, či názov do týchto kategórií patrí, alebo nie."},"minimumVotes":{"message":"Minimum hlasov","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Zobraziť pôvodnú miniatúru pri videách, kde ste hlasovali v normálnom režime","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Nová funkcia: normálny režim","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Zobraziť ikonu normálneho režimu iba v prípade, že je dostupný vlastný názov"},"OpenSettings":{"message":"Otvoriť nastavenia"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/sr/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/sr/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Временско ограничење везе. Проверите своју интернет везу. Ако ваш интернет ради, сервер је вероватно преоптерећен или није у функцији."},"400":{"message":"Сервер је одбио овај захтев"},"409":{"message":"Ово је већ поднесено раније"},"502":{"message":"Чини се да је сервер преоптерећен. Покушајте поново за неколико секунди."},"fullName":{"message":"SponsorBlock за YouTube - Прескочите спонзорства","description":"Name of the extension."},"Description":{"message":"Прескочите спонзорства, молбе за праћење и још много тога на YouTube видео снимцима. Пријавите спонзоре у видео снимцима које гледате да бисте уштедели време другима.","description":"Description of the extension."},"channelWhitelisted":{"message":"Канал на белој листи!"},"Segment":{"message":"сегмент"},"Segments":{"message":"сегмената"},"SegmentsCap":{"message":"Сегменти"},"Chapters":{"message":"Поглавља"},"renderAsChapters":{"message":"Рендеруј сегменте као поглавља","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Прикажи тренутни сегмент поред времена видео снимка"},"showAutogeneratedChapters":{"message":"Прикажи поглавља која аутоматски генерише YouTube"},"upvoteButtonInfo":{"message":"Гласај за овај поднесак"},"reportButtonTitle":{"message":"Пријави"},"reportButtonInfo":{"message":"Пријави овај поднесак као нетачан."},"Dismiss":{"message":"Одбаци"},"Loading":{"message":"Учитавање..."},"Hide":{"message":"Никад не приказуј"},"hitGoBack":{"message":"Притисните „Назад” да бисте се вратили."},"unskip":{"message":"Назад"},"reskip":{"message":"Поново прескочи"},"unmute":{"message":"Укључи звук"},"paused":{"message":"Паузирано"},"manualPaused":{"message":"Тајмер је заустављен"},"confirmMSG":{"message":"Да бисте изменили или избрисали појединачне вредности, кликните на дугме са информацијама или отворите искачући прозор додатка кликом на иконицу додатка у горњем десном углу."},"clearThis":{"message":"Желите ли заиста да очистите ово?\n\n"},"Unknown":{"message":"Дошло је до грешке при подношењу сегмента, покушајте поново касније."},"sponsorFound":{"message":"Овај видео снимак има сегменте у бази података!"},"sponsor404":{"message":"Нису пронађени сегменти"},"sponsorStart":{"message":"Започни сегмент сада"},"sponsorEnd":{"message":"Заврши сегмент сада"},"sponsorCancel":{"message":"Откажи прављење сегмента"},"noVideoID":{"message":"Није пронађен ниједан YouTube видео снимак. Ако ово није тачно, освежите картицу."},"refreshSegments":{"message":"Освежи сегменте"},"success":{"message":"Успех!"},"voted":{"message":"Глас поднесен!"},"serverDown":{"message":"Чини се да сервер није у функцији. Одмах контактирајте програмера."},"connectionError":{"message":"Дошло је до грешке у вези. Кôд грешке: "},"segmentsStillLoading":{"message":"Сегменти се још увек учитавају..."},"clearTimes":{"message":"Очисти сегменте"},"openPopup":{"message":"Отвори SponsorBlock искачући прозор"},"closePopup":{"message":"Затвори искачући прозор"},"closeIcon":{"message":"Затвори иконицу"},"OpenSubmissionMenu":{"message":"Отвори мени за подношење"},"OpenCasualVoteMenu":{"message":"Отвори мени обичног режима"},"sortSegments":{"message":"Сортирање сегмената"},"submitCheck":{"message":"Желите ли заиста да поднесете ово?"},"whitelistChannel":{"message":"Канал на белој листи"},"removeFromWhitelist":{"message":"Уклони канал са беле листе"},"voteOnTime":{"message":"Гласање за сегмент"},"Submissions":{"message":"Поднесци"},"savedPeopleFrom":{"message":"Сачували сте људе од "},"viewLeaderboard":{"message":"Ранг-листа"},"recordTimesDescription":{"message":"Поднесите"},"submissionEditHint":{"message":"Измењивање сегмента ће се појавити након што кликнете на „Поднеси”","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Савет: Можете подесити тастерске пречице за подношење у опцијама"},"clearTimesButton":{"message":"Очисти времена"},"Username":{"message":"Корисничко име"},"setUsername":{"message":"Подеси корисничко име"},"copyPublicID":{"message":"Копирај јавни UserID"},"copySegmentID":{"message":"Копирај ID сегмента"},"loopChapter":{"message":"Понављање поглавља"},"unloopChapter":{"message":"Без понављања поглавља"},"hideThis":{"message":"Сакриј ово"},"Options":{"message":"Опције"},"showButtons":{"message":"Прикажи дугмад на YouTube плејеру"},"hideButtonsDescription":{"message":"Ово сакрива дугмад која се појављују на YouTube плејеру за подношење сегмената за прескакање."},"showSkipButton":{"message":"Задржи дугме „Прескочи на истакнуто” на плејеру"},"showInfoButton":{"message":"Прикажи дугме за информације на YouTube плејеру"},"autoHideInfoButton":{"message":"Аутоматски сакриј дугме за информације"},"showDeleteButton":{"message":"Прикажи дугме за брисање на YouTube плејеру"},"enableViewTracking":{"message":"Омогући праћење броја прескакања"},"whatViewTracking":{"message":"Ова функција прати које сте сегменте прескочили да бисте корисницима дали до знања колико је њихов поднесак помогао другима и користи се као метрика заједно са позитивним гласовима, како би се осигурало да нежељена пошта не доспе у базу података. Додатак шаље поруку серверу сваки пут када прескочите сегмент. Надамо се да већина људи неће променити ово подешавање да би бројеви приказа били тачни. :)"},"enableViewTrackingInPrivate":{"message":"Омогући праћење броја прескакања у приватним/инкогнито картицама"},"enableTrackDownvotes":{"message":"Чувај гласове против сегмента"},"whatTrackDownvotes":{"message":"Сви сегменти које одбаците остаће скривени, чак и након освежавања"},"trackDownvotesWarning":{"message":"Упозорење: Онемогућавање овога ће избрисати све претходно сачуване гласове против"},"enableTrackDownvotesInPrivate":{"message":"Чувај гласове против сегмента у приватним/инкогнито картицама"},"enableQueryByHashPrefix":{"message":"Упит по префиксу хеша"},"whatQueryByHashPrefix":{"message":"Уместо захтевања сегмената од сервера помоћу ID-а видео снимка, шаљу се прва 4 знака хеша ID-а видео снимка. Овај сервер ће послати податке за све видео снимке са сличним хешовима."},"enableShowCategoryWithoutPermission":{"message":"Прикажи категорије у менију за подношење, чак и без дозволе за подношење"},"whatShowCategoryWithoutPermission":{"message":"Неке категорије захтевају дозволу за подношење због минималних захтева за репутацијом"},"showNotice":{"message":"Прикажи обавештење поново"},"showSkipNotice":{"message":"Прикажи обавештење након што је сегмент прескочен"},"showUpcomingNotice":{"message":"Прикажи обавештење пре почетка сегмента"},"showCategoryGuidelines":{"message":"Прикажи помоћ за категорију"},"noticeVisibilityMode0":{"message":"Обавештења о прескакању у пуној величини"},"noticeVisibilityMode1":{"message":"Мала обавештења о прескакању за аутоматско прескакање"},"noticeVisibilityMode2":{"message":"Сва мала обавештења о прескакању"},"noticeVisibilityMode3":{"message":"Избледела обавештења о прескакању за аутоматско прескакање"},"noticeVisibilityMode4":{"message":"Сва избледела обавештења о прескакању"},"longDescription":{"message":"SponsorBlock вам омогућава да прескочите спонзоре, уводне анимације, завршне анимације, подсетнике за претплату и друге досадне делове YouTube видео снимака. SponsorBlock је додатак за прегледач са збирком заједнице која омогућава свакоме да поднесе време почетка и краја спонзорисаних сегмената и других сегмената YouTube видео снимака. Када једна особа поднесе ове информације, свима осталима са овим додатком ће се директно прескочити спонзорисани сегмент. Такође, можете да прескочите делове музичких спотова који не садрже музику.","description":"Full description of the extension on the store pages."},"website":{"message":"Веб-сајт","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Изворни кôд","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Обавештење је надограђено!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Ако вам се и даље не свиђа, притисните дугме „Никад не приказуј”.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Прескакање сегмента","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Започињање/завршавање сегмента","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Отварање менија за подношење","description":"Keybind label"},"setSubmitKeybind":{"message":"Подношење сегмената","description":"Keybind label"},"setPreviewKeybind":{"message":"Преглед сегмента","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Затварање обавештења о прескакању","description":"Keybind label"},"setDownvoteKeybind":{"message":"Гласање против сегмента","description":"Keybind label"},"setUpvoteKeybind":{"message":"Гласање за сегмент","description":"Keybind label"},"nextChapterKeybind":{"message":"Следеће поглавље","description":"Keybind label"},"previousChapterKeybind":{"message":"Претходно поглавље","description":"Keybind label"},"enableDeArrowKey":{"message":"Укључивање/искључивање DeArrow-а","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Отварање менија за подношење","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Изаберите тастер тако што ћете га откуцати и изабрати било који модификаторски тастер који желите да користите."},"disableSkipping":{"message":"Прескакање је омогућено"},"enableSkipping":{"message":"Прескакање је онемогућено"},"yourWork":{"message":"Ваш рад","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Кôд грешке: "},"skip":{"message":"Прескочи"},"mute":{"message":"Утишај"},"full":{"message":"Цео видео снимак","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Прескочити сегмент {0}?"},"mute_category":{"message":"Утишати сегмент {0}?"},"skip_to_category":{"message":"Прескочити на сегмент {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Предстоји {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"Прескочен сегмент: {0}","description":"Example: Sponsor Skipped"},"muted":{"message":"Утишан сегмент: {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Прескочено на сегмент {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Гласано за категорију {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Онемогући аутоматско прескакање"},"enableAutoSkip":{"message":"Омогући аутоматско прескакање"},"audioNotification":{"message":"Звучно обавештење при прескакању"},"audioNotificationDescription":{"message":"Звучно обавештење при прескакању ће пустити звук кадгод се сегмент прескочи. Ако је онемогућено (или је аутоматско прескакање онемогућено), звук се неће пустити."},"showTimeWithSkips":{"message":"Прикажи време са уклоњеним прескакањима"},"showTimeWithSkipsDescription":{"message":"Ово време се појављује у заградама поред тренутног времена испод траке за премотавање. Ово приказује укупно трајање видео снимка одузето од било ког сегмента. Ово укључује сегменте означене само као „Прикажи у траци за премотавање”."},"youHaveSkipped":{"message":"Прескочили сте "},"minLower":{"message":"минут"},"minsLower":{"message":"минута"},"hourLower":{"message":"сат"},"hoursLower":{"message":"сати"},"youHaveSavedTime":{"message":"Сачували сте људе","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" њихових живота","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Проверите status.sponsor.ajay.app за статус сервера."},"changeUserID":{"message":"Увоз/Извоз приватног UserID"},"whatChangeUserID":{"message":"Ово треба да остане приватно. Ово је као лозинка и не би требало да се дели ни са ким. Ако неко има ово, може да се лажно представља за вас. Ако тражите свој јавни UserID, кликните на иконицу привремене меморије у искачућем прозору."},"setUserID":{"message":"Подеси приватни UserID"},"userIDChangeWarning":{"message":"Упозорење: Промена приватног UserID-а је трајна. Желите ли заиста да урадите ово? Обавезно направите резервну копију старог за сваки случај."},"createdBy":{"message":"Направио"},"supportOtherSites":{"message":"Подршка за YouTube-сајтове трећих страна"},"supportOtherSitesDescription":{"message":"Подршка за YouTube клијенте трећих страна. Да бисте омогућили подршку, морате прихватити додатне дозволе.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Подржани сајтови: "},"optionsInfo":{"message":"Омогућите Invidious подршку, онемогућите аутоматско прескакање, сакријте дугмад и још много тога."},"addInvidiousInstance":{"message":"Додај инстанцу клијента треће стране"},"addInvidiousInstanceDescription":{"message":"Додајте прилагођену инстанцу. Ово мора бити форматирано САМО са доменом. Пример: invidious.ajay.app"},"add":{"message":"Додај"},"addInvidiousInstanceError":{"message":"Ово је неважећи домен. Ово би требало да укључи САМО део са доменом. Пример: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Ресетуј Invidious листу инстанци"},"resetInvidiousInstanceAlert":{"message":"Управо ћете ресетовати Invidious листу инстанци"},"invidiousDisabledSafari":{"message":"Тренутно није доступна подршка за Invidious у Safari-ју због грешке у Safari-ју. Када Apple исправи грешку, подршка ће бити поново додата."},"currentInstances":{"message":"Тренутне инстанце:"},"minDuration":{"message":"Минимално трајање (у секундама):"},"minDurationDescription":{"message":"Сегменти краћи од подешене вредности неће бити прескочени или приказани у плејеру."},"enableManualSkipOnFullVideo":{"message":"Користи ручно прескакање када постоји ознака за цео видео снимак"},"whatManualSkipOnFullVideo":{"message":"За људе који желе да гледају видео снимак без прекида, ако је у потпуности спонзорисан или самопромотивни."},"skipNoticeDuration":{"message":"Трајање обавештења о прескакању (у секундама):"},"skipNoticeDurationDescription":{"message":"Обавештење о прескакању ће остати на екрану најмање оволико секунди. За ручно прескакање може бити видљиво дуже."},"shortCheck":{"message":"Следећи поднесак је краћи од опције минималног трајања. То може значити да је ово већ поднесено и да се само игнорише због ове опције. Желите ли заиста да поднесете?"},"liveOrPremiere":{"message":"Није дозвољено подношење на активни стрим уживо или премијеру. Сачекајте док се не заврши, а затим освежите страницу и проверите да ли су сегменти још увек важећи."},"showUploadButton":{"message":"Прикажи дугме за отпремање"},"customServerAddress":{"message":"Адреса сервера SponsorBlock"},"customServerAddressDescription":{"message":"Адреса коју SponsorBlock користи за упућивање позива серверу. Осим ако немате сопствену инстанцу сервера, ово не треба мењати."},"dataFetchingServerAddress":{"message":"Адреса сервера за прикупљање података"},"dataFetchingServerAddressDescription":{"message":"Адреса која се користи за упућивање позива серверу за прикупљање података. Осим ако немате сопствену инстанцу сервера, ово не треба мењати."},"thumbnailCacheServerAddress":{"message":"Адреса сервера кеша сличице"},"save":{"message":"Сачувај"},"reset":{"message":"Ресетуј"},"customAddressError":{"message":"Ова адреса није у исправном формату. Уверите се да садржи http:// или https:// на почетку и да нема косих црта на крају."},"areYouSureReset":{"message":"Желите ли заиста да ресетујете ово?"},"mobileUpdateInfo":{"message":"m.youtube.com је сада подржан"},"exportOptions":{"message":"Увоз/Извоз свих опција"},"exportOtherData":{"message":"Увоз/Извоз свих осталих података"},"exportOptionsCopy":{"message":"Измени/копирај"},"exportOptionsDownload":{"message":"Сачувај у фајл"},"exportOptionsUpload":{"message":"Учитај из фајла"},"whatExportOptions":{"message":"Ово је цела ваша конфигурација у JSON-у. Ово укључује ваш приватни UserID, па будите пажљиви при дељењу овога."},"setOptions":{"message":"Подеси опције"},"exportOptionsWarning":{"message":"Упозорење: Промена опција је трајна и може покварити вашу инсталацију. Желите ли заиста да урадите ово? Обавезно направите резервну копију старог за сваки случај."},"incorrectlyFormattedOptions":{"message":"Овај JSON није правилно форматиран. Ваше опције нису промењене."},"confirmNoticeTitle":{"message":"Поднесите сегмент"},"submit":{"message":"Поднеси"},"cancel":{"message":"Откажи"},"delete":{"message":"Избриши"},"preview":{"message":"Прегледај"},"unsubmitted":{"message":"Неподнесено"},"inspect":{"message":"Испитај"},"edit":{"message":"Измени"},"copyDebugLogs":{"message":"Копирај евиденције о отклањању грешака"},"copyDebugInformation":{"message":"Копирај информације о отклањању грешака у привремену меморију"},"copyDebugInformationFailed":{"message":"Писање у привремену меморију није успело"},"copyDebugInformationOptions":{"message":"Копира информације у привремену меморију које се достављају програмеру када открије грешку / када то програмер затражи. Осетљиве информације, као што су ваш userID, канали на белој листи и прилагођена адреса сервера су уклоњени. Међутим, садржи информације као што су ваш useragent, прегледач, оперативни систем и број верзије додатка. "},"copyDebugInformationComplete":{"message":"Информације о отклањању грешака су копиране у привремену меморију. Слободно уклоните све информације које не бисте желели да делите. Сачувајте ово у текстуалном фајлу или налепите у извештај о грешци."},"keyAlreadyUsed":{"message":"Ова пречица је везана за другу радњу. Изаберите другу."},"to":{"message":"до","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Копирано!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Укључује глатки прелаз"},"generic_guideline2":{"message":"Пушта као да ништа није прескочено"},"category_sponsor":{"message":"Спонзор"},"category_sponsor_description":{"message":"Плаћене промоције, плаћене препоруке и директне рекламе. Није за самопромоцију или бесплатно позивање на циљеве/креаторе/веб-сајтове/производе који им се допадају."},"category_sponsor_guideline1":{"message":"Плаћене промоције"},"category_sponsor_guideline2":{"message":"Није за донација или прилагођену робу"},"category_selfpromo":{"message":"Неплаћена промоција/Самопромоција"},"category_selfpromo_description":{"message":"Слично као „Спонзор”, осим за неплаћену промоцију или самопромоцију. Ово укључује сегменте о роби, донацијама или информацијама о томе са ким су сарађивали."},"category_selfpromo_guideline1":{"message":"Донације, чланства и прилагођена роба"},"category_selfpromo_guideline2":{"message":"Бесплатни поздрави који не доприносе видео снимку"},"category_selfpromo_guideline3":{"message":"Није за корпоративно дизајниране производе и робу"},"category_exclusive_access":{"message":"Ексклузивни приступ"},"category_exclusive_access_description":{"message":"Само за означавање целих видео снимака. Користи се када видео снимак приказује производ, услугу или локацију, где је аутор добио бесплатан или субвенционисани приступ."},"category_exclusive_access_pill":{"message":"Овај видео снимак приказује производ, услугу или локацију, где је аутор добио бесплатан или субвенционисани приступ","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Цео видео снимак приказује нешто са бесплатним или субвенционисаним приступом"},"category_interaction":{"message":"Подсетник о интеракцији (праћење)"},"category_interaction_description":{"message":"Када постоји кратак подсетник да лајкујете, претплатите се или их запратите усред садржаја. Ако је дугачак или о нечему конкретном, требало би да буде под самопромоцијом."},"category_interaction_guideline1":{"message":"Кратки подсетници да лајкујете, претплатите се или запратите"},"category_interaction_guideline2":{"message":"Укључује индиректне подсетнике за коментарисање"},"category_interaction_guideline3":{"message":"Није за општу промоцију, само за позиве на радњу"},"category_interaction_short":{"message":"Подсетник за интеракцију"},"category_intro":{"message":"Пауза/Уводна анимација"},"category_intro_description":{"message":"Интервал без стварног садржаја. Може бити пауза, статични кадар, понављајућа анимација. Ово не би требало да се користи за прелазе који садрже информације."},"category_intro_short":{"message":"Пауза"},"category_intro_guideline1":{"message":"Интервал без стварног садржаја"},"category_intro_guideline2":{"message":"Није за прелазе са информацијама"},"category_outro":{"message":"Завршне картице/Заслуге"},"category_outro_description":{"message":"Заслуге или када се појаве YouTube завршне картице. Није за закључке са информацијама."},"category_outro_guideline1":{"message":"Не укључује садржај, чак и ако су завршне картице на екрану"},"category_preview_description":{"message":"Колекција клипова који показују шта се дешава у овом видео снимку или другим видео снимцима у серији, где се све информације понављају касније у видео снимку."},"category_preview_guideline1":{"message":"Клипови који се појављују касније или у будућем видео снимку"},"category_preview_guideline2":{"message":"Рекапитулација претходног видео снимка"},"category_preview_guideline3":{"message":"Није за сегменте који додају додатни садржај"},"category_filler":{"message":"Попуњавања/Шале"},"category_filler_description":{"message":"Неповезане сцене или шале, које нису потребне за разумевање главног садржаја видео снимка. Ово не би требало да укључује сегменте који пружају детаље о контексту или позадини. Ово је веома агресивна категорија намењена када нисте расположени за „забаву”."},"category_filler_short":{"message":"Попуњавања"},"category_filler_guideline1":{"message":"Неповезане сцене или шале"},"category_filler_guideline2":{"message":"Ометања, неуспешни снимци, понављања"},"category_filler_guideline3":{"message":"Није за сцене потребне за разумевање теме"},"category_music_offtopic":{"message":"Музика: Сегмент без музике"},"category_music_offtopic_description":{"message":"Само за употребу у музичким спотовима. Ово би требало да се користи само за сегменте музичких спотова који већ нису обухваћени другом категоријом."},"category_music_offtopic_short":{"message":"Без музике"},"category_music_offtopic_guideline1":{"message":"Сегменти који нису у званичним издањима"},"category_music_offtopic_guideline2":{"message":"Сегмент без музике у наступу уживо"},"category_poi_highlight":{"message":"Истакнуто"},"category_poi_highlight_description":{"message":"Део видео снимка који већина људи тражи. Слично коментарима „Видео снимак почиње на x:xx”."},"category_poi_highlight_guideline1":{"message":"Сегмент који већина људи тражи"},"category_poi_highlight_guideline2":{"message":"Може прескочити контекст"},"category_poi_highlight_guideline3":{"message":"Може прескочити на наслов или сличицу"},"category_chapter":{"message":"Поглавље"},"category_chapter_description":{"message":"Поглавља са прилагођеним називима која описују главне делове видео снимка."},"category_chapter_guideline1":{"message":"Не помињите називе брендова спонзора"},"category_chapter_guideline2":{"message":"Користите већа поглавља за опште сегменте"},"category_chapter_guideline3":{"message":"Мања поглавља се могу ставити унутар већих"},"category_livestream_messages":{"message":"Стрим уживо: Читање донација/порука"},"category_livestream_messages_short":{"message":"Читање порука"},"autoSkip":{"message":"Аутоматско прескакање"},"manualSkip":{"message":"Ручно прескакање"},"showOverlay":{"message":"Прикажи у траци за премотавање"},"disable":{"message":"Онемогући"},"autoSkip_POI":{"message":"Аутоматско прескакање на почетак"},"manualSkip_POI":{"message":"Питај када се видео снимак учита"},"showOverlay_POI":{"message":"Прикажи у траци за премотавање"},"showOverlay_full":{"message":"Прикажи ознаку"},"showOverlay_chapter":{"message":"Прикажи поглавља"},"autoSkipOnMusicVideos":{"message":"Аутоматски прескочи све сегменте када постоји сегмент без музике"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Аутоматско прескакање само на music.youtube.com"},"muteSegments":{"message":"Дозволи сегменте који утишавају звук уместо да га прескачу"},"fullVideoSegments":{"message":"Прикажи иконицу када је видео снимак у потпуности реклама","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Прикажи ознаке и на сличицама видео снимака","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Боја неподнесених сегмената","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Боја траке за премотавање"},"category":{"message":"Категорија"},"skipOption":{"message":"Опција прескакања","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Отвори напредне опције прескакања"},"advancedSkipNotSaved":{"message":"Синтаксна грешка: Ваше опције нису сачуване"},"advancedSkipSettingsHelp":{"message":"Како ово функционише","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Омогући сервер за бета тестирање"},"whatEnableTestingServer":{"message":"Ваши поднесци и гласови НЕЋЕ СЕ РАЧУНАТИ за главни сервер. Користите ово само за тестирање."},"testingServerWarning":{"message":"Сви поднесци и гласови НЕЋЕ СЕ РАЧУНАТИ у главном серверу док се повезујете са тест сервером. Обавезно онемогућите ово када желите да правите поднеске."},"bracketNow":{"message":"(Сада)"},"moreCategories":{"message":"Више категорија"},"chooseACategory":{"message":"Избор категорије"},"enableThisCategoryFirst":{"message":"Да бисте подносили сегменте са категоријом „{0}”, морате је омогућити у опцијама. Сада ћете бити преусмерени на опције.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Упозорење: Ова врста сегмента може имати највише један активан истовремено. Подношење вишеструког броја ће довести до тога да се прикаже насумични."},"youMustSelectACategory":{"message":"Морате да изаберете категорију за све сегменте које подносите!"},"bracketStart":{"message":"(Почетак)"},"bracketEnd":{"message":"(Крај)"},"End":{"message":"Крај","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"скривено: глас против"},"hiddenDueToDuration":{"message":"скривено: прекратко"},"manuallyHidden":{"message":"ручно скривено"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID канала још није учитан. Ако користите уграђени видео снимак, покушајте да користите YouTube почетну страницу. Ово такође може бити узроковано променама у изгледу YouTube-а, ако тако мислите, оставите коментар овде:"},"invidiousPermissionRefresh":{"message":"Прегледач је опозвао дозволу потребну за функционисање на Invidious-у и другим сајтовима трећих страна. Кликните на дугме испод да бисте поново активирали ову дозволу."},"acceptPermission":{"message":"Прихвати дозволу"},"permissionRequestSuccess":{"message":"Захтев за дозволу је успео!"},"permissionRequestFailed":{"message":"Захтев за дозволу није успео, кликнули сте на „Одбиј”?"},"adblockerIssueWhitelist":{"message":"Ако не можете да решите ово, онемогућите подешавање „Присилна провера канала пре прескакања”, пошто SponsorBlock не може да преузме информације о каналу за овај видео снимак"},"forceChannelCheck":{"message":"Присилна провера канала пре прескакања"},"whatForceChannelCheck":{"message":"Подразумевано, прескочиће сегменте пре него што уопште сазна шта је канал. Подразумевано, неки сегменти на почетку видео снимка могу бити прескочени на каналима са беле листе. Омогућавање ове опције ће спречити ово, али ће свако прескакање имати мало кашњење, јер добијање ID-а канала може потрајати. Ово кашњење може бити неприметно, ако имате брз интернет."},"forceChannelCheckPopup":{"message":"Размислите о омогућавању опције „Присилна провера канала пре прескакања”"},"downvoteDescription":{"message":"Нетачно/погрешно одређено време"},"incorrectVote":{"message":"Нетачно"},"harmfulVote":{"message":"Штетно","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Промени категорију"},"nonMusicCategoryOnMusic":{"message":"Овај видео снимак је категорисан као музика. Јесте ли сигурни да ово има спонзора? Ако је ово заправо „Сегмент без музике”, отворите опције додатка и омогућите ову категорију. Затим, можете да поднесете овај сегмент као „Без музике” уместо као спонзор. Прочитајте смернице, ако сте збуњени."},"multipleSegments":{"message":"Више сегмената"},"guidelines":{"message":"Смернице"},"readTheGuidelines":{"message":"Прочитајте смернице!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Категорије су овде!"},"categoryUpdate2":{"message":"Отварање опција за прескакање уводних анимација, завршних анимација, робе итд."},"help":{"message":"Помоћ"},"GotIt":{"message":"Разумем","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Овај сегмент је велики. Ако је цео видео снимак о једној теми, промените са „Прескочи” на „Цео видео снимак”. Погледајте смернице за више информација."},"categoryPillTitleText":{"message":"Цео овај видео снимак је означен као ова категорија и превише је чврсто интегрисан да би се могао одвојити"},"chapterNameTooltipWarning":{"message":"Једно од ваших назива поглавља је слично категорији. Уместо тога, требало би да користите категорије када је то могуће."},"experiementOptOut":{"message":"Искључивање свих будућих експеримената","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Сакриј заувек"},"warningChatInfo":{"message":"Приметили смо да правите неке уобичајене грешке. Веома ценимо ваш досадашњи рад, али овде тежимо савршенству, тако да су и мале грешке важне :)"},"questionButton":{"message":"Имам питање"},"askAQuestion":{"message":"Постави питање"},"warningConfirmButton":{"message":"Разумем разлог"},"warningError":{"message":"Грешка при покушају потврде упозорења:"},"deArrowMessageRecieved":{"message":"Добили сте савет од модератора"},"Donate":{"message":"Донација"},"considerDonating":{"message":"Помозите у финансирању развоја"},"supportSponsorBlock":{"message":"Подржите мој свакодневни рад SponsorBlock-у"},"hideDonationLink":{"message":"Сакриј линк за донацију"},"darkModeOptionsPage":{"message":"Тамни режим на страници са опцијама"},"helpPageThanksForInstalling":{"message":"Хвала што сте инсталирали SponsorBlock."},"helpPageReviewOptions":{"message":"Прегледајте опције у наставку"},"helpPageFeatureDisclaimer":{"message":"Многе функције су подразумевано онемогућене. Ако желите да прескочите уводне анимације, завршне анимације, користите Invidious итд., омогућите их испод. Такође, можете сакрити/приказати елементе корисничког интерфејса."},"helpPageHowSkippingWorks":{"message":"Како то функционише"},"helpPageHowSkippingWorks1":{"message":"Све спонзоре су поднели корисници попут вас. Листу поднетих спонзора у бази података можете видети отварањем искачућег прозора у горњем десном углу прегледача."},"helpPageHowSkippingWorks2":{"message":"Кад год прескочите сегмент, добићете обавештење. Ако вам се чини да је време погрешно, гласајте против тако што ћете кликнути на „Гласај против”! Такође, можете гласати у искачућем прозору."},"Submitting":{"message":"Подношење"},"helpPageSubmitting1":{"message":"Подношење се може извршити кликом на логотип SponsorBlock-а у видео плејеру."},"helpPageSubmitting2":{"message":"Клик на дугме за пуштање означава почетак сегмента, а клик на дугме за заустављање означава крај. Кликните на дугме са стрелицом нагоре да бисте отворили мени за подношење где можете да проверите своје сегменте тако што ћете их прегледати и измењивати да би били савршени. Прецизност је важна, обавезно прочитајте смернице пре подношења."},"helpPageCopyOfDatabase":{"message":"Где иду поднесци?"},"helpPageCopyOfDatabase1":{"message":"Сви поднесци се уносе у базу података SponsorBlock-а, која је јавно доступна свима и доступна је на"},"helpPageCopyOfDatabase2":{"message":"Изворни кôд је слободно доступан. Дакле, чак и ако ми се нешто деси, ваши поднесци нису изгубљени."},"AdviceForSubmitting":{"message":"Савет за подношење"},"Credits":{"message":"Заслуге"},"LearnMore":{"message":"Сазнај више"},"FullDetails":{"message":"Потпуни детаљи"},"CopyDownvoteButtonInfo":{"message":"Гласови против и прављење локалне копије коју можете поново да поднесете"},"OpenCategoryWikiPage":{"message":"Отворите вики-страницу ове категорије."},"CopyAndDownvote":{"message":"Копирај и гласај против"},"ContinueVoting":{"message":"Наставак гласања"},"ChangeCategoryTooltip":{"message":"Ово ће се одмах применити на ваше сегменте"},"downvote":{"message":"Гласај против"},"upvote":{"message":"Гласај за"},"hideSegment":{"message":"Сакриј сегмент"},"skipSegment":{"message":"Прескочи сегмент"},"playChapter":{"message":"Пусти поглавље"},"SponsorTimeEditScrollNewFeature":{"message":"Користите точкић миша при преласку курсором изнад поља за измењивање да бисте брзо прилагодили време. Комбинације тастера „Ctrl” или „Shift” могу се користити за фино подешавање промена."},"categoryPillNewFeature":{"message":"Ново! Погледајте када је видео снимак у потпуности спонзорисан или самопромотивни"},"yearAbbreviation":{"message":"г.","description":"100y"},"dayAbbreviation":{"message":"д.","description":"100d"},"hourAbbreviation":{"message":"ч.","description":"100h"},"optionsTabBehavior":{"message":"Понашање","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Интерфејс","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Тастерске пречице","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Резервна копија/Враћање података","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Остало","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Изглед обавештења о прескакању","description":"Option label"},"unbind":{"message":"Одвежи","description":"Unbind keyboard shortcut"},"notSet":{"message":"Није подешено"},"change":{"message":"Промени"},"youtubeKeybindWarning":{"message":"Ово је уграђена YouTube пречица. Желите ли заиста да је користите?"},"betaServerWarning":{"message":"БЕТА сервер је омогућен!"},"openOptionsPage":{"message":"Отвори страницу са опцијама"},"resetToDefault":{"message":"Ресетуј подешавања на подразумевано"},"confirmResetToDefault":{"message":"Желите ли заиста да ресетујете сва подешавања на подразумеване вредности? Ово се не може поништити."},"exportSegments":{"message":"Извоз сегмената"},"importSegments":{"message":"Увоз сегмената"},"Import":{"message":"Увези","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Успешно искоришћено!"},"redeemFailed":{"message":"Кључ лиценце је неважећи"},"hideUpsells":{"message":"Сакриј опције које нису доступне без додатног плаћања"},"hideNewFeatureUpdates":{"message":"Сакриј савете о новим функцијама"},"redeem":{"message":"Искористи"},"enterLicenseKey":{"message":"Унесите кључ лиценце"},"unsubmittedSegmentCounts":{"message":"Тренутно имате {0} на {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Тренутно немате неподнесених сегмената","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"неподнесени сегмент","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"неподнесених сегмената","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"видео снимку","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"видео снимака","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Очисти све сегменте","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Желите ли заиста да очистите све неподнесене сегменте?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Прикажи сегменте","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Сакриј сегменте","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID видео снимка","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Број сегмената","description":"Header of the unsubmitted segments list"},"actions":{"message":"Радње","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Дели као URL адресу"},"segmentFetchFailureWarning":{"message":"Упозорење: Сервер још увек није одговорио сегментима. Можда постоје сегменти на овом видео снимку који су већ поднесени, али их једноставно нисте добили због проблема са сервером."},"allowScrollingToEdit":{"message":"Дозволи превлачење за измењивање времена"},"NoticeTimeAfterSkip":{"message":"{seconds}с","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Бољи наслови и сличице на YouTube-у","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Наслови и сличице из збирке заједнице да буду описни, а не сензационалнистички","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Изаберите најописнији"},"Original":{"message":"Оригинално"},"OriginalTitle":{"message":"Оригинални наслов"},"CurrentTime":{"message":"Тренутно време"},"resetCustomTitle":{"message":"Ресетовање наслова назад на оригинални текст"},"resetIcon":{"message":"Ресетовање иконице"},"TypeYourOwnTitleHere":{"message":"Овде унесите сопствени наслов"},"VideoNotReady":{"message":"Видео снимак није спреман"},"FailedToRender":{"message":"Рендеровање није успело","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Недостаје Canvas","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Изузетак током рендеровања","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Учитавање није успело","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Формат наслова"},"Disabled":{"message":"Онемогућено"},"CapitalizeWords":{"message":"Речи с великим словима"},"TitleCase":{"message":"Велика почетна слова наслова"},"SentenceCase":{"message":"Велика почетна слова реченице"},"LowerCase":{"message":"Мала слова"},"FirstLetterUppercase":{"message":"Прво слово велико"},"shouldCleanEmojis":{"message":"Уклони емоџије"},"onlyFormatCustomTitles":{"message":"Форматирај само наслове које су поднели корисници"},"onlyTitleCaseInEnglish":{"message":"Велика слова за наслове који нису на енглеском"},"onlyTitleCaseInEnglishDescription":{"message":"Откривање језика није савршено и открива неке наслове на енглеском као да нису на енглеском."},"thumbnailFallbackOption":{"message":"Када не постоји поднесена сличица"},"whatThumbnailFallbackOption":{"message":"Када се бира насумично време, користиће SponsorBlock податке да би се осигурало да време у промотивном сегменту није изабрано.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Прикажи снимак екрана из насумичног времена"},"TheOriginalThumbnail":{"message":"Прикажи оригиналну сличицу"},"showABlankBox":{"message":"Прикажи празно поље"},"AutoGenerated":{"message":"Прикажи сличицу коју аутоматски генерише YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Почетак"},"Middle":{"message":"Средина"},"keepUnsubmitted":{"message":"Чувај поднесене гласове"},"showLiveCover":{"message":"Прикажи аватар канала на предстојећим видео снимцима","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Никад не користи A/B тестиране сличице"},"ignoreAbThumbnailsDescription":{"message":"Канали могу да подесе тестове на својим видео снимцима, где ће YouTube свакој особи приказати различите сличице. Ова опција ће увек користити прву сличицу да би одржала доследност."},"abThumbnailsWarning":{"message":"Упозорење: Овај видео снимак тренутно има покренут A/B тест сличица. То значи да се сличица може често мењати. Вероватно не би требало да гласате за оригиналну сличицу због овог ризика."},"whatKeepUnsubmitted":{"message":"Задржите поднесене гласове након гласања да бисте на серверу приказали наслове и сличице које сте изабрали уместо оних са највише гласова."},"keepUnsubmittedInPrivate":{"message":"Чувај поднесене гласове из приватних картица"},"useThumbnailGenerationService":{"message":"Користи услугу генерисања сличица"},"titleMaxLines":{"message":"Максималан број редова за наслов"},"titleMaxLinesDescription":{"message":"Наслови видео снимака ће бити распоређени на оволико редова у предлозима."},"thumbnailSaturationLevel":{"message":"Ниво засићености сличица"},"whatSaturateThumbnails":{"message":"Учините сличице мање живописним смањењем њихове боје"},"hideDetailsWhileFetching":{"message":"Сакриј детаље током прикупљања података"},"hideDetailsWhileFetchingDescription":{"message":"Сакријте наслове и сличице док се прикупљају подаци са сервера. Ако је онемогућено, видећете треперење када се наслови и сличице мењају."},"ignoreTranslatedTitles":{"message":"Не приказуј YouTube-ове аутоматски преведене наслове","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube ће понекад аутоматски преводити наслове на ваш матерњи језик. Ова опција се примењује само када наслов од заједнице није доступан."},"onAllPages":{"message":"На свим страницама","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"На свим страницама, осим страница с видео снимком","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Никада"},"thumbnailGeneratorDescription1":{"message":"Услуга генерисања сличица значајно убрзава генерисање сличица слањем анонимног захтева који садржи ID видео снимка на удаљени сервер. Сличица ће тада бити генерисана или извучена из кеша, ако је већ генерисана."},"thumbnailGeneratorDescription2":{"message":"Ако се користи на страницама с видео снимком, ово може потенцијално да изазове цурење ID-а видео снимака доступних по позиву на овом серверу. Подешавањем на „На свим страницама, осим страница с видео снимком” избећи ћете овај проблем. Друга опција је да хостујете сопствену услугу генерисања сличица."},"thumbnailGeneratorDescription3":{"message":"Ако је употреба услуге генерисања сличица онемогућена, сви захтеви ће користити к-анонимност систем упита, што отежава серверу да предвиди који су видео снимци преузети, а користиће се спорија локална услуга генерисања сличица.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Изворни кôд услуге генерисања сличица"},"moreAboutKAnonymity":{"message":"Више о к-анонимности","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Увек прикажи дугме „Прикажи оригинал”"},"whatAlwaysShowShowOriginalButton":{"message":"Ако желите да увек знате да ли је наслов/сличица промењена, омогућите ово."},"showOriginalOnHover":{"message":"Пребаците се између прилагођених и оригиналних детаља при преласку курсором"},"showOriginalOnHoverOfVideo":{"message":"Пребацујте се између прилагођених и оригиналних детаља преласком курсора било где на картици видео снимка"},"showOriginalOnHoverOfVideoDescription":{"message":"Ово ће онемогућити аутоматско пуштање при преласку курсором"},"showCustomOnHoverIfCasual":{"message":"Прикажи прилагођени наслов при преласку курсором, ако је приказан наслов обичног режима"},"showIconForFormattedTitles":{"message":"Прикажи дугме „Прикажи оригинал” за аутоматски форматиране наслове"},"Enable":{"message":"Омогући"},"Titles":{"message":"Наслови","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Сличице","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Гласови у обичном режиму","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Грешка"},"ShowOriginal":{"message":"Прикажи оригиналне детаље"},"ShowModified":{"message":"Прикажи измењене детаље"},"ShowFormatted":{"message":"Прикажи форматиране детаље"},"FillerWarning":{"message":"Упозорење: Ово је невероватно агресивна категорија. Вероватно ћете морати да премотате уназад ствари или да их понекад онемогућите. Имајте на уму да многи видео снимци имају преко 50% или више прескоченог видео снимка! Међутим, запамтите да још увек постоје одређене смернице које треба следити приликом подношења.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Придружите се Discord-у или Matrix-у да бисте трајно остали у овом ћаскању","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Прикажи помоћ за смернице","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Избегавајте претеране изразе лица","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Размислите о широј слици, немојте само одговорити на питање из оригиналног наслова","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Избегавајте описивање реакција на видео снимак („шокантно”)","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Наведите довољно информација да направите информисан избор пре него што се кликне"},"tip5":{"message":"Напишите великим словом као реченицу","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Прихватите све смернице пре подношења","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Мој наслов је написан великим словима као реченица","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Мој наслов не одговара само на питање постављено у наслову","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Наслови треба да описују видео снимак или причу уопште. Обавезно погледајте цео видео снимак да бисте сазнали о чему се заправо ради уместо да се ослањате на интригантан оригинални наслов.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Мој наслов не сажима закључак нити непотребно квари","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Наслови нису намењени да у потпуности замене гледање видео снимка, већ да знате треба ли да кликнете или не.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Мој наслов не проверава чињенице, исмејава или критикује видео снимак или аутора","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Наслови треба да буду из перспективе аутора и видео снимка. Оцењивање или провера чињеница самог видео снимка је ван делокруга DeArrow-а. Наслови нису замишљени као одељак за коментаре.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Откривена реч: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Немојте користити непотребне глаголе на почетку наслова","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Започните све наслове великим словом. Наслове треба саставити као реченицу","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Наслови не би требало да се завршавају с „.”","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Немојте само додати одговор на питање у оригиналном наслову. Наслови треба да описују видео снимак или причу уопштено","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Наслови не би требало да проверавају чињенице, исмевају или критикују видео снимак или аутора","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Наслови не би требало да задрже сензационалистичке елементе оригиналног наслова","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Наслови не би требало да садрже емоџије","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Морате решити упозорење пре подношења"},"dearrowHelpSponsorBlockImported":{"message":"Напомена: Ваша подешавања SponsorBlock-а су аутоматски увезена!"},"howItWorks":{"message":"Како то функционише"},"discordPromotion":{"message":"Дођите да допринесете, дате неке предлоге и помогнете на {discord}-у или на {matrix}-у"},"deArrowDonationText":{"message":"Ако вам се свиђа оно што сам до сада радио и желите да ми помогнете новцем, ево линка"},"termsAgreement":{"message":"Коришћењем овог додатка, прихватате {privacy-policy} и {terms}"},"privacyPolicy":{"message":"Политика приватности"},"termsOfUse":{"message":"Услови коришћења"},"openSourceLicenses":{"message":"Лиценце отвореног кода"},"defaultToOriginals":{"message":"Подразумевано за оригиналне информације о видео снимку"},"whatDefaultToOriginals":{"message":"Подразумевано прикажите оригинални наслов и сличицу, али имајте дугме које се појављује при преласку курсором да бисте видели прилагођене наслове и сличице."},"replaceTitles":{"message":"Замени наслове"},"replaceThumbnails":{"message":"Замени сличице"},"useCrowdsourcedTitles":{"message":"Користи наслове из збирке заједнице"},"whatUseCrowdsourcedTitles":{"message":"Ако је онемогућено, форматираће наслове, али неће користити наслове из збирке заједнице","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Желите ли заиста да избришете ову конфигурацију?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Нова конфигурација"},"DeleteConfiguration":{"message":"Избриши конфигурацију"},"ChannelAllowlist":{"message":"Подешавања специфична за канал"},"ConfigurationName":{"message":"Назив конфигурације"},"ChannelListInstructions":{"message":"Унесите све канале на које желите да примените ову конфигурацију у поље испод, одвојене новим редовима. Подржани су и ID-ови канала и имена за приказ. @ Корисничка имена нису подржана. ID-ове канала можете добити кликом на дугме за дељење на страници о каналу. Да бисте дошли до странице са информацијама, кликните на опис канала који се појављује испод назива канала на страници канала.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Још нема подешавања конфигурација. Кликните на дугме на врху да бисте додали нову конфигурацију.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Заустављање кликбејта заменом наслова и сличица прецизнијим"},"DeArrowPromotionMessage2":{"message":"Досадио вам је кликбејт? Погледајте мој нови додатак за побољшање наслова и сличица"},"DeArrowPromotionMessage3":{"message":"Такође проверите DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Не свиђа вам се овај наслов? Ако више волите наслов испод, размислите о томе да проверите функцију замене наслова у DeArrow-у.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Ова сличица је изабрана из насумичне временске ознаке, јер још увек нема поднеска на овом видео снимку","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Ова сличица је изабрана из насумичне временске ознаке и наслов је аутоматски форматиран, јер још увек нема поднеска на овом видео снимку","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Можете променити ово подразумевано у наставку","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} наслова и {thumbnails} сличица су замењени откако сте инсталирали овај додатак","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} наслов ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} наслова ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"и {thumbnails} сличица","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"и {thumbnails} сличица","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} су замењени откако сте инсталирали овај додатак","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Бројање замена наслова и сличица"},"countReplacementsDescription":{"message":"Користи се за давање статистике у искачућем прозору.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Додавање листе филтера за блокирање анкета, полица са робом и других елемената промотивних страница користећи yt-neuter"},"requiresUblock":{"message":"Захтева uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Дошло је до грешке при откривању ID-а видео снимка. Покушајте да освежите пре подношења да бисте били сигурни да ће бити поднесен за прави видео снимак. Ако се ово често дешава, пошаљите извештај о томе заједно са другим додацима или корисничким скриптима, које сте инсталирали преко GitHub-а, Discord-а или Matrix-а."},"dearrowLogoCredit":{"message":"Логотип заснован на Twemoji, лиценциран под CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock није компатибилан с додатком „Zoom to Fill”. Постоји много алтернатива које можете користити уместо тога и које ће исправно радити."},"freeTrialStarted":{"message":"Ваш бесплатни пробни период је успешно почео. Посетите YouTube да бисте тестирали"},"freeTrialEnded":{"message":"Ваш бесплатни пробни период је готов"},"freeTrialPrompt":{"message":"Ако желите да га тестирате на сат времена, можете започети бесплатни пробни период помоћу дугмета испод."},"startFreeTrial":{"message":"Започни бесплатни пробни период"},"freeAccessRequested":{"message":"Успешно сте регистровани за бесплатан приступ. Бићете обавештени када се одобри бесплатан приступ."},"freeAccessComplete":{"message":"Честитке! Сада имате бесплатан приступ за DeArrow"},"DeArrowNotActivated":{"message":"DeArrow није активиран"},"ActivateDeArrow":{"message":"Активирај DeArrow"},"DeArrowIsActivated":{"message":"DeArrow је успешно активиран"},"Close":{"message":"Затвори"},"ViewLicenseKey":{"message":"Види кључ лиценце"},"SharingIsCaring":{"message":"Дељење је брига"},"cleanPopup":{"message":"Сакриј неред у искачућем прозору листе сегмената"},"hideSegmentCreationInPopup":{"message":"Сакриј дугмад за прављење сегмента у искачућем прозору"},"syncDisabledWarning":{"message":"Упозорење: Меморија додатка је онемогућена у вашем прегледачу. Подешавања неће бити сачувана ако покушате да их сачувате."},"syncDisabledWarningDeArrow":{"message":"DeArrow неће функционисати без меморије."},"syncDisabledFirefoxSuggestions":{"message":"Можете је омогућити тако што ћете отићи на страницу about:config и подесити вредност за „webextensions.storage.sync.enabled” на true."},"storageFull":{"message":"Меморија додатка је пуна. Избришите неке неподнесене сегменте у опцијама."},"previewSegmentRequired":{"message":"Прегледајте своје сегменте пре слања. То можете учинити кликом на дугме „Прегледај” или коришћењем следеће пречице:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Понашај се као VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Поднесци тренутно не могу бити прихваћени из вашег прегледача, јер изгледа да је YouTube убацио неке огласе на страни сервера које додатак не може да уклони. Контактирајте нас ако добијате ову грешку."},"DeArrowIsDisabled":{"message":"DeArrow је онемогућен - додирните да омогућите","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Сигурни сте да ова оригинална сличица прати DeArrow смернице? Ако више волите да видите оригиналне сличице, размислите о промени опције „Када не постоји поднесена сличица” у DeArrow подешавањима.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"На YouTube TV-у, SponsorBlock није компатибилан са уживо и недавно снимљеним садржајем. Ако је ово недавни снимак, сачекајте неколико сати да обрађена верзија снимка постане доступна.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Стављање канала на белу листу није подржано на tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Свиђа вам се оригинални наслов?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Да"},"No":{"message":"Не"},"votes":{"message":"Гласови: {0}","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"Гласови: {0}","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Смешно","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Креативно","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Паметно","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Описно","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Остало","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Класични режим","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Наслови се замењују стандардизованим форматима на основу смерница за све видео снимке у којима постоји наслов из збирке заједнице."},"CasualMode":{"message":"Обични режим","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Задржите оригиналне наслове када довољно добро описују видео снимак и када су паметни или смешни.\nИзаберите које категорије наслова желите да видите.\nМоћи ћете да гласате да ли се наслов уклапа у категорију или не."},"minimumVotes":{"message":"Минимум гласова","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Прикажи оригиналну сличицу на видео снимцима с гласовима у обичном режиму","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Нова функција: Обични режим","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Прикажи иконицу обичног режима само када је доступан прилагођени наслов"},"OpenSettings":{"message":"Отвори подешавања"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/sv/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/sv/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Anslutningsfel. Kontrollera din internetanslutning. Om du kan komma åt internet är servern förmodligen överbelastad eller så ligger den nere."},"400":{"message":"Servern sa att denna begäran var ogiltig"},"409":{"message":"Den här har redan skickats in"},"502":{"message":"Servern verkar vara överbelastad. Försök igen om några sekunder."},"fullName":{"message":"SponsorBlock för YouTube - Hoppa över sponsringar","description":"Name of the extension."},"Description":{"message":"Hoppa över sponsringar, prenumerationstiggande och mer på YouTube-videor. Rapportera sponsorer på videor du tittar på för att bespara andra tid.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanalen är vitlistad!"},"Segment":{"message":"segment"},"Segments":{"message":"segment"},"SegmentsCap":{"message":"Segment"},"Chapters":{"message":"Kapitel"},"renderAsChapters":{"message":"Visa segment som kapitel","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Visa nuvarande segment bredvid videotid"},"showAutogeneratedChapters":{"message":"Visa kapitel som genereras automatiskt av YouTube"},"upvoteButtonInfo":{"message":"Rösta på detta inskick"},"reportButtonTitle":{"message":"Rapportera"},"reportButtonInfo":{"message":"Rapportera det här segmentet som inkorrekt."},"Dismiss":{"message":"Avfärda"},"Loading":{"message":"Laddar..."},"Hide":{"message":"Visa aldrig"},"hitGoBack":{"message":"Tryck på hoppa inte över för att återgå till där du kom i från."},"unskip":{"message":"Hoppa inte över"},"reskip":{"message":"Hoppa över"},"unmute":{"message":"Ljud"},"paused":{"message":"Pausad"},"manualPaused":{"message":"Timern stoppad"},"confirmMSG":{"message":"Klicka på infoknappen eller öppna popup-rutan genom att klicka på tilläggets ikon i det översta högra hörnet för att redigera eller ta bort individuella värden."},"clearThis":{"message":"Är du säker på att du vill rensa detta?\n\n"},"Unknown":{"message":"Ett fel uppstod vid inskickningen av sponsortiderna, försök igen senare."},"sponsorFound":{"message":"Denna video har segment i databasen!"},"sponsor404":{"message":"Hittade inga segment"},"sponsorStart":{"message":"Segmentet startar nu"},"sponsorEnd":{"message":"Segmentet slutar nu"},"sponsorCancel":{"message":"Avbryt skapande av segment"},"noVideoID":{"message":"Hittade ingen YouTube-video.\nUppdatera fliken om detta är felaktigt."},"refreshSegments":{"message":"Uppdatera segment"},"success":{"message":"Klart!"},"voted":{"message":"Röstat!"},"serverDown":{"message":"Det verkar som att servern ligger nere. Kontakta utvecklaren omedelbart."},"connectionError":{"message":"Anslutningsfel. Felkod: "},"segmentsStillLoading":{"message":"Segmenten laddas fortfarande..."},"clearTimes":{"message":"Rensa segmenten"},"openPopup":{"message":"Öppna SponsorBlock-popup"},"closePopup":{"message":"Stäng popup"},"closeIcon":{"message":"Stäng ikon"},"OpenSubmissionMenu":{"message":"Öppna inskickningsmenyn"},"OpenCasualVoteMenu":{"message":"Öppna menyn för casualt läge"},"sortSegments":{"message":"Sortera segment"},"submitCheck":{"message":"Är du säker på att du vill skicka in detta?"},"whitelistChannel":{"message":"Vitlista kanalen"},"removeFromWhitelist":{"message":"Ta bort kanal från vitlistan"},"voteOnTime":{"message":"Rösta på ett segment"},"Submissions":{"message":"Inskickade"},"savedPeopleFrom":{"message":"Du har skonat andra från "},"viewLeaderboard":{"message":"Topplista"},"recordTimesDescription":{"message":"Skicka"},"submissionEditHint":{"message":"Sektionsredigering kommer att visas efter du har klickat på skicka","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Tips: Du kan i alternativen ställa in snabbtangenter för att skicka in"},"clearTimesButton":{"message":"Rensa tider"},"Username":{"message":"Användarnamn"},"setUsername":{"message":"Ange användarnamn"},"copyPublicID":{"message":"Kopiera offentligt användar-ID"},"copySegmentID":{"message":"Kopiera segment-ID"},"loopChapter":{"message":"Slinga kapitel"},"unloopChapter":{"message":"Sluta slinga kapitel"},"hideThis":{"message":"Dölj detta"},"Options":{"message":"Alternativ"},"showButtons":{"message":"Visa knappar på YouTube-spelaren"},"hideButtonsDescription":{"message":"Detta döljer knapparna på YouTube-spelaren som du skickar in överhoppade segment med."},"showSkipButton":{"message":"Behåll knappen Hoppa till höjdpunkt på spelaren"},"showInfoButton":{"message":"Visa infoknappen på YouTube-spelaren"},"autoHideInfoButton":{"message":"Dölj infoknappen automatiskt"},"showDeleteButton":{"message":"Visa borttagningsknappen på YouTube-spelaren"},"enableViewTracking":{"message":"Aktivera spårning av antalet överhoppningar"},"whatViewTracking":{"message":"Den här funktionen spårar vilka segment du har hoppat över för att låta användarna veta hur mycket tid deras bidrag har besparat andra och används tillsammans med användarnas röster för att säkerställa att spam inte kommer in i databasen. Detta tillägg skickar ett meddelande till servern varje gång du hoppar över ett segment. Förhoppningsvis ändrar de flesta inte den här inställningen så att statistiken hålls tillförlitlig. :)"},"enableViewTrackingInPrivate":{"message":"Aktivera spåra antalet hoppa över i privata/inkognitoflikar"},"enableTrackDownvotes":{"message":"Lagra segmentnerröstningar"},"whatTrackDownvotes":{"message":"Alla segment du röstat ner kommer att förbli dolda även efter uppdatering"},"trackDownvotesWarning":{"message":"Varning: Om detta inaktiveras kommer alla tidigare lagrade nerröstningar att tas bort"},"enableTrackDownvotesInPrivate":{"message":"Lagra segmentnerröstningar i privata/inkognito flikar"},"enableQueryByHashPrefix":{"message":"Fråga efter hash-prefix"},"whatQueryByHashPrefix":{"message":"I stället för att begära segment från servern med hjälp av video-ID skickas de första 4 tecknen i hashen av video-ID:et. Servern kommer då att skicka tillbaka data för alla videor med liknande hashar."},"enableShowCategoryWithoutPermission":{"message":"Visa kategorier i inlämningsmenyn även utan inlämningstillstånd"},"whatShowCategoryWithoutPermission":{"message":"Vissa kategorier kräver tillstånd att lämna in på grund av minimikrav på rykte"},"showNotice":{"message":"Visa meddelandet igen"},"showSkipNotice":{"message":"Visa ett meddelande efter att ett segment har hoppats över"},"showUpcomingNotice":{"message":"Visa meddelande innan ett segment startar"},"showCategoryGuidelines":{"message":"Visa kategorihjälp"},"noticeVisibilityMode0":{"message":"Överhoppningsmeddelanden i full storlek"},"noticeVisibilityMode1":{"message":"Små meddelanden för automatisk överhoppning"},"noticeVisibilityMode2":{"message":"Alla överhoppningsmeddelanden är små"},"noticeVisibilityMode3":{"message":"Tonade meddelanden för automatisk överhoppning"},"noticeVisibilityMode4":{"message":"Alla överhoppningsmeddelanden är tonade"},"longDescription":{"message":"SponsorBlock låter dig hoppa över sponsormeddelanden, introduktioner, eftertexter, prenumerationspåminnelser och andra irriterande delar av YouTube-videor. SponsorBlock är ett crowdsourced webbläsartillägg som låter vem som helst att skicka in start- och sluttid på sponsorsegment och andra segment av YouTube-videor. När en person skickar in denna information kommer alla andra som har detta tillägg installerat att hoppa över det sponsrade segmentet. Du kan även hoppa över icke-musikavsnitt i musikvideor.","description":"Full description of the extension on the store pages."},"website":{"message":"Hemsida","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Källkod","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Det här meddelandet har förbättrats!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Om du ändå inte gillar det, tryck på knappen visa aldrig.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Hoppa över segment","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Starta/stoppa segment","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Öppna inskickningsmenyn","description":"Keybind label"},"setSubmitKeybind":{"message":"Skicka in segment","description":"Keybind label"},"setPreviewKeybind":{"message":"Förhandsgranska segment","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Stäng överhoppningsmeddelande","description":"Keybind label"},"setDownvoteKeybind":{"message":"Rösta ner segment","description":"Keybind label"},"setUpvoteKeybind":{"message":"Rösta upp segment","description":"Keybind label"},"nextChapterKeybind":{"message":"Nästa kapitel","description":"Keybind label"},"previousChapterKeybind":{"message":"Föregående kapitel","description":"Keybind label"},"enableDeArrowKey":{"message":"Växla aktivering av DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Öppna inskickningsmenyn","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Välj en tangent genom att trycka på den och välj sedan en av modifieringstangenterna som du vill använda."},"disableSkipping":{"message":"Hoppa över är aktiverat"},"enableSkipping":{"message":"Hoppa över är inaktiverat"},"yourWork":{"message":"Ditt arbete","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Felkod: "},"skip":{"message":"Hoppa över"},"mute":{"message":"Ljudlös"},"full":{"message":"Hela videon","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Hoppa över {0}?"},"mute_category":{"message":"Gör {0} ljudlös?"},"skip_to_category":{"message":"Hoppa till {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Kommande {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} hoppades över","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} ljudlösa","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Hoppade till {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Röstade på {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Inaktivera hoppa över automatiskt"},"enableAutoSkip":{"message":"Aktivera hoppa över automatiskt"},"audioNotification":{"message":"Ljudavisering vid överhoppning"},"audioNotificationDescription":{"message":"Ljudavisering vid överhoppning kommer att spela upp ett ljud när ett segment hoppas över. Om alternativet är inaktiverat (eller om automatisk överhoppning har inaktiverats), kommer inget ljud att spelas upp."},"showTimeWithSkips":{"message":"Visa tiden med det överhoppade borttaget"},"showTimeWithSkipsDescription":{"message":"Denna tid visas inom parentes bredvid den aktuella tiden nedanför sökfältet. Detta visar den totala videons varaktighet minus alla segment. Detta inkluderar segment markerade som endast \"Visa i sökfältet\"."},"youHaveSkipped":{"message":"Du har hoppat över "},"minLower":{"message":"minut"},"minsLower":{"message":"minuter"},"hourLower":{"message":"timme"},"hoursLower":{"message":"timmar"},"youHaveSavedTime":{"message":"Du har sparat andra","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" av deras liv","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Gå till status.sponsor.ajay.app för serverstatus."},"changeUserID":{"message":"Importera/exportera ditt privata användar-ID"},"whatChangeUserID":{"message":"Detta ska hållas privat. Detta är som ett lösenord och ska inte delas med någon. Om andra får tag i det kan de utge sig för att vara dig. Om du letar efter ditt offentliga användar-ID kan du klicka på urklippsikonen i popupen."},"setUserID":{"message":"Ange privat användar-ID"},"userIDChangeWarning":{"message":"Varning: Ändring av ditt användar-ID är permanent. Är du säker att du vill göra detta? Se till att ta en säkerhetskopia av ditt gamla för säkerhets skull."},"createdBy":{"message":"Skapad av"},"supportOtherSites":{"message":"Stöd för tredjeparts YouTube-webbplatser"},"supportOtherSitesDescription":{"message":"Stöd YouTube-klienter från tredje part. För att aktivera stöd måste du acceptera de extra behörigheterna.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Webbplatser som stöds: "},"optionsInfo":{"message":"Aktivera stöd för Invidious, inaktivera hoppa över automatiskt, dölj knappar och mer."},"addInvidiousInstance":{"message":"Lägg till tredjepartsklientinstans"},"addInvidiousInstanceDescription":{"message":"Lägg till en anpassad instans. Denna måste vara formaterad med ENDAST domänen. Exempelvis: invidious.ajay.app"},"add":{"message":"Lägg till"},"addInvidiousInstanceError":{"message":"Detta är en ogiltig domän. Den ska ENDAST inkludera domändelen. Exempelvis: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Återställa Invidious instanslista"},"resetInvidiousInstanceAlert":{"message":"Du kommer nu att återställa Invidious instanslista"},"invidiousDisabledSafari":{"message":"Invidious support är inte tillgängligt på Safari just nu på grund av ett fel i Safari. När Apple fixar felet kommer den att läggas tillbaka."},"currentInstances":{"message":"Nuvarande Instanser:"},"minDuration":{"message":"Minsta varaktighet (sekunder):"},"minDurationDescription":{"message":"Segment som är kortare än det angivna värdet kommer inte att hoppas över eller visas i spelaren."},"enableManualSkipOnFullVideo":{"message":"Använd hoppa över manuellt när det finns en etikett för hela videon"},"whatManualSkipOnFullVideo":{"message":"För personer som vill titta på videon utan avbrott om den är helt sponsrad eller egenreklam."},"skipNoticeDuration":{"message":"Antalet sekunder överhoppningsmeddelanden ska visas:"},"skipNoticeDurationDescription":{"message":"Överhoppningsmeddelanden kommer att visas på skärmen i minst så här många sekunder. För manuell överhoppning kan det visas längre."},"shortCheck":{"message":"Följande inskickning är kortare än ditt minstavärde i alternativen. Det skulle kunna betyda att det redan är inskickat och bara ignorerat på grund av detta alternativ. Är du säker på att du vill skicka in?"},"liveOrPremiere":{"message":"Att skicka in på en aktiv liveström eller premiär är inte tillåtet. Vänta tills den är färdig, uppdatera sedan sidan och kontrollera att segmenten fortfarande är giltiga."},"showUploadButton":{"message":"Visa uppladdningsknappen"},"customServerAddress":{"message":"Serveradress för SponsorBlock"},"customServerAddressDescription":{"message":"Adressen SponsorBlock använder för att kommunicera med servern.\nOm du inte har en egen serverinstans ska den här inställningen inte ändras."},"dataFetchingServerAddress":{"message":"Datahämtningsserveradress"},"dataFetchingServerAddressDescription":{"message":"Adressen som används för att kommunicera till datahämtningsservern.\nOm du inte har din egen serverinstans ska detta inte ändras."},"thumbnailCacheServerAddress":{"message":"Miniatyr-cachens serveradress"},"save":{"message":"Spara"},"reset":{"message":"Återställ"},"customAddressError":{"message":"Denna adressen är inte korrekt formaterad. Se till att du har http:// eller https:// i början och inga snedstreck i slutet."},"areYouSureReset":{"message":"Är du säker på att du vill återställa detta?"},"mobileUpdateInfo":{"message":"Nu stöds även m.youtube.com"},"exportOptions":{"message":"Importera/exportera alla alternativ"},"exportOtherData":{"message":"Importera/exportera alla andra data"},"exportOptionsCopy":{"message":"Redigera/kopiera"},"exportOptionsDownload":{"message":"Spara till fil"},"exportOptionsUpload":{"message":"Ladda från fil"},"whatExportOptions":{"message":"Detta är hela din konfiguration i JSON-format. Det inkluderar ditt användar-ID, så var noga med hur du hanterar informationen."},"setOptions":{"message":"Ange alternativ"},"exportOptionsWarning":{"message":"Varning: Att ändra alternativen är permanent och kan förstöra din installation. Är du säker på att du vill göra detta? Se till att göra en säkerhetskopia för säkerhets skull."},"incorrectlyFormattedOptions":{"message":"Denna JSON är inte korrekt formaterad. Dina alternativ har inte ändrats."},"confirmNoticeTitle":{"message":"Skicka in segment"},"submit":{"message":"Skicka"},"cancel":{"message":"Avbryt"},"delete":{"message":"Ta bort"},"preview":{"message":"Förhandsgranska"},"unsubmitted":{"message":"Oinskickade"},"inspect":{"message":"Inspektera"},"edit":{"message":"Redigera"},"copyDebugLogs":{"message":"Kopiera felsökningsloggar"},"copyDebugInformation":{"message":"Kopiera felsökningsinformation till urklippet"},"copyDebugInformationFailed":{"message":"Misslyckades med att skriva till urklippet"},"copyDebugInformationOptions":{"message":"Kopierar information till urklippet för att dela med en utvecklare vid rapportering av ett fel eller när en utvecklare ber om det. Känsliga data som användar-ID, vitlistade kanaler, och anpassad serveradress har uteslutits. Däremot innehåller det information som användaragent, webbläsare, operativsystem och tilläggsversion. "},"copyDebugInformationComplete":{"message":"Felsökningsinformation har kopierats till urklippet. Ta bort eventuell information du inte vill dela med dig av. Spara informationen i en textfil eller klistra in den i en felrapport."},"keyAlreadyUsed":{"message":"Denna genväg är bunden till en annan åtgärd. Du måste välja en annan."},"to":{"message":"till","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Kopierad!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Inkludera mjuka övergångar"},"generic_guideline2":{"message":"Spelar som om ingenting hoppades över"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Betald marknadsföring, betalda hänvisningar och direktannonser. Inte för egenreklam eller gratis shoutouts till kreatörer/webbplatser/produkter de gillar."},"category_sponsor_guideline1":{"message":"Betalda kampanjer"},"category_sponsor_guideline2":{"message":"Inte för donationer eller anpassade varor"},"category_selfpromo":{"message":"Obetald reklam/egenreklam"},"category_selfpromo_description":{"message":"Som \"sponsor\" men för obetald reklam eller egenreklam. Detta inkluderar avsnitt om varor, donationer eller information om vem de samarbetade med."},"category_selfpromo_guideline1":{"message":"Donationer, medlemskap och anpassade varor"},"category_selfpromo_guideline2":{"message":"Gratis shoutouts som inte tillför något till videon"},"category_selfpromo_guideline3":{"message":"Inte för företagsdesignade produkter och varor"},"category_exclusive_access":{"message":"Exklusiv tillgång"},"category_exclusive_access_description":{"message":"Endast för att märka hela videor. Används när en video visar upp en produkt, tjänst eller plats som de har fått fri eller subventionerad tillgång till."},"category_exclusive_access_pill":{"message":"Denna video visar en produkt, tjänst eller plats som de har fått gratis eller subventionerad tillgång till","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Hela videon visar något med gratis eller subventionerad tillgång"},"category_interaction":{"message":"Interaktionspåminnelse (prenumerera)"},"category_interaction_description":{"message":"När det finns en kort påminnelse om att gilla, prenumerera eller följa dem. Om det varar länge eller handlar om något specifikt bör det istället kategoriseras som egenreklam."},"category_interaction_guideline1":{"message":"Korta påminnelser om att gilla, prenumerera eller följa"},"category_interaction_guideline2":{"message":"Inkluderar indirekta påminnelser att kommentera"},"category_interaction_guideline3":{"message":"Inte för allmän marknadsföring, endast för uppmaningar"},"category_interaction_short":{"message":"Interaktionspåminnelse"},"category_intro":{"message":"Uppehåll/introduktion"},"category_intro_description":{"message":"Ett intervall utan faktiskt innehåll. Kan vara en paus, statisk ram, upprepande animation. Denna bör inte användas för övergångar som innehåller information."},"category_intro_short":{"message":"Uppehåll"},"category_intro_guideline1":{"message":"Intervall utan egentligt innehåll"},"category_intro_guideline2":{"message":"Inte för övergångar med information"},"category_outro":{"message":"Slutkort/eftertexter"},"category_outro_description":{"message":"Eftertexter eller när YouTube-slutkort visas. Inte för slut med information."},"category_outro_guideline1":{"message":"Inkludera inte innehåll, även om slutkort visas på skärmen"},"category_preview":{"message":"Förhandstitt/sammanfattning"},"category_preview_description":{"message":"Samling av klipp som visar vad som kommer i den här videon eller andra videor i en serie där all information upprepas senare i videon."},"category_preview_guideline1":{"message":"Klipp som visas senare, eller i en framtida video"},"category_preview_guideline2":{"message":"Sammanfattning av en tidigare video"},"category_preview_guideline3":{"message":"Inte för sektioner som lägger till ytterligare innehåll"},"category_hook":{"message":"Hook/Hälsningar","description":"https://en.wikipedia.org/wiki/Narrative_hook"},"category_hook_description":{"message":"Berättade trailers för kommande video, hälsningar och farväl. Detta bör inte hoppa över slutsatser med information."},"category_hook_guideline1":{"message":"Berättade trailers för den kommande videon"},"category_hook_guideline2":{"message":"Hälsningar och adjö-sektioner välkomnar tittare"},"category_hook_guideline3":{"message":"Inte för sektioner som lägger till ytterligare innehåll"},"category_filler":{"message":"Ämnesavvikelse/skämt"},"category_filler_description":{"message":"Ämnesavvikande scener eller humor som inte krävs för att förstå det huvudsakliga innehållet i videon. Detta bör inte omfatta segment som tillhandahåller kontext eller bakgrundsdetaljer. Detta är en mycket aggressiv kategori avsedd för när du inte är på humör för \"kul\"."},"category_filler_short":{"message":"Ämnesavvikelse"},"category_filler_guideline1":{"message":"Ämnesavvikande scener eller skämt"},"category_filler_guideline2":{"message":"Distraktioner, bloopers, repriser"},"category_filler_guideline3":{"message":"Inte för scener som krävs för att förstå ämnet"},"category_music_offtopic":{"message":"Musik: Icke-musikavsnitt"},"category_music_offtopic_description":{"message":"Ska endast användas i musikvideor. Denna ska endast användas för delar av musikvideor som inte redan omfattas av en annan kategori."},"category_music_offtopic_short":{"message":"Icke-musik"},"category_music_offtopic_guideline1":{"message":"Avsnitt som inte finns i officiella utgåvor"},"category_music_offtopic_guideline2":{"message":"Icke-musik i ett liveframträdande"},"category_poi_highlight":{"message":"Höjdpunkt"},"category_poi_highlight_description":{"message":"Den del av videon som de flesta letar efter. Liknande kommentarer \"Video börjar på x\"."},"category_poi_highlight_guideline1":{"message":"Avsnitt som de flesta personer letar efter"},"category_poi_highlight_guideline2":{"message":"Kan hoppa över sammanhang"},"category_poi_highlight_guideline3":{"message":"Kan hoppa över till titeln eller miniatyrbilden"},"category_chapter":{"message":"Kapitel"},"category_chapter_description":{"message":"Anpassade namngivna kapitel som beskriver större delar av en video."},"category_chapter_guideline1":{"message":"Nämn inte sponsormärkets namn"},"category_chapter_guideline2":{"message":"Använd större kapitel för allmänna sektioner"},"category_chapter_guideline3":{"message":"Mindre kapitel kan placeras inuti större kapitel"},"category_livestream_messages":{"message":"Liveström: Donations-/meddelandeavläsningar"},"category_livestream_messages_short":{"message":"Meddelandeläsning"},"autoSkip":{"message":"Hoppa över automatiskt"},"manualSkip":{"message":"Hoppa över manuellt"},"showOverlay":{"message":"Visa i sökfältet"},"disable":{"message":"Inaktivera"},"autoSkip_POI":{"message":"Hoppa automatiskt till start"},"manualSkip_POI":{"message":"Fråga när video laddas"},"showOverlay_POI":{"message":"Visa i sökfältet"},"showOverlay_full":{"message":"Visa etikett"},"showOverlay_chapter":{"message":"Visa kapitel"},"autoSkipOnMusicVideos":{"message":"Hoppa över alla segment automatiskt när det finns ett icke-musiksegment"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Hoppa endast över automatiskt på music.youtube.com"},"muteSegments":{"message":"Tillåt segment som tystar ljudet i stället för att hoppa över"},"fullVideoSegments":{"message":"Visa en ikon när hela videon är en annons","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Visa även etiketter på videominiatyrbilder","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Färg på oinskickade","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Sökfältsfärg"},"category":{"message":"Kategori"},"skipOption":{"message":"Alternativ för hoppa över","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Öppna avancerade alternativ för att hoppa över"},"advancedSkipNotSaved":{"message":"Syntaxfel: Dina alternativ har inte sparats"},"advancedSkipSettingsHelp":{"message":"Så här fungerar det","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Aktivera server för betatestning"},"whatEnableTestingServer":{"message":"Dina inskickningar och röster KOMMER INTE ATT RÄKNAS mot huvudservern. Använd endast detta för testning."},"testingServerWarning":{"message":"Alla inskickningar och röster KOMMER INTE ATT RÄKNAS mot huvudservern så länge du är ansluten mot testservern. Se till att inaktivera detta när du vill skicka in riktiga inskickningar."},"bracketNow":{"message":"(Nu)"},"moreCategories":{"message":"Fler kategorier"},"chooseACategory":{"message":"Välj en kategori"},"enableThisCategoryFirst":{"message":"För att skicka in segment med kategorin \"{0}\" måste du först aktivera det i alternativen. Du kommer nu att bli omdirigerad till alternativen.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Varning: Denna typ av segment kan endast ha ett segment aktivt åt gången. Skickas flera segment kommer en av dem att visas slumpmässigt."},"youMustSelectACategory":{"message":"Du måste välja en kategori för alla segment du skickar in!"},"bracketStart":{"message":"(Start)"},"bracketEnd":{"message":"(Slut)"},"End":{"message":"Slut","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"dold: nerröstning"},"hiddenDueToDuration":{"message":"dold: för kort"},"manuallyHidden":{"message":"manuellt dold"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Kanal-ID:t är inte laddat ännu. Om du använder en inbäddad video, prova att använda YouTube-hemsidan istället. Detta kan också bero på förändringar i layouten hos YouTube och om du tror så är fallet kommentera det här:"},"invidiousPermissionRefresh":{"message":"Webbläsaren har återkallat behörigheten som behövs för att fungera på Invidious och andra tredjepartssajter. Klicka på knappen nedan för att återaktivera denna behörighet."},"acceptPermission":{"message":"Godkänn behörighet"},"permissionRequestSuccess":{"message":"Behörighet godkänd!"},"permissionRequestFailed":{"message":"Behörighetsbegäran misslyckades, tryckte du på förneka?"},"adblockerIssueWhitelist":{"message":"Om du inte kan lösa detta kan du inaktivera 'Tvinga kontroll av kanalen innan hoppa över' i inställningarna, eftersom SponsorBlock inte kan hämta kanalinformationen för den här videon"},"forceChannelCheck":{"message":"Tvinga kontroll av kanalen innan hoppa över"},"whatForceChannelCheck":{"message":"Som standard kommer segment att hoppas över direkt innan ens den vet vad det är för kanal. Som standard kan vissa segment i början av videon hoppas över på vitlistade kanaler. Aktiverar du detta alternativet kommer du att förhindra detta, men det gör att alla överhoppningar har en liten fördröjning eftersom det tar lite tid att få kanal-ID. Denna fördröjning kan vara obetydlig om du har en snabb internetuppkoppling."},"forceChannelCheckPopup":{"message":"Överväg att aktivera \"Tvinga kontroll av kanalen innan hoppa över\""},"downvoteDescription":{"message":"Fel/Fel tidsintervall"},"incorrectVote":{"message":"Felaktig"},"harmfulVote":{"message":"Skadlig","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Ändra kategori"},"nonMusicCategoryOnMusic":{"message":"Den här videon kategoriseras som musik. Är du säker på att denna har en sponsor? Om detta faktiskt är ett \"icke-musiksegment\", öppna tilläggsalternativen och aktivera denna kategori. Då kan du skicka in detta segment som \"icke-musik\" i stället för sponsor. Läs riktlinjerna om något är oklart."},"multipleSegments":{"message":"Flera segment"},"guidelines":{"message":"Riktlinjer"},"readTheGuidelines":{"message":"Läs riktlinjerna!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategorier finns här!"},"categoryUpdate2":{"message":"Öppna alternativen för att hoppa över introduktioner, avslutningar, varor osv."},"help":{"message":"Hjälp"},"GotIt":{"message":"Jag förstår","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Detta segment är stort. Om hela videon handlar om ett ämne, ändra sedan från \"Hoppa över\" till \"Hela videon\". Se riktlinjerna för mer information."},"categoryPillTitleText":{"message":"Hela den här videon är märkt som denna kategori och är alltför tätt integrerad för att kunna separeras"},"chapterNameTooltipWarning":{"message":"Ett av dina kapitelnamn liknar en kategori. Du bör i stället använda kategorier när det är möjligt."},"experiementOptOut":{"message":"Hoppa av alla framtida experiment","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Dölj för alltid"},"warningChatInfo":{"message":"Vi märkte att du gjorde några vanliga misstag. Vi uppskattar verkligen ditt arbete hittills, men vi strävar mot perfektion här, så även mycket små misstag spelar roll :)"},"questionButton":{"message":"Jag har en fråga"},"askAQuestion":{"message":"Ställ en fråga"},"warningConfirmButton":{"message":"Jag förstår varför"},"warningError":{"message":"Fel vid försök att bekräfta varning:"},"deArrowMessageRecieved":{"message":"Du har fått ett tips från en moderator"},"Donate":{"message":"Donera"},"considerDonating":{"message":"Hjälp till att finansiera utvecklingen"},"supportSponsorBlock":{"message":"Stöd mitt heltidsarbete med SponsorBlock"},"hideDonationLink":{"message":"Dölj donationslänk"},"darkModeOptionsPage":{"message":"Mörkt läge på alternativsidan"},"helpPageThanksForInstalling":{"message":"Tack för att du installerade SponsorBlock."},"helpPageReviewOptions":{"message":"Granska alternativen nedan"},"helpPageFeatureDisclaimer":{"message":"Många funktioner är inaktiverade som standard. Om du vill hoppa över intros, outros, använda Invidious, etc, aktivera dem nedan. Du kan också dölja/visa UI-element."},"helpPageHowSkippingWorks":{"message":"Så här fungerar det"},"helpPageHowSkippingWorks1":{"message":"Alla sponsorer lämnas in av YouTube-användare. Du kan se listan över inskickade sponsorer i databasen genom att öppna popup-fönstret uppe till höger i din webbläsare."},"helpPageHowSkippingWorks2":{"message":"När du hoppar över ett segment får du ett meddelande. Om tidpunkten verkar felaktig rösta då ner genom att klicka på nerröstning! Du kan också rösta i popup-fönstret."},"Submitting":{"message":"Skickar in"},"helpPageSubmitting1":{"message":"Inskickning kan göras genom att klicka på SponsorBlock-logotypen i videospelaren."},"helpPageSubmitting2":{"message":"Genom att klicka på uppspelningsknappen visas början på ett segment och genom att klicka på stoppikonen visas slutet. Klicka på uppåtpilen för att öppna inskickningsmenyn där du kan verifiera dina segment genom att förhandsgranska och redigera dem så de blir perfekta. Precision är viktigt, se till att läsa riktlinjerna innan du skickar in."},"helpPageCopyOfDatabase":{"message":"Var tar inskickningarna vägen?"},"helpPageCopyOfDatabase1":{"message":"Alla inskickningar läggs in i SponsorBlock-databas som är offentligt släppt för vem som helst att använda och finns på"},"helpPageCopyOfDatabase2":{"message":"Källkoden är fritt tillgänglig. Så, även om något händer mig, är dina inskickningar inte förlorade."},"AdviceForSubmitting":{"message":"Råd för inskickning"},"Credits":{"message":"Medverkande"},"LearnMore":{"message":"Läs mer"},"FullDetails":{"message":"Fullständiga detaljer"},"CopyDownvoteButtonInfo":{"message":"Rösta ner och skapar en lokal kopia för dig att skicka in igen"},"OpenCategoryWikiPage":{"message":"Öppna denna kategoris wiki-sida."},"CopyAndDownvote":{"message":"Kopiera och rösta ner"},"ContinueVoting":{"message":"Fortsätt rösta"},"ChangeCategoryTooltip":{"message":"Detta kommer omedelbart att verkställas till dina segment"},"downvote":{"message":"Rösta ner"},"upvote":{"message":"Rösta upp"},"hideSegment":{"message":"Dölj segment"},"skipSegment":{"message":"Hoppa över segment"},"playChapter":{"message":"Spela kapitel"},"SponsorTimeEditScrollNewFeature":{"message":"Använd mushjulet medan du håller muspekaren över redigeringsrutan för att snabbt justera tiden. Kombinationer av CTRL- eller SKIFT-tangenten kan användas för att finjustera tiden."},"categoryPillNewFeature":{"message":"Nytt! Se när en video är helt sponsrad eller egenreklam"},"yearAbbreviation":{"message":"år","description":"100y"},"dayAbbreviation":{"message":"d","description":"100d"},"hourAbbreviation":{"message":"h","description":"100h"},"optionsTabBehavior":{"message":"Beteende","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Gränssnitt","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Snabbtangenter","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Säkerhetskopiera/återställ","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Övrigt","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Utseende på överhoppningsmeddelanden","description":"Option label"},"unbind":{"message":"Ta bort","description":"Unbind keyboard shortcut"},"notSet":{"message":"Inte inställd"},"change":{"message":"Ändra"},"youtubeKeybindWarning":{"message":"Detta är en inbyggd YouTube-genväg. Är du säker på att du vill använda den?"},"betaServerWarning":{"message":"BETA-servern är aktiverad!"},"openOptionsPage":{"message":"Öppna alternativsidan"},"resetToDefault":{"message":"Återställ inställningar till standard"},"confirmResetToDefault":{"message":"Är du säker på att du vill återställa alla inställningar till deras standardvärden? Detta kan inte ångras."},"exportSegments":{"message":"Exportera segment"},"importSegments":{"message":"Importera segment"},"Import":{"message":"Importera","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Inlöst!"},"redeemFailed":{"message":"Licensnyckeln är ogiltig"},"hideUpsells":{"message":"Dölj alternativ som inte är tillgängliga utan extra betalning"},"hideNewFeatureUpdates":{"message":"Dölj uppmaningar om nya funktioner"},"redeem":{"message":"Lös in"},"enterLicenseKey":{"message":"Ange licensnyckel"},"unsubmittedSegmentCounts":{"message":"Du har för närvarande {0} på {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Du har för närvarande inga oinskickade segment","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"oinskickat segment","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"oinskickade segment","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videor","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Rensa alla segment","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Är du säker på att du vill rensa alla dina oinskickade segment?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Visa segment","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Dölj segment","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video-ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Antal segment","description":"Header of the unsubmitted segments list"},"actions":{"message":"Åtgärder","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Dela som webbadress"},"segmentFetchFailureWarning":{"message":"Varning: Servern har inte skickat ut några segment. Det kan faktiskt finnas segment på den här videon som redan skickats in, men du har inte mottagit dem ännu på grund av problem med servern."},"allowScrollingToEdit":{"message":"Tillåt rullning för att redigera tiden"},"NoticeTimeAfterSkip":{"message":"{seconds}s","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Bättre titlar och miniatyrer på YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Crowdsourcing-titlar och miniatyrer ska vara beskrivande och inte sensationella","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Välj den mest beskrivande"},"Original":{"message":"Original"},"OriginalTitle":{"message":"Originaltitel"},"CurrentTime":{"message":"Aktuell tid"},"resetCustomTitle":{"message":"Återställ titel tillbaka till originaltext"},"resetIcon":{"message":"Återställ ikon"},"TypeYourOwnTitleHere":{"message":"Skriv din egen titel här"},"VideoNotReady":{"message":"Videon är inte klar"},"FailedToRender":{"message":"Det gick inte att rendera","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas saknas","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Undantag vid rendering","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Det gick inte att ladda","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Titelformat"},"Disabled":{"message":"Inaktiverad"},"CapitalizeWords":{"message":"Versalisera ord"},"TitleCase":{"message":"Titelskiftläge"},"SentenceCase":{"message":"Meningsskiftläge"},"LowerCase":{"message":"Gemener"},"FirstLetterUppercase":{"message":"Första bokstaven versal"},"shouldCleanEmojis":{"message":"Ta bort emojis"},"onlyFormatCustomTitles":{"message":"Formatera endast titlar som användaren skickat in"},"onlyTitleCaseInEnglish":{"message":"Använd versaler för icke-engelska titlar"},"onlyTitleCaseInEnglishDescription":{"message":"Språkdetekteringen är inte perfekt och upptäcker vissa engelska titlar som icke-engelska."},"thumbnailFallbackOption":{"message":"När ingen inskickad miniatyrbild finns"},"whatThumbnailFallbackOption":{"message":"När du väljer en slumpmässig tid, kommer den att använda SponsorBlock data för att säkerställa att en tid i ett kampanjsegment inte väljs.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Visa en skärmbild från en slumpmässig tid"},"TheOriginalThumbnail":{"message":"Visa den ursprungliga miniatyrbilden"},"showABlankBox":{"message":"Visa en tom ruta"},"AutoGenerated":{"message":"Visa en automatisk miniatyrbild som skapats av YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Början"},"Middle":{"message":"Mitten"},"keepUnsubmitted":{"message":"Lagra inskickade röster"},"showLiveCover":{"message":"Visa kanalavatar på kommande videor","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Använd aldrig A/B-testade miniatyrbilder"},"ignoreAbThumbnailsDescription":{"message":"Kanaler kan ordna tester på sina videor där YouTube visar olika miniatyrbilder för varje person. Detta alternativ använder alltid den första miniatyrbilden för att upprätthålla konsekvens."},"abThumbnailsWarning":{"message":"Varning: Den här videon kör för närvarande ett A/B-test för miniatyrbilden, vilket innebär att den kan komma att ändras ofta. På grund av denna risk bör du nog inte rösta på den ursprungliga miniatyrbilden."},"whatKeepUnsubmitted":{"message":"Behåll inskickade röster efter att ha röstat för att visa de titlar och miniatyrer som du valde i stället för den högst röstade på servern."},"keepUnsubmittedInPrivate":{"message":"Lagra inskickade röster från privata flikar"},"useThumbnailGenerationService":{"message":"Använd miniatyrbildsgenereringstjänsten"},"titleMaxLines":{"message":"Maximalt antal rader för titel"},"titleMaxLinesDescription":{"message":"Videotitlar kommer att spridas över så här många rader i förslag."},"thumbnailSaturationLevel":{"message":"Miniatyrens mättnadsnivå"},"whatSaturateThumbnails":{"message":"Gör miniatyrerna mindre livfyllda genom att minska deras färg"},"hideDetailsWhileFetching":{"message":"Dölj detaljer under hämtning"},"hideDetailsWhileFetchingDescription":{"message":"Dölj titlar och miniatyrer under hämtning av data från servern. Om inaktiverad kommer du att uppleva blinkande när titlarna och miniatyrerna ändras."},"ignoreTranslatedTitles":{"message":"Visa inte YouTubes översatta titlar","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube kommer ibland att automatiskt översätta titlar till ditt modersmål. Detta alternativ gäller endast när en crowdsourced titel inte är tillgänglig."},"onAllPages":{"message":"På alla sidor","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"På alla sidor utom videosidor","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Aldrig"},"thumbnailGeneratorDescription1":{"message":"Miniatyrbildningstjänsten snabbar avsevärt upp miniatyrbildsgenereringen genom att skicka en anonym begäran med videoID till en fjärrserver. Miniatyrbilden kommer då antingen att genereras eller dras från en cache om den redan har genererats."},"thumbnailGeneratorDescription2":{"message":"Om det används på videosidor kan detta potentiellt läcka olistade videoID till denna server. Ställa in detta till \"på alla sidor utom videosidor\" så kommer detta problemet att försvinna. Ett annat alternativ är att köra din egen miniatyrbildningstjänst."},"thumbnailGeneratorDescription3":{"message":"Om miniatyrbildningstjänsten är inaktiverad kommer alla förfrågningar att använda ett k-anonymitetsfrågesystem vilket gör det svårare för servern att förutsäga vilka videor som hämtades och en långsammare lokal miniatyrbildningstjänst kommer att användas.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Källkod för miniatyrbildsgenereringstjänst"},"moreAboutKAnonymity":{"message":"Mer om k-anonymitet","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Visa alltid knappen \"Visa original\""},"whatAlwaysShowShowOriginalButton":{"message":"Om du alltid vill veta om en titel/miniatyrbild har ändrats, aktivera detta."},"showOriginalOnHover":{"message":"Växla mellan anpassade detaljer och originaldetaljer vid mus över"},"showOriginalOnHoverOfVideo":{"message":"Växla mellan anpassade detaljer och originaldetaljer vid mus över var som helst på grafikkortet"},"showOriginalOnHoverOfVideoDescription":{"message":"Detta inaktiverar automatisk uppspelning vid mus över"},"showCustomOnHoverIfCasual":{"message":"Visa anpassad titel vid mus över om en titel i casualt läge visas"},"showIconForFormattedTitles":{"message":"Visa knappen \"Visa original\" för automatiskt formaterade titlar"},"Enable":{"message":"Aktivera"},"Titles":{"message":"Titlar","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Miniatyrer","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Casuala röster","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Fel"},"ShowOriginal":{"message":"Visa originaldetaljer"},"ShowModified":{"message":"Visa ändrade uppgifter"},"ShowFormatted":{"message":"Visa formaterade detaljer"},"FillerWarning":{"message":"Varning: Detta är en otroligt aggressiv kategori. Du kommer sannolikt att behöva avbryta grejer, eller inaktivera det ibland. Var beredd på att många videor har över 50% eller mer av videon överhoppad! Kom dock i håg att det fortfarande finns specifika riktlinjer att följa när du skickar in.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Gå med i Discord eller Matrix för att permanent stanna kvar i denna chatt","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Visa vägledande hjälp","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Undvik överdrivna ansiktsuttryck","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Tänk helheten, svara inte bara på frågan om originaltitlarna","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Undvik att beskriva reaktioner på videon (\"chockerande\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Ge tillräckligt med information för att göra ett informerat val innan du klickar"},"tip5":{"message":"Använd versaler som i en mening","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Markera alla riktlinjer för att skicka in","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Min titel är versalgemen som en mening","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Min titel svarar inte bara på en fråga som ställts i titeln","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Titlar ska beskriva videon eller berättelsen i allmänhet. Du bör se till att titta på den fullständiga videon för att veta vad det faktiskt handlar om i stället för att förlita sig på en spännande originaltitel.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Min titel sammanfattar inte en slutsats eller förstör onödigt","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Titlar är inte avsedda att ersätta att titta på videon helt, utan i stället tänkt för att du ska veta om du ska klicka eller inte.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Min titel faktakontrollerar, hånar eller kritiserar inte videon eller skaparen","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Titlar är avsedda att vara ur skaparens och videons perspektiv. Betyg eller faktakontroll själva videon är utanför räckvidden för DeArrow. Titlar är inte menade som ett kommentarsfält.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Upptäckta ord: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Använd inte onödiga verb i början av titeln","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Starta alla titlar med en versal. Titlar ska formateras som en mening","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Titlar ska inte sluta med en '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Lägg inte bara till ett svar på en fråga i den ursprungliga titeln. Titlar ska beskriva videon eller berättelsen i allmänhet","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Titlar ska inte faktakontrollera, håna eller kritiserar videon eller skaparen","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Titlar bör inte hålla sensationella element från den ursprungliga titeln","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Titlar ska inte innehålla emojis","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Du måste lösa varningen innan du skickar in"},"dearrowHelpSponsorBlockImported":{"message":"Obs: Dina SponsorBlock-inställningar har automatiskt importerats!"},"howItWorks":{"message":"Så här fungerar det"},"discordPromotion":{"message":"Kom och bidra, kom med nya förslag och hjälp till på {discord} eller {matrix}"},"deArrowDonationText":{"message":"Om du gillar det jag gjort hittills och vill hjälpa mig med pengar, så är här en länk"},"termsAgreement":{"message":"Genom att använda detta tillägg godkänner du {privacy-policy} och {terms}"},"privacyPolicy":{"message":"Integritetspolicy"},"termsOfUse":{"message":"Vilkor"},"openSourceLicenses":{"message":"Licens för öppen källkod"},"defaultToOriginals":{"message":"Visa original videoinformation som standard"},"whatDefaultToOriginals":{"message":"Visa den ursprungliga titeln och miniatyrbilden som standard, men när musen hålls över knappen visas anpassade titlar och miniatyrbilder."},"replaceTitles":{"message":"Ersätt titlar"},"replaceThumbnails":{"message":"Ersätt miniatyrbild"},"useCrowdsourcedTitles":{"message":"Använd crowdsourced titlar"},"whatUseCrowdsourcedTitles":{"message":"Inaktiverad, kommer det att formatera titlar, men inte använda gemenskapens inskickade titlar","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Är du säker på att vill du ta bort den här konfigurationen?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Ny konfiguration"},"DeleteConfiguration":{"message":"Ta bort konfiguration"},"ChannelAllowlist":{"message":"Kanalspecifikainställningar"},"ConfigurationName":{"message":"Konfigurationsnamn"},"ChannelListInstructions":{"message":"Ange vilka kanaler du vill verkställa denna konfiguration på i rutan nedan, åtskilda av nya rader. Både kanal-ID och visningsnamn stöds. @-användarnamn stöds inte. Du finner kanal-ID:t genom att klicka på delaknappen på kanalens omsida. För att komma till omsidan, klicka på kanalbeskrivningen som visas under deras kanalnamn på deras kanalsida.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Inga konfigurationer konfigurerade ännu. Klicka på knappen högst upp för att lägga till en ny konfiguration.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Stoppa klickbete genom att ersätta titlar och miniatyrbilder med mer exakta"},"DeArrowPromotionMessage2":{"message":"Trött på klickbete? Kolla in mitt nya tillägg för att förbättra titlar och miniatyrbilder"},"DeArrowPromotionMessage3":{"message":"Ta även och kolla in DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Gillar du inte den här titeln? Om du föredrar titeln nedan, bör du kolla in funktionen för titelbyte i DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Denna miniatyrbild väljs från en slumpmässig tidsstämpel eftersom det inte finns något inskickat på den här videon ännu","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Denna miniatyrbild väljs från en slumpmässig tidsstämpel och titeln är automatiskt formaterad eftersom det inte finns något inskickat på den här videon ännu","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Du kan ändra denna standard nedan","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} titlar och {thumbnails} miniatyrbilder har ersatts sedan du installerade detta tillägg","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} titel ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} titlar ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"och {thumbnails} miniatyrbild","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"och {thumbnails} miniatyrbilder","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} har ersatts sedan du installerade tillägget","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Räkna titel- och miniatyrbildsersättare"},"countReplacementsDescription":{"message":"Används för att ge dig statistik i popupen.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Lägg till en filterlista för att blockera enkäter, varor och andra kampanjsidelement med hjälp av yt-neuter"},"requiresUblock":{"message":"Kräver uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Något har gått fel med identifieringen av video-ID. Försök att uppdatera innan du skickar in det för att säkerställa att det skickas till rätt video. Om detta händer ofta, skicka en rapport om detta tillsammans med andra tillägg eller användarskript som du har installerat via GitHub, Discord eller Matrix."},"dearrowLogoCredit":{"message":"Logotyp baserad på Twemoji licensierad under CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock är inte kompatibelt med tillägget \"Zoom to Fill\". Det finns många alternativ som du kan använda istället som fungerar korrekt."},"freeTrialStarted":{"message":"Din fria utvärderingsperiod har börjat. Besök YouTube för att testa det"},"freeTrialEnded":{"message":"Din fria utvärderingsperiod är slut"},"freeTrialPrompt":{"message":"Om du vill testa det en timme, kan du starta en gratis utvärderingsperiod med knappen nedan."},"startFreeTrial":{"message":"Påbörja gratis utvärderingsperiod"},"freeAccessRequested":{"message":"Du är registrerad för gratis tillgång. Du kommer att meddelas när gratis tillgång beviljas."},"freeAccessComplete":{"message":"Grattis! Du har nu gratis tillgång till DeArrow"},"DeArrowNotActivated":{"message":"DeArrow är inte aktiverad"},"ActivateDeArrow":{"message":"Aktivera DeArrow"},"DeArrowIsActivated":{"message":"DeArrow har aktiverats"},"Close":{"message":"Stäng"},"ViewLicenseKey":{"message":"Visa licensnyckel"},"SharingIsCaring":{"message":"Delad glädje är dubbel glädje"},"cleanPopup":{"message":"Dölj röran i segmentlistans popup"},"hideSegmentCreationInPopup":{"message":"Dölj knapparna för segmentskapande i popup"},"syncDisabledWarning":{"message":"Varning: Tilläggslagring har inaktiverats i din webbläsare. Inställningarna kommer inte att sparas om du försöker spara dem."},"syncDisabledWarningDeArrow":{"message":"DeArrow fungerar inte utan lagring."},"syncDisabledFirefoxSuggestions":{"message":"Du kan aktivera det genom att gå till about:config och ställa in värdet av \"webextensions.storage.sync.enabled\" till true."},"storageFull":{"message":"Tilläggslagringen är full. Ta bort några oinskickade segment i alternativen."},"previewSegmentRequired":{"message":"Förhandsgranska dina segment innan du skickar in dem. Du kan göra detta genom att klicka på förhandsgranskningsknappen eller använda följande genväg:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Agera som VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Inskickningar accepteras inte från din webbläsare just nu eftersom YouTube verkar ha injicerat vissa server-side-annonser som tillägget inte kan ta bort. Kontakta gärna oss om du får detta felet."},"DeArrowIsDisabled":{"message":"DeArrow är inaktiverat - klicka för att aktivera","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Är du säker på att denna ursprungliga miniatyrbild följer DeArrows riktlinjer? Om du bara föredrar att se originalminiatyrer i allmänhet, överväg att ändra alternativet \"När ingen inskickad miniatyrbild finns\" i DeArrows inställningar.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"På YouTube-TV är SponsorBlock inte kompatibelt med live och nyinspelat innehåll. Om detta är en ny inspelning, vänta några timmar på att den bearbetade versionen av inspelningen ska bli tillgänglig.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Kanalvitlistning stöds inte på tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Gilla den ursprungliga titeln?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Ja"},"No":{"message":"Nej"},"votes":{"message":"{0} röster","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} röst","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Rolig","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Kreativ","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Smart","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Beskrivande","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Annat","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Klassiskt läge","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Titlar ersätts med standardiserade format baserat på riktlinjerna för alla videoklipp där en crowdsourcad titel finns."},"CasualMode":{"message":"Casualt läge","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Behåll originaltitlarna när de beskriver videon tillräckligt bra och är smarta eller roliga.\nVälj vilka kategorier av titlar du vill se.\nDu kommer att kunna rösta om en titel passar in i en kategori eller inte."},"minimumVotes":{"message":"Minsta antal röster","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Visa originalminiatyrbilder på videor som röstats fram i casualt läge","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Ny funktion: Casualt läge","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Visa endast ikonen för casualt läge när en anpassad titel är tillgänglig"},"OpenSettings":{"message":"Öppna inställningar"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/ta/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/ta/messages.json @@ -0,0 +1 @@ +{"0":{"message":"இணைப்பு நேரம் முடிந்தது. உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும். உங்கள் இணையம் இயங்கினால், சேவையகம் அதிக சுமை அல்லது கீழே இருக்கும்."},"400":{"message":"இந்த கோரிக்கை தவறானது என்று சர்வர் கூறினார்"},"409":{"message":"இது ஏற்கனவே சமர்ப்பிக்கப்பட்டுள்ளது"},"502":{"message":"சேவையகம் அதிக சுமை கொண்டதாக தெரிகிறது. சில நொடிகளில் மீண்டும் முயற்சிக்கவும்."},"fullName":{"message":"YouTube க்கான SponsorBlock - ஸ்பான்சர்ஷிப்களைத் தவிர்","description":"Name of the extension."},"Description":{"message":"YouTube வீடியோக்களில் ஸ்பான்சர்ஷிப்கள், சந்தா பிச்சை மற்றும் பலவற்றைத் தவிர்க்கவும். மற்றவர்களின் நேரத்தைச் சேமிக்க நீங்கள் பார்க்கும் வீடியோக்களில் ஸ்பான்சர்களைப் புகாரளிக்கவும்.","description":"Description of the extension."},"channelWhitelisted":{"message":"சேனல் அனுமதிப்பட்டியல்!"},"Segment":{"message":"பிரிவு"},"Segments":{"message":"பிரிவுகள்"},"upvoteButtonInfo":{"message":"இந்த சமர்ப்பிப்பை மேம்படுத்துங்கள்"},"reportButtonTitle":{"message":"அறிக்கை"},"reportButtonInfo":{"message":"இந்த சமர்ப்பிப்பு தவறானது என புகாரளிக்கவும்."},"Dismiss":{"message":"நீக்கு"},"Loading":{"message":"ஏற்றுகிறது..."},"Hide":{"message":"ஒருபோதும் அனுமதிக்காதே"},"hitGoBack":{"message":"நீங்கள் எங்கிருந்து வந்தீர்கள் என்பதைத் தட்டவும்."},"unskip":{"message":"அன்ஸ்கிப்"},"reskip":{"message":"ரெஸ்கிப்"},"unmute":{"message":"ஒலியடக்கு"},"paused":{"message":"இடைநிறுத்தப்பட்டது"},"manualPaused":{"message":"டைமர் நிறுத்தப்பட்டது"},"confirmMSG":{"message":"தனிப்பட்ட மதிப்புகளைத் திருத்த அல்லது நீக்க, தகவல் பொத்தானைக் கிளிக் செய்யவும் அல்லது மேல் வலது மூலையில் உள்ள நீட்டிப்பு ஐகானைக் கிளிக் செய்வதன் மூலம் நீட்டிப்பு பாப்அப்பைத் திறக்கவும்."},"clearThis":{"message":"இதை அழிக்க விரும்புகிறீர்களா?\n\n"},"Unknown":{"message":"உங்கள் ஸ்பான்சர் நேரங்களைச் சமர்ப்பிப்பதில் பிழை ஏற்பட்டது, தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும்."},"sponsorFound":{"message":"இந்த வீடியோவில் தரவுத்தளத்தில் பகுதிகள் உள்ளன!"},"sponsor404":{"message":"எந்தப் பகுதியும் கிடைக்கவில்லை"},"sponsorStart":{"message":"பிரிவு இப்போது தொடங்குகிறது"},"sponsorEnd":{"message":"பிரிவு இப்போது முடிகிறது"},"sponsorCancel":{"message":"உருவாக்கும் பகுதியை ரத்து செய்"},"noVideoID":{"message":"YouTube வீடியோ எதுவும் கிடைக்கவில்லை.\nஇது தவறாக இருந்தால், தாவலைப் புதுப்பிக்கவும்."},"refreshSegments":{"message":"பிரிவுகளைப் புதுப்பிக்கவும்"},"success":{"message":"வெற்றி!"},"voted":{"message":"வாக்களித்தார்!"},"serverDown":{"message":"சேவையகம் செயலிழந்துவிட்டதாகத் தெரிகிறது. டெவலப்பரை உடனடியாக தொடர்பு கொள்ளவும்."},"connectionError":{"message":"இணைப்பு பிழை ஏற்பட்டது. பிழை குறியீடு: "},"clearTimes":{"message":"பிரிவுகளை அழிக்கவும்"},"openPopup":{"message":"ஸ்பான்சர் பிளாக் பாப்அப்பைத் திறக்கவும்"},"closePopup":{"message":"பாப்அப்பை மூடு"},"submitCheck":{"message":"இதை நிச்சயமாக சமர்ப்பிக்க விரும்புகிறீர்களா?"},"whitelistChannel":{"message":"அனுமதிப்பட்டியல் சேனல்"},"removeFromWhitelist":{"message":"அனுமதிப்பட்டியலில் இருந்து சேனலை அகற்று"},"voteOnTime":{"message":"ஒரு பிரிவில் வாக்களியுங்கள்"},"Submissions":{"message":"சமர்ப்பிப்புகள்"},"savedPeopleFrom":{"message":"நீங்கள் மக்களை காப்பாற்றியுள்ளீர்கள் "},"viewLeaderboard":{"message":"லீடர்போர்டு"},"recordTimesDescription":{"message":"சமர்ப்பிக்கவும்"},"submissionEditHint":{"message":"நீங்கள் சமர்ப்பி என்பதைக் கிளிக் செய்த பிறகு பிரிவு எடிட்டிங் தோன்றும்","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"குறிப்பு: விருப்பங்களில் சமர்ப்பிக்க விசைப்பலகைகளை அமைக்கலாம்"},"clearTimesButton":{"message":"நேரங்களை அழி"},"Username":{"message":"பயனர்பெயர்"},"setUsername":{"message":"பயனர்பெயரை அமைக்கவும்"},"copyPublicID":{"message":"பொது பயனர் IDயை நகலெடுக்கவும்"},"copySegmentID":{"message":"துண்டத்தின் IDஐ நகலெடு"},"hideThis":{"message":"இதை மறை"},"Options":{"message":"விருப்பங்கள்"},"showButtons":{"message":"YouTube பிளேயரில் பொத்தான்களைக் காட்டு"},"hideButtonsDescription":{"message":"ஸ்கிப் பிரிவுகளைச் சமர்ப்பிக்க YouTube பிளேயரில் தோன்றும் பொத்தான்களை இது மறைக்கிறது."},"showSkipButton":{"message":"பிளேயரில் Skip To Highlight பொத்தானை வைக்கவும்"},"showInfoButton":{"message":"YouTube பிளேயரில் தகவல் பொத்தானைக் காட்டு"},"autoHideInfoButton":{"message":"தகவல் பொத்தானை தானாக மறைக்கவும்"},"showDeleteButton":{"message":"YouTube பிளேயரில் நீக்கு பொத்தானைக் காட்டு"},"enableViewTracking":{"message":"ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கு"},"whatViewTracking":{"message":"இந்த அம்சம் பயனர்கள் தங்கள் சமர்ப்பிப்பு மற்றவர்களுக்கு எவ்வளவு உதவியது மற்றும் ஸ்பேம் தரவுத்தளத்தில் வரவில்லை என்பதை உறுதிப்படுத்த அப்வோட்களுடன் ஒரு மெட்ரிக்காகப் பயன்படுத்தப்படுவதை பயனர்களுக்குத் தெரியப்படுத்த நீங்கள் எந்த பகுதிகளைத் தவிர்த்துவிட்டீர்கள் என்பதைக் கண்காணிக்கிறது. ஒவ்வொரு முறையும் நீங்கள் ஒரு பகுதியைத் தவிர்க்கும்போது நீட்டிப்பு சேவையகத்திற்கு ஒரு செய்தியை அனுப்புகிறது. பார்வை எண்கள் துல்லியமாக இருக்க பெரும்பாலான மக்கள் இந்த அமைப்பை மாற்ற மாட்டார்கள் என்று நம்புகிறோம். :)"},"enableViewTrackingInPrivate":{"message":"தனிப்பட்ட/மறைநிலை தாவல்களில் ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கவும்"},"enableTrackDownvotes":{"message":"துண்டத்தின் வாக்கிறக்கங்களைச் சேமி"},"whatTrackDownvotes":{"message":"புதுப்பித்தப் பின் நீங்கள் வாக்கிறக்கிய துண்டங்கள் மறைந்தே இருக்கும்"},"trackDownvotesWarning":{"message":"எச்சரிக்கை: இதை முடக்குதல் முன்னர் சேமித்த எல்லா வாக்கிறக்கங்களையும் அழிக்கும்"},"enableQueryByHashPrefix":{"message":"ஹாஷ் முன்னொட்டு மூலம் வினவல்"},"whatQueryByHashPrefix":{"message":"வீடியோஐடியைப் பயன்படுத்தி சேவையகத்திலிருந்து பிரிவுகளைக் கோருவதற்கு பதிலாக, வீடியோஐடியின் ஹாஷின் முதல் 4 எழுத்துக்கள் அனுப்பப்படுகின்றன. இந்த சேவையகம் எல்லா வீடியோக்களுக்கும் ஒத்த ஹாஷ்கள் கொண்ட தரவை திருப்பி அனுப்பும்."},"showNotice":{"message":"அறிவிப்பை மீண்டும் காட்டு"},"showSkipNotice":{"message":"ஒரு பிரிவு தவிர்க்கப்பட்ட பிறகு அறிவிப்பைக் காட்டு"},"noticeVisibilityMode0":{"message":"முழு அளவு தவிர்க்கும் அறிவிப்புகள்"},"noticeVisibilityMode1":{"message":"ஆட்டோ ஸ்கிப்பிற்கான சிறிய ஸ்கிப் அறிவிப்புகள்"},"noticeVisibilityMode2":{"message":"அனைத்து சிறிய தவிர்க்கும் அறிவிப்புகள்"},"noticeVisibilityMode3":{"message":"ஆட்டோ ஸ்கிப்பிற்கான மங்கலான தவிர்க்கும் அறிவிப்புகள்"},"noticeVisibilityMode4":{"message":"அனைத்து மங்கலான தவிர்க்கும் அறிவிப்புகள்"},"longDescription":{"message":"ஸ்பான்சர்கள், அறிமுகங்கள், அவுட்ரோஸ், சந்தா நினைவூட்டல்கள் மற்றும் YouTube வீடியோக்களின் பிற எரிச்சலூட்டும் பகுதிகளைத் தவிர்க்க ஸ்பான்சர் பிளாக் உங்களை அனுமதிக்கிறது. ஸ்பான்சர் பிளாக் என்பது ஒரு கூட்ட நெரிசலான உலாவி நீட்டிப்பாகும், இது ஸ்பான்சர் செய்யப்பட்ட பிரிவுகளின் தொடக்க மற்றும் இறுதி நேரங்களையும் YouTube வீடியோக்களின் பிற பிரிவுகளையும் எவரும் சமர்ப்பிக்கலாம். ஒரு நபர் இந்த தகவலைச் சமர்ப்பித்தவுடன், இந்த நீட்டிப்பு உள்ள மற்றவர்கள் ஸ்பான்சர் செய்யப்பட்ட பிரிவைத் தவிர்த்து விடுவார்கள். இசை வீடியோக்களின் இசை அல்லாத பிரிவுகளையும் நீங்கள் தவிர்க்கலாம்.","description":"Full description of the extension on the store pages."},"website":{"message":"இணையதளம்","description":"Used on Firefox Store Page"},"sourceCode":{"message":"மூல குறியீடு","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"அறிவிப்பு மேம்படுத்தப்பட்டது!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"உங்களுக்கு இன்னும் பிடிக்கவில்லை என்றால், ஒருபோதும் காண்பி பொத்தானை அழுத்தவும்.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"துண்டத்தைக் கெந்து","description":"Keybind label"},"setStartSponsorShortcut":{"message":"துண்டத்தை ஆரம்பி/நிறுத்து","description":"Keybind label"},"setSubmitKeybind":{"message":"துண்டங்களைச் சமர்ப்பி","description":"Keybind label"},"disableSkipping":{"message":"ஸ்கிப்பிங் இயக்கப்பட்டது"},"enableSkipping":{"message":"ஸ்கிப்பிங் முடக்கப்பட்டுள்ளது"},"yourWork":{"message":"உங்கள் வேலை","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"பிழை குறியீடு: "},"skip":{"message":"தவிர்"},"mute":{"message":"ஒலியடக்கு"},"full":{"message":"முழு காணொளி","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} ஐ தவிர்?"},"mute_category":{"message":"{0} ஐ ஒலியடக்கவா?"},"skip_to_category":{"message":"{0} க்குச் செல்லவா?","description":"Used for skipping to things (Skip to Highlight)"},"skipped":{"message":"{0} தவிர்க்கப்பட்டது","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} ஒலியடக்கப்பட்டது","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"{0} தவிர்க்கப்பட்டது","description":"Used for skipping to things (Skipped to Highlight)"},"disableAutoSkip":{"message":"ஆட்டோ ஸ்கிப்பை முடக்கு"},"enableAutoSkip":{"message":"ஆட்டோ ஸ்கிப்பை இயக்கு"},"audioNotification":{"message":"தவிர்க்க ஆடியோ அறிவிப்பு"},"audioNotificationDescription":{"message":"ஒரு பகுதியைத் தவிர்க்கும்போதெல்லாம் ஸ்கிப்பில் ஆடியோ அறிவிப்பு ஒலிக்கும். முடக்கப்பட்டிருந்தால் (அல்லது தானாகத் தவிர் முடக்கப்பட்டுள்ளது), ஒலி எதுவும் இயக்கப்படாது."},"showTimeWithSkips":{"message":"அகற்றப்பட்ட ஸ்கிப்களுடன் நேரத்தைக் காட்டு"},"showTimeWithSkipsDescription":{"message":"இந்த நேரம் தற்போதைய நேரத்திற்கு அடுத்த அடைப்புக்குறிக்குள் தோன்றும். இது எந்தவொரு வீடியோவிற்கும் கழித்த மொத்த வீடியோ கால அளவைக் காட்டுகிறது. இதில் \"சீக்பாரில் காண்பி\" என்று மட்டுமே குறிக்கப்பட்ட பகுதிகள் அடங்கும்."},"youHaveSkipped":{"message":"நீங்கள் தவிர்த்துவிட்டீர்கள் "},"minLower":{"message":"நிமிடம்"},"minsLower":{"message":"நிமிடங்கள்"},"hourLower":{"message":"மணி"},"hoursLower":{"message":"மணி"},"youHaveSavedTime":{"message":"நீங்கள் மக்களைக் காப்பாற்றியுள்ளீர்கள்","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" அவர்களின் வாழ்க்கையில்","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"சேவையக நிலைக்கு status.sponsor.ajay.app ஐச் சரிபார்க்கவும்."},"whatChangeUserID":{"message":"இதை தனிப்பட்டதாக வைத்திருக்க வேண்டும். இது கடவுச்சொல் போன்றது, அதை யாருடனும் பகிரக்கூடாது. யாரிடமாவது இது இருந்தால், அவர் உங்களைப் போல் ஆள்மாறாட்டம் செய்யலாம். உங்கள் பொது பயனர் IDயை நீங்கள் தேடுகிறீர்களானால், பாப்அப்பில் உள்ள கிளிப்போர்டு ஐகானைக் கிளிக் செய்யவும்."},"createdBy":{"message":"உருவாக்கியது"},"supportOtherSites":{"message":"3 வது தரப்பு YouTube-தளங்களை ஆதரிக்கவும்"},"supportedSites":{"message":"ஆதரிக்கப்படும் தளங்கள்: "},"optionsInfo":{"message":"ஆக்கிரமிப்பு ஆதரவை இயக்கு, ஆட்டோஸ்கிப்பை முடக்கு, பொத்தான்களை மறை மற்றும் பலவற்றை."},"addInvidiousInstance":{"message":"3 வது தரப்பு தளங்களை சேர்க்கவும்"},"addInvidiousInstanceDescription":{"message":"தனிப்பட்ட தளங்களை சேர்க்கவும். இது Domain வடிவமைப்பில் இருக்க வேண்டும். உதாரணம்: invidious.ajay.app"},"add":{"message":"சேர்"},"addInvidiousInstanceError":{"message":"இது தவறான களமாகும். இது டொமைன் பகுதியை மட்டுமே கொண்டிருக்க வேண்டும். எடுத்துக்காட்டு: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Invidous நிகழ்வு பட்டியலை மீட்டமைக்கவும்"},"resetInvidiousInstanceAlert":{"message":"Invidous நிகழ்வு பட்டியலை மீட்டமைக்கவும்"},"currentInstances":{"message":"தற்போதைய நிகழ்வுகள்:"},"minDuration":{"message":"குறைந்தபட்ச காலம் (விநாடிகள்):"},"minDurationDescription":{"message":"தொகுப்பு மதிப்பை விடக் குறைவான பகுதிகள் தவிர்க்கப்படாது அல்லது பிளேயரில் காண்பிக்கப்படாது."},"skipNoticeDuration":{"message":"அறிவிப்பு காலத்தை தவிர்க்கவும் (வினாடிகள்):"},"skipNoticeDurationDescription":{"message":"தவிர்க்கும் அறிவிப்பு குறைந்தபட்சம் இவ்வளவு நேரம் திரையில் இருக்கும். மேனுவல் ஸ்கிப்பிங்கிற்கு, இது நீண்ட நேரம் தெரியும்."},"shortCheck":{"message":"பின்வரும் சமர்ப்பிப்பு உங்கள் குறைந்தபட்ச கால விருப்பத்தை விட குறைவாக உள்ளது. இது ஏற்கனவே சமர்ப்பிக்கப்பட்டுள்ளது என்பதையும், இந்த விருப்பத்தின் காரணமாக புறக்கணிக்கப்படுவதையும் இது குறிக்கலாம். நீங்கள் சமர்ப்பிக்க விரும்புகிறீர்களா?"},"showUploadButton":{"message":"பதிவேற்ற பொத்தானைக் காட்டு"},"customServerAddress":{"message":"ஸ்பான்சர் பிளாக் சேவையக முகவரி"},"customServerAddressDescription":{"message":"சேவையகத்திற்கு அழைப்புகளைச் செய்ய ஸ்பான்சர் பிளாக் பயன்படுத்தும் முகவரி.\nஉங்களிடம் உங்கள் சொந்த சேவையக நிகழ்வு இல்லையென்றால், இதை மாற்றக்கூடாது."},"save":{"message":"சேமி"},"reset":{"message":"மீட்டமை"},"customAddressError":{"message":"இந்த முகவரி சரியான வடிவத்தில் இல்லை. உங்களிடம் ஆரம்பத்தில் http: // அல்லது https: // இருப்பதை உறுதிசெய்து கொள்ளுங்கள்."},"areYouSureReset":{"message":"இதை மீட்டமைக்க விரும்புகிறீர்களா?"},"mobileUpdateInfo":{"message":"m.youtube.com இப்போது துணைபுரிகிறது"},"exportOptions":{"message":"அனைத்து விருப்பங்களையும் இறக்குமதி / ஏற்றுமதி"},"exportOptionsCopy":{"message":"திருத்து/நகலெடு"},"exportOptionsDownload":{"message":"கோப்பிற்கு சேமி"},"exportOptionsUpload":{"message":"கோப்பிலிருந்து ஏற்று"},"setOptions":{"message":"விருப்பங்களை அமைக்கவும்"},"exportOptionsWarning":{"message":"எச்சரிக்கை: விருப்பங்களை மாற்றுவது நிரந்தரமானது மற்றும் உங்கள் நிறுவலை உடைக்கலாம். இதை நிச்சயமாக செய்ய விரும்புகிறீர்களா? உங்கள் பழையதை காப்புப்பிரதி எடுக்க உறுதிசெய்க."},"incorrectlyFormattedOptions":{"message":"இந்த JSON சரியாக வடிவமைக்கப்படவில்லை. உங்கள் விருப்பங்கள் மாற்றப்படவில்லை."},"confirmNoticeTitle":{"message":"பகுதியை சமர்ப்பிக்கவும்"},"submit":{"message":"சமர்ப்பிக்கவும்"},"cancel":{"message":"ரத்துசெய்"},"delete":{"message":"அழி"},"preview":{"message":"முன்னோட்ட"},"unsubmitted":{"message":"சமர்ப்பிக்கப்படவில்லை"},"inspect":{"message":"ஆய்வு செய்யுங்கள்"},"edit":{"message":"தொகு"},"copyDebugInformation":{"message":"பிழைத்திருத்த தகவலை கிளிப்போர்டுக்கு நகலெடுக்கவும்"},"copyDebugInformationFailed":{"message":"கிளிப்போர்டுக்கு எழுத முடியவில்லை"},"copyDebugInformationOptions":{"message":"ஒரு பிழையை எழுப்பும்போது / ஒரு டெவலப்பர் கோருகையில் ஒரு டெவலப்பருக்கு வழங்க வேண்டிய தகவலை கிளிப்போர்டுக்கு நகலெடுக்கிறது. உங்கள் பயனர் ஐடி, அனுமதிப்பட்டியல் சேனல்கள் மற்றும் தனிப்பயன் சேவையக முகவரி போன்ற உணர்திறன் தகவல்கள் அகற்றப்பட்டுள்ளன. இருப்பினும் இது உங்கள் பயனர், உலாவி, இயக்க முறைமை மற்றும் நீட்டிப்பு பதிப்பு எண் போன்ற தகவல்களைக் கொண்டுள்ளது. "},"copyDebugInformationComplete":{"message":"பிழைத்திருத்த தகவல்கள் கிளிப் போர்டில் நகலெடுக்கப்பட்டுள்ளன. நீங்கள் பகிர விரும்பாத எந்த தகவலையும் அகற்ற தயங்க. இதை உரை கோப்பில் சேமிக்கவும் அல்லது பிழை அறிக்கையில் ஒட்டவும்."},"to":{"message":"க்கு","description":"Used between segments. Example: 1:20 to 1:30"},"category_sponsor":{"message":"ஸ்பான்சர்"},"category_sponsor_description":{"message":"கட்டண பதவி உயர்வு, கட்டண பரிந்துரைகள் மற்றும் நேரடி விளம்பரங்கள். சுய விளம்பரத்திற்காகவோ அல்லது அவர்கள் விரும்பும் காரணங்கள் / படைப்பாளிகள் / வலைத்தளங்கள் / தயாரிப்புகளுக்கு இலவசக் கூச்சலுக்காகவோ அல்ல."},"category_selfpromo":{"message":"செலுத்தப்படாத / சுய ஊக்குவிப்பு"},"category_selfpromo_description":{"message":"செலுத்தப்படாத அல்லது சுய விளம்பரத்தைத் தவிர \"ஸ்பான்சர்\" போன்றது. பொருட்கள், நன்கொடைகள் அல்லது அவர்கள் யாருடன் ஒத்துழைத்தார்கள் என்பது பற்றிய தகவல்கள் இதில் அடங்கும்."},"category_exclusive_access":{"message":"பிரத்யேக அணுகல்"},"category_interaction":{"message":"தொடர்பு நினைவூட்டல் (குழுசேர்)"},"category_interaction_description":{"message":"உள்ளடக்கத்தின் நடுவில் அவற்றைப் பிடிக்க, குழுசேர அல்லது பின்பற்ற ஒரு குறுகிய நினைவூட்டல் இருக்கும்போது. இது நீண்டதாகவோ அல்லது குறிப்பிட்ட ஒன்றைப் பற்றியோ இருந்தால், அதற்கு பதிலாக அது சுய விளம்பரத்தின் கீழ் இருக்க வேண்டும்."},"category_interaction_short":{"message":"தொடர்பு நினைவூட்டல்"},"category_intro":{"message":"இடைமறிப்பு / அறிமுக அனிமேஷன்"},"category_intro_description":{"message":"உண்மையான உள்ளடக்கம் இல்லாத இடைவெளி. இடைநிறுத்தம், நிலையான சட்டகம், மீண்டும் மீண்டும் அனிமேஷன் இருக்கலாம். தகவல்களைக் கொண்ட மாற்றங்களுக்கு இது பயன்படுத்தப்படக்கூடாது."},"category_intro_short":{"message":"இடைமறிப்பு"},"category_outro":{"message":"எண்ட்கார்டுகள் / வரவு"},"category_outro_description":{"message":"வரவுகளை அல்லது YouTube எண்ட்கார்டுகள் தோன்றும் போது. தகவலுடன் முடிவுகளுக்கு அல்ல."},"category_music_offtopic":{"message":"இசை: இசை அல்லாத பிரிவு"},"category_music_offtopic_description":{"message":"இசை வீடியோக்களில் மட்டுமே பயன்படுத்த வேண்டும். இது ஏற்கனவே மற்றொரு வகையால் மூடப்பட்டிருக்கும் இசை வீடியோக்களின் பிரிவுகளுக்கு மட்டுமே பயன்படுத்தப்பட வேண்டும்."},"category_music_offtopic_short":{"message":"இசை அல்லாதது"},"category_poi_highlight":{"message":"முன்னிலைப்படுத்த"},"category_poi_highlight_description":{"message":"பெரும்பாலான மக்கள் தேடும் வீடியோவின் பகுதி. \"வீடியோ x இல் தொடங்குகிறது\" போன்றது."},"category_livestream_messages":{"message":"லைவ்ஸ்ட்ரீம்: நன்கொடை / செய்தி அளவீடுகள்"},"category_livestream_messages_short":{"message":"செய்தி வாசிப்பு"},"autoSkip":{"message":"ஆட்டோ ஸ்கிப்"},"manualSkip":{"message":"கையேடு தவிர்"},"showOverlay":{"message":"சீக் பட்டியில் காட்டு"},"disable":{"message":"முடக்கு"},"autoSkip_POI":{"message":"துவக்கத்திற்கு தானாகக் கெந்து"},"manualSkip_POI":{"message":"காணொளி ஏறுகையில் கேள்"},"previewColor":{"message":"சமர்ப்பிக்கப்படாதவை நிறம்","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"பார் வண்ணத்தைத் தேடுங்கள்"},"category":{"message":"வகை"},"skipOption":{"message":"விருப்பத்தைத் தவிர்","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"பீட்டா சோதனை சேவையகத்தை இயக்கு"},"whatEnableTestingServer":{"message":"உங்கள் சமர்ப்பிப்புகள் மற்றும் வாக்குகள் பிரதான சேவையகத்தை நோக்கி வராது. சோதனைக்கு மட்டுமே இதைப் பயன்படுத்தவும்."},"testingServerWarning":{"message":"சோதனை சேவையகத்துடன் இணைக்கும்போது அனைத்து சமர்ப்பிப்புகளும் வாக்குகளும் பிரதான சேவையகத்தை நோக்கி வராது. நீங்கள் உண்மையான சமர்ப்பிப்புகளை செய்ய விரும்பும்போது இதை முடக்க உறுதிப்படுத்தவும்."},"bracketNow":{"message":"(இப்போது)"},"moreCategories":{"message":"மேலும் வகைகள்"},"chooseACategory":{"message":"ஒரு வகையைத் தேர்வுசெய்க"},"enableThisCategoryFirst":{"message":"\"{0}\" வகையுடன் பிரிவுகளைச் சமர்ப்பிக்க, நீங்கள் அதை விருப்பங்களில் இயக்க வேண்டும். நீங்கள் இப்போது விருப்பங்களுக்கு திருப்பி விடப்படுவீர்கள்.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"youMustSelectACategory":{"message":"நீங்கள் சமர்ப்பிக்கும் அனைத்து பிரிவுகளுக்கும் ஒரு வகையைத் தேர்ந்தெடுக்க வேண்டும்!"},"bracketEnd":{"message":"(முடிவு)"},"hiddenDueToDownvote":{"message":"மறைக்கப்பட்ட: கீழ்நோக்கி"},"hiddenDueToDuration":{"message":"மறைக்கப்பட்ட: மிகக் குறுகிய"},"manuallyHidden":{"message":"கைமுறையாக மறைக்கப்பட்டது"},"acceptPermission":{"message":"அனுமதியை ஏற்றுக்கொள்"},"permissionRequestSuccess":{"message":"அனுமதி கோரிக்கை வெற்றி!"},"forceChannelCheck":{"message":"தவிர்ப்பதற்கு முன் சேனல் சோதனை கட்டாயப்படுத்தவும்"},"whatForceChannelCheck":{"message":"இயல்பாக, சேனல் என்னவென்று கூடத் தெரிவதற்கு முன்பே அது பிரிவுகளைத் தவிர்க்கும். இயல்பாக, வீடியோவின் தொடக்கத்தில் சில பகுதிகள் அனுமதிப்பட்டியல் சேனல்களில் தவிர்க்கப்படலாம். இந்த விருப்பத்தை இயக்குவது இதைத் தடுக்கும், ஆனால் சேனல் ஐடியைப் பெறுவதற்கு சிறிது நேரம் ஆகலாம் என்பதால் எல்லா ஸ்கிப்பிங்கையும் சிறிது தாமதப்படுத்துகிறது. உங்களிடம் வேகமான இணையம் இருந்தால் இந்த தாமதம் கவனிக்கப்படாமல் இருக்கலாம்."},"forceChannelCheckPopup":{"message":"\"தவிர்க்கும் முன் சேனல் சரிபார்ப்பை\" இயக்குவதைக் கருத்தில் கொள்ளுங்கள்"},"downvoteDescription":{"message":"தவறான / தவறான நேரம்"},"incorrectCategory":{"message":"வகையை மாற்று"},"nonMusicCategoryOnMusic":{"message":"இந்த வீடியோ இசை என வகைப்படுத்தப்பட்டுள்ளது. இதற்கு ஒரு ஸ்பான்சர் இருப்பதை நீங்கள் உறுதியாக நம்புகிறீர்களா? இது உண்மையில் \"இசை அல்லாத பிரிவு\" என்றால், நீட்டிப்பு விருப்பங்களைத் திறந்து இந்த வகையை இயக்கவும். பின்னர், நீங்கள் இந்த பகுதியை ஸ்பான்சருக்கு பதிலாக \"இசை அல்லாதது\" என்று சமர்ப்பிக்கலாம். நீங்கள் குழப்பமாக இருந்தால் வழிகாட்டுதல்களைப் படிக்கவும்."},"multipleSegments":{"message":"பல பிரிவுகள்"},"guidelines":{"message":"வழிகாட்டுதல்கள்"},"readTheGuidelines":{"message":"வழிகாட்டுதல்களைப் படியுங்கள்!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"வகைகள் இங்கே!"},"categoryUpdate2":{"message":"அறிமுகங்கள், அவுட்ரோஸ், மெர்ச் போன்றவற்றைத் தவிர்க்க விருப்பங்களைத் திறக்கவும்."},"help":{"message":"உதவி"},"GotIt":{"message":"புரிந்தது","description":"Used as the button to dismiss a tooltip"},"hideForever":{"message":"என்றென்றும் மறை"},"Donate":{"message":"கொடையளி"},"hideDonationLink":{"message":"நன்கொடை இணைப்பை மறை"},"darkModeOptionsPage":{"message":"தெரிவுகள் பக்கத்தில் இருண்ட பயன்முறை"},"helpPageThanksForInstalling":{"message":"ஸ்பான்சர்ப்ளாக் நிறுவியதற்கு நன்றி."},"ContinueVoting":{"message":"தொடர்ந்து வாக்களி"},"ChangeCategoryTooltip":{"message":"இது உம் துண்டங்களை உடனடியாகச் செயல்படுத்தும்"},"downvote":{"message":"வாக்கிறக்கு"},"upvote":{"message":"வாக்கேற்று"},"hideSegment":{"message":"துண்டத்தை மறை"},"dayAbbreviation":{"message":"நா","description":"100d"},"hourAbbreviation":{"message":"ம","description":"100h"},"optionsTabBehavior":{"message":"நடத்தை","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"இடைமுகம்","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"விசைப்பலகை குறுக்குவழிகள்","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"காப்புநகல்/மீட்டெடுப்பு","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"இதர","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"notSet":{"message":"அமைக்கவில்லை"},"change":{"message":"மாற்று"},"betaServerWarning":{"message":"பீட்டா சேவையகம் இயக்கப்பட்டுள்ளது!"},"openOptionsPage":{"message":"தெரிவுகள் பக்கத்தைத் திற"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/te/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/te/messages.json @@ -0,0 +1 @@ +{"0":{"message":"అనుసంధాన సమయం సమాప్తం. మీ ఇంటర్నెట్ కనెక్షన్‌ను తనిఖీ చేయండి. మీ ఇంటర్నెట్ పనిచేస్తుంటే, సర్వర్ ఓవర్‌లోడ్ లేదా డౌన్ అయి ఉండవచ్చు."},"400":{"message":"ఈ అభ్యర్థన చెల్లదని సర్వర్ తెలిపింది"},"409":{"message":"ఇది ఇప్పటికే ముందు సమర్పించబడింది"},"502":{"message":"సర్వర్ ఓవర్‌లోడ్ అయినట్లు ఉంది. కొన్ని సెకన్లలో మళ్ళీ ప్రయత్నించండి."},"fullName":{"message":"YouTube కోసం SponsorBlock - స్పాన్సర్‌షిప్‌లను దాటవేయి","description":"Name of the extension."},"Description":{"message":"YouTube వీడియోలలో స్పాన్సర్‌షిప్‌లు, సభ్యత్వ యాచన మరియు మరిన్ని దాటవేయండి. ఇతరుల సమయాన్ని ఆదా చేయడానికి మీరు చూసే వీడియోలపై స్పాన్సర్‌లను నివేదించండి.","description":"Description of the extension."},"channelWhitelisted":{"message":"ఛానెల్ వైట్‌లిస్ట్!"},"Segment":{"message":"విభాగం"},"Segments":{"message":"విభాగాలు"},"upvoteButtonInfo":{"message":"ఈ సమర్పణను పెంచండి"},"reportButtonTitle":{"message":"నివేదిక"},"reportButtonInfo":{"message":"ఈ సమర్పణ తప్పు అని నివేదించండి."},"Dismiss":{"message":"రద్దుచేసే"},"Loading":{"message":"లోడ్ అవుతుంది..."},"Hide":{"message":"నెవర్ షో"},"hitGoBack":{"message":"మీరు ఎక్కడి నుండి వచ్చారో అన్‌స్కిప్ నొక్కండి."},"unskip":{"message":"అన్‌స్కిప్"},"reskip":{"message":"రెస్కిప్"},"paused":{"message":"పాజ్ చేయబడింది"},"manualPaused":{"message":"టైమర్ ఆగిపోయింది"},"confirmMSG":{"message":"వ్యక్తిగత విలువలను సవరించడానికి లేదా తొలగించడానికి, ఎగువ కుడి మూలలోని పొడిగింపు చిహ్నాన్ని క్లిక్ చేయడం ద్వారా సమాచార బటన్‌ను క్లిక్ చేయండి లేదా పొడిగింపు పాపప్‌ను తెరవండి."},"clearThis":{"message":"మీరు దీన్ని ఖచ్చితంగా క్లియర్ చేయాలనుకుంటున్నారా?\n\n"},"Unknown":{"message":"మీ స్పాన్సర్ సమయాన్ని సమర్పించడంలో లోపం ఉంది, దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి."},"sponsorFound":{"message":"ఈ వీడియో డేటాబేస్లో విభాగాలు ఉన్నాయి!"},"sponsor404":{"message":"విభాగాలు ఏవీ కనుగొనబడలేదు"},"sponsorStart":{"message":"విభాగం ఇప్పుడు ప్రారంభమవుతుంది"},"sponsorEnd":{"message":"సెగ్మెంట్ ఇప్పుడు ముగుస్తుంది"},"noVideoID":{"message":"YouTube వీడియో కనుగొనబడలేదు.\nఇది తప్పు అయితే, టాబ్‌ను రిఫ్రెష్ చేయండి."},"success":{"message":"విజయం!"},"voted":{"message":"ఓటు వేశారు!"},"serverDown":{"message":"సర్వర్ డౌన్ అయిందనిపిస్తోంది. వెంటనే డెవలపర్‌ను సంప్రదించండి."},"connectionError":{"message":"కనెక్షన్ లోపం సంభవించింది. లోపం కోడ్: "},"clearTimes":{"message":"విభాగాలను క్లియర్ చేయండి"},"openPopup":{"message":"స్పాన్సర్బ్లాక్ పాపప్‌ను తెరవండి"},"closePopup":{"message":"పాపప్ మూసివేయండి"},"submitCheck":{"message":"మీరు దీన్ని ఖచ్చితంగా సమర్పించాలనుకుంటున్నారా?"},"whitelistChannel":{"message":"వైట్‌లిస్ట్ ఛానెల్"},"removeFromWhitelist":{"message":"వైట్‌లిస్ట్ నుండి ఛానెల్‌ని తొలగించండి"},"voteOnTime":{"message":"ఒక విభాగంలో ఓటు వేయండి"},"Submissions":{"message":"సమర్పణలు"},"savedPeopleFrom":{"message":"మీరు ప్రజలను రక్షించారు "},"viewLeaderboard":{"message":"లీడర్‌బోర్డ్"},"recordTimesDescription":{"message":"సమర్పించండి"},"submissionEditHint":{"message":"మీరు సమర్పించు క్లిక్ చేసిన తర్వాత విభాగం సవరణ కనిపిస్తుంది","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"సూచన: మీరు ఎంపికలలో సమర్పించడానికి కీబైండ్లను సెటప్ చేయవచ్చు"},"clearTimesButton":{"message":"టైమ్స్ క్లియర్"},"Username":{"message":"వినియోగదారు పేరు"},"setUsername":{"message":"వినియోగదారు పేరును సెట్ చేయండి"},"hideThis":{"message":"దీన్ని దాచండి"},"Options":{"message":"ఎంపికలు"},"showButtons":{"message":"YouTube ప్లేయర్‌లో బటన్లను చూపించు"},"hideButtonsDescription":{"message":"దాటవేసే విభాగాలను సమర్పించడానికి ఇది YouTube ప్లేయర్‌లో కనిపించే బటన్లను దాచిపెడుతుంది."},"showInfoButton":{"message":"YouTube ప్లేయర్‌లో సమాచారం బటన్‌ను చూపించు"},"showDeleteButton":{"message":"YouTube ప్లేయర్‌లో తొలగించు బటన్‌ను చూపించు"},"enableViewTracking":{"message":"స్కిప్ కౌంట్ ట్రాకింగ్‌ను ప్రారంభించండి"},"whatViewTracking":{"message":"ఈ ఫీచర్ మీరు సమర్పించిన విభాగాలు వినియోగదారులకు వారి సమర్పణ ఇతరులకు ఎంతవరకు సహాయపడిందో తెలియజేయడానికి మరియు స్పామ్ డేటాబేస్లోకి రాకుండా చూసుకోవటానికి అప్‌వోట్‌లతో పాటు మెట్రిక్‌గా ఉపయోగించబడుతుందని ట్రాక్ చేస్తుంది. మీరు ప్రతి విభాగాన్ని దాటవేసిన ప్రతిసారీ పొడిగింపు సర్వర్‌కు సందేశాన్ని పంపుతుంది. వీక్షణ సంఖ్యలు ఖచ్చితమైనవి కాబట్టి చాలా మంది ఈ సెట్టింగ్‌ను మార్చరు. :)"},"enableQueryByHashPrefix":{"message":"హాష్ ఉపసర్గ ద్వారా ప్రశ్న"},"whatQueryByHashPrefix":{"message":"వీడియోఐడిని ఉపయోగించి సర్వర్ నుండి విభాగాలను అభ్యర్థించే బదులు, వీడియోఐడి యొక్క హాష్ యొక్క మొదటి 4 అక్షరాలు పంపబడతాయి. ఈ సర్వర్ సారూప్య హాష్‌లతో ఉన్న అన్ని వీడియోల కోసం డేటాను తిరిగి పంపుతుంది."},"showNotice":{"message":"మళ్ళీ నోటీసు చూపించు"},"showSkipNotice":{"message":"ఒక విభాగం దాటవేయబడిన తర్వాత నోటీసు చూపించు"},"longDescription":{"message":"స్పాన్సర్లు, పరిచయాలు, ros ట్రోలు, చందా రిమైండర్‌లు మరియు YouTube వీడియోల యొక్క ఇతర బాధించే భాగాలను దాటవేయడానికి స్పాన్సర్‌బ్లాక్ మిమ్మల్ని అనుమతిస్తుంది. స్పాన్సర్బ్లాక్ అనేది క్రౌడ్ సోర్స్డ్ బ్రౌజర్ పొడిగింపు, ఇది ఎవరైనా స్పాన్సర్ చేసిన విభాగాలు మరియు యూట్యూబ్ వీడియోల యొక్క ప్రారంభ మరియు ముగింపు సమయాన్ని సమర్పించనివ్వండి. ఒక వ్యక్తి ఈ సమాచారాన్ని సమర్పించిన తర్వాత, ఈ పొడిగింపు ఉన్న ప్రతి ఒక్కరూ ప్రాయోజిత విభాగంలో దాటవేస్తారు. మీరు మ్యూజిక్ వీడియోల యొక్క నాన్-మ్యూజిక్ విభాగాలను కూడా దాటవేయవచ్చు.","description":"Full description of the extension on the store pages."},"website":{"message":"వెబ్‌సైట్","description":"Used on Firefox Store Page"},"sourceCode":{"message":"మూల కోడ్","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"నోటీసు అప్‌గ్రేడ్ చేయబడింది!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"మీకు ఇంకా నచ్చకపోతే, ఎప్పుడూ చూపించు బటన్ నొక్కండి.","description":"The second line of the message displayed after the notice was upgraded."},"disableSkipping":{"message":"దాటవేయడం ప్రారంభించబడింది"},"enableSkipping":{"message":"దాటవేయడం నిలిపివేయబడింది"},"yourWork":{"message":"నీ పని","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"లోపం కోడ్: "},"skip":{"message":"దాటవేయి"},"skip_category":{"message":"{0} ని దాటవేయాలా?"},"disableAutoSkip":{"message":"ఆటో దాటవేయిని ఆపివేయి"},"enableAutoSkip":{"message":"ఆటో దాటవేయిని ప్రారంభించండి"},"audioNotification":{"message":"దాటవేసిన ఆడియో నోటిఫికేషన్"},"audioNotificationDescription":{"message":"ఒక విభాగం దాటవేయబడినప్పుడల్లా స్కిప్‌లోని ఆడియో నోటిఫికేషన్ ధ్వనిని ప్లే చేస్తుంది. నిలిపివేయబడితే (లేదా ఆటో స్కిప్ నిలిపివేయబడింది), శబ్దం ప్లే చేయబడదు."},"showTimeWithSkips":{"message":"తొలగించబడిన స్కిప్‌లతో సమయాన్ని చూపించు"},"showTimeWithSkipsDescription":{"message":"ఈ సమయం సీక్ బార్ క్రింద ప్రస్తుత సమయం పక్కన బ్రాకెట్లలో కనిపిస్తుంది. ఇది మొత్తం వీడియో వ్యవధి మైనస్ ఏదైనా విభాగాలను చూపుతుంది. ఇందులో \"సీక్బార్లో చూపించు\" అని మాత్రమే గుర్తించబడిన విభాగాలు ఉన్నాయి."},"youHaveSkipped":{"message":"మీరు దాటవేశారు "},"minLower":{"message":"నిమిషం"},"minsLower":{"message":"నిమిషాలు"},"hourLower":{"message":"గంట"},"hoursLower":{"message":"గంటలు"},"youHaveSavedTime":{"message":"మీరు ప్రజలను రక్షించారు","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" వారి జీవితాల","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"సర్వర్ స్థితి కోసం status.sponsor.ajay.app ని తనిఖీ చేయండి."},"createdBy":{"message":"సృష్టికర్త"},"optionsInfo":{"message":"ఇన్విడియస్ మద్దతును ప్రారంభించండి, ఆటోస్కిప్‌ను డిసేబుల్ చేయండి, బటన్లను దాచు మరియు మరిన్ని చేయండి."},"add":{"message":"జోడించు"},"addInvidiousInstanceError":{"message":"ఇది చెల్లని డొమైన్. ఇది డొమైన్ భాగాన్ని కలిగి ఉండాలి. ఉదాహరణ: invidious.ajay.app"},"resetInvidiousInstance":{"message":"ఇన్విడియస్ ఇన్‌స్టాన్స్ జాబితాను రీసెట్ చేయండి"},"resetInvidiousInstanceAlert":{"message":"మీరు ఇన్విడియస్ ఉదాహరణ జాబితాను రీసెట్ చేయబోతున్నారు"},"currentInstances":{"message":"ప్రస్తుత సందర్భాలు:"},"minDuration":{"message":"కనిష్ట వ్యవధి (సెకన్లు):"},"minDurationDescription":{"message":"సెట్ విలువ కంటే తక్కువ విభాగాలు దాటవేయబడవు లేదా ప్లేయర్‌లో చూపబడవు."},"shortCheck":{"message":"కింది సమర్పణ మీ కనీస వ్యవధి ఎంపిక కంటే తక్కువగా ఉంటుంది. ఇది ఇప్పటికే సమర్పించబడిందని మరియు ఈ ఎంపిక కారణంగా విస్మరించబడిందని దీని అర్థం. మీరు ఖచ్చితంగా సమర్పించాలనుకుంటున్నారా?"},"showUploadButton":{"message":"అప్‌లోడ్ బటన్ చూపించు"},"customServerAddress":{"message":"స్పాన్సర్బ్లాక్ సర్వర్ చిరునామా"},"customServerAddressDescription":{"message":"స్పాన్సర్‌బ్లాక్ చిరునామా సర్వర్‌కు కాల్ చేయడానికి ఉపయోగిస్తుంది.\nమీకు మీ స్వంత సర్వర్ ఉదాహరణ లేకపోతే, ఇది మార్చబడదు."},"save":{"message":"సేవ్ చేయండి"},"reset":{"message":"రీసెట్ చేయండి"},"customAddressError":{"message":"ఈ చిరునామా సరైన రూపంలో లేదు. మీకు ప్రారంభంలో http: // లేదా https: // ఉందని మరియు వెనుకంజలో స్లాష్‌లు లేవని నిర్ధారించుకోండి."},"areYouSureReset":{"message":"మీరు దీన్ని రీసెట్ చేయాలనుకుంటున్నారా?"},"mobileUpdateInfo":{"message":"m.youtube.com కి ఇప్పుడు మద్దతు ఉంది"},"exportOptions":{"message":"అన్ని ఎంపికలను దిగుమతి / ఎగుమతి చేయండి"},"setOptions":{"message":"ఎంపికలను సెట్ చేయండి"},"exportOptionsWarning":{"message":"హెచ్చరిక: ఎంపికలను మార్చడం శాశ్వతం మరియు మీ ఇన్‌స్టాల్‌ను విచ్ఛిన్నం చేస్తుంది. మీరు దీన్ని ఖచ్చితంగా చేయాలనుకుంటున్నారా? ఒకవేళ మీ పాతదాన్ని బ్యాకప్ చేయాలని నిర్ధారించుకోండి."},"incorrectlyFormattedOptions":{"message":"ఈ JSON సరిగ్గా ఆకృతీకరించబడలేదు. మీ ఎంపికలు మార్చబడలేదు."},"confirmNoticeTitle":{"message":"విభాగాన్ని సమర్పించండి"},"submit":{"message":"సమర్పించండి"},"cancel":{"message":"రద్దు చేయండి"},"delete":{"message":"తొలగించు"},"preview":{"message":"పరిదృశ్యం"},"inspect":{"message":"పరిశీలించండి"},"edit":{"message":"సవరించండి"},"copyDebugInformation":{"message":"డీబగ్ సమాచారాన్ని క్లిప్‌బోర్డ్‌కు కాపీ చేయండి"},"copyDebugInformationFailed":{"message":"క్లిప్‌బోర్డ్‌కు వ్రాయడంలో విఫలమైంది"},"copyDebugInformationOptions":{"message":"బగ్‌ను పెంచేటప్పుడు / డెవలపర్ అభ్యర్థించినప్పుడు డెవలపర్‌కు అందించాల్సిన సమాచారాన్ని క్లిప్‌బోర్డ్‌కు కాపీ చేస్తుంది. మీ యూజర్ ఐడి, వైట్‌లిస్ట్ చేసిన ఛానెల్‌లు మరియు అనుకూల సర్వర్ చిరునామా వంటి సున్నితమైన సమాచారం తొలగించబడింది. అయితే ఇది మీ ఉపయోగకరమైన, బ్రౌజర్, ఆపరేటింగ్ సిస్టమ్ మరియు పొడిగింపు సంస్కరణ సంఖ్య వంటి సమాచారాన్ని కలిగి ఉంటుంది. "},"copyDebugInformationComplete":{"message":"డీబగ్ సమాచారం క్లిప్ బోర్డ్‌కు కాపీ చేయబడింది. మీరు భాగస్వామ్యం చేయని సమాచారాన్ని తొలగించడానికి సంకోచించకండి. దీన్ని టెక్స్ట్ ఫైల్‌లో సేవ్ చేయండి లేదా బగ్ రిపోర్ట్‌లో అతికించండి."},"to":{"message":"కు","description":"Used between segments. Example: 1:20 to 1:30"},"category_sponsor":{"message":"స్పాన్సర్"},"category_sponsor_description":{"message":"చెల్లింపు ప్రమోషన్, చెల్లింపు సూచనలు మరియు ప్రత్యక్ష ప్రకటనలు. స్వీయ-ప్రమోషన్ కోసం లేదా వారు ఇష్టపడే కారణాలు / సృష్టికర్తలు / వెబ్‌సైట్లు / ఉత్పత్తులకు ఉచిత అరవడం కోసం కాదు."},"category_selfpromo":{"message":"చెల్లించని / స్వీయ ప్రమోషన్"},"category_selfpromo_description":{"message":"చెల్లించని లేదా స్వీయ ప్రమోషన్ మినహా \"స్పాన్సర్\" మాదిరిగానే. వాణిజ్య వస్తువులు, విరాళాలు లేదా వారు ఎవరితో సహకరించారు అనే సమాచారం గురించి విభాగాలు ఇందులో ఉన్నాయి."},"category_interaction":{"message":"ఇంటరాక్షన్ రిమైండర్ (సబ్‌స్క్రయిబ్)"},"category_interaction_description":{"message":"కంటెంట్ మధ్యలో వాటిని ఇష్టపడటానికి, సభ్యత్వాన్ని పొందటానికి లేదా అనుసరించడానికి చిన్న రిమైండర్ ఉన్నప్పుడు. ఇది పొడవైనది లేదా ఏదైనా ప్రత్యేకమైనది అయితే, అది బదులుగా స్వీయ ప్రమోషన్ కింద ఉండాలి."},"category_interaction_short":{"message":"ఇంటరాక్షన్ రిమైండర్"},"category_intro":{"message":"ఇంటర్‌మిషన్ / ఇంట్రో యానిమేషన్"},"category_intro_description":{"message":"అసలు కంటెంట్ లేని విరామం. విరామం, స్టాటిక్ ఫ్రేమ్, పునరావృత యానిమేషన్ కావచ్చు. సమాచారాన్ని కలిగి ఉన్న పరివర్తనలకు ఇది ఉపయోగించరాదు."},"category_intro_short":{"message":"అంతరాయం"},"category_outro":{"message":"ఎండ్ కార్డులు / క్రెడిట్స్"},"category_outro_description":{"message":"క్రెడిట్స్ లేదా YouTube ఎండ్‌కార్డ్‌లు కనిపించినప్పుడు. సమాచారంతో తీర్మానాల కోసం కాదు."},"category_music_offtopic":{"message":"సంగీతం: నాన్-మ్యూజిక్ విభాగం"},"category_music_offtopic_description":{"message":"మ్యూజిక్ వీడియోలలో మాత్రమే ఉపయోగం కోసం. ఇది ఇప్పటికే మరొక వర్గం ద్వారా కవర్ చేయని సంగీతం వీడియోల విభాగాలకు మాత్రమే ఉపయోగించాలి."},"category_music_offtopic_short":{"message":"నాన్-మ్యూజిక్"},"category_livestream_messages":{"message":"లైవ్ స్ట్రీమ్: విరాళం / సందేశ రీడింగులు"},"category_livestream_messages_short":{"message":"సందేశ పఠనం"},"autoSkip":{"message":"ఆటో దాటవేయి"},"manualSkip":{"message":"మాన్యువల్ దాటవేయి"},"showOverlay":{"message":"సీక్ బార్‌లో చూపించు"},"disable":{"message":"డిసేబుల్"},"seekBarColor":{"message":"బార్ కలర్ కోరుకుంటారు"},"category":{"message":"వర్గం"},"skipOption":{"message":"ఎంపికను దాటవేయి","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"బీటా టెస్టింగ్ సర్వర్‌ను ప్రారంభించండి"},"whatEnableTestingServer":{"message":"మీ సమర్పణలు మరియు ఓట్లు ప్రధాన సర్వర్ వైపు లెక్కించబడవు. పరీక్ష కోసం మాత్రమే దీన్ని ఉపయోగించండి."},"testingServerWarning":{"message":"అన్ని సమర్పణలు మరియు ఓట్లు పరీక్ష సర్వర్‌కు కనెక్ట్ చేసేటప్పుడు ప్రధాన సర్వర్ వైపు లెక్కించబడవు. మీరు నిజమైన సమర్పణలు చేయాలనుకున్నప్పుడు దీన్ని నిలిపివేయాలని నిర్ధారించుకోండి."},"bracketNow":{"message":"(ఇప్పుడు)"},"moreCategories":{"message":"మరిన్ని వర్గాలు"},"chooseACategory":{"message":"వర్గాన్ని ఎంచుకోండి"},"enableThisCategoryFirst":{"message":"\"{0}\" వర్గంతో విభాగాలను సమర్పించడానికి, మీరు దీన్ని ఎంపికలలో ప్రారంభించాలి. మీరు ఇప్పుడు ఎంపికలకు మళ్ళించబడతారు.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"youMustSelectACategory":{"message":"మీరు సమర్పించే అన్ని విభాగాల కోసం మీరు తప్పనిసరిగా ఒక వర్గాన్ని ఎంచుకోవాలి!"},"bracketEnd":{"message":"(ముగింపు)"},"hiddenDueToDownvote":{"message":"దాచిన: డౌన్ వోట్"},"hiddenDueToDuration":{"message":"దాచబడింది: చాలా చిన్నది"},"forceChannelCheck":{"message":"దాటవేయడానికి ముందు ఛానెల్ తనిఖీ చేయమని బలవంతం చేయండి"},"whatForceChannelCheck":{"message":"అప్రమేయంగా, ఛానెల్ ఏమిటో తెలియక ముందే ఇది విభాగాలను దాటవేస్తుంది. అప్రమేయంగా, వీడియో ప్రారంభంలో కొన్ని విభాగాలు వైట్‌లిస్ట్ చేసిన ఛానెల్‌లలో దాటవేయబడవచ్చు. ఈ ఎంపికను ప్రారంభించడం దీనిని నిరోధిస్తుంది, కాని ఛానెల్ ఐడిని పొందడానికి కొంత సమయం పట్టవచ్చు కాబట్టి అన్ని దాటవేయడం కొంచెం ఆలస్యం అవుతుంది. మీకు వేగవంతమైన ఇంటర్నెట్ ఉంటే ఈ ఆలస్యం గుర్తించబడదు."},"forceChannelCheckPopup":{"message":"\"దాటవేయడానికి ముందు ఫోర్స్ ఛానల్ చెక్\" ప్రారంభించడం పరిగణించండి"},"downvoteDescription":{"message":"తప్పు / తప్పు సమయం"},"nonMusicCategoryOnMusic":{"message":"ఈ వీడియోను సంగీతంగా వర్గీకరించారు. దీనికి స్పాన్సర్ ఉందని మీరు ఖచ్చితంగా అనుకుంటున్నారా? ఇది వాస్తవానికి \"నాన్-మ్యూజిక్ సెగ్మెంట్\" అయితే, పొడిగింపు ఎంపికలను తెరిచి ఈ వర్గాన్ని ప్రారంభించండి. అప్పుడు, మీరు ఈ విభాగాన్ని స్పాన్సర్‌కు బదులుగా \"నాన్-మ్యూజిక్\" గా సమర్పించవచ్చు. మీరు గందరగోళంలో ఉంటే దయచేసి మార్గదర్శకాలను చదవండి."},"multipleSegments":{"message":"బహుళ విభాగాలు"},"guidelines":{"message":"మార్గదర్శకాలు"},"readTheGuidelines":{"message":"మార్గదర్శకాలను చదవండి!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"వర్గాలు ఇక్కడ ఉన్నాయి!"},"categoryUpdate2":{"message":"పరిచయాలు, ros ట్రోస్, మెర్చ్ మొదలైనవాటిని దాటవేయడానికి ఎంపికలను తెరవండి."}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/th/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/th/messages.json @@ -0,0 +1 @@ +{"0":{"message":"หมดเวลาสำหรับการเชื่อมต่อ ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต ถ้าอินเทอร์เน็ตของคุณใช้งานได้ เซิร์ฟเวอร์อาจจะกำลังโอเวอร์โหลดหรือล่ม"},"400":{"message":"เซิร์ฟเวอร์รายงานว่าคำขอนี้ไม่ถูกต้อง"},"409":{"message":"ส่วนนี้ได้ถูกส่งมาก่อนหน้านี้แล้ว"},"502":{"message":"ดูเหมือนว่าเซิร์ฟเวอร์กำลังโอเวอร์โหลด ลองอีกครั้งในอีกไม่กี่วินาที"},"fullName":{"message":"SponsorBlock สำหรับ YouTube - ข้ามสปอนเซอร์","description":"Name of the extension."},"Description":{"message":"ข้ามสปอนเซอร์, การก่อการติดตาม, ฯลฯ ในวีดีโอ YouTube. รายงานสปอนเซอร์ในวีดีโอเพื่อประหยัดเวลาคนอื่น","description":"Description of the extension."},"channelWhitelisted":{"message":"ช่องนี้ถูกนำเข้ารายการอนุญาตพิเศษแล้ว"},"Segment":{"message":"ส่วน"},"Segments":{"message":"ส่วน"},"SegmentsCap":{"message":"ส่วน"},"Chapters":{"message":"ส่วนเนื้อหา"},"renderAsChapters":{"message":"แสดงส่วนเป็นส่วนเนื้อหา","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"แสดงส่วนปัจจุบันข้างเวลาของวิดีโอ"},"showAutogeneratedChapters":{"message":"แสดงส่วนเนื้อหาสร้างขึ้นอัตโนมัติโดย YouTube"},"upvoteButtonInfo":{"message":"เห็นด้วยกับรายงานนี้"},"reportButtonTitle":{"message":"รายงาน"},"reportButtonInfo":{"message":"รายงานส่วนนี้ว่าไม่ถูกต้อง"},"Dismiss":{"message":"ปฏิเสธ"},"Loading":{"message":"กำลังโหลด..."},"Hide":{"message":"ไม่แสดงเสมอ"},"hitGoBack":{"message":"กด \"ยกเลิกการข้าม\" เพื่อกลับไปที่เดิม"},"unskip":{"message":"ยกเลิกการข้าม"},"reskip":{"message":"ข้ามใหม่"},"unmute":{"message":"เปิดเสียง"},"paused":{"message":"กำลังหยุดชั่วคราว"},"manualPaused":{"message":"หยุดการจับเวลาแล้ว"},"confirmMSG":{"message":"เพื่อแก้ไขหรือลบค่าใดค่าหนึ่ง คลิกปุ่มข้อมูลหรือเปิดป๊อปอัพส่วนขยายโดยคลิกไอคอนส่วนขยายในมุมบนขวา"},"clearThis":{"message":"คุณมั่นใจว่าจะลบส่วนนี้หรือไม่?\n\n"},"Unknown":{"message":"มีปัญหาในการส่งช่วงเวลาสปอนเซอร์ของคุณ กรุณาลองใหม่อีกครั้งในภายหลัง"},"sponsorFound":{"message":"วิดีโอนี้มีส่วนในฐานข้อมูล!"},"sponsor404":{"message":"ไม่พบส่วนในวีดีโอนี้"},"sponsorStart":{"message":"เริ่มส่วนตอนนี้"},"sponsorEnd":{"message":"จบส่วนตอนนี้"},"sponsorCancel":{"message":"ยกเลิกการสร้างส่วน"},"noVideoID":{"message":"ไม่พบวิดีโอ YouTube\nถ้านี่ไม่ถูกต้อง รีเฟรชแท็บนี้"},"refreshSegments":{"message":"รีเฟรชส่วน"},"success":{"message":"สำเร็จ!"},"voted":{"message":"โหวตเรียบร้อยแล้ว"},"serverDown":{"message":"ดูเหมือนว่าเซิร์ฟเวอร์จะล่ม โปรดติดต่อผู้พัฒนาทันที"},"connectionError":{"message":"เกิดข้อผิดพลาดในการเชื่อมต่อ รหัสข้อผิดพลาด: "},"segmentsStillLoading":{"message":"กำลังโหลดส่วน..."},"clearTimes":{"message":"ล้างส่วน"},"openPopup":{"message":"เปิดป๊อปอัพ SponsorBlock"},"closePopup":{"message":"ปิดป๊อปอัพ"},"closeIcon":{"message":"ปิดไอคอน"},"OpenSubmissionMenu":{"message":"เปิดเมนูการส่ง"},"sortSegments":{"message":"จัดช่วง"},"submitCheck":{"message":"คุณแน่ใจหรือไม่ว่าต้องการส่งสิ่งนี้"},"whitelistChannel":{"message":"เพิ่มช่องในรายการอนุญาตพิเศษ"},"removeFromWhitelist":{"message":"นำช่องออกจากรายการอนุญาติพิเศษ"},"voteOnTime":{"message":"โหวตส่วน"},"Submissions":{"message":"การส่ง"},"savedPeopleFrom":{"message":"คุณได้ช่วยผู้คนจากส่วน "},"viewLeaderboard":{"message":"กระดานผู้นำ"},"recordTimesDescription":{"message":"ส่ง"},"submissionEditHint":{"message":"การแก้ไขส่วนจะปรากฏหลังคุณกดส่ง","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"คำแนะนำ: คุณสามารถกำหนดปุ่มสำหรับการส่งได้ในการตั้งค่า"},"clearTimesButton":{"message":"ล้างเวลา"},"Username":{"message":"ชื่อผู้ใช้"},"setUsername":{"message":"ตั้งชื่อผู้ใช้"},"copyPublicID":{"message":"คัดลอกไอดีผู้ใช้สาธารณะ"},"copySegmentID":{"message":"คัดลอกไอดีส่วน"},"loopChapter":{"message":"วนซ้ำส่วน"},"unloopChapter":{"message":"หยุดวนซ้ำส่วน"},"hideThis":{"message":"ซ่อนสิ่งนี้"},"Options":{"message":"การตั้งค่า"},"showButtons":{"message":"แสดงปุ่มในโปรแกรมเล่น YouTube"},"hideButtonsDescription":{"message":"ตัวเลือกนี้ซ่อนปุ่มที่ปรากฏในโปรแกรมเล่น YouTube ที่ใช้ในการส่งส่วนข้าม"},"showSkipButton":{"message":"แสดงปุ่มข้ามไปที่ไฮไลต์ตลอดเวลา"},"showInfoButton":{"message":"แสดงปุ่มข้อมูลในโปรแกรมเล่น YouTube"},"autoHideInfoButton":{"message":"ซ่อนปุ่มข้อมูลโดยอัตโนมัติ"},"showDeleteButton":{"message":"แสดงปุ่มลบในโปรแกรมเล่น YouTube"},"enableViewTracking":{"message":"เปิดการติดตามการนับจำนวนการข้าม"},"whatViewTracking":{"message":"ฟีเจอร์นี้ติดตามส่วนที่คุณได้ข้ามเพื่อให้ผู้ใช้ได้ทราบว่าการส่งส่วนของพวกเขาช่วยผู้อื่นได้เท่าไรและใช้เป็นมาตรวัดพร้อมกับการแสดงความเห็นด้วยเพื่อให้มั่นใจว่าการสแปมไม่เข้าไปในฐานข้อมูล ส่วนขยายจะส่งข้อความไปยังเซิร์ฟเวอร์ในแต่ละครั้งที่คุณข้ามส่วนใดส่วนหนึ่ง หวังว่าคนส่วนใหญ่ไม่เปลี่ยนการตั้งค่านี้เพื่อให้เลขการดูแม่นยำ :)"},"enableViewTrackingInPrivate":{"message":"เปิดการนับการข้ามในแท็บส่วนตัว/ไม่ระบุตัวตน"},"enableTrackDownvotes":{"message":"บันทึกส่วนที่ไม่เห็นด้วย"},"whatTrackDownvotes":{"message":"ส่วนที่คุณไม่เห็นด้วยจะยังคงถูกซ่อนแม้ว่าจะรีเฟรชแล้ว"},"trackDownvotesWarning":{"message":"คำเตือน: การปิดการใช้งานสิ่งนี้จะลบการไม่เห็นด้วยที่ได้บันทึกไว้ก่อนหน้านี้ทั้งหมด"},"enableTrackDownvotesInPrivate":{"message":"บันทึกส่วนที่ไม่เห็นด้วยในแท็บส่วนตัว/ไม่ระบุตัวตน"},"enableQueryByHashPrefix":{"message":"คิวรีตามคำนำหน้าแฮช"},"enableShowCategoryWithoutPermission":{"message":"แสดงหมวดหมู่ในเมนูการส่งแม้ว่าจะไม่ได้รับอนุญาตให้ส่ง"},"whatShowCategoryWithoutPermission":{"message":"จำเป็นต้องได้รับอนุญาตในการส่งหมวดหมู่บางหมวดเนื่องจากข้อกำหนดชื่อเสียงขั้นต่ำ"},"showNotice":{"message":"แสดงการแจ้งเตือนอีกครั้ง"},"showSkipNotice":{"message":"แสดงการแจ้งเตือนหลังข้ามส่วน"},"showUpcomingNotice":{"message":"แสดงการแจ้งเตือนก่อนเข้าส่วน"},"showCategoryGuidelines":{"message":"แสดงความช่วยเหลือหมวดหมู่"},"noticeVisibilityMode0":{"message":"การแจ้งเตือนการข้ามขนาดเต็ม"},"noticeVisibilityMode1":{"message":"การแจ้งเตือนการข้ามขนาดเล็กสำหรับการข้ามโดยอัตโนมัติ"},"noticeVisibilityMode2":{"message":"การแจ้งเตือนการข้ามขนาดเล็กทั้งหมด"},"noticeVisibilityMode3":{"message":"การแจ้งเตือนการข้ามแบบจางสำหรับการข้ามโดยอัตโนมัติ"},"noticeVisibilityMode4":{"message":"การแจ้งเตือนการข้ามแบบจางทั้งหมด"},"longDescription":{"message":"SponsorBlock ให้คุณข้ามสปอนเซอร์ อินโทร เอาต์โทร การแจ้งเตือนการสมัครสมาชิก และส่วนน่ารำคาญอื่น ๆ ของวิดีโอ YouTube\nSponsorBlock เป็นส่วนขยายเบราว์เซอร์ที่ให้ใครก็ได้ส่งเวลาเริ่มและจบของส่วนสปอนเซอร์และส่วนอื่น ๆ ของวิดีโอ YouTube เมื่อมีคนใดคนหนึ่งส่งข้อมูลนี้ ทุกคนที่ใช้ส่วนขยายนี้ก็จะข้ามส่วนสปอนเซอร์นั้น คุณสามารถข้ามส่วนที่ไม่ใช่เพลงในวิดีโอเพลงได้เช่นกัน","description":"Full description of the extension on the store pages."},"website":{"message":"เว็บไซต์","description":"Used on Firefox Store Page"},"sourceCode":{"message":"ซอร์สโค้ด","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"การแจ้งเตือนได้ถูกอัปเกรดแล้ว!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"ถ้าคุณยังไม่ชอบ ให้กดปุ่มไม่แสดงเสมอ","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"ข้ามส่วน","description":"Keybind label"},"setStartSponsorShortcut":{"message":"เริ่ม/หยุดส่วน","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"เปิดเมนูการส่ง","description":"Keybind label"},"setSubmitKeybind":{"message":"ส่งส่วน","description":"Keybind label"},"setPreviewKeybind":{"message":"พรีวิวส่วน","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"ปิดการแจ้งเตือนการข้าม","description":"Keybind label"},"nextChapterKeybind":{"message":"ส่วนเนื้อหาต่อไป","description":"Keybind label"},"previousChapterKeybind":{"message":"ส่วนเนื้อหาก่อนหน้า","description":"Keybind label"},"enableDeArrowKey":{"message":"เปิด/ปิดการใช้งาน DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"เปิดเมนูการส่ง","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"เลือกปุ่มโดยการพิมพ์ปุ่มนั้นและเลือกปุ่มแก้ไขที่คุณต้องการใช้"},"disableSkipping":{"message":"การข้ามเปิดอยู่"},"enableSkipping":{"message":"การข้ามปิดอยู่"},"yourWork":{"message":"ผลงานของคุณ","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"รหัสข้อผิดพลาด: "},"skip":{"message":"ข้าม"},"mute":{"message":"ปิดเสียง"},"full":{"message":"ทั้งวิดีโอ","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"ข้าม {0} หรือไม่"},"mute_category":{"message":"ปิดเสียง {0} หรือไม่"},"skip_to_category":{"message":"ข้ามไป {0} หรือไม่","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"{0} ที่กำลังมา","description":"Example: Upcoming Sponsor"},"skipped":{"message":"ข้าม {0} แล้ว","description":"Example: Sponsor Skipped"},"muted":{"message":"ปิดเสียง {0} แล้ว","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"ข้ามไป {0} แล้ว","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"โหวต {0} แล้ว","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"ปิดการข้ามอัตโนมัติ"},"enableAutoSkip":{"message":"เปิดการข้ามอัตโนมัติ"},"audioNotification":{"message":"เล่นเสียงแจ้งเตือนหลังข้ามส่วน"},"audioNotificationDescription":{"message":"เสียงแจ้งเตือนจะดังขั้นเมื่อมีส่วนถูกข้าม เสียงนี้จะไม่ดังขึ้นถ้าตัวเลือกนี้ถูกปิดหรือการข้ามส่วนอัตโนมัติถูกปิด"},"showTimeWithSkips":{"message":"แสดงเวลาถ้าข้ามทุกๆ ส่วนที่มี"},"showTimeWithSkipsDescription":{"message":"เวลานี้ปรากฏในวงเล็บถัดจากเวลาปัจจุบันที่แถบกรอ ซึ่งแสดงระยะเวลาวิดีโอถ้าข้ามทุกส่วน ซึ่งรวมถึงส่วนที่ปรับตัวเลือกการข้ามเป็น \"แสดงในแถบกรอ\" ด้วย"},"youHaveSkipped":{"message":"คุณได้ข้ามส่วน "},"minLower":{"message":"นาที"},"minsLower":{"message":"นาที"},"hourLower":{"message":"ชั่วโมง"},"hoursLower":{"message":"ชั่วโมง"},"youHaveSavedTime":{"message":"คุณได้ช่วยผู้คน","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" ของชีวิตพวกเขา","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"ตรวจสอบสถานะของเซิร์ฟเวอร์ได้ที่ status.sponsor.ajay.app"},"changeUserID":{"message":"นำเข้า/ส่งออกไอดีผู้ใช้ส่วนตัวของคุณ"},"whatChangeUserID":{"message":"ควรเก็บสิ่งนี้ไว้ส่วนตัว สิ่งนี้เหมือนรหัสผ่านและไม่ควรจะแบ่งปันกับคนอื่น ถ้าใครบางคนมีสิ่งนี้ เขาจะสามารถปลอมตัวเป็นคุณได้ ถ้าคุณกำลังมองหาไอดีผู้ใช้สาธารณะ ให้คลิกไอคอนคลิปบอร์ดในป๊อปอัพ"},"setUserID":{"message":"ตั้งไอดีผู้ใช้ส่วนตัว"},"userIDChangeWarning":{"message":"คำเตือน: การเปลี่ยน UserID ส่วนตัว เป็นการเปลี่ยนแบบถาวร คุณแน่ใจที่จะทำแบบนี้ไหม? โปรดอย่าลืมสำรองข้อมูลเก่าของคุณก่อนเปลี่ยนไว้"},"createdBy":{"message":"สร้างขึ้นโดย"},"supportOtherSites":{"message":"รองรับเว็บไซต์ YouTube บุคคลที่สาม"},"supportOtherSitesDescription":{"message":"สนับสนุนลูกค้า YouTube บุคคลที่สาม.\nในการเปิดใช้งานการสนับสนุน คุณต้องยอมรับการอนุญาตพิเศษ!","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"เว็บไซต์ที่รองรับ: "},"optionsInfo":{"message":"เปิดการรองรับ Invidious ปิดการข้ามอัตโนมัติ ซ่อนปุ่ม ฯลฯ"},"addInvidiousInstanceDescription":{"message":"เพิ่มอินสแตนซ์ที่กำหนดเอง โดยต้องจัดรูปแบบโดยใช้โดเมนเท่านั้น ตัวอย่าง: invidious.ajay.app"},"add":{"message":"เพิ่ม"},"addInvidiousInstanceError":{"message":"โดเมนนี้ไม่ถูกต้อง ควรใส่แค่ส่วนโดเมนเท่านั้น ตัวอย่าง: invidious.ajay.app"},"resetInvidiousInstance":{"message":"รีเซ็ตรายการอินสแตนซ์ของ Invidious"},"resetInvidiousInstanceAlert":{"message":"คุณกำลังจะรีเซ็ตรายการอินสแตนซ์ของ Invidious"},"currentInstances":{"message":"อินสแตนซ์ปัจจุบัน:"},"minDuration":{"message":"ระยะเวลาขั้นต่ำ (วินาที):"},"minDurationDescription":{"message":"ส่วนที่สั้นกว่าค่าที่ตั้งไว้จะไม่ถูกข้ามหรือแสดงในโปรแกรมเล่น"},"enableManualSkipOnFullVideo":{"message":"ใช้การข้ามด้วยตนเองเมื่อมีป้ายทั้งวิดีโอ"},"whatManualSkipOnFullVideo":{"message":"สำหรับผู้ที่ต้องการดูวิดีโอที่เป็นสปอนเซอร์หรือการโปรโมทตัวเองทั้งวิดีโอโดยไม่ถูกขัดจังหวะ"},"skipNoticeDuration":{"message":"ระยะเวลาการแจ้งเตือนการข้าม (วินาที):"},"skipNoticeDurationDescription":{"message":"การแจ้งเตือนการข้ามจะอยู่บนหน้าจอเป็นเวลาอย่างน้อยเท่านี้ อาจจะอยู่ได้นานกว่าสำหรับการข้ามด้วยตนเอง"},"shortCheck":{"message":"การส่งส่วนนี้สั้นกว่าการตั้งค่าระยะเวลาขั้นต่ำของคุณ นี่อาจหมายความว่าส่วนนี้ได้ถูกส่งไปแล้ว และแค่ถูกละเลยเนื่องจากการตั้งค่านี้ คุณแน่ใจหรือไม่ว่าต้องการจะส่งส่วนนี้"},"liveOrPremiere":{"message":"ไม่สามารถบันทึกส่วนในไลฟ์สดหรือการแสดงครั้งแรกได้ โปรดรอจนกว่าไลฟ์สดหรือการแสดงครั้งแรกจบลงแล้วรีเฟรชหน้าวิดีโอและตรวจสอบให้แน่ใจว่าส่วนที่สร้างไว้ยังคงถูกต้อง"},"showUploadButton":{"message":"แสดงปุ่มอัปโหลด"},"customServerAddress":{"message":"ที่อยู่เซิร์ฟเวอร์ SponsorBlock"},"customServerAddressDescription":{"message":"ที่อยู่ที่ SponsorBlock ใช้ในการติดต่อกับเซิร์ฟเวอร์\nคุณไม่ควรเปลี่ยนที่อยู่นี้ ยกเว้นว่าคุณมีเซิร์ฟเวอร์เป็นของตัวเอง"},"thumbnailCacheServerAddress":{"message":"ที่อยู่เซิร์ฟเวอร์แคชภาพปก"},"save":{"message":"บันทึก"},"reset":{"message":"คืนค่าเดิม"},"customAddressError":{"message":"ที่อยู่ไม่ถูกต้อง ตรวจสอบให้แน่ใจว่ามี http:// หรือ https:// นำหน้าและไม่มีเครื่องหมาย / ตามท้าย"},"areYouSureReset":{"message":"คุณแน่ใจหรือไม่ว่าต้องการรีเซ็ตสิ่งนี้"},"mobileUpdateInfo":{"message":"รองรับ m.youtube.com แล้ว"},"exportOptions":{"message":"นำเข้า/ส่งออกการตั้งค่าทั้งหมด"},"exportOtherData":{"message":"นำเข้า/ส่งออกข้อมูลอื่น ๆ ทั้งหมด"},"exportOptionsCopy":{"message":"แก้ไข/คัดลอก"},"exportOptionsDownload":{"message":"บันทึกเป็นไฟล์"},"exportOptionsUpload":{"message":"โหลดจากไฟล์"},"whatExportOptions":{"message":"นี่คือการตั้งค่าทั้งหมดของคุณในไฟล์ JSON ซึ่งรวมถึงไอดีผู้ใช้ส่วนตัวของคุณ ดังนั้นควรแชร์อย่างระมัดระวัง"},"setOptions":{"message":"จัดการตั้งค่า"},"exportOptionsWarning":{"message":"คำเตือน: การเปลี่ยนแปลงค่านี้มีผลถาวร และสามารถทำให้เกิดความเสียหายต่อการติดตั้งได้ คุณแน่ใจหรือไม่ที่จะบันทึก โปรดสำรองข้อมูลเก่าเผื่อไว้"},"incorrectlyFormattedOptions":{"message":"ไฟล์ JSON นี้อยู่ในรูปแบบที่ไม่ถูกต้อง ตัวเลือกของคุณจะไม่เปลี่ยนแปลง"},"confirmNoticeTitle":{"message":"ส่งส่วน"},"submit":{"message":"ส่ง"},"cancel":{"message":"ยกเลิก"},"delete":{"message":"ลบ"},"preview":{"message":"ดูตัวอย่าง"},"unsubmitted":{"message":"ยังไม่ได้ส่ง"},"inspect":{"message":"ดู"},"edit":{"message":"แก้ไข"},"copyDebugLogs":{"message":"คัดลอกบันทึกการดีบัก"},"copyDebugInformation":{"message":"คัดลอกข้อมูลการดีบั๊กไปยังคลิปบอร์ด"},"copyDebugInformationFailed":{"message":"คัดลอกไปยังคลิปบอร์ดไม่สำเร็จ"},"copyDebugInformationComplete":{"message":"ข้อมูลดีบั๊กได้ถูกคัดลอกไปยังคลิปบอร์ดเรียบร้อยแล้ว คุณสามารถลบข้อมูลที่ไม่ต้องการแบ่งปันได้ ให้บันทึกในไฟล์ข้อความหรือวางในการรายงานบั๊ก"},"keyAlreadyUsed":{"message":"คีย์ลัดนี้ถูกใช้ในคำสั่งอื่นแล้ว โปรดเลือกคีย์ลัดอื่น"},"to":{"message":"ถึง","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"คัดลอกแล้ว","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline2":{"message":"เล่นให้ดูเหมือนว่าไม่มีอะไรถูกข้าม"},"category_sponsor":{"message":"สปอนเซอร์"},"category_sponsor_guideline1":{"message":"โปรโมชั่นที่ได้รับเงิน"},"category_sponsor_guideline2":{"message":"ไม่ควรใช้สำหรับการบริจาคหรือสินค้า"},"category_selfpromo":{"message":"ไม่ได้ค่าจ้าง/การโปรโมทตัวเอง"},"category_selfpromo_description":{"message":"คล้ายกับ \"สปอนเซอร์\" แต่ยกเว้นสำหรับการโปรโมทตัวเอง ซึ่งรวมถึงสินค้า, การบริจาค, หรือข้อมูลเกี่ยวกับผู้ที่ร่วมมือด้วย"},"category_selfpromo_guideline1":{"message":"การบริจาค การสมัครสมาชิก และสินค้าของครีเอเตอร์"},"category_selfpromo_guideline3":{"message":"ไม่ใช่สำหรับผลิตภัณฑ์และสินค้าที่ออกแบบโดยองค์กร"},"category_exclusive_access":{"message":"เข้าถึงโดยเฉพาะ"},"category_exclusive_access_pill":{"message":"วิดีโอนี้นำเสนอผลิตภัณฑ์ บริการ หรือสถานที่ที่ได้รับสิทธิ์เข้าถึงได้แบบฟรีหรือแบบได้รับเงินอุดสนุน","description":"Short description for this category"},"category_interaction_guideline1":{"message":"ประโยคชักชวนสั้น ๆ ให้กดไลค์ แสดงความคิดเห็น หรือกดติดตาม"},"category_interaction_guideline2":{"message":"รวมถึงคำเปรยให้แสดงความคิดเห็นทางอ้อมด้วย"},"category_intro":{"message":"ช่วงพัก/แอนิเมชันอินโทร"},"category_intro_description":{"message":"ช่วงที่ไม่มีเนื้อหาสำคัญ อาจเป็นภาพนิ่ง ภาพว่าง หรือแอนิเมชันวนซ้ำ ไม่ควรใช้ในช่วงเปลี่ยนผ่านที่มีเนื้อหา"},"category_intro_short":{"message":"ช่วงพัก"},"category_intro_guideline1":{"message":"ช่วงที่ไม่มีเนื้อหาสำคัญ"},"category_outro":{"message":"การ์ดจบ/เครดิต"},"category_outro_description":{"message":"เครดิตหรือเมื่อการ์ดจบของ YouTube ปรากฏ ไม่ใช่สำหรับข้อสรุปที่มีข้อมูล"},"category_outro_guideline1":{"message":"อย่ารวมเนื้อหา แม้การ์ดจบของ YouTube จะปรากฏอยู่บนหน้าจอก็ตาม"},"category_preview_description":{"message":"คลิปที่แสดงถึงสิ่งที่จะเกิดขึ้นในวิดีโอปัจจุบัน หรือวิดีโออื่น ๆ ในซีรีส์ที่นำมาพูดถึงภายหลัง"},"category_preview_guideline1":{"message":"คลิปที่ปรากฎภายหลัง หรือในวิดีโอถัดไป"},"category_preview_guideline2":{"message":"ความเดิมจากวิดีโอก่อนหน้า"},"category_filler":{"message":"นอกเรื่อง/มุก"},"category_filler_guideline2":{"message":"นอกเรื่อง เบื้องหลัง ภาพซ้ำ"},"category_music_offtopic":{"message":"เพลง: ส่วนที่ไม่ใช่เสียงเพลง"},"category_poi_highlight":{"message":"ไฮไลต์"},"category_poi_highlight_description":{"message":"ส่วนของวีดีโอที่คนส่วนใหญ่กำลังตามหา คล้ายกับความคิดเห็น \"วิดีโอเริ่มต้นที่ x\""},"category_poi_highlight_guideline1":{"message":"ช่วงเวลาที่คนส่วนใหญ่กำลังมองหา"},"category_poi_highlight_guideline2":{"message":"สามารถข้ามผ่านบริบทได้"},"category_poi_highlight_guideline3":{"message":"สามารถข้ามไปยังชื่อหรือภาพปกได้"},"category_chapter":{"message":"ส่วนเนื้อหา"},"category_chapter_guideline3":{"message":"สามารถใส่ส่วนเนื้อหาที่เล็กกว่าในส่วนเนื้อหาที่ใหญ่กว่าได้"},"autoSkip":{"message":"ข้ามอัตโนมัติ"},"manualSkip":{"message":"ข้ามด้วยตนเอง"},"showOverlay":{"message":"แสดงในแถบกรอ"},"disable":{"message":"ปิดใช้งาน"},"autoSkip_POI":{"message":"ข้ามไปที่จุดเริ่มต้นโดยอัตโนมัติ"},"manualSkip_POI":{"message":"ถามเมื่อวิดีโอโหลด"},"showOverlay_POI":{"message":"แสดงในแถบกรอ"},"showOverlay_full":{"message":"แสดงป้ายกำกับ"},"showOverlay_chapter":{"message":"แสดงส่วนเนื้อหา"},"autoSkipOnMusicVideos":{"message":"ข้ามส่วนอัตโนมัติถ้าไม่มีส่วนที่ไม่ใช่เพลง"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"ข้ามเฉพาะใน music.youtube.com"},"muteSegments":{"message":"อนุญาตส่วนที่ปิดเสียงแทนการข้าม"},"fullVideoSegments":{"message":"แสดงสัญลักษณ์ในวิดีโอที่เป็นโฆษณาทั้งหมด","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"แสดงป้ายกำกับในภาพปกด้วย","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"สีตอนยังไม่ได้ส่ง","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"สีแถบกรอ"},"category":{"message":"หมวดหมู่"},"skipOption":{"message":"ตัวเลือกการข้าม","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"whatEnableTestingServer":{"message":"การส่งข้อมูลและการโหวตของคุณจะไม่ถูกนับในเซิร์ฟเวอร์หลัก ใช้เพื่อการทดสอบเท่านั้น"},"testingServerWarning":{"message":"การส่งข้อมูลและการโหวตทั้งหมดจะไม่ถูกนับในเซิร์ฟเวอร์หลักในขณะที่กำลังเชื่อมต่อกับเซิร์ฟเวอร์ทดสอบ ปิดตัวเลือกนี้หากคุณต้องการส่งข้อมูลจริงไปยังเซิร์ฟเวอร์หลัก"},"bracketNow":{"message":"(ตอนนี้)"},"moreCategories":{"message":"หมวดหมู่เพิ่มเติม"},"chooseACategory":{"message":"เลือกหมวดหมู่"},"enableThisCategoryFirst":{"message":"ในการส่งส่วนประเภท{0} คุณต้องเปิดใช้ในการตั้งค่าก่อน ระบบจะพาคุณไปการตั้งค่าในตอนนี้","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"youMustSelectACategory":{"message":"คุณต้องเลือกหมวดหมู่ของส่วนทุกส่วนที่คุณจะส่ง!"},"bracketStart":{"message":"(เริ่ม)"},"bracketEnd":{"message":"(จบ)"},"hiddenDueToDownvote":{"message":"ถูกซ่อน: ไม่เห็นด้วย"},"hiddenDueToDuration":{"message":"ถูกซ่อน: สั้นเกินไป"},"adblockerIssueWhitelist":{"message":"ถ้าคุณไม่สามารถแก้ไขปัญหานี้ได้ ให้ปิด 'บังคับให้ตรวจช่องก่อนข้าม' เพราะ SponsorBlock ไม่สามารถเรียกข้อมูลช่องสำหรับวิดีโอนี้ได้"},"forceChannelCheck":{"message":"บังคับให้ตรวจช่องก่อนข้าม"},"whatForceChannelCheck":{"message":"โดยปกติแล้ว ส่วนจะถูกข้ามโดยทันทีก่อนที่จะรู้ว่าเป็นช่องอะไร โดยค่าเริ่มต้น บางส่วนที่อยู่ต้นวิดีโออาจถูกข้ามในช่องที่ได้รับอนุญาต ตัวเลือกนี้ป้องกันไม่ให้เกิดเหตุการณ์นี้ แต่อาจทำให้การข้ามหน่วงขึ้นเล็กน้อย เพราะการโหลดไอดีช่องใช้เวลาพอสมควร การหน่วงนี้อาจไม่ส่งผลหากคุณมีอินเตอร์เน็ตที่เร็วมากพอ"},"forceChannelCheckPopup":{"message":"ลองเปิด \"บังคับให้ตรวจช่องก่อนข้าม\""},"downvoteDescription":{"message":"กำหนดเวลาไม่ถูกต้อง/ผิด"},"incorrectVote":{"message":"ไม่ถูกต้อง"},"harmfulVote":{"message":"เป็นภัย","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"เปลี่ยนหมวดหมู่"},"nonMusicCategoryOnMusic":{"message":"วิดีโอนี้ถูกจัดอยู่ในหมวดดนตรี คุณแน่ใจหรือไม่ว่าวิดีโอนี้มีสปอนเซอร์ ถ้าส่วนนี้เป็น \"ส่วนที่ไม่ใช่เสียงเพลง\" ไปที่การตั้งค่าของส่วนต่อขยายและเปิดใช้ส่วนประเภทนี้ จากนั้นคุณสามารถส่งส่วนนี้เป็นส่วนที่ไม่ใช่เพลงแทนได้ กรุณาอ่านแนวปฏิบัติหากคุณยังมีข้อสงสัย"},"multipleSegments":{"message":"ส่วนหลายส่วน"},"guidelines":{"message":"แนวปฏิบัติ"},"readTheGuidelines":{"message":"อ่านแนวปฏิบัติ!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate2":{"message":"เปิดการตั้งค่าเพื่อข้ามอินโทร เอาต์โทร สินค้า ฯลฯ"},"help":{"message":"ช่วยเหลือ"},"GotIt":{"message":"เข้าใจแล้ว","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"ส่วนนี้ใหญ่ ถ้าทั้งวิดีโอเกี่ยวข้องกับเรื่องเดียว ให้เปลี่ยนจาก \"ข้าม\" เป็น \"ทั้งวิดีโอ\" ดูแนวปฏิบัติสำหรับข้อมูลเพิ่มเติม"},"chapterNameTooltipWarning":{"message":"หนึ่งในชื่อของส่วนเนื้อหาของคุณคล้ายกับหมวดหมู่ใดหมวดหมู่หนึ่ง คุณควรใช้หมวดหมู่แทนเมื่อเป็นไปได้"},"hideForever":{"message":"ซ่อนตลอด"},"questionButton":{"message":"ฉันมีคำถาม"},"askAQuestion":{"message":"ถามคำถาม"},"warningConfirmButton":{"message":"ฉันเข้าใจสาเหตุแล้ว"},"deArrowMessageRecieved":{"message":"คุณได้รับข้อแนะนำจากผู้ดูแล"},"Donate":{"message":"บริจาค"},"hideDonationLink":{"message":"ซ่อนลิงค์การบริจาค"},"darkModeOptionsPage":{"message":"โหมดมืดในหน้าการตั้งค่า"},"helpPageThanksForInstalling":{"message":"ขอบคุณที่ติดตั้ง SponsorBlock"},"helpPageFeatureDisclaimer":{"message":"ฟีเจอร์หลายอย่างถูกปิดใช้งานโดยค่าเริ่มต้น ถ้าคุณต้องการข้ามอินโทร เอาต์โทร ใช้ Invidious ฯลฯ ให้เปิดใช้งานมันข้างล่าง คุณสามารถซ่อน/แสดงองค์ประกอบของ UI ได้เช่นกัน"},"Submitting":{"message":"กำลังบันทึก"},"Credits":{"message":"เครดิต"},"LearnMore":{"message":"เรียนรู้เพิ่มเติม"},"FullDetails":{"message":"รายละเอียดเต็ม"},"CopyAndDownvote":{"message":"คัดลอกและไม่เห็นด้วย"},"upvote":{"message":"เห็นด้วย"},"hideSegment":{"message":"ซ่อนส่วน"},"skipSegment":{"message":"ข้ามส่วน"},"yearAbbreviation":{"message":"ปี","description":"100y"},"dayAbbreviation":{"message":"ว.","description":"100d"},"hourAbbreviation":{"message":"ชม.","description":"100h"},"optionsTabBehavior":{"message":"พฤติกรรม","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"คีย์ลัด","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"สำรอง/กู้คืน","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"notSet":{"message":"ไม่ได้ตั้ง"},"openOptionsPage":{"message":"เปิดการตั้งค่า"},"exportSegments":{"message":"ส่งออกส่วน"},"importSegments":{"message":"นำเข้าส่วน"},"Import":{"message":"นำเข้า","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"unsubmittedSegmentCounts":{"message":"ขณะนี้คุณมี {0} ใน {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"ขณะนี้คุณยังไม่มีส่วนที่ยังไม่ได้ส่ง","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"ส่วนที่ยังไม่ได้ส่ง","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"ส่วนที่ยังไม่ได้ส่ง","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"วิดีโอ","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"วิดีโอ","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"ลบส่วนทั้งหมด","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"คุณต้องการลบส่วนที่ยังไม่ได้ส่งทั้งหมดหรือไม่","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"ดูส่วน","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"ซ่อนส่วน","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID วิดิโอ","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"จำนวนส่วน","description":"Header of the unsubmitted segments list"},"actions":{"message":"ตัวเลือก","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"คัดลอกเป็นลิงก์"},"NoticeTimeAfterSkip":{"message":"{seconds} วินาที","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"Original":{"message":"ต้นฉบับ"},"OriginalTitle":{"message":"ชื่อต้นฉบับ"},"CurrentTime":{"message":"เวลาปัจจุบัน"},"Middle":{"message":"ตอนกลาง"},"ignoreAbThumbnails":{"message":"ไม่ใช้ภาพขนาดย่อที่สุ่มจากช่วงหนึ่งของเนื้อหา"},"ignoreAbThumbnailsDescription":{"message":"ช่อง สามารถตั้งค่าการทดสอบวิดีโอของตนโดยที่ YouTube จะแสดงภาพขนาดย่อที่แตกต่างกันสำหรับแต่ละคน ตัวเลือกนี้จะใช้ภาพขนาดย่อแรกเสมอเพื่อรักษาความสอดคล้องกัน"},"abThumbnailsWarning":{"message":"คำเตือน: ขณะนี้วิดีโอนี้มีการทดสอบภาพนิ่งจากเนื้อหา สำหรับภาพขนาดย่ออยู่ ซึ่งหมายความว่าภาพขนาดย่ออาจมีการเปลี่ยนแปลงบ่อยครั้ง เนื่องจากอาจมีความเสี่ยงกับภาพขนาดย่อต้นฉบับนี้ คุณอาจจะยังไม่ควรมั่นใจ"},"titleMaxLines":{"message":"จำนวนบรรทัดข้อความสำหรับ ชื่อ ถึงขีดจำกัด"},"Thumbnails":{"message":"ภาพปก","description":"Referring to thumbnails of YouTube videos"},"dearrowHelpSponsorBlockImported":{"message":"หมายเหตุ: การตั้งค่า SponsorBlock ของคุณถูกนำเข้ามาโดยอัตโนมัติเรียบร้อยแล้ว"},"privacyPolicy":{"message":"นโยบายความเป็นส่วนตัว"},"termsOfUse":{"message":"เงื่อนไขการใช้งาน"},"replaceTitles":{"message":"แทนที่ชื่อ"},"replaceThumbnails":{"message":"แทนที่ภาพปก"},"requiresUblock":{"message":"ต้องมี uBlock Origin"},"ActivateDeArrow":{"message":"เปิดใช้งาน DeArrow"},"Close":{"message":"ปิด"},"DeArrowIsDisabled":{"message":"DeArrow ปิดการใช้งานอยู่ - คลิกเพื่อเปิดการใช้งาน","description":"Appears as a button on the video page when DeArrow is disabled"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/tr/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/tr/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Bağlantı zaman aşımına uğradı. İnternet bağlantınızı kontrol ediniz. Eğer internetiniz çalışıyor ise, büyük ihtimalle sunucuya erişilemiyor veya sunucuya aşırı yüklenilmiş olabilir."},"400":{"message":"Sunucu isteğin geçersiz olduğunu iletti"},"409":{"message":"Bu daha önce zaten gönderilmiş"},"502":{"message":"Sunucuya aşırı yüklenilmiş gibi gözüküyor. Birazdan tekrar deneyin."},"fullName":{"message":"YouTube için SponsorBlock - Sponsorlukları Atla","description":"Name of the extension."},"Description":{"message":"Videolardaki sponsorlukları, abonelik isteklerini ve daha fazlasını atlayın. Başkalarının vaktini kurtarmak için izlediğiniz videolardaki sponsorları bildirin.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kanala izin verildi!"},"Segment":{"message":"kısım"},"Segments":{"message":"kısım"},"SegmentsCap":{"message":"Kısımlar"},"Chapters":{"message":"Bölümler"},"renderAsChapters":{"message":"Kısımları bölüm olarak göster","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Geçerli kısmı video zamanının yanında göster"},"showAutogeneratedChapters":{"message":"YouTube tarafından otomatik oluşturulan bölümleri göster"},"upvoteButtonInfo":{"message":"Bu öneriye oy ver"},"reportButtonTitle":{"message":"Raporla"},"reportButtonInfo":{"message":"Bu öneriyi hatalı olarak bildir."},"Dismiss":{"message":"Yoksay"},"Loading":{"message":"Yükleniyor..."},"Hide":{"message":"Asla Gösterme"},"hitGoBack":{"message":"Geldiğiniz yere dönmek istiyorsanız atlama'ya basın."},"unskip":{"message":"Atlama"},"reskip":{"message":"Tekrar atla"},"unmute":{"message":"Sesi Aç"},"paused":{"message":"Duraklatıldı"},"manualPaused":{"message":"Zamanlayıcı Durduruldu"},"confirmMSG":{"message":"Değerleri tek başına düzenlemek ve silmek için, bilgi butonuna basın veya sağ yukarıdaki eklenti simgesine tıklayarak eklenti menüsünü açın."},"clearThis":{"message":"Bunu silmek istediğinize emin misiniz?\n\n"},"Unknown":{"message":"Sponsor sürelerini yollarken bir sorun oluştur, lütfen tekrar deneyin."},"sponsorFound":{"message":"Bu videonun kısımları veri tabanımızda mevcut"},"sponsor404":{"message":"Kısım bulunamadı"},"sponsorStart":{"message":"Kısmı Şimdi Başlat"},"sponsorEnd":{"message":"Kısım Şimdi Bitiyor"},"sponsorCancel":{"message":"Kısım Oluşturmayı İptal Et"},"noVideoID":{"message":"YouTube videosu bulunamadı.\nHatalı olduğunu düşünüyorsanız sayfayı yenileyin."},"refreshSegments":{"message":"Kısımları tazele"},"success":{"message":"Başarılı!"},"voted":{"message":"Oylandı!"},"serverDown":{"message":"Sunucu çökmüş gibi duruyor. Derhal geliştiriciyle iletişime geçin."},"connectionError":{"message":"Bağlantı hatası oluştu. Hata kodu: "},"segmentsStillLoading":{"message":"Kısımlar hâlâ yükleniyor..."},"clearTimes":{"message":"Kısımları temizle"},"openPopup":{"message":"SponsorBlock Penceresini Aç"},"closePopup":{"message":"Açılır Pencereyi kapat"},"closeIcon":{"message":"Kapat Simgesi"},"OpenSubmissionMenu":{"message":"Gönderiler Menüsünü Aç"},"OpenCasualVoteMenu":{"message":"Sıradan mod menüsünü aç"},"sortSegments":{"message":"Kısımları Sırala"},"submitCheck":{"message":"Bunu göndermek istediğinize emin misiniz?"},"whitelistChannel":{"message":"Kanala izin ver"},"removeFromWhitelist":{"message":"Kanalı izin listesinden çıkar"},"voteOnTime":{"message":"Bir Kısmı Oyla"},"Submissions":{"message":"Gönderimleriniz"},"savedPeopleFrom":{"message":"İnsanları şu kadar kısımdan kurtardınız: "},"viewLeaderboard":{"message":"Lider Tablosu"},"recordTimesDescription":{"message":"Gönder"},"submissionEditHint":{"message":"Kısım düzenlemesi Gönder'e tıkladığınızda görünecek","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"İpucu: Gönderim için ayarlardan kısayol tuşu atayabilirsiniz"},"clearTimesButton":{"message":"Süreleri Temizle"},"Username":{"message":"Kullanıcı adı"},"setUsername":{"message":"Kullanıcı Adı Belirle"},"copyPublicID":{"message":"Herkese Açık Kullanıcı Kimliğini Kopyala"},"copySegmentID":{"message":"Kısım Kimliğini Kopyala"},"loopChapter":{"message":"Kısmı döngüye al"},"unloopChapter":{"message":"Kısmı döngüden çıkar"},"hideThis":{"message":"Bunu sakla"},"Options":{"message":"Ayarlar"},"showButtons":{"message":"YouTube oynatıcısında Butonları Göster"},"hideButtonsDescription":{"message":"Bu YouTube oynatıcısındaki bölüm geçişlerini yolladığınız butonları saklayacaktır."},"showSkipButton":{"message":"“Asıl Kısma Atla” Düğmesi Oynatıcıda Kalsın"},"showInfoButton":{"message":"YouTube Oynatıcısındaki Bilgi Butonunu Göster"},"autoHideInfoButton":{"message":"Bilgi düğmesini otomatik gizle"},"showDeleteButton":{"message":"YouTube Oynatıcısında Silme Tuşunu Göster"},"enableViewTracking":{"message":"Kısım Atlama Sayaç Takibine İzin Ver"},"whatViewTracking":{"message":"Bu özellik, hangi kısımları atladığınızı takip ederek kullanıcıların gönderilerinin diğerlerine ne kadar yardımcı olduğunu bilmelerini sağlar ve olumlu oyları bir ölçüm aracı olarak kullanarak gereksiz yollanan kısımların veri tabanına girmemesini sağlar. Eklenti, bir kısmı her atladığınızda sunucuya bir mesaj gönderir. Umarım çoğu insan bu ayarı değiştirmez böylece görüntüleme sayıları doğru olur. :)"},"enableViewTrackingInPrivate":{"message":"Özel/Gizli sekmelerde atlama sayısı takibini etkinleştir"},"enableTrackDownvotes":{"message":"Kısımların olumsuz oylarını depola"},"whatTrackDownvotes":{"message":"Olumsuz oy verdiğiniz kısımlar, sayfayı tazeledikten sonra da gizli kalacaktır"},"trackDownvotesWarning":{"message":"Uyarı: Bu ayarı devre dışı bırakırsanız, halihazırda saklanan olumsuz oylar silinecek"},"enableTrackDownvotesInPrivate":{"message":"Gizli sekmede kısımlar için verilen olumsuz oyları depola"},"enableQueryByHashPrefix":{"message":"Karma Ön eki ile Sorgula"},"whatQueryByHashPrefix":{"message":"Video Kimliğini kullanarak sunucudan kısımları talep etmek yerine, Video Kimliğinin karmasının ilk 4 karakterini gönderir. Bu sunucu, benzer karmalara sahip tüm videolar için verileri geri gönderir."},"enableShowCategoryWithoutPermission":{"message":"Gönderim izni olmasa bile gönderim menüsünde kategorileri gösterme"},"whatShowCategoryWithoutPermission":{"message":"Bazı kategoriler, minimum itibar gereksinimleri nedeniyle göndermek için izin gerektirir"},"showNotice":{"message":"Uyarıyı Tekrar Göster"},"showSkipNotice":{"message":"Bir Kısmı Atladıktan Sonra Uyarı Göster"},"showUpcomingNotice":{"message":"Bir Kısım Başlamadan Önce Uyarı Göster"},"showCategoryGuidelines":{"message":"Kategori Yardımını Göster"},"noticeVisibilityMode0":{"message":"Tam Boyutlu Atlama Bildirimleri"},"noticeVisibilityMode1":{"message":"Otomatik Atlama için Küçük Atlama Bildirimleri"},"noticeVisibilityMode2":{"message":"Tüm Küçük Atlama Bildirimleri"},"noticeVisibilityMode3":{"message":"Otomatik Atlama için Soluk Atlama Bildirimleri"},"noticeVisibilityMode4":{"message":"Tüm Soluk Atlama Bildirimleri"},"longDescription":{"message":"SponsorBlock, sponsorları, giriş ve bitiş kısımlarını, abonelik hatırlatıcılarını ve YouTube videolarının diğer can sıkıcı kısımlarını atlamanıza olanak tanır. SponsorBlock, herkesin sponsorlu kısımları ve YouTube videolarının diğer kısımlarının başlangıç ve bitiş zamanlarını göndermesine izin veren kitle kaynaklı bir tarayıcı uzantısıdır. Bir kişi bu bilgiyi gönderdikten sonra, bu uzantıya sahip diğer herkes sponsorlu kısımları hemen atlayacaktır. Müzik videolarının müzik dışı bölümlerini de atlayabilirsiniz.","description":"Full description of the extension on the store pages."},"website":{"message":"Website","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Kaynak Kodu","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Uyarı güncellendi!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Eğer hala beğenmediyseniz, asla gösterme butonuna basın.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Kısmı atla","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Kısmı başlat/durdur","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Gönderiler menüsünü aç","description":"Keybind label"},"setSubmitKeybind":{"message":"Kısımları gönder","description":"Keybind label"},"setPreviewKeybind":{"message":"Kısmı ön izle","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Atlama bildirimini kapat","description":"Keybind label"},"setDownvoteKeybind":{"message":"Kısma eksi puan ver","description":"Keybind label"},"setUpvoteKeybind":{"message":"Kısma artı puan ver","description":"Keybind label"},"nextChapterKeybind":{"message":"Sonraki bölüm","description":"Keybind label"},"previousChapterKeybind":{"message":"Önceki bölüm","description":"Keybind label"},"enableDeArrowKey":{"message":"DeArrow'u aktif et","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Gönderiler menüsünü aç","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Kullanmak istediğiniz tuşu yazın ve kombine etmek istediğiniz tuşları seçin."},"disableSkipping":{"message":"Atlama etkin"},"enableSkipping":{"message":"Atlama devre dışı"},"yourWork":{"message":"Çalışmalarınız","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Hata Kodu: "},"skip":{"message":"Atla"},"mute":{"message":"Sustur"},"full":{"message":"Videonun Tamamı","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"{0} atla?"},"mute_category":{"message":"{0} susturulsun mu?"},"skip_to_category":{"message":"{0} kısmına atlansın mı?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"{0} yaklaşıyor","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} Atlandı","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} susturuldu","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"{0} kısmına atlandı","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"{0} üzerinde oylandı","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Otomatik Atlamayı Devredışı Bırak"},"enableAutoSkip":{"message":"Otomatik Atlamayı Devreye Sok"},"audioNotification":{"message":"Atlamada Sesli Bildirim"},"audioNotificationDescription":{"message":"Atlama sırasında sesli bildirim, bir kısım atlandığında bir ses çıkarır. Devre dışı bırakılırsa (veya otomatik atlama devre dışı bırakılırsa), ses çalınmaz."},"showTimeWithSkips":{"message":"Atlanan Kısımları Silinmiş Süreyi Göster"},"showTimeWithSkipsDescription":{"message":"Bu süre, video ilerleme çubuğunun altındaki geçerli zamanın yanında parantez içinde görüntülenir. Bu, videodaki kısımların silinmiş toplam video süresini gösterir. Bu, yalnızca \"Video İlerleme Çubuğunda Göster\" olarak işaretlenen kısımları içerir."},"youHaveSkipped":{"message":"Şu kadar kısım atladınız: "},"minLower":{"message":"dakika"},"minsLower":{"message":"dakika"},"hourLower":{"message":"saat"},"hoursLower":{"message":"saat"},"youHaveSavedTime":{"message":"İnsanların şu kadar vaktini kurtardınız:","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" yaşam süresi","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Sunucu durumu için status.sponsor.ajay.app kontrol edin."},"changeUserID":{"message":"Özel Kullanıcı Kimliğini İçe/Dışa Aktar"},"whatChangeUserID":{"message":"Bu gizli tutulmalıdır. Bu bir şifre gibidir ve kimseyle paylaşılmamalıdır. Eğer birisi buna sahipse, seni taklit edebilir. Herkese açık kullanıcı kimliğinizi arıyorsanız, açılır pencerede pano simgesine tıklayın."},"setUserID":{"message":"Özel Kullanıcı Kimliğini Ayarla"},"userIDChangeWarning":{"message":"Uyarı: Özel Kullanıcı Kimliğini değiştirmek kalıcıdır. Bunu yapmak istediğinizden emin misiniz? Her ihtimale karşı eskisini yedeklediğinizden emin olun."},"createdBy":{"message":"Oluşturan"},"supportOtherSites":{"message":"3. Taraf YouTube Sitelerini Destekle"},"supportOtherSitesDescription":{"message":"3. taraflarca yazılmış YouTube istemcileri desteği. Kullanabilmek için ilave izinler vermelisiniz.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Desteklenen Siteler: "},"optionsInfo":{"message":"Invidious desteğini, otomatik atlamayı, butonları saklamayı ve daha fazlasını etkinleştir."},"addInvidiousInstance":{"message":"3. Taraf İstemci Örneği Ekle"},"addInvidiousInstanceDescription":{"message":"Özel bir örnek ekle. Buraya sadece alan adı yazılmalıdır. Örnek: invidious.ajay.app"},"add":{"message":"Ekle"},"addInvidiousInstanceError":{"message":"Bu geçersiz bir alan adı. Bu SADECE alan adı kısmını içermelidir. Örnek: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Invidious Oluşum Listesini Sıfırla"},"resetInvidiousInstanceAlert":{"message":"Invidious Oluşum listesini sıfırlamak üzeresiniz"},"invidiousDisabledSafari":{"message":"Safari'deki bir hata nedeniyle Invidious desteği Safari'de mevcut değildir, Apple bu hatayı giderince geri eklenecektir."},"currentInstances":{"message":"Mevcut Oluşumlar:"},"minDuration":{"message":"Minimum süre (saniye):"},"minDurationDescription":{"message":"Ayarlanan değerden daha kısa kısımlar atlanmayacak veya oynatıcıda gösterilmeyecektir."},"enableManualSkipOnFullVideo":{"message":"Bütün video etiketi mevcut olduğunda manuel atlama özelliğini kullanın"},"whatManualSkipOnFullVideo":{"message":"Video boyunca sponsorlu veya kendi reklamını yapıyorsa videoyu kesintisiz izlemek isteyenler için."},"skipNoticeDuration":{"message":"Atlandı uyarısı süresi (saniye cinsinden):"},"skipNoticeDurationDescription":{"message":"Bir kısım atlandığında ekranda atlandı uyarısı bu süre kadar gösterilir. Atlama elle gerçekleştiğinde bu uyarı daha uzun sürebilir."},"shortCheck":{"message":"Sıradaki öneri belirlediğiniz minimum süre ayarından daha kısa. Bu zaten yollandığı ve bu ayardan dolayı yok sayıldığı anlamına gelebilir. Göndermek istediğinizden emin misiniz?"},"liveOrPremiere":{"message":"Bir canlı yayın veya ön gösterim sırasında segment gönderilemez. Yayının bitmesini bekleyin, sonra sayfayı tazeleyip kısımların geçerli olduğunu kontrol edin."},"showUploadButton":{"message":"Karşıya Yükleme Butonunu Göster"},"customServerAddress":{"message":"SponsorBlock Sunucu Adresi"},"customServerAddressDescription":{"message":"SponsorBlock'un sunucu ile iletişimi sağlamak için kullandığı adres.\nKendi sunucu kopyanız olmadığı sürece bu değiştirilmemelidir."},"dataFetchingServerAddress":{"message":"Veri Alınan Sunucu Adresi"},"dataFetchingServerAddressDescription":{"message":"Veri alınan sunucu ile iletişim kurmak için kullanılan adres.\nKendi sunucu kopyanız olmadığı sürece bu değiştirilmemelidir."},"thumbnailCacheServerAddress":{"message":"Küçük resim önbellekleyen sunucu adresi"},"save":{"message":"Kaydet"},"reset":{"message":"Sıfırla"},"customAddressError":{"message":"Bu adres doğru formatta değil. Başında http:// veya https:// olduğundan ve sonda / işareti olmadığından emin olun."},"areYouSureReset":{"message":"Bunu sıfırlamak istediğinize emin misiniz?"},"mobileUpdateInfo":{"message":"m.youtube.com şu an desteklenmektedir"},"exportOptions":{"message":"Bütün Ayarlarını İçe/Dışa Aktar"},"exportOtherData":{"message":"Diğer tüm veriyi al/ver"},"exportOptionsCopy":{"message":"Düzenle/kopyala"},"exportOptionsDownload":{"message":"Dosyaya kaydet"},"exportOptionsUpload":{"message":"Dosyadan yükle"},"whatExportOptions":{"message":"Bu, JSON'daki tüm yapılandırmanızdır. Buna Özel Kullanıcı Kimliğiniz de dahildir, bu yüzden bunu paylaşırken dikkatli olun."},"setOptions":{"message":"Seçenekleri Ayarla"},"exportOptionsWarning":{"message":"Uyarı: Ayarları değiştirmek kalıcıdır ve yüklemenizi bozabilir. Bunu yapmak istediğinizden emin misiniz? Eskisini yenilediğinizden emin olun."},"incorrectlyFormattedOptions":{"message":"Bu JSON doğru formatlanmamış. Ayarlarınız değiştirilmedi."},"confirmNoticeTitle":{"message":"Bölüm Gönder"},"submit":{"message":"Gönder"},"cancel":{"message":"İptal"},"delete":{"message":"Sil"},"preview":{"message":"Önizle"},"unsubmitted":{"message":"Gönderilmemiş"},"inspect":{"message":"Kontrol et"},"edit":{"message":"Düzenle"},"copyDebugLogs":{"message":"Hata Giderme Kayıtlarını Kopyala"},"copyDebugInformation":{"message":"Onarım Bilgisini Panoya Kopyala"},"copyDebugInformationFailed":{"message":"Panoya kopyalanamadı"},"copyDebugInformationOptions":{"message":"Panoya, geliştiricinin hata gideriminde veya ulaşmak istediğinde geliştiriciye sağlamak üzerine bilgileri kaydeder. Kullanıcı kimliği, beyaz listenizdeki kanallar ve düzenlenmiş sunucu adresleri gibi hassas bilgiler silinmiştir. Ancak tarayıcı bilgileri, işletim sisteminiz ve eklenti numaranız gibi bilgileri içerebilir. "},"copyDebugInformationComplete":{"message":"Bu çözüm bilgisi panoya kopyalandı. Paylaşmak istemediğiniz herhangi bir bilgiyi silmekte özgürsünüz. Bir yazı dosyası olarak kaydedin veya hata raporuna kopyalayın."},"keyAlreadyUsed":{"message":"Bu kısayol başka bir eyleme atanmış. Lütfen başka kısayol seçin."},"to":{"message":"'e","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Kopyalandı!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Segue geçişlerini dahil et"},"generic_guideline2":{"message":"Hiçbir şey atlanmamış gibi oynuyor"},"category_sponsor":{"message":"Sponsor"},"category_sponsor_description":{"message":"Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendini pazarlayan veya beğendiği içerik üreticilerine/sitelere/ürünlere atıfta bulunanlar için değil."},"category_sponsor_guideline1":{"message":"Ücretli promosyonlar"},"category_sponsor_guideline2":{"message":"Bağışlar veya özel ürünler için değil"},"category_selfpromo":{"message":"Karşılıksız/Kendi Reklamı"},"category_selfpromo_description":{"message":"\"Sponsor\" seçeneğinden farkı para karşılığı olmaması veya kendi reklamını yapmasıdır. Buna kendi markalı ürünlerini satmak, bağış toplamak ve videoda işbirliği yaptığı kimselerden bahsetmek dahildir."},"category_selfpromo_guideline1":{"message":"Bağışlar, üyelikler ve özel ürünler"},"category_selfpromo_guideline2":{"message":"Videoya eklenmeyen ücretsiz konuşmalar"},"category_selfpromo_guideline3":{"message":"Kurumsal tasarım ürünleri ve malları için değil"},"category_exclusive_access":{"message":"Özel Erişim"},"category_exclusive_access_description":{"message":"Yalnızca bütün videoyu etiketlemek için kullanın. Video; ücretli veya ücretsiz elde edilen bir ürünün, hizmetin veya bir yerin reklamını yapıyorsa kullanılır."},"category_exclusive_access_pill":{"message":"Bu video; yayıncıya özel ücretle veya ücretsiz sunulan bir ürünün, hizmetin veya bir yerin reklamını yapıyor","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Tüm video, ücretsiz veya sübvansiyonlu erişime sahip bir şeyi sergiliyor"},"category_interaction":{"message":"Etkileşim Hatırlatıcısı (Abonelik)"},"category_interaction_description":{"message":"Videonun ortasında beğenmek, abone olmak veya takip etmek için kısa bir hatırlatma olan kısımdır. Eğer süresi uzunsa veya belirli bir şey hakkındaysa, kendi reklamını yapan kategorisi seçilmelidir."},"category_interaction_guideline1":{"message":"Beğenmek, abone olmak veya takip etmek için kısa hatırlatıcılar"},"category_interaction_guideline2":{"message":"Yorum yapmak için dolaylı hatırlatıcılar içerir"},"category_interaction_guideline3":{"message":"Genel tanıtım için değil, yalnızca harekete geçirici mesajlar"},"category_interaction_short":{"message":"Etkileşim Hatırlatıcısı"},"category_intro":{"message":"Aralık/Giriş Animasyonu"},"category_intro_description":{"message":"Gerçek içeriği olmayan bir aralık. Duraklama, sabit ekran, tekrar eden animasyon olabilir. Bu bilgi içeren geçişler için kullanılmamalıdır."},"category_intro_short":{"message":"Aralık"},"category_intro_guideline1":{"message":"Gerçek içerik olmayan aralık"},"category_intro_guideline2":{"message":"Bilgi içeren geçişler için değil"},"category_outro":{"message":"Bitiş Ekranı/Jenerik"},"category_outro_description":{"message":"Videoda emeği geçenlerin veya video sonunda çıkan kartların gösterildiği kısımlar. Bilgilendirici sona sahip videolar için değil."},"category_outro_guideline1":{"message":"Bitiş kartları ekranda olsa bile içerik eklemeyin"},"category_preview":{"message":"Ön İzleme/Özet"},"category_preview_description":{"message":"Bu videoda veya diğer videolarda neler olduğunu gösteren, videonun ilerleyen zamanında tüm bilgilerin tekrarlandığı bir dizi klip koleksiyonudur."},"category_preview_guideline1":{"message":"Daha sonra veya gelecekteki bir videoda görünen klipler"},"category_preview_guideline2":{"message":"Bir önceki videonun özeti"},"category_preview_guideline3":{"message":"Ek içerik ekleyen bölümler için değil"},"category_hook":{"message":"İma/Selamlama","description":"https://en.wikipedia.org/wiki/Narrative_hook"},"category_hook_description":{"message":"Gelecek video için anlatımlı fragmanlar, selamlaşmalar ve vedalaşmalar. Bunun bilgi içeren çıkarımları atlamaması gerekir."},"category_hook_guideline1":{"message":"Gelecek video için anlatımlı fragmanlar"},"category_hook_guideline2":{"message":"İzleyicileri karşılayan veya vedalaşan selamlaşma ifadeleri"},"category_hook_guideline3":{"message":"Ek içerik ekleyen bölümler için değil"},"category_filler":{"message":"Geyik Muhabbeti / Şakalar"},"category_filler_description":{"message":"Videonun ana içeriğini anlamak için gerekli olmayan, yalnızca geyik muhabbeti veya şakalardan oluşan sahneler. Bu, bağlam veya arka plan ayrıntılarını sağlayan kısımları içermemelidir. Bu, \"eğlence\" havasında olmadığınız zamanlar için tasarlanmış çok agresif bir kategoridir."},"category_filler_short":{"message":"Alâkasız"},"category_filler_guideline1":{"message":"Geyik muhabbeti veya şakalar"},"category_filler_guideline2":{"message":"Dikkat dağıtıcı şeyler, hatalar, tekrarlar"},"category_filler_guideline3":{"message":"Konuyu anlamak için gerekli sahneler için değil"},"category_music_offtopic":{"message":"Müzik: Müzik Olmayan Bölüm"},"category_music_offtopic_description":{"message":"Yalnızca müzik videolarında kullanım içindir. Bu yalnızca başka bir kategoriye katılmamış müzik videolarının parçaları için kullanılmalıdır."},"category_music_offtopic_short":{"message":"Müzik Olmayan Bölüm"},"category_music_offtopic_guideline1":{"message":"Resmi sürümlerde olmayan bölümler"},"category_music_offtopic_guideline2":{"message":"Canlı performansta müzik dışı"},"category_poi_highlight":{"message":"Vurgu"},"category_poi_highlight_description":{"message":"Videoda, çoğu insanın aradığı kısım. \"Video x sürede başlıyor\" yorumlarına benzer."},"category_poi_highlight_guideline1":{"message":"Çoğu kişinin aradığı bölüm"},"category_poi_highlight_guideline2":{"message":"Bağlamı atlayabilir"},"category_poi_highlight_guideline3":{"message":"Başlığa veya küçük resme atlayabilir"},"category_chapter":{"message":"Bölüm"},"category_chapter_description":{"message":"Bir videonun ana kısımlarını açıklayan özel adlandırılmış bölümler."},"category_chapter_guideline1":{"message":"Sponsor marka isimlerinden bahsetmekten sakının"},"category_chapter_guideline2":{"message":"Genel segmentler için daha büyük bölümler kullanın"},"category_chapter_guideline3":{"message":"Daha küçük bölümler daha büyük bölümlerin içine yerleştirilebilir"},"category_livestream_messages":{"message":"Canlı Yayın: Bağış/Mesaj Okuma"},"category_livestream_messages_short":{"message":"Canlı Yayın Mesajlarını Okumak"},"autoSkip":{"message":"Otomatik Atla"},"manualSkip":{"message":"Elle Atla"},"showOverlay":{"message":"Arama Çubuğunda Göster"},"disable":{"message":"Devredışı"},"autoSkip_POI":{"message":"Başlangıca otomatik atla"},"manualSkip_POI":{"message":"Videonun başında sor"},"showOverlay_POI":{"message":"Arama Çubuğunda Göster"},"showOverlay_full":{"message":"Etiketi Göster"},"showOverlay_chapter":{"message":"Bölümleri Göster"},"autoSkipOnMusicVideos":{"message":"Müzik olmayan kısım varsa tüm kısımları otomatik atla"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Sadece music.youtube.com'da otomatik atla"},"muteSegments":{"message":"Atlamak yerine sesi kapatan bölümlere izin ver"},"fullVideoSegments":{"message":"Video bütünüyle bir reklamsa simge göster","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Etiketleri, video küçük resimlerinde de göster","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Gönderilmemiş Renk","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Oynatma Çubuğu Rengi"},"category":{"message":"Kategori"},"skipOption":{"message":"Atlama Seçeneği","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Gelişmiş atlama ayarlarını aç"},"advancedSkipNotSaved":{"message":"Söz dizimi hatası: Seçenekleriniz kaydedilmedi"},"advancedSkipSettingsHelp":{"message":"Bu nasıl çalışıyor","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Beta Deneme Sunucusunu Devreye Sok"},"whatEnableTestingServer":{"message":"Önerileriniz ve oylarınız ana sunucuya GÖNDERİLMEYECEKTİR. Bunu sadece deneme amacıyla kullanın."},"testingServerWarning":{"message":"Tüm öneriler ve oylar, test sunucusuna bağlandığınız sürece ana sunucuya iletilmeyecektir. Gerçek öneriler yapmak istediğinizde bu ayarı kapatmayı unutmayın."},"bracketNow":{"message":"(Şimdi)"},"moreCategories":{"message":"Daha Fazla Kategori"},"chooseACategory":{"message":"Bir Kategori Seç"},"enableThisCategoryFirst":{"message":"\"{0}\" kategorisinde bir kısım göndermek için onu ayarlardan açmalısınız. Ayarlara yönlendiriliyorsunuz.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Uyarı: Bu tür kısımlardan sadece bir adet etkin olabilir. Birden fazla gönderdiğinizde onlardan rastgele biri gösterilir."},"youMustSelectACategory":{"message":"Göndereceğin tüm kısımlar için bir kategori seçmelisin!"},"bracketStart":{"message":"(Baş)"},"bracketEnd":{"message":"(Son)"},"End":{"message":"Son","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"gizlendi: eksile"},"hiddenDueToDuration":{"message":"gizlendi: çok kısa"},"manuallyHidden":{"message":"elle gizlendi"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Kanal kimliği henüz yüklenmedi. Gömülü bir video kullanıyorsanız, bunun yerine YouTube ana sayfasından izlemeyi deneyin. Bu, YouTube düzenindeki değişikliklerden de kaynaklanabilir, eğer öyleyse, buraya bir yorum yazın:"},"invidiousPermissionRefresh":{"message":"Tarayıcınız, eklentinin Invidious ve diğer 3. taraf sitelerde çalışması için gerekli izni kaldırdı. Bu izni yeniden etkinleştirmek için lütfen aşağıdaki butona tıklayın."},"acceptPermission":{"message":"İzni kabul et"},"permissionRequestSuccess":{"message":"İzin isteği başarılı!"},"permissionRequestFailed":{"message":"İzin isteği başarısız. Reddet butonuna mı tıkladınız?"},"adblockerIssueWhitelist":{"message":"Bunu çözemiyorsanız, SponsorBlock, bu video için kanal bilgilerini alamadığı için 'Atlamadan Önce Kanal Kontrolünü Zorla' ayarını devre dışı bırakın"},"forceChannelCheck":{"message":"Atlamadan Önce Kanal Kontrolüne Zorla"},"whatForceChannelCheck":{"message":"Varsayılan olarak, kanalın ne olduğunu bile bilmeden hemen kısımları atlayacaktır. Videonun başlangıcındaki bazı kısımları beyaz listeye eklenmiş kanallarda atlayabilir. Bu seçeneğin etkinleştirilmesi bunu önleyecektir ancak tüm atlamaların yapılması, kanal kimliğinin alınması biraz zaman alabileceğinden küçük bir gecikmeye neden olur. Hızlı bir bağlantın varsa bu gecikme fark edilmeyebilir."},"forceChannelCheckPopup":{"message":"\"Atlamadan Önce Kanal Kontrolünü Zorla\" Seçeneğini Etkinleştirmeyi Düşünebilirsiniz"},"downvoteDescription":{"message":"Hatalı/Yanlış Zaman"},"incorrectVote":{"message":"Hatalı"},"harmfulVote":{"message":"Zararlı","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Kategoriyi Değiştir"},"nonMusicCategoryOnMusic":{"message":"Bu video müzik olarak sınıflandırılmıştır. Bunun bir sponsor olduğundan emin misin? Bu aslında bir \"Müzik Dışı bölüm\" ise, uzantı seçeneklerini açın ve bu kategoriyi etkinleştirin. Ardından, bu kısmı sponsor yerine \"Müzik Olmayan\" olarak gönderebilirsiniz. Kafanız karıştıysa lütfen yönergeleri okuyun."},"multipleSegments":{"message":"Birden Çok Bölüm"},"guidelines":{"message":"Kılavuz"},"readTheGuidelines":{"message":"Kılavuzu Oku!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Kategoriler burada!"},"categoryUpdate2":{"message":"Girişleri, bitişleri, ürünleri ve benzeri şeyleri atlamak için ayarları açın."},"help":{"message":"Yardım"},"GotIt":{"message":"Anladım","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Bu kısım büyük. Bütün video tek bir konu hakkındaysa \"Atla\" yerine \"Bütün Video\"yu seçin. Daha çok bilgi için kılavuzlara bakın."},"categoryPillTitleText":{"message":"Bu videonun bütünü bu şekilde sınıflandırılmış ve kısımları birbirinden ayrılamayacak kadar sıkı bütünleştirilmiş"},"chapterNameTooltipWarning":{"message":"Bölüm adlarınızdan biri bir kategoriye benziyor. Bunun yerine mümkün olduğunda kategorileri kullanmalısınız."},"experiementOptOut":{"message":"Gelecekteki deneylerin hiçbirine katılma","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Asla gösterme"},"warningChatInfo":{"message":"Yaygın hataları sıkça yaptığınız anlaşılıyor. Çabalarınız için sağolun fakat burada mükemmel bir sonuç istiyoruz, küçük hatalar bile fark ediyor :)"},"questionButton":{"message":"Bir sorum var"},"askAQuestion":{"message":"Soru sor"},"warningConfirmButton":{"message":"Nedenini anlıyorum"},"warningError":{"message":"Uyarıyı tanımlamaya çalışırken hata oluştu:"},"deArrowMessageRecieved":{"message":"Moderatör tarafından bir öneri aldınız"},"Donate":{"message":"Bağış Yap"},"considerDonating":{"message":"Geliştirme sürecinin fonlanmasına yardım et"},"supportSponsorBlock":{"message":"SponsorBlock'taki tam zamanlı işimi destekleyin"},"hideDonationLink":{"message":"Bağış Bağlantısını Gizle"},"darkModeOptionsPage":{"message":"Ayarlar Sayfasında Karanlık Modu"},"helpPageThanksForInstalling":{"message":"SponsorBlock'u yüklediğiniz için teşekkürler."},"helpPageReviewOptions":{"message":"Lütfen aşağıdaki seçenekleri inceleyin"},"helpPageFeatureDisclaimer":{"message":"Birçok özellik varsayılan olarak devre dışıdır. İntroları, outroları atlamak vb. kullanmak istiyorsanız, bunları aşağıdan etkinleştirin. Ayrıca arayüz öğelerini gizleyebilir/gösterebilirsiniz."},"helpPageHowSkippingWorks":{"message":"Nasıl çalışıyor"},"helpPageHowSkippingWorks1":{"message":"Tüm sponsor bildirimleri sizin gibi kullanıcılar tarafından sağlanır. Veri tabanına gönderilmiş sponsor bildirimlerini görmek için tarayıcınızın sağ üstündeki açılır pencereyi kullanabilirsiniz."},"helpPageHowSkippingWorks2":{"message":"Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på downvote! Du kan også stemme i popup-vinduet."},"Submitting":{"message":"Gönderiliyor"},"helpPageSubmitting1":{"message":"Bildirmek için video oynatıcıdaki SponsorBlock düğmesini kullanabilirsiniz."},"helpPageSubmitting2":{"message":"Oynatma simgesi bir kısmın başladığını ve durdurma simgesi kısmın bittiğini belirtir. Yukarı yönlü oka tıklamak, kısımları göndermeden önce düzenleyip görebileceğiniz ve uygun olduğunu düşündüğünüz kısımları göndermenizi sağlayan bir menüye yönlendirir. Hassas ve doğru olması önemlidir, katkıda bulunmadan önce yönergeleri okuduğunuza emin olunuz."},"helpPageCopyOfDatabase2":{"message":"Kaynak koduna serbestçe erişilebilir. Ben bir gün bu dünyada yalan olsam dahi, sizin gönderdiğiniz kısımlar kaybolmayacak."},"Credits":{"message":"Emeği Geçenler"},"LearnMore":{"message":"Dahasını Öğren"},"FullDetails":{"message":"Tüm Detaylar"},"CopyDownvoteButtonInfo":{"message":"Olumsuz oy verir ve yeni bir kısım seçmeniz için bir kopya oluşturur"},"OpenCategoryWikiPage":{"message":"Bu kategorinin wiki sayfasını açın."},"CopyAndDownvote":{"message":"Kopyala ve olumsuz"},"ContinueVoting":{"message":"Oylamaya devam et"},"ChangeCategoryTooltip":{"message":"Bu, kısımlarınız için anında geçerli olur"},"downvote":{"message":"Eksi oy"},"upvote":{"message":"Olumlu oy"},"hideSegment":{"message":"Kısmı gizleyin"},"skipSegment":{"message":"Kısmı atla"},"playChapter":{"message":"Bölümü oynat"},"SponsorTimeEditScrollNewFeature":{"message":"Zaman aralığını hızlı bir şekilde ayarlamak için düzenleme kutusunun üzerinde fare tekerini kullanın. Değişikliklere ince ayar yapmak için ctrl veya shift tuşunun kombinasyonları kullanılabilir."},"categoryPillNewFeature":{"message":"Yeni! Videonun bütünü sponsor veya kendi reklamıysa bu uyarıyı görün"},"yearAbbreviation":{"message":"y","description":"100y"},"dayAbbreviation":{"message":"g","description":"100d"},"hourAbbreviation":{"message":"s","description":"100h"},"optionsTabBehavior":{"message":"Davranış","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Arayüz","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Klavye kısayolları","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Yedekle/Geri Yükle","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Çeşitli","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Atlama uyarısı görünümü","description":"Option label"},"unbind":{"message":"Klavye kısayolunu kaldır","description":"Unbind keyboard shortcut"},"notSet":{"message":"Ayarlanmadı"},"change":{"message":"Değiştir"},"youtubeKeybindWarning":{"message":"Bu kısayol YouTube tarafından kullanılıyor. Bunu kullanmak istediğinize emin misiniz?"},"betaServerWarning":{"message":"BETA Sunucusu etkinleştirildi!"},"openOptionsPage":{"message":"Seçenekler sayfasını aç"},"resetToDefault":{"message":"Ayarları varsayılana sıfırla"},"confirmResetToDefault":{"message":"Tüm ayarları varsayılan değerlerine sıfırlamak istediğinizden emin misiniz? Bu geri alınamaz."},"exportSegments":{"message":"Segmentleri dışa aktar"},"importSegments":{"message":"Kısımları içe aktar"},"Import":{"message":"İçeri aktar","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Kullanım Başarılı!"},"redeemFailed":{"message":"Lisans anahtarı geçersiz"},"hideUpsells":{"message":"Ekstra ödeme olmadan kullanılamayan özellikleri gizle"},"hideNewFeatureUpdates":{"message":"Yeni güncellemeler hakkında mesajları gizle"},"redeem":{"message":"Kullan"},"enterLicenseKey":{"message":"Lisans Anahtarını Girin"},"unsubmittedSegmentCounts":{"message":"Şu anda {1} da {0} var","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Gönderilmemiş kısmınız bulunmamaktadır","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"gönderilmemiş kısım","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"gönderilmemiş kısımlar","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"videolar","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Tüm kısımları temizle","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Gönderilmemiş tüm kısımları temizlemek istediğinizden emin misiniz?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Kısımları göster","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Kısımları gizle","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"Video ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Kısım Sayısı","description":"Header of the unsubmitted segments list"},"actions":{"message":"İşlemler","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"URL olarak paylaş"},"segmentFetchFailureWarning":{"message":"Dikkat: Sunucu henüz kısımlarla yanıt vermedi. Aslında bu videoda zaten gönderilmiş bölümler olabilir, ancak sunucudaki sorunlar nedeniyle bunları almadınız."},"allowScrollingToEdit":{"message":"Zamanları Düzenlemek İçin Kaydırmaya İzin Ver"},"NoticeTimeAfterSkip":{"message":"{seconds}sn","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - YouTube İçin Daha İyi Başlıklar Ve Küçük Resimler","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Başlıkları ve küçük resimleri açıklayıcı ve sansasyonel olmayacak şekilde topluluk kaynakları ile oluştur","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"En açıklayıcı olanı seçin"},"Original":{"message":"Orijinal"},"OriginalTitle":{"message":"Orijinal Başlık"},"CurrentTime":{"message":"Şu Anki Zaman"},"resetCustomTitle":{"message":"Başlığı Orijinal Metne Döndür"},"resetIcon":{"message":"Simgeyi Sıfırla"},"TypeYourOwnTitleHere":{"message":"Kendi başlığınızı buraya yazınız"},"VideoNotReady":{"message":"Video hazır değil"},"FailedToRender":{"message":"İşleme başarısız","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Tuval eksik","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"İşleme sırasında hata","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Yükleme başarısız","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Başlık Formatı"},"Disabled":{"message":"Devre Dışı Bırakıldı"},"CapitalizeWords":{"message":"Kelimeleri Büyük Harfle Yaz"},"TitleCase":{"message":"Başlık Biçimi"},"SentenceCase":{"message":"Cümle Biçimi"},"LowerCase":{"message":"Küçük Harf Biçimi"},"FirstLetterUppercase":{"message":"İlk Harf Büyük"},"shouldCleanEmojis":{"message":"Emojileri Sil"},"onlyFormatCustomTitles":{"message":"Yalnızca kullanıcılar tarafından gönderilen başlıkları biçimlendir"},"onlyTitleCaseInEnglish":{"message":"İngilizce Olmayan Başlıkları Büyük Harflerle Yaz"},"onlyTitleCaseInEnglishDescription":{"message":"Dil tanıma mükemmel değildir ve bazı başlıkları gerçeğinden başka diller olarak algılayabilir."},"thumbnailFallbackOption":{"message":"Sunulan Küçük Resim Yoksa"},"whatThumbnailFallbackOption":{"message":"Rastgele bir zaman seçerken, tanıtım bölümünden bir zamanın seçilmediğini sağlamak için SponsorBlock verilerini kullanacaktır.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Rastgele bir zamandan ekran görüntüsü göster"},"TheOriginalThumbnail":{"message":"Orijinal küçük resmi göster"},"showABlankBox":{"message":"Boş bir kutu göster"},"AutoGenerated":{"message":"YouTube tarafından otomatik olarak oluşturulan bir küçük resim göster","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Başlangıç"},"Middle":{"message":"Orta"},"keepUnsubmitted":{"message":"Sunulan oyları sakla"},"showLiveCover":{"message":"Gelecek Videolarda Kanal Avatarını Göster","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Küçük Resimlerin A/B Testini Bastır"},"ignoreAbThumbnailsDescription":{"message":"Video yükleyenler, videolarında farklı kişilere farklı başlık ve küçük resim gösterebilirler. Bu seçenek seçilirse, tutarlılık için her zaman ilk seçenek kullanılacaktır."},"abThumbnailsWarning":{"message":"Uyarı: Bu videoda şu anda bir küçük resim A/B testi uygulanmaktadır. Bu, küçük resmin sık sık değişebileceği anlamına gelir. Bu risk nedeniyle muhtemelen orijinal küçük resme oy vermemelisiniz."},"whatKeepUnsubmitted":{"message":"Oyladıktan sonra sunulan oyları saklayarak, sunucuda en çok oy alan yerine sizin seçtiğiniz başlıkları ve küçük resimleri gösterir."},"keepUnsubmittedInPrivate":{"message":"Gizli Sekmelerden Verilen Oyları Sakla"},"useThumbnailGenerationService":{"message":"Küçük Resim Oluşturma Servisini Kullan"},"titleMaxLines":{"message":"Başlık için izin verilen satır sayısı"},"titleMaxLinesDescription":{"message":"Video başlıkları önerilerde bu kadar satıra yayılacaktır."},"thumbnailSaturationLevel":{"message":"Küçük resmin renk doyması"},"whatSaturateThumbnails":{"message":"Küçük resimleri, renklerini soldurarak daha az belirgin yap"},"hideDetailsWhileFetching":{"message":"Verilerin getirilmesi devam ederken ayrıntıları gizle"},"hideDetailsWhileFetchingDescription":{"message":"Sunucudan veri çekilirken başlıkları ve küçük resimleri gösterme. Bu seçenek kapalı ise başlıklar ve küçük resimler değiştirilirken ekranda parlamalar olabilir."},"ignoreTranslatedTitles":{"message":"YouTube'un çevrilen başlıklarını gösterme","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube bazen orijinal başlıkları sizin dilinize çevirir. Bu özellik kitle kaynaklı bir başlık olmadığında çalışır."},"onAllPages":{"message":"Tüm Sayfalarda","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Video Sayfaları Hariç Tüm Sayfalarda","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Hiçbir zaman"},"thumbnailGeneratorDescription1":{"message":"Küçük resim oluşturma hizmeti, video kimliğiyle anonim bir istek göndererek uzak bir sunucuya küçük resim oluşturmayı önemli ölçüde hızlandırır. Küçük resim ya oluşturulur ya da zaten oluşturulmuşsa önbellekten alınır."},"thumbnailGeneratorDescription2":{"message":"Eğer video sayfalarında kullanılırsa, bu potansiyel olarak bu sunucuya gizlenmiş video kimliklerini sızdırabilir. Bunun \"Video Sayfaları Hariç Tüm Sayfalarda\" olarak ayarlanması bu sorunu önleyecektir. Başka bir seçenek, kendi küçük resim oluşturma hizmetinizi barındırmaktır."},"thumbnailGeneratorDescription3":{"message":"Eğer küçük resim oluşturma hizmetinin kullanımı devre dışı bırakılırsa, tüm istekler k-anonymity sorgu sistemini kullanacak, bu da sunucunun hangi videoların alındığını tahmin etmesini zorlaştıracak ve daha yavaş bir yerel küçük resim oluşturma hizmeti kullanılacaktır.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Küçük Resim Oluşturma Servisinin Kaynak Kodları"},"moreAboutKAnonymity":{"message":"K-Anonymity Hakkında Daha Fazlası","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Her Zaman \"Orjinalini Göster\" Butonunu Göster"},"whatAlwaysShowShowOriginalButton":{"message":"Eğerki her zaman bir başlık/küçük resminin değişip değişmediğini bilmek istiyorsanız, bunu etkinleştirin."},"showOriginalOnHover":{"message":"Fareyle üzerine gelindiğinde özel ayrıntılar ve orijinal ayrıntılar arasında geçiş yap"},"showOriginalOnHoverOfVideo":{"message":"Video kartının üzerindeki herhangi bir yerin üzerine gelindiğinde özel ayrıntılar ile orijinal ayrıntılar arasında geçiş yap"},"showOriginalOnHoverOfVideoDescription":{"message":"Bu ayar, fareyle videonun üzerine gelindiğinde videonun otomatik oynatılmasını devre dışı bırakır"},"showCustomOnHoverIfCasual":{"message":"Bir sıradan mod başlığı gösteriliyorsa özel başlığı üzerine gelindiğinde göster"},"showIconForFormattedTitles":{"message":"Otomatik Formatlanmış Başlıklar İçin 'Orijinalini Göster\" Butonunu Göster"},"Enable":{"message":"Etkinleştir"},"Titles":{"message":"Başlıklar","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Küçük Resimler","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Sıradan mod oyları","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Hata"},"ShowOriginal":{"message":"Orijinal Ayrıntıları Göster"},"ShowModified":{"message":"Değiştirilmiş Ayrıntıları Göster"},"ShowFormatted":{"message":"Biçimlendirilmiş Ayrıntıları Göster"},"FillerWarning":{"message":"Uyarı: Bu son derece agresif bir kategoridir. Muhtemelen bazı içerikleri atlamak veya bazen devre dışı bırakmanız gerekebilir. Ancak unutmayın, gönderirken hala belirli kurallara uymamız gerektiğini unutmayın. Birçok video, videonun %50'den fazlasının atlandığı veya daha fazla olduğu bir durumdadır!","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Kalıcı olarak bu sohbette kalmak için. Discord yada Matrixe katıl","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Yardım Kılavuzunu Göster","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Aşırı abartılı yüz ifadelerinden kaçının","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Büyük resmi düşünün, sadece orijinal başlığın sorusunu cevaplamayın","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Videoya tepki niteliğinde açıklamalardan kaçının ('Mesela Şok Edici!')","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Tıklamadan önce bilinçli bir tercih yapabilmek için yeterli bilgiyi sağlayın"},"tip5":{"message":"Bir cümle gibi ilk harfi büyüt","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Göndermek için tüm yönergeleri kontrol et","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Başlığım bir cümle gibi büyük harfle başlıyor","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Başlığım, başlıktaki bir sorunun cevabından ibaret değil","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Başlıklar videoyu betimlemeli veya içeriğini özetlemeli. Videonun orijinal başlığına bağlı kalmak yerine videonun tamamını izleyerek içeriğini öğrenmelisiniz.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Başlığım bir yargının özeti veya gereksiz bir spoiler değil","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Başlığı okumak videoyu izlemenin yerine geçmemeli, videoyu izleyip izlememeniz gerektiği ile ilgili size fikir vermeli.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Başlığım videoyu veya üreticisini sorgulamıyor, eleştirmiyor, aşağılamıyor veya gülünç duruma düşürmüyor","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Başlıklar videonun ve üreticinin bakış açısını yansıtmalıdır. Video içeriğinin doğruluğunu sorgulamak ve yargılamak DeArrow'un kapsamında değildir. Başlıklar yorum kısmı yerine geçmemelidir.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Algılanan sözcük: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Başlıkta gereksiz eylemler kullanmayınız","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Tüm başlıkları büyük harfle başlatınız. Başlıklar cümle gibi biçimlendirilmeli","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Başlıklar nokta (.) ile bitmemeli","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Orijinal başlıktaki sorunun cevabını ekleyip bırakmayın. Başlıklar videoyu betimlemeli veya içeriğini özetlemelidir","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Başlıklar videoyu veya üreticisini sorgulayıp yargılamamalı, eleştirmemeli, aşağılamamalı veya gülünç duruma düşürmemeli","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Başlıklar orijinal başlıktaki çarpıcı ögeleri içermemeli","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Başlıklarda emoji olmamalı","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Göndermeden önce uyarıyı incelemelisiniz"},"dearrowHelpSponsorBlockImported":{"message":"Not: SponsorBlock ayarların otomatik olarak içeri aktarıldı!"},"howItWorks":{"message":"Nasıl çalışıyor"},"discordPromotion":{"message":"Katkıda ve önerilerde bulunun ve {discord} veya {matrix} üzerinden yardımcı olun"},"deArrowDonationText":{"message":"Eğer şimdiye kadar yaptıklarımı beğendiyseniz ve maddi olarak yardımcı olmak isterseniz, işte bir bağlantı"},"termsAgreement":{"message":"Bu uzantıyı kullanarak, {privacy-policy} ve {terms} 'i kabul etmiş olursunuz"},"privacyPolicy":{"message":"Gizlilik Politikası"},"termsOfUse":{"message":"Kullanım Koşulları"},"openSourceLicenses":{"message":"Açık Kaynak Lisansları"},"defaultToOriginals":{"message":"Varsayılan olarak Orijinal Video Bilgileri"},"whatDefaultToOriginals":{"message":"Varsayılan olarak orijinal başlığı ve küçük resmi göster, ancak özel başlıkları ve küçük resimleri görmek için üzerine geldiğinizde görünen bir düğmeye sahip ol."},"replaceTitles":{"message":"Başlıkları Değiştir"},"replaceThumbnails":{"message":"Küçük Resimleri Değiştir"},"useCrowdsourcedTitles":{"message":"Topluluk Kaynaklı Başlıkları Kullan"},"whatUseCrowdsourcedTitles":{"message":"Eğer devre dışı bırakılırsa, başlıkları biçimlendirecek ancak topluluk tarafından gönderilen başlıkları kullanmayacaktır","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Bu yapılandırmayı silmek istediğinizden emin misiniz?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Yeni Yapılandırma"},"DeleteConfiguration":{"message":"Yapılandırmayı Sil"},"ChannelAllowlist":{"message":"Kanala özgü ayarlar"},"ConfigurationName":{"message":"Yapılandırma Adı"},"ChannelListInstructions":{"message":"Bu yapılandırmayı uygulamak istediğiniz kanalları aşağıdaki kutuya yeni satırlarla ayrılmış şekilde girin. Hem Kanal ID'leri hem de görüntülenen isimleri destekleniyor. \"@\" kullanan kullanıcı adları desteklenmez. Kanal kimliklerini kanalın hakkında sayfasında paylaş düğmesine tıklayarak alabilirsiniz.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Henüz yapılandırma ayarlanmadı. Yeni bir yapılandırma eklemek için üstteki düğmeye tıklayın.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Başlıkları ve küçük resimleri daha doğru olanlarla değiştirerek clickbaitleri durdurun"},"DeArrowPromotionMessage2":{"message":"Tıklama tuzaklarından sıkıldınız mı? Başlıkları ve küçük resimleri iyileştiren yeni uzantıma bir göz atın"},"DeArrowPromotionMessage3":{"message":"DeArrow'a da bir bakış at","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Bu başlığı beğenmediniz mi? Aşağıdaki başlığı tercih ediyorsanız, DeArrow'daki başlık değiştirme özelliğine de bakmayı unutmayın.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Bu küçük resim, bu videoda henüz bir topluluk gönderisi olmadığı için rastgele bir zaman damgasından seçilir","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Bu küçük resim, bu videoda henüz bir topluluk gönderisi olmadığı için rastgele bir zaman damgasından seçilir ve başlık otomatik olarak biçimlendirilir","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Bu varsayılanı aşağıda değiştirebilirsiniz","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"Bu uzantıyı yüklediğinizden beri {titles} başlık ve {thumbnails} küçük resim değiştirildi","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} başlık ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} başlıklar ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"ve {thumbnails} küçük resim","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"ve {thumbnails} küçük resim","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"Bu uzantıyı yüklediğinizden beri {titleAndThumbnailMessage} değiştirildi","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Başlık ve Küçük Resim Değiştirmelerini Say"},"countReplacementsDescription":{"message":"Açılır pencerede size istatistikler sunmak için kullanıldı.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Yt-neuter kullanarak anketleri, ürün raflarını ve diğer tanıtım sayfası öğelerini engellemek için bir filtre listesi ekleyin"},"requiresUblock":{"message":"uBlock Origin eklentisini gerektiriyor"},"videoIDWrongWhenSubmittingError":{"message":"Video kimliği tespitiyle ilgili bir sorun oluştu. Lütfen doğru video için gönderilmesini sağlamak için göndermeden önce yeniden yüklemeyi deneyin. Eğer bu sıkça oluyorsa, lütfen GitHub, Discord veya Matrix üzerinden yüklü diğer uzantılar veya kullanıcı userscriptler ile birlikte bir rapor gönderin."},"dearrowLogoCredit":{"message":"CC-BY 4.0 lisansıyla lisanslanmış Twemoji temelli logo"},"zoomToFillUnsupported":{"message":"SponsorBlock, 'Zoom to Fill' uzantısıyla uyumlu değildir. Bunun yerine düzgün çalışacak birçok alternatif uzantı kullanabilirsiniz."},"freeTrialStarted":{"message":"Ücretsiz denemen başarıyla başlatıldı. Test etmek için YouTube'u ziyaret et"},"freeTrialEnded":{"message":"Ücretsiz denemen sona erdi"},"freeTrialPrompt":{"message":"1 saatliğine test etmek istersen aşşağıdaki butonu kullanarak ücretsiz deneme başlatabilirsin."},"startFreeTrial":{"message":"Ücretsiz denemeyi başlat"},"freeAccessRequested":{"message":"Başarı ile bedava erişime kayıt oldun. Bedava erişime sahip olduğunda bu sana bildirilecek."},"freeAccessComplete":{"message":"Tebrikler! Şuan ücretsiz erişime sahipsin"},"DeArrowNotActivated":{"message":"DeArrow aktive edilmedi"},"ActivateDeArrow":{"message":"Dearrow'u aktifleştir"},"DeArrowIsActivated":{"message":"DeArrow başarıyla aktifleştirildi"},"Close":{"message":"Kapat"},"ViewLicenseKey":{"message":"Lisans Anahtarını Görüntüle"},"SharingIsCaring":{"message":"Paylaşmak önemsemektir"},"cleanPopup":{"message":"Kısım listesinde ıvırzıvırı sakla"},"syncDisabledWarning":{"message":"Uyarı: Tarayıcınızda uzantı depolama devre dışı bırakıldı. Kaydetmeyi denerseniz ayarlar kaydedilmeyecektir."},"syncDisabledWarningDeArrow":{"message":"DeArrow depolama olmadan çalışmayacaktır."},"syncDisabledFirefoxSuggestions":{"message":"about:config sayfasına gidip \"webextensions.storage.sync.enabled\" değerini true olarak ayarlayarak etkinleştirebilirsiniz."},"storageFull":{"message":"Depolama dolu. Gönderilmemiş kimi kısımları silmeyi deneyin."},"previewSegmentRequired":{"message":"Hazırladığınız kısımları göndermeden önce gözden geçirin. Bunun için ön izleme düğmesini veya şu kısayolu kullanabilirsiniz:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"VIP gibi davran","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"YouTube sunucuları tarafından reklam işlenmesi nedeniyle tarayıcınız üzerinden bildirdiğiniz kısımları şu anda kabul edemiyoruz. Bu hatayı aldığınızda iletişime geçiniz."},"DeArrowIsDisabled":{"message":"DeArrow kullanım dışı. Kullanıma almak için tıklayın","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Orijinal küçük resmin DeArrow kurallarına uyduğuna emin misiniz? Eğer sadece orijinal küçük resimleri görmeyi tercih ediyorsanız DeArrow ayarlarındaki “Küçük resim gönderilmemiş ise” seçeneğini değiştirebilirsiniz.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"SponsorBlock, YouTube TV'deki canlı yayınlarla ve yeni kayıtlarla uyumlu değildir. Bu yeni bir kayıtsa işlenmesi için birkaç saat bekleyiniz.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Kanalları beyaz listeye eklemek tv.youtube.com adresinde desteklenmiyor.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Orijinal başlığı beğendiniz mi?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Evet"},"No":{"message":"Hayır"},"votes":{"message":"{0} oy","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} oy","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Komik","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Yaratıcı","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Zekice","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Betimleyici","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Diğer","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Klasik mod","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Başlıklar, topluluğun tanımladığı ve yönergelerdeki standartlara uyan birimlerdeki başlıklarla değiştirilir."},"CasualMode":{"message":"Sıradan Mod","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Başka biri videonun yeterli düzeyde olduğunu ve zekice yahut eğlenceli olduğunu belirttiğinde orijinal başlığı koru.\nHangi tür kategorilerde başlıkların görünmesini istediğini belirle.\nBir başlığın belirlenmiş kategoriye uygun olup olmadığına dair oy verebilirsin."},"minimumVotes":{"message":"Gerekli Oy","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Sıradan Mod Oyları tarafından seçilmiş videolarda orijinal kapak resmini göster","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Yeni Özellik: Sıradan Mod","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Sıradan Mod simgesini yalnızca özel başlık mevcut olduğunda göster"},"OpenSettings":{"message":"Ayarları aç"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/uk/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/uk/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Таймаут підключення. Перевірте ваше з'єднання з інтернетом. Якщо ваш інтернет працює, сервер, швидше за все, перевантажений або лежить."},"400":{"message":"Сервер відхилив цей запит"},"409":{"message":"Цей запит був відправлений раніше"},"502":{"message":"Схоже, він перевантажений. Спробуйте ще раз через кілька секунд."},"fullName":{"message":"SponsorBlock для YouTube - Пропускайте спонсорські вставки","description":"Name of the extension."},"Description":{"message":"Пропускайте спонсорські вставки, прохання підписатися та інше в відео на YouTube. Надсилайте інформацію про спонсорів в відео, щоб зберігати іншим час.","description":"Description of the extension."},"channelWhitelisted":{"message":"Канал доданий у білий список!"},"Segment":{"message":"сегмент"},"Segments":{"message":"сегментів"},"SegmentsCap":{"message":"Сегменти"},"Chapters":{"message":"Розділи"},"renderAsChapters":{"message":"Показувати сегменти як розділи","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Показати поточний сегмент поруч із часом відео"},"showAutogeneratedChapters":{"message":"Показувати автоматичні розділи, згенеровані YouTube"},"upvoteButtonInfo":{"message":"Проголосувати \"за\" цей сегмент"},"reportButtonTitle":{"message":"Звіт"},"reportButtonInfo":{"message":"Повідомити про помилку в цьому сегменті."},"Dismiss":{"message":"Закрити"},"Loading":{"message":"Завантаження…"},"Hide":{"message":"Не відображати"},"hitGoBack":{"message":"Натисніть «Назад», щоб повернутися назад."},"unskip":{"message":"Назад"},"reskip":{"message":"Пропустити"},"unmute":{"message":"Увімкнути звук"},"paused":{"message":"Пауза"},"manualPaused":{"message":"Таймер зупинено"},"confirmMSG":{"message":"Щоб змінити або видалити окремі значення, натисніть кнопку «Інформація» або відкрийте спливаюче вікно розширення, клацнувши значок розширення в правому верхньому куті."},"clearThis":{"message":"Ви впевнені, що хочете видалити цю інформацію?\n\n"},"Unknown":{"message":"При надсиланні спонсорського сегмента сталася помилка. Будь ласка, спробуйте пізніше."},"sponsorFound":{"message":"У базі є сегменти для цього відео!"},"sponsor404":{"message":"Сегменти не знайдено"},"sponsorStart":{"message":"Сегмент починається звідси"},"sponsorEnd":{"message":"Сегмент закінчується тут"},"sponsorCancel":{"message":"Скасувати створення сегмента"},"noVideoID":{"message":"Відео YouTube, не знайдено.\nЯкщо це не так, поновіть вкладку."},"refreshSegments":{"message":"Оновити сегменти"},"success":{"message":"Успіх!"},"voted":{"message":"Голос зарахований!"},"serverDown":{"message":"Здається, сервер не працює. Негайно зв'яжіться з розробником."},"connectionError":{"message":"Помилка з'єднання. Код помилки: "},"segmentsStillLoading":{"message":"Сегменти ще завантажуються…"},"clearTimes":{"message":"Очистити сегменти"},"openPopup":{"message":"Відкрийте спливаюче вікно SponsorBlock"},"closePopup":{"message":"Закрити вікно"},"closeIcon":{"message":"Значок закриття"},"OpenSubmissionMenu":{"message":"Відкрити меню надсилання"},"OpenCasualVoteMenu":{"message":"Відкрити меню звичайного режиму"},"sortSegments":{"message":"Сортувати сегменти"},"submitCheck":{"message":"Ви впевнені, що хочете надіслати цю інформацію?"},"whitelistChannel":{"message":"Додати канал в білий список"},"removeFromWhitelist":{"message":"Видалити канал з білого списку"},"voteOnTime":{"message":"Проголосувати за сегмент"},"Submissions":{"message":"Надіслано сегментів"},"savedPeopleFrom":{"message":"Ви допомогли людям пропустити "},"viewLeaderboard":{"message":"Дошка пошани"},"recordTimesDescription":{"message":"Надіслати"},"submissionEditHint":{"message":"Редагування сегментів з'явиться після натискання на кнопку \"Надіслати\"","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Підказка: Ви можете налаштувати комбінації клавіш для надсилання в опціях"},"clearTimesButton":{"message":"Очистити час"},"Username":{"message":"Ім'я користувача"},"setUsername":{"message":"Встановити ім'я користувача"},"copyPublicID":{"message":"Копіювати публічний UserID"},"copySegmentID":{"message":"Копіювати ID сегмента"},"loopChapter":{"message":"Повтор розділу"},"unloopChapter":{"message":"Вимкнути повтор розділу"},"hideThis":{"message":"Приховати це"},"Options":{"message":"Налаштування"},"showButtons":{"message":"Показувати кнопки в плеєрі YouTube"},"hideButtonsDescription":{"message":"Це налаштування приховує кнопки для надсилання спонсорських вставок, які з'являються в плеєрі YouTube."},"showSkipButton":{"message":"Залишити кнопку \"Перейти до Основне\" у плеєрі"},"showInfoButton":{"message":"Показувати кнопку інформації в плеєрі YouTube"},"autoHideInfoButton":{"message":"Кнопка \"Автоматично сховати інформацію\""},"showDeleteButton":{"message":"Показувати кнопку видалення в плеєрі YouTube"},"enableViewTracking":{"message":"Увімкнути відстеження кількості пропусків сегментів"},"whatViewTracking":{"message":"Ця можливість відстежує, які сегменти Ви пропустили, щоб допомогти користувачам дізнатися, наскільки їхній внесок допоміг іншим, і використовується як показник разом із голосами \"за\" щоб переконатися, що спам не влучає у базу даних. Розширення надсилає повідомлення на сервер кожен раз, коли Ви пропускаєте сегмент. Сподіваюсь, більшість людей не поміняє це налаштування, щоб статистика переглядів була точною. :)"},"enableViewTrackingInPrivate":{"message":"Увімкнути відстеження пропусків у вкладках інкогніто"},"enableTrackDownvotes":{"message":"Зберігати голоси \"проти\" сегментів"},"whatTrackDownvotes":{"message":"Усі сегменти, за які ви проголосуєте \"проти\", залишаться прихованими навіть після оновлення"},"trackDownvotesWarning":{"message":"Попередження: вимкнення цієї опції призведе до видалення всіх раніше збережених голосів \"проти\""},"enableTrackDownvotesInPrivate":{"message":"Зберігати голоси \"проти\" сегмента в приватних/анонімних вкладках"},"enableQueryByHashPrefix":{"message":"Пошук по частині хеша"},"whatQueryByHashPrefix":{"message":"Замість надсилання на сервер videoID, для отримання сегментів будуть використовуватися перші 4 символи хеша videoID. Сервер видасть дані для всіх відео зі схожими хешами."},"enableShowCategoryWithoutPermission":{"message":"Показувати категорії в меню подання навіть без дозволу на подання"},"whatShowCategoryWithoutPermission":{"message":"Деякі категорії потребують дозволу на подання через мінімальні вимоги до репутації"},"showNotice":{"message":"Показувати сповіщення знову"},"showSkipNotice":{"message":"Показувати сповіщення після пропуску сегмента"},"showUpcomingNotice":{"message":"Показати примітку перед початком сегмента"},"showCategoryGuidelines":{"message":"Показати Довідку по Категоріях"},"noticeVisibilityMode0":{"message":"Повнорозмірні сповіщення про пропуски"},"noticeVisibilityMode1":{"message":"Зменшені сповіщення для автоматичних пропусків"},"noticeVisibilityMode2":{"message":"Всі сповіщення зменшеного розміру"},"noticeVisibilityMode3":{"message":"Напівпрозорі сповіщення для автоматичних пропусків"},"noticeVisibilityMode4":{"message":"Напівпрозорі сповіщення для всіх пропусків"},"longDescription":{"message":"SponsorBlock дозволяє пропускати спонсорські вставки, початкові і кінцеві заставки, прохання підписатися і інше в відео на YouTube. SponsorBlock - колективне розширення, яке дозволяє кожному надіслати час початку і кінця подібних сегментів в відео. Після того, як хто-небудь надсилає цю інформацію, всі інші користувачі розширення будуть автоматично пропускати ці сегменти. Так само можна пропускати частини кліпів без музики.","description":"Full description of the extension on the store pages."},"website":{"message":"Сайт","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Вихідний код","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Повідомлення було оновлено!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Якщо воно Вам все одно не подобається, натисніть «не показувати\".","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Пропустити сегмент","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Початок/кінець сегмента","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Відкрити меню надсилання","description":"Keybind label"},"setSubmitKeybind":{"message":"Надіслати сегменти","description":"Keybind label"},"setPreviewKeybind":{"message":"Прев'ю сегмента","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Закрити сповіщення про пропуск","description":"Keybind label"},"setDownvoteKeybind":{"message":"Проголосувати \"проти\" сегмента","description":"Keybind label"},"setUpvoteKeybind":{"message":"Проголосувати \"за\" сегмент","description":"Keybind label"},"nextChapterKeybind":{"message":"Наступний розділ","description":"Keybind label"},"previousChapterKeybind":{"message":"Попередній розділ","description":"Keybind label"},"enableDeArrowKey":{"message":"Ввімкнення/Вимкнення DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Відкрити меню надсилання","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Виберіть клавішу, набравши її та виберіть бажану клавішу-модифікатор."},"disableSkipping":{"message":"Пропуск увімкнено"},"enableSkipping":{"message":"Пропуск вимкнено"},"yourWork":{"message":"Ваша робота","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Код помилки: "},"skip":{"message":"Пропустити"},"mute":{"message":"Вимкнути звук"},"full":{"message":"Повне відео","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Пропустити {0}?"},"mute_category":{"message":"Вимкнути звук {0}?"},"skip_to_category":{"message":"Пропустити до {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Найближчі {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} Пропущено","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} Вимкнено звук","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Пропущено до {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Проголосовано за {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Вимкнути автоматичний пропуск"},"enableAutoSkip":{"message":"Увімкнути автоматичний пропуск"},"audioNotification":{"message":"Аудіо сповіщення при пропуску"},"audioNotificationDescription":{"message":"Аудіо сповіщення про пропуск буде відтворюватися кожен раз, коли сегмент пропущений. Якщо відключено (або автоматичний пропуск відключений), звук не буде відтворюватися."},"showTimeWithSkips":{"message":"Показувати тривалість без сегментів"},"showTimeWithSkipsDescription":{"message":"Ця тривалість відображається в дужках поруч з фактичною під смугою перемотування. Показує тривалість відео без сегментів. Включає сегменти, для яких вибрано \"Показувати в смузі перемотування\"."},"youHaveSkipped":{"message":"Ви пропустили"},"minLower":{"message":"хвилину"},"minsLower":{"message":"хв"},"hourLower":{"message":"година"},"hoursLower":{"message":"годин"},"youHaveSavedTime":{"message":"Ви заощадили людям","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" їхніх життів","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Дивіться стан сервера на status.sponsor.ajay.app."},"changeUserID":{"message":"Імпорт/експорт вашого приватного UserID"},"whatChangeUserID":{"message":"Тримайте його в таємниці. Ставтеся до нього як до пароля і не передавайте нікому. Якщо хтось їм заволодіє, то зможе видати себе за вас. Якщо ви шукаєте публічний UserID, натисніть значок буфера обміну у спливаючому вікні."},"setUserID":{"message":"Встановити приватний UserID"},"userIDChangeWarning":{"message":"Попередження: зміна приватного UserID є незворотною. Ви впевнені, що хочете це зробити? Про всяк випадок обов'язково зробіть резервну копію свого старого."},"createdBy":{"message":"Створено"},"supportOtherSites":{"message":"Підтримувати сторонні YouTube-сайти"},"supportOtherSitesDescription":{"message":"Підтримка сторонніх клієнтів YouTube. Щоб увімкнути підтримку, ви повинні прийняти додаткові дозволи.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Підтримувані сайти: "},"optionsInfo":{"message":"Увімкнути підтримку Invidious, вимкнути автоматичний пропуск, приховати кнопки і не тільки."},"addInvidiousInstance":{"message":"Додати інстанси стороннього клієнта"},"addInvidiousInstanceDescription":{"message":"Додати свій інстанс. Формат: ТІЛЬКИ домен. Наприклад, invidious.ajay.app"},"add":{"message":"Додати"},"addInvidiousInstanceError":{"message":"Це неправильний домен. Введіть ТІЛЬКИ домен. Наприклад: invidious.ajay.app"},"resetInvidiousInstance":{"message":"Скинути список інстанси Invidious"},"resetInvidiousInstanceAlert":{"message":"Ви збираєтеся скинути список інстанси Invidious"},"invidiousDisabledSafari":{"message":"Безглузда підтримка на даний момент недоступна в Safari через помилку в Safari. Коли Apple виправляє помилку, вона буде додана назад."},"currentInstances":{"message":"Поточні інстанси:"},"minDuration":{"message":"Мінімальна тривалість (секунд):"},"minDurationDescription":{"message":"Сегменти коротше цього значення не будуть пропускатися і не будуть показані в плеєрі."},"enableManualSkipOnFullVideo":{"message":"Використовувати пропуск вручну, коли відео позначено повністю"},"whatManualSkipOnFullVideo":{"message":"Для людей, які хочуть дивитися відео без перерв, якщо воно повністю спонсороване або самореклама."},"skipNoticeDuration":{"message":"Тривалість повідомлення пропуску (в секундах):"},"skipNoticeDurationDescription":{"message":"Повідомлення пропуску залишиться на екрані щонайменше стільки секунд. При пропуску вручну воно може бути видимим довше."},"shortCheck":{"message":"Наступний діапазон часу коротше, ніж Ваше налаштування мінімальної тривалості. Це може означати, що він вже був надісланий, і просто ігнорується через це налаштування. Ви дійсно хочете надіслати?"},"liveOrPremiere":{"message":"Надсилання під час прямого ефіру чи прем'єри не дозволено. Будь ласка, зачекайте до завершення, потім оновіть сторінку і переконайтеся, що сегменти все ще дійсні."},"showUploadButton":{"message":"Показувати кнопку надсилання"},"customServerAddress":{"message":"Адреса сервера SponsorBlock"},"customServerAddressDescription":{"message":"Адреса, за якою SponsorBlock звертається до сервера.\nМіняйте тільки якщо Ви підняли свій сервер."},"dataFetchingServerAddress":{"message":"Адреса сервера для отримання даних"},"dataFetchingServerAddressDescription":{"message":"Адреса, за якою SponsorBlock отримує дані.\nМіняйте тільки якщо Ви підняли свій сервер."},"thumbnailCacheServerAddress":{"message":"Адреса сервера кешу мініатюр"},"save":{"message":"Зберегти"},"reset":{"message":"Скинути"},"customAddressError":{"message":"Ця адреса неправильного формату. Переконайтеся, що він починається з http: // або https: //, і що на кінці немає слеша."},"areYouSureReset":{"message":"Ви дійсно хочете це скинути?"},"mobileUpdateInfo":{"message":"m.youtube.com тепер підтримується"},"exportOptions":{"message":"Імпорт/Експорт всіх налаштувань"},"exportOtherData":{"message":"Імпорт/експорт всіх інших даних"},"exportOptionsCopy":{"message":"Змінити/копіювати"},"exportOptionsDownload":{"message":"Зберегти до файлу"},"exportOptionsUpload":{"message":"Завантажити з файлу"},"whatExportOptions":{"message":"Це ваша конфігурація в JSON. Вона містить ваш приватний UserID, тому використовуйте з розумом."},"setOptions":{"message":"Встановити параметри"},"exportOptionsWarning":{"message":"Увага: зміна налаштувань незворотня і може зламати розширення. Ви дійсно хочете це зробити? Зробіть резервну копію про всяк випадок."},"incorrectlyFormattedOptions":{"message":"JSON-файл некоректно відформатований. Ваші налаштування не були змінені."},"confirmNoticeTitle":{"message":"Надіслати сегмент"},"submit":{"message":"Надіслати"},"cancel":{"message":"Скасувати"},"delete":{"message":"Видалити"},"preview":{"message":"Прев'ю"},"unsubmitted":{"message":"Неопублікований"},"inspect":{"message":"Дослідити"},"edit":{"message":"Редагувати"},"copyDebugLogs":{"message":"Копіювати журнали налагодження"},"copyDebugInformation":{"message":"Скопіювати налагоджувальну інформацію в буфер обміну"},"copyDebugInformationFailed":{"message":"Не вдалося скопіювати в буфер"},"copyDebugInformationOptions":{"message":"Копіює в буфер обміну інформацію, яку буде надано розробнику при виникненні помилки / за його запитом. Така конфіденційна інформація, як ваш UserID, білий список каналів та адреса сервера користувача, видаляється. Однак вона містить такі дані, як ваш useragent, браузер, операційна система та номер версії розширення."},"copyDebugInformationComplete":{"message":"Налагоджувальну інформацію скопійовано в буфер обміну. Ви можете видалити будь-які дані, якими не хочете ділитися. Збережіть її в текстовий файл або вставте у звіт про помилку."},"keyAlreadyUsed":{"message":"Ця клавіша/комбінація клавіш прив'язана до іншої дії. Будь ласка виберіть іншу клавішу."},"to":{"message":"до","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Скопійовано!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Включає плавний перехід до наступної теми"},"generic_guideline2":{"message":"Програється, наче нічого не пропущено"},"category_sponsor":{"message":"Спонсор"},"category_sponsor_description":{"message":"Рекламні інтеграції, реферальні посилання і реклама безпосередньо. Не для самореклами або рекомендацій різних подій/творців/сайтів/продуктів, які подобаються автору відео."},"category_sponsor_guideline1":{"message":"Платні акції"},"category_sponsor_guideline2":{"message":"Не для пожертвувань чи мерча"},"category_selfpromo":{"message":"Самореклама/рекомендація"},"category_selfpromo_description":{"message":"Схоже на \"Спонсора\", але для безкоштовної реклами і самореклами. Включає себе вставки про мерчендайз, пожертвування або інформацію про тих, разом з ким було зроблено відео."},"category_selfpromo_guideline1":{"message":"Пожертвування, членства та мерч"},"category_selfpromo_guideline2":{"message":"Безкоштовні вітання, які не додають до відео"},"category_selfpromo_guideline3":{"message":"Не для корпоративних продуктів і мерча"},"category_exclusive_access":{"message":"Ексклюзивний доступ"},"category_exclusive_access_description":{"message":"Лише для позначення цілих відео. Використовується, коли відео демонструє продукт, послугу або місцеположення, до яких автори отримали безоплатний або субсидований доступ."},"category_exclusive_access_pill":{"message":"Це відео демонструє продукт, послугу або місцеположення, до яких автори отримали безоплатний або субсидований доступ","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"У відео демонструють щось із безкоштовним або субсидованим доступом"},"category_interaction":{"message":"Нагадування про взаємодію (підписка)"},"category_interaction_description":{"message":"Коли є коротке нагадування поставити лайк, підписатися на канал або в соцмережах в середині вмісту. Якщо ця вставка тривала або про щось конкретне, вона повинна класифікуватися як самореклама."},"category_interaction_guideline1":{"message":"Короткі нагадування поставити лайк, підписатися"},"category_interaction_guideline2":{"message":"Включає в себе непрямі нагадування про коментарі"},"category_interaction_guideline3":{"message":"Не для загального просування, лише для закликів до дії"},"category_interaction_short":{"message":"Нагадування про взаємодію"},"category_intro":{"message":"Пауза/заставка"},"category_intro_description":{"message":"Частина відео без значущого контенту. Може бути паузою, статичним кадром, повторюваною анімацією. Це не слід використовувати для переходів, що містять інформацію."},"category_intro_short":{"message":"Заставка"},"category_intro_guideline1":{"message":"Інтервал без реального змісту"},"category_intro_guideline2":{"message":"Не для переходів з інформацією"},"category_outro":{"message":"Кінцева заставка/титри"},"category_outro_description":{"message":"Титри або час появи кінцевих заставок YouTube. Не для підведення підсумків сказаного у відео."},"category_outro_guideline1":{"message":"Не включайте вміст, навіть якщо на екрані є кінцеві картки"},"category_preview":{"message":"Попередній перегляд/короткий зміст"},"category_preview_description":{"message":"Колекція кліпів, які показують, що відбувається в цьому відео або інших відео в серії, де вся інформація повторюється пізніше у відео."},"category_preview_guideline1":{"message":"Кліпи, які з'являються пізніше або в майбутньому відео"},"category_preview_guideline2":{"message":"Підсумок попереднього відео"},"category_preview_guideline3":{"message":"Не для розділів, які додають додатковий вміст"},"category_hook_guideline3":{"message":"Не для розділів, які додають додатковий вміст"},"category_filler":{"message":"Дотичні теми/Жарти"},"category_filler_description":{"message":"Дотичні сцени або жарти, які не потрібні для розуміння основного вмісту відео. Сюди не слід включати сегменти, що надають контекст або передісторію. Це дуже агресивна категорія, призначена для випадків, коли ви не в настрої \"розважатися\"."},"category_filler_short":{"message":"Дотичні теми"},"category_filler_guideline1":{"message":"Дотичні сцени або жарти"},"category_filler_guideline2":{"message":"Відволікання, ляпи, повтори"},"category_filler_guideline3":{"message":"Не для сцен, які потрібні для розуміння теми"},"category_music_offtopic":{"message":"Музика: Сегмент без музики"},"category_music_offtopic_description":{"message":"Тільки для використання в музичних кліпах. Використовується для сегментів музичних кліпів, які не належать до іншої категорії."},"category_music_offtopic_short":{"message":"Без музики"},"category_music_offtopic_guideline1":{"message":"Розділів немає в офіційних випусках"},"category_music_offtopic_guideline2":{"message":"Не музика під час виступу наживо"},"category_poi_highlight":{"message":"Основне"},"category_poi_highlight_description":{"message":"Частина відео, яку шукає більшість людей. Подібно до коментарів \"Відео починається з …\"."},"category_poi_highlight_guideline1":{"message":"Розділ, який шукають більшість людей"},"category_poi_highlight_guideline2":{"message":"Може пропустити контекст"},"category_poi_highlight_guideline3":{"message":"Можна перейти до заголовка або мініатюри"},"category_chapter":{"message":"Розділ"},"category_chapter_description":{"message":"Глави з користувацькими назвами, що описують основні розділи відео."},"category_chapter_guideline1":{"message":"Не згадуйте про торгові марки спонсорів"},"category_chapter_guideline2":{"message":"Використовуйте більші розділи для загальних розділів"},"category_chapter_guideline3":{"message":"Менші розділи можна розмістити всередині великих"},"category_livestream_messages":{"message":"Прямі трансляції: пожертвування/читання повідомлення"},"category_livestream_messages_short":{"message":"Читання повідомлень"},"autoSkip":{"message":"Автоматичний пропуск"},"manualSkip":{"message":"Пропуск вручну"},"showOverlay":{"message":"Показувати в смузі перемотування"},"disable":{"message":"Вимкнути"},"autoSkip_POI":{"message":"Автоматично перейти до початку"},"manualSkip_POI":{"message":"Спитати поки відео завантажується"},"showOverlay_POI":{"message":"Показувати в смузі перемотування"},"showOverlay_full":{"message":"Показати мітку"},"showOverlay_chapter":{"message":"Показати розділи"},"autoSkipOnMusicVideos":{"message":"Автоматично пропустити усі сегменти, якщо присутній сегмент без музики"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Автоматично пропустити лише на music.youtube.com"},"muteSegments":{"message":"Дозволити сегменти, які відключають звук замість пропуску"},"fullVideoSegments":{"message":"Показувати значок, коли все відео є рекламою","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Показувати мітки на мініатюрах відео","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Колір не надісланого сегмента","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Колір смуги перемотування"},"category":{"message":"Категорія"},"skipOption":{"message":"Спосіб пропуску","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Відкрити додаткові параметри пропусків"},"advancedSkipNotSaved":{"message":"Синтаксична помилка: Ваші опції не були збережені"},"advancedSkipSettingsHelp":{"message":"Як це працює","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Увімкнути сервер бета-тестування"},"whatEnableTestingServer":{"message":"Ваші сегменти та голоси НЕ БУДУТЬ ВРАХОВАНІ на головному сервері. Використовуйте це лише для тестування."},"testingServerWarning":{"message":"Усі сегменти та голоси НЕ БУДУТЬ ВРАХОВАНІ на головному сервері при підключенні до тестового сервера. Обов'язково відключіть цей параметр, якщо ви хочете надіслати реальні сегменти."},"bracketNow":{"message":"(Зараз)"},"moreCategories":{"message":"Більше категорій"},"chooseACategory":{"message":"Оберіть категорію"},"enableThisCategoryFirst":{"message":"Щоб надіслати сегменти категорії \"{0}\", ви повинні ввімкнути її в налаштуваннях. Зараз ви будете туди перенаправлені.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Увага: Сегменти даного типу можуть бути активними лише по одному. Надсилання декількох призведе до відображення випадкового сегмента."},"youMustSelectACategory":{"message":"Ви повинні обрати категорію для всіх сегментів, які ви відправляєте!"},"bracketStart":{"message":"(Старт)"},"bracketEnd":{"message":"(Кінець)"},"End":{"message":"Кінець","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"приховано: голос \"проти\""},"hiddenDueToDuration":{"message":"приховано: занадто коротко"},"manuallyHidden":{"message":"приховано вручну"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"ID каналу ще не завантажений. Якщо ви використовуєте вбудоване відео, спробуйте замість цього скористатися домашньою сторінкою YouTube. Це також може бути викликано змінами в дизайні YouTube, якщо ви вважаєте, що це так, залиште коментар тут:"},"invidiousPermissionRefresh":{"message":"Браузер відкликав дозвіл, необхідний для роботи на Invidious та інших сторонніх сайтах. Будь ласка, натисніть кнопку нижче, щоб повторно активувати цей дозвіл."},"acceptPermission":{"message":"Надати дозвіл"},"permissionRequestSuccess":{"message":"Дозвіл отримано!"},"permissionRequestFailed":{"message":"Не вдалося отримати дозвіл, ви натиснули на \"Блокувати\"?"},"adblockerIssueWhitelist":{"message":"Якщо ви не можете вирішити цю проблему, вимкніть \"Примусова перевірка каналу перед пропуском\" в налаштуваннях, оскільки SponsorBlock не може отримати інформацію про канал для цього відео"},"forceChannelCheck":{"message":"Примусова перевірка каналу перед пропуском"},"whatForceChannelCheck":{"message":"За замовчуванням розширення пропускає сегменти відразу ж, навіть не перевіряючи який це канал. За замовчуванням деякі сегменти на початку відео можуть бути пропущені на каналах з білого списку. Увімкнення цієї опції запобіжить цьому, але усі пропуски відбуватимуться з невеликою затримкою оскільки отримання ID каналу може зайняти деякий час. Ця затримка може бути непомітною, якщо у вас швидкий інтернет."},"forceChannelCheckPopup":{"message":"Рекомендуємо увімкнути \"Примусова перевірка каналу перед пропуском\""},"downvoteDescription":{"message":"Невірно вказано таймінг"},"incorrectVote":{"message":"Неправильно"},"harmfulVote":{"message":"Шкідливе","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Змінити категорію"},"nonMusicCategoryOnMusic":{"message":"Це відео класифіковано як музичне. Ви впевнені, що в ньому є спонсори? Якщо насправді це \"Сегмент без музики\", відкрийте параметри розширення та увімкніть цю категорію. Потім ви можете надіслати цей сегмент як \"Без музики\", а не як спонсора. Будь ласка, прочитайте керівництво, якщо ви заплуталися."},"multipleSegments":{"message":"Декілька сегментів"},"guidelines":{"message":"Керівництво"},"readTheGuidelines":{"message":"Прочитайте керівництво!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Категорії тут!"},"categoryUpdate2":{"message":"Відкрийте налаштування щоб пропускати початкові і кінцеві заставки, мерч та інше."},"help":{"message":"Довідка"},"GotIt":{"message":"Зрозуміло","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Цей сегмент великий. Якщо все відео на одну тему, тоді змініть значення з \"Пропустити\" на \"Повне відео\". Продивіться керівництво для додаткової інформації."},"categoryPillTitleText":{"message":"Все відео позначене цією категорією, воно є її уособленням, тож категорію неможливо виокремити."},"chapterNameTooltipWarning":{"message":"Одна з назв ваших розділів схожа на категорію. Замість цього слід використовувати категорії, коли це можливо."},"experiementOptOut":{"message":"Відмова від усіх майбутніх експериментів","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Сховати назавжди"},"warningChatInfo":{"message":"Ми помітили, що ви робите деякі типові помилки. Ми дуже цінуємо вашу роботу, але ми прагнемо до досконалості, тому навіть дуже маленькі помилки мають значення :)"},"questionButton":{"message":"У мене є питання"},"askAQuestion":{"message":"Задати питання"},"warningConfirmButton":{"message":"Я розумію причину"},"warningError":{"message":"Помилка при спробі визнати попередження:"},"deArrowMessageRecieved":{"message":"Ви отримали пораду від модератора"},"Donate":{"message":"Пожертвувати"},"considerDonating":{"message":"Допомогти з фінансуванням розробки"},"supportSponsorBlock":{"message":"Підтримати роботу по блоку SponsorBlock"},"hideDonationLink":{"message":"Приховати посилання на пожертвування"},"darkModeOptionsPage":{"message":"Темний режим на сторінці налаштувань"},"helpPageThanksForInstalling":{"message":"Дякую за встановлення SponsorBlock."},"helpPageReviewOptions":{"message":"Будь ласка, ознайомтеся з налаштуваннями нижче"},"helpPageFeatureDisclaimer":{"message":"Багато функцій за замовчуванням відключені. Якщо ви хочете пропускати початкові та кінцеві заставки, використовувати Invidious, тощо, увімкніть їх нижче. Ви також можете приховати/показати елементи інтерфейсу (UI)."},"helpPageHowSkippingWorks":{"message":"Як це працює"},"helpPageHowSkippingWorks2":{"message":"Коли ви пропустите сегмент, ви отримаєте сповіщення. Якщо таймінг здається вам неправильним, проголосуйте \"проти\", натиснувши на \"палець униз\"! Ви також можете проголосувати у спливаючому вікні."},"Submitting":{"message":"Надсилання"},"helpPageCopyOfDatabase2":{"message":"Вихідний код у відкритому доступі, так що навіть якщо щось трапиться зі мною, ваш вклад не пропаде."},"AdviceForSubmitting":{"message":"Порада при надсиланні"},"Credits":{"message":"Автори"},"LearnMore":{"message":"Дізнатися більше"},"FullDetails":{"message":"Повна інформація"},"CopyDownvoteButtonInfo":{"message":"Голосує \"проти\" та створює локальну копію для повторного надсилання"},"OpenCategoryWikiPage":{"message":"Відкрити вікі-сторінку цієї категорії."},"CopyAndDownvote":{"message":"Скопіювати та проголосувати \"проти\""},"ContinueVoting":{"message":"Продовжити голосування"},"ChangeCategoryTooltip":{"message":"Це миттєво буде застосовано до ваших сегментів"},"downvote":{"message":"Голос \"проти\""},"upvote":{"message":"Голос \"за\""},"hideSegment":{"message":"Приховати сегмент"},"skipSegment":{"message":"Пропустити сегмент"},"playChapter":{"message":"Відтворити розділ"},"SponsorTimeEditScrollNewFeature":{"message":"Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін."},"categoryPillNewFeature":{"message":"Нове! Бачте, коли відео повністю спонсорське або є саморекламою"},"yearAbbreviation":{"message":"р","description":"100y"},"dayAbbreviation":{"message":"дн","description":"100d"},"hourAbbreviation":{"message":"год","description":"100h"},"optionsTabBehavior":{"message":"Поведінка","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Інтерфейс","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Комбінації клавіш","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Резервування/Відновлення","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Різне","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Вигляд сповіщення про пропуск","description":"Option label"},"unbind":{"message":"Відв'язати","description":"Unbind keyboard shortcut"},"notSet":{"message":"Не задано"},"change":{"message":"Змінити"},"youtubeKeybindWarning":{"message":"Це вбудована комбінація YouTube. Ви впевнені що хочете її використовувати?"},"betaServerWarning":{"message":"BETA сервер увімкнено!"},"openOptionsPage":{"message":"Відкрити сторінку налаштувань"},"resetToDefault":{"message":"Повернутись до стандартних налаштувань"},"confirmResetToDefault":{"message":"Ви впевнені, що хочете скинути всі налаштування до значень за замовчуванням? Це не можна буде скасувати."},"exportSegments":{"message":"Експортувати сегменти"},"importSegments":{"message":"Імпорт сегмента"},"Import":{"message":"Імпорт","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Купон успішно!"},"redeemFailed":{"message":"Ліцензійний ключ недійсний"},"hideUpsells":{"message":"Приховати налаштування, недоступні без додаткової оплати"},"hideNewFeatureUpdates":{"message":"Приховати підказки про нові функції"},"redeem":{"message":"Купон"},"enterLicenseKey":{"message":"Введіть ліцензійний ключ"},"unsubmittedSegmentCounts":{"message":"Наразі у вас є {0} на {1}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"У вас наразі немає не надісланих сегментів","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"не надісланий сегмент","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"не надіслані сегменти","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"відео","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"відео","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Очистити всі сегменти","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Ви впевнені, що хочете очистити всі ваші не надіслані сегменти?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Показати сегменти","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Приховати сегменти","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID відео","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Кількість сегментів","description":"Header of the unsubmitted segments list"},"actions":{"message":"Дії","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Поділитися посиланням"},"segmentFetchFailureWarning":{"message":"Попередження: сервер ще не відповів сегментами. Можливо, у цьому відео вже є сегменти, але ви просто не отримали їх через проблеми з сервером."},"allowScrollingToEdit":{"message":"Дозволити прокручування для редагування часу"},"NoticeTimeAfterSkip":{"message":"{seconds}с","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow – Кращі Заголовки та Мініатюри в YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Краудсорсингові заголовки та мініатюри мають бути описовими, а не сенсаційними","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Виберіть найбільш описану"},"Original":{"message":"Оригінал"},"OriginalTitle":{"message":"Оригінальний заголовок"},"CurrentTime":{"message":"Поточний час"},"resetCustomTitle":{"message":"Скинути заголовок до оригінального тексту"},"resetIcon":{"message":"Скинути значок"},"TypeYourOwnTitleHere":{"message":"Введіть ваш заголовок тут"},"VideoNotReady":{"message":"Відео не готове"},"FailedToRender":{"message":"Помилка рендерингу","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Canvas відсутній","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Виняток під час рендерингу","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Не вдалося завантажити","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Формат заголовка"},"Disabled":{"message":"Вимкнено"},"CapitalizeWords":{"message":"Слова З Великої Літери"},"TitleCase":{"message":"Заголовний Регістр"},"SentenceCase":{"message":"Як у реченнях"},"LowerCase":{"message":"малі літери"},"FirstLetterUppercase":{"message":"Перша літера великою"},"shouldCleanEmojis":{"message":"Прибрати Емодзі"},"onlyFormatCustomTitles":{"message":"Форматувати лише надіслані користувачами заголовки"},"onlyTitleCaseInEnglish":{"message":"Слова З Великої Літери Для Неангломовних Заголовків"},"onlyTitleCaseInEnglishDescription":{"message":"Розпізнавання мови не є досконалим, визначає деякі англійські заголовки як неанглійські."},"thumbnailFallbackOption":{"message":"За відсутності відправленої мініатюри"},"whatThumbnailFallbackOption":{"message":"При виборі випадкового кадру він буде використовувати дані SponsorBlock, щоб переконатися, що час у рекламному сегменті не буде обрано.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Показати скріншот з випадкового кадру"},"TheOriginalThumbnail":{"message":"Показати оригінальну мініатюру"},"showABlankBox":{"message":"Показати порожнє поле"},"AutoGenerated":{"message":"Показати мініатюру, автоматично згенеровану YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Старт"},"Middle":{"message":"Посередині"},"keepUnsubmitted":{"message":"Зберігати надіслані голоси"},"showLiveCover":{"message":"Показати аватар каналу на майбутніх відео","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Ніколи не використовувати мініатюри A/B-тестування"},"ignoreAbThumbnailsDescription":{"message":"Канали можуть встановлювати тести для своїх відео, де YouTube буде відображати різні мініатюри різним користувачам. Ця опція завжди використовуватиме початкову мініатюру для підтримки стабільності."},"abThumbnailsWarning":{"message":"Попередження: для цього відео наразі виконується A/B-тестування мініатюр. Це означає, що мініатюра може часто змінюватися. Вам, напевно, не слід голосувати за оригінальну мініатюру через цей ризик."},"whatKeepUnsubmitted":{"message":"Зберігати надіслані оцінки, щоб показувалися обрані вами заголовки та мініатюри, а не топ голосів на сервері."},"keepUnsubmittedInPrivate":{"message":"Зберігати надіслані голоси з приватних вкладок"},"useThumbnailGenerationService":{"message":"Використовувати Службу генерації мініатюр"},"titleMaxLines":{"message":"Максимальна кількість рядків для заголовка"},"titleMaxLinesDescription":{"message":"Запропоновані заголовки відео будуть розташовані на цій кількості рядків."},"thumbnailSaturationLevel":{"message":"Рівень насиченості мініатюри"},"whatSaturateThumbnails":{"message":"Зробити мініатюри менш яскравими, зменшивши їхній колір"},"hideDetailsWhileFetching":{"message":"Сховати подробиці під час отримання"},"hideDetailsWhileFetchingDescription":{"message":"Приховувати заголовки та мініатюри під час отримання даних з сервера. Якщо цю опцію вимкнено, ви побачите миготіння під час зміни заголовків та мініатюр."},"ignoreTranslatedTitles":{"message":"Не показувати перекладені назви YouTube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube іноді буде автоматично перекладати заголовки на вашу рідну мову. Цей параметр застосовується лише тоді, коли заголовок краудсорсингу недоступний."},"onAllPages":{"message":"На всіх сторінках","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"На всіх сторінках, крім сторінок з відео","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Ніколи"},"thumbnailGeneratorDescription1":{"message":"Сервіс генерації мініатюр значно прискорює процес, відправляючи анонімний запит з videoID на віддалений сервер. Після цього мініатюра буде згенерована, або витягнута з кешу, якщо вона вже була створена раніше."},"thumbnailGeneratorDescription2":{"message":"Якщо його використовувати на сторінках з відео, це може призвести до потенційного витоку videoID на цей сервер. Встановлення для цього параметра значення \"На всіх сторінках, крім сторінок з відео\" допоможе уникнути цієї проблеми. Інший варіант – розмістити власну службу генерації мініатюр."},"thumbnailGeneratorDescription3":{"message":"Якщо використання служби генерації мініатюр вимкнено, для всіх запитів використовуватиметься система пошуку з K-анонімністю, що ускладнює передбачення сервером того, які саме відео були отримані, а також використовуватиметься повільніша локальна служба генерації мініатюр.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Вихідний код служби генерації мініатюр"},"moreAboutKAnonymity":{"message":"Більше про K-анонімність","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Завжди відображати кнопку \"Показати оригінал\""},"whatAlwaysShowShowOriginalButton":{"message":"Якщо ви бажаєте завжди знати, що заголовок/мініатюра змінена, увімкніть це."},"showOriginalOnHover":{"message":"Перемкнути між користувацькими та оригінальними відомостями при наведенні"},"showOriginalOnHoverOfVideo":{"message":"Перемкнути між користувацькими та оригінальними відомостями при наведенні на карту відео"},"showOriginalOnHoverOfVideoDescription":{"message":"Це вимкне автовідтворення при наведенні"},"showCustomOnHoverIfCasual":{"message":"Показувати користувацький заголовок на наведенні, якщо відображається заголовок звичайного режиму"},"showIconForFormattedTitles":{"message":"Відображати кнопку \"Показати оригінал\" для автоформатованих заголовків"},"Enable":{"message":"Увімкнути"},"Titles":{"message":"Заголовки","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Мініатюри","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Голосів у звичайному режимі","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Помилка"},"ShowOriginal":{"message":"Показати оригінальну інформацію"},"ShowModified":{"message":"Показати змінену інформацію"},"ShowFormatted":{"message":"Показати подробиці форматування"},"FillerWarning":{"message":"Попередження: Це неймовірно агресивна категорія. Швидше за все, вам доведеться іноді пропускати або вимикати її. Майте на увазі, що в багатьох відео пропущено понад 50% або більше відео! Однак пам'ятайте, що все ще існують певні правила, яких слід дотримуватися при подачі.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Приєднуйтесь до Discord або Matrix, щоб залишитися в цьому чаті","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Показати допомогу щодо керівництва","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Уникайте химерних виразів обличчя","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Подумайте масштабно, а не просто дайте відповідь на оригінальне запитання","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Уникайте опису реакцій на відео (наприклад, \"шок\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Надайте достатньо інформації, щоб користувач міг зробити поінформований вибір"},"tip5":{"message":"Пишіть першу букву великою, як в реченні","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Перевірте всі рекомендації перед надсиланням","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Моя назва написана з великої літери, як речення","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Моя назва не просто відповідає на питання, поставлене в заголовку","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Назви повинні описувати відео або історію в цілому. Ви повинні обов'язково переглянути повне відео, щоб знати, про що воно насправді, а не покладатися на оригінальну назву, що інтригує.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Моя назва не підсумовує висновок і не псує його без потреби","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Назви не призначені для того, щоб повністю замінити перегляд відео, а скоріше для того, щоб ви знали, чи варто натискати на них чи ні.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Моя назва не перевіряє факти, не висміює і не критикує відео або його автора","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Назви мають бути подані з точки зору автора та відео. DeArrow не займається оцінюванням або перевіркою фактів щодо самого відео. Назви не є коментарями до відео.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Виявлено слово: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Не використовуйте непотрібні дієслова на початку заголовку","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Почніть всі заголовки з великої літери. Назви повинні бути відформатовані як речення","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Заголовки не повинні закінчуватися на '.'","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Не просто додавайте відповідь на питання в оригінальній назві. Назви повинні описувати відео або історію в цілому","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Назви не повинні перевіряти факти, висміювати чи критикувати відео або творця","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Назви не повинні містити сенсаційних елементів з оригінальної назви","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Назви не повинні містити емодзі","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Ви повинні усунути попередження перед надсиланням"},"dearrowHelpSponsorBlockImported":{"message":"Примітка: Ваші налаштування SponsorBlock були імпортовані автоматично!"},"howItWorks":{"message":"Як це працює"},"discordPromotion":{"message":"Взяти участь у розробці або запропонувати нову ідею можна в {discord} або {matrix}"},"deArrowDonationText":{"message":"Якщо вам подобається те, що я зробив, і ви хочете допомогти мені з грошима, ось посилання"},"termsAgreement":{"message":"Використовуючи це розширення, ви погоджуєтеся з {privacy-policy} та {terms}"},"privacyPolicy":{"message":"Політика конфіденційності"},"termsOfUse":{"message":"Умови використання"},"openSourceLicenses":{"message":"Ліцензії вихідного коду"},"defaultToOriginals":{"message":"Показувати початкові відомості про відео"},"whatDefaultToOriginals":{"message":"Показувати оригінальний заголовок та мініатюру за замовчуванням, але мати кнопку, при наведенні на яку з'являються користувацькі заголовки та мініатюри."},"replaceTitles":{"message":"Замінювати заголовки"},"replaceThumbnails":{"message":"Замінювати мініатюри"},"useCrowdsourcedTitles":{"message":"Використовувати краудсорсингові заголовки"},"whatUseCrowdsourcedTitles":{"message":"Якщо вимкнено, заголовки будуть форматовані, але заголовки, представлені спільнотою, використані не будуть","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Ви впевнені, що хочете видалити цю конфігурацію?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Нова конфігурація"},"DeleteConfiguration":{"message":"Видалити конфігурацію"},"ChannelAllowlist":{"message":"Налаштування для конкретного каналу"},"ConfigurationName":{"message":"Назва конфігурації"},"ChannelListInstructions":{"message":"Введіть будь-які канали, до яких ви хочете застосувати цю конфігурацію, в полі нижче, кожен з нового рядка. Підтримуються як ID каналів, так і відображувані імена. @ імена користувачів не підтримуються. Ви можете отримати ID каналів натисканням кнопки 'поділитися' на сторінці каналу. Для переходу до цієї сторінки, натисніть на опис, який з'являється нижче назви на сторінці каналу.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Жодних конфігурацій ще не налаштовано. Натисніть кнопку вгорі, щоб додати нову конфігурацію.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Зупиніть клікбейт, замінивши заголовки та мініатюри на більш точні"},"DeArrowPromotionMessage2":{"message":"Втомилися від клікбейту? Спробуйте моє нове розширення для покращення заголовків та мініатюр"},"DeArrowPromotionMessage3":{"message":"Також перевірте DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Не подобається ця назва? Якщо ви надаєте перевагу нижньому заголовку, спробуйте перевірити властивість заміни в DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Цю мініатюру вибрано з випадкової позначки часу, оскільки для цього відео ще нічого не було запропоновано","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Цю мініатюру вибрано з випадкової позначки часу, а заголовок автоматично відформатовано, оскільки для цього відео ще нічого не було запропоновано","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Ви можете змінити ці налаштування за замовчуванням нижче","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} заголовків та {thumbnails} мініатюр було замінено з моменту встановлення розширення","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} заголовок ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} заголовків ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"і {thumbnails} мініатюр","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"і {thumbnails} мініатюр","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} було замінено з моменту встановлення розширення","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Лічильник замін заголовків та мініатюр"},"countReplacementsDescription":{"message":"Використовується для надання статистики у спливаючому вікні.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Додати список фільтрів для блокування опитувань, полиць з мерчем та інших елементів промо-сторінки використовуючи yt-neuter"},"requiresUblock":{"message":"Потрібен uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Щось пішло не так з визначенням videoID. Будь ласка, спробуйте оновлення перед надсиланням, щоб переконатися, що надсилання буде для правильного відео. Якщо це відбувається часто, будь ласка, надішліть звіт про це разом з іншими розширеннями або скриптами, які ви встановили з GitHub, Discord або Matrix."},"dearrowLogoCredit":{"message":"Логотип на основі Twemoji під ліцензією CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock несумісний з розширенням \"Zoom до Fill\". Існує багато альтернатив для вас, що будуть працювати із застосунком належним чином."},"freeTrialStarted":{"message":"Розпочалася безкоштовна пробна версія YouTube, щоб перевірити її"},"freeTrialEnded":{"message":"Пробний період завершився"},"freeTrialPrompt":{"message":"Якщо ви хочете перевірити це на годину, то можете розпочати безкоштовну пробну версію з кнопкою нижче."},"startFreeTrial":{"message":"Почати пробний період"},"freeAccessRequested":{"message":"Ви успішно зареєстровані для безкоштовного доступу. Ви отримаєте повідомлення про надання безкоштовного доступу."},"freeAccessComplete":{"message":"Вітаємо! Тепер у вас є безплатний доступ до DeArrow"},"DeArrowNotActivated":{"message":"DeArrow не активований"},"ActivateDeArrow":{"message":"Активувати DeArrow"},"DeArrowIsActivated":{"message":"DeArrow успішно активовано"},"Close":{"message":"Закрити"},"ViewLicenseKey":{"message":"Переглянути ліцензійний ключ"},"SharingIsCaring":{"message":"Щедра душа меду не жаліє"},"cleanPopup":{"message":"Спрощений вигляд спливаючого вікна списку сегментів"},"hideSegmentCreationInPopup":{"message":"Приховати кнопки створення сегмента у спливаючому вікні"},"syncDisabledWarning":{"message":"Попередження: сховище розширень було вимкнено у вашому браузері. Налаштування не будуть збережені, якщо ви спробуєте їх зберегти."},"syncDisabledWarningDeArrow":{"message":"Derow не буде працювати без сховища."},"syncDisabledFirefoxSuggestions":{"message":"Ви можете ввімкнути його, перейшовши до about:config та встановивши значення \"webextensions.storage.sync.enabled\" на true."},"storageFull":{"message":"Сховище розширення повне. Будь ласка, видаліть деякі невідіслані сегменти у налаштуваннях."},"previewSegmentRequired":{"message":"Будь ласка, перегляньте свої сегменти перед надсиланням. Це можна зробити натиснувши кнопку прев'ю або скориставшись наступною комбінацією клавіш:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Діяти як VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"На цей момент сегменти не можуть бути прийняті з вашого браузера, оскільки на YouTube, здається, була введена деяка реклама на стороні сервера таким чином, що розширення не може її вилучити. Будь ласка, зв'яжіться з нами, якщо ви отримали таку помилку."},"DeArrowIsDisabled":{"message":"DeArrow вимкнено – натисніть, щоб увімкнути","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Ви впевнені, що ця оригінальна мініатюра відповідає рекомендаціям DeArrow? Якщо ви в цілому просто віддаєте перевагу переглядати оригінальні мініатюри, подумайте про зміну параметра \"За відсутності відправленої мініатюри\" в налаштуваннях DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"На YouTube TV SponsorBlock не сумісний з живим і нещодавно записаним вмістом. Якщо це останній запис, будь ласка, зачекайте кілька годин на оброблену версію запису, щоб отримати доступ.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Білий список каналів не підтримується на tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Сподобався оригінал?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Так"},"No":{"message":"Ні"},"votes":{"message":"{0} голосів","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} голос","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Смішні","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Творчий","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Розумний","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Описовий","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Інше","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Класичний режим","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Назви замінюються стандартизованими форматами на основі всіх відеороликів, де існує назва краудсорсингу."},"CasualMode":{"message":"Звичайний режим","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Залишайте оригінальні назви, якщо вони достатньо добре описують відео, є розумними або смішними.\nВиберіть, які категорії назв ви хочете бачити.\nВи зможете проголосувати, чи підходить назва до категорії чи ні."},"minimumVotes":{"message":"Мінімум голосів","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Показати оригінальну мініатюру проголосованого відео в звичайному режимі","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Нова функція: Звичайний режим","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Показувати значок звичайного режиму тільки коли наявна користувацька назва"},"OpenSettings":{"message":"Відкрити налаштування"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/vi/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/vi/messages.json @@ -0,0 +1 @@ +{"0":{"message":"Kết nối quá hạn thời gian. Hãy kiểm tra đường truyền mạng của bạn. Nếu mạng của bạn vẫn hoạt động, có thể máy chủ đang bị quá tải hoặc không hoạt động."},"400":{"message":"Máy chủ báo yêu cầu này không hợp lệ"},"409":{"message":"Đoạn này đã được đăng rồi"},"502":{"message":"Máy chủ có vẻ đang bị quá tải. Hãy thử lại sau vài giây nữa."},"fullName":{"message":"SponsorBlock cho Youtube - Bỏ qua quảng cáo của nhà tài trợ","description":"Name of the extension."},"Description":{"message":"Bỏ qua quảng cáo của nhà tài trợ, đoạn nài nỉ đòi đăng ký và nhiều thứ tương tự trong các video trên Youtube. Báo cáo đoạn quảng cáo nhà tài trợ trong những video bạn xem để giúp người khác tiết kiệm thời gian.","description":"Description of the extension."},"channelWhitelisted":{"message":"Kênh đã được bỏ chặn!"},"Segment":{"message":"đoạn quảng cáo"},"Segments":{"message":"phân đoạn"},"SegmentsCap":{"message":"Phân đoạn"},"Chapters":{"message":"Chương"},"renderAsChapters":{"message":"Coi phân đoạn như chương","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"Hiện phân đoạn hiện tại bên cạnh thời gian video"},"showAutogeneratedChapters":{"message":"Hiện các chương được tự động tạo bởi Youtube"},"upvoteButtonInfo":{"message":"Tán thành phân đoạn này"},"reportButtonTitle":{"message":"Báo cáo"},"reportButtonInfo":{"message":"Báo cáo đoạn này đăng sai."},"Dismiss":{"message":"Đóng"},"Loading":{"message":"Đang tải..."},"Hide":{"message":"Không hiển thị nữa"},"hitGoBack":{"message":"Ấn hủy bỏ qua để quay lại đoạn ban nãy."},"unskip":{"message":"Hủy bỏ qua"},"reskip":{"message":"Bỏ qua lại"},"unmute":{"message":"Bật tiếng"},"paused":{"message":"Tạm dừng"},"manualPaused":{"message":"Đã dừng bộ tính giờ"},"confirmMSG":{"message":"Để sửa hoặc xóa từng số riêng, hãy nhấn vào nút thông tin hoặc mở bảng popup tiện ích mở rộng bằng cách nhấn vào biểu tượng tiện ích mở rộng ở góc phía trên bên phải."},"clearThis":{"message":"Bạn có chắc chắn muốn xóa không?\n\n"},"Unknown":{"message":"Có lỗi xảy ra khi đăng đoạn quảng cáo tài trợ, xin vui lòng thử lại sau."},"sponsorFound":{"message":"Video này có đoạn quảng cáo trong kho dữ liệu rồi!"},"sponsor404":{"message":"Không tìm thấy phân đoạn nào"},"sponsorStart":{"message":"Đoạn quảng cáo bắt đầu vào lúc này"},"sponsorEnd":{"message":"Đoạn quảng cáo kết thúc vào lúc này"},"sponsorCancel":{"message":"Huỷ tạo phân đoạn"},"noVideoID":{"message":"Không tìm thấy video nào.\nNếu sai, hãy thử tải lại thẻ này."},"refreshSegments":{"message":"Làm mới segments"},"success":{"message":"Thành công!"},"voted":{"message":"Đã bầu chọn!"},"serverDown":{"message":"Có vẻ máy chủ đang không hoạt động. Hãy liên hệ nhà phát triển ngay lập tức."},"connectionError":{"message":"Đã xảy ra lỗi kết nối. Mã lỗi: "},"segmentsStillLoading":{"message":"Phân đoạn vẫn đang tải..."},"clearTimes":{"message":"Xóa các phân đoạn"},"openPopup":{"message":"Mở bảng popup của SponsorBlock"},"closePopup":{"message":"Đóng bảng popup"},"closeIcon":{"message":"Đóng Biểu Tượng"},"OpenSubmissionMenu":{"message":"Mở Menu Phân Đoạn Đã Gửi"},"OpenCasualVoteMenu":{"message":"Mở menu chế độ thoải mái"},"sortSegments":{"message":"Sắp xếp phân đoạn"},"submitCheck":{"message":"Bạn có chắc chắn muốn gửi không?"},"whitelistChannel":{"message":"Đưa kênh vào danh sách không chặn"},"removeFromWhitelist":{"message":"Loại kênh khỏi danh sách không chặn"},"voteOnTime":{"message":"Bầu chọn một phân đoạn"},"Submissions":{"message":"Các phân đoạn"},"savedPeopleFrom":{"message":"Bạn đã giúp mọi người bỏ qua "},"viewLeaderboard":{"message":"Bảng xếp hạng"},"recordTimesDescription":{"message":"Gửi"},"submissionEditHint":{"message":"Phần chỉnh sửa sẽ xuất hiện sau khi bạn bấm gửi","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"Gợi ý: Bạn có thể thêm phím tắt để gửi trong phần tuỳ chọn"},"clearTimesButton":{"message":"Xóa thời gian"},"Username":{"message":"Tên người dùng"},"setUsername":{"message":"Đặt tên người dùng"},"copyPublicID":{"message":"Sao chép Public UserID"},"copySegmentID":{"message":"Sao chép ID phân đoạn"},"loopChapter":{"message":"Lặp chương"},"unloopChapter":{"message":"Hủy lặp chương"},"hideThis":{"message":"Đóng lại"},"Options":{"message":"Tùy chọn"},"showButtons":{"message":"Hiển thị nút trên trình chạy video Youtube"},"hideButtonsDescription":{"message":"Không hiển thị nút trên trình chạy video Youtube để đăng đoạn quảng cáo."},"showSkipButton":{"message":"Giữ nút bỏ qua Highlight trên trình phát player"},"showInfoButton":{"message":"Hiển thị nút thông tin trên trình chạy video Youtube"},"autoHideInfoButton":{"message":"Tự động ẩn nút Info"},"showDeleteButton":{"message":"Hiển thị nút xóa trên trình chạy video Youtube"},"enableViewTracking":{"message":"Bật tính năng theo dõi số quảng cáo được bỏ qua"},"whatViewTracking":{"message":"Tính năng này theo dõi những đoạn quảng cáo bạn đã bỏ qua để cho người dùng khác biết những đoạn họ đăng đã giúp người khác đến mức nào. Tính năng này, cùng với tính năng bầu chọn, còn được dùng làm thước đo để đảm bảo spam không lọt vào kho dữ liệu. Tiện ích mở rộng này gửi tín hiệu đến máy chủ mỗi lần bạn bỏ qua một đoạn quảng cáo. Mong là đa phần mọi người không thay đổi cài đặt này để thông số người xem được chính xác nhất. :)"},"enableViewTrackingInPrivate":{"message":"Bật việc theo dõi số lượng người bỏ qua phân đoạn trong tab Riêng tư/Ẩn danh"},"enableTrackDownvotes":{"message":"Lưu trữ phiếu phản đối phân đoạn"},"whatTrackDownvotes":{"message":"Bất kỳ phân đoạn nào bạn phản đối sẽ vẫn bị ẩn ngay cả sau khi làm mới"},"trackDownvotesWarning":{"message":"Cảnh báo: Tắt tính năng này sẽ xóa tất cả các phiếu phản đối đã lưu trữ trước đó"},"enableTrackDownvotesInPrivate":{"message":"Lưu trữ các bình chọn phản đối của phân đoạn trong tab ẩn danh"},"enableQueryByHashPrefix":{"message":"Truy vấn theo Hash Prefix"},"whatQueryByHashPrefix":{"message":"Thay vì yêu cầu phân đoạn từ máy chủ bằng cách sử dụng videoID, 4 ký tự đầu tiên của hash của videoID sẽ được gửi. Máy chủ sau đó sẽ gửi dữ liệu cho tất cả video với các hash tương tự."},"enableShowCategoryWithoutPermission":{"message":"Hiện danh mục trong menu phân đoạn đã gửi mà không cần sự cho phép gửi phân đoạn đó"},"whatShowCategoryWithoutPermission":{"message":"Có một vài danh mục cần sự cho phép để gửi do yêu cầu danh tiếng tối thiểu"},"showNotice":{"message":"Hiện thông báo lại"},"showSkipNotice":{"message":"Hiển thị thông báo sau khi bỏ qua phân đoạn"},"showUpcomingNotice":{"message":"Hiện thông báo trước khi một phân đoạn được bắt đầu"},"showCategoryGuidelines":{"message":"Hiển thị Danh mục Trợ giúp"},"noticeVisibilityMode0":{"message":"Thông báo bỏ qua với kích thước đầy đủ"},"noticeVisibilityMode1":{"message":"Thông báo bỏ qua kích thước nhỏ nếu phân đoạn được tự động bỏ qua"},"noticeVisibilityMode2":{"message":"Thông báo bỏ qua kích thước nhỏ cho toàn bộ phân đoạn"},"noticeVisibilityMode3":{"message":"Thông báo bỏ qua mờ nếu phân đoạn được tự động bỏ qua"},"noticeVisibilityMode4":{"message":"Thông báo bỏ qua mờ cho tất cả các phân đoạn"},"longDescription":{"message":"SponsorBlock giúp bạn bỏ qua quảng cáo từ nhà tài trợ, đoạn giới thiệu, đoạn kết, lời nhắc đăng ký kênh, và những phần khó chịu khác trong các video Youtube. SponsorBlock là một tiện ích mở rộng cho trình duyệt, cho phép tất cả người dùng đăng thời điểm bắt đầu và kết thúc của những đoạn quảng cáo từ nhà tài trợ và các đoạn khác trong video Youtube. Sau khi một người đăng thông tin này lên, tất cả mọi người dùng tiện ích mở rộng này sẽ bỏ qua đoạn quảng cáo đó. Bạn cũng có thể bỏ qua phần không có nhạc trong những video âm nhạc.","description":"Full description of the extension on the store pages."},"website":{"message":"Trang web","description":"Used on Firefox Store Page"},"sourceCode":{"message":"Mã nguồn","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"Thông báo đã được nâng cấp!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"Nếu bạn vẫn không thích, hãy nhấn nút không hiển thị lại.","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"Bỏ qua phân đoạn","description":"Keybind label"},"setStartSponsorShortcut":{"message":"Bắt đầu/dừng phân đoạn","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"Mở menu phân đoạn đã gửi","description":"Keybind label"},"setSubmitKeybind":{"message":"Gửi phân đoạn","description":"Keybind label"},"setPreviewKeybind":{"message":"Xem trước Phân đoạn","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"Đóng thông báo bỏ qua","description":"Keybind label"},"setDownvoteKeybind":{"message":"Phản đối phân đoạn","description":"Keybind label"},"setUpvoteKeybind":{"message":"Đồng ý phân đoạn","description":"Keybind label"},"nextChapterKeybind":{"message":"Chương tiếp","description":"Keybind label"},"previousChapterKeybind":{"message":"Chương trước","description":"Keybind label"},"enableDeArrowKey":{"message":"Bật/tắt DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"Mở menu phân đoạn đã gửi","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"Chọn một phím bằng cách nhập nó và chọn bất kỳ phím bổ trợ nào bạn muốn sử dụng."},"disableSkipping":{"message":"Bỏ qua được bật"},"enableSkipping":{"message":"Bỏ qua đã bị vô hiệu hoá"},"yourWork":{"message":"Thành quả của bạn","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"Mã lỗi: "},"skip":{"message":"Bỏ qua"},"mute":{"message":"Ngắt tiếng"},"full":{"message":"Toàn bộ Video","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"Bỏ qua {0}?"},"mute_category":{"message":"Ngắt tiếng {0} chứ?"},"skip_to_category":{"message":"Bỏ qua đến {0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"Sẵn diễn ra {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} đã bỏ qua","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} đã được tắt tiếng","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"Đã bỏ qua đến {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"Đã bình chọn đoạn {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"Tắt tự động bỏ qua"},"enableAutoSkip":{"message":"Bật tự động bỏ qua"},"audioNotification":{"message":"Thông báo bằng âm thanh khi bỏ qua"},"audioNotificationDescription":{"message":"Thông báo bằng âm thanh sẽ được bật khi bỏ qua quảng cáo. Nếu tắt tính năng này (hoặc tính năng tự động bỏ qua quảng cáo bị tắt), sẽ không có âm thanh kêu."},"showTimeWithSkips":{"message":"Hiển thị độ dài video khi lược bỏ quảng cáo"},"showTimeWithSkipsDescription":{"message":"Độ dài này được hiển thị trong ngoặc đơn, bên cạnh độ dài hiện tại, phía dưới thanh tiến trình video. Con số này là độ dài video trừ đi các đoạn quảng cáo, bao gồm cả những đoạn được đánh dấu là chỉ \"Hiển thị trong thanh tiến trình video\"."},"youHaveSkipped":{"message":"Bạn đã bỏ qua "},"minLower":{"message":"phút"},"minsLower":{"message":"phút"},"hourLower":{"message":"giờ"},"hoursLower":{"message":"giờ"},"youHaveSavedTime":{"message":"Bạn đã giúp người khác tiết kiệm được","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" của cuộc đời họ","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"Truy cập trang status.sponsor.ajay.app để biết tình trạng máy chủ."},"changeUserID":{"message":"Nhập/Xuất UserID bí mật của bạn"},"whatChangeUserID":{"message":"Đây là mã cần được giữ bí mật. Nó giống như mật khẩu và không nên được chia sẻ cho bất kì ai khác. Nếu có ai đó lấy được mã này, họ có thể mạo danh bạn. Còn nếu như bạn đang tìm userID công khai, hãy nhấn vào hình khay nhớ tạm trong popup."},"setUserID":{"message":"Đặt UserID bí mật"},"userIDChangeWarning":{"message":"Cảnh báo: Việc thay đổi UserID bí mật có tác dụng vĩnh viễn. Bạn có chắc muốn thay đổi không? Hãy nhớ sao lưu lại mã người dùng cũ để đề phòng."},"createdBy":{"message":"Được tạo bởi"},"supportOtherSites":{"message":"Hỗ trợ các trang web Youtube thuộc bên thứ 3"},"supportOtherSitesDescription":{"message":"Hỗ trợ các client YouTube của bên thứ ba. Để bật chức năng hỗ trợ, bạn phải chấp nhận các quyền bổ sung.","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"Các trang web được hỗ trợ: "},"optionsInfo":{"message":"Bật hỗ trợ cho Invidious, tắt tự động bỏ qua quảng cáo, không hiển thị nút, và nhiều tùy chọn khác."},"addInvidiousInstance":{"message":"Thêm Instance của ứng dụng bên thứ 3"},"addInvidiousInstanceDescription":{"message":"Thêm một instance. Chỉ có mỗi tên miền. Ví dụ: invidious.ajay.app"},"add":{"message":"Thêm vào"},"addInvidiousInstanceError":{"message":"Đây là tên miền không hợp lệ. Chỉ dùng RIÊNG phần tên miền thôi. Ví dụ: Invidious.ajay.app"},"resetInvidiousInstance":{"message":"Thiết lập lại danh sách phiên bản Invidious"},"resetInvidiousInstanceAlert":{"message":"Bạn đang sắp thiết lập lại danh sách phiên bản Invidious"},"invidiousDisabledSafari":{"message":"Hỗ trợ cho Invidious hiện không khả dụng trên Safari do một lỗi trên Safari. Khi Apple khắc phục lỗi này, tính năng sẽ được thêm trở lại."},"currentInstances":{"message":"Các phiên bản hiện tại:"},"minDuration":{"message":"Độ dài tối thiểu (giây):"},"minDurationDescription":{"message":"Đoạn quảng cáo ngắn hơn giá trị được đặt sẽ không bị bỏ qua hoặc hiển thị trong trình chạy video."},"enableManualSkipOnFullVideo":{"message":"Sử dụng chức năng bỏ qua thủ công khi nhãn dành cho toàn video có tồn tại"},"whatManualSkipOnFullVideo":{"message":"Dành cho những ai muốn xem toàn bộ video nếu nó được tài trợ toàn bộ hoặc tự quảng cáo."},"skipNoticeDuration":{"message":"Thời gian tự động đóng bảng thông báo phân đoạn (giây):"},"skipNoticeDurationDescription":{"message":"Đặt thời gian hiển thị bảng thông báo phân đoạn. Nếu như bạn tự nhấn nút bỏ qua, nó sẽ hiện lâu hơn 1 chút."},"shortCheck":{"message":"Đoạn quảng cáo sau ngắn hơn tùy chọn độ dài ngắn nhất của bạn. Điều này có thể có nghĩa là nó đã được đăng rồi, và không được bỏ qua vì tùy chọn này. Bạn có chắc muốn đăng nó không?"},"liveOrPremiere":{"message":"Không được phép gửi trên một buổi phát trực tiếp hoặc buổi ra mắt đang hoạt động. Vui lòng đợi cho đến khi kết thúc, sau đó làm mới trang và xác minh rằng các phân đoạn vẫn hợp lệ."},"showUploadButton":{"message":"Hiển thị nút tải lên"},"customServerAddress":{"message":"Địa chỉ máy chủ SponsorBlock"},"customServerAddressDescription":{"message":"Địa chỉ SponsorBlock dùng để liên hệ với máy chủ.\nTrừ khi bạn có máy chủ riêng, bạn không nên thay đổi mục này."},"dataFetchingServerAddress":{"message":"Địa chỉ máy chủ tìm nạp dữ liệu"},"dataFetchingServerAddressDescription":{"message":"Địa chỉ dùng để liên lạc với máy chủ tìm nạp dữ liệu.\nTrừ khi bạn có máy chủ riêng, bạn không nên thay đổi mục này."},"thumbnailCacheServerAddress":{"message":"Địa chỉ máy chủ lưu hình thu nhỏ"},"save":{"message":"Lưu"},"reset":{"message":"Thiết lập lại"},"customAddressError":{"message":"Địa chỉ này sai hình thức. Hãy đảm bảo rằng địa chỉ có http:// hoặc https:// ở đầu và không có dấu gạch chéo ở cuối."},"areYouSureReset":{"message":"Bạn có chắc mình muốn thiết lập lại không?"},"mobileUpdateInfo":{"message":"m.youtube.com đã được hỗ trợ"},"exportOptions":{"message":"Nhập/xuất tất cả tùy chọn"},"exportOtherData":{"message":"Nhập/Xuất Tất cả Dữ liệu Khác"},"exportOptionsCopy":{"message":"Chỉnh sửa/sao chép"},"exportOptionsDownload":{"message":"Lưu vào tệp"},"exportOptionsUpload":{"message":"Tải từ tệp"},"whatExportOptions":{"message":"Đây là toàn bộ cấu hình của bạn trong tệp JSON. Nó chứa cả UserID bí mật của bạn, nên hãy chia sẻ cẩn thận."},"setOptions":{"message":"Đặt tùy chọn"},"exportOptionsWarning":{"message":"Cảnh báo: Việc thay đổi tùy chọn có tác dụng vĩnh viễn và có thể ảnh hưởng đến việc cài đặt. Bạn có chắc muốn thay đổi không? Hãy nhớ sao lưu lại tùy chọn cũ để đề phòng."},"incorrectlyFormattedOptions":{"message":"Tệp JSON này không được định dạng đúng cách. Tùy chọn của bạn chưa được thay đổi."},"confirmNoticeTitle":{"message":"Gửi phân đoạn"},"submit":{"message":"Gửi"},"cancel":{"message":"Huỷ"},"delete":{"message":"Xóa"},"preview":{"message":"Xem trước"},"unsubmitted":{"message":"Chưa gửi lên: "},"inspect":{"message":"Kiểm tra"},"edit":{"message":"Chỉnh sửa"},"copyDebugLogs":{"message":"Chép Nhật Ký Gỡ Lỗi"},"copyDebugInformation":{"message":"Sao chép thông tin gỡ lỗi vào khay nhớ tạm"},"copyDebugInformationFailed":{"message":"Không sao chép được vào khay nhớ tạm"},"copyDebugInformationOptions":{"message":"Sao chép thông tin vào khay nhớ tạm để cung cấp cho nhà phát triển khi phát sinh lỗi / khi nhà phát triển yêu cầu. Thông tin nhạy cảm như ID người dùng của bạn, kênh trong danh sách không chặn, và địa chỉ máy chủ tuỳ chỉnh đã bị xoá. Tuy nhiên, nó có chứa thông tin như user agent, trình duyệt, hệ điều hành và phiên bản của tiện ích mở rộng. "},"copyDebugInformationComplete":{"message":"Thông tin gỡ lỗi đã được sao chép vào bộ nhớ tạm. Hãy thoải mái xóa thông tin mà bạn không muốn chia sẻ. Lưu thông tin này vào một tập tin văn bản hoặc dán nó vào bản báo cáo lỗi."},"keyAlreadyUsed":{"message":"Phím tắt này liên kết với một hành động khác. Vui lòng chọn một cái khác."},"to":{"message":"đến","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"Đã sao chép!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"Bao gồm các phân đoạn chuyển cảnh"},"generic_guideline2":{"message":"Phát như thể không có gì bị bỏ qua"},"category_sponsor":{"message":"Nhà tài trợ"},"category_sponsor_description":{"message":"Nội dung được trả tiền để quảng cáo, giới thiệu và quảng cáo trực tiếp. Không phải là quảng cáo không trả công hay được đề cập miễn phí."},"category_sponsor_guideline1":{"message":"Quảng cáo trả phí"},"category_sponsor_guideline2":{"message":"Không dành cho các khoản đóng góp"},"category_selfpromo":{"message":"Quảng cáo không trả công/Tự quảng cáo"},"category_selfpromo_description":{"message":"Tương tự như 'nhà tài trợ' ngoại trừ việc quảng cáo không được trả tiền hay tự quảng cáo. Điều này bao gồm các phần hàng hóa, đóng góp, hoặc thông tin về người mà họ hợp tác cùng."},"category_selfpromo_guideline1":{"message":"Quyên góp, tư cách thành viên và hàng hóa tùy chỉnh"},"category_selfpromo_guideline2":{"message":"Lời cảm ơn miễn phí không thêm vào video"},"category_selfpromo_guideline3":{"message":"Không dành cho các sản phẩm và hàng hóa do công ty thiết kế"},"category_exclusive_access":{"message":"Truy cập riêng"},"category_exclusive_access_description":{"message":"Chỉ để dán nhãn cho toàn bộ video. Được sử dụng khi video giới thiệu một sản phẩm, dịch vụ hoặc vị trí mà họ đã nhận được quyền truy cập miễn phí hoặc được trợ cấp."},"category_exclusive_access_pill":{"message":"Video này giới thiệu sản phẩm, dịch vụ hoặc vị trí mà họ đã nhận được quyền truy cập miễn phí hoặc được trợ cấp","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"Toàn bộ video giới thiệu nội dung nào đó có quyền truy cập miễn phí hoặc được trợ cấp"},"category_interaction":{"message":"Nhắc tương tác (Đăng ký)"},"category_interaction_description":{"message":"Nhắc nhở người xem Thích, Đăng ký hoặc Theo dõi. Nếu nó dài hoặc là một cái gì cụ thể, nó nên là danh mục \"Tự quảng cáo\"."},"category_interaction_guideline1":{"message":"Lời nhắc ngắn gọn để thích, đăng ký hoặc theo dõi"},"category_interaction_guideline2":{"message":"Bao gồm lời nhắc gián tiếp để bình luận"},"category_interaction_guideline3":{"message":"Không dành cho quảng cáo chung, chỉ dành cho lời kêu gọi hành động"},"category_interaction_short":{"message":"Nhắc nhở tương tác"},"category_intro":{"message":"Tạm dừng/Giới thiệu"},"category_intro_description":{"message":"Khoảng thời gian mà không có nội dung thực sự. Nó có thể là đoạn nghỉ, khung hình tĩnh, hình động lặp lại. Không dùng lựa chọn này cho những cho những chuyển cảnh có chứa thông tin."},"category_intro_short":{"message":"Tạm ngừng"},"category_intro_guideline1":{"message":"Khoảng thời gian không thực sự chứa nội dung"},"category_intro_guideline2":{"message":"Không dành cho chuyển tiếp có chứa thông tin"},"category_outro":{"message":"Màn hình kết thúc/Danh đề"},"category_outro_description":{"message":"Credits hoặc khi thẻ màn hình kết thúc của YouTube xuất hiện. Không dùng với những đoạn có thông tin."},"category_outro_guideline1":{"message":"Không bao gồm nội dung, ngay cả khi thẻ kết thúc ở trên màn hình"},"category_preview_description":{"message":"Tập hợp các đoạn video ngắn cho thấy những gì sẽ xảy ra trong video hiện tại hoặc các video khác trong cùng một loạt video, trong đó tất cả thông tin được lặp lại ở phần sau của video."},"category_preview_guideline1":{"message":"Các clip xuất hiện sau đó hoặc trong một video trong tương lai"},"category_preview_guideline2":{"message":"Tóm tắt video trước đó"},"category_preview_guideline3":{"message":"Không dành cho các phần thêm nội dung bổ sung"},"category_filler":{"message":"Lạc đề, nhảm nhí/Câu đùa"},"category_filler_description":{"message":"Tập hợp các cảnh lạc đề hoặc câu đùa không bắt buộc xem để hiểu nội dung chính trong video. Điều này không nên bao gồm các đoạn chứa nội dung hoặc nói về ngữ cảnh của video. Đây là một danh mục rất nghiêm túc được sử dụng khi bạn không có tâm trạng \"vui vẻ\"."},"category_filler_short":{"message":"Các đoạn lạc đề, nhảm nhí"},"category_filler_guideline1":{"message":"Các cảnh lạc đề, nhảm nhí hoặc câu đùa"},"category_filler_guideline2":{"message":"Các phân cảnh làm phiền, quay lỗi, phát lại"},"category_filler_guideline3":{"message":"Không dùng cho các cảnh cần thiết để hiểu chủ đề"},"category_music_offtopic":{"message":"Nhạc: Phần không nhạc"},"category_music_offtopic_description":{"message":"Chỉ sử dụng cho video âm nhạc. Điều này có nghĩa là các phân đoạn đó nằm trong 1 video âm nhạc chưa thuộc về một loại danh mục khác."},"category_music_offtopic_short":{"message":"Không có nhạc"},"category_music_offtopic_guideline1":{"message":"Phần không có trong bản phát hành chính thức"},"category_music_offtopic_guideline2":{"message":"Phần không nhạc trong một buổi biểu diễn trực tiếp"},"category_poi_highlight":{"message":"Điểm/Khoảnh khắc quan trọng"},"category_poi_highlight_description":{"message":"Phần của video mà hầu hết mọi người đang tìm kiếm. Tương tự với câu nói \"Video bắt đầu từ x\"."},"category_poi_highlight_guideline1":{"message":"Phần mà hầu hết mọi người đang tìm kiếm"},"category_poi_highlight_guideline2":{"message":"Có thể bỏ qua ngữ cảnh"},"category_poi_highlight_guideline3":{"message":"Có thể bỏ qua để đến tiêu đề hoặc hình thu nhỏ"},"category_chapter":{"message":"Chương"},"category_chapter_description":{"message":"Các chương được đặt tên tuỳ chỉnh mô tả các phần chính của video."},"category_chapter_guideline1":{"message":"Không nhắc đến tên nhà tài trợ"},"category_chapter_guideline2":{"message":"Sử dụng các chương lớn hơn cho các phần chung"},"category_chapter_guideline3":{"message":"Các chương nhỏ hơn có thể được đặt bên trong các chương lớn hơn"},"category_livestream_messages":{"message":"Luồng phát trực tiếp: Đọc Quyên góp/Tin nhắn"},"category_livestream_messages_short":{"message":"Đọc tin nhắn"},"autoSkip":{"message":"Tự động bỏ qua"},"manualSkip":{"message":"Bỏ qua thủ công"},"showOverlay":{"message":"Hiện ở thanh xem trước"},"disable":{"message":"Tắt"},"autoSkip_POI":{"message":"Tự động bỏ qua"},"manualSkip_POI":{"message":"Hỏi khi video bắt đầu"},"showOverlay_POI":{"message":"Hiện ở thanh xem trước"},"showOverlay_full":{"message":"Hiển thị nhãn"},"showOverlay_chapter":{"message":"Hiện Chương"},"autoSkipOnMusicVideos":{"message":"Tự động bỏ qua tất cả các phân đoạn nếu trong video có phân đoạn không phải nhạc"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"Chỉ tự động bỏ qua trên music.youtube.com"},"muteSegments":{"message":"Cho phép các phân đoạn bị tắt tiếng hay vì bỏ qua"},"fullVideoSegments":{"message":"Hiển thị biểu tượng khi video hoàn toàn là quảng cáo","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"Hiện nhãn trên hình thu nhỏ video","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"Màu khi chưa được gửi đi","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"Màu của thanh tìm kiếm"},"category":{"message":"Thể loại"},"skipOption":{"message":"Tùy chọn Bỏ qua","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"Mở các tùy chọn bỏ qua nâng cao"},"advancedSkipNotSaved":{"message":"Lỗi cú pháp: Các tùy chọn của bạn chưa được lưu"},"advancedSkipSettingsHelp":{"message":"Cách thức hoạt động","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"Kích hoạt Máy chủ Thử nghiệm"},"whatEnableTestingServer":{"message":"Những đóng góp của bạn sẽ KHÔNG ĐƯỢC TÍNH ở máy chủ chính. Chỉ dùng cho mục đích thử nghiệm."},"testingServerWarning":{"message":"Tất cả đóng góp hay bình chọn sẽ KHÔNG ĐƯỢC TÍNH ở máy chủ chính khi kết nối đến máy chủ thử nghiệm. Hãy vô hiệu hoá lựa chọn này nếu bạn muốn tiếp tục đóng góp."},"bracketNow":{"message":"(Bây giờ)"},"moreCategories":{"message":"Các danh mục khác"},"chooseACategory":{"message":"Chọn một danh mục"},"enableThisCategoryFirst":{"message":"Để gửi một phân đoạn với chủ đề \"{0}\", bạn cần phải kích hoạt nó trong phần tuỳ chọn. Bạn sẽ được đưa đến phần tuỳ chỉnh bây giờ.","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"Cảnh báo: Loại phân đoạn này chỉ có thể có tối đa một đoạn được hoạt động trong một lúc. Việc gửi lên nhiều phân đoạn sẽ khiến một đoạn được hiển thị ngẫu nhiên."},"youMustSelectACategory":{"message":"Bạn phải lựa chọn một danh mục cho tất cả phân đoạn bạn đang muốn đăng tải!"},"bracketStart":{"message":"(Bắt đầu)"},"bracketEnd":{"message":"(Kết thúc)"},"End":{"message":"Cuối video","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"đã ẩn: hạ bình chọn"},"hiddenDueToDuration":{"message":"đã bị ẩn: quá ngắn"},"manuallyHidden":{"message":"ẩn thủ công"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"Không xác định được ID kênh. Nếu bạn đang xem video này trên 1 trang web thứ 3, hãy mở lại video này trên trang chủ Youtube rồi thử lại. Điều này cũng có thể do những thay đổi trong mã nguồn trang web YouTube, nếu bạn nghĩ vậy, hãy bình luận tại đây:"},"invidiousPermissionRefresh":{"message":"Trình duyệt đã thu hồi quyền cần thiết để hoạt động trên Invidious và các trang web bên thứ ba khác. Vui lòng nhấp vào nút bên dưới để kích hoạt lại quyền này."},"acceptPermission":{"message":"Cho phép truy cập"},"permissionRequestSuccess":{"message":"Đã có quyền truy cập!"},"permissionRequestFailed":{"message":"Truy cập bị từ chối, bạn đã nhấp vào từ chối à?"},"adblockerIssueWhitelist":{"message":"Nếu bạn không thể giải quyết được vấn đề này, hãy vô hiệu hoá cài đặt 'Bỏ qua video không công khai/riêng tư', vì SponsorBlock không thể lấy được thông tin của video này"},"forceChannelCheck":{"message":"Bắt buộc kiểm tra kênh trước khi bỏ qua"},"whatForceChannelCheck":{"message":"Theo mặc định, các phân đoạn đã xác định sẽ được bỏ qua ngay lập tức trước khi biết đây là kênh nào. Vì vậy, một số phân đoạn ở đầu video sẽ bị bỏ qua ngay lập tức cho dù bạn đã bỏ chặn kênh. Bật lựa chọn này sẽ ngăn chặn điều đó nhưng sẽ mất một chút thời gian hơn để bỏ qua do phải lấy ID của kênh. Độ trễ sẽ được cải thiện nếu bạn có kết nối mạng tốt."},"forceChannelCheckPopup":{"message":"Cân nhắc bật chế độ \"Bắt buộc kiểm tra kênh YouTube trước khi bỏ qua phân đoạn\""},"downvoteDescription":{"message":"Chỉnh thời gian sai/không đúng"},"incorrectVote":{"message":"Sai"},"harmfulVote":{"message":"Có hại","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"Đổi danh mục"},"nonMusicCategoryOnMusic":{"message":"Video này đã được phân loại là âm nhạc. Bạn có chắc đây là quảng cáo nhà tài trợ không? Nếu đây là phân đoạn \"Không phải nhạc\", hãy mở Cài đặt tiện ích và bật lựa chọn đó. Rồi bạn có thể đăng tải phân đoạn lên dưới danh mục \"Không phải nhạc\" thay vì \"Quảng cáo nhà tài trợ\". Hãy đọc Hướng dẫn nếu bạn vẫn còn vướng mắc"},"multipleSegments":{"message":"Nhiều phân đoạn"},"guidelines":{"message":"Hướng dẫn"},"readTheGuidelines":{"message":"Hãy đọc hướng dẫn!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"Danh mục ở đây!"},"categoryUpdate2":{"message":"Mở Tùy chọn để bỏ qua đoạn mở đầu, kết thúc, giới thiệu hàng hoá, v.v."},"help":{"message":"Trợ giúp"},"GotIt":{"message":"Đã hiểu","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"Phân đoạn này có độ dài lớn. Nếu toàn bộ video nói về một chủ đề, hãy chuyển từ \"Bỏ qua\" thành \"Toàn bộ video\". Xem hướng dẫn để biết thêm thông tin."},"categoryPillTitleText":{"message":"Toàn bộ video này được gắn thẻ vào thể loại này và được tích hợp quá chặt chẽ để có thể tách ra"},"chapterNameTooltipWarning":{"message":"Một trong các tên chương của bạn tương tự như một danh mục. Bạn nên sử dụng danh mục khi có thể thay vì tên chương."},"experiementOptOut":{"message":"Từ chối tham gia thử nghiệm trong tương lai","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"Ẩn vĩnh viễn"},"warningChatInfo":{"message":"Chúng tôi nhận thấy rằng bạn đã mắc một số lỗi phổ biến. Chúng tôi đánh giá rất cao công việc của bạn cho đến nay, nhưng chúng tôi luôn cố gắng hướng đến sự hoàn hảo ở đây, vì vậy ngay cả những lỗi nhỏ cũng quan trọng :)"},"questionButton":{"message":"Tôi có một câu hỏi"},"askAQuestion":{"message":"Đặt câu hỏi"},"warningConfirmButton":{"message":"Tôi hiểu lí do này"},"warningError":{"message":"Lỗi khi cố gắng xác nhận cảnh báo:"},"deArrowMessageRecieved":{"message":"Bạn đã nhận được một lời khuyên từ người kiểm duyệt"},"Donate":{"message":"Ủng hộ"},"considerDonating":{"message":"Hỗ trợ phát triển cấp quỹ"},"supportSponsorBlock":{"message":"Hãy hỗ trợ công việc toàn thời gian của tôi trên SponsorBlock"},"hideDonationLink":{"message":"Ẩn link donate"},"darkModeOptionsPage":{"message":"Chế độ tối trên trang tùy chọn"},"helpPageThanksForInstalling":{"message":"Cảm ơn bạn đã cài đặt SponsorBlock."},"helpPageReviewOptions":{"message":"Xin hãy xem xét các tuỳ chọn bên dưới"},"helpPageFeatureDisclaimer":{"message":"Nhiều tính năng sẽ bị tắt theo mặc định. Nếu bạn muốn bỏ qua phần intro, sử dụng trên các trang web bên thứ 3 như Invidious, v. v...., bạn có thể bật nó ở bên dưới. Bạn cũng có thể cho hiện/ẩn UI người dùng."},"helpPageHowSkippingWorks":{"message":"Cách thức hoạt động"},"helpPageHowSkippingWorks1":{"message":"Tất cả nhà tài trợ đều do người dùng như bạn gửi lên. Bạn có thể xem danh sách các nhà tài trợ đã được gửi trong cơ sở dữ liệu bằng cách mở cửa sổ bật lên ở góc trên bên phải trình duyệt của bạn."},"helpPageHowSkippingWorks2":{"message":"Bất cứ khi nào bỏ qua một phân đoạn, bạn sẽ nhận được thông báo. Nếu thời gian phân đoạn có vẻ sai, hãy bỏ phiếu bằng cách nhấp vào nút phản đối! Bạn cũng có thể bỏ phiếu trong cửa sổ bật lên."},"Submitting":{"message":"Việc gửi lên"},"helpPageSubmitting1":{"message":"Việc gửi có thể được thực hiện bằng cách nhấp vào logo SponsorBlock trên trình phát video."},"helpPageSubmitting2":{"message":"Nhấp vào nút phát để đánh dấu bắt đầu phân đoạn và nhấp vào nút dừng để đánh dấu kết thúc. Nhấp vào nút mũi tên lên để mở menu gửi, nơi bạn có thể xác minh phân đoạn bằng cách xem trước và chỉnh sửa cho thật chính xác. Độ chính xác rất quan trọng, hãy đọc kỹ hướng dẫn trước khi gửi."},"helpPageCopyOfDatabase":{"message":"Các phân đoạn đã gửi sẽ đi đâu?"},"helpPageCopyOfDatabase1":{"message":"Tất cả các phân đoạn đã gửi sẽ được đưa vào cơ sở dữ liệu SponsorBlock, được phát hành công khai cho mọi người sử dụng và có sẵn tại"},"helpPageCopyOfDatabase2":{"message":"Mã nguồn mở cũng được có sẵn một cách tự do. Vì vậy, ngay cả khi có điều gì đó xảy đến với mình, các phân đoạn bạn đã gửi cũng sẽ không biến mất."},"AdviceForSubmitting":{"message":"Lời khuyên khi gửi"},"Credits":{"message":"Lời cảm ơn đến"},"LearnMore":{"message":"Tìm hiểu thêm"},"FullDetails":{"message":"Xem toàn bộ đầy đủ thông tin"},"CopyDownvoteButtonInfo":{"message":"Phản đối và tạo một bản sao cục bộ để cho bạn gửi lại"},"OpenCategoryWikiPage":{"message":"Mở trang wiki của danh mục này."},"CopyAndDownvote":{"message":"Sao chép và phản đối"},"ContinueVoting":{"message":"Tiếp tục bỏ phiếu"},"ChangeCategoryTooltip":{"message":"Điều này sẽ ngay lập tức áp dụng cho phân đoạn của bạn"},"downvote":{"message":"Phản đối"},"upvote":{"message":"Đồng ý"},"hideSegment":{"message":"Ẩn phân đoạn"},"skipSegment":{"message":"Bỏ qua phân đoạn"},"playChapter":{"message":"Phát chương"},"SponsorTimeEditScrollNewFeature":{"message":"Sử dụng con lăn chuột của bạn khi di chuột qua hộp chỉnh sửa để nhanh chóng điều chỉnh thời gian. Kết hợp phím ctrl hoặc shift có thể được sử dụng để tinh chỉnh các thay đổi."},"categoryPillNewFeature":{"message":"Mới! Xem khi nào video được tài trợ hoàn toàn hoặc tự quảng bá"},"yearAbbreviation":{"message":" năm","description":"100y"},"dayAbbreviation":{"message":" ngày","description":"100d"},"hourAbbreviation":{"message":" giờ","description":"100h"},"optionsTabBehavior":{"message":"Hành vi","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"Giao diện","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"Phím tắt bàn phím","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"Sao lưu/Khôi phục","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"Điều khoản khác","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"Bỏ qua thông báo xuất hiện","description":"Option label"},"unbind":{"message":"Gỡ liên kết","description":"Unbind keyboard shortcut"},"notSet":{"message":"Chưa thiết lập"},"change":{"message":"Thay đổi"},"youtubeKeybindWarning":{"message":"Đây là lối tắt YouTube được tích hợp sẵn. Bạn có chắc chắn muốn sử dụng nó không?"},"betaServerWarning":{"message":"Máy chủ THỬ NGHIỆM đã được kích hoạt!"},"openOptionsPage":{"message":"Mở trang tùy chọn"},"resetToDefault":{"message":"Thiết lập lại cài đặt gốc"},"confirmResetToDefault":{"message":"Bạn chắc chắn muốn đặt lại cài đặt về mặc định? Điều này sẽ không thể hoàn tác được."},"exportSegments":{"message":"Xuất phân đoạn"},"importSegments":{"message":"Nhập phân đoạn"},"Import":{"message":"Nhập","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"Đổi thành công!"},"redeemFailed":{"message":"Khoá cấp phép không hợp lệ"},"hideUpsells":{"message":"Ẩn các tuỳ chọn không khả dụng nếu không thanh toán thêm"},"hideNewFeatureUpdates":{"message":"Ẩn lời nhắc về các tính năng mới"},"redeem":{"message":"Đổi"},"enterLicenseKey":{"message":"Nhập mã bản quyền"},"unsubmittedSegmentCounts":{"message":"Bạn hiện có {0} phân đoạn chưa gửi đi trên {1} video","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"Bạn hiện không có bất kỳ phân đoạn chưa gửi đi nào","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"phân đoạn chưa gửi","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"phân đoạn chưa gửi","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"video","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"video","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"Xóa tất cả phân đoạn","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"Bạn có chắc chắn muốn xóa tất cả các phân đoạn chưa gửi không?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"Hiện các phân đoạn","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"Ẩn các phân đoạn","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"ID video","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"Số lượng phân đoạn","description":"Header of the unsubmitted segments list"},"actions":{"message":"Thao tác","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"Chia sẻ dưới dạng URL"},"segmentFetchFailureWarning":{"message":"Cảnh báo: Máy chủ chưa phản hồi với các phân đoạn. Thực tế có thể đã có các phân đoạn được gửi đi trên video này, nhưng bạn chưa nhận được chúng do vấn đề với máy chủ."},"allowScrollingToEdit":{"message":"Cho phép cuộn để chỉnh sửa thời gian"},"NoticeTimeAfterSkip":{"message":"{seconds} giây","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - Tiêu đề và Hình thu nhỏ tốt hơn trên YouTube","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"Tiêu đề và hình thu nhỏ được đóng góp từ cộng đồng để mô tả nội dung video một cách chính xác và không gây giật gân","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"Chọn mô tả chi tiết nhất"},"Original":{"message":"Gốc"},"OriginalTitle":{"message":"Tiêu đề gốc"},"CurrentTime":{"message":"Thời điểm hiện tại"},"resetCustomTitle":{"message":"Đặt lại tiêu đề về văn bản gốc"},"resetIcon":{"message":"Đặt lại biểu tượng"},"TypeYourOwnTitleHere":{"message":"Nhập tiêu đề của bạn ở đây"},"VideoNotReady":{"message":"Video chưa sẵn sàng"},"FailedToRender":{"message":"Tạo thất bại","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"Thiếu canvas","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"Đã xảy ra ngoại lệ trong quá trình tạo","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"Tải thất bại","description":"Thumbnail failed to load"},"titleFormatting":{"message":"Định dạng tiêu đề"},"Disabled":{"message":"Tắt"},"CapitalizeWords":{"message":"Viết hoa chữ cái đầu từng từ"},"TitleCase":{"message":"Viết Hoa Từng Chữ"},"SentenceCase":{"message":"Chữ hoa đầu câu."},"LowerCase":{"message":"chữ thường"},"FirstLetterUppercase":{"message":"Viết hoa chữ cái đầu tiên"},"shouldCleanEmojis":{"message":"Xoá biểu tượng cảm xúc"},"onlyFormatCustomTitles":{"message":"Chỉ định dạng các tiêu đề do người dùng gửi"},"onlyTitleCaseInEnglish":{"message":"Viết hoa các Tiêu đề không phải là tiếng Anh"},"onlyTitleCaseInEnglishDescription":{"message":"Phát hiện từ ngữ không hoàn thiện và một số tiêu đề tiếng Anh không phải tiếng Anh."},"thumbnailFallbackOption":{"message":"Khi không có hình thu nhỏ nào được gửi"},"whatThumbnailFallbackOption":{"message":"Khi chọn \"Hiện ảnh chụp tại một thời điểm ngẫu nhiên của video\", tiện ích sẽ dử dụng dữ liệu SponsorBlock để đảm bảo không chọn nhầm thời điểm trong một phân đoạn quảng cáo.","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"Hiện ảnh chụp tại một thời điểm ngẫu nhiên của video"},"TheOriginalThumbnail":{"message":"Hiện hình thu nhỏ gốc"},"showABlankBox":{"message":"Hiện ô trống"},"AutoGenerated":{"message":"Hiện hình thu nhỏ được tạo tự động bởi YouTube","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"Đầu video"},"Middle":{"message":"Giữa video"},"keepUnsubmitted":{"message":"Lưu bình chọn đã gửi"},"showLiveCover":{"message":"Hiển thị Avatar kênh trên các video sắp ra mắt","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"Không bao giờ sử dụng hình thu nhỏ được thử nghiệm A/B"},"ignoreAbThumbnailsDescription":{"message":"Nhà sáng tạo có thể thiết lập các thử nghiệm trong video trên kênh của họ, trong đó YouTube sẽ hiển thị hình thu nhỏ khác nhau cho mỗi người xem. Tuỳ chọn này sẽ luôn sử dụng hình thu nhỏ đầu tiên để duy trì tính nhất quán."},"abThumbnailsWarning":{"message":"Cảnh báo: Video này đang chạy thử nghiệm A/B đối với hình thu nhỏ, do đó hình thu nhỏ có thể thay đổi thường xuyên. Có lẽ bạn không nên bình chọn cho hình thu nhỏ gốc vì rủi ro này."},"whatKeepUnsubmitted":{"message":"Giữ lại các bình chọn đã gửi để hiển thị tiêu đề và hình thu nhỏ mà bạn đã bình chọn, thay vì tiêu đề và hình thu nhỏ được bình chọn nhiều nhất trên máy chủ.\n"},"keepUnsubmittedInPrivate":{"message":"Lưu bình chọn đã gửi từ tab riêng tư"},"useThumbnailGenerationService":{"message":"Sử dụng dịch vụ tạo hình thu nhỏ"},"titleMaxLines":{"message":"Số dòng tối đa cho tiêu đề"},"titleMaxLinesDescription":{"message":"Tiêu đề video sẽ được trải dài trên số dòng này trong phần Đề xuất."},"thumbnailSaturationLevel":{"message":"Độ bão hoà của hình thu nhỏ"},"whatSaturateThumbnails":{"message":"Làm cho hình thu nhỏ bớt sống động hơn bằng cách giảm màu của chúng"},"hideDetailsWhileFetching":{"message":"Ẩn chi tiết trong khi tìm nạp"},"hideDetailsWhileFetchingDescription":{"message":"Ẩn tiêu đề và hình thu nhỏ khi lấy dữ liệu từ máy chủ. Nếu tắt, bạn sẽ thấy giật hình khi tiêu đề và hình thu nhỏ thay đổi."},"ignoreTranslatedTitles":{"message":"Không hiện tiêu đề đã được dịch bởi Youtube","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"Đôi khi Youtube sẽ tự động dịch các tiêu đề sang ngôn ngữ ưu thích của bạn. Tuỳ chọn này chỉ được áp dụng khi tiêu đề do cộng đồng đóng góp không có sẵn."},"onAllPages":{"message":"Trên tất cả các trang","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"Trên tất cả các trang trừ trang video","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"Không bao giờ"},"thumbnailGeneratorDescription1":{"message":"Dịch vụ tạo hình thu nhỏ giúp tăng tốc đáng kể quá trình tạo hình thu nhỏ bằng cách gửi yêu cầu ẩn danh với ID video đến máy chủ từ xa. Sau đó, hình thu nhỏ sẽ được tạo hoặc được lấy từ bộ nhớ đệm nếu nó đã được tạo trước đó."},"thumbnailGeneratorDescription2":{"message":"Nếu được sử dụng trên các trang video có thể tiềm ẩn việc rò rỉ các ID video không công khai đến máy chủ này. Đặt tuỳ chọn này thành \"Trên tất cả các trang trừ trang video\" sẽ tránh được vấn đề trên. Một lựa chọn khác là tự lưu trữ dịch vụ tạo hình thu nhỏ của riêng bạn."},"thumbnailGeneratorDescription3":{"message":"Nếu việc sử dụng dịch vụ tạo hình thu nhỏ bị tắt, tất cả các yêu cầu sẽ sử dụng hệ thống truy vấn k-anonymity, điều này khiến máy chủ khó dự đoán video nào đã được tìm nạp và sẽ sử dụng dịch vụ tạo hình thu nhỏ cục bộ chậm hơn.","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"Mã nguồn dịch vụ tạo hình thu nhỏ"},"moreAboutKAnonymity":{"message":"Tìm hiểu thêm về K-Anonymity","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"Luôn hiển thị nút \"Hiện chi tiết gốc\""},"whatAlwaysShowShowOriginalButton":{"message":"Nếu bạn luôn muốn biết liệu tiêu đề/hình thu nhỏ có bị thay đổi hay không, hãy bật tính năng này."},"showOriginalOnHover":{"message":"Swap between custom details and original details on hover"},"showOriginalOnHoverOfVideo":{"message":"Chuyển đổi giữa thông tin đã chỉnh và thông tin gốc khi di chuột lên bất cứ đâu trên thẻ video"},"showOriginalOnHoverOfVideoDescription":{"message":"Thao tác này sẽ vô hiệu hoá tự động phát khi di chuột"},"showCustomOnHoverIfCasual":{"message":"Show custom title on hover if a casual mode title is being shown"},"showIconForFormattedTitles":{"message":"Hiển thị nút \"Hiện chi tiết gốc\" cho các tiêu đề được định dạng tự động"},"Enable":{"message":"Bật"},"Titles":{"message":"Tiêu đề","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"Hình thu nhỏ","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"Casual votes","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"Lỗi"},"ShowOriginal":{"message":"Hiện chi tiết gốc"},"ShowModified":{"message":"Hiện chi tiết đã sửa đổi"},"ShowFormatted":{"message":"Show Formatted Details"},"FillerWarning":{"message":"Cảnh báo: Đây là một danh mục cực kỳ khó. Rất có thể bạn sẽ phải bỏ qua một số nội dung hoặc đôi khi phải tắt nó. Xin lưu ý rằng nhiều video có tỉ lệ bỏ qua đến 50% hoặc nhiều hơn! Tuy nhiên, hãy nhớ rằng vẫn có những nguyên tắc cụ thể cần tuân thủ khi gửi.","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"Tham gia Discord hoặc Matrix để duy trì cuộc trò chuyện này vĩnh viễn","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"Hiện trợ giúp cho Hướng dẫn","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"Tránh biểu cảm khuôn mặt được phóng đại","description":"Referring to the thumbnail of a video"},"tip2":{"message":"Hãy nhìn vào tổng thể, đừng chỉ trả lời câu hỏi của tiêu đề gốc","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"Tránh mô tả các phản ứng đối với video (\"gây sốc\")","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"Cung cấp đủ thông tin để đưa ra lựa chọn sáng suốt trước khi nhấp vào"},"tip5":{"message":"Viết hoa như một câu","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"Kiểm tra tất cả các hướng dẫn để gửi","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"Tiêu đề của tôi được viết hoa như một câu","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"Tiêu đề của tôi không chỉ trả lời một câu hỏi được đặt ra trong tiêu đề","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"Tiêu đề nên mô tả video hoặc nội dung câu chuyện nói chung. Bạn nên xem toàn bộ video để biết chính xác nội dung thay vì chỉ dựa vào một tiêu đề gốc hấp dẫn.","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"Tiêu đề của tôi không tóm tắt kết luận hoặc tiết lộ nội dung không cần thiết","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"Tiêu đề không nhằm thay thế việc xem video hoàn toàn, mà giúp bạn quyết định có nên nhấp vào hay không.","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"Tiêu đề của tôi không kiểm chứng, chế giễu hoặc phê bình video hay người tạo ra nó","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"Tiêu đề nên đến từ góc nhìn của người tạo và video. Đánh giá hoặc kiểm chứng video là ngoài phạm vi của DeArrow. Tiêu đề không nhằm mục đích làm phần bình luận.","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"Từ đã phát hiện: ","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"Không sử dụng động từ không cần thiết ở đầu tiêu đề","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"Bắt đầu tất cả tiêu đề bằng chữ cái viết hoa. Tiêu đề nên được định dạng như một câu","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"Tiêu đề không nên kết thúc bằng \".\"","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"Không chỉ thêm câu trả lời cho một câu hỏi trong tiêu đề gốc. Tiêu đề nên mô tả video hoặc câu chuyện nói chung","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"Tiêu đề không nên kiểm chứng, chế giễu hoặc phê bình video hay người sáng tạo","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"Tiêu đề không nên giữ lại các yếu tố giật gân từ tiêu đề gốc","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"Tiêu đề không nên có biểu tượng hình","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"Bạn phải giải quyết cảnh báo trước khi gửi"},"dearrowHelpSponsorBlockImported":{"message":"Lưu ý: Cài đặt SponsorBlock của bạn đã được nhập tự động!"},"howItWorks":{"message":"Cách thức hoạt động"},"discordPromotion":{"message":"Hãy đến đóng góp, đưa ra một số đề xuất và trợ giúp trên {discord} hoặc trên {matrix}"},"deArrowDonationText":{"message":"Nếu bạn thích những gì tôi đã làm cho đến nay và muốn giúp đỡ tôi về mặt tài chính, đây là một đường liên kết"},"termsAgreement":{"message":"Bằng cách sử dụng tiện ích mở rộng này, bạn đồng ý với {privacy-policy} và {terms}"},"privacyPolicy":{"message":"Chính sách quyền riêng tư"},"termsOfUse":{"message":"Điều khoản sử dụng"},"openSourceLicenses":{"message":"Giấy phép nguồn mở"},"defaultToOriginals":{"message":"Mặc định hiển thị thông tin gốc của video"},"whatDefaultToOriginals":{"message":"Hiển thị tiêu đề và hình thu nhỏ gốc theo mặc định, nhưng sẽ có thêm một nút xuất hiện khi di chuột để xem tiêu đề và hình thu nhỏ tuỳ chỉnh."},"replaceTitles":{"message":"Thay thế tiêu đề"},"replaceThumbnails":{"message":"Thay thế hình thu nhỏ"},"useCrowdsourcedTitles":{"message":"Sử dụng tiêu đề được đóng góp từ cộng đồng"},"whatUseCrowdsourcedTitles":{"message":"Nếu tắt, tiện ích vẫn sẽ định dạng tiêu đề nhưng sẽ không sử dụng các tiêu đề được đóng góp từ cộng đồng","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"Bạn có chắc chắn muốn xóa cấu hình này không?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"Cấu hình mới"},"DeleteConfiguration":{"message":"Xoá cấu hình"},"ChannelAllowlist":{"message":"Cài đặt riêng cho kênh"},"ConfigurationName":{"message":"Tên cấu hình"},"ChannelListInstructions":{"message":"Nhập bất kỳ kênh nào bạn muốn áp dụng cấu hình này vào hộp bên dưới, cách nhau từng dòng. Cả ID kênh và tên hiển thị đều được hỗ trợ. @Tên người dùng không được hỗ trợ. Bạn có thể lấy ID kênh bằng cách nhấn vào nút chia sẻ trên trang giới thiệu kênh. Để tới trang giới thiệu, hãy nhấn vào mô tả kênh xuất hiện bên dưới tên kênh của họ.","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"Chưa có cấu hình nào được thiết lập. Nhấp vào nút ở trên cùng để thêm cấu hình mới.","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"Dừng clickbait bằng cách thay thế tiêu đề và hình thu nhỏ bằng những thông tin chính xác hơn"},"DeArrowPromotionMessage2":{"message":"Mệt mỏi vì clickbait? Hãy xem qua tiện ích mở rộng mới của tôi để cải thiện tiêu đề và hình thu nhỏ"},"DeArrowPromotionMessage3":{"message":"Đồng thời, hãy xem qua DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"Không thích tiêu đề này ư? Đừng lo, nếu tiêu đề dưới đây làm bạn cảm thấy thú vị hơn, hãy xem xét việc sử dụng tính năng Thay thế tiêu đề trong DeArrow.","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"Hình thu nhỏ này được chọn từ một thời điểm ngẫu nhiên trong video vì chưa có đóng góp nào cho video này","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"Hình thu nhỏ này được chọn từ một thời điểm ngẫu nhiên trong video và tiêu đề được định dạng tự động vì chưa có đóng góp nào cho video này","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"Bạn có thể thay đổi mặc định này bên dưới","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"{titles} tiêu đề và {thumbnails} hình thu nhỏ đã được thay thế kể từ khi bạn cài đặt tiện ích mở rộng này","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} tiêu đề ","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} tiêu đề ","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"và {thumbnails} hình thu nhỏ","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"và {thumbnails} hình thu nhỏ","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"{titleAndThumbnailMessage} đã được thay thế kể từ khi bạn cài đặt tiện ích mở rộng này","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"Đếm số lần thay thế tiêu đề và hình thu nhỏ"},"countReplacementsDescription":{"message":"Được sử dụng để cung cấp cho bạn số liệu thống kê trong cửa sổ bật lên.","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"Thêm một danh sách bộ lọc để chặn các khảo sát, kệ sản phẩm và các phần tử quảng cáo khác bằng yt-neuter"},"requiresUblock":{"message":"Yêu cầu uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"Đã xảy ra lỗi khi phát hiện ID video. Vui lòng thử làm mới trang trước khi gửi bình chọn để đảm bảo nó được gửi đúng video. Nếu lỗi này xảy ra nhiều lần, vui lòng gửi báo cáo về lỗi này cùng với các tiện ích mở rộng hoặc userscript khác mà bạn đã cài đặt thông qua GitHub, Discord hoặc Matrix."},"dearrowLogoCredit":{"message":"Logo dựa trên Twemoji được cấp phép theo CC-BY 4.0"},"zoomToFillUnsupported":{"message":"SponsorBlock không tương thích với tiện ích mở rộng \"Zoom to Fill\". Có nhiều lựa chọn thay thế khác mà bạn có thể sử dụng để SponsorBlock hoạt động bình thường."},"freeTrialStarted":{"message":"Thời gian dùng thử miễn phí của bạn đã bắt đầu. Hãy truy cập vào YouTube để thử nghiệm"},"freeTrialEnded":{"message":"Thời gian dùng thử miễn phí của bạn đã kết thúc"},"freeTrialPrompt":{"message":"Nếu bạn muốn dùng thử trong một giờ, bạn có thể bắt đầu dùng thử miễn phí bằng nút bên dưới."},"startFreeTrial":{"message":"Bắt đầu dùng thử miễn phí"},"freeAccessRequested":{"message":"Bạn đã đăng ký thành công quyền truy cập miễn phí. Bạn sẽ nhận được thông báo khi được cấp quyền truy cập miễn phí."},"freeAccessComplete":{"message":"Xin chúc mừng! Giờ đây bạn đã có quyền truy cập miễn phí vào DeArrow"},"DeArrowNotActivated":{"message":"DeArrow chưa được kích hoạt"},"ActivateDeArrow":{"message":"Kích hoạt DeArrow"},"DeArrowIsActivated":{"message":"DeArrow đã được kích hoạt thành công"},"Close":{"message":"Đóng"},"ViewLicenseKey":{"message":"Xem khoá cấp phép"},"SharingIsCaring":{"message":"Chia sẻ là yêu thương"},"cleanPopup":{"message":"Ẩn phần lộn xộn trong danh sách phân đoạn bật lên"},"hideSegmentCreationInPopup":{"message":"Ẩn các nút tạo phân đoạn trong cửa sổ bật lên"},"syncDisabledWarning":{"message":"Cảnh báo: Lưu trữ tiện ích mở rộng đã bị vô hiệu hóa trong trình duyệt của bạn. Cài đặt này sẽ không được lưu."},"syncDisabledWarningDeArrow":{"message":"DeArrow sẽ không hoạt động nếu không có bộ lưu trữ."},"syncDisabledFirefoxSuggestions":{"message":"Bạn có thể kích hoạt tính năng này bằng cách vào about:config và đặt giá trị \"webextensions.storage.sync.enabled\" thành true."},"storageFull":{"message":"Bộ nhớ tiện ích mở rộng đã đầy. Vui lòng xóa một số phân đoạn chưa gửi trong tùy chọn."},"previewSegmentRequired":{"message":"Vui lòng xem trước các phân đoạn của bạn trước khi gửi. Bạn có thể thực hiện việc này bằng cách nhấp vào nút xem trước hoặc sử dụng phím tắt sau:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"Tham gia với tư cách là VIP","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"Hiện tại, không thể nhận phân đoạn đã gửi từ trình duyệt của bạn vì có vẻ như YouTube đã chèn một số quảng cáo từ phía máy chủ mà tiện ích mở rộng chưa thể xóa được. Vui lòng báo cáo với chúng tôi nếu bạn gặp lỗi này."},"DeArrowIsDisabled":{"message":"Đã vô hiệu hoá DeArrow - nhấn để kích hoạt","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"Bạn có chắc rằng hình thu nhỏ gốc này tuân theo các nguyên tắc của DeArrow không? Nếu bạn chỉ thích xem hình thu nhỏ gốc nói chung, hãy cân nhắc thay đổi tùy chọn 'Khi không có hình thu nhỏ được gửi' trong cài đặt của DeArrow.","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"Trên YouTube TV, SponsorBlock không có tích hợp với các nội dung trực tiếp và được ghi hình gần đây. Nếu đây là một bản ghi hình gần đây, xin hãy đợi vài tiếng để cho phiên bản đã được xử lý trở nên có sẵn.","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"Danh sách trắng kênh không được hỗ trợ trên tv.youtube.com.","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"Thích tiêu đề nguyên gốc không?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"Có"},"No":{"message":"Không"},"votes":{"message":"{0} bình chọn","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} bình chọn","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"Hài hước","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"Sáng tạo","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"Thông minh","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"Chi tiết","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"Khác","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"Chế độ nguyên bản","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"Các tiêu đề được thay thế với các dạng được tiêu chuẩn hóa dựa trên bộ hướng dẫn trên tất cả video khi có một tựa đề được cộng đồng đóng góp."},"CasualMode":{"message":"Chế độ thoải mái","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"Giữ tiêu đề cơ bản khi chúng mô tả đủ tốt video và có tính thông minh hoặc hài hước.\nHãy chọn danh mục của tiêu đề bạn muốn xem.\nBạn sẽ có thể bình chọn nếu tiêu đề có hợp vào một danh mục hay không."},"minimumVotes":{"message":"Số bình chọn nhỏ nhất","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"Hiển thị hình thu nhỏ gốc trên các video đã bình chọn trong chế độ thoải mái","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"Chức năng mới: Chế độ thoải mái","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"Chỉ hiện hình chế độ thoải mái khi một tiêu đề tự đặt có sẵn"},"OpenSettings":{"message":"Mở cài đặt"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/zh_CN/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/zh_CN/messages.json @@ -0,0 +1 @@ +{"0":{"message":"连接超时。请检查您的网络连接。如果您的网络运行正常,则可能是服务器过载或宕机。"},"400":{"message":"服务器说此请求无效"},"409":{"message":"它之前已经被提交过了"},"502":{"message":"服务器似乎已过载。请稍后再试。"},"fullName":{"message":"SponsorBlock for YouTube - 跳过赞助商广告","description":"Name of the extension."},"Description":{"message":"跳过 YouTube 视频中的赞助广告、订阅提醒等片段。标记视频中的赞助广告来节约大家的时间。","description":"Description of the extension."},"channelWhitelisted":{"message":"频道已加入白名单!"},"Segment":{"message":"片段"},"Segments":{"message":"片段"},"SegmentsCap":{"message":"片段"},"Chapters":{"message":"章节"},"renderAsChapters":{"message":"将片段显示为章节","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"在视频时间旁显示当前片段"},"showAutogeneratedChapters":{"message":"显示YouTube自动生成的章节"},"upvoteButtonInfo":{"message":"为这个提交点赞"},"reportButtonTitle":{"message":"报告"},"reportButtonInfo":{"message":"报告此提交不正确。"},"Dismiss":{"message":"忽略"},"Loading":{"message":"加载中..."},"Hide":{"message":"不再显示"},"hitGoBack":{"message":"点击取消跳过以回到您原来的样子。"},"unskip":{"message":"取消跳过"},"reskip":{"message":"继续跳过"},"unmute":{"message":"取消静音"},"paused":{"message":"已暂停"},"manualPaused":{"message":"计时器已停止"},"confirmMSG":{"message":"要编辑或删除个别值,请点击信息按钮或通过点击右上角的扩展图标打开扩展弹窗。"},"clearThis":{"message":"您确定要清空它吗?\n\n"},"Unknown":{"message":"提交您的赞助商广告时间时出错。请稍后再试。"},"sponsorFound":{"message":"此视频在数据库中存在可跳片段!"},"sponsor404":{"message":"未找到可跳片段"},"sponsorStart":{"message":"片段现在开始"},"sponsorEnd":{"message":"片段现在结束"},"sponsorCancel":{"message":"取消创建片段"},"noVideoID":{"message":"未找到 YouTube 视频。\n如果识别错误,请刷新此页面。"},"refreshSegments":{"message":"刷新片段"},"success":{"message":"成功 !"},"voted":{"message":"已投票!"},"serverDown":{"message":"服务器似乎已宕机。请立即联系开发者。"},"connectionError":{"message":"连接错误。错误代码: "},"segmentsStillLoading":{"message":"片段仍在加载中..."},"clearTimes":{"message":"清除片段"},"openPopup":{"message":"打开 SponsorBlock 弹窗"},"closePopup":{"message":"关闭弹窗"},"closeIcon":{"message":"关闭图标"},"OpenSubmissionMenu":{"message":"打开提交菜单"},"sortSegments":{"message":"排序片段"},"submitCheck":{"message":"您确定要提交它吗?"},"whitelistChannel":{"message":"将频道列入白名单"},"removeFromWhitelist":{"message":"将频道移出白名单"},"voteOnTime":{"message":"对片段投票"},"Submissions":{"message":"提交数"},"savedPeopleFrom":{"message":"您为大家节省了 "},"viewLeaderboard":{"message":"排行榜"},"recordTimesDescription":{"message":"提交"},"submissionEditHint":{"message":"片段编辑将在您单击提交后显示","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"提示:您可以在选项中为提交动作绑定按键"},"clearTimesButton":{"message":"清除时间"},"Username":{"message":"用户名"},"setUsername":{"message":"设定用户名"},"copyPublicID":{"message":"复制公开的用户ID"},"copySegmentID":{"message":"复制片段 ID"},"loopChapter":{"message":"打开章节循环"},"unloopChapter":{"message":"取消章节循环"},"hideThis":{"message":"隐藏它"},"Options":{"message":"选项"},"showButtons":{"message":"在 Youtube 播放器上显示按钮"},"hideButtonsDescription":{"message":"这将隐藏在 YouTube 播放器上提交赞助商广告的按钮。我了解这个东西打扰到了某些人。除了使用那个按钮,这个弹窗也可以用来提交赞助商广告。 要隐藏出现的通知,请使用通知中显示的写着 ”不再显示“ 的按钮。您可以在以后再次启用这些设置。"},"showSkipButton":{"message":"播放器显示跳至精华片段按钮"},"showInfoButton":{"message":"在 Youtube 播放器上显示信息按钮"},"autoHideInfoButton":{"message":"自动隐藏信息按钮"},"showDeleteButton":{"message":"在 Youtube 播放器上显示删除按钮"},"enableViewTracking":{"message":"启用跳过次数统计跟踪"},"whatViewTracking":{"message":"此功能追踪您跳过了哪些片段,以让用户知道他们提交的信息帮助了多少人,并与点赞一同作为依据,来确保垃圾信息不会进入数据库。在您每次跳过片段时,此扩展都会向服务器发送一条消息。希望大部分人不要改变此设置,以使观看数字准确。:)"},"enableViewTrackingInPrivate":{"message":"在私人/隐身标签中启用跳过计数跟踪"},"enableTrackDownvotes":{"message":"保存差评片段"},"whatTrackDownvotes":{"message":"任何被你差评的片段,即使在刷新后也会保持隐藏"},"trackDownvotesWarning":{"message":"警告:禁用此功能将删除所有先前保存的差评"},"enableTrackDownvotesInPrivate":{"message":"在私人/隐身标签页中保存片段差评数"},"enableQueryByHashPrefix":{"message":"按哈希前缀查询"},"whatQueryByHashPrefix":{"message":"使用视频 ID 哈希值的前 4 个字符而非整个视频 ID 向服务器查询片段。服务器将返回所有具有类似哈希值的视频数据。"},"enableShowCategoryWithoutPermission":{"message":"在提交菜单中显示类别,即使没有提交权限"},"whatShowCategoryWithoutPermission":{"message":"一些类别由于有最低信誉要求,需要得到许可才能提交"},"showNotice":{"message":"重新显示通知"},"showSkipNotice":{"message":"在跳过片段后显示通知"},"showUpcomingNotice":{"message":"在一个片段开始前显示通知"},"showCategoryGuidelines":{"message":"显示类别帮助"},"noticeVisibilityMode0":{"message":"全尺寸的跳过通知"},"noticeVisibilityMode1":{"message":"缩小自动跳过的提醒"},"noticeVisibilityMode2":{"message":"缩小所有的跳过提醒"},"noticeVisibilityMode3":{"message":"减弱自动跳过的提醒"},"noticeVisibilityMode4":{"message":"减弱所有的跳过提醒"},"longDescription":{"message":"SponsorBlock 可帮您跳过 YouTube 视频中的赞助商广告、开场、结尾、订阅提醒和其他烦人片段。SponsorBlock 是一个众包的浏览器扩展,可以让任何人提交 YouTube 视频的赞助商广告和其他片段的开始和结束时间。若有一人提交了信息,其他所有使用此扩展的人都能直接跳过赞助商广告片段。您也可以跳过音乐视频中的非音乐部分。","description":"Full description of the extension on the store pages."},"website":{"message":"网站","description":"Used on Firefox Store Page"},"sourceCode":{"message":"源代码","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"通知已升级!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"如果您依然不喜欢它,请按下不再显示按钮。","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"跳过片段","description":"Keybind label"},"setStartSponsorShortcut":{"message":"片段开始/停止","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"打开提交菜单","description":"Keybind label"},"setSubmitKeybind":{"message":"提交片段","description":"Keybind label"},"setPreviewKeybind":{"message":"片段预览","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"关闭跳过通知","description":"Keybind label"},"setDownvoteKeybind":{"message":"给片段点踩","description":"Keybind label"},"setUpvoteKeybind":{"message":"给片段点赞","description":"Keybind label"},"nextChapterKeybind":{"message":"下一章节","description":"Keybind label"},"previousChapterKeybind":{"message":"上一章节","description":"Keybind label"},"enableDeArrowKey":{"message":"切换启用 DeArrow","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"打开提交菜单","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"请按下想绑定的按键。如果您想使用组合快捷键,请勾选左侧的选项。"},"disableSkipping":{"message":"已开启跳过"},"enableSkipping":{"message":"已关闭跳过"},"yourWork":{"message":"您的成果","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"错误代码: "},"skip":{"message":"跳过"},"mute":{"message":"静音"},"full":{"message":"整个视频","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"跳过{0}?"},"mute_category":{"message":"要静音 {0} 吗?"},"skip_to_category":{"message":"要跳到 {0} 吗?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"即将上线 {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"{0} 已跳过","description":"Example: Sponsor Skipped"},"muted":{"message":"{0} 已静音","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"已跳至 {0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"已投票 {0}","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"禁用自动跳过"},"enableAutoSkip":{"message":"启用自动跳过"},"audioNotification":{"message":"跳过时音频通知"},"audioNotificationDescription":{"message":"在跳过片段时播放声音。如果禁用(或禁用自动跳过),则不会播放声音。"},"showTimeWithSkips":{"message":"显示减去可跳片段后的时间"},"showTimeWithSkipsDescription":{"message":"此时间位于进度条下方的当前时间旁边,用括号框住。 显示的是视频减去所有可跳片段后的时间,可跳片段包括标记为“在进度条中显示”的片段。"},"youHaveSkipped":{"message":"您已跳过 "},"minLower":{"message":"分钟"},"minsLower":{"message":"分钟"},"hourLower":{"message":"小时"},"hoursLower":{"message":"小时"},"youHaveSavedTime":{"message":"您为大家节省了","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":" 的生命","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"在 status.sponsor.ajay.app 检查服务器状态。"},"changeUserID":{"message":"导入/导出您的私人用户ID"},"whatChangeUserID":{"message":"这应该被保密。这就像一个密码,且不应该告诉任何人。如果有人拥有它,他就可以冒充您。如果您要找的是公开用户ID,请单击弹出窗口中的剪贴板图标。"},"setUserID":{"message":"设置私人用户ID"},"userIDChangeWarning":{"message":"警告:更改私人用户 ID 是永久性的。您确定要这么做吗?请务必备份您的旧用户 ID 以防万一。"},"createdBy":{"message":"创建者"},"supportOtherSites":{"message":"支持第三方 YouTube 网站"},"supportOtherSitesDescription":{"message":"支持第三方 YouTube 客户端。要启用支持,您必须允许额外的权限。","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"支持的站点: "},"optionsInfo":{"message":"启用 Invidious 支持,禁用自动跳过,隐藏按钮等等。"},"addInvidiousInstance":{"message":"添加第三方客户端实例"},"addInvidiousInstanceDescription":{"message":"添加自定义实例。它必须只包含域名。例如:invidious.ajay.app"},"add":{"message":"添加"},"addInvidiousInstanceError":{"message":"这是一个无效的域名。它应该只包括域名部分。例如:invidious.ajay.app"},"resetInvidiousInstance":{"message":"重置 Invidious 实例列表"},"resetInvidiousInstanceAlert":{"message":"您将会重置 Invidious 实例列表"},"currentInstances":{"message":"当前实例:"},"minDuration":{"message":"最小持续时间(秒):"},"minDurationDescription":{"message":"短于设定值的片段将不会被跳过或显示在播放器中。"},"enableManualSkipOnFullVideo":{"message":"当整个视频都是相同内容时使用手动跳过"},"whatManualSkipOnFullVideo":{"message":"用于在观看整个视频都是赞助商广告或自我推广时不受打扰"},"skipNoticeDuration":{"message":"跳过提醒持续时间(秒):"},"skipNoticeDurationDescription":{"message":"跳过提醒将显示至少这么多秒。手动跳过的提醒可能会显示更久。"},"shortCheck":{"message":"以下的提交短于您的最小持续时间选项。这代表它们可能已经被提交,只是由于该选项被忽略了。您确定要提交吗?"},"liveOrPremiere":{"message":"无法在进行中的直播或首播提交片段。请等待直播结束后刷新页面并确认片段仍然有效,再次提交。"},"showUploadButton":{"message":"显示上传按钮"},"customServerAddress":{"message":"SponsorBlock 服务器地址"},"customServerAddressDescription":{"message":"SponsorBlock 用于联系服务器的地址。\n除非您有自己的服务器实例,否则这不应该更改。"},"dataFetchingServerAddress":{"message":"数据获取服务器地址"},"dataFetchingServerAddressDescription":{"message":"用于联系数据获取服务器的地址。\n如果您没有自己的服务器实例,请不要更改此项。"},"thumbnailCacheServerAddress":{"message":"缩略图缓存服务器地址"},"save":{"message":"保存"},"reset":{"message":"重置"},"customAddressError":{"message":"此地址格式不正确。请确保开头有 http:// 或 https:// ,结尾没有斜杠 / 。"},"areYouSureReset":{"message":"您确定要重置它吗?"},"mobileUpdateInfo":{"message":"现已支持 m.youtube.com"},"exportOptions":{"message":"导入/导出所有选项"},"exportOtherData":{"message":"导入/导出所有其他数据"},"exportOptionsCopy":{"message":"编辑/复制"},"exportOptionsDownload":{"message":"保存到文件"},"exportOptionsUpload":{"message":"从文件加载"},"whatExportOptions":{"message":"这是您所有设置的 JSON 格式。它包含了您的私人用户 ID ,所以您一定要谨慎的保管它。"},"setOptions":{"message":"设定选项"},"exportOptionsWarning":{"message":"警告:更改选项是永久性的且可能破坏您安装的东西。您确定要这么做吗?请确保已备份旧文件以防万一。"},"incorrectlyFormattedOptions":{"message":"此 JSON 格式不正确。您的选项尚未更改。"},"confirmNoticeTitle":{"message":"提交片段"},"submit":{"message":"提交"},"cancel":{"message":"取消"},"delete":{"message":"删除"},"preview":{"message":"预览"},"unsubmitted":{"message":"未提交"},"inspect":{"message":"检查"},"edit":{"message":"编辑"},"copyDebugLogs":{"message":"复制调试日志"},"copyDebugInformation":{"message":"复制调试信息到剪贴板"},"copyDebugInformationFailed":{"message":"复制到剪贴板失败"},"copyDebugInformationOptions":{"message":"复制信息到剪贴板,在提交错误或开发者需要时提供给他。 敏感信息如:您的用户ID,白名单频道和自定义服务器地址等已被删除。然而,它仍然包含诸如您的 useragent ,浏览器,操作系统和插件版本号等信息。 "},"copyDebugInformationComplete":{"message":"调试信息已复制到剪切板中。 您可以随意移除任何您不想分享的信息。请将其另存为 .txt 文件或粘贴到错误报告中。"},"keyAlreadyUsed":{"message":"此快捷键已绑定到另一个动作。请选择其他快捷键。"},"to":{"message":"到","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"复制成功!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"包括衔接转场"},"generic_guideline2":{"message":"装成没有跳过内容一样播放"},"category_sponsor":{"message":"赞助商广告"},"category_sponsor_description":{"message":"付费推广、付费推荐和直接广告。不应用于自我推广或免费提及、推荐他们喜欢的事物/创作者/网站/产品。"},"category_sponsor_guideline1":{"message":"付费推广"},"category_sponsor_guideline2":{"message":"捐赠或自制周边不属于此项"},"category_selfpromo":{"message":"无偿的/自我推广"},"category_selfpromo_description":{"message":"类似于 “赞助商广告” ,但为无报酬或自我推广。包括有关商品、捐赠的部分或合作者的信息。"},"category_selfpromo_guideline1":{"message":"捐赠、会员和自制周边"},"category_selfpromo_guideline2":{"message":"与视频无关的免费推广"},"category_selfpromo_guideline3":{"message":"不是公司设计的产品和周边"},"category_exclusive_access":{"message":"独家限定"},"category_exclusive_access_description":{"message":"仅用于标记整个视频。当视频展示了免费或被帮助以获得产品、服务或访问地点时使用。"},"category_exclusive_access_pill":{"message":"此视频展示了免费或被帮助以获得产品、服务或访问地点","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"整个视频都在展示免费/受助以获得和访问的事物"},"category_interaction":{"message":"互动提醒(订阅)"},"category_interaction_description":{"message":"视频中间简短提醒观众来点赞、订阅或关注。 如果片段较长,或是关于某个具体事物,则应分类为自我推广。"},"category_interaction_guideline1":{"message":"短暂提醒要喜欢、订阅或关注"},"category_interaction_guideline2":{"message":"包括提醒发表评论,即使是间接的"},"category_interaction_guideline3":{"message":"不是常见的推广互动,只是行动呼吁"},"category_interaction_short":{"message":"互动提醒"},"category_intro":{"message":"过场/开场动画"},"category_intro_description":{"message":"没有实际内容的间隔片段。可以是暂停、静态帧或重复动画。不应用于包含信息的过渡。"},"category_intro_short":{"message":"过场"},"category_intro_guideline1":{"message":"无实际内容的片段"},"category_intro_guideline2":{"message":"不包括含有信息的转场"},"category_outro":{"message":"结束画面/结尾职员表"},"category_outro_description":{"message":"鸣谢画面或出现 YouTube 片尾画面。不应用于包含信息的结尾。"},"category_outro_guideline1":{"message":"不应包含内容,即使结尾演职员表已经出现。"},"category_preview_description":{"message":"展示此视频或同系列后续视频将出现的画面集锦,所有内容都将在之后再次出现。"},"category_preview_guideline1":{"message":"在之后或未来视频会出现的片段"},"category_preview_guideline2":{"message":"往期视频的回顾总结"},"category_preview_guideline3":{"message":"不含有新添加的内容"},"category_filler":{"message":"偏题/笑话"},"category_filler_description":{"message":"与视频主旨内容无关、对于理解核心情节并非必要的场景或笑话。该分类不应涵盖提供上下文或背景细节的片段。这是一个筛选标准极为严格的类别,专为不想看任何“逗乐”内容的用户设计。"},"category_filler_short":{"message":"偏题"},"category_filler_guideline1":{"message":"与核心内容关联不大,非必需的片段或笑话"},"category_filler_guideline2":{"message":"分心、花絮、重播"},"category_filler_guideline3":{"message":"不需要理解主题的片段"},"category_music_offtopic":{"message":"音乐:非音乐部分"},"category_music_offtopic_description":{"message":"仅用于音乐视频。此分类只能用于音乐视频中未包括于其他分类的部分。"},"category_music_offtopic_short":{"message":"非音乐"},"category_music_offtopic_guideline1":{"message":"不在官方版本中的部分"},"category_music_offtopic_guideline2":{"message":"现场表演中的非音乐片段"},"category_poi_highlight":{"message":"精彩时刻"},"category_poi_highlight_description":{"message":"大部分人都在寻找的视频片段。类似于“封面在12:34”的评论。"},"category_poi_highlight_guideline1":{"message":"大部分人想看的片段"},"category_poi_highlight_guideline2":{"message":"可以帮助略过之前的内容"},"category_poi_highlight_guideline3":{"message":"可以跳到标题或封面"},"category_chapter":{"message":"章节"},"category_chapter_description":{"message":"自定义命名章节描述了视频的主要部分。"},"category_chapter_guideline1":{"message":"不要提到赞助商品牌名称"},"category_chapter_guideline2":{"message":"在一般普通的环节使用较长的章节"},"category_chapter_guideline3":{"message":"小章节可以放在大章节内"},"category_livestream_messages":{"message":"直播:捐赠/消息阅读"},"category_livestream_messages_short":{"message":"阅读消息"},"autoSkip":{"message":"自动跳过"},"manualSkip":{"message":"手动跳过"},"showOverlay":{"message":"在进度条中显示"},"disable":{"message":"禁用"},"autoSkip_POI":{"message":"跳至开始位置"},"manualSkip_POI":{"message":"视频加载时询问"},"showOverlay_POI":{"message":"在进度条中显示"},"showOverlay_full":{"message":"显示标签"},"showOverlay_chapter":{"message":"显示章节"},"autoSkipOnMusicVideos":{"message":"自动跳过所有非音乐片段"},"skipNonMusicOnlyOnYoutubeMusic":{"message":"只在music.youtube.com自动跳过"},"muteSegments":{"message":"允许静音的片段而不是跳过"},"fullVideoSegments":{"message":"当整个视频都是广告时显示图标","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"在视频缩略图上也显示标签","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"未提交颜色","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"进度条颜色"},"category":{"message":"类别"},"skipOption":{"message":"跳过选项","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"openAdvancedSkipOptions":{"message":"打开高级跳过设置"},"advancedSkipNotSaved":{"message":"语法错误:你的设置未被保存"},"advancedSkipSettingsHelp":{"message":"这是怎么做到的","description":"Link in advanced skip options to the help page."},"enableTestingServer":{"message":"启用 Beta 测试服务器"},"whatEnableTestingServer":{"message":"您的提交和投票将不会计入主服务器。它只被用于测试。"},"testingServerWarning":{"message":"当连接到测试服务器时,所有的提交和投票将不会计入主服务器。当您想要进行真实提交时,请确保禁用了此选项。"},"bracketNow":{"message":"(现在)"},"moreCategories":{"message":"更多类别"},"chooseACategory":{"message":"选择类别"},"enableThisCategoryFirst":{"message":"要提交“{0}”类别的片段,您必须在选项中启用此类别。现在将重定向到选项。","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"警告:此类型的片段一次最多只能使用一个。提交多个片段将随机显示。"},"youMustSelectACategory":{"message":"您必须为所有您要提交的片段选择类别!"},"bracketStart":{"message":"(开始)"},"bracketEnd":{"message":"(结束)"},"End":{"message":"结束","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"隐藏:差评"},"hiddenDueToDuration":{"message":"隐藏:过短"},"manuallyHidden":{"message":"手动隐藏"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"未检测到频道ID。如果您正在使用嵌入式视频播放器,请转到 Youtube 网站观看。也可能是 Youtube 更改了页面布局,如果您认为是此问题,请在此评论:"},"invidiousPermissionRefresh":{"message":"浏览器已撤销在 Invidious 及其他第三方网站运行所需的权限。请点击下方按钮重新激活权限。"},"acceptPermission":{"message":"接受权限"},"permissionRequestSuccess":{"message":"权限请求成功!"},"permissionRequestFailed":{"message":"权限请求失败,您是否点击拒绝?"},"adblockerIssueWhitelist":{"message":"如果您无法解决这个问题,请禁用“跳过前强制进行频道检查”选项,因为 SponsorBlock 无法获得此视频的频道信息"},"forceChannelCheck":{"message":"跳过前强制进行频道检查"},"whatForceChannelCheck":{"message":"默认情况下,即使还未检测出当前是什么频道,也会立即跳过片段。即使在白名单中的频道,一些在开头的片段也可能被跳过。启用此选项将防止这种情况,但所有的跳过将会产生轻微的延迟,因为获取频道 ID 需要一点时间。如果您的网速很快,那延迟可能非常短。"},"forceChannelCheckPopup":{"message":"请考虑启用“跳过前强制进行频道检查”"},"downvoteDescription":{"message":"不正确/错误的时间"},"incorrectVote":{"message":"不正确"},"harmfulVote":{"message":"有害的","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"更改类别"},"nonMusicCategoryOnMusic":{"message":"此视频的分类为音乐。 您确定其中包含赞助商广告吗?如果这是“非音乐片段”,请打开扩展选项并启用此类别。 之后,您可以以“非音乐”而不是赞助商广告类别提交此片段。如果您不太明白,请阅读指南。"},"multipleSegments":{"message":"多个片段"},"guidelines":{"message":"指南"},"readTheGuidelines":{"message":"阅读指南!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"类别在这里!"},"categoryUpdate2":{"message":"开启选项以跳过开头、结尾和商业等内容。"},"help":{"message":"帮助"},"GotIt":{"message":"明白了","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"片段过长。如果整个视频都是关于同一个主题,请将“跳过”改成“整个视频”标签。查看指南了解详情。"},"categoryPillTitleText":{"message":"整个视频都被标记为此分类且内容过于紧凑,无法分开。"},"chapterNameTooltipWarning":{"message":"提交的章节名称与现有类别名称相似。如果已经存在分类,您应该优先使用它。"},"experiementOptOut":{"message":"关闭所有实验性功能","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"永远隐藏"},"warningChatInfo":{"message":"我们注意到你犯了一些常见错误。我们非常赞赏你迄今所做的工作,但我们努力追求完美,所以即使是非常小的错误,也需要重视:)"},"questionButton":{"message":"我有疑问"},"askAQuestion":{"message":"提问"},"warningConfirmButton":{"message":"我理解原因"},"warningError":{"message":"尝试确认警告时发生错误:"},"deArrowMessageRecieved":{"message":"您收到了来自版主的提示"},"Donate":{"message":"捐赠"},"considerDonating":{"message":"资助开发"},"hideDonationLink":{"message":"隐藏捐赠链接"},"darkModeOptionsPage":{"message":"深色模式选项页面"},"helpPageThanksForInstalling":{"message":"感谢安装 SponsorBlock。"},"helpPageReviewOptions":{"message":"请查看下面的选项"},"helpPageFeatureDisclaimer":{"message":"许多功能默认禁用。如果您想跳过开头、结尾或使用 Invidious 等,请在下方开启。您也可以显示/隐藏界面内容。"},"helpPageHowSkippingWorks2":{"message":"当跳过片段时,您会收到提醒。如果时间不对,请点击差评!您也可以在插件弹窗中投票。"},"Submitting":{"message":"提交中"},"helpPageCopyOfDatabase2":{"message":"源代码是免费公开的。所以即使我出了什么事,你的提交也不会丢失。"},"Credits":{"message":"鸣谢"},"LearnMore":{"message":"了解详情"},"FullDetails":{"message":"全部细节"},"CopyDownvoteButtonInfo":{"message":"差评并创建本地副本供您再次提交"},"OpenCategoryWikiPage":{"message":"打开此类别的百科页面。"},"CopyAndDownvote":{"message":"复制并差评"},"ContinueVoting":{"message":"继续投票"},"ChangeCategoryTooltip":{"message":"这会立即应用到您所有的片段"},"downvote":{"message":"差评"},"upvote":{"message":"点赞"},"hideSegment":{"message":"隐藏片段"},"skipSegment":{"message":"跳过片段"},"playChapter":{"message":"播放章节"},"SponsorTimeEditScrollNewFeature":{"message":"将鼠标悬停在编辑框上,操作鼠标滚轮可以快速调整时间。包含 Ctrl 和 Shift 的组合快捷键可以微调时间。"},"categoryPillNewFeature":{"message":"新功能!知道视频是否完全是赞助广告或自我推广"},"yearAbbreviation":{"message":"年","description":"100y"},"dayAbbreviation":{"message":"天","description":"100d"},"hourAbbreviation":{"message":"小时","description":"100h"},"optionsTabBehavior":{"message":"行为","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"界面","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"快捷键","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"备份/恢复","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"其他","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"跳过提醒外观","description":"Option label"},"unbind":{"message":"解除绑定","description":"Unbind keyboard shortcut"},"notSet":{"message":"未设置"},"change":{"message":"更改"},"youtubeKeybindWarning":{"message":"这是 Youtube 内置的快捷方式。您确定要使用吗?"},"betaServerWarning":{"message":"测试服务器已启用!"},"openOptionsPage":{"message":"打开选项页面"},"resetToDefault":{"message":"重置所有设置"},"confirmResetToDefault":{"message":"您确定要将所有设置重置为默认值吗?此操作无法撤销。"},"exportSegments":{"message":"导出片段"},"importSegments":{"message":"导入片段"},"Import":{"message":"导入","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"兑换成功!"},"redeemFailed":{"message":"注册码无效"},"hideUpsells":{"message":"隐藏需要额外付费才能使用的选项"},"hideNewFeatureUpdates":{"message":"隐藏新功能提示"},"redeem":{"message":"兑换"},"enterLicenseKey":{"message":"输入注册码"},"unsubmittedSegmentCounts":{"message":"您在 {1} 中有 {0}","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"您目前没有未提交的片段","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"未提交的片段","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"未提交的片段","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"视频","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"视频","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"清除所有片段","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"您确定要清除所有未提交的片段吗?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"显示片段","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"隐藏片段","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"视频ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"片段数","description":"Header of the unsubmitted segments list"},"actions":{"message":"操作","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"分享链接"},"segmentFetchFailureWarning":{"message":"警告:服务器未响应。片段可能已提交,只是由于服务器问题您未收到回应。"},"allowScrollingToEdit":{"message":"允许滚动编辑时间"},"NoticeTimeAfterSkip":{"message":"{seconds}秒","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - 优化 Youtube 标题和缩略图","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"众包标题和缩略图应该是叙述性的,而不是修饰性的","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"选择最符合描述的"},"Original":{"message":"原始"},"OriginalTitle":{"message":"原始标题"},"CurrentTime":{"message":"当前时间"},"resetCustomTitle":{"message":"将标题重置为原始文本"},"resetIcon":{"message":"重置图标"},"TypeYourOwnTitleHere":{"message":"在这里输入您的标题"},"VideoNotReady":{"message":"视频未就绪"},"FailedToRender":{"message":"渲染失败","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"画布丢失","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"渲染过程发生的异常","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"加载失败","description":"Thumbnail failed to load"},"titleFormatting":{"message":"标题格式"},"Disabled":{"message":"停用"},"CapitalizeWords":{"message":"首字母大写"},"TitleCase":{"message":"标题大小写"},"SentenceCase":{"message":"句首大写"},"LowerCase":{"message":"小写"},"FirstLetterUppercase":{"message":"首字母大写"},"shouldCleanEmojis":{"message":"移除表情符号"},"onlyFormatCustomTitles":{"message":"仅格式化用户提交的标题"},"onlyTitleCaseInEnglish":{"message":"将非英语标题的单词大写"},"onlyTitleCaseInEnglishDescription":{"message":"语言检测并不完美,有些英语标题会被检测为非英语。"},"thumbnailFallbackOption":{"message":"当未提交缩略图时"},"whatThumbnailFallbackOption":{"message":"随机选择播放时刻时,它会使用 SpongorBlock 的数据来保证选中没有广告的时间段。","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"显示随机时刻的截图"},"TheOriginalThumbnail":{"message":"显示原始缩略图"},"showABlankBox":{"message":"显示空白框"},"AutoGenerated":{"message":"显示 YouTube 自动生成的缩略图","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"开头"},"Middle":{"message":"中间"},"keepUnsubmitted":{"message":"保存已提交的投票"},"showLiveCover":{"message":"在即将播放的视频上显示频道头像","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"永不使用经 A/B 测试的缩略图"},"ignoreAbThumbnailsDescription":{"message":"频道可以为视频设置测试功能,可让 YouTube 向每个人显示不同的缩略图。此选项将始终使用第一个缩略图来保持一致性。"},"abThumbnailsWarning":{"message":"警告:此视频目前正在运行缩略图 A/B 测试,其缩略图可能经常发生变动。因此,不推荐您投票给原始缩略图。"},"whatKeepUnsubmitted":{"message":"投票后保持已提交的投票,以显示您选择的标题和缩略图,不显示服务器上投票最高的。"},"keepUnsubmittedInPrivate":{"message":"保存私有标签中提交的投票"},"useThumbnailGenerationService":{"message":"使用缩略图生成服务"},"titleMaxLines":{"message":"标题的最大行数"},"titleMaxLinesDescription":{"message":"视频标题会按建议分布在多行中。"},"thumbnailSaturationLevel":{"message":"缩略图饱和度等级"},"whatSaturateThumbnails":{"message":"通过降低色彩饱和度使缩略图的画面不那么鲜艳"},"hideDetailsWhileFetching":{"message":"加载时隐藏详情"},"hideDetailsWhileFetchingDescription":{"message":"从服务器加载数据时隐藏标题和缩略图。如果禁用,你会在标题和缩略图改变时看到屏幕闪烁。"},"ignoreTranslatedTitles":{"message":"不展示YouTube翻译的标题","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube有时会自动将标题翻译成你的母语。这个选项只在众包标题不可用时生效。"},"onAllPages":{"message":"在所有页面","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"在除视频页面以外的所有页面","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"从不"},"thumbnailGeneratorDescription1":{"message":"缩略图生成服务通过向远程服务器发送带有视频 ID 的匿名请求,大大加快了缩略图生成速度。然后将生成缩略图,或将已经生成的缩略图从缓存中调出。"},"thumbnailGeneratorDescription2":{"message":"如果在视频页面使用,可能会向该服务器泄露未列出的视频 ID 。设置为“在除视频页面之外的所有页面”将避免此问题。另一种选择是部署您自己的缩略图生成服务。"},"thumbnailGeneratorDescription3":{"message":"如果缩略图生成服务被禁用,所有请求会发送给一个k-匿名性查询系统,这能让服务器更难预测哪些视频被加载,同时会使用一个速度更慢的缩略图生成服务。","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"缩略图生成服务源码"},"moreAboutKAnonymity":{"message":"关于 K-Anonymity","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"始终显示“显示原始视频”按钮"},"whatAlwaysShowShowOriginalButton":{"message":"如果你想每次都知悉一个标题/缩略图是否改变过,打开这个开关。"},"showOriginalOnHover":{"message":"悬停时在自定义详情和原始详情之间切换"},"showOriginalOnHoverOfVideo":{"message":"悬停在视频卡片任意位置时在自定义详情和原始详情之间切换"},"showOriginalOnHoverOfVideoDescription":{"message":"这会禁用悬停时自动播放"},"Enable":{"message":"启用"},"Titles":{"message":"标题","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"缩略图","description":"Referring to thumbnails of YouTube videos"},"Error":{"message":"错误"},"ShowOriginal":{"message":"显示原始详细信息"},"ShowModified":{"message":"显示修改后的详细信息"},"FillerWarning":{"message":"警告:这是一个筛选标准极为严苛的分类。您很可能需要不时地手动撤销系统的跳过操作,甚至暂时禁用该分类。请注意,许多视频会有超过 50% 甚至更多的内容因此被跳过!然而,在提交相关内容时,请谨记您仍需遵守特定的指导准则。","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"加入Discord或Matrix以永久保留在这个对话中","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"显示帮助","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"避免夸张的面部表情","description":"Referring to the thumbnail of a video"},"tip2":{"message":"放大格局,不要只回答原始标题的问题","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"避免描述对视频的感受(“惊人的”)","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"提供足够的信息以在点击之前做出明智的选择"},"tip5":{"message":"像一句话一样大小写","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"检查所有指导准则以提交","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"我的标题像一个句子一样大小写","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"我的标题不止回答了标题中提出的问题","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"标题应准确概括视频的实际内容或主旨大意。为此,您务必观看完整视频以了解其真实主题,切勿只依赖引人注目的原始标题。","description":"Tip subtitle in DeArrow"},"noSummariesTipSubTitle":{"message":"标题的目的并非要取代观看视频的体验,而是要让用户能据此判断是否应该点击。","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"我的标题没有对视频或创作者事实核查、嘲笑或批评","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"标题的拟定应基于创作者和视频自身的视角。对视频内容进行评价或事实核查,已超出了 DeArrow 的功能范畴。标题并非评论区,不应用其发表个人意见。","description":"Tip subtitle in DeArrow"},"howItWorks":{"message":"工作原理"},"privacyPolicy":{"message":"隐私政策"},"termsOfUse":{"message":"使用条款"},"openSourceLicenses":{"message":"开源许可证"},"replaceTitles":{"message":"替换标题"},"replaceThumbnails":{"message":"替换缩略图"},"useCrowdsourcedTitles":{"message":"显示用户提交的标题"},"NewConfiguration":{"message":"新配置"},"DeleteConfiguration":{"message":"删除配置"},"ConfigurationName":{"message":"配置名称"},"YtNeuterMessage":{"message":"添加 yt-neuter ,一个用来屏蔽问卷调查、商品展示和其他推广页面元素的过滤列表"},"requiresUblock":{"message":"需要 uBlock Origin"},"dearrowLogoCredit":{"message":"标志来自 Twemoji 并在 CC-BY 4.0 授权下使用"},"freeTrialEnded":{"message":"您的免费试用已结束"},"startFreeTrial":{"message":"开启免费试用"},"freeAccessComplete":{"message":"恭喜!您现在可以免费使用 DeArrow"},"DeArrowNotActivated":{"message":"DeArrow 未启用"},"ActivateDeArrow":{"message":"启用 DeArrow"},"DeArrowIsActivated":{"message":"DeArrow 已启用"},"Close":{"message":"关闭"},"ViewLicenseKey":{"message":"查看许可证密钥"},"SharingIsCaring":{"message":"分享即是关怀"},"cleanPopup":{"message":"去除片段弹窗中的琐碎项目"},"syncDisabledWarningDeArrow":{"message":"DeArrow没有存储空间无法正常工作。"},"syncDisabledFirefoxSuggestions":{"message":"你可以前往about:config页面并将\"webextensions.storage.sync.enabled\"的值设置为true来打开它。"},"storageFull":{"message":"扩展存储空间已满。请在设置中删除一些没有提交的片段。"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/_locales/zh_TW/messages.json b/data/extensions/sponsorBlocker@ajay.app/_locales/zh_TW/messages.json @@ -0,0 +1 @@ +{"0":{"message":"連線超時。請檢查您的網路連線。若您的網路運作正常,則可能是伺服器超載或離線"},"400":{"message":"伺服器回應此請求無效"},"409":{"message":"這已經被提交過了"},"502":{"message":"伺服器可能超載。請稍後再試。"},"fullName":{"message":"SponsorBlock for YouTube - 跳過贊助廣告","description":"Name of the extension."},"Description":{"message":"跳過 YouTube 影片中的贊助、訂閱提醒等內容。回報您觀看影片中的贊助內容,以節省其他人的時間。","description":"Description of the extension."},"channelWhitelisted":{"message":"頻道被加入了白名單!"},"Segment":{"message":"片段"},"Segments":{"message":"片段"},"SegmentsCap":{"message":"片段"},"Chapters":{"message":"章節"},"renderAsChapters":{"message":"將片段顯示成章節","description":"Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"},"showSegmentNameInChapterBar":{"message":"在影片時間旁顯示目前片段名稱"},"showAutogeneratedChapters":{"message":"顯示 YouTube 自動產生的章節"},"upvoteButtonInfo":{"message":"為這個提交按讚"},"reportButtonTitle":{"message":"檢舉"},"reportButtonInfo":{"message":"將這個提交檢舉為不正確"},"Dismiss":{"message":"忽略"},"Loading":{"message":"載入中…"},"Hide":{"message":"永不顯示"},"hitGoBack":{"message":"點擊取消跳過來回到您原本的位置"},"unskip":{"message":"取消跳過"},"reskip":{"message":"繼續跳過"},"unmute":{"message":"取消靜音"},"paused":{"message":"已暫停"},"manualPaused":{"message":"計時器已停止"},"confirmMSG":{"message":"要編輯或刪除個別數值,點擊資訊按鈕或右上角擴充功能的彈出介面"},"clearThis":{"message":"您確定要清空這個嗎?\n\n"},"Unknown":{"message":"提交您的贊助廣告片段時出錯,請稍後再試一次"},"sponsorFound":{"message":"這個影片有現存的片段在資料庫!"},"sponsor404":{"message":"沒有發現片段"},"sponsorStart":{"message":"片段現在開始"},"sponsorEnd":{"message":"片段現在結束"},"sponsorCancel":{"message":"取消創建片段"},"noVideoID":{"message":"找不到 YouTube 影片。\n如果這是不正確的,重新整理此分頁"},"refreshSegments":{"message":"重新載入片段"},"success":{"message":"成功!"},"voted":{"message":"已投票!"},"serverDown":{"message":"看起來伺服器已離線。立即聯繫開發者"},"connectionError":{"message":"發生連線錯誤。錯誤碼:"},"segmentsStillLoading":{"message":"片段仍在載入中..."},"clearTimes":{"message":"清除片段"},"openPopup":{"message":"打開 SponsorBlock 彈出視窗"},"closePopup":{"message":"關閉彈出視窗"},"closeIcon":{"message":"關閉圖示"},"OpenSubmissionMenu":{"message":"開啟提交選單"},"OpenCasualVoteMenu":{"message":"開啟隨性模式選單"},"sortSegments":{"message":"排序片段"},"submitCheck":{"message":"您確定要提交這個嗎?"},"whitelistChannel":{"message":"將頻道列入白名單"},"removeFromWhitelist":{"message":"將頻道從白名單移除"},"voteOnTime":{"message":"為分段投票"},"Submissions":{"message":"提交數"},"savedPeopleFrom":{"message":"您已為大家節省 "},"viewLeaderboard":{"message":"排行榜"},"recordTimesDescription":{"message":"提交"},"submissionEditHint":{"message":"段落編輯會在您提交之後出現","description":"Appears in the popup to inform them that editing has been moved to the video player."},"popupHint":{"message":"小提醒:您可以為提交在設定裡綁定一個按鍵"},"clearTimesButton":{"message":"清除時間"},"Username":{"message":"使用者名稱"},"setUsername":{"message":"設定使用者名稱"},"copyPublicID":{"message":"複製公開使用者 ID"},"copySegmentID":{"message":"複製片段 ID"},"hideThis":{"message":"隱藏這"},"Options":{"message":"選項"},"showButtons":{"message":"在 YouTube 播放器上顯示按鈕"},"hideButtonsDescription":{"message":"這會隱藏 YouTube 播放器上提交片段的按鈕"},"showSkipButton":{"message":"在播放器上保留「跳至精華」按鈕"},"showInfoButton":{"message":"在 YouTube 播放器上顯示資訊按鈕"},"autoHideInfoButton":{"message":"自動隱藏資訊按鈕"},"showDeleteButton":{"message":"在 YouTube 播放器上顯示刪除按鈕"},"enableViewTracking":{"message":"啟用跳過次數追蹤"},"whatViewTracking":{"message":"這個功能會追蹤您跳過的片段來讓其他使用者知道您的提交幫助了其他人多少,並同時用作計算錯誤提交的方式。這個擴充功能會在您每一次跳過片段時向伺服器回報。希望大家盡量不要改變這個設定來確保資料的正確性。 :)"},"enableViewTrackingInPrivate":{"message":"在私人/無痕分頁啟用跳過次數追蹤"},"enableTrackDownvotes":{"message":"儲存片段倒讚數"},"whatTrackDownvotes":{"message":"所有您倒讚的片段在重新整理後仍會保留。"},"trackDownvotesWarning":{"message":"警告:停用此功能將會刪除所有先前儲存的倒讚數。"},"enableTrackDownvotesInPrivate":{"message":"在私密/無痕模式中儲存片段倒讚數"},"enableQueryByHashPrefix":{"message":"使用雜湊前綴查詢"},"whatQueryByHashPrefix":{"message":"與其使用影片 ID 來查詢片段,這會使用影片 ID 的雜湊前4碼來查詢。伺服器會送回所有有類似雜湊的影片片段資料"},"enableShowCategoryWithoutPermission":{"message":"即使沒有提交權限,仍在提交選單中顯示類別"},"whatShowCategoryWithoutPermission":{"message":"某些類別由於最低信譽要求,需要權限才能提交。"},"showNotice":{"message":"再次顯示通知"},"showSkipNotice":{"message":"在跳過片段後顯示通知"},"showUpcomingNotice":{"message":"在片段開始前顯示通知"},"showCategoryGuidelines":{"message":"顯示分類說明"},"noticeVisibilityMode0":{"message":"完整大小的跳過提醒"},"noticeVisibilityMode1":{"message":"自動跳過時顯示較小的提醒"},"noticeVisibilityMode2":{"message":"所有跳過提醒皆顯示為小型提醒"},"noticeVisibilityMode3":{"message":"自動跳過時顯示淡出提醒"},"noticeVisibilityMode4":{"message":"所有跳過提醒皆顯示為淡出"},"longDescription":{"message":"SponsorBlock 讓您可以跳過贊助工商,開場動畫,結束動畫,訂閱提醒等煩人的 YouTube 影片片段。SponsorBlock 是個大眾外包的網頁瀏覽器擴充功能,能讓任何人提交贊助片段的始與末。當一個人提交這個片段後,所有使用這個擴充功能的人都可以跳過該片段。您也可以跳過在音樂中的非音樂片段","description":"Full description of the extension on the store pages."},"website":{"message":"網址","description":"Used on Firefox Store Page"},"sourceCode":{"message":"原始碼","description":"Used on Firefox Store Page"},"noticeUpdate":{"message":"通知已升級!","description":"The first line of the message displayed after the notice was upgraded."},"noticeUpdate2":{"message":"如果您還是不喜歡它,請按下永不顯示按鈕","description":"The second line of the message displayed after the notice was upgraded."},"setSkipShortcut":{"message":"跳過片段","description":"Keybind label"},"setStartSponsorShortcut":{"message":"開始/停止片段","description":"Keybind label"},"setOpenSubmissionMenuKeybind":{"message":"開啟提交選單","description":"Keybind label"},"setSubmitKeybind":{"message":"提交片段","description":"Keybind label"},"setPreviewKeybind":{"message":"預覽片段","description":"Keybind label"},"setCloseSkipNoticeKeybind":{"message":"關閉跳過提醒","description":"Keybind label"},"setDownvoteKeybind":{"message":"倒讚片段","description":"Keybind label"},"setUpvoteKeybind":{"message":"按讚片段","description":"Keybind label"},"nextChapterKeybind":{"message":"下一章節","description":"Keybind label"},"previousChapterKeybind":{"message":"上一章節","description":"Keybind label"},"enableDeArrowKey":{"message":"啟用 DeArrow 快捷鍵","description":"Keybind label in DeArrow"},"openDeArrowMenu":{"message":"開啟提交選單","description":"Keybind label in DeArrow"},"keybindDescription":{"message":"按下按鍵並選擇您想要使用的修飾鍵來設定快捷鍵。"},"disableSkipping":{"message":"跳過已啟用"},"enableSkipping":{"message":"跳過已停用"},"yourWork":{"message":"您的貢獻","description":"Used to describe the section that will show you the statistics from your submissions."},"errorCode":{"message":"錯誤碼:"},"skip":{"message":"略過"},"mute":{"message":"靜音"},"full":{"message":"整部影片","description":"Used for the name of the option to label an entire video as sponsor or self promotion."},"skip_category":{"message":"要跳過 {0} 嗎?"},"mute_category":{"message":"要靜音 {0} 嗎?"},"skip_to_category":{"message":"跳至{0}?","description":"Used for skipping to things (Skip to Highlight)"},"upcoming":{"message":"即將推出的 {0}","description":"Example: Upcoming Sponsor"},"skipped":{"message":"已跳過 {0}","description":"Example: Sponsor Skipped"},"muted":{"message":"已靜音 {0}","description":"Example: Sponsor Muted"},"skipped_to_category":{"message":"已跳至{0}","description":"Used for skipping to things (Skipped to Highlight)"},"voted_on":{"message":"已對{0}投票","description":"Example: Voted on Sponsor"},"disableAutoSkip":{"message":"停用自動跳過"},"enableAutoSkip":{"message":"啟用自動跳過"},"audioNotification":{"message":"跳過時發出聲響"},"audioNotificationDescription":{"message":"跳過時發出聲響會在跳過片段時播放聲音。當停用後(或自動跳過被停用)將不會發出聲響"},"showTimeWithSkips":{"message":"顯示已移除跳過後的總時間"},"showTimeWithSkipsDescription":{"message":"這個時間會出現在現在時間旁邊的括號內。這會顯示總影片長度減掉任何片段後的結果。這只會包含標為\"在時間條中顯示\"的片段"},"youHaveSkipped":{"message":"您已跳過 "},"minLower":{"message":"分鐘"},"minsLower":{"message":"分鐘"},"hourLower":{"message":"小時"},"hoursLower":{"message":"小時"},"youHaveSavedTime":{"message":"您已為大家節省了","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"youHaveSavedTimeEnd":{"message":"的時間","description":"You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."},"statusReminder":{"message":"在 status.sponsor.ajay.app 檢查伺服器狀態"},"changeUserID":{"message":"匯入/匯出您的密鑰 ID"},"whatChangeUserID":{"message":"密鑰應被保密。就像密碼一樣,不應與任何人分享。如果其他人取得您的密鑰 ID,他們就能夠冒充您。如果您要尋找的是公開使用者 ID,請點選彈出式視窗中的剪貼簿圖示。"},"setUserID":{"message":"設定密鑰 ID"},"userIDChangeWarning":{"message":"警告:變更使用者 ID 後即無法復原。您確定要這樣做嗎?請務必先備份您的舊使用者 ID,以備不時之需。"},"createdBy":{"message":"作者"},"supportOtherSites":{"message":"支援第三方的 YouTube 網站"},"supportOtherSitesDescription":{"message":"支援第三方的 YouTube 播放器。如要啟用支援,您必須同意額外的權限。","description":"This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"},"supportedSites":{"message":"支援的網站:"},"optionsInfo":{"message":"啟用 Invidious 支援,停用自動跳過、隱藏按鈕等。"},"addInvidiousInstance":{"message":"新增第三方的用戶端實例"},"addInvidiousInstanceDescription":{"message":"新增自訂實例。僅限輸入網域名稱。例如:invidious.ajay.app"},"add":{"message":"新增"},"addInvidiousInstanceError":{"message":"這是個無效的域名。它只應該包含域名部分。例如:invidious.ajay.app"},"resetInvidiousInstance":{"message":"重設 Invidious 實例清單"},"resetInvidiousInstanceAlert":{"message":"您即將重設 Invidious 實例清單"},"currentInstances":{"message":"目前進程:"},"minDuration":{"message":"最小時間 (秒):"},"minDurationDescription":{"message":"小於設定值的片段不會被跳過或在播放器中顯示"},"enableManualSkipOnFullVideo":{"message":"影片被完整標記時,使用手動跳過"},"whatManualSkipOnFullVideo":{"message":"適用於想要在影片被完整標記為贊助或自我推廣時,仍能不間斷觀看影片的使用者。"},"skipNoticeDuration":{"message":"跳過通知持續顯示時間(秒):"},"skipNoticeDurationDescription":{"message":"跳過片段提示的顯示時間將會以上列時間長度為準(單位:秒);手動跳過的時候會顯示較長於上面的時間"},"shortCheck":{"message":"以下的提交小於您的最小時間設定。這表是它們可能已經被提交,只是被該設定忽略了。您確定要提交嗎?"},"liveOrPremiere":{"message":"不允許在直播或首映活動進行中提交片段。請等到活動結束後,重新整理頁面,並確認片段仍然有效。"},"showUploadButton":{"message":"顯示上傳按鈕"},"customServerAddress":{"message":"SponsorBlock 伺服器地址"},"customServerAddressDescription":{"message":"SponsorBlock 用來與伺服器互動的地址。\n除非您有自己的伺服器進程,否則這項設定不應該被更動"},"dataFetchingServerAddress":{"message":"資料擷取伺服器網址"},"dataFetchingServerAddressDescription":{"message":"用於連線至資料擷取伺服器的網址。\n除非您擁有自己的伺服器實例,否則不應變更此設定。"},"thumbnailCacheServerAddress":{"message":"縮圖快取伺服器網址"},"save":{"message":"儲存"},"reset":{"message":"重置"},"customAddressError":{"message":"這個地址不正確。確定您在開始處有 http:// 或 https:// 且沒有尾部反斜線"},"areYouSureReset":{"message":"您確定要重設嗎?"},"mobileUpdateInfo":{"message":"現已支援 m.youtube.com"},"exportOptions":{"message":"匯入/匯出所有設定"},"exportOtherData":{"message":"匯入/匯出其他資料"},"exportOptionsCopy":{"message":"編輯/複製"},"exportOptionsDownload":{"message":"儲存到檔案"},"exportOptionsUpload":{"message":"從檔案載入"},"whatExportOptions":{"message":"這是您完整的 JSON 格式設定檔。其中包含您的密鑰 ID,請謹慎的保管它。"},"setOptions":{"message":"設定選項"},"exportOptionsWarning":{"message":"警告:更改設定是永久性的。您確定要這麼做嗎?請務必備份您的舊設定來以防萬一。"},"incorrectlyFormattedOptions":{"message":"JSON 格式不對。您的選項未更改"},"confirmNoticeTitle":{"message":"提交片段"},"submit":{"message":"提交"},"cancel":{"message":"取消"},"delete":{"message":"刪除"},"preview":{"message":"預覽"},"unsubmitted":{"message":"未提交"},"inspect":{"message":"開頭"},"edit":{"message":"編輯"},"copyDebugLogs":{"message":"複製除錯紀錄"},"copyDebugInformation":{"message":"將除錯資訊複製到剪貼簿"},"copyDebugInformationFailed":{"message":"無法寫入剪貼簿"},"copyDebugInformationOptions":{"message":"將資訊複製到剪貼簿,以便在回報錯誤或開發人員要求時提供。已移除敏感資訊,例如您的使用者 ID、已加入白名單的頻道和自訂伺服器網址。不過,其中包含您的使用者代理程式、瀏覽器、作業系統和擴充功能版本號碼等資訊。"},"copyDebugInformationComplete":{"message":"除錯資訊已複製到剪貼簿中。您可以任意移除任何您不想分享的資訊。請將其另存為文字文件或貼到錯誤報告中。"},"keyAlreadyUsed":{"message":"此快捷鍵已設定至其他動作。請選擇其他快捷鍵。"},"to":{"message":"至","description":"Used between segments. Example: 1:20 to 1:30"},"CopiedExclamation":{"message":"已複製!","description":"Used after something has been copied to the clipboard. Example: 'Copied!'"},"generic_guideline1":{"message":"包含轉場"},"generic_guideline2":{"message":"播放時就像沒有跳過任何內容一樣"},"category_sponsor":{"message":"贊助廣告"},"category_sponsor_description":{"message":"付費宣傳、付費推薦和直接廣告。不適用於自我推銷或為個人喜愛的公益活動/創作者/網站/產品提供免費宣傳。"},"category_sponsor_guideline1":{"message":"付費推廣"},"category_sponsor_guideline2":{"message":"不適用於捐款或客製化商品"},"category_selfpromo":{"message":"非付費/自我推廣"},"category_selfpromo_description":{"message":"與「贊助商廣告」類別相似,但不包含未付費或自我宣傳的內容。包含商品、捐款或合作對象資訊等章節。"},"category_selfpromo_guideline1":{"message":"贊助、會員資格和客製化周邊商品"},"category_selfpromo_guideline2":{"message":"與影片內容無關的免費宣傳"},"category_selfpromo_guideline3":{"message":"不適用於企業設計的產品和周邊商品"},"category_exclusive_access":{"message":"獨家限定"},"category_exclusive_access_description":{"message":"僅用於標記整部影片。用於影片展示創作者免費或贊助體驗的產品、服務或地點。"},"category_exclusive_access_pill":{"message":"這部影片展示了創作者免費或贊助體驗的產品、服務或地點","description":"Short description for this category"},"category_exclusive_access_guideline1":{"message":"整部影片都在展示免費或贊助體驗的內容"},"category_interaction":{"message":"互動提醒(訂閱)"},"category_interaction_description":{"message":"影片內容中出現簡短的提醒,要求觀眾按讚、訂閱或追蹤。如果時間較長或與特定內容相關,則應歸類為自我推廣。"},"category_interaction_guideline1":{"message":"簡短的提醒,要求觀眾按讚、訂閱或追蹤"},"category_interaction_guideline2":{"message":"包含間接提醒觀眾留言"},"category_interaction_guideline3":{"message":"不用於一般推廣,僅用於行動呼籲"},"category_interaction_short":{"message":"互動提醒"},"category_intro":{"message":"過場/開頭動畫"},"category_intro_description":{"message":"指影片中沒有實際內容的片段。可能為暫停、靜態畫面或重複動畫。不包含含有資訊的轉場。"},"category_intro_short":{"message":"過場"},"category_intro_guideline1":{"message":"無實際內容的片段"},"category_intro_guideline2":{"message":"不適用於包含資訊的過場效果"},"category_outro":{"message":"片尾畫面/鳴謝"},"category_outro_description":{"message":"鳴謝或當 YouTube 結尾資訊卡出現時。不是含有資訊的總結"},"category_outro_guideline1":{"message":"即使片尾畫面顯示在螢幕上,也不應包含實際內容"},"category_preview_description":{"message":"剪輯片段的集合,用於展示此影片或系列影片中即將出現的內容,所有資訊稍後都會在影片中重複出現。"},"category_preview_guideline1":{"message":"稍後會在此影片或之後的影片中出現的剪輯片段"},"category_preview_guideline2":{"message":"前一部影片的回顧"},"category_preview_guideline3":{"message":"不適用於提供額外內容的區段"},"category_filler":{"message":"離題/笑話"},"category_filler_description":{"message":"與影片主要內容理解無關的離題場景或笑話。這不包含提供背景或脈絡細節的片段。這是一個非常嚴格的分類,專為你不想「有趣」時準備的。"},"category_filler_short":{"message":"離題"},"category_filler_guideline1":{"message":"離題的場景或笑話"},"category_filler_guideline2":{"message":"例如:分心橋段、失誤/NG 鏡頭、畫面重播"},"category_filler_guideline3":{"message":"不適用於需要觀看才能理解主題的片段"},"category_music_offtopic":{"message":"音樂:非音樂部分"},"category_music_offtopic_description":{"message":"此功能僅供音樂影片使用。本功能僅應該用於音樂錄影帶中並未包含其他類別的段落。"},"category_music_offtopic_short":{"message":"非音樂片段"},"category_music_offtopic_guideline1":{"message":"官方版本中沒有的片段"},"category_music_offtopic_guideline2":{"message":"現場表演中的非音樂片段"},"category_poi_highlight":{"message":"精華"},"category_poi_highlight_description":{"message":"影片中大家最想看的地方。類似於「影片精華從幾分幾秒開始」的留言。"},"category_poi_highlight_guideline1":{"message":"影片中大家最想看的地方"},"category_poi_highlight_guideline2":{"message":"可以幫助略過前後文、背景資訊"},"category_poi_highlight_guideline3":{"message":"可以直接跳到與標題或縮圖相關的內容"},"category_chapter":{"message":"章節"},"category_chapter_description":{"message":"自訂名稱的章節,描述影片的主要段落。"},"category_chapter_guideline1":{"message":"不要提及贊助商名稱"},"category_chapter_guideline2":{"message":"使用較大的章節來區分一般段落"},"category_chapter_guideline3":{"message":"較小的章節可以放在較大的章節內"},"category_livestream_messages":{"message":"直播:捐贈/訊息閱讀"},"category_livestream_messages_short":{"message":"閱讀訊息"},"autoSkip":{"message":"自動跳過"},"manualSkip":{"message":"手動跳過"},"showOverlay":{"message":"在播放進度條中顯示"},"disable":{"message":"停用"},"autoSkip_POI":{"message":"自動跳至精華開頭"},"manualSkip_POI":{"message":"在影片載入時詢問"},"showOverlay_POI":{"message":"在播放進度條中顯示"},"showOverlay_full":{"message":"顯示標籤"},"showOverlay_chapter":{"message":"顯示章節"},"autoSkipOnMusicVideos":{"message":"自動跳過非音樂片段(如果有的話)"},"muteSegments":{"message":"允許靜音式片段,而非跳過"},"fullVideoSegments":{"message":"當整個影片都是廣告時顯示圖示","description":"Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"},"fullVideoLabelsOnThumbnails":{"message":"也在影片縮圖上顯示標籤","description":"Referring to the category pill that is shown on videos that are entirely sponsor or entirely selfpromo on recommended videos, in searches or on the homepage."},"previewColor":{"message":"未提交的顏色","description":"Referring to submissions that have not been sent to the server yet."},"seekBarColor":{"message":"時間條顏色"},"category":{"message":"類別"},"skipOption":{"message":"跳過選項","description":"Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"},"enableTestingServer":{"message":"啟用 Beta 測試伺服器"},"whatEnableTestingServer":{"message":"您的提交和投票將不會記入主伺服器。僅在測試時啟用此選項"},"testingServerWarning":{"message":"當連結到測試伺服器,所有的提交和投票都不會計入主伺服器。當您想要進行有效提交時,請停用此選項"},"bracketNow":{"message":"(現在)"},"moreCategories":{"message":"更多類別"},"chooseACategory":{"message":"選擇一個類別"},"enableThisCategoryFirst":{"message":"若想要提交{0} 類的分段,您必須要在選項內將其啟用。您現在將被重新導向至選項頁面。","description":"Used when submitting segments to only let them select a certain category if they have it enabled in the options."},"poiOnlyOneSegment":{"message":"警告:此類型的片段一次最多只能有一個處於啟用狀態。提交多個片段將導致隨機顯示其中一個。"},"youMustSelectACategory":{"message":"您必須為所有您要提交的片段選擇類別!"},"bracketStart":{"message":"(開始)"},"bracketEnd":{"message":"(結束)"},"End":{"message":"結束","description":"Button that skips to the end of a segment"},"hiddenDueToDownvote":{"message":"已隱藏:倒讚"},"hiddenDueToDuration":{"message":"已隱藏:過短"},"manuallyHidden":{"message":"手動隱藏"},"channelDataNotFound":{"description":"This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.","message":"未偵測到頻道ID,如果您正在使用嵌入式YouTube播放器,請移至YouTube網站上觀看本影片。此問題亦有可能是由於YouTube改變了系統架構,如果你認為這是造成此問題的原因,請留言告訴我們:"},"invidiousPermissionRefresh":{"message":"瀏覽器已收回 Invidious 和其他第三方網站運作所需的權限。請點選下方的按鈕重新啟用此權限。"},"acceptPermission":{"message":"允許權限"},"permissionRequestSuccess":{"message":"權限請求成功!"},"permissionRequestFailed":{"message":"權限請求失敗,您是不是按到拒絕了?"},"adblockerIssueWhitelist":{"message":"如果您無法解決此問題,請停用「在跳過前強制檢查頻道」設定,因為 SponsorBlock 無法擷取此影片的頻道資訊。"},"forceChannelCheck":{"message":"在跳過前強制檢查頻道"},"whatForceChannelCheck":{"message":"預設會在它知道頻道名字之前就跳過片段。有時候會在影片一開始忽略白名單而直接跳過片段。啟用這個會預防它,但會造成延遲。如果您有高速網路的話,這個延遲將會不起眼。"},"forceChannelCheckPopup":{"message":"考慮啟用\"在跳過之前強制頻道檢查\""},"downvoteDescription":{"message":"不正確/錯誤的時間"},"incorrectVote":{"message":"不正確的"},"harmfulVote":{"message":"有害的","description":"Used for chapter segments when the text is harmful/offensive to remove it faster"},"incorrectCategory":{"message":"變更類別"},"nonMusicCategoryOnMusic":{"message":"這個影片被分類為音樂。您確定這有贊助內容嗎?如果這其實是\"非音樂片段\"的話,開啟擴充功能設定並啟用這個類別。接下來您即可提交這個片段為\"非音樂片段\"。如果您感到困惑,請閱讀方針"},"multipleSegments":{"message":"多個片段"},"guidelines":{"message":"方針"},"readTheGuidelines":{"message":"閱讀方針!!","description":"Show the first time they submit or if they are \"high risk\""},"categoryUpdate1":{"message":"類別功能已推出!"},"categoryUpdate2":{"message":"開啟選項以跳過開場、結尾、工商等。"},"help":{"message":"說明"},"GotIt":{"message":"我知道了","description":"Used as the button to dismiss a tooltip"},"fullVideoTooltipWarning":{"message":"此片段很長。如果整部影片都與單一主題相關,請將「跳過」改為「整部影片」。詳情請參閱規範。"},"categoryPillTitleText":{"message":"整部影片都被標記為此類別,且內容過於緊密而無法分割。"},"chapterNameTooltipWarning":{"message":"您的其中一個章節名稱與某個類別相似。建議您盡可能使用類別。"},"experiementOptOut":{"message":"關閉所有未來的實驗性功能","description":"This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."},"hideForever":{"message":"永久隱藏"},"warningChatInfo":{"message":"我們注意到您犯了一些常見的錯誤。我們非常感謝您迄今為止的貢獻,但我們致力於追求完美,因此即使是很小的錯誤也很重要 :)"},"questionButton":{"message":"我有問題"},"askAQuestion":{"message":"詢問問題"},"warningConfirmButton":{"message":"我了解原因"},"warningError":{"message":"嘗試確認警告時發生錯誤:"},"deArrowMessageRecieved":{"message":"您從管理者中收到了提示"},"Donate":{"message":"贊助"},"considerDonating":{"message":"資助開發"},"hideDonationLink":{"message":"隱藏贊助連結"},"darkModeOptionsPage":{"message":"選項頁面深色模式"},"helpPageThanksForInstalling":{"message":"感謝您安裝 SponsorBlock。"},"helpPageReviewOptions":{"message":"請確認以下選項"},"helpPageFeatureDisclaimer":{"message":"許多功能預設為停用。如果您想跳過片頭、片尾、使用 Invidious 等等,請在下方啟用。您也可以隱藏/顯示使用者介面元素。"},"helpPageHowSkippingWorks2":{"message":"每當您跳過片段時,都會收到通知。如果時間似乎不正確,請點選倒讚按鈕投票!您也可以在彈出式視窗中投票。"},"Submitting":{"message":"正在提交"},"helpPageCopyOfDatabase2":{"message":"原始碼是公開的。因此,即使作者發生任何狀況,您的提交內容也不會遺失。"},"Credits":{"message":"鳴謝"},"LearnMore":{"message":"深入了解"},"FullDetails":{"message":"完整詳細資訊"},"CopyDownvoteButtonInfo":{"message":"倒讚並建立本機副本供您重新提交"},"OpenCategoryWikiPage":{"message":"開啟此類別的 Wiki 頁面。"},"CopyAndDownvote":{"message":"複製並倒讚"},"ContinueVoting":{"message":"繼續投票"},"ChangeCategoryTooltip":{"message":"這將立即套用至您的片段"},"downvote":{"message":"倒讚"},"upvote":{"message":"按讚"},"hideSegment":{"message":"隱藏片段"},"skipSegment":{"message":"跳過片段"},"playChapter":{"message":"播放章節"},"SponsorTimeEditScrollNewFeature":{"message":"將滑鼠游標停留在編輯方塊上方,並使用滑鼠滾輪快速調整時間。您可以搭配 Ctrl 或 Shift 鍵來微調變更。"},"categoryPillNewFeature":{"message":"新功能!檢視影片是否完全為贊助或自我推廣內容"},"yearAbbreviation":{"message":"年","description":"100y"},"dayAbbreviation":{"message":"天","description":"100d"},"hourAbbreviation":{"message":"小時","description":"100h"},"optionsTabBehavior":{"message":"行為","description":"Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabInterface":{"message":"介面","description":"Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabKeyBinds":{"message":"快捷鍵","description":"Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabBackup":{"message":"備份/還原","description":"Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"optionsTabAdvanced":{"message":"其他","description":"Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."},"noticeVisibilityLabel":{"message":"跳過提醒外觀","description":"Option label"},"unbind":{"message":"解除綁定","description":"Unbind keyboard shortcut"},"notSet":{"message":"未設定"},"change":{"message":"變更"},"youtubeKeybindWarning":{"message":"這是 YouTube 內建的快捷鍵。您確定要取代它嗎?"},"betaServerWarning":{"message":"已啟用測試版伺服器!"},"openOptionsPage":{"message":"開啟選項頁面"},"resetToDefault":{"message":"將設定重設為預設值"},"confirmResetToDefault":{"message":"您確定要將所有設定重設為預設值嗎?此動作無法復原。"},"exportSegments":{"message":"匯出片段"},"importSegments":{"message":"匯入片段"},"Import":{"message":"匯入","description":"Button to initiate importing segments. Appears under the textbox where they paste in the data"},"redeemSuccess":{"message":"兌換成功!"},"redeemFailed":{"message":"授權金鑰無效"},"hideUpsells":{"message":"隱藏選項需要額外付款才可使用"},"hideNewFeatureUpdates":{"message":"隱藏關於新功能的提示"},"redeem":{"message":"兌換"},"enterLicenseKey":{"message":"輸入授權金鑰"},"unsubmittedSegmentCounts":{"message":"您目前在 {1} 部影片中有 {0} 個未提交的片段","description":"Example: You currently have 12 unsubmitted segments on 5 videos"},"unsubmittedSegmentCountsZero":{"message":"您目前沒有任何未提交的片段","description":"Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"},"unsubmittedSegmentsSingular":{"message":"個未提交的片段","description":"Example: You currently have 1 *unsubmitted segment* on 1 video"},"unsubmittedSegmentsPlural":{"message":"個未提交的片段","description":"Example: You currently have 12 *unsubmitted segments* on 5 videos"},"videosSingular":{"message":"部影片","description":"Example: You currently have 3 unsubmitted segments on 1 *video*"},"videosPlural":{"message":"部影片","description":"Example: You currently have 12 unsubmitted segments on 5 *videos*"},"clearUnsubmittedSegments":{"message":"清除所有片段","description":"Label for a button in settings"},"clearUnsubmittedSegmentsConfirm":{"message":"您確定要清除所有未提交的片段嗎?","description":"Confirmation message for the Clear unsubmitted segments button"},"showUnsubmittedSegments":{"message":"顯示片段","description":"Show/hide button for the unsubmitted segments list"},"hideUnsubmittedSegments":{"message":"隱藏片段","description":"Show/hide button for the unsubmitted segments list"},"videoID":{"message":"影片 ID","description":"Header of the unsubmitted segments list"},"segmentCount":{"message":"片段數量","description":"Header of the unsubmitted segments list"},"actions":{"message":"操作","description":"Header of the unsubmitted segments list"},"exportSegmentsAsURL":{"message":"分享連結"},"segmentFetchFailureWarning":{"message":"警告:伺服器尚未回傳任何片段資訊。此影片可能已有提交的片段,但由於伺服器問題導致您尚未收到。"},"allowScrollingToEdit":{"message":"允許捲動以編輯時間"},"NoticeTimeAfterSkip":{"message":"{seconds} 秒","description":"This is used on the popup to show how much time left. It will look like \"5s\". The word {seconds} will be replaced, so keep it here. Translations should only change the \"s\""},"deArrowFullName":{"message":"DeArrow - 更好的 YouTube 標題與縮圖","description":"Name of the Clickbait extension. The name refers to removing arrows from thumbnails"},"deArrowDescription":{"message":"群眾外包提供更具描述性且不聳動的標題和縮圖","description":"Description of the Clickbait extension."},"chooseDescriptive":{"message":"選擇最具描述性的內容"},"Original":{"message":"原始版本"},"OriginalTitle":{"message":"原始標題"},"CurrentTime":{"message":"目前時間"},"resetCustomTitle":{"message":"將標題重設為原始文字"},"resetIcon":{"message":"重設圖示"},"TypeYourOwnTitleHere":{"message":"在這裡輸入您的標題"},"VideoNotReady":{"message":"影片尚未準備就緒"},"FailedToRender":{"message":"繪製失敗","description":"Thumbnail preview failed to render"},"CanvasMissing":{"message":"找不到畫布","description":"Canvas is the name of an HTML element used to draw thumbnails onto"},"ExceptionWhileRendering":{"message":"繪製時發生例外狀況","description":"Displayed if there is a general error when trying to render the thumbnail"},"FailedToLoad":{"message":"載入失敗","description":"Thumbnail failed to load"},"titleFormatting":{"message":"標題格式"},"Disabled":{"message":"已停用"},"CapitalizeWords":{"message":"逐詞首字母大寫"},"TitleCase":{"message":"標題大小寫"},"SentenceCase":{"message":"句子大小寫"},"LowerCase":{"message":"小寫"},"FirstLetterUppercase":{"message":"第一個字母大寫"},"shouldCleanEmojis":{"message":"移除表情符號"},"onlyFormatCustomTitles":{"message":"僅格式化使用者提交的標題"},"onlyTitleCaseInEnglish":{"message":"僅針對非英文標題套用標題大小寫"},"onlyTitleCaseInEnglishDescription":{"message":"語言偵測並不完美,有時會將某些英文標題誤判為非英文。"},"thumbnailFallbackOption":{"message":"當沒有提交的縮圖時"},"whatThumbnailFallbackOption":{"message":"當選擇隨機時間時,會使用 SponsorBlock 的資料來確保不會選到贊助或廣告宣傳的區段。","description":"Describing the option for the crowdsourced thumbnail system if no thumbnail has been submitted. It can use a random time instead."},"RandomTime":{"message":"顯示隨機時間點的截圖"},"TheOriginalThumbnail":{"message":"顯示原始縮圖"},"showABlankBox":{"message":"顯示空白方塊"},"AutoGenerated":{"message":"顯示 YouTube 自動產生的縮圖","description":"A DeArrow fallback method that will use the YouTube auto-generated thumbnails instead of a randomly selected time or the original thumbnail"},"Start":{"message":"開頭"},"Middle":{"message":"中間"},"keepUnsubmitted":{"message":"儲存已提交的投票"},"showLiveCover":{"message":"在即將推出的影片上顯示頻道大頭貼","description":"It replaces the thumbnail and happens when a DeArrow user selects random thumbnails when no submission exists."},"ignoreAbThumbnails":{"message":"永不使用 A/B 測試縮圖"},"ignoreAbThumbnailsDescription":{"message":"頻道可以在影片上設定 A/B 測試,YouTube 會向每位使用者顯示不同的縮圖。此選項會始終使用第一張縮圖,以保持一致性。"},"abThumbnailsWarning":{"message":"警告:此影片目前正在進行縮圖 A/B 測試。這表示縮圖可能會經常變更。由於此風險,您不應投票給原始縮圖。"},"whatKeepUnsubmitted":{"message":"投票後保留已提交的投票,以便顯示您選擇的標題和縮圖,而非伺服器上得票數最高的版本。"},"keepUnsubmittedInPrivate":{"message":"儲存私密分頁中提交的投票"},"useThumbnailGenerationService":{"message":"使用縮圖產生服務"},"titleMaxLines":{"message":"標題的最大行數"},"titleMaxLinesDescription":{"message":"影片標題在建議中將會分佈在此設定的行數中。"},"thumbnailSaturationLevel":{"message":"縮圖飽和度"},"whatSaturateThumbnails":{"message":"藉由降低縮圖的色彩,使其不那麼鮮豔"},"hideDetailsWhileFetching":{"message":"擷取時隱藏詳細資訊"},"hideDetailsWhileFetchingDescription":{"message":"從伺服器擷取資料時隱藏標題和縮圖。如果停用此選項,當標題和縮圖變更時,您會看到閃爍的畫面。"},"ignoreTranslatedTitles":{"message":"不顯示 YouTube 的翻譯標題","description":"YouTube sometimes will auto-translate titles to your native language. This option only applies when a crowdsourced title is not available."},"ignoreTranslatedTitlesDescription":{"message":"YouTube 有時會自動將標題翻譯為您的母語。此選項僅在crowdsourced標題不可用時適用。"},"onAllPages":{"message":"所有頁面","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"onAllPagesExceptVideo":{"message":"除影片頁面外的所有頁面","description":"Setting for when the server-side thumbnail generator should be used for the thumbnail replacement feature."},"Never":{"message":"永不"},"thumbnailGeneratorDescription1":{"message":"縮圖產生服務會將包含影片 ID 的匿名請求傳送到遠端伺服器,藉此大幅加快縮圖產生速度。系統接著會產生縮圖,如果已產生過,則會從快取中提取。"},"thumbnailGeneratorDescription2":{"message":"如果在影片頁面上使用,可能會將未公開影片的 ID 洩漏到此伺服器。將此設定為「除影片頁面外的所有頁面」即可避免這個問題。另一個選項是自己架設縮圖產生服務。"},"thumbnailGeneratorDescription3":{"message":"如果停用縮圖產生服務,所有請求都會使用 k 匿名查詢系統(讓伺服器更難預測擷取了哪些影片),並且會使用速度較慢的本機縮圖產生服務。","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"thumbnailGeneratorSourceCode":{"message":"縮圖產生服務原始碼"},"moreAboutKAnonymity":{"message":"關於 k 匿名性的詳細資訊","description":"https://en.wikipedia.org/wiki/K-anonymity is a system used to anonymise requests."},"alwaysShowShowOriginalButton":{"message":"一律顯示「顯示原始版本」按鈕"},"whatAlwaysShowShowOriginalButton":{"message":"如果您希望隨時掌握標題/縮圖是否已變更,請啟用此選項。"},"showOriginalOnHover":{"message":"滑鼠懸停時切換自訂細節與原始細節"},"showCustomOnHoverIfCasual":{"message":"滑鼠懸停時顯示自訂標題(若目前顯示隨性模式標題)"},"showIconForFormattedTitles":{"message":"針對自動格式化的標題顯示「顯示原始版本」按鈕"},"Enable":{"message":"啟用"},"Titles":{"message":"標題","description":"Referring to titles of YouTube videos"},"Thumbnails":{"message":"縮圖","description":"Referring to thumbnails of YouTube videos"},"CasualVotes":{"message":"隨性投票","description":"Referring to the number of votes submitted under casual mode in DeArrow"},"Error":{"message":"錯誤"},"ShowOriginal":{"message":"顯示原始詳細資訊"},"ShowModified":{"message":"顯示修改後的詳細資訊"},"ShowFormatted":{"message":"顯示格式化細節"},"FillerWarning":{"message":"警告:這是一個非常嚴格的類別。您很可能需要取消跳過某些內容,或有時必須停用它。請注意,許多影片的跳過內容可能會超過 50% 或更多!不過,請記住,提交片段時仍須遵守特定規範。","description":"Warning that appears when enabling the filler tangent category"},"chatboxDescription":{"message":"加入 Discord 或 Matrix 聊天室","description":"Appears on the top of the integrated chatbox"},"showGuidelineHelp":{"message":"顯示規範說明","description":"Setting to show a summary of the guidelines on the submission page"},"tip1":{"message":"避免誇張的表情","description":"Referring to the thumbnail of a video"},"tip2":{"message":"宏觀思考,不要只是回答原始標題提出的問題","description":"This is a tip about submitting a new DeArrow replacement title. If the original title is an attention grabbing title, the DeArrow title shouldn't just be an answer to that. It instead should be based on the contents of the video."},"tip3":{"message":"避免描述對影片的反應(例如「震驚」)","description":"Referring to the title of a YouTube video. Shocking being when something is described as shocking"},"tip4":{"message":"提供足夠的資訊,讓使用者在點選前就能做出明智的選擇"},"tip5":{"message":"像句子一樣大寫","description":"Tip about submitting titles to DeArrow"},"checkAllToSubmit":{"message":"勾選所有規範才能提交","description":"Appears on the submission menu in DeArrow sometimes asking the person to agree to part of the guidelines before submitting. The word 'check' here is used as a verb indicating to click each checkbox."},"sentenceCaseTipTitle":{"message":"我的標題像句子一樣大寫","description":"Tip title in DeArrow"},"answeringQuestionTipTitle":{"message":"我的標題不只是回答原始標題中提出的問題","description":"Tip title in DeArrow"},"answeringQuestionTipSubTitle":{"message":"標題應描述影片或故事大綱。您應確保觀看整部影片,以了解影片的實際內容,而非依賴引人入勝的原始標題。","description":"Tip subtitle in DeArrow"},"noSummariesTipTitle":{"message":"我的標題不會總結結論或不必要地爆雷","description":"Tip title in DeArrow"},"noSummariesTipSubTitle":{"message":"標題的目的並非完全取代觀看影片,而是讓您知道是否應該點選觀看。","description":"Tip subtitle in DeArrow"},"noFactCheckTipTitle":{"message":"我的標題不會事實查核、嘲諷或批評影片或創作者","description":"Tip title in DeArrow"},"noFactCheckTipSubTitle":{"message":"標題應從創作者和影片的角度出發。針對影片本身進行評分或事實查核,超出了 DeArrow 的範疇。標題並非用作留言區。","description":"Tip subtitle in DeArrow"},"DetectedWord":{"message":"偵測到的字詞:","description":"Used in DeArrow automatic warnings that shows you the word that was detected as a problem"},"DeArrowDiscussingWarning":{"message":"不要在標題開頭使用不必要的動詞","description":"A DeArrow automatic warning. It will detect works such as 'discussing' and 'talking about'"},"DeArrowStartLowerCaseWarning":{"message":"所有標題都應以大寫字母開頭。標題的格式應像句子一樣","description":"A DeArrow automatic warning"},"DeArrowEndWithPeriodWarning":{"message":"標題不應以「.」結尾","description":"A DeArrow automatic warning"},"DeArrowAddingAnswerWarning":{"message":"不要只是在原始標題的問題後方加上答案。標題應描述影片或故事大綱","description":"A DeArrow automatic warning"},"DeArrowClickbaitWarning":{"message":"標題不應事實查核、嘲諷或批評影片或創作者","description":"A DeArrow automatic warning"},"DeArrowKeepingBadOriginalWarning":{"message":"標題不應保留原始標題中聳動的元素","description":"A DeArrow automatic warning"},"DeArrowEmojiWarning":{"message":"標題不應包含表情符號","description":"A DeArrow automatic warning"},"resolveWarningFirst":{"message":"您必須先解決警告,才能提交"},"dearrowHelpSponsorBlockImported":{"message":"注意:您的 SponsorBlock 設定已自動匯入!"},"howItWorks":{"message":"如何運作"},"discordPromotion":{"message":"歡迎在 {discord} 或 {matrix} 上貢獻、提供建議和協助"},"deArrowDonationText":{"message":"如果您喜歡我目前為止的成果,並想提供金錢贊助,請點選此連結"},"termsAgreement":{"message":"使用這個擴充功能,即表示您同意 {privacy-policy} 和 {terms}"},"privacyPolicy":{"message":"隱私權政策"},"termsOfUse":{"message":"使用條款"},"openSourceLicenses":{"message":"開放原始碼授權"},"defaultToOriginals":{"message":"預設顯示原始影片資訊"},"whatDefaultToOriginals":{"message":"預設顯示原始標題和縮圖,但在滑鼠游標停留時顯示按鈕,以便檢視自訂標題和縮圖。"},"replaceTitles":{"message":"取代標題"},"replaceThumbnails":{"message":"取代縮圖"},"useCrowdsourcedTitles":{"message":"使用群眾外包標題"},"whatUseCrowdsourcedTitles":{"message":"如果停用此選項,系統會格式化標題,但不會使用社群提交的標題","description":"Description under the \"Use Crowdsourced Titles\" option"},"areYouSureDeleteConfig":{"message":"您確定要刪除這個設定嗎?","description":"Appears when deleting a configuration for channel-based settings"},"NewConfiguration":{"message":"新增設定"},"DeleteConfiguration":{"message":"刪除設定"},"ChannelAllowlist":{"message":"頻道特定設定"},"ConfigurationName":{"message":"設定名稱"},"ChannelListInstructions":{"message":"在下方方塊中輸入您想要套用此設定的任何頻道,每行一個。支援頻道 ID 和顯示名稱。不支援 @ 使用者名稱。您可以點選頻道「關於」頁面上的分享按鈕來取得頻道 ID。如要前往「關於」頁面,請點選頻道頁面上、頻道名稱下方顯示的頻道說明。","description":"Instructions for the channel-specific settings feature in DeArrow to configure settings for specific channels"},"NoConfigurationsSetup":{"message":"尚未設定任何設定。點選頂端的按鈕即可新增設定。","description":"Appears when there are no channel configurations setup yet on the channel-specific settings list page"},"DeArrowPromotionMessage":{"message":"使用更準確的標題和縮圖取代誘餌式點擊內容,以杜絕誘餌式點擊"},"DeArrowPromotionMessage2":{"message":"厭倦了誘餌式點擊嗎?來看看我的新擴充功能,可以改善標題與縮圖"},"DeArrowPromotionMessage3":{"message":"也來看看 DeArrow","description":"DeArrow is the name of the extension"},"DeArrowTitleReplacementSuggestion":{"message":"不喜歡這個標題嗎?如果您比較喜歡下方的標題,可以考慮使用 DeArrow 中的標題取代功能。","description":"A title will be displayed below this to demonstrate what the alternative title would be."},"RandomThumbnailExplanation":{"message":"由於此影片尚未提交任何內容,因此此縮圖是從隨機時間戳記中選擇的","description":"A description during on boarding to explain the random thumbnail setting"},"RandomThumbnailAndAutoFormattedExplanation":{"message":"由於此影片尚未提交任何內容,因此此縮圖是從隨機時間戳記中選擇的,而標題則是自動格式化的","description":"A description during on boarding to explain the random thumbnail and autoformatting setting"},"YouCanChangeThisDefaultBelow":{"message":"您可以在下方變更這個預設設定","description":"Appears in onboarding below explanation of random thumbnail and autoformatting"},"dearrowStatsMessage":{"message":"自您安裝此擴充功能以來,已取代了 {titles} 個標題和 {thumbnails} 張縮圖","description":"Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlePart":{"message":"{titles} 個標題","description":"Title singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageTitlesPart":{"message":"{titles} 個標題","description":"Title plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailPart":{"message":"和 {thumbnails} 張縮圖","description":"Thumbnail singular part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessageThumbnailsPart":{"message":"和 {thumbnails} 張縮圖","description":"Thumbnail plural part of message. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"dearrowStatsMessage2":{"message":"自您安裝此擴充功能以來,已取代了 {titleAndThumbnailMessage}","description":"{titleAndThumbnailMessage} will become '{titles} titles and {thumbnails} thumbnails' from the other messages. It can be moved to a different part of the message if needed. Appears on the DeArrow popup to show how many titles and thumbnails have been replaced since install"},"countReplacements":{"message":"計算標題和縮圖取代次數"},"countReplacementsDescription":{"message":"用於在彈出式視窗中提供統計資料。","description":"On options page describing the setting for counting how many times titles and thumbnails have been replaced in DeArrow"},"YtNeuterMessage":{"message":"使用 yt-neuter 新增篩選清單,以封鎖問卷調查、周邊商品貨架和其他廣頁頁面元素"},"requiresUblock":{"message":"需要 uBlock Origin"},"videoIDWrongWhenSubmittingError":{"message":"影片 ID 偵測發生問題。提交前請先重新整理,以確保提交到正確的影片。如果這個問題經常發生,請透過 GitHub、Discord 或 Matrix 回報,並附上您已安裝的其他擴充功能或使用者指令碼。"},"dearrowLogoCredit":{"message":"標誌基於 Twemoji,並採 CC 姓名標示 4.0 授權。"},"zoomToFillUnsupported":{"message":"SponsorBlock 與「Zoom to Fill」擴充功能不相容。不過您仍可以使用許多其他可以正常運作的替代方案。"},"freeTrialStarted":{"message":"您的免費試用已成功啟用。請前往 YouTube 試用看看"},"freeTrialEnded":{"message":"您的試用已到期"},"freeTrialPrompt":{"message":"如果您想試用,可以按下方的按鈕開始免費試用。"},"startFreeTrial":{"message":"開始免費試用"},"freeAccessRequested":{"message":"您已成功註冊免費存取權。我們將在免費存取權被授予時通知您。"},"freeAccessComplete":{"message":"恭喜!您現在可以免費使用 DeArrow"},"DeArrowNotActivated":{"message":"DeArrow 尚未啟用"},"ActivateDeArrow":{"message":"啟用 DeArrow"},"DeArrowIsActivated":{"message":"DeArrow 已成功啟用"},"Close":{"message":"關閉"},"ViewLicenseKey":{"message":"檢視授權金鑰"},"SharingIsCaring":{"message":"分享就是關懷"},"cleanPopup":{"message":"在片段清單彈出式視窗中隱藏雜亂內容"},"syncDisabledWarning":{"message":"警告:您的瀏覽器已停用擴充功能儲存空間。如果您嘗試儲存設定,設定將不會被儲存。"},"syncDisabledWarningDeArrow":{"message":"沒有儲存空間,DeArrow 將無法運作。"},"syncDisabledFirefoxSuggestions":{"message":"您可以前往 about:config,然後將「webextensions.storage.sync.enabled」的值設定為 true 來啟用儲存空間。"},"storageFull":{"message":"擴充功能儲存空間已滿。請在選項中刪除一些未提交的片段。"},"previewSegmentRequired":{"message":"提交前請先預覽您的片段。您可以點選預覽按鈕或使用以下快捷鍵:","description":"Appears when trying to submit a segment without previewing it first. After the colon, the shortcut will appear"},"actAsVip":{"message":"以 VIP 身分操作","description":"Toggle switch for VIP (SponsorBlock moderators) to be able to make vote actions without using their powers."},"submissionFailedServerSideAds":{"message":"目前無法從您的瀏覽器接受提交的內容,因為 YouTube 似乎插入了一些擴充功能無法移除的伺服器端廣告。如果您收到此錯誤訊息,請與我們聯絡。"},"DeArrowIsDisabled":{"message":"DeArrow 已停用 - 點選即可啟用","description":"Appears as a button on the video page when DeArrow is disabled"},"areYouSureOriginalVote":{"message":"您確定此原始縮圖符合 DeArrow 規範嗎?如果您只是通常比較喜歡看到原始縮圖,請考慮在 DeArrow 設定中變更「當沒有提交的縮圖時」選項。","description":"Appears when voting for the original thumbnail for the first time in DeArrow"},"yttvLiveContentWarning":{"message":"在 YouTube TV 上,SponsorBlock 與直播和最近錄製的內容不相容。如果這是最近錄製的內容,請稍候幾個小時,等待錄製內容的處理版本可用。","description":"Shown when attempting to start creating a segment on tv.youtube.com and the content is live/recently-recorded."},"yttvNoChannelWhitelist":{"message":"tv.youtube.com 不支援頻道白名單功能。","description":"Appears when trying to whitelist a channel but being on YTTV where channel ID extraction is unsupported."},"likeOriginalTitle":{"message":"喜歡原始標題嗎?","description":"Shows in a voting box for casual mode for voting on if the original title is fun or entertaining"},"Yes":{"message":"是"},"No":{"message":"否"},"votes":{"message":"{0} 票","description":"Appears as `5 votes`. Do not change the {0}"},"vote":{"message":"{0} 票","description":"Appears as `1 vote`. Do not change the {0}"},"dearrow_category_funny":{"message":"好笑","description":"Category for DeArrow casual mode"},"dearrow_category_creative":{"message":"有創意","description":"Category for DeArrow casual mode"},"dearrow_category_clever":{"message":"巧妙","description":"Category for DeArrow casual mode"},"dearrow_category_descriptive":{"message":"具描述性","description":"Category for DeArrow casual mode"},"dearrow_category_other":{"message":"其他","description":"Category for DeArrow casual mode"},"ClassicMode":{"message":"經典模式","description":"Classic mode is a mode in DeArrow"},"ClassicModeDescription":{"message":"所有影片若存在群眾外包標題,標題都會被替換為基於準則的標準化格式。"},"CasualMode":{"message":"隨性模式","description":"Casual mode is a mode in DeArrow"},"CasualModeDescription":{"message":"標題若已足夠清楚描述影片,且具備巧妙或幽默的元素,則保留原始標題。\n選擇你想要看到的標題類別。\n你可以針對標題是否符合某個類別進行投票。"},"minimumVotes":{"message":"最低票數","description":"Appears in DeArrow settings for minimum votes for a casual mode category to be used"},"showOriginalWhenCasual":{"message":"在隨性模式下,針對已投票影片顯示原始縮圖","description":"Option for casual mode in DeArrow to also apply casual settings to thumbnail choices"},"newCasualMode":{"message":"新功能:隨性模式","description":"Title of announcement in DeArrow about the new casual mode feature"},"onlyShowCasualIconForCustom":{"message":"只有在有可用的自訂標題時才顯示隨性模式圖示"},"OpenSettings":{"message":"開啟設定"}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/content.css b/data/extensions/sponsorBlocker@ajay.app/content.css @@ -0,0 +1,976 @@ +:root { + --skip-notice-right: 10px; + --skip-notice-padding: 5px; + --skip-notice-margin: 5px; + --skip-notice-border-horizontal: 5px; + --skip-notice-border-vertical: 10px; + --sb-dark-red-outline: rgb(130,0,0,0.9); +} + +.sbhidden { + display: none; +} + +/* Vorapi compatibility */ +#player-api_VORAPI_ELEMENT_ID #previewbar { + z-index: 999; +} + +#previewbar { + overflow: visible; + padding: 0; + margin: 0; + position: absolute; + width: 100%; + pointer-events: none; + + height: 100%; + transform: scaleY(0.6) translateY(-30%) translateY(1.5px); + z-index: 42; + + transition: transform .1s cubic-bezier(0,0,0.2,1); +} + +/* Prevent bar from covering highlights on YTTV */ +#previewbar.sponsorblock-yttv-container { + z-index: unset; +} + +ytu-time-bar.ytu-storyboard { + text-align: center; +} + +/* May 2024 hover preview */ +.YtPlayerProgressBarProgressBar #previewbar { + transform: none; +} + +.ytp-big-mode #previewbar { + transform: scaleY(0.625) translateY(-30%) translateY(1.5px); +} + +.ytp-big-mode .sponsorTwoTooltips .sponsorCategoryTooltip { + top: 75px !important; +} + +.progress-bar-line > #previewbar { + height: 3px; +} + +div:hover > #previewbar.sbNotInvidious { + transform: scaleY(1); +} + +/* Vorapis */ +.v3 #previewbar.sbNotInvidious { + transform: scaleY(1); +} +.sponsorCategoryTooltipVisible.ytp-progress-tooltip { + width: 216px !important; + /* left: 264.308px !important; */ +} + +.previewbar { + display: inline-block; + height: 100%; + min-width: 1px; +} + +.previewbar-yttv { + height: 10px; + top: 14px; +} + +.previewbar.requiredSegment { + transform: scaleY(3); +} + +.previewbar.selectedSegment { + opacity: 1 !important; + z-index: 100; + transform: scaleY(1.5); +} + +/* Make sure settings are upfront */ +.ytp-settings-menu { + z-index: 6000 !important; +} + +/* Preview Bar page hacks */ + +.ytp-tooltip:not(.sponsorCategoryTooltipVisible) .sponsorCategoryTooltip { + display: none !important; +} + +/* Pull up for precise seeking */ +.ytp-tooltip.sponsorCategoryTooltipVisible .ytp-tooltip-edu { + transform: translateY(-1em) !important; +} + +.ytp-tooltip.sponsorCategoryTooltipVisible { + transform: translateY(-1em) !important; +} + +.ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips { + transform: translateY(-2em) !important; +} + +.ytp-tooltip.sponsorCategoryTooltipVisible.sponsorHasOriginalTooltip { + transform: translateY(-2em) !important; +} + +.ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips.sponsorHasOriginalTooltip { + transform: translateY(-3em) !important; +} + +.ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible { + transform: translateY(-2em) !important; +} + +.ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips { + transform: translateY(-4em) !important; +} + +#movie_player:not(.ytp-big-mode) .ytp-tooltip.sponsorCategoryTooltipVisible > .ytp-tooltip-text-wrapper { + transform: translateY(1em) !important; +} + +#movie_player:not(.ytp-big-mode) .ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips > .ytp-tooltip-text-wrapper { + transform: translateY(2em) !important; +} + +/* Pull up for precise seeking */ +.ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips .ytp-tooltip-edu { + transform: translateY(-2em) !important; +} + +.ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible > .ytp-tooltip-text-wrapper { + transform: translateY(0.5em) !important; +} + +.ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips > .ytp-tooltip-text-wrapper { + transform: translateY(1.75em) !important; +} + +.ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible > .ytp-tooltip-text-wrapper .ytp-tooltip-text { + display: inline-block !important; + transform: translateY(0.75em) !important; +} + +.ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips > .ytp-tooltip-text-wrapper .ytp-tooltip-text { + display: inline-block !important; + transform: translateY(0.75em) !important; +} + +div:hover > .sponsorBlockChapterBar { + z-index: 41 !important; +} + +/* */ + +.popup { + z-index: 10; + width: 100%; + height: 500px; +} + +.smallLink { + font-size: 10px; + text-decoration: underline; + cursor: pointer; +} + +.playerButtonImage { + height: 60%; + top: 0; + bottom: 0; + display: block; + margin: auto; +} + +.sbChapterVoteButton { + padding: 0 !important; +} + +.playerButton { + vertical-align: top; +} + +.playerButton.sbhidden:not(.autoHiding) { + display: none !important; +} + +/* Removes auto width from being a ytp-player-button */ +.sbPlayerDownvote { + width: auto !important; +} + +/* Adds back the padding */ +.sbPlayerDownvote svg { + padding-right: 3.6px; +} + +.sbButtonYTTV { + padding-left: 5px !important; +} + +/* YTTV only */ +.ytu-player-controls > .skipButtonControlBarContainer > div { + padding-left: 5px; + align-content: center; +} + +.autoHiding { + overflow: visible !important; +} + +.autoHiding:not(.sbhidden) { + transform: translateX(0%) scale(1); + /* opacity is from YouTube page */ + transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important; +} + +.autoHiding.sbhidden { + transform: translateX(100%) scale(0); + /* opacity is from YouTube page */ + transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important; + + width: 0px !important; +} + +.autoHiding.sbhidden.autoHideLeft { + transform: translateX(-100%) scale(0); +} + +.sponsorSkipObject { + font-family: Roboto, Arial, Helvetica, sans-serif; + + margin-left: var(--skip-notice-margin); + margin-right: var(--skip-notice-margin); +} + +.sponsorSkipObjectFirst { + margin-left: 0; +} + +.sponsorSkipLogo { + height: 18px; + + float: left; +} + +#categoryPill .sbPillNoText .sponsorSkipLogo { + margin-top: calc(2.6rem - 18px); + margin-bottom: calc(2.6rem - 18px); +} + +@keyframes fadeIn { + from { opacity: 0; } +} + +@keyframes fadeInToFaded { + from { opacity: 0; } + to { opacity: 0.5; } +} + +@keyframes fadeOut { + to { opacity: 0; } +} + +.sponsorBlockSpacer { + background-color: rgb(100, 100, 100); + border-color: rgb(100, 100, 100); + + margin-left: 5px; +} + +.sbChatNotice { + min-width: 350px; + height: 70%; + + position: absolute; + right: 5px; + bottom: 100px; + right: var(--skip-notice-right); +} + +.sponsorSkipNoticeParent { + position: absolute; + + bottom: 100px; + right: 10px; +} + +.sponsorSkipNoticeParent, .sponsorSkipNotice { + border-spacing: 5px 10px; + padding-left: 5px; + padding-right: 5px; + + border-collapse: unset; +} + +.sponsorSkipNotice { + width: 100%; +} + +.sponsorSkipNoticeTableContainer { + color: white; + background-color: rgba(28, 28, 28, 0.9); + border-radius: 5px; + min-width: 100%; +} + +.exportCopiedNotice .sponsorSkipNoticeTableContainer { + background-color: transparent; +} + +.sponsorSkipNotice { + transition: all 0.1s ease-out; +} + +.sponsorSkipNoticeLimitWidth { + max-width: calc(100% - 50px); +} + +.sponsorSkipNotice .sbhidden { + display: none; +} + +/* For Cloudtube */ +.sponsorSkipNotice td, .sponsorSkipNotice table, .sponsorSkipNotice th { + border: none; +} + +.sponsorSkipNoticeFadeIn { + animation: fadeIn 0.5s ease-out; +} + +.sponsorSkipNoticeFadeIn.sponsorSkipNoticeFaded { + animation: fadeInToFaded 0.5s ease-out; +} + +.exportCopiedNotice .sponsorSkipNoticeFadeIn { + animation: none; +} + +.sponsorSkipNoticeFaded { + opacity: 0.5; +} + +.sponsorSkipNoticeFadeOut { + transition: opacity 3s cubic-bezier(0.55, 0.055, 0.675, 0.19); + opacity: 0 !important; + animation: none !important; +} + +.sponsorSkipNotice .sponsorSkipNoticeTimeLeft { + color: #eeeeee; + + border-radius: 4px; + padding: 2px 5px; + font-size: 12px; + + display: flex; + align-items: center; + + border: 1px solid #eeeeee; +} + +.sponsorSkipNoticeTimeLeft img { + vertical-align: middle; + height: 13px; + + padding-top: 7.8%; + padding-bottom: 7.8%; +} + +.noticeLeftIcon { + display: flex; + align-items: center; +} + +.sponsorSkipNotice .sponsorSkipNoticeUnskipSection { + float: left; + + border-left: 1px solid rgb(150, 150, 150); +} + +.sponsorSkipNoticeButton { + background: none; + color: rgb(235, 235, 235); + border: none; + display: inline-block; + font-size: 13.3333px !important; + + cursor: pointer; + + margin-right: 10px; + + padding: 2px 5px; +} + +.sponsorSkipNoticeButton:hover { + background-color: rgba(235, 235, 235,0.2); + border-radius: 4px; + + transition: background-color 0.4s; +} + +.sponsorTimesVoteButtonsContainer { + float: left; + vertical-align:middle; + padding: 2px 5px; + + margin-right: 4px; +} + +.sponsorTimesVoteButtonsContainer div{ + display: inline-block; +} + +.sponsorSkipNoticeRightSection { + right: 0; + position: absolute; + + float: right; + + margin-right: 10px; + display: flex; + align-items: center; +} + +.sponsorSkipNoticeRightButton { + margin-right: 0; +} + +.sponsorSkipNoticeCloseButton { + height: 10px; + width: 10px; + box-sizing: unset; + + padding: 2px 5px; + + margin-left: 2px; + float: right; +} + +.sponsorSkipNoticeCloseButton.biggerCloseButton { + padding: 20px; +} + +.sponsorSkipMessage { + font-size: 14px; + font-weight: bold; + color: rgb(235, 235, 235); + + margin-top: auto; + display: inline-block; + margin-right: 10px; + margin-bottom: auto; +} + +.sponsorSkipInfo { + font-size: 10px; + color: #000000; + text-align: center; + margin-top: 0px; +} + +#sponsorTimesThanksForVotingText { + font-size: 20px; + font-weight: bold; + color: #000000; + text-align: center; + margin-top: 0px; + margin-bottom: 0px; +} + +#sponsorTimesThanksForVotingInfoText { + font-size: 12px; + font-weight: bold; + color: #000000; + text-align: center; + margin-top: 0px; +} + +.sponsorTimesVoteButtonMessage { + float: left; +} + +.sponsorTimesInfoMessage { + font-size: 13.3333px; + color: rgb(235, 235, 235); + overflow-wrap: anywhere; +} + +.sb-guidelines-notice .sponsorTimesInfoMessage td { + padding-left: 5px; + padding-top: 2px; + padding-bottom: 2px; + font-size: 15px; + + display: flex; + align-items: center; +} + +.sponsorTimesInfoIcon { + width: 30px; + padding-right: 10px; + padding-left: 10px; +} + +.segmentSummary { + outline: none !important; +} + +.submitButton { + background-color:#ec1c1c; + -moz-border-radius:28px; + -webkit-border-radius:28px; + border-radius:28px; + border:1px solid #d31919; + display:inline-block; + cursor:pointer; + color:#ffffff; + font-size:14px; + padding:4px 15px; + text-decoration:none; + text-shadow:0px 0px 0px #662727; + + margin-top: 5px; + margin-right: 15px; +} +.submitButton:hover { + background-color:#bf2a2a; +} + +.submitButton:focus { + outline: none; + background-color:#bf2a2a; +} + +.submitButton:active { + position:relative; + top:1px; +} + +@keyframes rotate { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +.sponsorSkipButton { + background-color:#ec1c1c; + -moz-border-radius:28px; + -webkit-border-radius:28px; + border-radius:28px; + border:1px solid #d31919; + display:inline-block; + cursor:pointer; + color:#ffffff; + font-size:14px; + padding:4px 15px; + text-decoration:none; + text-shadow:0px 0px 0px #662727; + + margin-top: 5px; + margin-right: 15px; +} +.sponsorSkipButton:hover { + background-color:#bf2a2a; +} + +.sponsorSkipButton:focus { + outline: none; + background-color:#bf2a2a; +} + +.sponsorSkipButton:active { + position:relative; + top:1px; +} + +.sponsorSkipDontShowButton { + -moz-box-shadow:inset 0px 1px 0px 0px #cf866c; + -webkit-box-shadow:inset 0px 1px 0px 0px #cf866c; + box-shadow:inset 0px 1px 0px 0px #cf866c; + background-color:#d0451b; + -moz-border-radius:3px; + -webkit-border-radius:3px; + border-radius:3px; + border:1px solid #942911; + display:inline-block; + cursor:pointer; + color:#ffffff; + font-size:13px; + padding:6px 24px; + text-decoration:none; + text-shadow:0px 1px 0px #854629; +} +.sponsorSkipDontShowButton:hover { + background-color:#bc3315; +} + +.sponsorSkipDontShowButton:focus { + outline: none; + background-color:#bc3315; +} + +.sponsorSkipDontShowButton:active { + position:relative; + top:1px; +} + +/* Submission Notice */ + +.sponsorTimeDisplay { + font-size: 15px; +} + +.sponsorTimeEditButton { + text-decoration: underline; + + margin-left: 13px; + margin-right: 13px; + + font-size: 13px; + + cursor: pointer; +} + +.sponsorTimeEdit > input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +.sponsorTimeMessagesRow { + max-height: 300px; + display: flex; + + overflow: auto; +} + +.sponsorTimeEdit { + font-size: 14px; + + -moz-appearance: textfield; + appearance: textfield; +} + +.sponsorTimeEditInput { + width: 90px; + border: 3px solid var(--sb-dark-red-outline); +} + +.sponsorTimeEditInput.sponsorChapterNameInput { + width: auto; + padding: 3px; +} + +.sponsorNowButton { + font-size: 11px; + + cursor: pointer; + text-decoration: underline; +} + +.sponsorTimeEditSelector { + margin-top: 5px; + margin-bottom: 5px; + + background-color: rgba(28, 28, 28, 0.9); + border-color: var(--sb-dark-red-outline); + color: white; + border-width: 3px; + padding: 3px; +} + +.sponsorTimeEditSelector > option { + background-color: rgba(28, 28, 28, 0.9); + color: white; +} + +.hideSegmentSubmitButton { + cursor: pointer; + margin: auto; + top: 0; + bottom: 0; + position: absolute; +} + +/* Start SelectorComponent */ + +.sbSelector { + position: absolute; + text-align: center; + width: calc(100% - var(--skip-notice-right) - var(--skip-notice-padding) * 2 - var(--skip-notice-margin) * 2 - var(--skip-notice-border-horizontal) * 2); + + z-index: 1000; +} + +.sbSelectorBackground { + text-align: center; + + background-color: rgba(28, 28, 28, 0.9); + border-radius: 6px; + padding: 3px; + margin: auto; + width: 170px; +} + +.sbSelectorOption { + cursor: pointer; + background-color: rgb(43, 43, 43); + padding: 5px; + margin: 5px; + color: white; + border-radius: 5px; + font-size: 14px; + + margin-left: auto; + margin-right: auto; +} + +.sbSelectorOption:hover { + background-color: #3a0000; +} + +/* End SelectorComponent */ + +.helpButton { + height: 25px; + cursor: pointer; + padding: 5px; + + margin: auto; + top: 0; + bottom: 0; + position: absolute; +} +.helpButton:hover { + opacity: 0.8; +} + +.skipButtonControlBarContainer { + cursor: pointer; + display: flex; + color: white; + align-items: center; +} + +/* July 2025 test UI */ +.ytp-delhi-modern .skipButtonControlBarContainer { + height: 48px; + margin: auto 0; +} + +.skipButtonControlBarContainer.sbhidden { + display: none !important; +} + +.skipButtonControlBarContainer.mobile { + bottom: 30%; + margin-left: 5px; + position: absolute; + height: 20px; + + background-color: #00000030; + opacity: 0.5; + border-radius: 10px; + padding: 4px; +} + +.skipButtonControlBarContainer.mobile.textDisabled { + padding: 0; + background-color: transparent; +} + +.skipButtonControlBarContainer.mobile > div { + margin: auto; + margin-left: 5px; +} + +#sbSkipIconControlBarImage { + height: 60%; + top: 0px; + bottom: 0px; + display: block; + margin: auto; +} + +.mobile #sbSkipIconControlBarImage { + height: 100%; + width: 20px; +} + +.sponsorBlockTooltip { + position: absolute; + background-color: rgba(28, 28, 28, 0.7); + border-radius: 5px; + padding: 10px; + max-width: 300px; + width: max-content; + white-space: normal; + line-height: 1.5em; + color: white; + font-size: 12px; + z-index: 10000; + font-weight: normal; +} + +.sponsorBlockTooltip a { + color: white; +} + +.sponsorBlockTooltip.sbTriangle::after { + content: " "; + position: absolute; + top: 100%; + left: 15%; + margin-left: -15px; + border-width: 15px; + border-style: solid; + border-color: rgba(28, 28, 28, 0.7) transparent transparent transparent; +} + +.sponsorBlockTooltip.sbTriangle.centeredSBTriangle::after { + left: 50%; + right: 50%; +} + +.sponsorBlockTooltip.sbTriangle.sbTopTriangle::after { + bottom: 100%; + top: unset; + border-color: transparent transparent rgba(28, 28, 28, 0.7) transparent; +} + +.sponsorBlockLockedColor { + color: #ffc83d !important; +} + +.sponsorBlockRectangleTooltip { + position: absolute; + border-radius: 5px; + padding: 10px; + min-width: 250px; + min-height: 75px; + white-space: normal; + line-height: 1.5em; +} + +/* Description on right layout */ +#title > #categoryPillParent { + font-size: 2rem; + font-weight: bold; + display: flex; + justify-content: center; + line-height: 2.8rem; +} +#title > #categoryPillParent > #categoryPill.cbPillOpen { + margin-bottom: 5px; +} + +#categoryPillParent { + height: fit-content; + margin-top: auto; + margin-bottom: auto; + + position: relative; +} + +.sponsorBlockCategoryPill { + border-radius: 25px; + padding-left: 8px; + padding-right: 8px; + margin-right: 3px; + cursor: pointer; + font-size: 75%; + height: 100%; + align-items: center; + inline-size: max-content; +} + +.sponsorBlockCategoryPillTitleSection { + display: flex; + align-items: center; +} + +.sponsorBlockCategoryPillTitle { + white-space: nowrap; +} + +/* Vorapis V3 support */ +#watch7-content .sponsorBlockCategoryPill { + padding-top: 5px; + padding-bottom: 5px; +} +#watch7-content .sponsorBlockCategoryPillTitle { + font-size: 15px; +} + +.categoryPillClose { + display: none; + height: 10px; + width: 10px; + box-sizing: unset; + + margin: 0px 0px 0px 5px; +} + +.sponsorBlockCategoryPill:hover .categoryPillClose { + display: inherit; +} + +/* tweak for mobile duration */ +#sponsorBlockDurationAfterSkips.ytm-time-display { + padding-left: 4px; + margin: 0px; + color: #fff; + opacity: .7; +} + +/* full video labels on thumbnails */ +.sponsorThumbnailLabel { + display: none; + position: absolute; + top: 0; + left: 0; + padding: 0.5em; + margin: 0.5em; + border-radius: 2em; + z-index: 1000; + background-color: var(--category-color, #000); + opacity: 0.7; + box-shadow: 0 0 8px 2px #333; + font-size: 10px; +} + +.sponsorThumbnailLabel.sponsorThumbnailLabelVisible { + display: flex; +} + +.sponsorThumbnailLabel svg { + height: 2em; + fill: var(--category-text-color, #fff); +} + +.sponsorThumbnailLabel span { + display: none; + padding-left: 0.25em; + font-size: 1.5em; + color: var(--category-text-color, #fff); +} + +.sponsorThumbnailLabel:hover { + border-radius: 0.25em; + opacity: 1; +} + +.sponsorThumbnailLabel:hover span { + display: inline; +} + +.sponsorblock-chapter-visible { + display: block !important; +} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/help/images/popup.png b/data/extensions/sponsorBlocker@ajay.app/help/images/popup.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/help/images/submission menu.png b/data/extensions/sponsorBlocker@ajay.app/help/images/submission menu.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/help/images/votebuttons.gif b/data/extensions/sponsorBlocker@ajay.app/help/images/votebuttons.gif Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/help/images/voting on notice.gif b/data/extensions/sponsorBlocker@ajay.app/help/images/voting on notice.gif Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/help/index.html b/data/extensions/sponsorBlocker@ajay.app/help/index.html @@ -0,0 +1,148 @@ +<!DOCTYPE html> + +<head> + <title> SponsorBlock </title> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link rel="icon" href="../icons/IconSponsorBlocker32px.png" type="image/png"> + + <link href="styles.css" rel="stylesheet"/> + + <script src="../js/help.js"></script> +</head> + +<body> + + <div id="title"> + <img src="../icons/LogoSponsorBlocker256px.png" height="80" class="profilepic"/> + SponsorBlock + </div> + + <div class="container sponsorBlockPageBody"> + + <p class="createdBy"> + <img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/> + Created By <a href="https://ajay.app">Ajay Ramachandran</a> + </p> + + <span class="help-page-flex-container"> + <div class="left-sidebar"> + <div class="box1"> + <p> + __MSG_helpPageThanksForInstalling__ By using this extension, you agree to the <a href="https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796">Privacy Policy</a> and <a href="https://gist.github.com/ajayyy/9e8100f069348e0bc062641f34d6af12">Terms of Use</a>. + </p> + + <p> + Come contribute, make some suggestions and help out on <a href="https://discord.gg/SponsorBlock">Discord</a> or on <a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org">Matrix</a>. + </p> + + <a href="https://dearrow.ajay.app" + target="_blank" + id="dearrow-link" + class="dearrow-link hidden" + rel="noreferrer"> + <img src="/icons/dearrow.svg"/> + + <span id="dearrow-link-text"> + + </span> + + <img src="/icons/close.png" class="close-button"/> + </a> + + <div id="donate-component" class="donate-ask"> + <div class="donate-text"> + <img + src="../icons/newprofilepic.jpg" + alt="Ajay's avatar" + ></img> + __MSG_supportSponsorBlock__ + </div> + + <a href="https://sponsor.ajay.app/donate" class="donate-button" target="_blank" rel="noopener"> + __MSG_Donate__ + </a> + </div> + </div> + <div class="box3"> + <h1>__MSG_helpPageHowSkippingWorks__</h1> + + <p class="projectPreview"> + __MSG_helpPageHowSkippingWorks2__ + </p> + + <div class="center"><img src="images/voting on notice.gif"></div> + + <p class="projectPreview"> + __MSG_helpPageHowSkippingWorks1__ + </p> + + <div class="center"><img style="height: 400px;" src="images/popup.png"></div> + + <h1>__MSG_Submitting__</h1> + + <p class="projectPreview"> + __MSG_helpPageSubmitting1__ + </p> + + <div class="center"><img src="images/votebuttons.gif"></div> + + <p class="projectPreview"> + __MSG_helpPageSubmitting2__ + </p> + + <div class="center"><img src="images/submission menu.png"></div> + + <p class="projectPreview center"> + <a href="https://wiki.sponsor.ajay.app/w/Guidelines" target="_blank">__MSG_guidelines__</a> + <br/> + <a href="https://wiki.sponsor.ajay.app/w/Advice_for_submitting" target="_blank">__MSG_AdviceForSubmitting__</a> + </p> + + <h1>__MSG_helpPageCopyOfDatabase__</h1> + + <p> + __MSG_helpPageCopyOfDatabase1__ <a href="https://sponsor.ajay.app/database">https://sponsor.ajay.app/database</a>. __MSG_helpPageCopyOfDatabase2__ + </p> + + <h4 style="display: inline">Client:</h4> + <!-- Github logo --> + <a href="https://github.com/ajayyy/SponsorBlock"><svg aria-hidden="true" version="1.1" viewBox="0 0 16 16" height="58px" style="padding-left: 15px"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a> + + <h4 style="display: inline; padding-left: 20px">Server:</h4> + <!-- Github logo --> + <a href="https://github.com/ajayyy/SponsorBlockServer"><svg aria-hidden="true" version="1.1" viewBox="0 0 16 16" height="58px" style="padding-left: 15px"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a> + + <h1>__MSG_Credits__</h1> + + <p> + Thanks to all <a href="https://github.com/ajayyy/SponsorBlock/graphs/contributors">SponsorBlock contributors</a>, + <a href="https://github.com/ajayyy/SponsorBlockServer/graphs/contributors">SponsorBlockServer contributors</a> and + <a href="https://github.com/ajayyy/SponsorBlockSite/graphs/contributors">SponsorBlockSite contributors</a> such + as <a href="https://github.com/NDevTK">NDev</a>, <a href="https://github.com/Joe-Dowd">Joe Dowd</a>, + <a href="https://mchang.name/">Michael Chang</a> and more. + </p> + + <p> + Logo by <a href="https://github.com/munadikieh">Munadi Kiehl</a> + </p> + + <p>Some icons made by <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="https://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></p> + + <p>Some icons made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="https://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></p> + + <p style="text-align: center;"><a href="/oss-attribution/attribution.txt">Open Source Licenses</a></p> + </div> + </div> + + <div class="box2"> + <p style="margin-bottom: 0; margin-top: 0" class="bigText center">__MSG_helpPageReviewOptions__</p> + + <p class="smallText" style="margin-bottom: 0; margin-top: 0"> + __MSG_helpPageFeatureDisclaimer__ + </p> + + <iframe class="optionsFrame" src="../options/options.html#embed" style="border: none"></iframe> + </div> + </span> +</body> diff --git a/data/extensions/sponsorBlocker@ajay.app/help/styles.css b/data/extensions/sponsorBlocker@ajay.app/help/styles.css @@ -0,0 +1,448 @@ +:root { + --color-scheme: dark; + --background: #333333; + --header-color: #212121; + --dialog-background: #181818; + --dialog-border: white; + --text: #c4c4c4; + --title: #dad8d8; + --disabled: #520000; + --black: black; + --white: white; +} + +[data-theme="light"] { + --color-scheme: light; + --background: #f9f9f9; + --header-color: white; + --dialog-background: #f9f9f9; + --dialog-border: #282828; + --text: #262626; + --title: #707070; + --disabled: #ffcaca; + --black: white; + --white: black; +} + +html { + color-scheme: var(--color-scheme); +} + +.bigText { + font-size: 30px; +} + +.smallText { + font-size: 14px; +} + +body { + background-color: var(--background); + font-family: sans-serif; +} + +.center { + text-align: center; +} + +.inline { + display: inline-block; +} + +.container { + margin: auto; +} + +.projectPreview { + position: relative; +} + +.projectPreviewImage { + position: absolute; + left: -90px; + width: 80px; + top: 50%; + transform: translateY(-50%); +} + +.projectPreviewImageLarge { + position: absolute; + left: -210px; + width: 200px; + top: 50%; + transform: translateY(-20%); +} + +.createdBy { + font-size: 14px; + text-align: center; + padding-top: 0px; + padding-bottom: 0px; +} + +#title { + background-color: #636363; + + text-align: center; + vertical-align: middle; + + font-size: 50px; + color: var(--header-color); + + padding: 20px; + + text-decoration: none; + + border-radius: 15px; + + transition: font-size 1s; +} + +.subtitle { + font-size: 40px; + color: #dad8d8; + + padding-top: 10px; + + transition: font-size 0.4s; +} + +.subtitle:hover { + font-size: 45px; + + transition: font-size 0.4s; +} + +.profilepic { + background-color: #636363 !important; + vertical-align: middle; +} + +.profilepiccircle { + vertical-align: middle; + overflow: hidden; + border-radius: 50%; +} + +a { + text-decoration: underline; + color: inherit; +} + +.link { + padding: 20px; + + height: 80px; + + transition: height 0.2s; +} + +.link:hover { + height: 95px; + + transition: height 0.2s; +} + +#contact,.smalllink { + font-size: 25px; + color: #e8e8e8; + + text-align: center; + + padding: 10px; +} + +#contact { + text-decoration: none; +} + +p,li { + font-size: 16px; +} + +p,li,a,span,div { + color: var(--text); +} + +p,li,code,a { + text-align: left; + overflow-wrap: break-word; +} + +.optionsFrame { + width: 100%; + height: 100%; +} + +.previewImage { + max-height: 200px; +} + +img { + max-width: 100%; + + text-align: center; +} + +#recentPostTitle { + font-size: 30px; + color: #dad8d8; +} + +#recentPostDate { + font-size: 15px; + color: #dad8d8; +} + +h1,h2,h3,h4,h5,h6 { + color: var(--title); + text-align: center; + + font-size: 25px; + margin: 5px 0px; +} + +svg { + text-decoration: none; +} + +.donate-ask { + background-color: rgb(26, 26, 26, 0.95); + border-radius: 15px; + + text-align: center; + padding: 10px; + + margin: 0.7em 0px; +} + +.donate-ask .donate-text { + margin-top: 10px; + margin-bottom: 10px; + + display: flex; + align-items: center; + justify-content: center; +} + +.donate-ask .donate-text img { + height: 2rem; + border-radius: 100%; + + margin-right: 15px; +} + +.donate-ask a { + text-decoration: none; + color: #eee; + border-radius: 15px; + background-color: rgb(58, 58, 58, 0.9); + padding: 10px; + + transition: background-color 0.3s ease; + + display: block; + width: fit-content; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; +} + +.donate-ask a:hover { + background-color: rgba(70, 70, 70, 0.9); +} + +@media screen and (orientation:portrait) { + .projectPreviewImage { + position: unset; + width: 50%; + display: block; + margin: auto; + transform: none; + } + + .projectPreviewImageLarge { + position: unset; + left: 0; + width: 50%; + display: block; + margin: auto; + transform: unset; + } + + .container { + max-width: 100%; + margin: 5px; + text-align: center; + } + + p,li,code,a { + text-align: center; + } +} + +/* keybind dialog */ +.key { + border-width: 1px; + border-style: solid; + border-radius: 5px; + display: inline-block; + min-width: 33px; + text-align: center; + font-weight: bold; + border-color: var(--white); + box-sizing: border-box; +} + +.unbound, .key { + padding: 8px; +} + +#keybind-dialog .dialog { + position: fixed; + border-width: 3px; + border-style: solid; + border-radius: 15px; + max-height: 100vh; + width: 400px; + overflow-x: auto; + z-index: 100; + padding: 15px; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + font-size: 14px; + background-color: var(--dialog-background); + border-color: var(--dialog-border); +} + +#change-keybind-buttons { + float: right; +} + +#change-keybind-buttons > .option-button { + margin: 0 2px; +} + +#change-keybind-settings { + margin: 15px 15px 30px; +} + +#change-keybind-settings .key { + vertical-align: top; + margin: 15px 0 0 40px; + height: 34px; +} + +#change-keybind-error { + margin-bottom: 15px; + color: red; + font-weight: bold; +} + +.blocker { + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + z-index: 90; + background-color: #00000080; +} + +.option-button { + cursor: pointer; + + background-color: #c00000; + padding: 10px; + color: white; + border-radius: 5px; + font-size: 14px; + + width: max-content; +} + +.option-button:hover:not(.disabled) { + background-color: #fc0303; +} + +.option-button.disabled { + cursor: default; + background-color: var(--disabled); + color: grey; +} + +.dearrow-link { + display: flex; + align-items: center; + justify-content: center; + text-decoration: none; + + font-size: 16px; +} + +.dearrow-link img { + width: 35px; + padding: 10px +} + +.dearrow-link .close-button { + opacity: 0; + width: 15px; + filter: invert(0.3); + transition: opacity 0.2s; +} + +.dearrow-link:hover .close-button { + opacity: 1; +} + +.hidden { + display: none; +} + +.help-page-flex-container { + display: flex; + flex-direction: row; + gap: 20px; + margin-left: 20px; + margin-right: 20px; +} + +.left-sidebar { + display: flex; + flex-direction: column; + + flex: 1 1 50%; +} + +.box2 { + flex: 1 1 50%; +} + +/* Mobile */ +@media only screen and (max-width: 600px) { + .box1 { + order: 1; + } + + .box2 { + order: 2; + } + + .box3 { + order: 3; + } + + .left-sidebar { + display: contents; + } + + .help-page-flex-container { + flex-direction: column; + } + + .optionsFrame { + height: 500px; + } +} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker1024px.png b/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker1024px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker128px.png b/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker128px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker16px.png b/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker16px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker256px.png b/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker256px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker32px.png b/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker32px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker512px.png b/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker512px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker64px.png b/data/extensions/sponsorBlocker@ajay.app/icons/IconSponsorBlocker64px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker1024px.png b/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker1024px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker128px.png b/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker128px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker256px.png b/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker256px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker512px.png b/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker512px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker64px.png b/data/extensions/sponsorBlocker@ajay.app/icons/LogoSponsorBlocker64px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/PlayerCancelSegmentIconSponsorBlocker.svg b/data/extensions/sponsorBlocker@ajay.app/icons/PlayerCancelSegmentIconSponsorBlocker.svg @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 565.15 568" + version="1.1" + id="svg16" + sodipodi:docname="PlayerCancelSegmentIconSponsorBlocker.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:export-filename="D:\Dell Data\_Projects\_____SponsorSkip\ignored\svg\SponsorBlocker4.png" + inkscape:export-xdpi="43.436523" + inkscape:export-ydpi="43.436523"> + <metadata + id="metadata20"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>LogoSponsorBlocker2</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1001" + id="namedview18" + showgrid="false" + inkscape:zoom="0.83098592" + inkscape:cx="220.07455" + inkscape:cy="308.76246" + inkscape:window-x="477" + inkscape:window-y="961" + inkscape:window-maximized="1" + inkscape:current-layer="svg16" + inkscape:pagecheckerboard="true" /> + <defs + id="defs4"> + <style + id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style> + </defs> + <title + id="title6">LogoSponsorBlocker2</title> + <path + class="cls-1" + d="m 282.58,568 a 65,65 0 0 1 -34.14,-9.66 C 95.41,463.94 2.54,300.46 0,121 a 64.91,64.91 0 0 1 34,-58.09 522.56,522.56 0 0 1 497.16,0 64.91,64.91 0 0 1 34,58.12 c -2.53,179.43 -95.4,342.91 -248.42,437.3 A 65,65 0 0 1 282.58,568 Z m 0,-548.31 A 502.24,502.24 0 0 0 43.4,80.22 45.27,45.27 0 0 0 19.7,120.75 c 2.44,172.67 91.81,330 239.07,420.83 a 46.19,46.19 0 0 0 47.61,0 C 453.64,450.73 543,293.42 545.45,120.75 A 45.26,45.26 0 0 0 521.75,80.21 502.26,502.26 0 0 0 282.58,19.69 Z" + id="path8" + inkscape:connector-curvature="0" + style="fill:#ffffff" /> + <path + style="fill:#ffffff" + d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 224.94922 162.35352 L 282.57422 219.98047 L 340.20117 162.35352 L 384.33984 206.49219 L 326.71484 264.11719 L 384.33984 321.74414 L 340.20117 365.88281 L 282.57422 308.25781 L 224.94922 365.88281 L 180.81055 321.74414 L 238.4375 264.11719 L 180.81055 206.49219 L 224.94922 162.35352 z " + id="path10" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/PlayerDeleteIconSponsorBlocker.svg b/data/extensions/sponsorBlocker@ajay.app/icons/PlayerDeleteIconSponsorBlocker.svg @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 565.15 568" + version="1.1" + id="svg16" + sodipodi:docname="PlayerDeleteIconSponsorBlocker.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:export-filename="D:\Dell Data\_Projects\_____SponsorSkip\ignored\svg\SponsorBlocker4.png" + inkscape:export-xdpi="43.436523" + inkscape:export-ydpi="43.436523"> + <metadata + id="metadata20"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>LogoSponsorBlocker2</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1001" + id="namedview18" + showgrid="false" + inkscape:zoom="0.83098592" + inkscape:cx="209.2657" + inkscape:cy="235.85704" + inkscape:window-x="477" + inkscape:window-y="961" + inkscape:window-maximized="1" + inkscape:current-layer="svg16" /> + <defs + id="defs4"> + <style + id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style> + </defs> + <title + id="title6">LogoSponsorBlocker2</title> + <path + class="cls-1" + d="m 282.58,568 a 65,65 0 0 1 -34.14,-9.66 C 95.41,463.94 2.54,300.46 0,121 a 64.91,64.91 0 0 1 34,-58.09 522.56,522.56 0 0 1 497.16,0 64.91,64.91 0 0 1 34,58.12 c -2.53,179.43 -95.4,342.91 -248.42,437.3 A 65,65 0 0 1 282.58,568 Z m 0,-548.31 A 502.24,502.24 0 0 0 43.4,80.22 45.27,45.27 0 0 0 19.7,120.75 c 2.44,172.67 91.81,330 239.07,420.83 a 46.19,46.19 0 0 0 47.61,0 C 453.64,450.73 543,293.42 545.45,120.75 A 45.26,45.26 0 0 0 521.75,80.21 502.26,502.26 0 0 0 282.58,19.69 Z" + id="path8" + inkscape:connector-curvature="0" + style="fill:#ffffff" /> + <path + style="fill:#ffffff" + d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 184.84375 113.77344 L 380.30664 113.77344 L 380.30664 161.31836 L 184.84375 161.31836 L 184.84375 113.77344 z M 184.84375 174.45703 L 380.30469 174.45703 L 380.30469 430.16992 L 184.84375 430.16992 L 184.84375 174.45703 z " + id="path10" /> + <g + id="g849" + transform="matrix(1.1485222,0,0,1.1485222,-41.968703,-56.737897)" + style="fill:#ffffff"> + <g + id="g869" + style="fill:#ffffff"> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.84762007;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 223.01024,230.22964 H 245.1343 V 395.01181 H 223.01024 Z" + id="rect857" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.84762007;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 271.51297,230.22964 h 22.12406 v 164.78217 h -22.12406 z" + id="rect859" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.84762007;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 317.46292,230.22964 h 22.12406 v 164.78217 h -22.12406 z" + id="rect861" /> + </g> + </g> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/PlayerInfoIconSponsorBlocker.svg b/data/extensions/sponsorBlocker@ajay.app/icons/PlayerInfoIconSponsorBlocker.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" id="svg16" version="1.1" viewBox="0 0 565.15 568"> + <defs/> + <defs id="defs4"/> + <path id="path8" fill="#fff" d="M282.58 568a65 65 0 01-34.14-9.66C95.41 463.94 2.54 300.46 0 121a64.91 64.91 0 0134-58.09 522.56 522.56 0 01497.16 0 64.91 64.91 0 0134 58.12c-2.53 179.43-95.4 342.91-248.42 437.3a65 65 0 01-34.16 9.67zm0-548.31A502.24 502.24 0 0043.4 80.22a45.27 45.27 0 00-23.7 40.53c2.44 172.67 91.81 330 239.07 420.83a46.19 46.19 0 0047.61 0C453.64 450.73 543 293.42 545.45 120.75a45.26 45.26 0 00-23.7-40.54 502.26 502.26 0 00-239.17-60.52z"/> + <path id="path10" fill="#fff" d="M284.705 42.693A479.9 479.9 0 0054.37 100.42a22.53 22.53 0 00-11.7 20c2.4 169.84 93.001 318.22 228.161 401.59a22.48 22.48 0 0023.49 0c135.16-83.37 225.76-231.75 228.16-401.59a22.53 22.53 0 00-11.7-20 479.9 479.9 0 00-226.075-57.727zm-2.13 59.344c89.347 0 162.081 72.712 162.081 162.08 0 89.368-72.734 162.082-162.082 162.082-89.368 0-162.08-72.714-162.08-162.082s72.712-162.08 162.08-162.08zm0 30.389c-72.613 0-131.692 59.079-131.692 131.691 0 72.613 59.079 131.692 131.691 131.692 72.613 0 131.692-59.08 131.692-131.692 0-72.612-59.08-131.691-131.692-131.691zm-2.563 16.695c14.121 0 24.363 10.606 24.363 24.049 0 13.483-10.272 23.432-24.697 23.432-14.73 0-24.354-9.949-24.354-23.432 0-13.443 9.624-24.049 24.688-24.049zm-34.938 68.691h57.397l-.02 134.692 18.295.973v25.638h-76.32v-24.373l10.586-.953c5.754-.638 9.279-2.573 9.279-10.271v-89.155c0-7.08-1.905-9.32-8.014-9.32l-11.203-.629v-26.601z"/> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/PlayerStartIconSponsorBlocker.svg b/data/extensions/sponsorBlocker@ajay.app/icons/PlayerStartIconSponsorBlocker.svg @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 565.15 568" + version="1.1" + id="svg16" + sodipodi:docname="PlayerStartIconSponsorBlocker.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata20"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1001" + id="namedview18" + showgrid="false" + inkscape:zoom="0.83098592" + inkscape:cx="-0.3618106" + inkscape:cy="322.44266" + inkscape:window-x="477" + inkscape:window-y="961" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1-2" /> + <defs + id="defs4"> + <style + id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style> + </defs> + <title + id="title6">LogoSponsorBlocker2</title> + <g + id="Layer_2" + data-name="Layer 2"> + <g + id="Layer_1-2" + data-name="Layer 1" + style="fill:#ffffff"> + <path + class="cls-1" + d="M282.58,568a65,65,0,0,1-34.14-9.66C95.41,463.94,2.54,300.46,0,121A64.91,64.91,0,0,1,34,62.91a522.56,522.56,0,0,1,497.16,0,64.91,64.91,0,0,1,34,58.12c-2.53,179.43-95.4,342.91-248.42,437.3A65,65,0,0,1,282.58,568Zm0-548.31A502.24,502.24,0,0,0,43.4,80.22a45.27,45.27,0,0,0-23.7,40.53c2.44,172.67,91.81,330,239.07,420.83a46.19,46.19,0,0,0,47.61,0C453.64,450.73,543,293.42,545.45,120.75a45.26,45.26,0,0,0-23.7-40.54A502.26,502.26,0,0,0,282.58,19.69Z" + id="path8" + style="fill:#ffffff" /> + <path + style="fill:#ffffff" + d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 220.41016 145.74023 L 411.2793 255.93945 L 220.41016 366.14062 L 220.41016 145.74023 z " + id="path10" /> + </g> + </g> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/PlayerStopIconSponsorBlocker.svg b/data/extensions/sponsorBlocker@ajay.app/icons/PlayerStopIconSponsorBlocker.svg @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 565.15 568" + version="1.1" + id="svg16" + sodipodi:docname="PlayerStopIconSponsorBlocker.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:export-filename="D:\Dell Data\_Projects\_____SponsorSkip\ignored\svg\SponsorBlocker4.png" + inkscape:export-xdpi="43.436523" + inkscape:export-ydpi="43.436523"> + <metadata + id="metadata20"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>LogoSponsorBlocker2</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1001" + id="namedview18" + showgrid="false" + inkscape:zoom="0.83098595" + inkscape:cx="194.89884" + inkscape:cy="305.06785" + inkscape:window-x="477" + inkscape:window-y="961" + inkscape:window-maximized="1" + inkscape:current-layer="svg16" /> + <defs + id="defs4"> + <style + id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style> + </defs> + <title + id="title6">LogoSponsorBlocker2</title> + <path + class="cls-1" + d="m 282.58,568 a 65,65 0 0 1 -34.14,-9.66 C 95.41,463.94 2.54,300.46 0,121 a 64.91,64.91 0 0 1 34,-58.09 522.56,522.56 0 0 1 497.16,0 64.91,64.91 0 0 1 34,58.12 c -2.53,179.43 -95.4,342.91 -248.42,437.3 A 65,65 0 0 1 282.58,568 Z m 0,-548.31 A 502.24,502.24 0 0 0 43.4,80.22 45.27,45.27 0 0 0 19.7,120.75 c 2.44,172.67 91.81,330 239.07,420.83 a 46.19,46.19 0 0 0 47.61,0 C 453.64,450.73 543,293.42 545.45,120.75 A 45.26,45.26 0 0 0 521.75,80.21 502.26,502.26 0 0 0 282.58,19.69 Z" + id="path8" + inkscape:connector-curvature="0" + style="fill:#ffffff" /> + <path + style="fill:#ffffff" + d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 187.11914 147.00977 L 378.03125 147.00977 L 378.03125 351.04102 L 187.11914 351.04102 L 187.11914 147.00977 z " + id="path10" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/PlayerUploadFailedIconSponsorBlocker.svg b/data/extensions/sponsorBlocker@ajay.app/icons/PlayerUploadFailedIconSponsorBlocker.svg @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 565.15 568" + version="1.1" + id="svg16" + sodipodi:docname="PlayerUploadFailedIconSponsorBlocker.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:export-filename="D:\Dell Data\_Projects\_____SponsorSkip\ignored\svg\SponsorBlocker4.png" + inkscape:export-xdpi="43.436523" + inkscape:export-ydpi="43.436523"> + <metadata + id="metadata20"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>LogoSponsorBlocker2</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1001" + id="namedview18" + showgrid="false" + inkscape:zoom="0.83098592" + inkscape:cx="-277.20441" + inkscape:cy="286.71724" + inkscape:window-x="477" + inkscape:window-y="961" + inkscape:window-maximized="1" + inkscape:current-layer="svg16" /> + <defs + id="defs4"> + <style + id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style> + </defs> + <title + id="title6">LogoSponsorBlocker2</title> + <path + class="cls-1" + d="m 282.58,568 a 65,65 0 0 1 -34.14,-9.66 C 95.41,463.94 2.54,300.46 0,121 a 64.91,64.91 0 0 1 34,-58.09 522.56,522.56 0 0 1 497.16,0 64.91,64.91 0 0 1 34,58.12 c -2.53,179.43 -95.4,342.91 -248.42,437.3 A 65,65 0 0 1 282.58,568 Z m 0,-548.31 A 502.24,502.24 0 0 0 43.4,80.22 45.27,45.27 0 0 0 19.7,120.75 c 2.44,172.67 91.81,330 239.07,420.83 a 46.19,46.19 0 0 0 47.61,0 C 453.64,450.73 543,293.42 545.45,120.75 A 45.26,45.26 0 0 0 521.75,80.21 502.26,502.26 0 0 0 282.58,19.69 Z" + id="path8" + inkscape:connector-curvature="0" + style="fill:#ffffff" /> + <path + style="fill:#ffffff" + d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 282.57422 123.27344 C 302.2486 123.27344 318.08789 139.67142 318.08789 160.03906 L 318.08789 310.16211 C 318.08789 330.52975 302.2486 346.92773 282.57422 346.92773 C 262.89984 346.92773 247.0625 330.52975 247.0625 310.16211 L 247.0625 160.03906 C 247.0625 139.67142 262.89984 123.27344 282.57422 123.27344 z M 282.57422 373.71094 C 302.2487 373.71094 318.08789 389.55014 318.08789 409.22461 C 318.08789 428.89909 302.2487 444.73633 282.57422 444.73633 C 262.89975 444.73633 247.06055 428.89909 247.06055 409.22461 C 247.06055 389.55014 262.89975 373.71094 282.57422 373.71094 z " + id="path10" /> + <g + id="g821" + transform="translate(0,32.491428)" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/PlayerUploadIconSponsorBlocker.svg b/data/extensions/sponsorBlocker@ajay.app/icons/PlayerUploadIconSponsorBlocker.svg @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 565.15 568" + version="1.1" + id="svg16" + sodipodi:docname="PlayerUploadIconSponsorBlocker.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:export-filename="D:\Dell Data\_Projects\_____SponsorSkip\ignored\svg\SponsorBlocker4.png" + inkscape:export-xdpi="43.436523" + inkscape:export-ydpi="43.436523"> + <metadata + id="metadata20"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>LogoSponsorBlocker2</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1001" + id="namedview18" + showgrid="false" + inkscape:zoom="0.83098595" + inkscape:cx="-374.9496" + inkscape:cy="291.99093" + inkscape:window-x="477" + inkscape:window-y="961" + inkscape:window-maximized="1" + inkscape:current-layer="svg16" /> + <defs + id="defs4"> + <style + id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style> + </defs> + <title + id="title6">LogoSponsorBlocker2</title> + <path + class="cls-1" + d="m 282.58,568 a 65,65 0 0 1 -34.14,-9.66 C 95.41,463.94 2.54,300.46 0,121 a 64.91,64.91 0 0 1 34,-58.09 522.56,522.56 0 0 1 497.16,0 64.91,64.91 0 0 1 34,58.12 c -2.53,179.43 -95.4,342.91 -248.42,437.3 A 65,65 0 0 1 282.58,568 Z m 0,-548.31 A 502.24,502.24 0 0 0 43.4,80.22 45.27,45.27 0 0 0 19.7,120.75 c 2.44,172.67 91.81,330 239.07,420.83 a 46.19,46.19 0 0 0 47.61,0 C 453.64,450.73 543,293.42 545.45,120.75 A 45.26,45.26 0 0 0 521.75,80.21 502.26,502.26 0 0 0 282.58,19.69 Z" + id="path8" + inkscape:connector-curvature="0" + style="fill:#ffffff" /> + <path + style="fill:#ffffff" + d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 282.57422 112.11133 L 282.87109 112.11133 L 423.75977 365.75391 L 330.30273 365.75391 L 330.30273 409.21094 L 234.84766 409.21094 L 234.84766 365.75391 L 141.39062 365.75391 L 282.57422 112.11133 z " + id="path10" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker128px.png b/data/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker128px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker16px.png b/data/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker16px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker32px.png b/data/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker32px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker64px.png b/data/extensions/sponsorBlocker@ajay.app/icons/SafariIconSponsorBlocker64px.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/beep.oga b/data/extensions/sponsorBlocker@ajay.app/icons/beep.oga Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/bolt.svg b/data/extensions/sponsorBlocker@ajay.app/icons/bolt.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="bolt.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="13.125" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="482" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M19.95 42 22 27.9H14.7Q14.15 27.9 13.9 27.4Q13.65 26.9 13.9 26.45L26.15 6H28.2L26.15 20.05H33.35Q33.9 20.05 34.175 20.55Q34.45 21.05 34.2 21.5L22 42Z" + id="path2" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/campaign.svg b/data/extensions/sponsorBlocker@ajay.app/icons/campaign.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="campaign.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="13.125" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="482" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M36.5 25.5V22.5H44V25.5ZM39 40 32.95 35.5 34.75 33.1 40.8 37.6ZM34.9 14.85 33.1 12.45 39 8 40.8 10.4ZM10.5 38V30H7Q5.75 30 4.875 29.125Q4 28.25 4 27V21Q4 19.75 4.875 18.875Q5.75 18 7 18H16L26 12V36L16 30H13.5V38ZM28 30.7V17.3Q29.35 18.5 30.175 20.225Q31 21.95 31 24Q31 26.05 30.175 27.775Q29.35 29.5 28 30.7Z" + id="path2" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/check-smaller.svg b/data/extensions/sponsorBlocker@ajay.app/icons/check-smaller.svg @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="24" + height="24" + version="1.1" + id="svg4" + sodipodi:docname="check-smaller.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="26.25" + inkscape:cx="12.038095" + inkscape:cy="12" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="482" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + fill="#ffffff" + d="M 17.69347,4.9833775 9.9421192,12.940517 6.3065298,9.5107153 3.7684768,12.048769 9.9421192,18.016623 20.231523,7.5214304 Z" + id="path2" + style="stroke-width:0.68596" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/check.svg b/data/extensions/sponsorBlocker@ajay.app/icons/check.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path fill="#fff" d="M20.3 2L9 13.6l-5.3-5L0 12.3 9 21 24 5.7z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/clipboard.svg b/data/extensions/sponsorBlocker@ajay.app/icons/clipboard.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white" width="18px" height="18px"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/close-smaller.svg b/data/extensions/sponsorBlocker@ajay.app/icons/close-smaller.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="close-smaller.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="13.125" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-width="1366" + inkscape:window-height="731" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M12.45 37.65 10.35 35.55 21.9 24 10.35 12.45 12.45 10.35 24 21.9 35.55 10.35 37.65 12.45 26.1 24 37.65 35.55 35.55 37.65 24 26.1Z" + id="path2" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/close.png b/data/extensions/sponsorBlocker@ajay.app/icons/close.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/dearrow.svg b/data/extensions/sponsorBlocker@ajay.app/icons/dearrow.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> + +<svg + width="800px" + height="800px" + viewBox="0 0 36 36" + aria-hidden="true" + role="img" + class="iconify iconify--twemoji" + preserveAspectRatio="xMidYMid meet" + version="1.1" + id="svg10" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs14" /> + <sodipodi:namedview + id="namedview12" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="0.65479573" + inkscape:cx="493.2836" + inkscape:cy="514.66432" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="435" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg10" /> + <path + fill="#1213BD" + d="M36 18.302c0 4.981-2.46 9.198-5.655 12.462s-7.323 5.152-12.199 5.152s-9.764-1.112-12.959-4.376S0 23.283 0 18.302s2.574-9.38 5.769-12.644S13.271 0 18.146 0s9.394 2.178 12.589 5.442C33.931 8.706 36 13.322 36 18.302z" + id="path2" /> + <path + fill="#ffffff" + d="m 30.394282,18.410186 c 0,3.468849 -1.143025,6.865475 -3.416513,9.137917 -2.273489,2.272442 -5.670115,2.92874 -9.137918,2.92874 -3.467803,0 -6.373515,-1.147212 -8.6470033,-3.419654 -2.2734888,-2.272442 -3.5871299,-5.178154 -3.5871299,-8.647003 0,-3.46885 0.9420533,-6.746149 3.2144954,-9.0196379 2.2724418,-2.2734888 5.5507878,-3.9513905 9.0196378,-3.9513905 3.46885,0 6.492841,1.9322561 8.76633,4.204698 2.273489,2.2724424 3.788101,5.2974804 3.788101,8.7663304 z" + id="path4" + style="fill:#88c9f9;fill-opacity:1;stroke-width:1.04673" /> + <path + fill="#292f33" + d="m 23.95823,17.818306 c 0,3.153748 -2.644888,5.808102 -5.798635,5.808102 -3.153748,0 -5.599825,-2.654354 -5.599825,-5.808102 0,-3.153747 2.446077,-5.721714 5.599825,-5.721714 3.153747,0 5.798635,2.567967 5.798635,5.721714 z" + id="path8" + style="stroke-width:1.18339;fill:#0a62a5;fill-opacity:1" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/downvote.png b/data/extensions/sponsorBlocker@ajay.app/icons/downvote.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/export.svg b/data/extensions/sponsorBlocker@ajay.app/icons/export.svg @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 67.671 67.671" + style="enable-background:new 0 0 67.671 67.671;" + xml:space="preserve" + sodipodi:docname="export.svg" + inkscape:version="1.2.1 (9c6d41e410, 2022-07-14, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs41" /><sodipodi:namedview + id="namedview39" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="9.309749" + inkscape:cx="33.889206" + inkscape:cy="33.835499" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="0" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1" /> +<g + id="g6" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,6)"> + <path + d="M 52.946,23.348 H 42.834 v 6 h 10.112 c 3.007,0 5.34,1.536 5.34,2.858 v 26.606 c 0,1.322 -2.333,2.858 -5.34,2.858 H 14.724 c -3.007,0 -5.34,-1.536 -5.34,-2.858 V 32.207 c 0,-1.322 2.333,-2.858 5.34,-2.858 h 10.11 v -6 h -10.11 c -6.359,0 -11.34,3.891 -11.34,8.858 v 26.606 c 0,4.968 4.981,8.858 11.34,8.858 h 38.223 c 6.358,0 11.34,-3.891 11.34,-8.858 V 32.207 C 64.286,27.239 59.305,23.348 52.946,23.348 Z" + id="path2" + style="fill:#ffffff" /> + <path + d="m 24.957,14.955 c 0.768,0 1.535,-0.293 2.121,-0.879 l 3.756,-3.756 v 13.028 6 11.494 c 0,1.657 1.343,3 3,3 1.657,0 3,-1.343 3,-3 v -11.494 -6 -13.231 l 3.959,3.959 c 0.586,0.586 1.354,0.879 2.121,0.879 0.767,0 1.535,-0.293 2.121,-0.879 1.172,-1.171 1.172,-3.071 0,-4.242 L 36.078,0.877 C 35.492,0.291 34.725,0 33.958,0 33.95,0 33.943,0 33.935,0 33.927,0 33.92,0 33.912,0 33.145,0 32.378,0.291 31.792,0.877 l -8.957,8.957 c -1.172,1.171 -1.172,3.071 0,4.242 0.587,0.586 1.354,0.879 2.122,0.879 z" + id="path4" + style="fill:#ffffff" /> +</g> +<g + id="g8" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g10" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g12" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g14" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g16" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g18" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g20" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g22" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g24" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g26" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g28" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g30" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g32" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g34" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +<g + id="g36" + style="fill:#ffffff" + transform="matrix(0.82363056,0,0,0.82363056,5.9675483,5.9675483)"> +</g> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/heart.svg b/data/extensions/sponsorBlocker@ajay.app/icons/heart.svg @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="24px" + viewBox="0 0 24 24" + width="24px" + fill="#000000" + version="1.1" + id="svg6" + sodipodi:docname="heart.svg" + inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs10" /> + <sodipodi:namedview + id="namedview8" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="32.916667" + inkscape:cx="11.98481" + inkscape:cy="12.01519" + inkscape:window-width="1366" + inkscape:window-height="731" + inkscape:window-x="1366" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg6" /> + <path + d="M0 0h24v24H0V0z" + fill="none" + id="path2" /> + <path + d="M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z" + id="path4" + style="fill:#800000" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/help.svg b/data/extensions/sponsorBlocker@ajay.app/icons/help.svg @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="24" + viewBox="0 0 24 24" + width="24" + version="1.1" + id="svg6" + sodipodi:docname="help.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="730" + inkscape:window-height="480" + id="namedview8" + showgrid="false" + inkscape:zoom="9.8333333" + inkscape:cx="12" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <path + d="M0 0h24v24H0z" + fill="none" + id="path2" /> + <path + d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z" + id="path4" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/import.svg b/data/extensions/sponsorBlocker@ajay.app/icons/import.svg @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 67.671 67.671" + style="enable-background:new 0 0 67.671 67.671;" + xml:space="preserve" + sodipodi:docname="import.svg" + inkscape:version="1.2.1 (9c6d41e410, 2022-07-14, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs41" /><sodipodi:namedview + id="namedview39" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="9.309749" + inkscape:cx="33.889206" + inkscape:cy="33.835499" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="0" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="g6" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1" /> +<g + id="g6"> + <path + d="M 49.575492,25.197675 H 41.24694 v 4.941783 h 8.328552 c 2.476657,0 4.398187,1.265096 4.398187,2.353936 v 21.913515 c 0,1.088839 -1.92153,2.353936 -4.398187,2.353936 H 18.094685 c -2.476657,0 -4.398188,-1.265097 -4.398188,-2.353936 V 32.494218 c 0,-1.08884 1.921531,-2.353936 4.398188,-2.353936 h 8.326905 v -4.941784 h -8.326905 c -5.237467,0 -9.3399709,3.204747 -9.3399709,7.29572 v 21.913514 c 0,4.091797 4.1025039,7.29572 9.3399709,7.29572 h 31.48163 c 5.236643,0 9.339971,-3.204747 9.339971,-7.29572 V 32.494218 c -8.24e-4,-4.091797 -4.103328,-7.296543 -9.340794,-7.296543 z" + id="path2" + style="fill:#ffffff;stroke-width:0.823631" /> + <path + d="m 41.312006,34.701548 c -0.632548,0 -1.128592,0.43489 -1.74692,0.723971 L 36.47153,38.519075 V 22.847033 17.90525 8.4384399 c 0,-1.3647558 -1.106136,-2.4708916 -2.470892,-2.4708916 -1.364756,0 -2.470892,1.1061358 -2.470892,2.4708916 v 9.4668101 9.883566 10.897456 l -3.260753,-3.260753 c -0.482648,-0.482648 -1.115196,-0.723971 -1.746921,-0.723971 -0.631724,0 -1.264272,0.241323 -1.74692,0.723971 -0.965295,0.964471 -0.965295,2.529369 0,3.493841 l 7.377259,7.377259 c 0.482647,0.482647 1.114372,0.722324 1.746097,0.722324 h 0.01894 0.01894 c 0.631724,0 1.263449,-0.239677 1.746097,-0.722324 L 43.05975,38.91936 c 0.965295,-0.964472 0.965295,-2.52937 0,-3.493841 -0.483471,-0.482648 -1.115195,-0.723971 -1.747744,-0.723971 z" + id="path4" + sodipodi:nodetypes="sscccssscccssccsscssccs" + style="fill:#ffffff;stroke-width:0.823631" /> +</g> +<g + id="g8"> +</g> +<g + id="g10"> +</g> +<g + id="g12"> +</g> +<g + id="g14"> +</g> +<g + id="g16"> +</g> +<g + id="g18"> +</g> +<g + id="g20"> +</g> +<g + id="g22"> +</g> +<g + id="g24"> +</g> +<g + id="g26"> +</g> +<g + id="g28"> +</g> +<g + id="g30"> +</g> +<g + id="g32"> +</g> +<g + id="g34"> +</g> +<g + id="g36"> +</g> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/lightbulb.svg b/data/extensions/sponsorBlocker@ajay.app/icons/lightbulb.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="lightbulb.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="13.125" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="482" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M24 44Q22.3 44 21.125 42.825Q19.95 41.65 19.95 39.95H28.05Q28.05 41.65 26.875 42.825Q25.7 44 24 44ZM15.9 36.85V33.85H32.1V36.85ZM16.15 30.8Q12.85 28.65 10.925 25.425Q9 22.2 9 18.15Q9 12.05 13.45 7.6Q17.9 3.15 24 3.15Q30.1 3.15 34.55 7.6Q39 12.05 39 18.15Q39 22.2 37.1 25.425Q35.2 28.65 31.85 30.8Z" + id="path2" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/loop.svg b/data/extensions/sponsorBlocker@ajay.app/icons/loop.svg @@ -0,0 +1,4 @@ +<svg width="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#FFFFFF"> + <path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-8 4-8 7h2s1-5 6-5c1.66 0 3.14.69 4.22 1.78L14 10h6V4l-2.35 2.35z"/> + <path d="M5.85 17.65C7.3 19.1 9.29 20 11.5 20c4.42 0 8-4 8-7h-2s-1 5-6 5c-1.66 0-3.14-.69-4.22-1.78L9.5 14h-6v6z"/> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/looped.svg b/data/extensions/sponsorBlocker@ajay.app/icons/looped.svg @@ -0,0 +1,4 @@ +<svg width="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#80fff6"> + <path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-8 4-8 7h2s1-5 6-5c1.66 0 3.14.69 4.22 1.78L14 10h6V4l-2.35 2.35z"/> + <path d="M5.85 17.65C7.3 19.1 9.29 20 11.5 20c4.42 0 8-4 8-7h-2s-1 5-6 5c-1.66 0-3.14-.69-4.22-1.78L9.5 14h-6v6z"/> +</svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/money.svg b/data/extensions/sponsorBlocker@ajay.app/icons/money.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="money.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="6.5625" + inkscape:cx="37.942857" + inkscape:cy="29.714286" + inkscape:window-width="1366" + inkscape:window-height="731" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M 22.070204,47.757552 V 42.214123 Q 18.308592,41.554191 15.89984,39.343419 13.491088,37.132647 12.435197,33.766994 l 3.695619,-1.517844 q 1.121884,3.167674 3.233667,4.718514 2.111782,1.55084 5.081476,1.55084 3.167674,0 5.213463,-1.583837 2.045789,-1.583837 2.045789,-4.355551 0,-2.903701 -1.814813,-4.487538 -1.814813,-1.583836 -6.830296,-3.233666 -4.75151,-1.517844 -7.094269,-4.025586 -2.342759,-2.507741 -2.342759,-6.269354 0,-3.629626 2.342759,-6.0713741 2.342759,-2.4417484 6.104371,-2.7717144 V 0.24244792 h 3.959592 V 5.7198835 q 2.969694,0.329966 5.114473,1.9467994 2.144779,1.6168335 3.266663,4.1245751 l -3.695619,1.583837 q -0.923905,-2.111783 -2.474745,-3.068684 -1.55084,-0.9569014 -4.058582,-0.9569014 -3.035687,0 -4.817503,1.3858574 -1.781817,1.385857 -1.781817,3.761612 0,2.507742 1.979796,4.058582 1.979796,1.55084 7.325246,3.20067 4.487537,1.385857 6.632316,3.992589 2.144779,2.606731 2.144779,6.566323 0,4.157572 -2.441748,6.69831 -2.441749,2.540738 -7.193259,3.266663 v 5.477436 z" + id="path2" + style="fill:#ffffff;stroke-width:1.31986" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/music-note.svg b/data/extensions/sponsorBlocker@ajay.app/icons/music-note.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="music-note.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="13.125" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="482" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M19.65 42Q16.5 42 14.325 39.825Q12.15 37.65 12.15 34.5Q12.15 31.35 14.325 29.175Q16.5 27 19.65 27Q21.05 27 22.175 27.4Q23.3 27.8 24.15 28.5V6H35.85V12.75H27.15V34.5Q27.15 37.65 24.975 39.825Q22.8 42 19.65 42Z" + id="path2" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/newprofilepic.jpg b/data/extensions/sponsorBlocker@ajay.app/icons/newprofilepic.jpg Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/not_visible.svg b/data/extensions/sponsorBlocker@ajay.app/icons/not_visible.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="24px" + viewBox="0 0 24 24" + width="24px" + fill="#000000" + version="1.1" + id="svg6" + sodipodi:docname="not_visible.svg" + inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs10" /> + <sodipodi:namedview + id="namedview8" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="16.458334" + inkscape:cx="3.8582278" + inkscape:cy="9.1443037" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="426" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg6" /> + <path + d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z" + id="path4" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/pause.svg b/data/extensions/sponsorBlocker@ajay.app/icons/pause.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="24px" + viewBox="0 0 24 24" + width="24px" + fill="#000000" + version="1.1" + id="svg6" + sodipodi:docname="pause.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="730" + inkscape:window-height="480" + id="namedview8" + showgrid="false" + inkscape:zoom="9.8333333" + inkscape:cx="12" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <path + d="M0 0h24v24H0z" + fill="none" + id="path2" /> + <path + d="M6 19h4V5H6v14zm8-14v14h4V5h-4z" + id="path4" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/pencil.svg b/data/extensions/sponsorBlocker@ajay.app/icons/pencil.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path fill="#fff" d="M14.1 7.1l2.9 2.9L6.1 20.7l-3.6.7.7-3.6L14.1 7.1zm0-2.8L1.4 16.9 0 24l7.1-1.4L19.8 9.9l-5.7-5.7zm7.1 4.3L24 5.7 18.3 0l-2.8 2.8 5.7 5.7z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/refresh.svg b/data/extensions/sponsorBlocker@ajay.app/icons/refresh.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#FFFFFF"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/report.png b/data/extensions/sponsorBlocker@ajay.app/icons/report.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/right-arrow.svg b/data/extensions/sponsorBlocker@ajay.app/icons/right-arrow.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="right-arrow.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="13.125" + inkscape:cx="24.07619" + inkscape:cy="24" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="482" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M 17.039265,39.62264 14.838095,37.382164 28.320259,23.9 14.838095,10.417836 17.039265,8.1773601 32.761905,23.9 Z" + id="path2" + style="fill:#ffffff;stroke-width:0.786132" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/segway.png b/data/extensions/sponsorBlocker@ajay.app/icons/segway.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/settings.svg b/data/extensions/sponsorBlocker@ajay.app/icons/settings.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path fill="#fff" d="M24 13.6v-3.2c-1.7-.6-2.7-.8-3.2-2h0c-.5-1.3.1-2.1.8-3.7l-2.3-2.3c-1.6.7-2.4 1.4-3.7.8h0c-1.3-.5-1.4-1.6-2-3.2h-3.2c-.6 1.6-.7 2.7-2 3.2h0c-1.3.5-2.1-.1-3.7-.8L2.4 4.7c.7 1.6 1.4 2.4.8 3.7s-1.6 1.4-3.2 2v3.2c1.6.6 2.7.7 3.2 2 .5 1.3-.1 2.2-.8 3.7l2.3 2.3c1.6-.7 2.4-1.4 3.7-.8h0c1.3.5 1.4 1.6 2 3.2h3.2c.6-1.6.8-2.7 2-3.2h0c1.3-.5 2.1.1 3.7.9l2.3-2.3c-.7-1.6-1.4-2.4-.8-3.7s1.6-1.4 3.2-2zM12 16a4 4 0 1 1 0-8 4 4 0 1 1 0 8z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/skip.svg b/data/extensions/sponsorBlocker@ajay.app/icons/skip.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#FFFFFF"><path d="M0 0h24v24H0z" fill="none"/><path d="M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/skipIcon.svg b/data/extensions/sponsorBlocker@ajay.app/icons/skipIcon.svg @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 565.15 568" + version="1.1" + id="svg16" + sodipodi:docname="skipIcon.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:export-filename="D:\Dell Data\_Projects\_____SponsorSkip\ignored\svg\SponsorBlocker4.png" + inkscape:export-xdpi="43.436523" + inkscape:export-ydpi="43.436523"> + <metadata + id="metadata20"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>LogoSponsorBlocker2</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1001" + id="namedview18" + showgrid="false" + inkscape:zoom="1.6619718" + inkscape:cx="316.31071" + inkscape:cy="330.01409" + inkscape:window-x="477" + inkscape:window-y="961" + inkscape:window-maximized="1" + inkscape:current-layer="svg16" + inkscape:pagecheckerboard="true" /> + <defs + id="defs4"> + <style + id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style> + </defs> + <title + id="title6">LogoSponsorBlocker2</title> + <path + class="cls-1" + d="m 282.58,568 a 65,65 0 0 1 -34.14,-9.66 C 95.41,463.94 2.54,300.46 0,121 a 64.91,64.91 0 0 1 34,-58.09 522.56,522.56 0 0 1 497.16,0 64.91,64.91 0 0 1 34,58.12 c -2.53,179.43 -95.4,342.91 -248.42,437.3 A 65,65 0 0 1 282.58,568 Z m 0,-548.31 A 502.24,502.24 0 0 0 43.4,80.22 45.27,45.27 0 0 0 19.7,120.75 c 2.44,172.67 91.81,330 239.07,420.83 a 46.19,46.19 0 0 0 47.61,0 C 453.64,450.73 543,293.42 545.45,120.75 A 45.26,45.26 0 0 0 521.75,80.21 502.26,502.26 0 0 0 282.58,19.69 Z" + id="path8" + inkscape:connector-curvature="0" + style="fill:#ffffff" /> + <path + style="fill:#ffffff" + d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 188.7168 140.07227 L 312.64844 264.00586 L 188.7168 387.9375 L 159.5918 358.8125 L 254.19336 264.00586 L 159.5918 169.19727 L 188.7168 140.07227 z M 305.625 140.07227 L 429.55859 264.00586 L 305.625 387.9375 L 276.50195 358.8125 L 371.10352 264.00586 L 276.50195 169.19727 L 305.625 140.07227 z " + id="path10" /> + <g + id="g825" + transform="translate(-3.86549,36.564644)" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/sort.svg b/data/extensions/sponsorBlocker@ajay.app/icons/sort.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#FFFFFF"><path d="M0 0h24v24H0z" fill="none"/><path d="M3 18h6v-2H3v2zM3 6v2h18V6H3zm0 7h12v-2H3v2z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/star.svg b/data/extensions/sponsorBlocker@ajay.app/icons/star.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="star.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="13.125" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="482" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M11.65 44 16.3 28.8 4 20H19.2L24 4L28.8 20H44L31.7 28.8L36.35 44L24 34.6Z" + id="path2" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/stop.svg b/data/extensions/sponsorBlocker@ajay.app/icons/stop.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="24px" + viewBox="0 0 24 24" + width="24px" + fill="#000000" + version="1.1" + id="svg6" + sodipodi:docname="stop.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="730" + inkscape:window-height="480" + id="namedview8" + showgrid="false" + inkscape:zoom="9.8333333" + inkscape:cx="12" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <path + d="M0 0h24v24H0z" + fill="none" + id="path2" /> + <path + d="M6 6h12v12H6z" + id="path4" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/stopwatch.svg b/data/extensions/sponsorBlocker@ajay.app/icons/stopwatch.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="48" + width="48" + version="1.1" + id="svg4" + sodipodi:docname="stopwatch.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs8" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="13.125" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="482" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" /> + <path + d="M14.45 34Q16.3 35.95 18.8 36.975Q21.3 38 24 38Q29.85 38 33.925 33.925Q38 29.85 38 24Q38 18.15 33.925 14.075Q29.85 10 24 10V24ZM24 44Q19.75 44 16.1 42.475Q12.45 40.95 9.75 38.25Q7.05 35.55 5.525 31.9Q4 28.25 4 24Q4 19.8 5.525 16.15Q7.05 12.5 9.75 9.8Q12.45 7.1 16.1 5.55Q19.75 4 24 4Q28.2 4 31.85 5.55Q35.5 7.1 38.2 9.8Q40.9 12.5 42.45 16.15Q44 19.8 44 24Q44 28.25 42.45 31.9Q40.9 35.55 38.2 38.25Q35.5 40.95 31.85 42.475Q28.2 44 24 44Z" + id="path2" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/thumb.svg b/data/extensions/sponsorBlocker@ajay.app/icons/thumb.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path fill="#fff" d="M21.4 9.6c-1.2 0-2.9-.3-4-.8.8-3.3 1.3-8.8-2.2-8.8-1.8 0-2.3 1.7-2.8 3.3-1.6 5.4-4 6.9-6.4 7.5V10H0v12h6v-.9a19.2 19.2 0 016.2 1.8c1.2.5 3 1.1 5.3 1.1 2.5 0 4.3-1 5-3.7.5-1.9 1.5-7.2 1.5-8.2 0-1.7-1.2-2.5-2.6-2.5zM4 20H2v-8h2v8zm15.9-5.6h1c1.2 0 1.1 1.5 0 1.6h-1.7c-.7.2-.7 1.3.1 1.2h1.2c1 0 1 1.4 0 1.5l-1.7.1c-.8.1-.7 1.3 0 1.2h.8c.9-.1 1 .8-.3 1.6-1.5.9-4.6.1-6.4-.6-2.2-1-4.4-2-7-2v-6c3.3-.8 6.4-2.3 8.4-9.1.9-3.1 1.7-2 1.7.6 0 2-.5 3.8-1 5.5 1.1.5 3.4 1.4 6.2 1.6 1 0 1 1.4 0 1.5l-1.5.2s-.6 1.1.2 1.1z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/thumbs_down.svg b/data/extensions/sponsorBlocker@ajay.app/icons/thumbs_down.svg @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="24" + viewBox="0 0 24 24" + width="24" + version="1.1" + id="svg6" + sodipodi:docname="thumbs_down.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="730" + inkscape:window-height="480" + id="namedview8" + showgrid="false" + inkscape:zoom="9.8333333" + inkscape:cx="12" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <path + d="M0 0h24v24H0z" + fill="none" + id="path2" /> + <path + d="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z" + id="path4" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/thumbs_down_locked.svg b/data/extensions/sponsorBlocker@ajay.app/icons/thumbs_down_locked.svg @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="24" + viewBox="0 0 24 24" + width="24" + version="1.1" + id="svg6" + sodipodi:docname="thumbs_down.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="730" + inkscape:window-height="480" + id="namedview8" + showgrid="false" + inkscape:zoom="9.8333333" + inkscape:cx="12" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <path + d="M0 0h24v24H0z" + fill="none" + id="path2" /> + <path + d="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z" + id="path4" + style="fill:#ffc83d" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/thumbs_up.svg b/data/extensions/sponsorBlocker@ajay.app/icons/thumbs_up.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 24 24" + fill="black" + width="18px" + height="18px" + version="1.1" + id="svg6" + sodipodi:docname="thumbs_up.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="730" + inkscape:window-height="480" + id="namedview8" + showgrid="false" + inkscape:zoom="13.111111" + inkscape:cx="9" + inkscape:cy="9" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <path + d="M0 0h24v24H0V0z" + fill="none" + id="path2" /> + <path + d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2z" + id="path4" + style="fill:#ffffff" /> +</svg> diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/upvote.png b/data/extensions/sponsorBlocker@ajay.app/icons/upvote.png Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/upvote.svg b/data/extensions/sponsorBlocker@ajay.app/icons/upvote.svg @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 478.2 478.2" + style="enable-background:new 0 0 478.2 478.2;" + xml:space="preserve" + sodipodi:docname="upvote.svg" + inkscape:export-filename="C:\_Projects\_____SponsorSkip\icons\upvote.png" + inkscape:export-xdpi="52.797993" + inkscape:export-ydpi="52.797993" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata + id="metadata41"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs + id="defs39" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1001" + id="namedview37" + showgrid="false" + inkscape:zoom="0.98703469" + inkscape:cx="264.34466" + inkscape:cy="180.78075" + inkscape:window-x="-9" + inkscape:window-y="-9" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<g + id="g4"> + <path + d="M457.575,325.1c9.8-12.5,14.5-25.9,13.9-39.7c-0.6-15.2-7.4-27.1-13-34.4c6.5-16.2,9-41.7-12.7-61.5 c-15.9-14.5-42.9-21-80.3-19.2c-26.3,1.2-48.3,6.1-49.2,6.3h-0.1c-5,0.9-10.3,2-15.7,3.2c-0.4-6.4,0.7-22.3,12.5-58.1 c14-42.6,13.2-75.2-2.6-97c-16.6-22.9-43.1-24.7-50.9-24.7c-7.5,0-14.4,3.1-19.3,8.8c-11.1,12.9-9.8,36.7-8.4,47.7 c-13.2,35.4-50.2,122.2-81.5,146.3c-0.6,0.4-1.1,0.9-1.6,1.4c-9.2,9.7-15.4,20.2-19.6,29.4c-5.9-3.2-12.6-5-19.8-5h-61 c-23,0-41.6,18.7-41.6,41.6v162.5c0,23,18.7,41.6,41.6,41.6h61c8.9,0,17.2-2.8,24-7.6l23.5,2.8c3.6,0.5,67.6,8.6,133.3,7.3 c11.9,0.9,23.1,1.4,33.5,1.4c17.9,0,33.5-1.4,46.5-4.2c30.6-6.5,51.5-19.5,62.1-38.6c8.1-14.6,8.1-29.1,6.8-38.3 c19.9-18,23.4-37.9,22.7-51.9C461.275,337.1,459.475,330.2,457.575,325.1z M48.275,447.3c-8.1,0-14.6-6.6-14.6-14.6V270.1 c0-8.1,6.6-14.6,14.6-14.6h61c8.1,0,14.6,6.6,14.6,14.6v162.5c0,8.1-6.6,14.6-14.6,14.6h-61V447.3z M431.975,313.4 c-4.2,4.4-5,11.1-1.8,16.3c0,0.1,4.1,7.1,4.6,16.7c0.7,13.1-5.6,24.7-18.8,34.6c-4.7,3.6-6.6,9.8-4.6,15.4c0,0.1,4.3,13.3-2.7,25.8 c-6.7,12-21.6,20.6-44.2,25.4c-18.1,3.9-42.7,4.6-72.9,2.2c-0.4,0-0.9,0-1.4,0c-64.3,1.4-129.3-7-130-7.1h-0.1l-10.1-1.2 c0.6-2.8,0.9-5.8,0.9-8.8V270.1c0-4.3-0.7-8.5-1.9-12.4c1.8-6.7,6.8-21.6,18.6-34.3c44.9-35.6,88.8-155.7,90.7-160.9 c0.8-2.1,1-4.4,0.6-6.7c-1.7-11.2-1.1-24.9,1.3-29c5.3,0.1,19.6,1.6,28.2,13.5c10.2,14.1,9.8,39.3-1.2,72.7 c-16.8,50.9-18.2,77.7-4.9,89.5c6.6,5.9,15.4,6.2,21.8,3.9c6.1-1.4,11.9-2.6,17.4-3.5c0.4-0.1,0.9-0.2,1.3-0.3 c30.7-6.7,85.7-10.8,104.8,6.6c16.2,14.8,4.7,34.4,3.4,36.5c-3.7,5.6-2.6,12.9,2.4,17.4c0.1,0.1,10.6,10,11.1,23.3 C444.875,295.3,440.675,304.4,431.975,313.4z" + id="path2" /> +</g> +<g + id="g6"> +</g> +<g + id="g8"> +</g> +<g + id="g10"> +</g> +<g + id="g12"> +</g> +<g + id="g14"> +</g> +<g + id="g16"> +</g> +<g + id="g18"> +</g> +<g + id="g20"> +</g> +<g + id="g22"> +</g> +<g + id="g24"> +</g> +<g + id="g26"> +</g> +<g + id="g28"> +</g> +<g + id="g30"> +</g> +<g + id="g32"> +</g> +<g + id="g34"> +</g> +</svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/icons/visible.svg b/data/extensions/sponsorBlocker@ajay.app/icons/visible.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#FFFFFF"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/js/background.js b/data/extensions/sponsorBlocker@ajay.app/js/background.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={3531:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendBinaryRequestToCustomServer=t.sendRequestToCustomServer=t.setupBackgroundRequestProxy=t.sendRealRequestToCustomServer=void 0;const i=o(1108),r=o(1740),s=o(3262);function a(e,t,o={},r={}){return n(this,void 0,void 0,(function*(){return"get"===e.toLowerCase()&&(t=(0,i.objectToURI)(t,o,!0),o=null),yield fetch(t,{method:e,headers:Object.assign({"Content-Type":"application/json"},r||{}),redirect:"follow",body:o?JSON.stringify(o):null})}))}t.sendRealRequestToCustomServer=a,t.setupBackgroundRequestProxy=function(){chrome.runtime.onMessage.addListener(((e,t,o)=>"sendRequest"===e.message?(a(e.type,e.url,e.data,e.headers).then((t=>n(this,void 0,void 0,(function*(){const n=e.binary?(0,i.isFirefoxOrSafari)()&&!(0,r.isSafari)()?yield t.blob():Array.from(new Uint8Array(yield t.arrayBuffer())):null;o({responseText:e.binary?"":yield t.text(),responseBinary:n,headers:e.returnHeaders&&t.headers?[...t.headers.entries()].reduce(((e,[t,o])=>(e[t]=o,e)),{}):null,status:t.status,ok:t.ok})})))).catch((()=>{o({responseText:"",responseBinary:null,headers:null,status:-1,ok:!1})})),!0):"getHash"===e.message&&((0,s.getHash)(e.value,e.times).then(o).catch((e=>{o({error:null==e?void 0:e.message})})),!0)))},t.sendRequestToCustomServer=function(e,t,o={},n={}){return new Promise(((i,r)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:o,headers:n},(e=>{-1!==e.status?i(e):r(e)}))}))},t.sendBinaryRequestToCustomServer=function(e,t,o={},n={}){return new Promise(((i,r)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:o,headers:n,binary:!0,returnHeaders:!0},(e=>{-1!==e.status?i(e):r(e)}))}))}},7046:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.chromeP=void 0,t.chromeP="undefined"==typeof browser?"undefined"!=typeof chrome?chrome:null:browser},2184:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.injectUpdatedScripts=t.getCleanupStartMessage=t.getCleanupId=t.setupCleanupListener=t.addCleanupListener=void 0;const i=o(7046),r=[];function s(){return`${chrome.runtime.id}-cleanup`}t.addCleanupListener=function(e){r.push(e)},t.setupCleanupListener=function(){const e=s(),t=performance.now();window.postMessage({source:e,message:"cleanup-start"}),window.addEventListener("message",(o=>{var n;if((null===(n=o.data)||void 0===n?void 0:n.source)&&o.data.source===e&&"cleanup-start"===o.data.message&&performance.now()-t>5e3)for(const e of r)e()}))},t.getCleanupId=s,t.getCleanupStartMessage=function(){return"cleanup-start"},t.injectUpdatedScripts=function(e=[],t=!1){return n(this,void 0,void 0,(function*(){const o=t?e:e.concat(chrome.runtime.getManifest().content_scripts||[]);if("scripting"in chrome)for(const e of o)for(const t of yield i.chromeP.tabs.query({url:e.matches}))e.css&&e.css.length>0&&(yield i.chromeP.scripting.insertCSS({target:{tabId:t.id},files:e.css||[]})),yield i.chromeP.scripting.executeScript({target:{tabId:t.id},files:e.js||[],world:e.world||"ISOLATED"});else chrome.windows.getAll({populate:!0},(e=>{var t,n;for(const i of e)if(i.tabs)for(const e of i.tabs)for(const i of o)if(e.url&&(null===(n=null===(t=i.matches)||void 0===t?void 0:t.some)||void 0===n?void 0:n.call(t,(t=>e.url.match(t.replace(/\//g,"\\/").replace(/\./g,"\\.").replace(/\*/g,".*")))))){if(i.js)for(const t of i.js)chrome.tabs.executeScript(e.id,{file:t});if(i.css)for(const t of i.css)chrome.tabs.insertCSS(e.id,{file:t})}}))}))}},1740:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.keybindToString=t.formatKey=t.keybindEquals=t.isSafari=t.ProtoConfig=void 0;const i=o(1108);function r(){return"undefined"!=typeof navigator&&"Apple Computer, Inc."===navigator.vendor}function s(e){return null==e?"":" "==e?"Space":1==e.length?e.toUpperCase():e}t.ProtoConfig=class{constructor(e,t,o,n=!1){this.configLocalListeners=[],this.configSyncListeners=[],this.cachedSyncConfig=null,this.cachedLocalStorage=null,this.config=null,this.local=null,this.inDeArrow=!1,this.syncDefaults=e,this.localDefaults=t,this.inDeArrow=n,this.setupConfig(o).then((e=>{this.config=null==e?void 0:e.sync,this.local=null==e?void 0:e.local}))}configProxy(){chrome.storage.onChanged.addListener(((e,t)=>{if("sync"===t){for(const t in e)this.cachedSyncConfig[t]=e[t].newValue;for(const t of this.configSyncListeners)t(e)}else if("local"===t){for(const t in e)this.cachedLocalStorage[t]=e[t].newValue;for(const t of this.configLocalListeners)t(e)}}));let e=0;const t=new Set;let o=null;const n=this,i={set(i,r,s){if(n.cachedSyncConfig[r]=s,Date.now()-e<100){if(t.add(r),!o){const e=()=>{const e=[...t];t.clear(),chrome.storage.sync.set(e.map((e=>[e,n.cachedSyncConfig[e]])).reduce(((e,[t,o])=>(e[t]=o,e)),{})),o=null};o=setTimeout(e,20)}return!0}return chrome.storage.sync.set({[r]:s}),e=Date.now(),!0},get(e,t){const o=n.cachedSyncConfig[t];return e[t]||o},deleteProperty:(e,t)=>(chrome.storage.sync.remove(t),!0)},r={set:(e,t,o)=>(n.cachedLocalStorage[t]=o,chrome.storage.local.set({[t]:o}),!0),get(e,t){const o=n.cachedLocalStorage[t];return e[t]||o},deleteProperty:(e,t)=>(chrome.storage.local.remove(t),!0)};return{sync:new Proxy({handler:i},i),local:new Proxy({handler:r},r)}}forceSyncUpdate(e){const t=this.cachedSyncConfig[e];chrome.storage.sync.set({[e]:t})}forceLocalUpdate(e){const t=this.cachedLocalStorage[e];chrome.storage.local.set({[e]:t},(()=>{const t=chrome.runtime.lastError;t&&"navigationApiAvailable"!==e&&alert(`SponsorBlock/DeArrow: ${chrome.i18n.getMessage("storageFull")}\n\n${t}`)}))}fetchConfig(){return n(this,void 0,void 0,(function*(){yield Promise.all([new Promise((e=>{chrome.storage.sync.get(null,(t=>{this.cachedSyncConfig=t,void 0===this.cachedSyncConfig&&(this.cachedSyncConfig={},(this.inDeArrow||window.location.href.includes("options.html"))&&alert(`${chrome.i18n.getMessage("syncDisabledWarning")}${this.inDeArrow?`\n\n${chrome.i18n.getMessage("syncDisabledWarningDeArrow")}`:""}${(0,i.isFirefoxOrSafari)()&&!r()?`\n\n${chrome.i18n.getMessage("syncDisabledFirefoxSuggestions")}`:""}`)),e()}))})),new Promise((e=>{chrome.storage.local.get(null,(t=>{this.cachedLocalStorage=null!=t?t:{},e()}))}))])}))}setupConfig(e){return n(this,void 0,void 0,(function*(){if("undefined"==typeof chrome)return null;yield this.fetchConfig(),this.addDefaults();const t=this.configProxy();return e(t.sync),t}))}addDefaults(){for(const e in this.syncDefaults)if(Object.prototype.hasOwnProperty.call(this.cachedSyncConfig,e)){if("barTypes"===e)for(const t in this.syncDefaults[e])Object.prototype.hasOwnProperty.call(this.cachedSyncConfig[e],t)||(this.cachedSyncConfig[e][t]=this.syncDefaults[e][t])}else this.cachedSyncConfig[e]=this.syncDefaults[e];for(const e in this.localDefaults)Object.prototype.hasOwnProperty.call(this.cachedLocalStorage,e)||(this.cachedLocalStorage[e]=this.localDefaults[e])}isReady(){return null!==this.config}},t.isSafari=r,t.keybindEquals=function(e,t){return!(null==e||null==t||Boolean(e.alt)!=Boolean(t.alt)||Boolean(e.ctrl)!=Boolean(t.ctrl)||Boolean(e.shift)!=Boolean(t.shift)||null==e.key&&null==e.code||null==t.key&&null==t.code)&&(null!=e.code&&null!=t.code?e.code===t.code:null!=e.key&&null!=t.key&&e.key.toUpperCase()===t.key.toUpperCase())},t.formatKey=s,t.keybindToString=function(e){if(null==e||null==e.key)return"";let t="";return e.ctrl&&(t+="Ctrl + "),e.alt&&(t+="Alt + "),e.shift&&(t+="Shift + "),t+s(e.key)}},4148:function(e,t){var o=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};function n(e,t=!1){var o,n,i;if(!e)return!1;if("VIDEO"===e.tagName&&(e.classList.contains("html5-main-video")||"player"===e.id||"player_html5_api"===e.id)&&1===[...document.querySelectorAll("video")].filter((e=>e.duration)).length&&e.duration)return!0;if(0===e.offsetHeight||0===e.offsetWidth&&!t)return!1;const r=null==e?void 0:e.getBoundingClientRect(),s=document.elementFromPoint(r.left+r.width/2,r.top+r.height/2)||document.elementFromPoint(r.left,r.top);return!s&&"movie_player"===e.id&&r.top<0||!!(s===e||s&&e.contains(s)||s&&s.contains(e))||"VIDEO"===e.tagName&&(!!(null===(o=null==s?void 0:s.closest(".html5-video-player"))||void 0===o?void 0:o.contains(e))||!!(null===(i=null===(n=null==e?void 0:e.closest("#inline-preview-player"))||void 0===n?void 0:n.classList)||void 0===i?void 0:i.contains("playing-mode")))}function i(e,t=!1,o=!0){var i,r;return n(e,t)||o&&!!e&&(n(e.parentElement,t)||n(null!==(r=null===(i=e.parentElement)||void 0===i?void 0:i.parentElement)&&void 0!==r?r:null,t))}function r(e,t=!1,o=!1){return s(e,t,o)}function s(e,t=!1,o=!1,n){for(const r of e){const e=n?n(r):r;if(e&&i(e,t,o))return e}return null}function a(e,t){for(const o of e){const e=document.querySelector(o);if(e&&t(e))return e}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.getElement=t.waitForElement=t.findNonEmptyElement=t.findPredicatedElement=t.findValidElement=t.findValidElementFromSelector=t.isVisibleOrParent=t.isVisible=void 0,t.isVisible=n,t.isVisibleOrParent=i,t.findValidElementFromSelector=function(e,t=!1,o=!1){return s(e,t,o,(e=>document.querySelector(e)))},t.findValidElement=r,t.findPredicatedElement=a,t.findNonEmptyElement=function(e){return a(e,(e=>{var t,o;return(null!==(o=null===(t=e.textContent)||void 0===t?void 0:t.trim())&&void 0!==o?o:"").length>0}))};let c=!1,l=null,u=[];function d(){if(!l){const e=e=>{var t;const o=[];for(const n of u){const{selector:i,visibleCheck:s,ignoreWidth:a,checkParent:c,callbacks:l}=n;let u=!0;if(e){let t=!1;for(const o of e)if("childList"===o.type&&o.addedNodes.length>0){if(o.target instanceof HTMLElement&&(o.target.matches(i)||o.target.querySelector(i))){t=!0;break}for(const e of o.addedNodes)if(e instanceof HTMLElement&&(e.matches(i)||e.querySelector(i))){t=!0;break}if(t)break}t||(u=!1)}const d=u?document.querySelectorAll(i):n.elements;if(d&&d.length>0){n.elements=d;const e=s?r(d,a,c):d[0];if(e){if(null===(t=chrome.runtime)||void 0===t?void 0:t.id)for(const t of l)t(e);o.push(i)}}}u=u.filter((e=>!o.includes(e.selector))),0===u.length&&(null==l||l.disconnect(),l=null,c=!1)};e(),u.length>0&&(l=new MutationObserver(e),l.observe(document.documentElement,{childList:!0,subtree:!0}))}}function p(e,t,o=!1,n=!1){return t?r(document.querySelectorAll(e),o,n):document.querySelector(e)}t.waitForElement=function(e,t=!1,n=!1,i=!1){return o(this,void 0,void 0,(function*(){return yield new Promise((o=>{const r=p(e,t,n,i);if(r)return void o(r);const s=u.find((o=>o.selector===e&&o.visibleCheck===t));s?s.callbacks.push(o):u.push({selector:e,visibleCheck:t,ignoreWidth:n,checkParent:i,callbacks:[o]}),c||(c=!0,document.body?d():window.addEventListener("DOMContentLoaded",(()=>{d()})))}))}))},t.getElement=p},3262:function(e,t){var o=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.getHash=void 0,t.getHash=function(e,t=5e3){return o(this,void 0,void 0,(function*(){if(t<=0)return"";if(!("subtle"in crypto))return new Promise(((o,n)=>chrome.runtime.sendMessage({message:"getHash",value:e,times:t},(e=>{e.error?n(e.error):o(e)}))));let o=e;for(let e=0;e<t;e++){const e=yield crypto.subtle.digest("SHA-256",(new TextEncoder).encode(o).buffer);o=Array.from(new Uint8Array(e)).map((e=>e.toString(16).padStart(2,"0"))).join("")}return o}))}},1108:function(e,t){var o=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.extensionUserAgent=t.isFirefoxOrSafari=t.timeoutPomise=t.PromiseTimeoutError=t.objectToURI=t.waitFor=void 0,t.waitFor=function(e,t=5e3,n=100,i){return o(this,void 0,void 0,(function*(){return yield new Promise(((o,r)=>{let s=null;const a=()=>{const t=e();(i?i(t):t)&&(o(t),s&&clearInterval(s))};t&&(setTimeout((()=>{clearInterval(s),r(`TIMEOUT waiting for ${null==e?void 0:e.toString()}: ${Error().stack}`)}),t),s=setInterval(a,n)),a()}))}))},t.objectToURI=function(e,t,o){let n=0;for(const i in t){const r=e.includes("?")||n>0?"&":o?"?":"",s="string"==typeof t[i]?t[i]:JSON.stringify(t[i]);e+=r+encodeURIComponent(i)+"="+encodeURIComponent(s),n++}return e};class n extends Error{constructor(e){super("Promise timed out"),this.promise=e}}let i;t.PromiseTimeoutError=n,t.timeoutPomise=function(e){return new Promise(((t,o)=>{e&&setTimeout((()=>{o(new n)}),e)}))},t.isFirefoxOrSafari=function(){return"undefined"!=typeof browser},t.extensionUserAgent=function(){return null!=i||(i=`${chrome.runtime.id}/v${chrome.runtime.getManifest().version}`),i}},3497:(e,t)=>{function o(e){const t=e.replace(/__MSG_(\w+)__/g,(function(e,t){return t?chrome.i18n.getMessage(t).replace(/</g,"&#60;").replace(/"/g,"&quot;").replace(/\n/g,"<br/>"):""}));return t!=e&&t}Object.defineProperty(t,"__esModule",{value:!0}),t.getLocalizedMessage=t.localizeHtmlPage=t.generateUserID=void 0,t.generateUserID=function(e=36){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let o="";const n="undefined"==typeof window?crypto:window.crypto;if(n&&n.getRandomValues){const i=new Uint32Array(e);n.getRandomValues(i);for(let n=0;n<e;n++)o+=t[i[n]%62];return o}for(let n=0;n<e;n++)o+=t[Math.floor(62*Math.random())];return o},t.localizeHtmlPage=function(){const e=o(document.title);e&&(document.title=e);const t=document.querySelector(".sponsorBlockPageBody"),n=o(t.innerHTML.toString());n&&(t.innerHTML=n)},t.getLocalizedMessage=o},2952:(e,t,o)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.setupTabUpdates=void 0;const n=o(1108);function i(e){chrome.tabs.sendMessage(e,{message:"update"},(()=>{chrome.runtime.lastError}))}function r(e){e.navigationApiAvailable&&(e.navigationApiAvailable.newValue?chrome.tabs.onUpdated.removeListener(i):chrome.tabs.onUpdated.addListener(i))}t.setupTabUpdates=function(e){chrome.tabs.onUpdated.addListener(i),(0,n.waitFor)((()=>null!==e.local)).then((()=>{e.local.navigationApiAvailable&&chrome.tabs.onUpdated.removeListener(i)})),e.configSyncListeners.includes(r)||e.configSyncListeners.push(r)}},1398:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=o(8272),r=o(8856);o(5335);const s=o(3531),a=o(2952),c=o(3497),l=o(205),u=o(8249),d=o(1108),p=o(2184),f=o(5144),h=o(7046),m=new l.default({registerFirefoxContentScript:v,unregisterFirefoxContentScript:w}),g={},y={};function v(e){var t,o,i,r;return n(this,void 0,void 0,(function*(){if("scripting"in chrome&&"getRegisteredContentScripts"in chrome.scripting){const t=yield h.chromeP.scripting.getRegisteredContentScripts({ids:[e.id]}).catch((()=>[]));if(t&&t.length>0&&e.matches.every((e=>t[0].matches.includes(e))))return}yield w(e.id),"scripting"in chrome&&"getRegisteredContentScripts"in chrome.scripting?yield h.chromeP.scripting.registerContentScripts([{id:e.id,runAt:"document_start",matches:e.matches,allFrames:e.allFrames,js:e.js,css:e.css,persistAcrossSessions:!0}]):chrome.contentScripts.register({allFrames:e.allFrames,js:null===(o=null===(t=e.js)||void 0===t?void 0:t.map)||void 0===o?void 0:o.call(t,(e=>({file:e}))),css:null===(r=null===(i=e.css)||void 0===i?void 0:i.map)||void 0===r?void 0:r.call(i,(e=>({file:e}))),matches:e.matches}).then((t=>{y[e.id]=t}))}))}function w(e){return n(this,void 0,void 0,(function*(){if("scripting"in chrome&&"getRegisteredContentScripts"in chrome.scripting)try{yield h.chromeP.scripting.unregisterContentScripts({ids:[e]})}catch(e){}else y[e]&&(y[e].unregister(),delete y[e])}))}m.wait((()=>r.default.isReady())).then((function(){r.default.config.supportInvidious&&m.setupExtraSiteContentScripts()})),(0,s.setupBackgroundRequestProxy)(),(0,a.setupTabUpdates)(r.default),chrome.runtime.onMessage.addListener((function(e,t,o){var a;switch(e.message){case"openConfig":return chrome.tabs.create({url:chrome.runtime.getURL("options/options.html"+(e.hash?"#"+e.hash:""))}),!1;case"openHelp":return chrome.tabs.create({url:chrome.runtime.getURL("help/index.html")}),!1;case"openPage":return chrome.tabs.create({url:chrome.runtime.getURL(e.url)}),!1;case"submitVote":return function(e,t,o,a){return n(this,void 0,void 0,(function*(){let l=r.default.config.userID;null!=l&&"undefined"!==l||(l=(0,c.generateUserID)(),r.default.config.userID=l);const u=void 0!==e?"&type="+e:"&category="+o;try{const e=yield function(e,t,o={}){return n(this,void 0,void 0,(function*(){const n=r.default.config.testingServer?i.testingServerAddress:r.default.config.serverAddress;return yield(0,s.sendRealRequestToCustomServer)(e,n+t,o)}))}("POST","/api/voteOnSponsorTime?UUID="+t+"&videoID="+a+"&userID="+l+u);return e.ok?{successType:1,responseText:yield e.text()}:405==e.status?{successType:0,statusCode:e.status,responseText:yield e.text()}:{successType:-1,statusCode:e.status,responseText:yield e.text()}}catch(e){return console.error(e),{successType:-1,statusCode:-1,responseText:""}}}))}(e.type,e.UUID,e.category,e.videoID).then(o),!0;case"registerContentScript":return v(e),!1;case"unregisterContentScript":return w(e.id),!1;case"tabs":return chrome.tabs.query({active:!0,currentWindow:!0},(t=>{chrome.tabs.sendMessage(t[0].id,e.data,(e=>{o(e)}))})),!0;case"time":case"infoUpdated":case"videoChanged":if(t.tab)try{null===(a=g[t.tab.id])||void 0===a||a.postMessage(e)}catch(e){}return!1;default:return!1}})),chrome.runtime.onMessageExternal.addListener(((e,t,o)=>{(0,u.getExtensionIdsToImportFrom)().includes(t.id)&&"requestConfig"===e.message&&o({userID:r.default.config.userID,allowExpirements:r.default.config.allowExpirements,showDonationLink:r.default.config.showDonationLink,showUpsells:r.default.config.showUpsells,darkMode:r.default.config.darkMode})})),chrome.runtime.onConnect.addListener((e=>{"popup"===e.name&&chrome.tabs.query({active:!0,currentWindow:!0},(t=>{g[t[0].id]=e}))})),chrome.runtime.onInstalled.addListener((function(){setTimeout((()=>n(this,void 0,void 0,(function*(){if(!r.default.config.userID&&!r.default.local.alreadyInstalled){chrome.tabs.create({url:chrome.runtime.getURL("/help/index.html")});const e=(0,c.generateUserID)();r.default.config.userID=e,r.default.local.alreadyInstalled=!0,r.default.config.categoryPillUpdate=!0}r.default.config.supportInvidious&&((yield m.containsInvidiousPermission())||chrome.tabs.create({url:chrome.runtime.getURL("/permissions/index.html")}))}))),1500),(0,d.isFirefoxOrSafari)()||((0,p.injectUpdatedScripts)().catch(f.logWarn),(0,d.waitFor)((()=>r.default.isReady())).then((()=>{r.default.config.supportInvidious&&(0,p.injectUpdatedScripts)([m.getExtraSiteRegistration()])})).catch(f.logWarn))}))},8856:(e,t,o)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.generateDebugDetails=void 0;const n=o(8272),i=o(5339),r=o(9209),s=o(1740);class a extends s.ProtoConfig{resetToDefault(){chrome.storage.sync.set(Object.assign(Object.assign({},this.syncDefaults),{userID:this.config.userID,minutesSaved:this.config.minutesSaved,skipCount:this.config.skipCount,sponsorTimesContributed:this.config.sponsorTimesContributed})),chrome.storage.local.set(Object.assign({},this.localDefaults))}}const c=new a({userID:null,isVip:!1,permissions:{},defaultCategory:"chooseACategory",renderSegmentsAsChapters:!1,whitelistedChannels:[],forceChannelCheck:!1,minutesSaved:0,skipCount:0,sponsorTimesContributed:0,submissionCountSinceCategories:0,showTimeWithSkips:!0,disableSkipping:!1,muteSegments:!0,fullVideoSegments:!0,fullVideoLabelsOnThumbnails:!0,manualSkipOnFullVideo:!1,trackViewCount:!0,trackViewCountInPrivate:!0,trackDownvotes:!0,trackDownvotesInPrivate:!1,dontShowNotice:!1,showUpcomingNotice:!1,noticeVisibilityMode:r.NoticeVisibilityMode.FadedForAutoSkip,hideVideoPlayerControls:!1,hideInfoButtonPlayerControls:!1,hideDeleteButtonPlayerControls:!1,hideUploadButtonPlayerControls:!1,hideSkipButtonPlayerControls:!1,hideDiscordLaunches:0,hideDiscordLink:!1,invidiousInstances:["invidious.snopyta.org"],supportInvidious:!1,serverAddress:n.serverAddress,minDuration:0,skipNoticeDuration:4,audioNotificationOnSkip:!1,checkForUnlistedVideos:!1,testingServer:!1,ytInfoPermissionGranted:!1,allowExpirements:!0,showDonationLink:!0,showPopupDonationCount:0,showUpsells:!0,showNewFeaturePopups:!0,donateClicked:0,autoHideInfoButton:!0,autoSkipOnMusicVideos:!1,skipNonMusicOnlyOnYoutubeMusic:!1,scrollToEditTimeUpdate:!1,categoryPillUpdate:!1,hookUpdate:!1,showChapterInfoMessage:!0,darkMode:!0,showCategoryGuidelines:!0,showCategoryWithoutPermission:!1,showSegmentNameInChapterBar:!0,showAutogeneratedChapters:!0,useVirtualTime:!0,showSegmentFailedToFetchWarning:!0,allowScrollingToEdit:!0,deArrowInstalled:!1,showDeArrowPromotion:!0,showDeArrowInSettings:!0,shownDeArrowPromotion:!1,showZoomToFillError2:!0,cleanPopup:!1,hideSegmentCreationInPopup:!1,categoryPillColors:{},skipKeybind:{key:"Enter"},skipToHighlightKeybind:{key:"Enter",ctrl:!0},startSponsorKeybind:{key:";"},submitKeybind:{key:"'"},actuallySubmitKeybind:{key:"'",ctrl:!0},previewKeybind:{key:";",ctrl:!0},nextChapterKeybind:{key:"ArrowRight",ctrl:!0},previousChapterKeybind:{key:"ArrowLeft",ctrl:!0},closeSkipNoticeKeybind:{key:"Backspace"},downvoteKeybind:{key:"h",shift:!0},upvoteKeybind:{key:"g",shift:!0},categorySelections:[{name:"sponsor",option:r.CategorySkipOption.AutoSkip},{name:"poi_highlight",option:r.CategorySkipOption.ManualSkip},{name:"exclusive_access",option:r.CategorySkipOption.ShowOverlay},{name:"chapter",option:r.CategorySkipOption.ShowOverlay}],payments:{licenseKey:null,lastCheck:0,lastFreeCheck:0,freeAccess:!1,chaptersAllowed:!1},colorPalette:{red:"#780303",white:"#ffffff",locked:"#ffc83d"},barTypes:{"preview-chooseACategory":{color:"#ffffff",opacity:"0.7"},sponsor:{color:"#00d400",opacity:"0.7"},"preview-sponsor":{color:"#007800",opacity:"0.7"},selfpromo:{color:"#ffff00",opacity:"0.7"},"preview-selfpromo":{color:"#bfbf35",opacity:"0.7"},exclusive_access:{color:"#008a5c",opacity:"0.7"},interaction:{color:"#cc00ff",opacity:"0.7"},"preview-interaction":{color:"#6c0087",opacity:"0.7"},intro:{color:"#00ffff",opacity:"0.7"},"preview-intro":{color:"#008080",opacity:"0.7"},outro:{color:"#0202ed",opacity:"0.7"},"preview-outro":{color:"#000070",opacity:"0.7"},preview:{color:"#008fd6",opacity:"0.7"},"preview-preview":{color:"#005799",opacity:"0.7"},hook:{color:"#395699",opacity:"0.8"},"preview-hook":{color:"#273963",opacity:"0.7"},music_offtopic:{color:"#ff9900",opacity:"0.7"},"preview-music_offtopic":{color:"#a6634a",opacity:"0.7"},poi_highlight:{color:"#ff1684",opacity:"0.7"},"preview-poi_highlight":{color:"#9b044c",opacity:"0.7"},filler:{color:"#7300FF",opacity:"0.9"},"preview-filler":{color:"#2E0066",opacity:"0.7"},chapter:{color:"#ffd983",opacity:"0"}}},{downvotedSegments:{},navigationApiAvailable:null,alreadyInstalled:!1,unsubmittedSegments:{},skipRules:[]},(function(e){if(e.changeChapterColor||(e.barTypes.chapter.color="#ffd983",e.changeChapterColor=!0,chrome.storage.sync.set({changeChapterColor:!0,barTypes:e.barTypes})),e.showZoomToFillError&&chrome.storage.sync.remove("showZoomToFillError"),e.unsubmittedSegments&&Object.keys(e.unsubmittedSegments).length>0&&chrome.storage.local.set({unsubmittedSegments:e.unsubmittedSegments},(()=>{chrome.storage.sync.remove("unsubmittedSegments")})),e.chapterCategoryAdded||(e.chapterCategoryAdded=!0,e.categorySelections.some((e=>"chapter"===e.name))||(e.categorySelections.push({name:"chapter",option:r.CategorySkipOption.ShowOverlay}),e.categorySelections=e.categorySelections)),void 0!==e.exclusive_accessCategoryAdded&&chrome.storage.sync.remove("exclusive_accessCategoryAdded"),void 0!==e.fillerUpdate&&chrome.storage.sync.remove("fillerUpdate"),void 0!==e.highlightCategoryAdded&&chrome.storage.sync.remove("highlightCategoryAdded"),void 0!==e.highlightCategoryUpdate&&chrome.storage.sync.remove("highlightCategoryUpdate"),e.askAboutUnlistedVideos&&chrome.storage.sync.remove("askAboutUnlistedVideos"),!e.autoSkipOnMusicVideosUpdate){e.autoSkipOnMusicVideosUpdate=!0;for(const t of e.categorySelections)if("music_offtopic"===t.name&&t.option===r.CategorySkipOption.AutoSkip){e.autoSkipOnMusicVideos=!0;break}}if(e.disableAutoSkip)for(const t of e.categorySelections)"sponsor"===t.name&&(t.option=r.CategorySkipOption.ManualSkip,chrome.storage.sync.remove("disableAutoSkip"));"string"==typeof e.skipKeybind&&(e.skipKeybind={key:e.skipKeybind}),"string"==typeof e.startSponsorKeybind&&(e.startSponsorKeybind={key:e.startSponsorKeybind}),"string"==typeof e.submitKeybind&&(e.submitKeybind={key:e.submitKeybind});const t=["skipKeybind","startSponsorKeybind","submitKeybind"];for(let o=t.length-1;o>=0;o--)for(let n=0;n<t.length;n++)o!=n&&(0,s.keybindEquals)(e[t[o]],e[t[n]])&&(e[t[o]]=null);void 0!==e.sponsorVideoID&&chrome.storage.sync.remove("sponsorVideoID"),void 0!==e.previousVideoID&&chrome.storage.sync.remove("previousVideoID"),!e.supportInvidious&&e.invidiousInstances.length<i.length&&(e.invidiousInstances=[...new Set([...i,...e.invidiousInstances])]),e.lastIsVipUpdate&&chrome.storage.sync.remove("lastIsVipUpdate")}));t.default=c,t.generateDebugDetails=function(){const e={debug:{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,extensionVersion:chrome.runtime.getManifest().version},config:JSON.parse(JSON.stringify(c.cachedSyncConfig))};return delete e.config.userID,e.config.serverAddress=e.config.serverAddress===n.serverAddress?"Default server address":"Custom server address",e.config.invidiousInstances=e.config.invidiousInstances.length,e.config.whitelistedChannels=e.config.whitelistedChannels.length,JSON.stringify(e,null,4)}},9209:(e,t)=>{var o,n,i,r,s,a;Object.defineProperty(t,"__esModule",{value:!0}),t.NoticeVisibilityMode=t.ChannelIDStatus=t.SponsorSourceType=t.ActionTypes=t.ActionType=t.SponsorHideType=t.CategorySkipOption=void 0,(a=t.CategorySkipOption||(t.CategorySkipOption={}))[a.Disabled=-1]="Disabled",a[a.ShowOverlay=0]="ShowOverlay",a[a.ManualSkip=1]="ManualSkip",a[a.AutoSkip=2]="AutoSkip",(s=t.SponsorHideType||(t.SponsorHideType={}))[s.Visible=void 0]="Visible",s[s.Downvoted=1]="Downvoted",s[s.MinimumDuration=2]="MinimumDuration",s[s.Hidden=3]="Hidden",function(e){e.Skip="skip",e.Mute="mute",e.Chapter="chapter",e.Full="full",e.Poi="poi"}(o=t.ActionType||(t.ActionType={})),t.ActionTypes=[o.Skip,o.Mute,o.Chapter,o.Full,o.Poi],(r=t.SponsorSourceType||(t.SponsorSourceType={}))[r.Server=void 0]="Server",r[r.Local=1]="Local",r[r.YouTube=2]="YouTube",r[r.Autogenerated=3]="Autogenerated",(i=t.ChannelIDStatus||(t.ChannelIDStatus={}))[i.Fetching=0]="Fetching",i[i.Found=1]="Found",i[i.Failed=2]="Failed",(n=t.NoticeVisibilityMode||(t.NoticeVisibilityMode={}))[n.FullSize=0]="FullSize",n[n.MiniForAutoSkip=1]="MiniForAutoSkip",n[n.MiniForAll=2]="MiniForAll",n[n.FadedForAutoSkip=3]="FadedForAutoSkip",n[n.FadedForAll=4]="FadedForAll"},205:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=o(8856),r=o(9209),s=o(3262),a=o(1108),c=o(4148),l=o(1740),u=o(6062);t.default=class{constructor(e=null){this.js=["./js/content.js"],this.css=["content.css","./libs/Source+Sans+Pro.css","popup.css","shared.css"],this.backgroundScriptContainer=e}wait(e,t=5e3,o=100){return n(this,void 0,void 0,(function*(){return(0,a.waitFor)(e,t,o)}))}containsPermission(e){return new Promise((t=>{chrome.permissions.contains(e,t)}))}setupExtraSitePermissions(e){const t=[];(0,l.isSafari)()&&t.push("webNavigation"),chrome.permissions.request({origins:this.getPermissionRegex(),permissions:t},(t=>n(this,void 0,void 0,(function*(){t?this.setupExtraSiteContentScripts():this.removeExtraSiteRegistration(),e(t)}))))}getExtraSiteRegistration(){return{message:"registerContentScript",id:"invidious",allFrames:!0,js:this.js,css:this.css,matches:this.getPermissionRegex()}}setupExtraSiteContentScripts(){const e=this.getExtraSiteRegistration();this.backgroundScriptContainer?this.backgroundScriptContainer.registerFirefoxContentScript(e):chrome.runtime.sendMessage(e)}removeExtraSiteRegistration(){const e="invidious";this.backgroundScriptContainer?this.backgroundScriptContainer.unregisterFirefoxContentScript(e):chrome.runtime.sendMessage({message:"unregisterContentScript",id:e}),chrome.permissions.remove({origins:this.getPermissionRegex()})}applyInvidiousPermissions(e,t="supportInvidious"){return new Promise((o=>{e?this.setupExtraSitePermissions((e=>{e||(i.default.config[t]=!1),o(e)})):(this.removeExtraSiteRegistration(),o(!1))}))}containsInvidiousPermission(){return new Promise((e=>{const t=[];(0,l.isSafari)()&&t.push("webNavigation"),chrome.permissions.contains({origins:this.getPermissionRegex(),permissions:t},(function(t){e(t)}))}))}getMergedTimestamps(e){let t=[];return e.forEach((e=>{const o=t.findIndex((t=>e[0]>=t[0]&&e[0]<=t[1])),n=t.findIndex((t=>e[1]>=t[0]&&e[1]<=t[1]));if(~o&&~n){if(o===n)return;const e=t.splice(Math.max(o,n),1)[0],i=t.splice(Math.min(o,n),1)[0];t.push([Math.min(e[0],i[0]),Math.max(e[1],i[1])])}else~o?t[o][1]=e[1]:~n?t[n][0]=e[0]:t.push(e.slice());t=t.filter((t=>!(t[0]>e[0]&&t[1]<e[1])))})),t}getTimestampsDuration(e){return this.getMergedTimestamps(e).reduce(((e,t)=>e+t[1]-t[0]),0)}getSponsorIndexFromUUID(e,t){for(let o=0;o<e.length;o++)if(e[o].UUID&&(e[o].UUID.startsWith(t)||t.startsWith(e[o].UUID)))return o;return-1}getSponsorTimeFromUUID(e,t){return e[this.getSponsorIndexFromUUID(e,t)]}getPermissionRegex(e=[]){const t=[];0===e.length&&(e=[...i.default.config.invidiousInstances]);for(const o of e)t.push("https://*."+o+"/*"),t.push("http://*."+o+"/*");return t}findReferenceNode(){var e,t;let o=(0,c.findValidElementFromSelector)(["#player-container-id","#movie_player",".html5-video-player","#c4-player","#player-container","#main-panel.ytmusic-player-page","#player-container .video-js",".main-video-section > .video-container",".shaka-video-container","#player-container.ytk-player","#id-tv-container"]);if(null==o){const n=document.getElementById("player");if(o=null==n?void 0:n.firstChild,o){let i=1;for(;i<n.children.length&&(!(null===(e=o.classList)||void 0===e?void 0:e.contains("html5-video-player"))||!(null===(t=o.classList)||void 0===t?void 0:t.contains("ytp-embed")));)o=n.children[i],i++}}return o}isContentScript(){return"http:"===window.location.protocol||"https:"===window.location.protocol}isHex(e){return Boolean(e.match(/^[0-9a-f]+$/i))}addHiddenSegment(e,t,o){return n(this,void 0,void 0,(function*(){if(chrome.extension.inIncognitoContext&&!i.default.config.trackDownvotesInPrivate||!i.default.config.trackDownvotes)return;if(t.length<60){const o=yield(0,u.asyncRequestToServer)("GET","/api/segmentID",{UUID:t,videoID:e});o.ok&&o.responseText&&(t=o.responseText)}const n=(yield(0,s.getHash)(e,1)).slice(0,4),a=yield(0,s.getHash)(t,1),c=i.default.local.downvotedSegments,l=c[n]||{segments:[],lastAccess:0};l.lastAccess=Date.now();const d=l.segments.find((e=>e.uuid===a));o===r.SponsorHideType.Visible?(l.segments.splice(l.segments.indexOf(d),1),0===l.segments.length&&delete c[n]):(d?d.hidden=o:l.segments.push({uuid:a,hidden:o}),c[n]=l);const p=Object.entries(c);if(p.length>1e4){let e=null;for(let t=0;t<p[0].length;t++)(null===e||p[t][1].lastAccess<e[1].lastAccess)&&(e=p[t]);delete c[e[0]]}i.default.forceLocalUpdate("downvotedSegments")}))}}},8249:(e,t,o)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getExtensionIdsToImportFrom=t.isDeArrowInstalled=void 0;const n=o(8272),i=o(8856),r=o(1740),s=o(1108);function a(){return(0,r.isSafari)()?n.extensionImportList.safari:(0,s.isFirefoxOrSafari)()?n.extensionImportList.firefox:n.extensionImportList.chromium}t.isDeArrowInstalled=function(){return i.default.config.deArrowInstalled?Promise.resolve(!0):new Promise((e=>{const t=a();let o=0;for(const n of t)chrome.runtime.sendMessage(n,{message:"isInstalled"},(n=>{if(chrome.runtime.lastError)return o++,void(o===t.length&&e(!1));e(n),n&&(i.default.config.deArrowInstalled=!0)}))}))},t.getExtensionIdsToImportFrom=a},5144:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.logWarn=t.logDebug=void 0,"undefined"!=typeof window&&(window.SBLogs={debug:[],warn:[]}),t.logDebug=function(e){"undefined"!=typeof window?window.SBLogs.debug.push(`[${(new Date).toISOString()}] ${e}`):console.log(`[${(new Date).toISOString()}] ${e}`)},t.logWarn=function(e){"undefined"!=typeof window?window.SBLogs.warn.push(`[${(new Date).toISOString()}] ${e}`):console.warn(`[${(new Date).toISOString()}] ${e}`)}},6062:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendRequestToServer=t.asyncRequestToServer=t.asyncRequestToCustomServer=void 0;const i=o(8856),r=o(8272),s=o(3531);function a(e,t,o={},n={}){return(0,s.sendRequestToCustomServer)(e,t,o,n)}t.asyncRequestToCustomServer=a,t.asyncRequestToServer=function(e,t,o={},s={}){return n(this,void 0,void 0,(function*(){const n=i.default.config.testingServer?r.testingServerAddress:i.default.config.serverAddress;return yield a(e,n+t,o,s)}))},t.sendRequestToServer=function(e,t,o){const n=i.default.config.testingServer?r.testingServerAddress:i.default.config.serverAddress;chrome.runtime.sendMessage({message:"sendRequest",type:e,url:n+t},(e=>{o(e)}))}},5335:()=>{const e=globalThis.chrome&&new function e(t){return new Proxy(t,{get(t,o){if(t[o])return"function"!=typeof t[o]?new e(t[o]):(...e)=>new Promise(((n,i)=>{t[o](...e,(e=>{chrome.runtime.lastError?i(new Error(chrome.runtime.lastError.message)):n(e)}))}))}})}(globalThis.chrome),t=/^(https?|wss?|file|ftp|\*):\/\/(\*|\*\.[^*/]+|[^*/]+)\/.*$|^file:\/\/\/.*$|^resource:\/\/(\*|\*\.[^*/]+|[^*/]+)\/.*$|^about:/,o="object"==typeof navigator&&navigator.userAgent.includes("Firefox/"),n=o?/^(https?|wss?):[/][/][^/]+([/].*)?$/:/^https?:[/][/][^/]+([/].*)?$/,i=/^(https?|file|ftp):[/]+/;function r(...e){return 0===e.length?/$./:e.includes("<all_urls>")?i:e.includes("*://*/*")?n:new RegExp(e.map((e=>function(e){if(!t.test(e))throw new Error(e+" is an invalid pattern, it must match "+String(t));let[,n,i,r]=e.split(/(^[^:]+:[/][/])([^/]+)?/);return n=n.replace("*",o?"(https?|wss?)":"https?").replace(/[/]/g,"[/]"),i=(null!=i?i:"").replace(/^[*][.]/,"([^/]+.)*").replace(/^[*]$/,"[^/]+").replace(/[.]/g,"[.]").replace(/[*]$/g,"[^.]+"),r=r.replace(/[/]/g,"[/]").replace(/[.]/g,"[.]").replace(/[*]/g,".*"),"^"+n+i+"("+r+")?$"}(e))).join("|"))}const s=Boolean(globalThis.chrome?.scripting);function a(e){return Array.isArray(e)?e:[e]}function c(e){return void 0===e?void 0:[e]}async function l({tabId:t,frameId:o,files:n,allFrames:i,matchAboutBlank:r,runAt:a},{ignoreTargetErrors:l}={}){const u=Promise.all(n.map((async n=>("string"==typeof n&&(n={file:n}),s?chrome.scripting.insertCSS({target:{tabId:t,frameIds:c(o),allFrames:void 0===o?i:void 0},files:"file"in n?[n.file]:void 0,css:"code"in n?n.code:void 0}):e.tabs.insertCSS(t,{...n,matchAboutBlank:r,allFrames:i,frameId:o,runAt:a??"document_start"})))));l?await p(u):await u}async function u({tabId:t,frameId:o,files:n,allFrames:i,matchAboutBlank:r,runAt:a},{ignoreTargetErrors:l}={}){const u=n.map((e=>"string"==typeof e?{file:e}:e));if(s){!function(e){if(e.some((e=>"code"in e)))throw new Error("chrome.scripting does not support injecting strings of `code`")}(u);const e=chrome.scripting.executeScript({target:{tabId:t,frameIds:c(o),allFrames:void 0===o?i:void 0},files:u.map((({file:e})=>e))});return void(l?await p(e):await e)}const d=[];for(const n of u)"code"in n&&await d.at(-1),d.push(e.tabs.executeScript(t,{...n,matchAboutBlank:r,allFrames:i,frameId:o,runAt:a}));l?await p(Promise.all(d)):await Promise.all(d)}const d=/^No frame with id \d+ in tab \d+.$|^No tab with id: \d+.$|^The tab was closed.$|^The frame was removed.$/;async function p(e){try{await e}catch(e){if(!d.test(e?.message))throw e}}const f="object"==typeof chrome&&"webNavigation"in chrome;"object"!=typeof chrome||chrome.contentScripts||(chrome.contentScripts={register:async function(t,o){const{js:n=[],css:i=[],matchAboutBlank:s,matches:c=[],excludeMatches:d,runAt:p}=t;let{allFrames:h}=t;if(f?h=!1:h&&console.warn("`allFrames: true` requires the `webNavigation` permission to work correctly: https://github.com/fregante/content-scripts-register-polyfill#permissions"),0===c.length)throw new Error("Type error for parameter contentScriptOptions (Error processing matches: Array requires at least 1 items; you have 0) for contentScripts.register.");await Promise.all(c.map((async t=>{if(!await e.permissions.contains({origins:[t]}))throw new Error("Permission denied to register a content script for "+t)})));const m=r(...c),g=r(...null!=d?d:[]),y=async(t,o,r=0)=>{m.test(t)&&!g.test(t)&&await async function(t){return e.permissions.contains({origins:[new URL(t).origin+"/*"]})}(t)&&await async function(e,t,o={}){const n=a(e);await Promise.all(n.map((async e=>async function({frameId:e,tabId:t,allFrames:o},n,i={}){const r=a(n).flatMap((n=>[l({tabId:t,frameId:e,allFrames:o,files:n.css??[],matchAboutBlank:n.matchAboutBlank??n.match_about_blank,runAt:n.runAt??n.run_at},i),u({tabId:t,frameId:e,allFrames:o,files:n.js??[],matchAboutBlank:n.matchAboutBlank??n.match_about_blank,runAt:n.runAt??n.run_at},i)]));await Promise.all(r)}(function(e){return"object"==typeof e?{...e,allFrames:!1}:{tabId:e,frameId:void 0,allFrames:!0}}(e),t,o))))}({tabId:o,frameId:r},{css:i,js:n,matchAboutBlank:s,runAt:p},{ignoreTargetErrors:!0})},v=async(e,{status:t},{url:o})=>{"loading"===t&&o&&y(o,e)},w=async({tabId:e,frameId:t,url:o})=>{y(o,e,t)};f?chrome.webNavigation.onCommitted.addListener(w):chrome.tabs.onUpdated.addListener(v);const S={async unregister(){f?chrome.webNavigation.onCommitted.removeListener(w):chrome.tabs.onUpdated.removeListener(v)}};return"function"==typeof o&&o(S),S}})},5339:e=>{e.exports=JSON.parse('["www.youtubekids.com","inv.nadeko.net","inv.tux.pizza","invidious.adminforge.de","invidious.jing.rocks","invidious.nerdvpn.de","invidious.perennialte.ch","invidious.privacyredirect.com","invidious.reallyaweso.me","invidious.yourdevice.ch","iv.ggtyler.dev","iv.nboeck.de","yewtu.be"]')},8272:e=>{e.exports=JSON.parse('{"serverAddress":"https://sponsor.ajay.app","testingServerAddress":"https://sponsor.ajay.app/test","serverAddressComment":"This specifies the default SponsorBlock server to connect to","categoryList":["sponsor","selfpromo","exclusive_access","interaction","poi_highlight","intro","outro","preview","hook","filler","chapter","music_offtopic"],"categorySupport":{"sponsor":["skip","mute","full"],"selfpromo":["skip","mute","full"],"exclusive_access":["full"],"interaction":["skip","mute"],"intro":["skip","mute"],"outro":["skip","mute"],"preview":["skip","mute"],"hook":["skip","mute"],"filler":["skip","mute"],"music_offtopic":["skip"],"poi_highlight":["poi"],"chapter":["chapter"]},"wikiLinks":{"sponsor":"https://wiki.sponsor.ajay.app/w/Sponsor","selfpromo":"https://wiki.sponsor.ajay.app/w/Unpaid/Self_Promotion","exclusive_access":"https://wiki.sponsor.ajay.app/w/Exclusive_Access","interaction":"https://wiki.sponsor.ajay.app/w/Interaction_Reminder_(Subscribe)","intro":"https://wiki.sponsor.ajay.app/w/Intermission/Intro_Animation","outro":"https://wiki.sponsor.ajay.app/w/Endcards/Credits","preview":"https://wiki.sponsor.ajay.app/w/Preview/Recap","hook":"https://wiki.sponsor.ajay.app/w/Hook/Greetings","filler":"https://wiki.sponsor.ajay.app/w/Tangents/Jokes","music_offtopic":"https://wiki.sponsor.ajay.app/w/Music:_Non-Music_Section","poi_highlight":"https://wiki.sponsor.ajay.app/w/Highlight","guidelines":"https://wiki.sponsor.ajay.app/w/Guidelines","mute":"https://wiki.sponsor.ajay.app/w/Mute_Segment","chapter":"https://wiki.sponsor.ajay.app/w/Chapter"},"extensionImportList":{"chromium":["enamippconapkdmgfgjchkhakpfinmaj"],"firefox":["deArrow@ajay.app","deArrowBETA@ajay.app"],"safari":["app.ajay.dearrow.extension"]}}')}},t={};!function o(n){var i=t[n];if(void 0!==i)return i.exports;var r=t[n]={exports:{}};return e[n].call(r.exports,r,r.exports,o),r.exports}(1398)})(); +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/js/content.js b/data/extensions/sponsorBlocker@ajay.app/js/content.js @@ -0,0 +1,2 @@ +/*! For license information please see content.js.LICENSE.txt */ +(()=>{"use strict";var e={2551:(e,t,n)=>{var o=n(6540),i=n(9982);function r(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var s=new Set,a={};function l(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(a[e]=t,e=0;e<t.length;e++)s.add(t[e])}var c=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,p=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,h={},f={};function m(e,t,n,o,i,r,s){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=o,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=r,this.removeEmptyString=s}var g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new m(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function b(e,t,n,o){var i=g.hasOwnProperty(t)?g[t]:null;(null!==i?0!==i.type:o||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,o){if(null==t||function(e,t,n,o){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!o&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,o))return!0;if(o)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,i,o)&&(n=null),o||null===i?function(e){return!!d.call(f,e)||!d.call(h,e)&&(p.test(e)?f[e]=!0:(h[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):i.mustUseProperty?e[i.propertyName]=null===n?3!==i.type&&"":n:(t=i.attributeName,o=i.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(i=i.type)||4===i&&!0===n?"":""+n,o?e.setAttributeNS(o,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);g[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);g[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);g[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var S=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,w=Symbol.for("react.element"),T=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),C=Symbol.for("react.strict_mode"),x=Symbol.for("react.profiler"),E=Symbol.for("react.provider"),M=Symbol.for("react.context"),I=Symbol.for("react.forward_ref"),N=Symbol.for("react.suspense"),P=Symbol.for("react.suspense_list"),D=Symbol.for("react.memo"),L=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var _=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var A=Symbol.iterator;function O(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=A&&e[A]||e["@@iterator"])?e:null}var B,V=Object.assign;function R(e){if(void 0===B)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);B=t&&t[1]||""}return"\n"+B+e}var U=!1;function F(e,t){if(!e||U)return"";U=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(e){var o=e}Reflect.construct(e,[],t)}else{try{t.call()}catch(e){o=e}e.call(t.prototype)}else{try{throw Error()}catch(e){o=e}e()}}catch(t){if(t&&o&&"string"==typeof t.stack){for(var i=t.stack.split("\n"),r=o.stack.split("\n"),s=i.length-1,a=r.length-1;1<=s&&0<=a&&i[s]!==r[a];)a--;for(;1<=s&&0<=a;s--,a--)if(i[s]!==r[a]){if(1!==s||1!==a)do{if(s--,0>--a||i[s]!==r[a]){var l="\n"+i[s].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}}while(1<=s&&0<=a);break}}}finally{U=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?R(e):""}function z(e){switch(e.tag){case 5:return R(e.type);case 16:return R("Lazy");case 13:return R("Suspense");case 19:return R("SuspenseList");case 0:case 2:case 15:return F(e.type,!1);case 11:return F(e.type.render,!1);case 1:return F(e.type,!0);default:return""}}function j(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case k:return"Fragment";case T:return"Portal";case x:return"Profiler";case C:return"StrictMode";case N:return"Suspense";case P:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case M:return(e.displayName||"Context")+".Consumer";case E:return(e._context.displayName||"Context")+".Provider";case I:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case D:return null!==(t=e.displayName||null)?t:j(e.type)||"Memo";case L:t=e._payload,e=e._init;try{return j(e(t))}catch(e){}}return null}function H(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return j(t);case 8:return t===C?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function q(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function $(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Y(e){e._valueTracker||(e._valueTracker=function(e){var t=$(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var i=n.get,r=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(e){o=""+e,r.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return o},setValue:function(e){o=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),o="";return e&&(o=$(e)?e.checked?"true":"false":e.value),(e=o)!==n&&(t.setValue(e),!0)}function K(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function G(e,t){var n=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Q(e,t){var n=null==t.defaultValue?"":t.defaultValue,o=null!=t.checked?t.checked:t.defaultChecked;n=q(null!=t.value?t.value:n),e._wrapperState={initialChecked:o,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function X(e,t){null!=(t=t.checked)&&b(e,"checked",t,!1)}function J(e,t){X(e,t);var n=q(t.value),o=t.type;if(null!=n)"number"===o?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===o||"reset"===o)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,q(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function Z(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!("submit"!==o&&"reset"!==o||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&K(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,o){if(e=e.options,t){t={};for(var i=0;i<n.length;i++)t["$"+n[i]]=!0;for(n=0;n<e.length;n++)i=t.hasOwnProperty("$"+e[n].value),e[n].selected!==i&&(e[n].selected=i),i&&o&&(e[n].defaultSelected=!0)}else{for(n=""+q(n),t=null,i=0;i<e.length;i++){if(e[i].value===n)return e[i].selected=!0,void(o&&(e[i].defaultSelected=!0));null!==t||e[i].disabled||(t=e[i])}null!==t&&(t.selected=!0)}}function oe(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(r(91));return V({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function ie(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(r(92));if(te(n)){if(1<n.length)throw Error(r(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:q(n)}}function re(e,t){var n=q(t.value),o=q(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=o&&(e.defaultValue=""+o)}function se(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function ae(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function le(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?ae(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ue,ce,de=(ce=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ue=ue||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ue.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,o){MSApp.execUnsafeLocalFunction((function(){return ce(e,t)}))}:ce);function pe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var he={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},fe=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||he.hasOwnProperty(e)&&he[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var o=0===n.indexOf("--"),i=me(n,t[n],o);"float"===n&&(n="cssFloat"),o?e.setProperty(n,i):e[n]=i}}Object.keys(he).forEach((function(e){fe.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),he[t]=he[e]}))}));var ve=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ye(e,t){if(t){if(ve[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(r(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(r(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(r(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(r(62))}}function be(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Se=null;function we(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Te=null,ke=null,Ce=null;function xe(e){if(e=Si(e)){if("function"!=typeof Te)throw Error(r(280));var t=e.stateNode;t&&(t=Ti(t),Te(e.stateNode,e.type,t))}}function Ee(e){ke?Ce?Ce.push(e):Ce=[e]:ke=e}function Me(){if(ke){var e=ke,t=Ce;if(Ce=ke=null,xe(e),t)for(e=0;e<t.length;e++)xe(t[e])}}function Ie(e,t){return e(t)}function Ne(){}var Pe=!1;function De(e,t,n){if(Pe)return e(t,n);Pe=!0;try{return Ie(e,t,n)}finally{Pe=!1,(null!==ke||null!==Ce)&&(Ne(),Me())}}function Le(e,t){var n=e.stateNode;if(null===n)return null;var o=Ti(n);if(null===o)return null;n=o[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(o=!o.disabled)||(o=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!o;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(r(231,t,typeof n));return n}var _e=!1;if(c)try{var Ae={};Object.defineProperty(Ae,"passive",{get:function(){_e=!0}}),window.addEventListener("test",Ae,Ae),window.removeEventListener("test",Ae,Ae)}catch(ce){_e=!1}function Oe(e,t,n,o,i,r,s,a,l){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(e){this.onError(e)}}var Be=!1,Ve=null,Re=!1,Ue=null,Fe={onError:function(e){Be=!0,Ve=e}};function ze(e,t,n,o,i,r,s,a,l){Be=!1,Ve=null,Oe.apply(Fe,arguments)}function je(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function He(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==(e=e.alternate)&&(t=e.memoizedState),null!==t)return t.dehydrated}return null}function qe(e){if(je(e)!==e)throw Error(r(188))}function $e(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=je(e)))throw Error(r(188));return t!==e?null:e}for(var n=e,o=t;;){var i=n.return;if(null===i)break;var s=i.alternate;if(null===s){if(null!==(o=i.return)){n=o;continue}break}if(i.child===s.child){for(s=i.child;s;){if(s===n)return qe(i),e;if(s===o)return qe(i),t;s=s.sibling}throw Error(r(188))}if(n.return!==o.return)n=i,o=s;else{for(var a=!1,l=i.child;l;){if(l===n){a=!0,n=i,o=s;break}if(l===o){a=!0,o=i,n=s;break}l=l.sibling}if(!a){for(l=s.child;l;){if(l===n){a=!0,n=s,o=i;break}if(l===o){a=!0,o=s,n=i;break}l=l.sibling}if(!a)throw Error(r(189))}}if(n.alternate!==o)throw Error(r(190))}if(3!==n.tag)throw Error(r(188));return n.stateNode.current===n?e:t}(e))?Ye(e):null}function Ye(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ye(e);if(null!==t)return t;e=e.sibling}return null}var We=i.unstable_scheduleCallback,Ke=i.unstable_cancelCallback,Ge=i.unstable_shouldYield,Qe=i.unstable_requestPaint,Xe=i.unstable_now,Je=i.unstable_getCurrentPriorityLevel,Ze=i.unstable_ImmediatePriority,et=i.unstable_UserBlockingPriority,tt=i.unstable_NormalPriority,nt=i.unstable_LowPriority,ot=i.unstable_IdlePriority,it=null,rt=null,st=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(at(e)/lt|0)|0},at=Math.log,lt=Math.LN2,ut=64,ct=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var o=0,i=e.suspendedLanes,r=e.pingedLanes,s=268435455&n;if(0!==s){var a=s&~i;0!==a?o=dt(a):0!=(r&=s)&&(o=dt(r))}else 0!=(s=n&~i)?o=dt(s):0!==r&&(o=dt(r));if(0===o)return 0;if(0!==t&&t!==o&&!(t&i)&&((i=o&-o)>=(r=t&-t)||16===i&&4194240&r))return t;if(4&o&&(o|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=o;0<t;)i=1<<(n=31-st(t)),o|=e[n],t&=~i;return o}function ht(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function ft(e){return 0!=(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function mt(){var e=ut;return!(4194240&(ut<<=1))&&(ut=64),e}function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function vt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-st(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var o=31-st(n),i=1<<o;i&t|e[o]&t&&(e[o]|=t),n&=~i}}var bt=0;function St(e){return 1<(e&=-e)?4<e?268435455&e?16:536870912:4:1}var wt,Tt,kt,Ct,xt,Et=!1,Mt=[],It=null,Nt=null,Pt=null,Dt=new Map,Lt=new Map,_t=[],At="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Ot(e,t){switch(e){case"focusin":case"focusout":It=null;break;case"dragenter":case"dragleave":Nt=null;break;case"mouseover":case"mouseout":Pt=null;break;case"pointerover":case"pointerout":Dt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Lt.delete(t.pointerId)}}function Bt(e,t,n,o,i,r){return null===e||e.nativeEvent!==r?(e={blockedOn:t,domEventName:n,eventSystemFlags:o,nativeEvent:r,targetContainers:[i]},null!==t&&null!==(t=Si(t))&&Tt(t),e):(e.eventSystemFlags|=o,t=e.targetContainers,null!==i&&-1===t.indexOf(i)&&t.push(i),e)}function Vt(e){var t=bi(e.target);if(null!==t){var n=je(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=He(n)))return e.blockedOn=t,void xt(e.priority,(function(){kt(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Rt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Gt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=Si(n))&&Tt(t),e.blockedOn=n,!1;var o=new(n=e.nativeEvent).constructor(n.type,n);Se=o,n.target.dispatchEvent(o),Se=null,t.shift()}return!0}function Ut(e,t,n){Rt(e)&&n.delete(t)}function Ft(){Et=!1,null!==It&&Rt(It)&&(It=null),null!==Nt&&Rt(Nt)&&(Nt=null),null!==Pt&&Rt(Pt)&&(Pt=null),Dt.forEach(Ut),Lt.forEach(Ut)}function zt(e,t){e.blockedOn===t&&(e.blockedOn=null,Et||(Et=!0,i.unstable_scheduleCallback(i.unstable_NormalPriority,Ft)))}function jt(e){function t(t){return zt(t,e)}if(0<Mt.length){zt(Mt[0],e);for(var n=1;n<Mt.length;n++){var o=Mt[n];o.blockedOn===e&&(o.blockedOn=null)}}for(null!==It&&zt(It,e),null!==Nt&&zt(Nt,e),null!==Pt&&zt(Pt,e),Dt.forEach(t),Lt.forEach(t),n=0;n<_t.length;n++)(o=_t[n]).blockedOn===e&&(o.blockedOn=null);for(;0<_t.length&&null===(n=_t[0]).blockedOn;)Vt(n),null===n.blockedOn&&_t.shift()}var Ht=S.ReactCurrentBatchConfig,qt=!0;function $t(e,t,n,o){var i=bt,r=Ht.transition;Ht.transition=null;try{bt=1,Wt(e,t,n,o)}finally{bt=i,Ht.transition=r}}function Yt(e,t,n,o){var i=bt,r=Ht.transition;Ht.transition=null;try{bt=4,Wt(e,t,n,o)}finally{bt=i,Ht.transition=r}}function Wt(e,t,n,o){if(qt){var i=Gt(e,t,n,o);if(null===i)$o(e,t,o,Kt,n),Ot(e,o);else if(function(e,t,n,o,i){switch(t){case"focusin":return It=Bt(It,e,t,n,o,i),!0;case"dragenter":return Nt=Bt(Nt,e,t,n,o,i),!0;case"mouseover":return Pt=Bt(Pt,e,t,n,o,i),!0;case"pointerover":var r=i.pointerId;return Dt.set(r,Bt(Dt.get(r)||null,e,t,n,o,i)),!0;case"gotpointercapture":return r=i.pointerId,Lt.set(r,Bt(Lt.get(r)||null,e,t,n,o,i)),!0}return!1}(i,e,t,n,o))o.stopPropagation();else if(Ot(e,o),4&t&&-1<At.indexOf(e)){for(;null!==i;){var r=Si(i);if(null!==r&&wt(r),null===(r=Gt(e,t,n,o))&&$o(e,t,o,Kt,n),r===i)break;i=r}null!==i&&o.stopPropagation()}else $o(e,t,o,null,n)}}var Kt=null;function Gt(e,t,n,o){if(Kt=null,null!==(e=bi(e=we(o))))if(null===(t=je(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=He(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Kt=e,null}function Qt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Je()){case Ze:return 1;case et:return 4;case tt:case nt:return 16;case ot:return 536870912;default:return 16}default:return 16}}var Xt=null,Jt=null,Zt=null;function en(){if(Zt)return Zt;var e,t,n=Jt,o=n.length,i="value"in Xt?Xt.value:Xt.textContent,r=i.length;for(e=0;e<o&&n[e]===i[e];e++);var s=o-e;for(t=1;t<=s&&n[o-t]===i[r-t];t++);return Zt=i.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function on(){return!1}function rn(e){function t(t,n,o,i,r){for(var s in this._reactName=t,this._targetInst=o,this.type=n,this.nativeEvent=i,this.target=r,this.currentTarget=null,e)e.hasOwnProperty(s)&&(t=e[s],this[s]=t?t(i):i[s]);return this.isDefaultPrevented=(null!=i.defaultPrevented?i.defaultPrevented:!1===i.returnValue)?nn:on,this.isPropagationStopped=on,this}return V(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var sn,an,ln,un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},cn=rn(un),dn=V({},un,{view:0,detail:0}),pn=rn(dn),hn=V({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:xn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ln&&(ln&&"mousemove"===e.type?(sn=e.screenX-ln.screenX,an=e.screenY-ln.screenY):an=sn=0,ln=e),sn)},movementY:function(e){return"movementY"in e?e.movementY:an}}),fn=rn(hn),mn=rn(V({},hn,{dataTransfer:0})),gn=rn(V({},dn,{relatedTarget:0})),vn=rn(V({},un,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=V({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),bn=rn(yn),Sn=rn(V({},un,{data:0})),wn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Tn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},kn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=kn[e])&&!!t[e]}function xn(){return Cn}var En=V({},dn,{key:function(e){if(e.key){var t=wn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?Tn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:xn,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Mn=rn(En),In=rn(V({},hn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Nn=rn(V({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:xn})),Pn=rn(V({},un,{propertyName:0,elapsedTime:0,pseudoElement:0})),Dn=V({},hn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Ln=rn(Dn),_n=[9,13,27,32],An=c&&"CompositionEvent"in window,On=null;c&&"documentMode"in document&&(On=document.documentMode);var Bn=c&&"TextEvent"in window&&!On,Vn=c&&(!An||On&&8<On&&11>=On),Rn=String.fromCharCode(32),Un=!1;function Fn(e,t){switch(e){case"keyup":return-1!==_n.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function zn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var jn=!1,Hn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function qn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Hn[e.type]:"textarea"===t}function $n(e,t,n,o){Ee(o),0<(t=Wo(t,"onChange")).length&&(n=new cn("onChange","change",null,n,o),e.push({event:n,listeners:t}))}var Yn=null,Wn=null;function Kn(e){Uo(e,0)}function Gn(e){if(W(wi(e)))return e}function Qn(e,t){if("change"===e)return t}var Xn=!1;if(c){var Jn;if(c){var Zn="oninput"in document;if(!Zn){var eo=document.createElement("div");eo.setAttribute("oninput","return;"),Zn="function"==typeof eo.oninput}Jn=Zn}else Jn=!1;Xn=Jn&&(!document.documentMode||9<document.documentMode)}function to(){Yn&&(Yn.detachEvent("onpropertychange",no),Wn=Yn=null)}function no(e){if("value"===e.propertyName&&Gn(Wn)){var t=[];$n(t,Wn,e,we(e)),De(Kn,t)}}function oo(e,t,n){"focusin"===e?(to(),Wn=n,(Yn=t).attachEvent("onpropertychange",no)):"focusout"===e&&to()}function io(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Gn(Wn)}function ro(e,t){if("click"===e)return Gn(t)}function so(e,t){if("input"===e||"change"===e)return Gn(t)}var ao="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function lo(e,t){if(ao(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;for(o=0;o<n.length;o++){var i=n[o];if(!d.call(t,i)||!ao(e[i],t[i]))return!1}return!0}function uo(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function co(e,t){var n,o=uo(e);for(e=0;o;){if(3===o.nodeType){if(n=e+o.textContent.length,e<=t&&n>=t)return{node:o,offset:t-e};e=n}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=uo(o)}}function po(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?po(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function ho(){for(var e=window,t=K();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=K((e=t.contentWindow).document)}return t}function fo(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function mo(e){var t=ho(),n=e.focusedElem,o=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&po(n.ownerDocument.documentElement,n)){if(null!==o&&fo(n))if(t=o.start,void 0===(e=o.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var i=n.textContent.length,r=Math.min(o.start,i);o=void 0===o.end?r:Math.min(o.end,i),!e.extend&&r>o&&(i=o,o=r,r=i),i=co(n,r);var s=co(n,o);i&&s&&(1!==e.rangeCount||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&((t=t.createRange()).setStart(i.node,i.offset),e.removeAllRanges(),r>o?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var go=c&&"documentMode"in document&&11>=document.documentMode,vo=null,yo=null,bo=null,So=!1;function wo(e,t,n){var o=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;So||null==vo||vo!==K(o)||(o="selectionStart"in(o=vo)&&fo(o)?{start:o.selectionStart,end:o.selectionEnd}:{anchorNode:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset},bo&&lo(bo,o)||(bo=o,0<(o=Wo(yo,"onSelect")).length&&(t=new cn("onSelect","select",null,t,n),e.push({event:t,listeners:o}),t.target=vo)))}function To(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var ko={animationend:To("Animation","AnimationEnd"),animationiteration:To("Animation","AnimationIteration"),animationstart:To("Animation","AnimationStart"),transitionend:To("Transition","TransitionEnd")},Co={},xo={};function Eo(e){if(Co[e])return Co[e];if(!ko[e])return e;var t,n=ko[e];for(t in n)if(n.hasOwnProperty(t)&&t in xo)return Co[e]=n[t];return e}c&&(xo=document.createElement("div").style,"AnimationEvent"in window||(delete ko.animationend.animation,delete ko.animationiteration.animation,delete ko.animationstart.animation),"TransitionEvent"in window||delete ko.transitionend.transition);var Mo=Eo("animationend"),Io=Eo("animationiteration"),No=Eo("animationstart"),Po=Eo("transitionend"),Do=new Map,Lo="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function _o(e,t){Do.set(e,t),l(t,[e])}for(var Ao=0;Ao<Lo.length;Ao++){var Oo=Lo[Ao];_o(Oo.toLowerCase(),"on"+(Oo[0].toUpperCase()+Oo.slice(1)))}_o(Mo,"onAnimationEnd"),_o(Io,"onAnimationIteration"),_o(No,"onAnimationStart"),_o("dblclick","onDoubleClick"),_o("focusin","onFocus"),_o("focusout","onBlur"),_o(Po,"onTransitionEnd"),u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),l("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),l("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),l("onBeforeInput",["compositionend","keypress","textInput","paste"]),l("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Bo="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Vo=new Set("cancel close invalid load scroll toggle".split(" ").concat(Bo));function Ro(e,t,n){var o=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,o,i,s,a,l,u){if(ze.apply(this,arguments),Be){if(!Be)throw Error(r(198));var c=Ve;Be=!1,Ve=null,Re||(Re=!0,Ue=c)}}(o,t,void 0,e),e.currentTarget=null}function Uo(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var o=e[n],i=o.event;o=o.listeners;e:{var r=void 0;if(t)for(var s=o.length-1;0<=s;s--){var a=o[s],l=a.instance,u=a.currentTarget;if(a=a.listener,l!==r&&i.isPropagationStopped())break e;Ro(i,a,u),r=l}else for(s=0;s<o.length;s++){if(l=(a=o[s]).instance,u=a.currentTarget,a=a.listener,l!==r&&i.isPropagationStopped())break e;Ro(i,a,u),r=l}}}if(Re)throw e=Ue,Re=!1,Ue=null,e}function Fo(e,t){var n=t[gi];void 0===n&&(n=t[gi]=new Set);var o=e+"__bubble";n.has(o)||(qo(t,e,2,!1),n.add(o))}function zo(e,t,n){var o=0;t&&(o|=4),qo(n,e,o,t)}var jo="_reactListening"+Math.random().toString(36).slice(2);function Ho(e){if(!e[jo]){e[jo]=!0,s.forEach((function(t){"selectionchange"!==t&&(Vo.has(t)||zo(t,!1,e),zo(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[jo]||(t[jo]=!0,zo("selectionchange",!1,t))}}function qo(e,t,n,o){switch(Qt(t)){case 1:var i=$t;break;case 4:i=Yt;break;default:i=Wt}n=i.bind(null,t,n,e),i=void 0,!_e||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(i=!0),o?void 0!==i?e.addEventListener(t,n,{capture:!0,passive:i}):e.addEventListener(t,n,!0):void 0!==i?e.addEventListener(t,n,{passive:i}):e.addEventListener(t,n,!1)}function $o(e,t,n,o,i){var r=o;if(!(1&t||2&t||null===o))e:for(;;){if(null===o)return;var s=o.tag;if(3===s||4===s){var a=o.stateNode.containerInfo;if(a===i||8===a.nodeType&&a.parentNode===i)break;if(4===s)for(s=o.return;null!==s;){var l=s.tag;if((3===l||4===l)&&((l=s.stateNode.containerInfo)===i||8===l.nodeType&&l.parentNode===i))return;s=s.return}for(;null!==a;){if(null===(s=bi(a)))return;if(5===(l=s.tag)||6===l){o=r=s;continue e}a=a.parentNode}}o=o.return}De((function(){var o=r,i=we(n),s=[];e:{var a=Do.get(e);if(void 0!==a){var l=cn,u=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":l=Mn;break;case"focusin":u="focus",l=gn;break;case"focusout":u="blur",l=gn;break;case"beforeblur":case"afterblur":l=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":l=fn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=mn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=Nn;break;case Mo:case Io:case No:l=vn;break;case Po:l=Pn;break;case"scroll":l=pn;break;case"wheel":l=Ln;break;case"copy":case"cut":case"paste":l=bn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=In}var c=!!(4&t),d=!c&&"scroll"===e,p=c?null!==a?a+"Capture":null:a;c=[];for(var h,f=o;null!==f;){var m=(h=f).stateNode;if(5===h.tag&&null!==m&&(h=m,null!==p&&null!=(m=Le(f,p))&&c.push(Yo(f,m,h))),d)break;f=f.return}0<c.length&&(a=new l(a,u,null,n,i),s.push({event:a,listeners:c}))}}if(!(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(a="mouseover"===e||"pointerover"===e)||n===Se||!(u=n.relatedTarget||n.fromElement)||!bi(u)&&!u[mi])&&(l||a)&&(a=i.window===i?i:(a=i.ownerDocument)?a.defaultView||a.parentWindow:window,l?(l=o,null!==(u=(u=n.relatedTarget||n.toElement)?bi(u):null)&&(u!==(d=je(u))||5!==u.tag&&6!==u.tag)&&(u=null)):(l=null,u=o),l!==u)){if(c=fn,m="onMouseLeave",p="onMouseEnter",f="mouse","pointerout"!==e&&"pointerover"!==e||(c=In,m="onPointerLeave",p="onPointerEnter",f="pointer"),d=null==l?a:wi(l),h=null==u?a:wi(u),(a=new c(m,f+"leave",l,n,i)).target=d,a.relatedTarget=h,m=null,bi(i)===o&&((c=new c(p,f+"enter",u,n,i)).target=h,c.relatedTarget=d,m=c),d=m,l&&u)e:{for(p=u,f=0,h=c=l;h;h=Ko(h))f++;for(h=0,m=p;m;m=Ko(m))h++;for(;0<f-h;)c=Ko(c),f--;for(;0<h-f;)p=Ko(p),h--;for(;f--;){if(c===p||null!==p&&c===p.alternate)break e;c=Ko(c),p=Ko(p)}c=null}else c=null;null!==l&&Go(s,a,l,c,!1),null!==u&&null!==d&&Go(s,d,u,c,!0)}if("select"===(l=(a=o?wi(o):window).nodeName&&a.nodeName.toLowerCase())||"input"===l&&"file"===a.type)var g=Qn;else if(qn(a))if(Xn)g=so;else{g=io;var v=oo}else(l=a.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===a.type||"radio"===a.type)&&(g=ro);switch(g&&(g=g(e,o))?$n(s,g,n,i):(v&&v(e,a,o),"focusout"===e&&(v=a._wrapperState)&&v.controlled&&"number"===a.type&&ee(a,"number",a.value)),v=o?wi(o):window,e){case"focusin":(qn(v)||"true"===v.contentEditable)&&(vo=v,yo=o,bo=null);break;case"focusout":bo=yo=vo=null;break;case"mousedown":So=!0;break;case"contextmenu":case"mouseup":case"dragend":So=!1,wo(s,n,i);break;case"selectionchange":if(go)break;case"keydown":case"keyup":wo(s,n,i)}var y;if(An)e:{switch(e){case"compositionstart":var b="onCompositionStart";break e;case"compositionend":b="onCompositionEnd";break e;case"compositionupdate":b="onCompositionUpdate";break e}b=void 0}else jn?Fn(e,n)&&(b="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(b="onCompositionStart");b&&(Vn&&"ko"!==n.locale&&(jn||"onCompositionStart"!==b?"onCompositionEnd"===b&&jn&&(y=en()):(Jt="value"in(Xt=i)?Xt.value:Xt.textContent,jn=!0)),0<(v=Wo(o,b)).length&&(b=new Sn(b,e,null,n,i),s.push({event:b,listeners:v}),(y||null!==(y=zn(n)))&&(b.data=y))),(y=Bn?function(e,t){switch(e){case"compositionend":return zn(t);case"keypress":return 32!==t.which?null:(Un=!0,Rn);case"textInput":return(e=t.data)===Rn&&Un?null:e;default:return null}}(e,n):function(e,t){if(jn)return"compositionend"===e||!An&&Fn(e,t)?(e=en(),Zt=Jt=Xt=null,jn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Vn&&"ko"!==t.locale?null:t.data}}(e,n))&&0<(o=Wo(o,"onBeforeInput")).length&&(i=new Sn("onBeforeInput","beforeinput",null,n,i),s.push({event:i,listeners:o}),i.data=y)}Uo(s,t)}))}function Yo(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Wo(e,t){for(var n=t+"Capture",o=[];null!==e;){var i=e,r=i.stateNode;5===i.tag&&null!==r&&(i=r,null!=(r=Le(e,n))&&o.unshift(Yo(e,r,i)),null!=(r=Le(e,t))&&o.push(Yo(e,r,i))),e=e.return}return o}function Ko(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Go(e,t,n,o,i){for(var r=t._reactName,s=[];null!==n&&n!==o;){var a=n,l=a.alternate,u=a.stateNode;if(null!==l&&l===o)break;5===a.tag&&null!==u&&(a=u,i?null!=(l=Le(n,r))&&s.unshift(Yo(n,l,a)):i||null!=(l=Le(n,r))&&s.push(Yo(n,l,a))),n=n.return}0!==s.length&&e.push({event:t,listeners:s})}var Qo=/\r\n?/g,Xo=/\u0000|\uFFFD/g;function Jo(e){return("string"==typeof e?e:""+e).replace(Qo,"\n").replace(Xo,"")}function Zo(e,t,n){if(t=Jo(t),Jo(e)!==t&&n)throw Error(r(425))}function ei(){}var ti=null,ni=null;function oi(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ii="function"==typeof setTimeout?setTimeout:void 0,ri="function"==typeof clearTimeout?clearTimeout:void 0,si="function"==typeof Promise?Promise:void 0,ai="function"==typeof queueMicrotask?queueMicrotask:void 0!==si?function(e){return si.resolve(null).then(e).catch(li)}:ii;function li(e){setTimeout((function(){throw e}))}function ui(e,t){var n=t,o=0;do{var i=n.nextSibling;if(e.removeChild(n),i&&8===i.nodeType)if("/$"===(n=i.data)){if(0===o)return e.removeChild(i),void jt(t);o--}else"$"!==n&&"$?"!==n&&"$!"!==n||o++;n=i}while(n);jt(t)}function ci(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function di(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var pi=Math.random().toString(36).slice(2),hi="__reactFiber$"+pi,fi="__reactProps$"+pi,mi="__reactContainer$"+pi,gi="__reactEvents$"+pi,vi="__reactListeners$"+pi,yi="__reactHandles$"+pi;function bi(e){var t=e[hi];if(t)return t;for(var n=e.parentNode;n;){if(t=n[mi]||n[hi]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=di(e);null!==e;){if(n=e[hi])return n;e=di(e)}return t}n=(e=n).parentNode}return null}function Si(e){return!(e=e[hi]||e[mi])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wi(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(r(33))}function Ti(e){return e[fi]||null}var ki=[],Ci=-1;function xi(e){return{current:e}}function Ei(e){0>Ci||(e.current=ki[Ci],ki[Ci]=null,Ci--)}function Mi(e,t){Ci++,ki[Ci]=e.current,e.current=t}var Ii={},Ni=xi(Ii),Pi=xi(!1),Di=Ii;function Li(e,t){var n=e.type.contextTypes;if(!n)return Ii;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var i,r={};for(i in n)r[i]=t[i];return o&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=r),r}function _i(e){return null!=e.childContextTypes}function Ai(){Ei(Pi),Ei(Ni)}function Oi(e,t,n){if(Ni.current!==Ii)throw Error(r(168));Mi(Ni,t),Mi(Pi,n)}function Bi(e,t,n){var o=e.stateNode;if(t=t.childContextTypes,"function"!=typeof o.getChildContext)return n;for(var i in o=o.getChildContext())if(!(i in t))throw Error(r(108,H(e)||"Unknown",i));return V({},n,o)}function Vi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ii,Di=Ni.current,Mi(Ni,e),Mi(Pi,Pi.current),!0}function Ri(e,t,n){var o=e.stateNode;if(!o)throw Error(r(169));n?(e=Bi(e,t,Di),o.__reactInternalMemoizedMergedChildContext=e,Ei(Pi),Ei(Ni),Mi(Ni,e)):Ei(Pi),Mi(Pi,n)}var Ui=null,Fi=!1,zi=!1;function ji(e){null===Ui?Ui=[e]:Ui.push(e)}function Hi(){if(!zi&&null!==Ui){zi=!0;var e=0,t=bt;try{var n=Ui;for(bt=1;e<n.length;e++){var o=n[e];do{o=o(!0)}while(null!==o)}Ui=null,Fi=!1}catch(t){throw null!==Ui&&(Ui=Ui.slice(e+1)),We(Ze,Hi),t}finally{bt=t,zi=!1}}return null}var qi=[],$i=0,Yi=null,Wi=0,Ki=[],Gi=0,Qi=null,Xi=1,Ji="";function Zi(e,t){qi[$i++]=Wi,qi[$i++]=Yi,Yi=e,Wi=t}function er(e,t,n){Ki[Gi++]=Xi,Ki[Gi++]=Ji,Ki[Gi++]=Qi,Qi=e;var o=Xi;e=Ji;var i=32-st(o)-1;o&=~(1<<i),n+=1;var r=32-st(t)+i;if(30<r){var s=i-i%5;r=(o&(1<<s)-1).toString(32),o>>=s,i-=s,Xi=1<<32-st(t)+i|n<<i|o,Ji=r+e}else Xi=1<<r|n<<i|o,Ji=e}function tr(e){null!==e.return&&(Zi(e,1),er(e,1,0))}function nr(e){for(;e===Yi;)Yi=qi[--$i],qi[$i]=null,Wi=qi[--$i],qi[$i]=null;for(;e===Qi;)Qi=Ki[--Gi],Ki[Gi]=null,Ji=Ki[--Gi],Ki[Gi]=null,Xi=Ki[--Gi],Ki[Gi]=null}var or=null,ir=null,rr=!1,sr=null;function ar(e,t){var n=Lu(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function lr(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,or=e,ir=ci(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,or=e,ir=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Qi?{id:Xi,overflow:Ji}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Lu(18,null,null,0)).stateNode=t,n.return=e,e.child=n,or=e,ir=null,!0);default:return!1}}function ur(e){return!(!(1&e.mode)||128&e.flags)}function cr(e){if(rr){var t=ir;if(t){var n=t;if(!lr(e,t)){if(ur(e))throw Error(r(418));t=ci(n.nextSibling);var o=or;t&&lr(e,t)?ar(o,n):(e.flags=-4097&e.flags|2,rr=!1,or=e)}}else{if(ur(e))throw Error(r(418));e.flags=-4097&e.flags|2,rr=!1,or=e}}}function dr(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;or=e}function pr(e){if(e!==or)return!1;if(!rr)return dr(e),rr=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!oi(e.type,e.memoizedProps)),t&&(t=ir)){if(ur(e))throw hr(),Error(r(418));for(;t;)ar(e,t),t=ci(t.nextSibling)}if(dr(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(r(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){ir=ci(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}ir=null}}else ir=or?ci(e.stateNode.nextSibling):null;return!0}function hr(){for(var e=ir;e;)e=ci(e.nextSibling)}function fr(){ir=or=null,rr=!1}function mr(e){null===sr?sr=[e]:sr.push(e)}var gr=S.ReactCurrentBatchConfig;function vr(e,t){if(e&&e.defaultProps){for(var n in t=V({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var yr=xi(null),br=null,Sr=null,wr=null;function Tr(){wr=Sr=br=null}function kr(e){var t=yr.current;Ei(yr),e._currentValue=t}function Cr(e,t,n){for(;null!==e;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==o&&(o.childLanes|=t)):null!==o&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===n)break;e=e.return}}function xr(e,t){br=e,wr=Sr=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(Sa=!0),e.firstContext=null)}function Er(e){var t=e._currentValue;if(wr!==e)if(e={context:e,memoizedValue:t,next:null},null===Sr){if(null===br)throw Error(r(308));Sr=e,br.dependencies={lanes:0,firstContext:e}}else Sr=Sr.next=e;return t}var Mr=null;function Ir(e){null===Mr?Mr=[e]:Mr.push(e)}function Nr(e,t,n,o){var i=t.interleaved;return null===i?(n.next=n,Ir(t)):(n.next=i.next,i.next=n),t.interleaved=n,Pr(e,o)}function Pr(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Dr=!1;function Lr(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function _r(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ar(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Or(e,t,n){var o=e.updateQueue;if(null===o)return null;if(o=o.shared,2&Nl){var i=o.pending;return null===i?t.next=t:(t.next=i.next,i.next=t),o.pending=t,Pr(e,n)}return null===(i=o.interleaved)?(t.next=t,Ir(o)):(t.next=i.next,i.next=t),o.interleaved=t,Pr(e,n)}function Br(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var o=t.lanes;n|=o&=e.pendingLanes,t.lanes=n,yt(e,n)}}function Vr(e,t){var n=e.updateQueue,o=e.alternate;if(null!==o&&n===(o=o.updateQueue)){var i=null,r=null;if(null!==(n=n.firstBaseUpdate)){do{var s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===r?i=r=s:r=r.next=s,n=n.next}while(null!==n);null===r?i=r=t:r=r.next=t}else i=r=t;return n={baseState:o.baseState,firstBaseUpdate:i,lastBaseUpdate:r,shared:o.shared,effects:o.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Rr(e,t,n,o){var i=e.updateQueue;Dr=!1;var r=i.firstBaseUpdate,s=i.lastBaseUpdate,a=i.shared.pending;if(null!==a){i.shared.pending=null;var l=a,u=l.next;l.next=null,null===s?r=u:s.next=u,s=l;var c=e.alternate;null!==c&&(a=(c=c.updateQueue).lastBaseUpdate)!==s&&(null===a?c.firstBaseUpdate=u:a.next=u,c.lastBaseUpdate=l)}if(null!==r){var d=i.baseState;for(s=0,c=u=l=null,a=r;;){var p=a.lane,h=a.eventTime;if((o&p)===p){null!==c&&(c=c.next={eventTime:h,lane:0,tag:a.tag,payload:a.payload,callback:a.callback,next:null});e:{var f=e,m=a;switch(p=t,h=n,m.tag){case 1:if("function"==typeof(f=m.payload)){d=f.call(h,d,p);break e}d=f;break e;case 3:f.flags=-65537&f.flags|128;case 0:if(null==(p="function"==typeof(f=m.payload)?f.call(h,d,p):f))break e;d=V({},d,p);break e;case 2:Dr=!0}}null!==a.callback&&0!==a.lane&&(e.flags|=64,null===(p=i.effects)?i.effects=[a]:p.push(a))}else h={eventTime:h,lane:p,tag:a.tag,payload:a.payload,callback:a.callback,next:null},null===c?(u=c=h,l=d):c=c.next=h,s|=p;if(null===(a=a.next)){if(null===(a=i.shared.pending))break;a=(p=a).next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}if(null===c&&(l=d),i.baseState=l,i.firstBaseUpdate=u,i.lastBaseUpdate=c,null!==(t=i.shared.interleaved)){i=t;do{s|=i.lane,i=i.next}while(i!==t)}else null===r&&(i.shared.lanes=0);Vl|=s,e.lanes=s,e.memoizedState=d}}function Ur(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var o=e[t],i=o.callback;if(null!==i){if(o.callback=null,o=n,"function"!=typeof i)throw Error(r(191,i));i.call(o)}}}var Fr=(new o.Component).refs;function zr(e,t,n,o){n=null==(n=n(o,t=e.memoizedState))?t:V({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var jr={isMounted:function(e){return!!(e=e._reactInternals)&&je(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var o=tu(),i=nu(e),r=Ar(o,i);r.payload=t,null!=n&&(r.callback=n),null!==(t=Or(e,r,i))&&(ou(t,e,i,o),Br(t,e,i))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var o=tu(),i=nu(e),r=Ar(o,i);r.tag=1,r.payload=t,null!=n&&(r.callback=n),null!==(t=Or(e,r,i))&&(ou(t,e,i,o),Br(t,e,i))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=tu(),o=nu(e),i=Ar(n,o);i.tag=2,null!=t&&(i.callback=t),null!==(t=Or(e,i,o))&&(ou(t,e,o,n),Br(t,e,o))}};function Hr(e,t,n,o,i,r,s){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(o,r,s):!(t.prototype&&t.prototype.isPureReactComponent&&lo(n,o)&&lo(i,r))}function qr(e,t,n){var o=!1,i=Ii,r=t.contextType;return"object"==typeof r&&null!==r?r=Er(r):(i=_i(t)?Di:Ni.current,r=(o=null!=(o=t.contextTypes))?Li(e,i):Ii),t=new t(n,r),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=jr,e.stateNode=t,t._reactInternals=e,o&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=i,e.__reactInternalMemoizedMaskedChildContext=r),t}function $r(e,t,n,o){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,o),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,o),t.state!==e&&jr.enqueueReplaceState(t,t.state,null)}function Yr(e,t,n,o){var i=e.stateNode;i.props=n,i.state=e.memoizedState,i.refs=Fr,Lr(e);var r=t.contextType;"object"==typeof r&&null!==r?i.context=Er(r):(r=_i(t)?Di:Ni.current,i.context=Li(e,r)),i.state=e.memoizedState,"function"==typeof(r=t.getDerivedStateFromProps)&&(zr(e,t,r,n),i.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof i.getSnapshotBeforeUpdate||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||(t=i.state,"function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount(),t!==i.state&&jr.enqueueReplaceState(i,i.state,null),Rr(e,n,i,o),i.state=e.memoizedState),"function"==typeof i.componentDidMount&&(e.flags|=4194308)}function Wr(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(r(309));var o=n.stateNode}if(!o)throw Error(r(147,e));var i=o,s=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===s?t.ref:(t=function(e){var t=i.refs;t===Fr&&(t=i.refs={}),null===e?delete t[s]:t[s]=e},t._stringRef=s,t)}if("string"!=typeof e)throw Error(r(284));if(!n._owner)throw Error(r(290,e))}return e}function Kr(e,t){throw e=Object.prototype.toString.call(t),Error(r(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Gr(e){return(0,e._init)(e._payload)}function Qr(e){function t(t,n){if(e){var o=t.deletions;null===o?(t.deletions=[n],t.flags|=16):o.push(n)}}function n(n,o){if(!e)return null;for(;null!==o;)t(n,o),o=o.sibling;return null}function o(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function i(e,t){return(e=Au(e,t)).index=0,e.sibling=null,e}function s(t,n,o){return t.index=o,e?null!==(o=t.alternate)?(o=o.index)<n?(t.flags|=2,n):o:(t.flags|=2,n):(t.flags|=1048576,n)}function a(t){return e&&null===t.alternate&&(t.flags|=2),t}function l(e,t,n,o){return null===t||6!==t.tag?((t=Ru(n,e.mode,o)).return=e,t):((t=i(t,n)).return=e,t)}function u(e,t,n,o){var r=n.type;return r===k?d(e,t,n.props.children,o,n.key):null!==t&&(t.elementType===r||"object"==typeof r&&null!==r&&r.$$typeof===L&&Gr(r)===t.type)?((o=i(t,n.props)).ref=Wr(e,t,n),o.return=e,o):((o=Ou(n.type,n.key,n.props,null,e.mode,o)).ref=Wr(e,t,n),o.return=e,o)}function c(e,t,n,o){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Uu(n,e.mode,o)).return=e,t):((t=i(t,n.children||[])).return=e,t)}function d(e,t,n,o,r){return null===t||7!==t.tag?((t=Bu(n,e.mode,o,r)).return=e,t):((t=i(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Ru(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case w:return(n=Ou(t.type,t.key,t.props,null,e.mode,n)).ref=Wr(e,null,t),n.return=e,n;case T:return(t=Uu(t,e.mode,n)).return=e,t;case L:return p(e,(0,t._init)(t._payload),n)}if(te(t)||O(t))return(t=Bu(t,e.mode,n,null)).return=e,t;Kr(e,t)}return null}function h(e,t,n,o){var i=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==i?null:l(e,t,""+n,o);if("object"==typeof n&&null!==n){switch(n.$$typeof){case w:return n.key===i?u(e,t,n,o):null;case T:return n.key===i?c(e,t,n,o):null;case L:return h(e,t,(i=n._init)(n._payload),o)}if(te(n)||O(n))return null!==i?null:d(e,t,n,o,null);Kr(e,n)}return null}function f(e,t,n,o,i){if("string"==typeof o&&""!==o||"number"==typeof o)return l(t,e=e.get(n)||null,""+o,i);if("object"==typeof o&&null!==o){switch(o.$$typeof){case w:return u(t,e=e.get(null===o.key?n:o.key)||null,o,i);case T:return c(t,e=e.get(null===o.key?n:o.key)||null,o,i);case L:return f(e,t,n,(0,o._init)(o._payload),i)}if(te(o)||O(o))return d(t,e=e.get(n)||null,o,i,null);Kr(t,o)}return null}function m(i,r,a,l){for(var u=null,c=null,d=r,m=r=0,g=null;null!==d&&m<a.length;m++){d.index>m?(g=d,d=null):g=d.sibling;var v=h(i,d,a[m],l);if(null===v){null===d&&(d=g);break}e&&d&&null===v.alternate&&t(i,d),r=s(v,r,m),null===c?u=v:c.sibling=v,c=v,d=g}if(m===a.length)return n(i,d),rr&&Zi(i,m),u;if(null===d){for(;m<a.length;m++)null!==(d=p(i,a[m],l))&&(r=s(d,r,m),null===c?u=d:c.sibling=d,c=d);return rr&&Zi(i,m),u}for(d=o(i,d);m<a.length;m++)null!==(g=f(d,i,m,a[m],l))&&(e&&null!==g.alternate&&d.delete(null===g.key?m:g.key),r=s(g,r,m),null===c?u=g:c.sibling=g,c=g);return e&&d.forEach((function(e){return t(i,e)})),rr&&Zi(i,m),u}function g(i,a,l,u){var c=O(l);if("function"!=typeof c)throw Error(r(150));if(null==(l=c.call(l)))throw Error(r(151));for(var d=c=null,m=a,g=a=0,v=null,y=l.next();null!==m&&!y.done;g++,y=l.next()){m.index>g?(v=m,m=null):v=m.sibling;var b=h(i,m,y.value,u);if(null===b){null===m&&(m=v);break}e&&m&&null===b.alternate&&t(i,m),a=s(b,a,g),null===d?c=b:d.sibling=b,d=b,m=v}if(y.done)return n(i,m),rr&&Zi(i,g),c;if(null===m){for(;!y.done;g++,y=l.next())null!==(y=p(i,y.value,u))&&(a=s(y,a,g),null===d?c=y:d.sibling=y,d=y);return rr&&Zi(i,g),c}for(m=o(i,m);!y.done;g++,y=l.next())null!==(y=f(m,i,g,y.value,u))&&(e&&null!==y.alternate&&m.delete(null===y.key?g:y.key),a=s(y,a,g),null===d?c=y:d.sibling=y,d=y);return e&&m.forEach((function(e){return t(i,e)})),rr&&Zi(i,g),c}return function e(o,r,s,l){if("object"==typeof s&&null!==s&&s.type===k&&null===s.key&&(s=s.props.children),"object"==typeof s&&null!==s){switch(s.$$typeof){case w:e:{for(var u=s.key,c=r;null!==c;){if(c.key===u){if((u=s.type)===k){if(7===c.tag){n(o,c.sibling),(r=i(c,s.props.children)).return=o,o=r;break e}}else if(c.elementType===u||"object"==typeof u&&null!==u&&u.$$typeof===L&&Gr(u)===c.type){n(o,c.sibling),(r=i(c,s.props)).ref=Wr(o,c,s),r.return=o,o=r;break e}n(o,c);break}t(o,c),c=c.sibling}s.type===k?((r=Bu(s.props.children,o.mode,l,s.key)).return=o,o=r):((l=Ou(s.type,s.key,s.props,null,o.mode,l)).ref=Wr(o,r,s),l.return=o,o=l)}return a(o);case T:e:{for(c=s.key;null!==r;){if(r.key===c){if(4===r.tag&&r.stateNode.containerInfo===s.containerInfo&&r.stateNode.implementation===s.implementation){n(o,r.sibling),(r=i(r,s.children||[])).return=o,o=r;break e}n(o,r);break}t(o,r),r=r.sibling}(r=Uu(s,o.mode,l)).return=o,o=r}return a(o);case L:return e(o,r,(c=s._init)(s._payload),l)}if(te(s))return m(o,r,s,l);if(O(s))return g(o,r,s,l);Kr(o,s)}return"string"==typeof s&&""!==s||"number"==typeof s?(s=""+s,null!==r&&6===r.tag?(n(o,r.sibling),(r=i(r,s)).return=o,o=r):(n(o,r),(r=Ru(s,o.mode,l)).return=o,o=r),a(o)):n(o,r)}}var Xr=Qr(!0),Jr=Qr(!1),Zr={},es=xi(Zr),ts=xi(Zr),ns=xi(Zr);function os(e){if(e===Zr)throw Error(r(174));return e}function is(e,t){switch(Mi(ns,t),Mi(ts,e),Mi(es,Zr),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:le(null,"");break;default:t=le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Ei(es),Mi(es,t)}function rs(){Ei(es),Ei(ts),Ei(ns)}function ss(e){os(ns.current);var t=os(es.current),n=le(t,e.type);t!==n&&(Mi(ts,e),Mi(es,n))}function as(e){ts.current===e&&(Ei(es),Ei(ts))}var ls=xi(0);function us(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var cs=[];function ds(){for(var e=0;e<cs.length;e++)cs[e]._workInProgressVersionPrimary=null;cs.length=0}var ps=S.ReactCurrentDispatcher,hs=S.ReactCurrentBatchConfig,fs=0,ms=null,gs=null,vs=null,ys=!1,bs=!1,Ss=0,ws=0;function Ts(){throw Error(r(321))}function ks(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ao(e[n],t[n]))return!1;return!0}function Cs(e,t,n,o,i,s){if(fs=s,ms=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,ps.current=null===e||null===e.memoizedState?aa:la,e=n(o,i),bs){s=0;do{if(bs=!1,Ss=0,25<=s)throw Error(r(301));s+=1,vs=gs=null,t.updateQueue=null,ps.current=ua,e=n(o,i)}while(bs)}if(ps.current=sa,t=null!==gs&&null!==gs.next,fs=0,vs=gs=ms=null,ys=!1,t)throw Error(r(300));return e}function xs(){var e=0!==Ss;return Ss=0,e}function Es(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===vs?ms.memoizedState=vs=e:vs=vs.next=e,vs}function Ms(){if(null===gs){var e=ms.alternate;e=null!==e?e.memoizedState:null}else e=gs.next;var t=null===vs?ms.memoizedState:vs.next;if(null!==t)vs=t,gs=e;else{if(null===e)throw Error(r(310));e={memoizedState:(gs=e).memoizedState,baseState:gs.baseState,baseQueue:gs.baseQueue,queue:gs.queue,next:null},null===vs?ms.memoizedState=vs=e:vs=vs.next=e}return vs}function Is(e,t){return"function"==typeof t?t(e):t}function Ns(e){var t=Ms(),n=t.queue;if(null===n)throw Error(r(311));n.lastRenderedReducer=e;var o=gs,i=o.baseQueue,s=n.pending;if(null!==s){if(null!==i){var a=i.next;i.next=s.next,s.next=a}o.baseQueue=i=s,n.pending=null}if(null!==i){s=i.next,o=o.baseState;var l=a=null,u=null,c=s;do{var d=c.lane;if((fs&d)===d)null!==u&&(u=u.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),o=c.hasEagerState?c.eagerState:e(o,c.action);else{var p={lane:d,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};null===u?(l=u=p,a=o):u=u.next=p,ms.lanes|=d,Vl|=d}c=c.next}while(null!==c&&c!==s);null===u?a=o:u.next=l,ao(o,t.memoizedState)||(Sa=!0),t.memoizedState=o,t.baseState=a,t.baseQueue=u,n.lastRenderedState=o}if(null!==(e=n.interleaved)){i=e;do{s=i.lane,ms.lanes|=s,Vl|=s,i=i.next}while(i!==e)}else null===i&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Ps(e){var t=Ms(),n=t.queue;if(null===n)throw Error(r(311));n.lastRenderedReducer=e;var o=n.dispatch,i=n.pending,s=t.memoizedState;if(null!==i){n.pending=null;var a=i=i.next;do{s=e(s,a.action),a=a.next}while(a!==i);ao(s,t.memoizedState)||(Sa=!0),t.memoizedState=s,null===t.baseQueue&&(t.baseState=s),n.lastRenderedState=s}return[s,o]}function Ds(){}function Ls(e,t){var n=ms,o=Ms(),i=t(),s=!ao(o.memoizedState,i);if(s&&(o.memoizedState=i,Sa=!0),o=o.queue,qs(Os.bind(null,n,o,e),[e]),o.getSnapshot!==t||s||null!==vs&&1&vs.memoizedState.tag){if(n.flags|=2048,Us(9,As.bind(null,n,o,i,t),void 0,null),null===Pl)throw Error(r(349));30&fs||_s(n,t,i)}return i}function _s(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=ms.updateQueue)?(t={lastEffect:null,stores:null},ms.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function As(e,t,n,o){t.value=n,t.getSnapshot=o,Bs(t)&&Vs(e)}function Os(e,t,n){return n((function(){Bs(t)&&Vs(e)}))}function Bs(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!ao(e,n)}catch(e){return!0}}function Vs(e){var t=Pr(e,1);null!==t&&ou(t,e,1,-1)}function Rs(e){var t=Es();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Is,lastRenderedState:e},t.queue=e,e=e.dispatch=na.bind(null,ms,e),[t.memoizedState,e]}function Us(e,t,n,o){return e={tag:e,create:t,destroy:n,deps:o,next:null},null===(t=ms.updateQueue)?(t={lastEffect:null,stores:null},ms.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(o=n.next,n.next=e,e.next=o,t.lastEffect=e),e}function Fs(){return Ms().memoizedState}function zs(e,t,n,o){var i=Es();ms.flags|=e,i.memoizedState=Us(1|t,n,void 0,void 0===o?null:o)}function js(e,t,n,o){var i=Ms();o=void 0===o?null:o;var r=void 0;if(null!==gs){var s=gs.memoizedState;if(r=s.destroy,null!==o&&ks(o,s.deps))return void(i.memoizedState=Us(t,n,r,o))}ms.flags|=e,i.memoizedState=Us(1|t,n,r,o)}function Hs(e,t){return zs(8390656,8,e,t)}function qs(e,t){return js(2048,8,e,t)}function $s(e,t){return js(4,2,e,t)}function Ys(e,t){return js(4,4,e,t)}function Ws(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Ks(e,t,n){return n=null!=n?n.concat([e]):null,js(4,4,Ws.bind(null,t,e),n)}function Gs(){}function Qs(e,t){var n=Ms();t=void 0===t?null:t;var o=n.memoizedState;return null!==o&&null!==t&&ks(t,o[1])?o[0]:(n.memoizedState=[e,t],e)}function Xs(e,t){var n=Ms();t=void 0===t?null:t;var o=n.memoizedState;return null!==o&&null!==t&&ks(t,o[1])?o[0]:(e=e(),n.memoizedState=[e,t],e)}function Js(e,t,n){return 21&fs?(ao(n,t)||(n=mt(),ms.lanes|=n,Vl|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,Sa=!0),e.memoizedState=n)}function Zs(e,t){var n=bt;bt=0!==n&&4>n?n:4,e(!0);var o=hs.transition;hs.transition={};try{e(!1),t()}finally{bt=n,hs.transition=o}}function ea(){return Ms().memoizedState}function ta(e,t,n){var o=nu(e);n={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null},oa(e)?ia(t,n):null!==(n=Nr(e,t,n,o))&&(ou(n,e,o,tu()),ra(n,t,o))}function na(e,t,n){var o=nu(e),i={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null};if(oa(e))ia(t,i);else{var r=e.alternate;if(0===e.lanes&&(null===r||0===r.lanes)&&null!==(r=t.lastRenderedReducer))try{var s=t.lastRenderedState,a=r(s,n);if(i.hasEagerState=!0,i.eagerState=a,ao(a,s)){var l=t.interleaved;return null===l?(i.next=i,Ir(t)):(i.next=l.next,l.next=i),void(t.interleaved=i)}}catch(e){}null!==(n=Nr(e,t,i,o))&&(ou(n,e,o,i=tu()),ra(n,t,o))}}function oa(e){var t=e.alternate;return e===ms||null!==t&&t===ms}function ia(e,t){bs=ys=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function ra(e,t,n){if(4194240&n){var o=t.lanes;n|=o&=e.pendingLanes,t.lanes=n,yt(e,n)}}var sa={readContext:Er,useCallback:Ts,useContext:Ts,useEffect:Ts,useImperativeHandle:Ts,useInsertionEffect:Ts,useLayoutEffect:Ts,useMemo:Ts,useReducer:Ts,useRef:Ts,useState:Ts,useDebugValue:Ts,useDeferredValue:Ts,useTransition:Ts,useMutableSource:Ts,useSyncExternalStore:Ts,useId:Ts,unstable_isNewReconciler:!1},aa={readContext:Er,useCallback:function(e,t){return Es().memoizedState=[e,void 0===t?null:t],e},useContext:Er,useEffect:Hs,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,zs(4194308,4,Ws.bind(null,t,e),n)},useLayoutEffect:function(e,t){return zs(4194308,4,e,t)},useInsertionEffect:function(e,t){return zs(4,2,e,t)},useMemo:function(e,t){var n=Es();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var o=Es();return t=void 0!==n?n(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=ta.bind(null,ms,e),[o.memoizedState,e]},useRef:function(e){return e={current:e},Es().memoizedState=e},useState:Rs,useDebugValue:Gs,useDeferredValue:function(e){return Es().memoizedState=e},useTransition:function(){var e=Rs(!1),t=e[0];return e=Zs.bind(null,e[1]),Es().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var o=ms,i=Es();if(rr){if(void 0===n)throw Error(r(407));n=n()}else{if(n=t(),null===Pl)throw Error(r(349));30&fs||_s(o,t,n)}i.memoizedState=n;var s={value:n,getSnapshot:t};return i.queue=s,Hs(Os.bind(null,o,s,e),[e]),o.flags|=2048,Us(9,As.bind(null,o,s,n,t),void 0,null),n},useId:function(){var e=Es(),t=Pl.identifierPrefix;if(rr){var n=Ji;t=":"+t+"R"+(n=(Xi&~(1<<32-st(Xi)-1)).toString(32)+n),0<(n=Ss++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=ws++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},la={readContext:Er,useCallback:Qs,useContext:Er,useEffect:qs,useImperativeHandle:Ks,useInsertionEffect:$s,useLayoutEffect:Ys,useMemo:Xs,useReducer:Ns,useRef:Fs,useState:function(){return Ns(Is)},useDebugValue:Gs,useDeferredValue:function(e){return Js(Ms(),gs.memoizedState,e)},useTransition:function(){return[Ns(Is)[0],Ms().memoizedState]},useMutableSource:Ds,useSyncExternalStore:Ls,useId:ea,unstable_isNewReconciler:!1},ua={readContext:Er,useCallback:Qs,useContext:Er,useEffect:qs,useImperativeHandle:Ks,useInsertionEffect:$s,useLayoutEffect:Ys,useMemo:Xs,useReducer:Ps,useRef:Fs,useState:function(){return Ps(Is)},useDebugValue:Gs,useDeferredValue:function(e){var t=Ms();return null===gs?t.memoizedState=e:Js(t,gs.memoizedState,e)},useTransition:function(){return[Ps(Is)[0],Ms().memoizedState]},useMutableSource:Ds,useSyncExternalStore:Ls,useId:ea,unstable_isNewReconciler:!1};function ca(e,t){try{var n="",o=t;do{n+=z(o),o=o.return}while(o);var i=n}catch(e){i="\nError generating stack: "+e.message+"\n"+e.stack}return{value:e,source:t,stack:i,digest:null}}function da(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function pa(e,t){try{console.error(t.value)}catch(e){setTimeout((function(){throw e}))}}var ha="function"==typeof WeakMap?WeakMap:Map;function fa(e,t,n){(n=Ar(-1,n)).tag=3,n.payload={element:null};var o=t.value;return n.callback=function(){$l||($l=!0,Yl=o),pa(0,t)},n}function ma(e,t,n){(n=Ar(-1,n)).tag=3;var o=e.type.getDerivedStateFromError;if("function"==typeof o){var i=t.value;n.payload=function(){return o(i)},n.callback=function(){pa(0,t)}}var r=e.stateNode;return null!==r&&"function"==typeof r.componentDidCatch&&(n.callback=function(){pa(0,t),"function"!=typeof o&&(null===Wl?Wl=new Set([this]):Wl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function ga(e,t,n){var o=e.pingCache;if(null===o){o=e.pingCache=new ha;var i=new Set;o.set(t,i)}else void 0===(i=o.get(t))&&(i=new Set,o.set(t,i));i.has(n)||(i.add(n),e=Eu.bind(null,e,t,n),t.then(e,e))}function va(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function ya(e,t,n,o,i){return 1&e.mode?(e.flags|=65536,e.lanes=i,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Ar(-1,1)).tag=2,Or(n,t,1))),n.lanes|=1),e)}var ba=S.ReactCurrentOwner,Sa=!1;function wa(e,t,n,o){t.child=null===e?Jr(t,null,n,o):Xr(t,e.child,n,o)}function Ta(e,t,n,o,i){n=n.render;var r=t.ref;return xr(t,i),o=Cs(e,t,n,o,r,i),n=xs(),null===e||Sa?(rr&&n&&tr(t),t.flags|=1,wa(e,t,o,i),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,$a(e,t,i))}function ka(e,t,n,o,i){if(null===e){var r=n.type;return"function"!=typeof r||_u(r)||void 0!==r.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Ou(n.type,null,o,t,t.mode,i)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=r,Ca(e,t,r,o,i))}if(r=e.child,!(e.lanes&i)){var s=r.memoizedProps;if((n=null!==(n=n.compare)?n:lo)(s,o)&&e.ref===t.ref)return $a(e,t,i)}return t.flags|=1,(e=Au(r,o)).ref=t.ref,e.return=t,t.child=e}function Ca(e,t,n,o,i){if(null!==e){var r=e.memoizedProps;if(lo(r,o)&&e.ref===t.ref){if(Sa=!1,t.pendingProps=o=r,!(e.lanes&i))return t.lanes=e.lanes,$a(e,t,i);131072&e.flags&&(Sa=!0)}}return Ma(e,t,n,o,i)}function xa(e,t,n){var o=t.pendingProps,i=o.children,r=null!==e?e.memoizedState:null;if("hidden"===o.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==r?r.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Mi(Al,_l),_l|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},o=null!==r?r.baseLanes:n,Mi(Al,_l),_l|=o}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Mi(Al,_l),_l|=n;else null!==r?(o=r.baseLanes|n,t.memoizedState=null):o=n,Mi(Al,_l),_l|=o;return wa(e,t,i,n),t.child}function Ea(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Ma(e,t,n,o,i){var r=_i(n)?Di:Ni.current;return r=Li(t,r),xr(t,i),n=Cs(e,t,n,o,r,i),o=xs(),null===e||Sa?(rr&&o&&tr(t),t.flags|=1,wa(e,t,n,i),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,$a(e,t,i))}function Ia(e,t,n,o,i){if(_i(n)){var r=!0;Vi(t)}else r=!1;if(xr(t,i),null===t.stateNode)qa(e,t),qr(t,n,o),Yr(t,n,o,i),o=!0;else if(null===e){var s=t.stateNode,a=t.memoizedProps;s.props=a;var l=s.context,u=n.contextType;u="object"==typeof u&&null!==u?Er(u):Li(t,u=_i(n)?Di:Ni.current);var c=n.getDerivedStateFromProps,d="function"==typeof c||"function"==typeof s.getSnapshotBeforeUpdate;d||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(a!==o||l!==u)&&$r(t,s,o,u),Dr=!1;var p=t.memoizedState;s.state=p,Rr(t,o,s,i),l=t.memoizedState,a!==o||p!==l||Pi.current||Dr?("function"==typeof c&&(zr(t,n,c,o),l=t.memoizedState),(a=Dr||Hr(t,n,a,o,p,l,u))?(d||"function"!=typeof s.UNSAFE_componentWillMount&&"function"!=typeof s.componentWillMount||("function"==typeof s.componentWillMount&&s.componentWillMount(),"function"==typeof s.UNSAFE_componentWillMount&&s.UNSAFE_componentWillMount()),"function"==typeof s.componentDidMount&&(t.flags|=4194308)):("function"==typeof s.componentDidMount&&(t.flags|=4194308),t.memoizedProps=o,t.memoizedState=l),s.props=o,s.state=l,s.context=u,o=a):("function"==typeof s.componentDidMount&&(t.flags|=4194308),o=!1)}else{s=t.stateNode,_r(e,t),a=t.memoizedProps,u=t.type===t.elementType?a:vr(t.type,a),s.props=u,d=t.pendingProps,p=s.context,l="object"==typeof(l=n.contextType)&&null!==l?Er(l):Li(t,l=_i(n)?Di:Ni.current);var h=n.getDerivedStateFromProps;(c="function"==typeof h||"function"==typeof s.getSnapshotBeforeUpdate)||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(a!==d||p!==l)&&$r(t,s,o,l),Dr=!1,p=t.memoizedState,s.state=p,Rr(t,o,s,i);var f=t.memoizedState;a!==d||p!==f||Pi.current||Dr?("function"==typeof h&&(zr(t,n,h,o),f=t.memoizedState),(u=Dr||Hr(t,n,u,o,p,f,l)||!1)?(c||"function"!=typeof s.UNSAFE_componentWillUpdate&&"function"!=typeof s.componentWillUpdate||("function"==typeof s.componentWillUpdate&&s.componentWillUpdate(o,f,l),"function"==typeof s.UNSAFE_componentWillUpdate&&s.UNSAFE_componentWillUpdate(o,f,l)),"function"==typeof s.componentDidUpdate&&(t.flags|=4),"function"==typeof s.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof s.componentDidUpdate||a===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||a===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=o,t.memoizedState=f),s.props=o,s.state=f,s.context=l,o=u):("function"!=typeof s.componentDidUpdate||a===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||a===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),o=!1)}return Na(e,t,n,o,r,i)}function Na(e,t,n,o,i,r){Ea(e,t);var s=!!(128&t.flags);if(!o&&!s)return i&&Ri(t,n,!1),$a(e,t,r);o=t.stateNode,ba.current=t;var a=s&&"function"!=typeof n.getDerivedStateFromError?null:o.render();return t.flags|=1,null!==e&&s?(t.child=Xr(t,e.child,null,r),t.child=Xr(t,null,a,r)):wa(e,t,a,r),t.memoizedState=o.state,i&&Ri(t,n,!0),t.child}function Pa(e){var t=e.stateNode;t.pendingContext?Oi(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Oi(0,t.context,!1),is(e,t.containerInfo)}function Da(e,t,n,o,i){return fr(),mr(i),t.flags|=256,wa(e,t,n,o),t.child}var La,_a,Aa,Oa,Ba={dehydrated:null,treeContext:null,retryLane:0};function Va(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ra(e,t,n){var o,i=t.pendingProps,s=ls.current,a=!1,l=!!(128&t.flags);if((o=l)||(o=(null===e||null!==e.memoizedState)&&!!(2&s)),o?(a=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(s|=1),Mi(ls,1&s),null===e)return cr(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(l=i.children,e=i.fallback,a?(i=t.mode,a=t.child,l={mode:"hidden",children:l},1&i||null===a?a=Vu(l,i,0,null):(a.childLanes=0,a.pendingProps=l),e=Bu(e,i,n,null),a.return=t,e.return=t,a.sibling=e,t.child=a,t.child.memoizedState=Va(n),t.memoizedState=Ba,e):Ua(t,l));if(null!==(s=e.memoizedState)&&null!==(o=s.dehydrated))return function(e,t,n,o,i,s,a){if(n)return 256&t.flags?(t.flags&=-257,Fa(e,t,a,o=da(Error(r(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(s=o.fallback,i=t.mode,o=Vu({mode:"visible",children:o.children},i,0,null),(s=Bu(s,i,a,null)).flags|=2,o.return=t,s.return=t,o.sibling=s,t.child=o,1&t.mode&&Xr(t,e.child,null,a),t.child.memoizedState=Va(a),t.memoizedState=Ba,s);if(!(1&t.mode))return Fa(e,t,a,null);if("$!"===i.data){if(o=i.nextSibling&&i.nextSibling.dataset)var l=o.dgst;return o=l,Fa(e,t,a,o=da(s=Error(r(419)),o,void 0))}if(l=!!(a&e.childLanes),Sa||l){if(null!==(o=Pl)){switch(a&-a){case 4:i=2;break;case 16:i=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:i=32;break;case 536870912:i=268435456;break;default:i=0}0!==(i=i&(o.suspendedLanes|a)?0:i)&&i!==s.retryLane&&(s.retryLane=i,Pr(e,i),ou(o,e,i,-1))}return gu(),Fa(e,t,a,o=da(Error(r(421))))}return"$?"===i.data?(t.flags|=128,t.child=e.child,t=Iu.bind(null,e),i._reactRetry=t,null):(e=s.treeContext,ir=ci(i.nextSibling),or=t,rr=!0,sr=null,null!==e&&(Ki[Gi++]=Xi,Ki[Gi++]=Ji,Ki[Gi++]=Qi,Xi=e.id,Ji=e.overflow,Qi=t),(t=Ua(t,o.children)).flags|=4096,t)}(e,t,l,i,o,s,n);if(a){a=i.fallback,l=t.mode,o=(s=e.child).sibling;var u={mode:"hidden",children:i.children};return 1&l||t.child===s?(i=Au(s,u)).subtreeFlags=14680064&s.subtreeFlags:((i=t.child).childLanes=0,i.pendingProps=u,t.deletions=null),null!==o?a=Au(o,a):(a=Bu(a,l,n,null)).flags|=2,a.return=t,i.return=t,i.sibling=a,t.child=i,i=a,a=t.child,l=null===(l=e.child.memoizedState)?Va(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},a.memoizedState=l,a.childLanes=e.childLanes&~n,t.memoizedState=Ba,i}return e=(a=e.child).sibling,i=Au(a,{mode:"visible",children:i.children}),!(1&t.mode)&&(i.lanes=n),i.return=t,i.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=i,t.memoizedState=null,i}function Ua(e,t){return(t=Vu({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Fa(e,t,n,o){return null!==o&&mr(o),Xr(t,e.child,null,n),(e=Ua(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function za(e,t,n){e.lanes|=t;var o=e.alternate;null!==o&&(o.lanes|=t),Cr(e.return,t,n)}function ja(e,t,n,o,i){var r=e.memoizedState;null===r?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:o,tail:n,tailMode:i}:(r.isBackwards=t,r.rendering=null,r.renderingStartTime=0,r.last=o,r.tail=n,r.tailMode=i)}function Ha(e,t,n){var o=t.pendingProps,i=o.revealOrder,r=o.tail;if(wa(e,t,o.children,n),2&(o=ls.current))o=1&o|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&za(e,n,t);else if(19===e.tag)za(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}o&=1}if(Mi(ls,o),1&t.mode)switch(i){case"forwards":for(n=t.child,i=null;null!==n;)null!==(e=n.alternate)&&null===us(e)&&(i=n),n=n.sibling;null===(n=i)?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),ja(t,!1,i,n,r);break;case"backwards":for(n=null,i=t.child,t.child=null;null!==i;){if(null!==(e=i.alternate)&&null===us(e)){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}ja(t,!0,n,null,r);break;case"together":ja(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function qa(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function $a(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Vl|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(r(153));if(null!==t.child){for(n=Au(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Au(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Ya(e,t){if(!rr)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var o=null;null!==n;)null!==n.alternate&&(o=n),n=n.sibling;null===o?t||null===e.tail?e.tail=null:e.tail.sibling=null:o.sibling=null}}function Wa(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,o=0;if(t)for(var i=e.child;null!==i;)n|=i.lanes|i.childLanes,o|=14680064&i.subtreeFlags,o|=14680064&i.flags,i.return=e,i=i.sibling;else for(i=e.child;null!==i;)n|=i.lanes|i.childLanes,o|=i.subtreeFlags,o|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=o,e.childLanes=n,t}function Ka(e,t,n){var o=t.pendingProps;switch(nr(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Wa(t),null;case 1:case 17:return _i(t.type)&&Ai(),Wa(t),null;case 3:return o=t.stateNode,rs(),Ei(Pi),Ei(Ni),ds(),o.pendingContext&&(o.context=o.pendingContext,o.pendingContext=null),null!==e&&null!==e.child||(pr(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==sr&&(au(sr),sr=null))),_a(e,t),Wa(t),null;case 5:as(t);var i=os(ns.current);if(n=t.type,null!==e&&null!=t.stateNode)Aa(e,t,n,o,i),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!o){if(null===t.stateNode)throw Error(r(166));return Wa(t),null}if(e=os(es.current),pr(t)){o=t.stateNode,n=t.type;var s=t.memoizedProps;switch(o[hi]=t,o[fi]=s,e=!!(1&t.mode),n){case"dialog":Fo("cancel",o),Fo("close",o);break;case"iframe":case"object":case"embed":Fo("load",o);break;case"video":case"audio":for(i=0;i<Bo.length;i++)Fo(Bo[i],o);break;case"source":Fo("error",o);break;case"img":case"image":case"link":Fo("error",o),Fo("load",o);break;case"details":Fo("toggle",o);break;case"input":Q(o,s),Fo("invalid",o);break;case"select":o._wrapperState={wasMultiple:!!s.multiple},Fo("invalid",o);break;case"textarea":ie(o,s),Fo("invalid",o)}for(var l in ye(n,s),i=null,s)if(s.hasOwnProperty(l)){var u=s[l];"children"===l?"string"==typeof u?o.textContent!==u&&(!0!==s.suppressHydrationWarning&&Zo(o.textContent,u,e),i=["children",u]):"number"==typeof u&&o.textContent!==""+u&&(!0!==s.suppressHydrationWarning&&Zo(o.textContent,u,e),i=["children",""+u]):a.hasOwnProperty(l)&&null!=u&&"onScroll"===l&&Fo("scroll",o)}switch(n){case"input":Y(o),Z(o,s,!0);break;case"textarea":Y(o),se(o);break;case"select":case"option":break;default:"function"==typeof s.onClick&&(o.onclick=ei)}o=i,t.updateQueue=o,null!==o&&(t.flags|=4)}else{l=9===i.nodeType?i:i.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=ae(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=l.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof o.is?e=l.createElement(n,{is:o.is}):(e=l.createElement(n),"select"===n&&(l=e,o.multiple?l.multiple=!0:o.size&&(l.size=o.size))):e=l.createElementNS(e,n),e[hi]=t,e[fi]=o,La(e,t,!1,!1),t.stateNode=e;e:{switch(l=be(n,o),n){case"dialog":Fo("cancel",e),Fo("close",e),i=o;break;case"iframe":case"object":case"embed":Fo("load",e),i=o;break;case"video":case"audio":for(i=0;i<Bo.length;i++)Fo(Bo[i],e);i=o;break;case"source":Fo("error",e),i=o;break;case"img":case"image":case"link":Fo("error",e),Fo("load",e),i=o;break;case"details":Fo("toggle",e),i=o;break;case"input":Q(e,o),i=G(e,o),Fo("invalid",e);break;case"option":default:i=o;break;case"select":e._wrapperState={wasMultiple:!!o.multiple},i=V({},o,{value:void 0}),Fo("invalid",e);break;case"textarea":ie(e,o),i=oe(e,o),Fo("invalid",e)}for(s in ye(n,i),u=i)if(u.hasOwnProperty(s)){var c=u[s];"style"===s?ge(e,c):"dangerouslySetInnerHTML"===s?null!=(c=c?c.__html:void 0)&&de(e,c):"children"===s?"string"==typeof c?("textarea"!==n||""!==c)&&pe(e,c):"number"==typeof c&&pe(e,""+c):"suppressContentEditableWarning"!==s&&"suppressHydrationWarning"!==s&&"autoFocus"!==s&&(a.hasOwnProperty(s)?null!=c&&"onScroll"===s&&Fo("scroll",e):null!=c&&b(e,s,c,l))}switch(n){case"input":Y(e),Z(e,o,!1);break;case"textarea":Y(e),se(e);break;case"option":null!=o.value&&e.setAttribute("value",""+q(o.value));break;case"select":e.multiple=!!o.multiple,null!=(s=o.value)?ne(e,!!o.multiple,s,!1):null!=o.defaultValue&&ne(e,!!o.multiple,o.defaultValue,!0);break;default:"function"==typeof i.onClick&&(e.onclick=ei)}switch(n){case"button":case"input":case"select":case"textarea":o=!!o.autoFocus;break e;case"img":o=!0;break e;default:o=!1}}o&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Wa(t),null;case 6:if(e&&null!=t.stateNode)Oa(e,t,e.memoizedProps,o);else{if("string"!=typeof o&&null===t.stateNode)throw Error(r(166));if(n=os(ns.current),os(es.current),pr(t)){if(o=t.stateNode,n=t.memoizedProps,o[hi]=t,(s=o.nodeValue!==n)&&null!==(e=or))switch(e.tag){case 3:Zo(o.nodeValue,n,!!(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Zo(o.nodeValue,n,!!(1&e.mode))}s&&(t.flags|=4)}else(o=(9===n.nodeType?n:n.ownerDocument).createTextNode(o))[hi]=t,t.stateNode=o}return Wa(t),null;case 13:if(Ei(ls),o=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(rr&&null!==ir&&1&t.mode&&!(128&t.flags))hr(),fr(),t.flags|=98560,s=!1;else if(s=pr(t),null!==o&&null!==o.dehydrated){if(null===e){if(!s)throw Error(r(318));if(!(s=null!==(s=t.memoizedState)?s.dehydrated:null))throw Error(r(317));s[hi]=t}else fr(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Wa(t),s=!1}else null!==sr&&(au(sr),sr=null),s=!0;if(!s)return 65536&t.flags?t:null}return 128&t.flags?(t.lanes=n,t):((o=null!==o)!=(null!==e&&null!==e.memoizedState)&&o&&(t.child.flags|=8192,1&t.mode&&(null===e||1&ls.current?0===Ol&&(Ol=3):gu())),null!==t.updateQueue&&(t.flags|=4),Wa(t),null);case 4:return rs(),_a(e,t),null===e&&Ho(t.stateNode.containerInfo),Wa(t),null;case 10:return kr(t.type._context),Wa(t),null;case 19:if(Ei(ls),null===(s=t.memoizedState))return Wa(t),null;if(o=!!(128&t.flags),null===(l=s.rendering))if(o)Ya(s,!1);else{if(0!==Ol||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(l=us(e))){for(t.flags|=128,Ya(s,!1),null!==(o=l.updateQueue)&&(t.updateQueue=o,t.flags|=4),t.subtreeFlags=0,o=n,n=t.child;null!==n;)e=o,(s=n).flags&=14680066,null===(l=s.alternate)?(s.childLanes=0,s.lanes=e,s.child=null,s.subtreeFlags=0,s.memoizedProps=null,s.memoizedState=null,s.updateQueue=null,s.dependencies=null,s.stateNode=null):(s.childLanes=l.childLanes,s.lanes=l.lanes,s.child=l.child,s.subtreeFlags=0,s.deletions=null,s.memoizedProps=l.memoizedProps,s.memoizedState=l.memoizedState,s.updateQueue=l.updateQueue,s.type=l.type,e=l.dependencies,s.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return Mi(ls,1&ls.current|2),t.child}e=e.sibling}null!==s.tail&&Xe()>Hl&&(t.flags|=128,o=!0,Ya(s,!1),t.lanes=4194304)}else{if(!o)if(null!==(e=us(l))){if(t.flags|=128,o=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Ya(s,!0),null===s.tail&&"hidden"===s.tailMode&&!l.alternate&&!rr)return Wa(t),null}else 2*Xe()-s.renderingStartTime>Hl&&1073741824!==n&&(t.flags|=128,o=!0,Ya(s,!1),t.lanes=4194304);s.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=s.last)?n.sibling=l:t.child=l,s.last=l)}return null!==s.tail?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=Xe(),t.sibling=null,n=ls.current,Mi(ls,o?1&n|2:1&n),t):(Wa(t),null);case 22:case 23:return pu(),o=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==o&&(t.flags|=8192),o&&1&t.mode?!!(1073741824&_l)&&(Wa(t),6&t.subtreeFlags&&(t.flags|=8192)):Wa(t),null;case 24:case 25:return null}throw Error(r(156,t.tag))}function Ga(e,t){switch(nr(t),t.tag){case 1:return _i(t.type)&&Ai(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return rs(),Ei(Pi),Ei(Ni),ds(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return as(t),null;case 13:if(Ei(ls),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(r(340));fr()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Ei(ls),null;case 4:return rs(),null;case 10:return kr(t.type._context),null;case 22:case 23:return pu(),null;default:return null}}La=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},_a=function(){},Aa=function(e,t,n,o){var i=e.memoizedProps;if(i!==o){e=t.stateNode,os(es.current);var r,s=null;switch(n){case"input":i=G(e,i),o=G(e,o),s=[];break;case"select":i=V({},i,{value:void 0}),o=V({},o,{value:void 0}),s=[];break;case"textarea":i=oe(e,i),o=oe(e,o),s=[];break;default:"function"!=typeof i.onClick&&"function"==typeof o.onClick&&(e.onclick=ei)}for(c in ye(n,o),n=null,i)if(!o.hasOwnProperty(c)&&i.hasOwnProperty(c)&&null!=i[c])if("style"===c){var l=i[c];for(r in l)l.hasOwnProperty(r)&&(n||(n={}),n[r]="")}else"dangerouslySetInnerHTML"!==c&&"children"!==c&&"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&"autoFocus"!==c&&(a.hasOwnProperty(c)?s||(s=[]):(s=s||[]).push(c,null));for(c in o){var u=o[c];if(l=null!=i?i[c]:void 0,o.hasOwnProperty(c)&&u!==l&&(null!=u||null!=l))if("style"===c)if(l){for(r in l)!l.hasOwnProperty(r)||u&&u.hasOwnProperty(r)||(n||(n={}),n[r]="");for(r in u)u.hasOwnProperty(r)&&l[r]!==u[r]&&(n||(n={}),n[r]=u[r])}else n||(s||(s=[]),s.push(c,n)),n=u;else"dangerouslySetInnerHTML"===c?(u=u?u.__html:void 0,l=l?l.__html:void 0,null!=u&&l!==u&&(s=s||[]).push(c,u)):"children"===c?"string"!=typeof u&&"number"!=typeof u||(s=s||[]).push(c,""+u):"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&(a.hasOwnProperty(c)?(null!=u&&"onScroll"===c&&Fo("scroll",e),s||l===u||(s=[])):(s=s||[]).push(c,u))}n&&(s=s||[]).push("style",n);var c=s;(t.updateQueue=c)&&(t.flags|=4)}},Oa=function(e,t,n,o){n!==o&&(t.flags|=4)};var Qa=!1,Xa=!1,Ja="function"==typeof WeakSet?WeakSet:Set,Za=null;function el(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(n){xu(e,t,n)}else n.current=null}function tl(e,t,n){try{n()}catch(n){xu(e,t,n)}}var nl=!1;function ol(e,t,n){var o=t.updateQueue;if(null!==(o=null!==o?o.lastEffect:null)){var i=o=o.next;do{if((i.tag&e)===e){var r=i.destroy;i.destroy=void 0,void 0!==r&&tl(t,n,r)}i=i.next}while(i!==o)}}function il(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var o=n.create;n.destroy=o()}n=n.next}while(n!==t)}}function rl(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function sl(e){var t=e.alternate;null!==t&&(e.alternate=null,sl(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&null!==(t=e.stateNode)&&(delete t[hi],delete t[fi],delete t[gi],delete t[vi],delete t[yi]),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function al(e){return 5===e.tag||3===e.tag||4===e.tag}function ll(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||al(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function ul(e,t,n){var o=e.tag;if(5===o||6===o)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=ei));else if(4!==o&&null!==(e=e.child))for(ul(e,t,n),e=e.sibling;null!==e;)ul(e,t,n),e=e.sibling}function cl(e,t,n){var o=e.tag;if(5===o||6===o)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==o&&null!==(e=e.child))for(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}var dl=null,pl=!1;function hl(e,t,n){for(n=n.child;null!==n;)fl(e,t,n),n=n.sibling}function fl(e,t,n){if(rt&&"function"==typeof rt.onCommitFiberUnmount)try{rt.onCommitFiberUnmount(it,n)}catch(e){}switch(n.tag){case 5:Xa||el(n,t);case 6:var o=dl,i=pl;dl=null,hl(e,t,n),pl=i,null!==(dl=o)&&(pl?(e=dl,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):dl.removeChild(n.stateNode));break;case 18:null!==dl&&(pl?(e=dl,n=n.stateNode,8===e.nodeType?ui(e.parentNode,n):1===e.nodeType&&ui(e,n),jt(e)):ui(dl,n.stateNode));break;case 4:o=dl,i=pl,dl=n.stateNode.containerInfo,pl=!0,hl(e,t,n),dl=o,pl=i;break;case 0:case 11:case 14:case 15:if(!Xa&&null!==(o=n.updateQueue)&&null!==(o=o.lastEffect)){i=o=o.next;do{var r=i,s=r.destroy;r=r.tag,void 0!==s&&(2&r||4&r)&&tl(n,t,s),i=i.next}while(i!==o)}hl(e,t,n);break;case 1:if(!Xa&&(el(n,t),"function"==typeof(o=n.stateNode).componentWillUnmount))try{o.props=n.memoizedProps,o.state=n.memoizedState,o.componentWillUnmount()}catch(e){xu(n,t,e)}hl(e,t,n);break;case 21:hl(e,t,n);break;case 22:1&n.mode?(Xa=(o=Xa)||null!==n.memoizedState,hl(e,t,n),Xa=o):hl(e,t,n);break;default:hl(e,t,n)}}function ml(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Ja),t.forEach((function(t){var o=Nu.bind(null,e,t);n.has(t)||(n.add(t),t.then(o,o))}))}}function gl(e,t){var n=t.deletions;if(null!==n)for(var o=0;o<n.length;o++){var i=n[o];try{var s=e,a=t,l=a;e:for(;null!==l;){switch(l.tag){case 5:dl=l.stateNode,pl=!1;break e;case 3:case 4:dl=l.stateNode.containerInfo,pl=!0;break e}l=l.return}if(null===dl)throw Error(r(160));fl(s,a,i),dl=null,pl=!1;var u=i.alternate;null!==u&&(u.return=null),i.return=null}catch(e){xu(i,t,e)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)vl(t,e),t=t.sibling}function vl(e,t){var n=e.alternate,o=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(gl(t,e),yl(e),4&o){try{ol(3,e,e.return),il(3,e)}catch(t){xu(e,e.return,t)}try{ol(5,e,e.return)}catch(t){xu(e,e.return,t)}}break;case 1:gl(t,e),yl(e),512&o&&null!==n&&el(n,n.return);break;case 5:if(gl(t,e),yl(e),512&o&&null!==n&&el(n,n.return),32&e.flags){var i=e.stateNode;try{pe(i,"")}catch(t){xu(e,e.return,t)}}if(4&o&&null!=(i=e.stateNode)){var s=e.memoizedProps,a=null!==n?n.memoizedProps:s,l=e.type,u=e.updateQueue;if(e.updateQueue=null,null!==u)try{"input"===l&&"radio"===s.type&&null!=s.name&&X(i,s),be(l,a);var c=be(l,s);for(a=0;a<u.length;a+=2){var d=u[a],p=u[a+1];"style"===d?ge(i,p):"dangerouslySetInnerHTML"===d?de(i,p):"children"===d?pe(i,p):b(i,d,p,c)}switch(l){case"input":J(i,s);break;case"textarea":re(i,s);break;case"select":var h=i._wrapperState.wasMultiple;i._wrapperState.wasMultiple=!!s.multiple;var f=s.value;null!=f?ne(i,!!s.multiple,f,!1):h!==!!s.multiple&&(null!=s.defaultValue?ne(i,!!s.multiple,s.defaultValue,!0):ne(i,!!s.multiple,s.multiple?[]:"",!1))}i[fi]=s}catch(t){xu(e,e.return,t)}}break;case 6:if(gl(t,e),yl(e),4&o){if(null===e.stateNode)throw Error(r(162));i=e.stateNode,s=e.memoizedProps;try{i.nodeValue=s}catch(t){xu(e,e.return,t)}}break;case 3:if(gl(t,e),yl(e),4&o&&null!==n&&n.memoizedState.isDehydrated)try{jt(t.containerInfo)}catch(t){xu(e,e.return,t)}break;case 4:default:gl(t,e),yl(e);break;case 13:gl(t,e),yl(e),8192&(i=e.child).flags&&(s=null!==i.memoizedState,i.stateNode.isHidden=s,!s||null!==i.alternate&&null!==i.alternate.memoizedState||(jl=Xe())),4&o&&ml(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Xa=(c=Xa)||d,gl(t,e),Xa=c):gl(t,e),yl(e),8192&o){if(c=null!==e.memoizedState,(e.stateNode.isHidden=c)&&!d&&1&e.mode)for(Za=e,d=e.child;null!==d;){for(p=Za=d;null!==Za;){switch(f=(h=Za).child,h.tag){case 0:case 11:case 14:case 15:ol(4,h,h.return);break;case 1:el(h,h.return);var m=h.stateNode;if("function"==typeof m.componentWillUnmount){o=h,n=h.return;try{t=o,m.props=t.memoizedProps,m.state=t.memoizedState,m.componentWillUnmount()}catch(e){xu(o,n,e)}}break;case 5:el(h,h.return);break;case 22:if(null!==h.memoizedState){Tl(p);continue}}null!==f?(f.return=h,Za=f):Tl(p)}d=d.sibling}e:for(d=null,p=e;;){if(5===p.tag){if(null===d){d=p;try{i=p.stateNode,c?"function"==typeof(s=i.style).setProperty?s.setProperty("display","none","important"):s.display="none":(l=p.stateNode,a=null!=(u=p.memoizedProps.style)&&u.hasOwnProperty("display")?u.display:null,l.style.display=me("display",a))}catch(t){xu(e,e.return,t)}}}else if(6===p.tag){if(null===d)try{p.stateNode.nodeValue=c?"":p.memoizedProps}catch(t){xu(e,e.return,t)}}else if((22!==p.tag&&23!==p.tag||null===p.memoizedState||p===e)&&null!==p.child){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;null===p.sibling;){if(null===p.return||p.return===e)break e;d===p&&(d=null),p=p.return}d===p&&(d=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:gl(t,e),yl(e),4&o&&ml(e);case 21:}}function yl(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(al(n)){var o=n;break e}n=n.return}throw Error(r(160))}switch(o.tag){case 5:var i=o.stateNode;32&o.flags&&(pe(i,""),o.flags&=-33),cl(e,ll(e),i);break;case 3:case 4:var s=o.stateNode.containerInfo;ul(e,ll(e),s);break;default:throw Error(r(161))}}catch(t){xu(e,e.return,t)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function bl(e,t,n){Za=e,Sl(e,t,n)}function Sl(e,t,n){for(var o=!!(1&e.mode);null!==Za;){var i=Za,r=i.child;if(22===i.tag&&o){var s=null!==i.memoizedState||Qa;if(!s){var a=i.alternate,l=null!==a&&null!==a.memoizedState||Xa;a=Qa;var u=Xa;if(Qa=s,(Xa=l)&&!u)for(Za=i;null!==Za;)l=(s=Za).child,22===s.tag&&null!==s.memoizedState?kl(i):null!==l?(l.return=s,Za=l):kl(i);for(;null!==r;)Za=r,Sl(r,t,n),r=r.sibling;Za=i,Qa=a,Xa=u}wl(e)}else 8772&i.subtreeFlags&&null!==r?(r.return=i,Za=r):wl(e)}}function wl(e){for(;null!==Za;){var t=Za;if(8772&t.flags){var n=t.alternate;try{if(8772&t.flags)switch(t.tag){case 0:case 11:case 15:Xa||il(5,t);break;case 1:var o=t.stateNode;if(4&t.flags&&!Xa)if(null===n)o.componentDidMount();else{var i=t.elementType===t.type?n.memoizedProps:vr(t.type,n.memoizedProps);o.componentDidUpdate(i,n.memoizedState,o.__reactInternalSnapshotBeforeUpdate)}var s=t.updateQueue;null!==s&&Ur(t,s,o);break;case 3:var a=t.updateQueue;if(null!==a){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}Ur(t,a,n)}break;case 5:var l=t.stateNode;if(null===n&&4&t.flags){n=l;var u=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":u.autoFocus&&n.focus();break;case"img":u.src&&(n.src=u.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var c=t.alternate;if(null!==c){var d=c.memoizedState;if(null!==d){var p=d.dehydrated;null!==p&&jt(p)}}}break;default:throw Error(r(163))}Xa||512&t.flags&&rl(t)}catch(e){xu(t,t.return,e)}}if(t===e){Za=null;break}if(null!==(n=t.sibling)){n.return=t.return,Za=n;break}Za=t.return}}function Tl(e){for(;null!==Za;){var t=Za;if(t===e){Za=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Za=n;break}Za=t.return}}function kl(e){for(;null!==Za;){var t=Za;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{il(4,t)}catch(e){xu(t,n,e)}break;case 1:var o=t.stateNode;if("function"==typeof o.componentDidMount){var i=t.return;try{o.componentDidMount()}catch(e){xu(t,i,e)}}var r=t.return;try{rl(t)}catch(e){xu(t,r,e)}break;case 5:var s=t.return;try{rl(t)}catch(e){xu(t,s,e)}}}catch(e){xu(t,t.return,e)}if(t===e){Za=null;break}var a=t.sibling;if(null!==a){a.return=t.return,Za=a;break}Za=t.return}}var Cl,xl=Math.ceil,El=S.ReactCurrentDispatcher,Ml=S.ReactCurrentOwner,Il=S.ReactCurrentBatchConfig,Nl=0,Pl=null,Dl=null,Ll=0,_l=0,Al=xi(0),Ol=0,Bl=null,Vl=0,Rl=0,Ul=0,Fl=null,zl=null,jl=0,Hl=1/0,ql=null,$l=!1,Yl=null,Wl=null,Kl=!1,Gl=null,Ql=0,Xl=0,Jl=null,Zl=-1,eu=0;function tu(){return 6&Nl?Xe():-1!==Zl?Zl:Zl=Xe()}function nu(e){return 1&e.mode?2&Nl&&0!==Ll?Ll&-Ll:null!==gr.transition?(0===eu&&(eu=mt()),eu):0!==(e=bt)?e:e=void 0===(e=window.event)?16:Qt(e.type):1}function ou(e,t,n,o){if(50<Xl)throw Xl=0,Jl=null,Error(r(185));vt(e,n,o),2&Nl&&e===Pl||(e===Pl&&(!(2&Nl)&&(Rl|=n),4===Ol&&lu(e,Ll)),iu(e,o),1===n&&0===Nl&&!(1&t.mode)&&(Hl=Xe()+500,Fi&&Hi()))}function iu(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,o=e.pingedLanes,i=e.expirationTimes,r=e.pendingLanes;0<r;){var s=31-st(r),a=1<<s,l=i[s];-1===l?a&n&&!(a&o)||(i[s]=ht(a,t)):l<=t&&(e.expiredLanes|=a),r&=~a}}(e,t);var o=pt(e,e===Pl?Ll:0);if(0===o)null!==n&&Ke(n),e.callbackNode=null,e.callbackPriority=0;else if(t=o&-o,e.callbackPriority!==t){if(null!=n&&Ke(n),1===t)0===e.tag?function(e){Fi=!0,ji(e)}(uu.bind(null,e)):ji(uu.bind(null,e)),ai((function(){!(6&Nl)&&Hi()})),n=null;else{switch(St(o)){case 1:n=Ze;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=ot}n=Pu(n,ru.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ru(e,t){if(Zl=-1,eu=0,6&Nl)throw Error(r(327));var n=e.callbackNode;if(ku()&&e.callbackNode!==n)return null;var o=pt(e,e===Pl?Ll:0);if(0===o)return null;if(30&o||o&e.expiredLanes||t)t=vu(e,o);else{t=o;var i=Nl;Nl|=2;var s=mu();for(Pl===e&&Ll===t||(ql=null,Hl=Xe()+500,hu(e,t));;)try{bu();break}catch(t){fu(e,t)}Tr(),El.current=s,Nl=i,null!==Dl?t=0:(Pl=null,Ll=0,t=Ol)}if(0!==t){if(2===t&&0!==(i=ft(e))&&(o=i,t=su(e,i)),1===t)throw n=Bl,hu(e,0),lu(e,o),iu(e,Xe()),n;if(6===t)lu(e,o);else{if(i=e.current.alternate,!(30&o||function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var o=0;o<n.length;o++){var i=n[o],r=i.getSnapshot;i=i.value;try{if(!ao(r(),i))return!1}catch(e){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(i)||(t=vu(e,o),2===t&&(s=ft(e),0!==s&&(o=s,t=su(e,s))),1!==t)))throw n=Bl,hu(e,0),lu(e,o),iu(e,Xe()),n;switch(e.finishedWork=i,e.finishedLanes=o,t){case 0:case 1:throw Error(r(345));case 2:case 5:Tu(e,zl,ql);break;case 3:if(lu(e,o),(130023424&o)===o&&10<(t=jl+500-Xe())){if(0!==pt(e,0))break;if(((i=e.suspendedLanes)&o)!==o){tu(),e.pingedLanes|=e.suspendedLanes&i;break}e.timeoutHandle=ii(Tu.bind(null,e,zl,ql),t);break}Tu(e,zl,ql);break;case 4:if(lu(e,o),(4194240&o)===o)break;for(t=e.eventTimes,i=-1;0<o;){var a=31-st(o);s=1<<a,(a=t[a])>i&&(i=a),o&=~s}if(o=i,10<(o=(120>(o=Xe()-o)?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*xl(o/1960))-o)){e.timeoutHandle=ii(Tu.bind(null,e,zl,ql),o);break}Tu(e,zl,ql);break;default:throw Error(r(329))}}}return iu(e,Xe()),e.callbackNode===n?ru.bind(null,e):null}function su(e,t){var n=Fl;return e.current.memoizedState.isDehydrated&&(hu(e,t).flags|=256),2!==(e=vu(e,t))&&(t=zl,zl=n,null!==t&&au(t)),e}function au(e){null===zl?zl=e:zl.push.apply(zl,e)}function lu(e,t){for(t&=~Ul,t&=~Rl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-st(t),o=1<<n;e[n]=-1,t&=~o}}function uu(e){if(6&Nl)throw Error(r(327));ku();var t=pt(e,0);if(!(1&t))return iu(e,Xe()),null;var n=vu(e,t);if(0!==e.tag&&2===n){var o=ft(e);0!==o&&(t=o,n=su(e,o))}if(1===n)throw n=Bl,hu(e,0),lu(e,t),iu(e,Xe()),n;if(6===n)throw Error(r(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Tu(e,zl,ql),iu(e,Xe()),null}function cu(e,t){var n=Nl;Nl|=1;try{return e(t)}finally{0===(Nl=n)&&(Hl=Xe()+500,Fi&&Hi())}}function du(e){null!==Gl&&0===Gl.tag&&!(6&Nl)&&ku();var t=Nl;Nl|=1;var n=Il.transition,o=bt;try{if(Il.transition=null,bt=1,e)return e()}finally{bt=o,Il.transition=n,!(6&(Nl=t))&&Hi()}}function pu(){_l=Al.current,Ei(Al)}function hu(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,ri(n)),null!==Dl)for(n=Dl.return;null!==n;){var o=n;switch(nr(o),o.tag){case 1:null!=(o=o.type.childContextTypes)&&Ai();break;case 3:rs(),Ei(Pi),Ei(Ni),ds();break;case 5:as(o);break;case 4:rs();break;case 13:case 19:Ei(ls);break;case 10:kr(o.type._context);break;case 22:case 23:pu()}n=n.return}if(Pl=e,Dl=e=Au(e.current,null),Ll=_l=t,Ol=0,Bl=null,Ul=Rl=Vl=0,zl=Fl=null,null!==Mr){for(t=0;t<Mr.length;t++)if(null!==(o=(n=Mr[t]).interleaved)){n.interleaved=null;var i=o.next,r=n.pending;if(null!==r){var s=r.next;r.next=i,o.next=s}n.pending=o}Mr=null}return e}function fu(e,t){for(;;){var n=Dl;try{if(Tr(),ps.current=sa,ys){for(var o=ms.memoizedState;null!==o;){var i=o.queue;null!==i&&(i.pending=null),o=o.next}ys=!1}if(fs=0,vs=gs=ms=null,bs=!1,Ss=0,Ml.current=null,null===n||null===n.return){Ol=1,Bl=t,Dl=null;break}e:{var s=e,a=n.return,l=n,u=t;if(t=Ll,l.flags|=32768,null!==u&&"object"==typeof u&&"function"==typeof u.then){var c=u,d=l,p=d.tag;if(!(1&d.mode||0!==p&&11!==p&&15!==p)){var h=d.alternate;h?(d.updateQueue=h.updateQueue,d.memoizedState=h.memoizedState,d.lanes=h.lanes):(d.updateQueue=null,d.memoizedState=null)}var f=va(a);if(null!==f){f.flags&=-257,ya(f,a,l,0,t),1&f.mode&&ga(s,c,t),u=c;var m=(t=f).updateQueue;if(null===m){var g=new Set;g.add(u),t.updateQueue=g}else m.add(u);break e}if(!(1&t)){ga(s,c,t),gu();break e}u=Error(r(426))}else if(rr&&1&l.mode){var v=va(a);if(null!==v){!(65536&v.flags)&&(v.flags|=256),ya(v,a,l,0,t),mr(ca(u,l));break e}}s=u=ca(u,l),4!==Ol&&(Ol=2),null===Fl?Fl=[s]:Fl.push(s),s=a;do{switch(s.tag){case 3:s.flags|=65536,t&=-t,s.lanes|=t,Vr(s,fa(0,u,t));break e;case 1:l=u;var y=s.type,b=s.stateNode;if(!(128&s.flags||"function"!=typeof y.getDerivedStateFromError&&(null===b||"function"!=typeof b.componentDidCatch||null!==Wl&&Wl.has(b)))){s.flags|=65536,t&=-t,s.lanes|=t,Vr(s,ma(s,l,t));break e}}s=s.return}while(null!==s)}wu(n)}catch(e){t=e,Dl===n&&null!==n&&(Dl=n=n.return);continue}break}}function mu(){var e=El.current;return El.current=sa,null===e?sa:e}function gu(){0!==Ol&&3!==Ol&&2!==Ol||(Ol=4),null===Pl||!(268435455&Vl)&&!(268435455&Rl)||lu(Pl,Ll)}function vu(e,t){var n=Nl;Nl|=2;var o=mu();for(Pl===e&&Ll===t||(ql=null,hu(e,t));;)try{yu();break}catch(t){fu(e,t)}if(Tr(),Nl=n,El.current=o,null!==Dl)throw Error(r(261));return Pl=null,Ll=0,Ol}function yu(){for(;null!==Dl;)Su(Dl)}function bu(){for(;null!==Dl&&!Ge();)Su(Dl)}function Su(e){var t=Cl(e.alternate,e,_l);e.memoizedProps=e.pendingProps,null===t?wu(e):Dl=t,Ml.current=null}function wu(e){var t=e;do{var n=t.alternate;if(e=t.return,32768&t.flags){if(null!==(n=Ga(n,t)))return n.flags&=32767,void(Dl=n);if(null===e)return Ol=6,void(Dl=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}else if(null!==(n=Ka(n,t,_l)))return void(Dl=n);if(null!==(t=t.sibling))return void(Dl=t);Dl=t=e}while(null!==t);0===Ol&&(Ol=5)}function Tu(e,t,n){var o=bt,i=Il.transition;try{Il.transition=null,bt=1,function(e,t,n,o){do{ku()}while(null!==Gl);if(6&Nl)throw Error(r(327));n=e.finishedWork;var i=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(r(177));e.callbackNode=null,e.callbackPriority=0;var s=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0<n;){var i=31-st(n),r=1<<i;t[i]=0,o[i]=-1,e[i]=-1,n&=~r}}(e,s),e===Pl&&(Dl=Pl=null,Ll=0),!(2064&n.subtreeFlags)&&!(2064&n.flags)||Kl||(Kl=!0,Pu(tt,(function(){return ku(),null}))),s=!!(15990&n.flags),15990&n.subtreeFlags||s){s=Il.transition,Il.transition=null;var a=bt;bt=1;var l=Nl;Nl|=4,Ml.current=null,function(e,t){if(ti=qt,fo(e=ho())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var o=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(o&&0!==o.rangeCount){n=o.anchorNode;var i=o.anchorOffset,s=o.focusNode;o=o.focusOffset;try{n.nodeType,s.nodeType}catch(e){n=null;break e}var a=0,l=-1,u=-1,c=0,d=0,p=e,h=null;t:for(;;){for(var f;p!==n||0!==i&&3!==p.nodeType||(l=a+i),p!==s||0!==o&&3!==p.nodeType||(u=a+o),3===p.nodeType&&(a+=p.nodeValue.length),null!==(f=p.firstChild);)h=p,p=f;for(;;){if(p===e)break t;if(h===n&&++c===i&&(l=a),h===s&&++d===o&&(u=a),null!==(f=p.nextSibling))break;h=(p=h).parentNode}p=f}n=-1===l||-1===u?null:{start:l,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(ni={focusedElem:e,selectionRange:n},qt=!1,Za=t;null!==Za;)if(e=(t=Za).child,1028&t.subtreeFlags&&null!==e)e.return=t,Za=e;else for(;null!==Za;){t=Za;try{var m=t.alternate;if(1024&t.flags)switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==m){var g=m.memoizedProps,v=m.memoizedState,y=t.stateNode,b=y.getSnapshotBeforeUpdate(t.elementType===t.type?g:vr(t.type,g),v);y.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var S=t.stateNode.containerInfo;1===S.nodeType?S.textContent="":9===S.nodeType&&S.documentElement&&S.removeChild(S.documentElement);break;default:throw Error(r(163))}}catch(e){xu(t,t.return,e)}if(null!==(e=t.sibling)){e.return=t.return,Za=e;break}Za=t.return}m=nl,nl=!1}(e,n),vl(n,e),mo(ni),qt=!!ti,ni=ti=null,e.current=n,bl(n,e,i),Qe(),Nl=l,bt=a,Il.transition=s}else e.current=n;if(Kl&&(Kl=!1,Gl=e,Ql=i),0===(s=e.pendingLanes)&&(Wl=null),function(e){if(rt&&"function"==typeof rt.onCommitFiberRoot)try{rt.onCommitFiberRoot(it,e,void 0,!(128&~e.current.flags))}catch(e){}}(n.stateNode),iu(e,Xe()),null!==t)for(o=e.onRecoverableError,n=0;n<t.length;n++)o((i=t[n]).value,{componentStack:i.stack,digest:i.digest});if($l)throw $l=!1,e=Yl,Yl=null,e;!!(1&Ql)&&0!==e.tag&&ku(),1&(s=e.pendingLanes)?e===Jl?Xl++:(Xl=0,Jl=e):Xl=0,Hi()}(e,t,n,o)}finally{Il.transition=i,bt=o}return null}function ku(){if(null!==Gl){var e=St(Ql),t=Il.transition,n=bt;try{if(Il.transition=null,bt=16>e?16:e,null===Gl)var o=!1;else{if(e=Gl,Gl=null,Ql=0,6&Nl)throw Error(r(331));var i=Nl;for(Nl|=4,Za=e.current;null!==Za;){var s=Za,a=s.child;if(16&Za.flags){var l=s.deletions;if(null!==l){for(var u=0;u<l.length;u++){var c=l[u];for(Za=c;null!==Za;){var d=Za;switch(d.tag){case 0:case 11:case 15:ol(8,d,s)}var p=d.child;if(null!==p)p.return=d,Za=p;else for(;null!==Za;){var h=(d=Za).sibling,f=d.return;if(sl(d),d===c){Za=null;break}if(null!==h){h.return=f,Za=h;break}Za=f}}}var m=s.alternate;if(null!==m){var g=m.child;if(null!==g){m.child=null;do{var v=g.sibling;g.sibling=null,g=v}while(null!==g)}}Za=s}}if(2064&s.subtreeFlags&&null!==a)a.return=s,Za=a;else e:for(;null!==Za;){if(2048&(s=Za).flags)switch(s.tag){case 0:case 11:case 15:ol(9,s,s.return)}var y=s.sibling;if(null!==y){y.return=s.return,Za=y;break e}Za=s.return}}var b=e.current;for(Za=b;null!==Za;){var S=(a=Za).child;if(2064&a.subtreeFlags&&null!==S)S.return=a,Za=S;else e:for(a=b;null!==Za;){if(2048&(l=Za).flags)try{switch(l.tag){case 0:case 11:case 15:il(9,l)}}catch(e){xu(l,l.return,e)}if(l===a){Za=null;break e}var w=l.sibling;if(null!==w){w.return=l.return,Za=w;break e}Za=l.return}}if(Nl=i,Hi(),rt&&"function"==typeof rt.onPostCommitFiberRoot)try{rt.onPostCommitFiberRoot(it,e)}catch(e){}o=!0}return o}finally{bt=n,Il.transition=t}}return!1}function Cu(e,t,n){e=Or(e,t=fa(0,t=ca(n,t),1),1),t=tu(),null!==e&&(vt(e,1,t),iu(e,t))}function xu(e,t,n){if(3===e.tag)Cu(e,e,n);else for(;null!==t;){if(3===t.tag){Cu(t,e,n);break}if(1===t.tag){var o=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof o.componentDidCatch&&(null===Wl||!Wl.has(o))){t=Or(t,e=ma(t,e=ca(n,e),1),1),e=tu(),null!==t&&(vt(t,1,e),iu(t,e));break}}t=t.return}}function Eu(e,t,n){var o=e.pingCache;null!==o&&o.delete(t),t=tu(),e.pingedLanes|=e.suspendedLanes&n,Pl===e&&(Ll&n)===n&&(4===Ol||3===Ol&&(130023424&Ll)===Ll&&500>Xe()-jl?hu(e,0):Ul|=n),iu(e,t)}function Mu(e,t){0===t&&(1&e.mode?(t=ct,!(130023424&(ct<<=1))&&(ct=4194304)):t=1);var n=tu();null!==(e=Pr(e,t))&&(vt(e,t,n),iu(e,n))}function Iu(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Mu(e,n)}function Nu(e,t){var n=0;switch(e.tag){case 13:var o=e.stateNode,i=e.memoizedState;null!==i&&(n=i.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(r(314))}null!==o&&o.delete(t),Mu(e,n)}function Pu(e,t){return We(e,t)}function Du(e,t,n,o){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Lu(e,t,n,o){return new Du(e,t,n,o)}function _u(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Au(e,t){var n=e.alternate;return null===n?((n=Lu(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Ou(e,t,n,o,i,s){var a=2;if(o=e,"function"==typeof e)_u(e)&&(a=1);else if("string"==typeof e)a=5;else e:switch(e){case k:return Bu(n.children,i,s,t);case C:a=8,i|=8;break;case x:return(e=Lu(12,n,t,2|i)).elementType=x,e.lanes=s,e;case N:return(e=Lu(13,n,t,i)).elementType=N,e.lanes=s,e;case P:return(e=Lu(19,n,t,i)).elementType=P,e.lanes=s,e;case _:return Vu(n,i,s,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case E:a=10;break e;case M:a=9;break e;case I:a=11;break e;case D:a=14;break e;case L:a=16,o=null;break e}throw Error(r(130,null==e?e:typeof e,""))}return(t=Lu(a,n,t,i)).elementType=e,t.type=o,t.lanes=s,t}function Bu(e,t,n,o){return(e=Lu(7,e,o,t)).lanes=n,e}function Vu(e,t,n,o){return(e=Lu(22,e,o,t)).elementType=_,e.lanes=n,e.stateNode={isHidden:!1},e}function Ru(e,t,n){return(e=Lu(6,e,null,t)).lanes=n,e}function Uu(e,t,n){return(t=Lu(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Fu(e,t,n,o,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=o,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function zu(e,t,n,o,i,r,s,a,l){return e=new Fu(e,t,n,a,l),1===t?(t=1,!0===r&&(t|=8)):t=0,r=Lu(3,null,null,t),e.current=r,r.stateNode=e,r.memoizedState={element:o,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Lr(r),e}function ju(e){if(!e)return Ii;e:{if(je(e=e._reactInternals)!==e||1!==e.tag)throw Error(r(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(_i(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(r(171))}if(1===e.tag){var n=e.type;if(_i(n))return Bi(e,n,t)}return t}function Hu(e,t,n,o,i,r,s,a,l){return(e=zu(n,o,!0,e,0,r,0,a,l)).context=ju(null),n=e.current,(r=Ar(o=tu(),i=nu(n))).callback=null!=t?t:null,Or(n,r,i),e.current.lanes=i,vt(e,i,o),iu(e,o),e}function qu(e,t,n,o){var i=t.current,r=tu(),s=nu(i);return n=ju(n),null===t.context?t.context=n:t.pendingContext=n,(t=Ar(r,s)).payload={element:e},null!==(o=void 0===o?null:o)&&(t.callback=o),null!==(e=Or(i,t,s))&&(ou(e,i,s,r),Br(e,i,s)),s}function $u(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Yu(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Wu(e,t){Yu(e,t),(e=e.alternate)&&Yu(e,t)}Cl=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Pi.current)Sa=!0;else{if(!(e.lanes&n||128&t.flags))return Sa=!1,function(e,t,n){switch(t.tag){case 3:Pa(t),fr();break;case 5:ss(t);break;case 1:_i(t.type)&&Vi(t);break;case 4:is(t,t.stateNode.containerInfo);break;case 10:var o=t.type._context,i=t.memoizedProps.value;Mi(yr,o._currentValue),o._currentValue=i;break;case 13:if(null!==(o=t.memoizedState))return null!==o.dehydrated?(Mi(ls,1&ls.current),t.flags|=128,null):n&t.child.childLanes?Ra(e,t,n):(Mi(ls,1&ls.current),null!==(e=$a(e,t,n))?e.sibling:null);Mi(ls,1&ls.current);break;case 19:if(o=!!(n&t.childLanes),128&e.flags){if(o)return Ha(e,t,n);t.flags|=128}if(null!==(i=t.memoizedState)&&(i.rendering=null,i.tail=null,i.lastEffect=null),Mi(ls,ls.current),o)break;return null;case 22:case 23:return t.lanes=0,xa(e,t,n)}return $a(e,t,n)}(e,t,n);Sa=!!(131072&e.flags)}else Sa=!1,rr&&1048576&t.flags&&er(t,Wi,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;qa(e,t),e=t.pendingProps;var i=Li(t,Ni.current);xr(t,n),i=Cs(null,t,o,e,i,n);var s=xs();return t.flags|=1,"object"==typeof i&&null!==i&&"function"==typeof i.render&&void 0===i.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,_i(o)?(s=!0,Vi(t)):s=!1,t.memoizedState=null!==i.state&&void 0!==i.state?i.state:null,Lr(t),i.updater=jr,t.stateNode=i,i._reactInternals=t,Yr(t,o,e,n),t=Na(null,t,o,!0,s,n)):(t.tag=0,rr&&s&&tr(t),wa(null,t,i,n),t=t.child),t;case 16:o=t.elementType;e:{switch(qa(e,t),e=t.pendingProps,o=(i=o._init)(o._payload),t.type=o,i=t.tag=function(e){if("function"==typeof e)return _u(e)?1:0;if(null!=e){if((e=e.$$typeof)===I)return 11;if(e===D)return 14}return 2}(o),e=vr(o,e),i){case 0:t=Ma(null,t,o,e,n);break e;case 1:t=Ia(null,t,o,e,n);break e;case 11:t=Ta(null,t,o,e,n);break e;case 14:t=ka(null,t,o,vr(o.type,e),n);break e}throw Error(r(306,o,""))}return t;case 0:return o=t.type,i=t.pendingProps,Ma(e,t,o,i=t.elementType===o?i:vr(o,i),n);case 1:return o=t.type,i=t.pendingProps,Ia(e,t,o,i=t.elementType===o?i:vr(o,i),n);case 3:e:{if(Pa(t),null===e)throw Error(r(387));o=t.pendingProps,i=(s=t.memoizedState).element,_r(e,t),Rr(t,o,null,n);var a=t.memoizedState;if(o=a.element,s.isDehydrated){if(s={element:o,isDehydrated:!1,cache:a.cache,pendingSuspenseBoundaries:a.pendingSuspenseBoundaries,transitions:a.transitions},t.updateQueue.baseState=s,t.memoizedState=s,256&t.flags){t=Da(e,t,o,n,i=ca(Error(r(423)),t));break e}if(o!==i){t=Da(e,t,o,n,i=ca(Error(r(424)),t));break e}for(ir=ci(t.stateNode.containerInfo.firstChild),or=t,rr=!0,sr=null,n=Jr(t,null,o,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(fr(),o===i){t=$a(e,t,n);break e}wa(e,t,o,n)}t=t.child}return t;case 5:return ss(t),null===e&&cr(t),o=t.type,i=t.pendingProps,s=null!==e?e.memoizedProps:null,a=i.children,oi(o,i)?a=null:null!==s&&oi(o,s)&&(t.flags|=32),Ea(e,t),wa(e,t,a,n),t.child;case 6:return null===e&&cr(t),null;case 13:return Ra(e,t,n);case 4:return is(t,t.stateNode.containerInfo),o=t.pendingProps,null===e?t.child=Xr(t,null,o,n):wa(e,t,o,n),t.child;case 11:return o=t.type,i=t.pendingProps,Ta(e,t,o,i=t.elementType===o?i:vr(o,i),n);case 7:return wa(e,t,t.pendingProps,n),t.child;case 8:case 12:return wa(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(o=t.type._context,i=t.pendingProps,s=t.memoizedProps,a=i.value,Mi(yr,o._currentValue),o._currentValue=a,null!==s)if(ao(s.value,a)){if(s.children===i.children&&!Pi.current){t=$a(e,t,n);break e}}else for(null!==(s=t.child)&&(s.return=t);null!==s;){var l=s.dependencies;if(null!==l){a=s.child;for(var u=l.firstContext;null!==u;){if(u.context===o){if(1===s.tag){(u=Ar(-1,n&-n)).tag=2;var c=s.updateQueue;if(null!==c){var d=(c=c.shared).pending;null===d?u.next=u:(u.next=d.next,d.next=u),c.pending=u}}s.lanes|=n,null!==(u=s.alternate)&&(u.lanes|=n),Cr(s.return,n,t),l.lanes|=n;break}u=u.next}}else if(10===s.tag)a=s.type===t.type?null:s.child;else if(18===s.tag){if(null===(a=s.return))throw Error(r(341));a.lanes|=n,null!==(l=a.alternate)&&(l.lanes|=n),Cr(a,n,t),a=s.sibling}else a=s.child;if(null!==a)a.return=s;else for(a=s;null!==a;){if(a===t){a=null;break}if(null!==(s=a.sibling)){s.return=a.return,a=s;break}a=a.return}s=a}wa(e,t,i.children,n),t=t.child}return t;case 9:return i=t.type,o=t.pendingProps.children,xr(t,n),o=o(i=Er(i)),t.flags|=1,wa(e,t,o,n),t.child;case 14:return i=vr(o=t.type,t.pendingProps),ka(e,t,o,i=vr(o.type,i),n);case 15:return Ca(e,t,t.type,t.pendingProps,n);case 17:return o=t.type,i=t.pendingProps,i=t.elementType===o?i:vr(o,i),qa(e,t),t.tag=1,_i(o)?(e=!0,Vi(t)):e=!1,xr(t,n),qr(t,o,i),Yr(t,o,i,n),Na(null,t,o,!0,e,n);case 19:return Ha(e,t,n);case 22:return xa(e,t,n)}throw Error(r(156,t.tag))};var Ku="function"==typeof reportError?reportError:function(e){console.error(e)};function Gu(e){this._internalRoot=e}function Qu(e){this._internalRoot=e}function Xu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Ju(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Zu(){}function ec(e,t,n,o,i){var r=n._reactRootContainer;if(r){var s=r;if("function"==typeof i){var a=i;i=function(){var e=$u(s);a.call(e)}}qu(t,s,e,i)}else s=function(e,t,n,o,i){if(i){if("function"==typeof o){var r=o;o=function(){var e=$u(s);r.call(e)}}var s=Hu(t,o,e,0,null,!1,0,"",Zu);return e._reactRootContainer=s,e[mi]=s.current,Ho(8===e.nodeType?e.parentNode:e),du(),s}for(;i=e.lastChild;)e.removeChild(i);if("function"==typeof o){var a=o;o=function(){var e=$u(l);a.call(e)}}var l=zu(e,0,!1,null,0,!1,0,"",Zu);return e._reactRootContainer=l,e[mi]=l.current,Ho(8===e.nodeType?e.parentNode:e),du((function(){qu(t,l,n,o)})),l}(n,t,e,i,o);return $u(s)}Qu.prototype.render=Gu.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(r(409));qu(e,t,null,null)},Qu.prototype.unmount=Gu.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;du((function(){qu(null,e,null,null)})),t[mi]=null}},Qu.prototype.unstable_scheduleHydration=function(e){if(e){var t=Ct();e={blockedOn:null,target:e,priority:t};for(var n=0;n<_t.length&&0!==t&&t<_t[n].priority;n++);_t.splice(n,0,e),0===n&&Vt(e)}},wt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(yt(t,1|n),iu(t,Xe()),!(6&Nl)&&(Hl=Xe()+500,Hi()))}break;case 13:du((function(){var t=Pr(e,1);if(null!==t){var n=tu();ou(t,e,1,n)}})),Wu(e,1)}},Tt=function(e){if(13===e.tag){var t=Pr(e,134217728);null!==t&&ou(t,e,134217728,tu()),Wu(e,134217728)}},kt=function(e){if(13===e.tag){var t=nu(e),n=Pr(e,t);null!==n&&ou(n,e,t,tu()),Wu(e,t)}},Ct=function(){return bt},xt=function(e,t){var n=bt;try{return bt=e,t()}finally{bt=n}},Te=function(e,t,n){switch(t){case"input":if(J(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var o=n[t];if(o!==e&&o.form===e.form){var i=Ti(o);if(!i)throw Error(r(90));W(o),J(o,i)}}}break;case"textarea":re(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Ie=cu,Ne=du;var tc={usingClientEntryPoint:!1,Events:[Si,wi,Ti,Ee,Me,cu]},nc={findFiberByHostInstance:bi,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"},oc={bundleType:nc.bundleType,version:nc.version,rendererPackageName:nc.rendererPackageName,rendererConfig:nc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:S.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=$e(e))?null:e.stateNode},findFiberByHostInstance:nc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ic=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ic.isDisabled&&ic.supportsFiber)try{it=ic.inject(oc),rt=ic}catch(ce){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tc,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Xu(t))throw Error(r(200));return function(e,t,n){var o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:T,key:null==o?null:""+o,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Xu(e))throw Error(r(299));var n=!1,o="",i=Ku;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(o=t.identifierPrefix),void 0!==t.onRecoverableError&&(i=t.onRecoverableError)),t=zu(e,1,!1,null,0,n,0,o,i),e[mi]=t.current,Ho(8===e.nodeType?e.parentNode:e),new Gu(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(r(188));throw e=Object.keys(e).join(","),Error(r(268,e))}return null===(e=$e(t))?null:e.stateNode},t.flushSync=function(e){return du(e)},t.hydrate=function(e,t,n){if(!Ju(t))throw Error(r(200));return ec(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Xu(e))throw Error(r(405));var o=null!=n&&n.hydratedSources||null,i=!1,s="",a=Ku;if(null!=n&&(!0===n.unstable_strictMode&&(i=!0),void 0!==n.identifierPrefix&&(s=n.identifierPrefix),void 0!==n.onRecoverableError&&(a=n.onRecoverableError)),t=Hu(t,null,e,1,null!=n?n:null,i,0,s,a),e[mi]=t.current,Ho(e),o)for(e=0;e<o.length;e++)i=(i=(n=o[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,i]:t.mutableSourceEagerHydrationData.push(n,i);return new Qu(t)},t.render=function(e,t,n){if(!Ju(t))throw Error(r(200));return ec(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Ju(e))throw Error(r(40));return!!e._reactRootContainer&&(du((function(){ec(null,null,e,!1,(function(){e._reactRootContainer=null,e[mi]=null}))})),!0)},t.unstable_batchedUpdates=cu,t.unstable_renderSubtreeIntoContainer=function(e,t,n,o){if(!Ju(n))throw Error(r(200));if(null==e||void 0===e._reactInternals)throw Error(r(38));return ec(e,t,n,!1,o)},t.version="18.2.0-next-9e3b772b8-20220608"},5338:(e,t,n)=>{var o=n(961);t.createRoot=o.createRoot,t.hydrateRoot=o.hydrateRoot},961:(e,t,n)=>{!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(2551)},5287:(e,t)=>{var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),a=Symbol.for("react.provider"),l=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),h=Symbol.iterator,f={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,g={};function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||f}function y(){}function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||f}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=v.prototype;var S=b.prototype=new y;S.constructor=b,m(S,v.prototype),S.isPureReactComponent=!0;var w=Array.isArray,T=Object.prototype.hasOwnProperty,k={current:null},C={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,o){var i,r={},s=null,a=null;if(null!=t)for(i in void 0!==t.ref&&(a=t.ref),void 0!==t.key&&(s=""+t.key),t)T.call(t,i)&&!C.hasOwnProperty(i)&&(r[i]=t[i]);var l=arguments.length-2;if(1===l)r.children=o;else if(1<l){for(var u=Array(l),c=0;c<l;c++)u[c]=arguments[c+2];r.children=u}if(e&&e.defaultProps)for(i in l=e.defaultProps)void 0===r[i]&&(r[i]=l[i]);return{$$typeof:n,type:e,key:s,ref:a,props:r,_owner:k.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var M=/\/+/g;function I(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function N(e,t,i,r,s){var a=typeof e;"undefined"!==a&&"boolean"!==a||(e=null);var l=!1;if(null===e)l=!0;else switch(a){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case n:case o:l=!0}}if(l)return s=s(l=e),e=""===r?"."+I(l,0):r,w(s)?(i="",null!=e&&(i=e.replace(M,"$&/")+"/"),N(s,t,i,"",(function(e){return e}))):null!=s&&(E(s)&&(s=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,i+(!s.key||l&&l.key===s.key?"":(""+s.key).replace(M,"$&/")+"/")+e)),t.push(s)),1;if(l=0,r=""===r?".":r+":",w(e))for(var u=0;u<e.length;u++){var c=r+I(a=e[u],u);l+=N(a,t,i,c,s)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=h&&e[h]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),u=0;!(a=e.next()).done;)l+=N(a=a.value,t,i,c=r+I(a,u++),s);else if("object"===a)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return l}function P(e,t,n){if(null==e)return e;var o=[],i=0;return N(e,o,"","",(function(e){return t.call(n,e,i++)})),o}function D(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var L={current:null},_={transition:null},A={ReactCurrentDispatcher:L,ReactCurrentBatchConfig:_,ReactCurrentOwner:k};t.Children={map:P,forEach:function(e,t,n){P(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return P(e,(function(){t++})),t},toArray:function(e){return P(e,(function(e){return e}))||[]},only:function(e){if(!E(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=v,t.Fragment=i,t.Profiler=s,t.PureComponent=b,t.StrictMode=r,t.Suspense=c,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=A,t.cloneElement=function(e,t,o){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var i=m({},e.props),r=e.key,s=e.ref,a=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,a=k.current),void 0!==t.key&&(r=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(u in t)T.call(t,u)&&!C.hasOwnProperty(u)&&(i[u]=void 0===t[u]&&void 0!==l?l[u]:t[u])}var u=arguments.length-2;if(1===u)i.children=o;else if(1<u){l=Array(u);for(var c=0;c<u;c++)l[c]=arguments[c+2];i.children=l}return{$$typeof:n,type:e.type,key:r,ref:s,props:i,_owner:a}},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:a,_context:e},e.Consumer=e},t.createElement=x,t.createFactory=function(e){var t=x.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:D}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=_.transition;_.transition={};try{e()}finally{_.transition=t}},t.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")},t.useCallback=function(e,t){return L.current.useCallback(e,t)},t.useContext=function(e){return L.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return L.current.useDeferredValue(e)},t.useEffect=function(e,t){return L.current.useEffect(e,t)},t.useId=function(){return L.current.useId()},t.useImperativeHandle=function(e,t,n){return L.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return L.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return L.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return L.current.useMemo(e,t)},t.useReducer=function(e,t,n){return L.current.useReducer(e,t,n)},t.useRef=function(e){return L.current.useRef(e)},t.useState=function(e){return L.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return L.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return L.current.useTransition()},t.version="18.2.0"},6540:(e,t,n)=>{e.exports=n(5287)},7463:(e,t)=>{function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var o=n-1>>>1,i=e[o];if(!(0<r(i,t)))break e;e[o]=t,e[n]=i,n=o}}function o(e){return 0===e.length?null:e[0]}function i(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var o=0,i=e.length,s=i>>>1;o<s;){var a=2*(o+1)-1,l=e[a],u=a+1,c=e[u];if(0>r(l,n))u<i&&0>r(c,l)?(e[o]=c,e[u]=n,o=u):(e[o]=l,e[a]=n,o=a);else{if(!(u<i&&0>r(c,n)))break e;e[o]=c,e[u]=n,o=u}}}return t}function r(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var s=performance;t.unstable_now=function(){return s.now()}}else{var a=Date,l=a.now();t.unstable_now=function(){return a.now()-l}}var u=[],c=[],d=1,p=null,h=3,f=!1,m=!1,g=!1,v="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,b="undefined"!=typeof setImmediate?setImmediate:null;function S(e){for(var t=o(c);null!==t;){if(null===t.callback)i(c);else{if(!(t.startTime<=e))break;i(c),t.sortIndex=t.expirationTime,n(u,t)}t=o(c)}}function w(e){if(g=!1,S(e),!m)if(null!==o(u))m=!0,_(T);else{var t=o(c);null!==t&&A(w,t.startTime-e)}}function T(e,n){m=!1,g&&(g=!1,y(E),E=-1),f=!0;var r=h;try{for(S(n),p=o(u);null!==p&&(!(p.expirationTime>n)||e&&!N());){var s=p.callback;if("function"==typeof s){p.callback=null,h=p.priorityLevel;var a=s(p.expirationTime<=n);n=t.unstable_now(),"function"==typeof a?p.callback=a:p===o(u)&&i(u),S(n)}else i(u);p=o(u)}if(null!==p)var l=!0;else{var d=o(c);null!==d&&A(w,d.startTime-n),l=!1}return l}finally{p=null,h=r,f=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var k,C=!1,x=null,E=-1,M=5,I=-1;function N(){return!(t.unstable_now()-I<M)}function P(){if(null!==x){var e=t.unstable_now();I=e;var n=!0;try{n=x(!0,e)}finally{n?k():(C=!1,x=null)}}else C=!1}if("function"==typeof b)k=function(){b(P)};else if("undefined"!=typeof MessageChannel){var D=new MessageChannel,L=D.port2;D.port1.onmessage=P,k=function(){L.postMessage(null)}}else k=function(){v(P,0)};function _(e){x=e,C||(C=!0,k())}function A(e,n){E=v((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){m||f||(m=!0,_(T))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):M=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return h},t.unstable_getFirstCallbackNode=function(){return o(u)},t.unstable_next=function(e){switch(h){case 1:case 2:case 3:var t=3;break;default:t=h}var n=h;h=t;try{return e()}finally{h=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=h;h=e;try{return t()}finally{h=n}},t.unstable_scheduleCallback=function(e,i,r){var s=t.unstable_now();switch(r="object"==typeof r&&null!==r&&"number"==typeof(r=r.delay)&&0<r?s+r:s,e){case 1:var a=-1;break;case 2:a=250;break;case 5:a=1073741823;break;case 4:a=1e4;break;default:a=5e3}return e={id:d++,callback:i,priorityLevel:e,startTime:r,expirationTime:a=r+a,sortIndex:-1},r>s?(e.sortIndex=r,n(c,e),null===o(u)&&e===o(c)&&(g?(y(E),E=-1):g=!0,A(w,r-s))):(e.sortIndex=a,n(u,e),m||f||(m=!0,_(T))),e},t.unstable_shouldYield=N,t.unstable_wrapCallback=function(e){var t=h;return function(){var n=h;h=t;try{return e.apply(this,arguments)}finally{h=n}}}},9982:(e,t,n)=>{e.exports=n(7463)},3225:function(e,t){var n=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.AnimationUtils=void 0,t.AnimationUtils={applyLoadingAnimation:function(e,t,o){return e.style.animation=`rotate ${t}s 0s infinite`,()=>n(this,void 0,void 0,(function*(){return new Promise((n=>{e.style.animation=`rotate ${t}s`;const i=()=>{o&&o(),e.style.animation="none",e.removeEventListener("animationend",i),n()};e.addEventListener("animationend",i)}))}))},setupAutoHideAnimation:function(e,t,n=!0,o=!0){const{hide:i,show:r}=this.setupCustomHideAnimation(e,t,n,o);t.addEventListener("mouseleave",(()=>i())),t.addEventListener("mouseenter",(()=>r()))},setupCustomHideAnimation:function(e,t,n=!0,o=!0){n&&e.classList.add("autoHiding"),e.classList.add("sbhidden"),e.classList.add("animationDone"),o||e.classList.add("autoHideLeft");let i=!1;return{hide:()=>{i=!1,e.classList.contains("autoHiding")&&e.classList.add("sbhidden")},show:()=>{i=!0,e.classList.remove("animationDone"),setTimeout((()=>{i&&e.classList.remove("sbhidden")}),10)}}},enableAutoHideAnimation:function(e){e.classList.add("autoHiding"),e.classList.add("sbhidden")},disableAutoHideAnimation:function(e){e.classList.remove("autoHiding"),e.classList.remove("sbhidden")}}},3531:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendBinaryRequestToCustomServer=t.sendRequestToCustomServer=t.setupBackgroundRequestProxy=t.sendRealRequestToCustomServer=void 0;const i=n(1108),r=n(1740),s=n(3262);function a(e,t,n={},r={}){return o(this,void 0,void 0,(function*(){return"get"===e.toLowerCase()&&(t=(0,i.objectToURI)(t,n,!0),n=null),yield fetch(t,{method:e,headers:Object.assign({"Content-Type":"application/json"},r||{}),redirect:"follow",body:n?JSON.stringify(n):null})}))}t.sendRealRequestToCustomServer=a,t.setupBackgroundRequestProxy=function(){chrome.runtime.onMessage.addListener(((e,t,n)=>"sendRequest"===e.message?(a(e.type,e.url,e.data,e.headers).then((t=>o(this,void 0,void 0,(function*(){const o=e.binary?(0,i.isFirefoxOrSafari)()&&!(0,r.isSafari)()?yield t.blob():Array.from(new Uint8Array(yield t.arrayBuffer())):null;n({responseText:e.binary?"":yield t.text(),responseBinary:o,headers:e.returnHeaders&&t.headers?[...t.headers.entries()].reduce(((e,[t,n])=>(e[t]=n,e)),{}):null,status:t.status,ok:t.ok})})))).catch((()=>{n({responseText:"",responseBinary:null,headers:null,status:-1,ok:!1})})),!0):"getHash"===e.message&&((0,s.getHash)(e.value,e.times).then(n).catch((e=>{n({error:null==e?void 0:e.message})})),!0)))},t.sendRequestToCustomServer=function(e,t,n={},o={}){return new Promise(((i,r)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:n,headers:o},(e=>{-1!==e.status?i(e):r(e)}))}))},t.sendBinaryRequestToCustomServer=function(e,t,n={},o={}){return new Promise(((i,r)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:n,headers:o,binary:!0,returnHeaders:!0},(e=>{-1!==e.status?i(e):r(e)}))}))}},7046:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.chromeP=void 0,t.chromeP="undefined"==typeof browser?"undefined"!=typeof chrome?chrome:null:browser},2146:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DataCache=void 0,t.DataCache=class{constructor(e,t=2e3){this.cache={},this.init=e,this.cacheLimit=t}getFromCache(e){return this.cache[e]}setupCache(e){if(!this.cache[e]&&(this.cache[e]=Object.assign(Object.assign({},this.init()),{lastUsed:Date.now()}),Object.keys(this.cache).length>this.cacheLimit)){const e=Object.entries(this.cache).reduce(((e,t)=>e[1].lastUsed<t[1].lastUsed?e:t));delete this.cache[e[0]]}return this.cache[e]}cacheUsed(e){return this.cache[e]&&(this.cache[e].lastUsed=Date.now()),!!this.cache[e]}}},2184:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.injectUpdatedScripts=t.getCleanupStartMessage=t.getCleanupId=t.setupCleanupListener=t.addCleanupListener=void 0;const i=n(7046),r=[];function s(){return`${chrome.runtime.id}-cleanup`}t.addCleanupListener=function(e){r.push(e)},t.setupCleanupListener=function(){const e=s(),t=performance.now();window.postMessage({source:e,message:"cleanup-start"}),window.addEventListener("message",(n=>{var o;if((null===(o=n.data)||void 0===o?void 0:o.source)&&n.data.source===e&&"cleanup-start"===n.data.message&&performance.now()-t>5e3)for(const e of r)e()}))},t.getCleanupId=s,t.getCleanupStartMessage=function(){return"cleanup-start"},t.injectUpdatedScripts=function(e=[],t=!1){return o(this,void 0,void 0,(function*(){const n=t?e:e.concat(chrome.runtime.getManifest().content_scripts||[]);if("scripting"in chrome)for(const e of n)for(const t of yield i.chromeP.tabs.query({url:e.matches}))e.css&&e.css.length>0&&(yield i.chromeP.scripting.insertCSS({target:{tabId:t.id},files:e.css||[]})),yield i.chromeP.scripting.executeScript({target:{tabId:t.id},files:e.js||[],world:e.world||"ISOLATED"});else chrome.windows.getAll({populate:!0},(e=>{var t,o;for(const i of e)if(i.tabs)for(const e of i.tabs)for(const i of n)if(e.url&&(null===(o=null===(t=i.matches)||void 0===t?void 0:t.some)||void 0===o?void 0:o.call(t,(t=>e.url.match(t.replace(/\//g,"\\/").replace(/\./g,"\\.").replace(/\*/g,".*")))))){if(i.js)for(const t of i.js)chrome.tabs.executeScript(e.id,{file:t});if(i.css)for(const t of i.css)chrome.tabs.insertCSS(e.id,{file:t})}}))}))}},4586:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenericTooltip=void 0;const o=n(6540),i=n(5338),r=n(1108),s=n(1740);t.GenericTooltip=class{constructor(e,t){var n,a,l,u,c,d,p,h,f,m,g,v,y,b,S,w,T,k,C;null!==(n=e.bottomOffset)&&void 0!==n||(e.bottomOffset="70px"),null!==(a=e.topOffset)&&void 0!==a||(e.topOffset="inherit"),null!==(l=e.leftOffset)&&void 0!==l||(e.leftOffset="inherit"),null!==(u=e.rightOffset)&&void 0!==u||(e.rightOffset="inherit"),null!==(c=e.zIndex)&&void 0!==c||(e.zIndex=1e4),null!==(d=e.innerBottomMargin)&&void 0!==d||(e.innerBottomMargin="0px"),null!==(p=e.opacity)&&void 0!==p||(e.opacity=.7),null!==(h=e.displayTriangle)&&void 0!==h||(e.displayTriangle=!e.topTriangle),null!==(f=e.topTriangle)&&void 0!==f||(e.topTriangle=!1),null!==(m=e.extraClass)&&void 0!==m||(e.extraClass=""),null!==(g=e.showLogo)&&void 0!==g||(e.showLogo=!0),null!==(v=e.showGotIt)&&void 0!==v||(e.showGotIt=!0),null!==(y=e.positionRealtive)&&void 0!==y||(e.positionRealtive=!0),null!==(b=e.containerAbsolute)&&void 0!==b||(e.containerAbsolute=!1),null!==(S=e.center)&&void 0!==S||(e.center=!1),null!==(w=e.elements)&&void 0!==w||(e.elements=[]),null!==(T=e.buttonsAtBottom)&&void 0!==T||(e.buttonsAtBottom=!1),null!==(k=e.textBoxes)&&void 0!==k||(e.textBoxes=[]),null!==(C=e.textBoxMaxHeight)&&void 0!==C||(e.textBoxMaxHeight="inherit"),this.text=e.text,this.container=document.createElement("div"),this.container.id="sponsorTooltip"+e.text,e.positionRealtive&&(this.container.style.position="relative"),e.containerAbsolute&&(this.container.style.position="absolute"),e.center&&((0,r.isFirefoxOrSafari)()&&!(0,s.isSafari)()?this.container.style.width="-moz-available":this.container.style.width="-webkit-fill-available"),e.prependElement?e.referenceNode.insertBefore(this.container,e.prependElement):e.referenceNode.appendChild(this.container),e.timeout&&(this.timer=setTimeout((()=>this.close()),1e3*e.timeout));const x=`rgba(28, 28, 28, ${e.opacity})`;this.root=(0,i.createRoot)(this.container),this.root.render(o.createElement("div",{style:{bottom:e.bottomOffset,top:e.topOffset,left:e.leftOffset,right:e.rightOffset,zIndex:e.zIndex,backgroundColor:x,margin:e.center?"auto":void 0},className:"sponsorBlockTooltip"+(e.displayTriangle||e.topTriangle?" sbTriangle":"")+(e.topTriangle?" sbTopTriangle":"")+(1===e.opacity?" sbSolid":"")+` ${e.extraClass}`},o.createElement("div",{style:{marginBottom:e.innerBottomMargin,maxHeight:e.textBoxMaxHeight,overflowY:"auto"}},e.showLogo?o.createElement("img",{className:"sponsorSkipLogo sponsorSkipObject",src:chrome.runtime.getURL(t)}):null,this.text?o.createElement("span",{className:"sponsorSkipObject"+(e.showLogo?"":" sponsorSkipObjectFirst")},this.getTextElements(this.text+(e.link?". ":"")),e.link?o.createElement("a",{style:{textDecoration:"underline"},target:"_blank",rel:"noopener noreferrer",href:e.link},chrome.i18n.getMessage("LearnMore")):e.linkOnClick?o.createElement("a",{style:{textDecoration:"underline",marginLeft:"5px",cursor:"pointer"},onClick:e.linkOnClick,onAuxClick:e.linkOnClick},chrome.i18n.getMessage("LearnMore")):null):null,e.textBoxes?e.textBoxes.map(((t,n)=>o.createElement("div",{key:n,className:"sponsorSkipObject"+(e.showLogo?"":" sponsorSkipObjectFirst")},t||String.fromCharCode(8203)," "))):null,e.elements,!e.buttonsAtBottom&&this.getButtons(e.buttons,e.buttonsAtBottom)),e.buttonsAtBottom&&this.getButtons(e.buttons,e.buttonsAtBottom),e.showGotIt?o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton",style:{float:"right"},onClick:()=>this.close()},chrome.i18n.getMessage("GotIt")):null,e.secondButtonText?o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton",style:{float:"right"},onClick:()=>{var t;return null===(t=e.secondButtonOnClick)||void 0===t?void 0:t.call(e)}},e.secondButtonText):null))}getTextElements(e){if(!e.includes("\n"))return[o.createElement(o.Fragment,null,e)];const t=[];for(const n of e.split("\n"))t.push(o.createElement("div",{style:{padding:"5px"},key:n},n));return t}getButtons(e,t){if(e){const n=[],i={};t&&(i.float="right");for(const t of e)n.push(o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton",style:i,key:t.name,onClick:e=>t.listener(e)},t.name));return n}return[]}close(){this.root.unmount(),this.container.remove(),this.timer&&clearTimeout(this.timer)}}},1740:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.keybindToString=t.formatKey=t.keybindEquals=t.isSafari=t.ProtoConfig=void 0;const i=n(1108);function r(){return"undefined"!=typeof navigator&&"Apple Computer, Inc."===navigator.vendor}function s(e){return null==e?"":" "==e?"Space":1==e.length?e.toUpperCase():e}t.ProtoConfig=class{constructor(e,t,n,o=!1){this.configLocalListeners=[],this.configSyncListeners=[],this.cachedSyncConfig=null,this.cachedLocalStorage=null,this.config=null,this.local=null,this.inDeArrow=!1,this.syncDefaults=e,this.localDefaults=t,this.inDeArrow=o,this.setupConfig(n).then((e=>{this.config=null==e?void 0:e.sync,this.local=null==e?void 0:e.local}))}configProxy(){chrome.storage.onChanged.addListener(((e,t)=>{if("sync"===t){for(const t in e)this.cachedSyncConfig[t]=e[t].newValue;for(const t of this.configSyncListeners)t(e)}else if("local"===t){for(const t in e)this.cachedLocalStorage[t]=e[t].newValue;for(const t of this.configLocalListeners)t(e)}}));let e=0;const t=new Set;let n=null;const o=this,i={set(i,r,s){if(o.cachedSyncConfig[r]=s,Date.now()-e<100){if(t.add(r),!n){const e=()=>{const e=[...t];t.clear(),chrome.storage.sync.set(e.map((e=>[e,o.cachedSyncConfig[e]])).reduce(((e,[t,n])=>(e[t]=n,e)),{})),n=null};n=setTimeout(e,20)}return!0}return chrome.storage.sync.set({[r]:s}),e=Date.now(),!0},get(e,t){const n=o.cachedSyncConfig[t];return e[t]||n},deleteProperty:(e,t)=>(chrome.storage.sync.remove(t),!0)},r={set:(e,t,n)=>(o.cachedLocalStorage[t]=n,chrome.storage.local.set({[t]:n}),!0),get(e,t){const n=o.cachedLocalStorage[t];return e[t]||n},deleteProperty:(e,t)=>(chrome.storage.local.remove(t),!0)};return{sync:new Proxy({handler:i},i),local:new Proxy({handler:r},r)}}forceSyncUpdate(e){const t=this.cachedSyncConfig[e];chrome.storage.sync.set({[e]:t})}forceLocalUpdate(e){const t=this.cachedLocalStorage[e];chrome.storage.local.set({[e]:t},(()=>{const t=chrome.runtime.lastError;t&&"navigationApiAvailable"!==e&&alert(`SponsorBlock/DeArrow: ${chrome.i18n.getMessage("storageFull")}\n\n${t}`)}))}fetchConfig(){return o(this,void 0,void 0,(function*(){yield Promise.all([new Promise((e=>{chrome.storage.sync.get(null,(t=>{this.cachedSyncConfig=t,void 0===this.cachedSyncConfig&&(this.cachedSyncConfig={},(this.inDeArrow||window.location.href.includes("options.html"))&&alert(`${chrome.i18n.getMessage("syncDisabledWarning")}${this.inDeArrow?`\n\n${chrome.i18n.getMessage("syncDisabledWarningDeArrow")}`:""}${(0,i.isFirefoxOrSafari)()&&!r()?`\n\n${chrome.i18n.getMessage("syncDisabledFirefoxSuggestions")}`:""}`)),e()}))})),new Promise((e=>{chrome.storage.local.get(null,(t=>{this.cachedLocalStorage=null!=t?t:{},e()}))}))])}))}setupConfig(e){return o(this,void 0,void 0,(function*(){if("undefined"==typeof chrome)return null;yield this.fetchConfig(),this.addDefaults();const t=this.configProxy();return e(t.sync),t}))}addDefaults(){for(const e in this.syncDefaults)if(Object.prototype.hasOwnProperty.call(this.cachedSyncConfig,e)){if("barTypes"===e)for(const t in this.syncDefaults[e])Object.prototype.hasOwnProperty.call(this.cachedSyncConfig[e],t)||(this.cachedSyncConfig[e][t]=this.syncDefaults[e][t])}else this.cachedSyncConfig[e]=this.syncDefaults[e];for(const e in this.localDefaults)Object.prototype.hasOwnProperty.call(this.cachedLocalStorage,e)||(this.cachedLocalStorage[e]=this.localDefaults[e])}isReady(){return null!==this.config}},t.isSafari=r,t.keybindEquals=function(e,t){return!(null==e||null==t||Boolean(e.alt)!=Boolean(t.alt)||Boolean(e.ctrl)!=Boolean(t.ctrl)||Boolean(e.shift)!=Boolean(t.shift)||null==e.key&&null==e.code||null==t.key&&null==t.code)&&(null!=e.code&&null!=t.code?e.code===t.code:null!=e.key&&null!=t.key&&e.key.toUpperCase()===t.key.toUpperCase())},t.formatKey=s,t.keybindToString=function(e){if(null==e||null==e.key)return"";let t="";return e.ctrl&&(t+="Ctrl + "),e.alt&&(t+="Alt + "),e.shift&&(t+="Shift + "),t+s(e.key)}},2907:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.YT_DOMAINS=void 0,t.YT_DOMAINS=["m.youtube.com","www.youtube.com","www.youtube-nocookie.com","music.youtube.com","www.youtubekids.com","tv.youtube.com"]},4148:function(e,t){var n=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};function o(e,t=!1){var n,o,i;if(!e)return!1;if("VIDEO"===e.tagName&&(e.classList.contains("html5-main-video")||"player"===e.id||"player_html5_api"===e.id)&&1===[...document.querySelectorAll("video")].filter((e=>e.duration)).length&&e.duration)return!0;if(0===e.offsetHeight||0===e.offsetWidth&&!t)return!1;const r=null==e?void 0:e.getBoundingClientRect(),s=document.elementFromPoint(r.left+r.width/2,r.top+r.height/2)||document.elementFromPoint(r.left,r.top);return!s&&"movie_player"===e.id&&r.top<0||!!(s===e||s&&e.contains(s)||s&&s.contains(e))||"VIDEO"===e.tagName&&(!!(null===(n=null==s?void 0:s.closest(".html5-video-player"))||void 0===n?void 0:n.contains(e))||!!(null===(i=null===(o=null==e?void 0:e.closest("#inline-preview-player"))||void 0===o?void 0:o.classList)||void 0===i?void 0:i.contains("playing-mode")))}function i(e,t=!1,n=!0){var i,r;return o(e,t)||n&&!!e&&(o(e.parentElement,t)||o(null!==(r=null===(i=e.parentElement)||void 0===i?void 0:i.parentElement)&&void 0!==r?r:null,t))}function r(e,t=!1,n=!1){return s(e,t,n)}function s(e,t=!1,n=!1,o){for(const r of e){const e=o?o(r):r;if(e&&i(e,t,n))return e}return null}function a(e,t){for(const n of e){const e=document.querySelector(n);if(e&&t(e))return e}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.getElement=t.waitForElement=t.findNonEmptyElement=t.findPredicatedElement=t.findValidElement=t.findValidElementFromSelector=t.isVisibleOrParent=t.isVisible=void 0,t.isVisible=o,t.isVisibleOrParent=i,t.findValidElementFromSelector=function(e,t=!1,n=!1){return s(e,t,n,(e=>document.querySelector(e)))},t.findValidElement=r,t.findPredicatedElement=a,t.findNonEmptyElement=function(e){return a(e,(e=>{var t,n;return(null!==(n=null===(t=e.textContent)||void 0===t?void 0:t.trim())&&void 0!==n?n:"").length>0}))};let l=!1,u=null,c=[];function d(){if(!u){const e=e=>{var t;const n=[];for(const o of c){const{selector:i,visibleCheck:s,ignoreWidth:a,checkParent:l,callbacks:u}=o;let c=!0;if(e){let t=!1;for(const n of e)if("childList"===n.type&&n.addedNodes.length>0){if(n.target instanceof HTMLElement&&(n.target.matches(i)||n.target.querySelector(i))){t=!0;break}for(const e of n.addedNodes)if(e instanceof HTMLElement&&(e.matches(i)||e.querySelector(i))){t=!0;break}if(t)break}t||(c=!1)}const d=c?document.querySelectorAll(i):o.elements;if(d&&d.length>0){o.elements=d;const e=s?r(d,a,l):d[0];if(e){if(null===(t=chrome.runtime)||void 0===t?void 0:t.id)for(const t of u)t(e);n.push(i)}}}c=c.filter((e=>!n.includes(e.selector))),0===c.length&&(null==u||u.disconnect(),u=null,l=!1)};e(),c.length>0&&(u=new MutationObserver(e),u.observe(document.documentElement,{childList:!0,subtree:!0}))}}function p(e,t,n=!1,o=!1){return t?r(document.querySelectorAll(e),n,o):document.querySelector(e)}t.waitForElement=function(e,t=!1,o=!1,i=!1){return n(this,void 0,void 0,(function*(){return yield new Promise((n=>{const r=p(e,t,o,i);if(r)return void n(r);const s=c.find((n=>n.selector===e&&n.visibleCheck===t));s?s.callbacks.push(n):c.push({selector:e,visibleCheck:t,ignoreWidth:o,checkParent:i,callbacks:[n]}),l||(l=!0,document.body?d():window.addEventListener("DOMContentLoaded",(()=>{d()})))}))}))},t.getElement=p},8423:(e,t)=>{function n(){return document.querySelector("#title h1, .ytd-video-primary-info-renderer.title, .slim-video-information-title, #player-container + .h-box > h1, .ytd-video-primary-info-renderer > h1.title, #watch7-headline, .ypcs-video-info")}Object.defineProperty(t,"__esModule",{value:!0}),t.getCurrentPageTitle=t.getYouTubeTitleNode=t.getYouTubeTitleNodeSelector=void 0,t.getYouTubeTitleNodeSelector=function(){return"#title h1, .ytd-video-primary-info-renderer.title, .slim-video-information-title, #player-container + .h-box > h1, .ytd-video-primary-info-renderer > h1.title, #watch7-headline, .ypcs-video-info"},t.getYouTubeTitleNode=n,t.getCurrentPageTitle=function(){const e=n();if(e){const t=e.querySelector("yt-formatted-string.ytd-watch-metadata, .slim-video-information-title .yt-core-attributed-string:not(.cbCustomTitle)");if(t)return t.innerText;for(const t of e.children)if("#text"===t.nodeName&&t.nodeValue&&""!==t.nodeValue.trim())return t.nodeValue}return null}},7913:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorMessage=t.getFormattedTime=t.getFormattedTimeToSeconds=void 0,t.getFormattedTimeToSeconds=function(e){const t=/^(?:(?:(\d+):)?(\d+):)?(\d*(?:[.,]\d+)?)$/.exec(e);return null===t?null:3600*(t[1]?parseInt(t[1]):0)+60*(t[2]?parseInt(t[2]||"0"):0)+(t[3]?parseFloat(t[3].replace(",",".")):0)},t.getFormattedTime=function(e,t){e=Math.max(e,0);const n=Math.floor(e/60/60),o=Math.floor(e/60)%60;let i=String(o),r=e%60;t||(r=Math.floor(r));let s=String(t?r.toFixed(3):r);return r<10&&(s="0"+s),n&&o<10&&(i="0"+i),isNaN(n)||isNaN(o)?null:(n?n+":":"")+i+":"+s},t.getErrorMessage=function(e,t){const n=!t||t.includes("cf-wrapper")||t.includes("<!DOCTYPE html>")?"":"\n\n"+t;return[400,409,0].includes(e)?chrome.i18n.getMessage(e+"")+" "+chrome.i18n.getMessage("errorCode")+e+n:e>=500&&e<=599?(503==e&&(e=502),chrome.i18n.getMessage(e+"")+" "+chrome.i18n.getMessage("errorCode")+e+"\n\n"+chrome.i18n.getMessage("statusReminder")):chrome.i18n.getMessage("connectionError")+e+n}},3262:function(e,t){var n=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.getHash=void 0,t.getHash=function(e,t=5e3){return n(this,void 0,void 0,(function*(){if(t<=0)return"";if(!("subtle"in crypto))return new Promise(((n,o)=>chrome.runtime.sendMessage({message:"getHash",value:e,times:t},(e=>{e.error?o(e.error):n(e)}))));let n=e;for(let e=0;e<t;e++){const e=yield crypto.subtle.digest("SHA-256",(new TextEncoder).encode(n).buffer);n=Array.from(new Uint8Array(e)).map((e=>e.toString(16).padStart(2,"0"))).join("")}return n}))}},1108:function(e,t){var n=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.extensionUserAgent=t.isFirefoxOrSafari=t.timeoutPomise=t.PromiseTimeoutError=t.objectToURI=t.waitFor=void 0,t.waitFor=function(e,t=5e3,o=100,i){return n(this,void 0,void 0,(function*(){return yield new Promise(((n,r)=>{let s=null;const a=()=>{const t=e();(i?i(t):t)&&(n(t),s&&clearInterval(s))};t&&(setTimeout((()=>{clearInterval(s),r(`TIMEOUT waiting for ${null==e?void 0:e.toString()}: ${Error().stack}`)}),t),s=setInterval(a,o)),a()}))}))},t.objectToURI=function(e,t,n){let o=0;for(const i in t){const r=e.includes("?")||o>0?"&":n?"?":"",s="string"==typeof t[i]?t[i]:JSON.stringify(t[i]);e+=r+encodeURIComponent(i)+"="+encodeURIComponent(s),o++}return e};class o extends Error{constructor(e){super("Promise timed out"),this.promise=e}}let i;t.PromiseTimeoutError=o,t.timeoutPomise=function(e){return new Promise(((t,n)=>{e&&setTimeout((()=>{n(new o)}),e)}))},t.isFirefoxOrSafari=function(){return"undefined"!=typeof browser},t.extensionUserAgent=function(){return null!=i||(i=`${chrome.runtime.id}/v${chrome.runtime.getManifest().version}`),i}},3184:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.isMainMetadataFetcher=t.isLiveSync=t.isLiveOrUpcoming=t.getChannelIDSync=t.getChannelID=t.getPlaybackFormats=t.fetchVideoDataDesktopClient=t.fetchVideoDataAndroidClient=t.fetchVideoMetadata=t.setupMetadataOnRecieve=t.videoMetadataCache=void 0;const i=n(2146),r=n(2184),s=n(1740),a=n(6705);t.videoMetadataCache=new i.DataCache((()=>({playbackUrls:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null})));const l=[];let u=!1;t.setupMetadataOnRecieve=function(){const e=document.getElementById("sponsorblock-document-script");if(e){const t=e.getAttribute("claim-id");t&&t!==chrome.runtime.id||(u=!0,t||e.setAttribute("claim-id",chrome.runtime.id))}const n=e=>{var n,o;if("maze-utils:video-metadata-received"===(null===(n=e.data)||void 0===n?void 0:n.type)){const n=e.data;if(n.videoID&&n.metadata&&!t.videoMetadataCache.getFromCache(n.videoID)){const e=n.metadata,o=t.videoMetadataCache.setupCache(n.videoID);o.playbackUrls=e.playbackUrls,o.duration=e.duration,o.channelID=e.channelID,o.author=e.author,o.isLive=e.isLive,o.isUpcoming=e.isUpcoming;const i=l.findIndex((e=>e.videoID===n.videoID));-1!==i&&(l[i].callbacks.forEach((e=>{e(n.metadata)})),l.splice(i,1))}}else"maze-utils:video-metadata-requested"!==(null===(o=e.data)||void 0===o?void 0:o.type)||e.data.videoID in c||l.push({videoID:e.data.videoID,callbacks:[]})};window.addEventListener("message",n),(0,r.addCleanupListener)((()=>{window.removeEventListener("message",n)}))};const c={};function d(e,n,i=!1){var r;return o(this,void 0,void 0,(function*(){const u=t.videoMetadataCache.getFromCache(e);if(!n&&u&&null!==u.duration)return u;let d=l.find((t=>t.videoID===e));if(d||i)return new Promise((n=>{d||(d={videoID:e,callbacks:[]},l.push(d)),d.callbacks.push((o=>{t.videoMetadataCache.cacheUsed(e),n(o)}))}));try{const n=null!==(r=c[e])&&void 0!==r?r:(()=>o(this,void 0,void 0,(function*(){window.postMessage({type:"maze-utils:video-metadata-requested",videoID:e},"*");let n=yield p(e).catch((()=>null));if((0,a.onMobile)()||n&&(0!==n.formats.length||"LOGIN_REQUIRED"===n.playabilityStatus)||(n=yield p(e).catch((()=>null))),n){let o=n.formats;(0,s.isSafari)()&&(o=o.filter((e=>e.mimeType.includes("avc"))));const i=o.some((e=>e.mimeType.includes("vp9"))),r=o.reverse().filter((e=>e.width&&e.height&&(!i||e.mimeType.includes("vp9")))).sort(((e,t)=>(null==e?void 0:e.width)-(null==t?void 0:t.width))),a=t.videoMetadataCache.setupCache(e);return a.playbackUrls=r.map((e=>({url:e.url,width:e.width,height:e.height}))),a.duration=n.duration,a.channelID=n.channelID,a.author=n.author,a.isLive=n.isLive,a.isUpcoming=n.isUpcoming,setTimeout((()=>delete c[e]),500),window.postMessage({type:"maze-utils:video-metadata-received",videoID:e,metadata:a},"*"),a}return window.postMessage({type:"maze-utils:video-metadata-received",videoID:e,metadata:{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}},"*"),{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}})))();return c[e]=n,yield n}catch(e){}return{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}}))}function p(e){var t,n,i,r,s,a,l,u,c,d,p,h,f,m;return o(this,void 0,void 0,(function*(){const o={context:{client:{clientName:"WEB",clientVersion:"2.20230327.07.00"}},videoId:e};try{const g=yield fetch("https://www.youtube.com/youtubei/v1/player",{body:JSON.stringify(o),headers:{"Content-Type":"application/json"},method:"POST"});if(g.ok){const o=yield g.json();if((null!==(n=null===(t=null==o?void 0:o.videoDetails)||void 0===t?void 0:t.videoId)&&void 0!==n?n:null)!==e)return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null};const v=(null===(i=null==o?void 0:o.streamingData)||void 0===i?void 0:i.adaptiveFormats)||[],y=(null===(r=null==o?void 0:o.videoDetails)||void 0===r?void 0:r.lengthSeconds)?parseInt(o.videoDetails.lengthSeconds):null,b=null!==(a=null===(s=null==o?void 0:o.videoDetails)||void 0===s?void 0:s.channelId)&&void 0!==a?a:null,S=null!==(u=null===(l=null==o?void 0:o.videoDetails)||void 0===l?void 0:l.author)&&void 0!==u?u:null,w=null!==(d=null===(c=null==o?void 0:o.videoDetails)||void 0===c?void 0:c.isLive)&&void 0!==d?d:null;return{formats:v,duration:y,channelID:b,author:S,isLive:w,isUpcoming:null!==(h=null===(p=null==o?void 0:o.videoDetails)||void 0===p?void 0:p.isUpcoming)&&void 0!==h?h:null,playabilityStatus:null!==(m=null===(f=null==o?void 0:o.playabilityStatus)||void 0===f?void 0:f.status)&&void 0!==m?m:null}}}catch(e){}return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null}}))}t.fetchVideoMetadata=d,t.fetchVideoDataAndroidClient=function(e){var t,n,i,r,s,a,l,u,c,d,p,h,f,m;return o(this,void 0,void 0,(function*(){const o="17.31.35",g={context:{client:{clientName:"ANDROID",clientVersion:o,androidSdkVersion:31,osName:"Android",osVersion:"12",hl:"en",gl:"US"}},videoId:e,params:"8AEB",playbackContext:{contentPlaybackContext:{html5Preference:"HTML5_PREF_WANTS"}},contentCheckOk:!0,racyCheckOk:!0};try{const v=yield fetch("https://www.youtube.com/youtubei/v1/player?key=AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w",{body:JSON.stringify(g),headers:{"X-Youtube-Client-Name":"3","X-Youtube-Client-Version":o,"User-Agent":`com.google.android.youtube/${o} (Linux; U; Android 12) gzip`,"Content-Type":"application/json",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-us,en;q=0.5","Sec-Fetch-Mode":"navigate",Connection:"close"},method:"POST"});if(v.ok){const o=yield v.json();if((null!==(n=null===(t=null==o?void 0:o.videoDetails)||void 0===t?void 0:t.videoId)&&void 0!==n?n:null)!==e)return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null};const g=null===(i=null==o?void 0:o.streamingData)||void 0===i?void 0:i.adaptiveFormats,y=(null===(r=null==o?void 0:o.videoDetails)||void 0===r?void 0:r.lengthSeconds)?parseInt(o.videoDetails.lengthSeconds):null,b=null!==(a=null===(s=null==o?void 0:o.videoDetails)||void 0===s?void 0:s.channelId)&&void 0!==a?a:null,S=null!==(u=null===(l=null==o?void 0:o.videoDetails)||void 0===l?void 0:l.author)&&void 0!==u?u:null,w=null!==(d=null===(c=null==o?void 0:o.videoDetails)||void 0===c?void 0:c.isLive)&&void 0!==d?d:null,T=null!==(h=null===(p=null==o?void 0:o.videoDetails)||void 0===p?void 0:p.isUpcoming)&&void 0!==h?h:null,k=null!==(m=null===(f=null==o?void 0:o.playabilityStatus)||void 0===f?void 0:f.status)&&void 0!==m?m:null;if(g)return{formats:g,duration:y,channelID:b,author:S,isLive:w,isUpcoming:T,playabilityStatus:k}}}catch(e){}return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null}}))},t.fetchVideoDataDesktopClient=p,t.getPlaybackFormats=function(e,n,i,r=!1){var s,a,l;return o(this,void 0,void 0,(function*(){const o=yield d(e,r);if(n&&i){const r=null===(a=null===(s=null==o?void 0:o.playbackUrls)||void 0===s?void 0:s.find)||void 0===a?void 0:a.call(s,(e=>(null==e?void 0:e.width)>=n&&(null==e?void 0:e.height)>=i));if(r)return t.videoMetadataCache.cacheUsed(e),r}else if((null===(l=null==o?void 0:o.playbackUrls)||void 0===l?void 0:l.length)>0)return o[0];return null}))},t.getChannelID=function(e,t=!1){return o(this,void 0,void 0,(function*(){const n=yield d(e,!1,t);return n?{channelID:n.channelID,author:n.author}:{channelID:null,author:null}}))},t.getChannelIDSync=function(e){const n=t.videoMetadataCache.getFromCache(e);return n?{channelID:n.channelID,author:n.author}:null},t.isLiveOrUpcoming=function(e){return o(this,void 0,void 0,(function*(){const t=yield d(e,!1);return t?t.isLive||t.isUpcoming:null}))},t.isLiveSync=function(e){const n=t.videoMetadataCache.getFromCache(e);return n?n.isLive&&!n.isUpcoming:null},t.isMainMetadataFetcher=function(){return u}},6705:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.onVideoPage=t.onYouTubeCableTV=t.onMobile=void 0,t.onMobile=function(){return"m.youtube.com"===window.location.hostname},t.onYouTubeCableTV=function(){return"tv.youtube.com"===window.location.hostname},t.onVideoPage=function(){return!!document.URL.match(/\/watch|\/shorts|\/live|\/embed/)}},9249:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.injectScript=void 0;const o=n(9291),i=n(2303);t.injectScript=function(e){const t=document.createElement("script");t.id="sponsorblock-document-script",t.setAttribute("version",i.version),t.innerHTML=e;const n=document.head||document.documentElement,r=document.getElementById("sponsorblock-document-script"),s=null==r?void 0:r.getAttribute("version");!n||r&&!(0,o.versionHigher)(i.version,null!=s?s:"")||(r&&(t.setAttribute("teardown","true"),r.remove()),n.appendChild(t))}},3497:(e,t)=>{function n(e){const t=e.replace(/__MSG_(\w+)__/g,(function(e,t){return t?chrome.i18n.getMessage(t).replace(/</g,"&#60;").replace(/"/g,"&quot;").replace(/\n/g,"<br/>"):""}));return t!=e&&t}Object.defineProperty(t,"__esModule",{value:!0}),t.getLocalizedMessage=t.localizeHtmlPage=t.generateUserID=void 0,t.generateUserID=function(e=36){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let n="";const o="undefined"==typeof window?crypto:window.crypto;if(o&&o.getRandomValues){const i=new Uint32Array(e);o.getRandomValues(i);for(let o=0;o<e;o++)n+=t[i[o]%62];return n}for(let o=0;o<e;o++)n+=t[Math.floor(62*Math.random())];return n},t.localizeHtmlPage=function(){const e=n(document.title);e&&(document.title=e);const t=document.querySelector(".sponsorBlockPageBody"),o=n(t.innerHTML.toString());o&&(t.innerHTML=o)},t.getLocalizedMessage=n},4395:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getThumbnailSelectors=t.getThumbnailBoxSelectors=t.getThumbnailLink=t.getThumbnailImageSelectors=t.getThumbnailElementsToListenFor=t.getThumbnailElements=void 0;const o=n(6705);function i(){return(0,o.onMobile)()?[".media-item-thumbnail-container",".video-thumbnail-container-compact","ytm-thumbnail-cover",".video-thumbnail-container-vertical","ytm-hero-playlist-thumbnail-renderer"]:["ytd-thumbnail","ytd-playlist-thumbnail","ytm-shorts-lockup-view-model","yt-thumbnail-view-model"]}function r(...e){return 0===e.length&&(e=[""]),i().map((t=>e.map((e=>`${t}${e}`)).join(", "))).join(", ")}t.getThumbnailElements=i,t.getThumbnailElementsToListenFor=function(){const e=i();return(0,o.onMobile)()||(e.push("yt-lockup-view-model"),e.push("ytm-shorts-lockup-view-model-v2")),e},t.getThumbnailImageSelectors=function(){return(0,o.onMobile)()?"img.video-thumbnail-img, img.amsterdam-playlist-thumbnail":"ytd-thumbnail:not([hidden]) img, ytd-playlist-thumbnail yt-image:not(.blurred-image) img, yt-img-shadow.ytd-hero-playlist-thumbnail-renderer img, ytm-shorts-lockup-view-model img, .yt-thumbnail-view-model__image img"},t.getThumbnailLink=function(e){return(0,o.onMobile)()?e.querySelector(["a.media-item-thumbnail-container","ytm-channel-featured-video-renderer a","a.compact-media-item-image","a.reel-item-endpoint",".amsterdam-playlist-thumbnail-wrapper a"].join(", ")):e.querySelector(r(" a"))},t.getThumbnailBoxSelectors=function(){return(0,o.onMobile)()?".media-item-thumbnail-container":r(":not([hidden])",".ytd-hero-playlist-thumbnail-renderer")},t.getThumbnailSelectors=r},8343:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.updateAll=t.newThumbnails=t.setThumbnailListener=t.getThumbnailSelector=void 0;const o=n(1108),i=n(2184),r=n(6705),s=n(4395),a=n(3683),l=new Map;let u=0,c=null,d=(0,s.getThumbnailSelectors)(),p="div.thumbnail";function h(){return(0,a.isOnInvidious)()?p:d}t.getThumbnailSelector=h,t.setThumbnailListener=function(e,t,n,s,u){c=e,s&&(d=s),u&&(p=u);const h=()=>{null==t||t(),(0,o.waitFor)((()=>null!==(0,a.isOnInvidious)())).then((()=>{(0,a.isOnInvidious)()&&g()}))};if("complete"===document.readyState?h():window.addEventListener("load",h),(0,o.waitFor)((()=>n()),5e3,10).then((()=>{g()})),(0,r.onMobile)()){const e=()=>b();window.addEventListener("updateui",e),window.addEventListener("state-navigateend",e),(0,i.addCleanupListener)((()=>{window.removeEventListener("updateui",e),window.removeEventListener("state-navigateend",e)}))}(0,i.addCleanupListener)((()=>{for(const e of l)e[1].disconnect();l.clear()}))};let f=0,m=null;function g(){if(performance.now()-f<50||m)return m?void 0:void(m=setTimeout((()=>{m=null,g()}),50));f=performance.now();const e=l.keys(),t=document.querySelectorAll(h()),n=[];for(const e of t)if(!l.has(e)){n.push(e);const t=new MutationObserver((t=>{for(const n of t)if("attributes"===n.type&&"href"===n.attributeName){null==c||c([e]);break}}));l.set(e,t);const o=(0,s.getThumbnailLink)(e);o&&t.observe(o,{attributes:!0});const i=new MutationObserver((t=>{var n,o;for(const i of t)if("childList"===i.type&&(null===(n=i.addedNodes[0])||void 0===n?void 0:n.nodeName.toLowerCase().includes("shorts"))||(null===(o=i.previousSibling)||void 0===o?void 0:o.nodeName.toLowerCase().includes("shorts"))){null==c||c([e]);break}})),r=e.querySelector("#content");r&&i.observe(r,{childList:!0})}if(null==c||c(n),performance.now()-u>5e3){for(const t of e)if(document.body&&!document.body.contains(t)){const e=l.get(t);null==e||e.disconnect(),l.delete(t)}u=performance.now()}}t.newThumbnails=g,t.updateAll=function(){c&&c([...l.keys()])};const v=[100,200,300,400,500,750,1e3,1500,2500,5e3,1e4];let y=null;function b(e=0){if(e>=v.length)return;y&&clearTimeout(y);const t=v[e]-(e>0?v[e-1]:0);y=setTimeout((()=>{g(),b(e+1)}),t),g()}},9291:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.versionHigher=void 0,t.versionHigher=function(e,t){const n=e.split("."),o=t.split(".");if(n.length!==o.length)return!0;for(let e=0;e<n.length;e++){const t=parseInt(n[e]),i=parseInt(o[e]);if(t>i)return!0;if(t<i)return!1}return!1}},3683:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.isOnChannelPage=t.isCurrentTimeWrong=t.getIsInline=t.getLastNonInlineVideoID=t.getIsLivePremiere=t.setIsAdPlaying=t.getIsAdPlaying=t.getChannelIDInfo=t.getWaitingForChannelID=t.isOnYTTV=t.isOnYouTubeMusic=t.isOnMobileYouTube=t.isOnInvidious=t.setCurrentTime=t.verifyCurrentTime=t.getCurrentTime=t.getVideoDuration=t.getVideoID=t.getVideo=t.triggerVideoElementChange=t.waitForVideo=t.whitelistCheck=t.parseYouTubeVideoIDFromURL=t.getYouTubeVideoID=t.triggerVideoIDChange=t.checkVideoIDChange=t.checkIfNewVideoID=t.setupVideoModule=t.ChannelIDStatus=t.PageType=void 0;const i=n(1108),r=n(1740),s=n(4148),a=n(8343),l=n(2907),u=n(2184),c=n(9249),d=n(3184);var p,h;!function(e){e.Unknown="unknown",e.Shorts="shorts",e.Watch="watch",e.Search="search",e.Browse="browse",e.Channel="channel",e.Embed="embed"}(p=t.PageType||(t.PageType={})),function(e){e[e.Fetching=0]="Fetching",e[e.Found=1]="Found",e[e.Failed=2]="Failed"}(h=t.ChannelIDStatus||(t.ChannelIDStatus={}));const f="a.ytp-title-link[data-sessionlink='feature=player-title']:not(.cbCustomTitle)",m="ytd-channel-video-player-renderer a.ytp-title-link[data-sessionlink='feature=player-title']:not(.cbCustomTitle)";let g=null,v=null,y=null,b=null;const S=[];let w,T,k,C=!1,x=!1,E=null,M=null,I=!1,N=!1,P=!1,D=p.Unknown,L=!1,_=null,A=!1,O=0,B=!1,V={videoIDChange:()=>{},channelIDChange:()=>{},videoElementChange:()=>{},playerInit:()=>{},resetValues:()=>{},windowListenerHandler:()=>{},newVideosLoaded:()=>{},onNavigateToChannel:()=>{},documentScript:"",allowClipPage:!1};function R(e,t=!1){var n,r;return o(this,void 0,void 0,(function*(){return!(!e&&E&&(V.allowClipPage||!(null===(n=null===document||void 0===document?void 0:document.URL)||void 0===n?void 0:n.includes("youtube.com/clip/")))||(t&&e&&(setTimeout((()=>{Q()}),200),setTimeout((()=>{Q()}),1e3)),E!==e||!(0,s.isVisible)(g)&&g?((0,s.isVisible)(g)||Q(),V.resetValues(),E=null,D=p.Unknown,T={status:h.Fetching,id:null,author:null},w=!1,A=!1,O=0,B=!1,x=!1,window.postMessage({source:"sb-reset-media-session-link",videoID:null},"/"),E=e,A=t,!e||(yield(0,i.waitFor)((()=>k().isReady()),5e3,1),H(e),V.videoIDChange(e),0)):(ne()&&E&&(null===(r=V.onNavigateToChannel)||void 0===r||r.call(V)),1)))}))}function U(e){return e||(e=null===document||void 0===document?void 0:document.URL),D===p.Channel?F(!0,p.Channel):!V.allowClipPage&&e.includes("youtube.com/clip/")?null:e.includes("/embed/")&&e.includes("youtube.com")?F(!1,p.Embed):!e.includes("youtube.com")||e.match(/\/watch|\/shorts\/|playlist|\/live\//)?z(e):ne()?F(!0,p.Channel):z(e)||F(!1)}function F(e=!0,t=p.Watch){var n,o;const i=t===p.Embed?document.querySelector(f):t===p.Channel?document.querySelector(m):null===(o=null===(n=null==g?void 0:g.parentElement)||void 0===n?void 0:n.parentElement)||void 0===o?void 0:o.querySelector(f),r=null==i?void 0:i.getAttribute("href");return r?(M=e,D=t,z(r)):null}function z(e){const t=j(e);return t.callLater?((0,i.waitFor)((()=>k().isReady())).then((()=>R(z(e)))),null):(M=t.onInvidious,I=t.onMobileYouTube,N=t.onYTTV,P=t.onYouTubeMusic,t.videoID)}function j(e){var t;e.startsWith("https://www.youtube.com/tv#/")&&(e=e.replace("#","")),e.startsWith("https://www.youtube.com/tv?")&&(e=e.replace(/\?[^#]+#/,""));let n=!1,o=!1,i=!1,r=!1,s=null;try{s=new URL(e)}catch(t){return console.error("[SB] Unable to parse URL: "+e),{videoID:null,onInvidious:n,onMobileYouTube:o,onYTTV:i,onYouTubeMusic:r,callLater:!1}}if(l.YT_DOMAINS.includes(s.host))"m.youtube.com"===s.host&&(o=!0),"tv.youtube.com"===s.host&&(i=!0),"music.youtube.com"===s.host&&(r=!0),n=!1;else{if(!k().isReady()||!(null===(t=k().config.invidiousInstances)||void 0===t?void 0:t.includes(s.hostname)))return{videoID:null,onInvidious:n,onMobileYouTube:o,onYTTV:i,onYouTubeMusic:r,callLater:!k().isReady()};n=!0}if(s.searchParams.has("v")&&["/watch","/watch/"].includes(s.pathname)||s.pathname.startsWith("/tv/watch")){const e=s.searchParams.get("v");return{videoID:11==(null==e?void 0:e.length)?e:null,onInvidious:n,onMobileYouTube:o,onYTTV:i,onYouTubeMusic:r,callLater:!1}}if(s.pathname.match(/^\/embed\/|^\/shorts\/|^\/live\//)||"tv.youtube.com"===s.host&&s.pathname.startsWith("/watch/"))try{const e=s.pathname.split("/")[2];if((null==e?void 0:e.length)>=11)return{videoID:e.slice(0,11),onInvidious:n,onMobileYouTube:o,onYTTV:i,onYouTubeMusic:r,callLater:!1}}catch(t){return console.error("[SB] Video ID not valid for "+e),{videoID:null,onInvidious:n,onMobileYouTube:o,onYTTV:i,onYouTubeMusic:r,callLater:!1}}return{videoID:null,onInvidious:n,onMobileYouTube:o,onYTTV:i,onYouTubeMusic:r,callLater:!1}}function H(e){var t,n,r,s,a,l,u,c,p,f,m;return o(this,void 0,void 0,(function*(){try{L=!0;const t=[(0,i.waitFor)((()=>T.status===h.Found),6e3,20),(0,d.getChannelID)(e,!(0,d.isMainMetadataFetcher)())];if(yield Promise.race(t),T.status!==h.Found){const t=(0,d.getChannelIDSync)(e);t&&(T={status:h.Found,id:t.channelID,author:t.author})}}catch(e){const o=null===(t=document.querySelector("#social-links yt-button-shape a"))||void 0===t?void 0:t.getAttribute("href");let i=null;o&&o.includes("/channel/")&&(i=null===(n=o.match(/\/channel\/(UC[a-zA-Z0-9_-]{22})/))||void 0===n?void 0:n[1]),null!=i||(i=null===(f=null===(p=null===(c=null!==(u=null!==(s=null!==(r=document.querySelector("a.ytd-video-owner-renderer"))&&void 0!==r?r:document.querySelector("a.ytp-title-channel-logo"))&&void 0!==s?s:null===(l=null===(a=document.querySelector(".channel-profile #channel-name"))||void 0===a?void 0:a.parentElement)||void 0===l?void 0:l.parentElement)&&void 0!==u?u:document.querySelector("a.slim-owner-icon-and-title"))||void 0===c?void 0:c.getAttribute("href"))||void 0===p?void 0:p.match(/\/(?:(?:channel|c|user|)\/|@)(UC[a-zA-Z0-9_-]{22}|[a-zA-Z0-9_-]+)/))||void 0===f?void 0:f[1]);const d=null===(m=document.querySelector("ytd-channel-name a.yt-formatted-string"))||void 0===m?void 0:m.innerText;T=i?{status:h.Found,id:i,author:d}:{status:h.Failed,id:null,author:null}}L=!1,V.channelIDChange(T)}))}t.setupVideoModule=function(e,t){V=e,k=t,(0,u.setupCleanupListener)(),function(){const e=()=>{(0,s.isVisible)(g)||Q()};V.documentScript&&(0,c.injectScript)(V.documentScript),document.addEventListener("yt-navigate-finish",e);const t=()=>{var e;document.querySelector('meta[property="og:title"][content="Piped"]')&&(null===(e=V.playerInit)||void 0===e||e.call(V))};window.addEventListener("playerInit",t),window.addEventListener("message",J),(0,u.addCleanupListener)((()=>{document.removeEventListener("yt-navigate-finish",e),window.removeEventListener("playerInit",t),window.removeEventListener("message",J)})),(0,d.setupMetadataOnRecieve)()}(),(0,i.waitFor)((()=>k().isReady()),1e3,1).then((()=>R(U()))),l.YT_DOMAINS.includes(location.host)&&(document.URL.includes("/embed/")||"complete"===document.readyState&&ne())&&(0,s.waitForElement)(ne()?m:f).then((e=>(0,i.waitFor)((()=>e.getAttribute("href"))))).then((()=>R(U()))).catch((()=>{}));const n="navigation"in window;if(n){const e=e=>{R(U(e.destination.url))};window.navigation.addEventListener("navigate",e),(0,u.addCleanupListener)((()=>{window.navigation.removeEventListener("navigate",e)}))}(0,i.waitFor)((()=>null!==t().local)).then((()=>{t().local.navigationApiAvailable!==n&&(t().local.navigationApiAvailable=n,t().forceLocalUpdate("navigationApiAvailable"))})),Y(),(0,u.addCleanupListener)((()=>{y&&(y.disconnect(),y=null)}))},t.checkIfNewVideoID=function(){return o(this,void 0,void 0,(function*(){const e=U();return e!==E&&(yield R(e))}))},t.checkVideoIDChange=function(){return o(this,void 0,void 0,(function*(){const e=U();return yield R(e)}))},t.triggerVideoIDChange=function(e){return o(this,void 0,void 0,(function*(){return yield R(e)}))},t.getYouTubeVideoID=U,t.parseYouTubeVideoIDFromURL=j,t.whitelistCheck=H;let q=0,$=null;function Y(){if(!(M||null!==y&&(0,s.isVisible)(b.parentElement))){if($&&clearTimeout($),Date.now()-q<2e3)return void($=setTimeout(Y,Math.max(1e3,Date.now()-q)));q=Date.now();const e=(0,s.getElement)("#movie_player",!0);if(!e)return;const t=e.querySelector(".html5-video-container");if(!t)return;y&&y.disconnect(),y=new MutationObserver(Q),b=t,y.observe(t,{attributes:!0,childList:!0,subtree:!0})}}const W=[];t.waitForVideo=function(){return g?Promise.resolve(g):new Promise((e=>{W.push(e)}))};let K="",G=!1;function Q(){var e;return o(this,void 0,void 0,(function*(){if(C)return;(0,s.isVisible)(g)||X()||(g=null),C=!0;let t=(0,r.isSafari)()&&document.querySelector('video[vinegared="true"]')||(yield(0,s.waitForElement)("video",!0)),n=!1;if(document.querySelector(".miniplayer video")&&t){const e=[...document.querySelectorAll("video")].filter((e=>(0,s.isVisible)(e)));if(e.length>1){const o=t.duration,r=e.find((e=>!e.closest(".miniplayer")));r&&(t=r),isNaN(t.duration)&&(yield(0,i.waitFor)((()=>!!t.duration),5e3,50)),n=o!==t.duration}}if(C=!1,g===t&&v===t.style.width&&!n)return;g=t,v=t.style.width;const o=!S.includes(g);if(o&&S.push(g),null===(e=V.videoElementChange)||void 0===e||e.call(V,o,g),W.forEach((e=>e(t))),W.length=0,Y(),document.URL.includes("/embed/")){if(G)return;G=!0;const e=(0,s.waitForElement)(f).then((e=>(0,i.waitFor)((()=>e),void 0,void 0,(e=>e.getAttribute("href")!==K&&!!e.getAttribute("href")&&!!e.textContent))));e.catch((()=>G=!1)),e.then((e=>K=e.getAttribute("href"))).then((()=>G=!1)).then((()=>R(U())))}else R(U())}))}function X(){return(0,r.isSafari)()&&!!document.querySelector('video[vinegared="true"]')}function J(e){var t,n,o,i;const r=e.data,s=r.type;"sponsorblock"!==r.source||!V.allowClipPage&&(null===(t=null===document||void 0===document?void 0:document.URL)||void 0===t?void 0:t.includes("youtube.com/clip/"))||("navigation"===s&&(0,a.newThumbnails)(),"navigation"===s&&r.videoID?(D=r.pageType,r.channelID&&(T={id:r.channelID,author:r.channelTitle,status:h.Found},L||H(r.videoID)),R(r.videoID)):"ad"===s?x!=r.playing&&(x=r.playing,null===(n=V.updatePlayerBar)||void 0===n||n.call(V)):"data"===s&&r.videoID?(r.isInline||(_=r.videoID),R(r.videoID,r.isInline),w=r.isLive||r.isPremiere):"newElement"===s?(0,a.newThumbnails)():"videoIDsLoaded"===s?null===(o=V.newVideosLoaded)||void 0===o||o.call(V,r.videoIDs):"adDuration"===s?O=r.duration:"currentTimeWrong"===s&&(B=!0,alert(`${chrome.i18n.getMessage("submissionFailedServerSideAds")}\n\nInclude the following:\n${r.playerTime}\n${r.expectedTime}`)),null===(i=V.windowListenerHandler)||void 0===i||i.call(V,e))}t.triggerVideoElementChange=function(e){var t;g=e,v=e.style.width;const n=!S.includes(g);n&&S.push(g),null===(t=V.videoElementChange)||void 0===t||t.call(V,n,g)};let Z=0;function ee(){return Y(),(!(0,s.isVisible)(g)||I&&g&&isNaN(g.duration))&&Date.now()-Z>500&&(Z=Date.now(),(0,s.isVisible)(g)||X()||(g=null),Q()),g}function te(){var e;const t=null===(e=ee())||void 0===e?void 0:e.currentTime;return t?t-O:t}function ne(){return!!document.URL.match(/@|\/c\/|\/channel\/|\/user\//)}t.getVideo=ee,t.getVideoID=function(){return E},t.getVideoDuration=function(){var e;return Math.max(0,(null!==(e=null==g?void 0:g.duration)&&void 0!==e?e:0)-O)},t.getCurrentTime=te,t.verifyCurrentTime=function(e){ee()&&ee().paused&&window.postMessage({source:"sb-verify-time",time:null!=e?e:te(),rawTime:ee().currentTime},"/")},t.setCurrentTime=function(e){ee()&&(ee().currentTime=e+O)},t.isOnInvidious=function(){return M},t.isOnMobileYouTube=function(){return I},t.isOnYouTubeMusic=function(){return P},t.isOnYTTV=function(){return N},t.getWaitingForChannelID=function(){return L},t.getChannelIDInfo=function(){return T},t.getIsAdPlaying=function(){return x},t.setIsAdPlaying=function(e){x=e},t.getIsLivePremiere=function(){return w},t.getLastNonInlineVideoID=function(){return _},t.getIsInline=function(){return A},t.isCurrentTimeWrong=function(){return B},t.isOnChannelPage=ne},421:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=n(6540),r=n(8856),s=n(152),a=n(1727),l=n(1159),u=n(3225),c=n(2246),d=n(7913);class p extends i.Component{constructor(e){super(e),this.mainRef=i.createRef(),this.state={segment:null,show:!1,open:!1}}render(){var e,t,n,o,u;const c={backgroundColor:this.getColor(),display:this.state.show?"flex":"none",color:this.getTextColor()};return null===(o=null===(n=null===(t=null===(e=this.mainRef)||void 0===e?void 0:e.current)||void 0===t?void 0:t.parentElement)||void 0===n?void 0:n.classList)||void 0===o||o.toggle("cbPillOpen",this.state.show),i.createElement("span",{style:c,className:"sponsorBlockCategoryPill"+(this.props.showTextByDefault?"":" sbPillNoText"),"aria-label":this.getTitleText(),onClick:e=>this.toggleOpen(e),onMouseEnter:()=>this.openTooltip(),onMouseLeave:()=>this.closeTooltip(),ref:this.mainRef},i.createElement("span",{className:"sponsorBlockCategoryPillTitleSection"},i.createElement("img",{className:"sponsorSkipLogo sponsorSkipObject",src:chrome.runtime.getURL("icons/IconSponsorBlocker256px.png")}),(this.props.showTextByDefault||this.state.open)&&i.createElement("span",{className:"sponsorBlockCategoryPillTitle"},chrome.i18n.getMessage("category_"+(null===(u=this.state.segment)||void 0===u?void 0:u.category)))),this.state.open&&i.createElement(i.Fragment,null,i.createElement("div",{id:"sponsorTimesDownvoteButtonsContainerUpvoteCategoryPill",className:"voteButton",style:{marginLeft:"5px"},title:chrome.i18n.getMessage("upvoteButtonInfo"),onClick:e=>this.vote(e,1)},i.createElement(s.default,{fill:r.default.config.colorPalette.white})),i.createElement("div",{id:"sponsorTimesDownvoteButtonsContainerDownvoteCategoryPill",className:"voteButton",title:chrome.i18n.getMessage("reportButtonInfo"),onClick:e=>this.vote(e,0)},i.createElement(a.default,{fill:(0,l.downvoteButtonColor)(null,null,l.SkipNoticeAction.Downvote)}))),i.createElement("img",{src:chrome.runtime.getURL("icons/close.png"),className:"categoryPillClose",onClick:()=>{this.setState({show:!1}),this.closeTooltip()}}))}toggleOpen(e){e.stopPropagation(),this.state.show&&(this.props.showTooltipOnClick&&(this.state.open?this.closeTooltip():this.openTooltip()),this.setState({open:!this.state.open}))}vote(e,t){return o(this,void 0,void 0,(function*(){if(e.stopPropagation(),this.state.segment){const n=u.AnimationUtils.applyLoadingAnimation(e.currentTarget,.3),o=yield this.props.vote(t,this.state.segment.UUID);yield n(),1==o.successType||-1==o.successType&&429==o.statusCode?(this.setState({open:!1,show:1===t}),this.closeTooltip()):403!==o.statusCode&&alert((0,d.getErrorMessage)(o.statusCode,o.responseText))}}))}getColor(){var e;const t=null===(e=this.state.segment)||void 0===e?void 0:e.category;return null==t?null:`var(--sb-category-preview-${t}, var(--sb-category-${t}))`}getTextColor(){var e;const t=null===(e=this.state.segment)||void 0===e?void 0:e.category;return null==t?null:`var(--sb-category-text-preview-${t}, var(--sb-category-text-${t}))`}openTooltip(){this.tooltip&&this.tooltip.close();const e=document.querySelector("#above-the-fold, ytm-slim-owner-renderer");e&&(this.tooltip=new c.Tooltip({text:this.getTitleText(),referenceNode:e,bottomOffset:"0px",opacity:.95,displayTriangle:!1,showLogo:!1,showGotIt:!1,prependElement:e.firstElementChild}))}closeTooltip(){var e,t;null===(t=null===(e=this.tooltip)||void 0===e?void 0:e.close)||void 0===t||t.call(e),this.tooltip=null}getTitleText(){var e;const t=chrome.i18n.getMessage(`category_${null===(e=this.state.segment)||void 0===e?void 0:e.category}_pill`);return(t?t+". ":"")+chrome.i18n.getMessage("categoryPillTitleText")}}t.default=p},6387:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=n(6540),r=n(8856),s=n(9209),a=n(152),l=n(1727),u=n(1159),c=n(3225),d=n(2246),p=n(7913);class h extends i.Component{constructor(e){var t;super(e),this.state={segment:null,show:!1,size:null!==(t=e.size)&&void 0!==t?t:"22px"}}render(){return this.tooltip&&!this.state.show&&(this.tooltip.close(),this.tooltip=null),i.createElement(i.Fragment,null,i.createElement("button",{id:"sponsorTimesDownvoteButtonsContainerUpvoteChapter",className:"playerButton sbPlayerUpvote ytp-button "+(this.state.show?" ":"sbhidden ")+("tv.youtube.com"===document.location.host?"sbButtonYTTV":""),draggable:"false",title:chrome.i18n.getMessage("upvoteButtonInfo"),onClick:e=>this.vote(e,1)},i.createElement(a.default,{className:"playerButtonImage sbChapterVoteButton",fill:r.default.config.colorPalette.white,width:this.state.size,height:this.state.size})),i.createElement("button",{id:"sponsorTimesDownvoteButtonsContainerDownvoteChapter",className:"playerButton sbPlayerDownvote ytp-button "+(this.state.show?" ":"sbhidden ")+("tv.youtube.com"===document.location.host?"sbButtonYTTV":""),draggable:"false",title:chrome.i18n.getMessage("reportButtonInfo"),onClick:e=>{var t,n,o,i,r;const a=document.querySelector(".ytp-chapter-container");if(this.tooltip)this.tooltip.close(),this.tooltip=null;else if((null===(t=this.state.segment)||void 0===t?void 0:t.actionType)===s.ActionType.Chapter){const t=null===(n=null==a?void 0:a.parentElement)||void 0===n?void 0:n.parentElement;if(t){const n=t.getBoundingClientRect(),s=null===(i=null===(o=e.target)||void 0===o?void 0:o.parentElement)||void 0===i?void 0:i.getBoundingClientRect();this.tooltip=new d.Tooltip({referenceNode:null===(r=null==a?void 0:a.parentElement)||void 0===r?void 0:r.parentElement,prependElement:null==a?void 0:a.parentElement,showLogo:!1,showGotIt:!1,bottomOffset:`${n.height+25}px`,leftOffset:s.x-n.x+"px",extraClass:"centeredSBTriangle",buttons:[{name:chrome.i18n.getMessage("incorrectVote"),listener:t=>this.vote(t,0,e.target).then((()=>{var e;null===(e=this.tooltip)||void 0===e||e.close(),this.tooltip=null}))},{name:chrome.i18n.getMessage("harmfulVote"),listener:t=>this.vote(t,30,e.target).then((()=>{var e;null===(e=this.tooltip)||void 0===e||e.close(),this.tooltip=null}))}]})}}else this.vote(e,0,e.target)}},i.createElement(l.default,{className:"playerButtonImage sbChapterVoteButton",fill:(0,u.downvoteButtonColor)(this.state.segment?[this.state.segment]:null,u.SkipNoticeAction.Downvote,u.SkipNoticeAction.Downvote),width:this.state.size,height:this.state.size})))}vote(e,t,n){return o(this,void 0,void 0,(function*(){if(e.stopPropagation(),this.state.segment){const o=c.AnimationUtils.applyLoadingAnimation(null!=n?n:e.currentTarget,.3),i=yield this.props.vote(t,this.state.segment.UUID);yield o(),1==i.successType||-1==i.successType&&429==i.statusCode?this.setState({show:1===t}):403!==i.statusCode&&alert((0,p.getErrorMessage)(i.statusCode,i.responseText))}}))}}t.default=h},4342:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),i=n(8856),r=n(7152);var s;!function(e){e[e.Timer=0]="Timer",e[e.Paused=1]="Paused",e[e.Stopped=2]="Stopped"}(s||(s={}));const a=[10,100,10,10];class l extends o.Component{constructor(e){var t;super(e),this.handleMouseMoveBinded=this.handleMouseMove.bind(this),this.parentRef=o.createRef();const n=()=>this.props.maxCountdownTime?this.props.maxCountdownTime():i.default.config.skipNoticeDuration;this.countdownInterval=null,this.amountOfPreviousNotices=e.amountOfPreviousNotices||0,this.idSuffix=e.idSuffix||"",this.state={maxCountdownTime:n,countdownTime:n(),countdownMode:s.Timer,mouseHovering:!1,startFaded:null!==(t=this.props.startFaded)&&void 0!==t&&t,mouseDownInfo:null,mouseMoved:!1,right:a[0],bottom:e.showInSecondSlot?290:a[1]}}componentDidMount(){this.startCountdown()}render(){var e;const t=Object.assign({zIndex:this.props.zIndex||1e3+this.amountOfPreviousNotices,right:this.state.right,bottom:this.state.bottom,userSelect:this.state.mouseDownInfo&&this.state.mouseMoved?"none":"auto"},null!==(e=this.props.style)&&void 0!==e?e:{});return o.createElement("div",{id:"sponsorSkipNotice"+this.idSuffix,className:"sponsorSkipObject sponsorSkipNoticeParent"+(this.props.showInSecondSlot?" secondSkipNotice":"")+(this.props.extraClass?` ${this.props.extraClass}`:""),onMouseEnter:e=>this.onMouseEnter(e),onMouseLeave:()=>{this.timerMouseLeave()},onMouseDown:e=>{document.addEventListener("mousemove",this.handleMouseMoveBinded),this.setState({mouseDownInfo:{x:e.clientX,y:e.clientY,right:this.state.right,bottom:this.state.bottom},mouseMoved:!1})},onMouseUp:()=>{document.removeEventListener("mousemove",this.handleMouseMoveBinded),this.setState({mouseDownInfo:null})},ref:this.parentRef,style:t},o.createElement("div",{className:"sponsorSkipNoticeTableContainer"+(this.props.fadeIn?" sponsorSkipNoticeFadeIn":"")+(this.state.startFaded?" sponsorSkipNoticeFaded":"")},o.createElement("table",{className:"sponsorSkipObject sponsorSkipNotice"+(this.props.limitWidth?" sponsorSkipNoticeLimitWidth":"")},o.createElement("tbody",null,o.createElement("tr",{id:"sponsorSkipNoticeFirstRow"+this.idSuffix,className:"sponsorSkipNoticeFirstRow"},o.createElement("td",{className:"noticeLeftIcon"},!this.props.hideLogo&&o.createElement(r.default,{id:"sponsorSkipLogo"+this.idSuffix,fill:this.props.logoFill,className:"sponsorSkipLogo sponsorSkipObject"}),o.createElement("span",{id:"sponsorSkipMessage"+this.idSuffix,style:{float:"left",marginRight:this.props.hideLogo?"0px":null},className:"sponsorSkipMessage sponsorSkipObject"},this.props.noticeTitle),this.props.firstColumn),this.props.firstRow,!this.props.hideRightInfo&&o.createElement("td",{className:"sponsorSkipNoticeRightSection",style:{top:"9.32px"}},this.props.timed?o.createElement("span",{id:"sponsorSkipNoticeTimeLeft"+this.idSuffix,onClick:()=>this.toggleManualPause(),className:"sponsorSkipObject sponsorSkipNoticeTimeLeft"},this.getCountdownElements()):"",o.createElement("img",{src:chrome.runtime.getURL("icons/close.png"),className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"+(this.props.biggerCloseButton?" biggerCloseButton":""),onClick:()=>this.close()}))),this.props.children,!this.props.smaller&&this.props.bottomRow?this.props.bottomRow:null))),this.props.smaller&&this.props.bottomRow?o.createElement("table",{style:{visibility:"hidden",paddingTop:"14px"}},o.createElement("tbody",null,this.props.bottomRow)):null)}getCountdownElements(){return[o.createElement("span",{id:"skipNoticeTimerText"+this.idSuffix,key:"skipNoticeTimerText",className:this.state.countdownMode!==s.Timer?"sbhidden":""},chrome.i18n.getMessage("NoticeTimeAfterSkip").replace("{seconds}",Math.ceil(this.state.countdownTime).toString())),o.createElement("img",{id:"skipNoticeTimerPaused"+this.idSuffix,key:"skipNoticeTimerPaused",className:this.state.countdownMode!==s.Paused?"sbhidden":"",src:chrome.runtime.getURL("icons/pause.svg"),alt:chrome.i18n.getMessage("paused")}),o.createElement("img",{id:"skipNoticeTimerStopped"+this.idSuffix,key:"skipNoticeTimerStopped",className:this.state.countdownMode!==s.Stopped?"sbhidden":"",src:chrome.runtime.getURL("icons/stop.svg"),alt:chrome.i18n.getMessage("manualPaused")})]}onMouseEnter(e){this.props.onMouseEnter&&this.props.onMouseEnter(e),this.fadedMouseEnter(),this.timerMouseEnter()}fadedMouseEnter(){this.state.startFaded&&this.setState({startFaded:!1})}timerMouseEnter(){this.state.countdownMode!==s.Stopped&&(this.pauseCountdown(),this.setState({mouseHovering:!0}))}timerMouseLeave(){this.state.countdownMode!==s.Stopped&&(this.startCountdown(),this.setState({mouseHovering:!1}))}toggleManualPause(){this.setState({countdownMode:this.state.countdownMode===s.Stopped?s.Timer:s.Stopped},(()=>{this.state.countdownMode===s.Stopped||this.state.mouseHovering?this.pauseCountdown():this.startCountdown()}))}countdown(){if(!this.props.timed)return;const e=Math.min(this.state.countdownTime-1,this.state.maxCountdownTime());if(e<=0)return clearInterval(this.countdownInterval),void this.close();if(3==e&&this.props.fadeOut){const e=document.getElementById("sponsorSkipNotice"+this.idSuffix);null==e||e.style.removeProperty("animation"),null==e||e.classList.add("sponsorSkipNoticeFadeOut")}this.setState({countdownTime:e})}removeFadeAnimation(){const e=document.getElementById("sponsorSkipNotice"+this.idSuffix);e.classList.remove("sponsorSkipNoticeFadeOut"),e.style.animation="none"}pauseCountdown(){this.props.timed&&!this.props.dontPauseCountdown&&(this.countdownInterval&&clearInterval(this.countdownInterval),this.countdownInterval=null,this.setState({countdownTime:this.state.maxCountdownTime(),countdownMode:this.state.countdownMode===s.Timer?s.Paused:this.state.countdownMode}),this.removeFadeAnimation())}startCountdown(){this.props.timed&&null===this.countdownInterval&&(this.setState({countdownTime:this.state.maxCountdownTime(),countdownMode:s.Timer}),this.setupInterval())}setupInterval(){this.countdownInterval&&clearInterval(this.countdownInterval),this.countdownInterval=setInterval(this.countdown.bind(this),1e3)}resetCountdown(){this.props.timed&&(this.setupInterval(),this.setState({countdownTime:this.state.maxCountdownTime(),countdownMode:s.Timer}),this.removeFadeAnimation())}close(e){null!==this.countdownInterval&&clearInterval(this.countdownInterval),e||this.props.closeListener()}addNoticeInfoMessage(e,t=""){const n=document.getElementById("sponsorTimesInfoMessage"+this.idSuffix);null!=n&&document.getElementById("sponsorSkipNotice"+this.idSuffix).removeChild(n);const o=document.getElementById("sponsorTimesInfoMessage"+this.idSuffix+"2");null!=o&&document.getElementById("sponsorSkipNotice"+this.idSuffix).removeChild(o);const i=document.createElement("p");if(i.id="sponsorTimesInfoMessage"+this.idSuffix,i.className="sponsorTimesInfoMessage",i.innerText=e,document.querySelector("#sponsorSkipNotice"+this.idSuffix+" > tbody").insertBefore(i,document.getElementById("sponsorSkipNoticeSpacer"+this.idSuffix)),void 0!==t){const e=document.createElement("p");e.id="sponsorTimesInfoMessage"+this.idSuffix+"2",e.className="sponsorTimesInfoMessage",e.innerText=t,document.querySelector("#sponsorSkipNotice"+this.idSuffix+" > tbody").insertBefore(e,document.getElementById("sponsorSkipNoticeSpacer"+this.idSuffix))}}getElement(){return this.parentRef}componentWillUnmount(){document.removeEventListener("mousemove",this.handleMouseMoveBinded)}handleMouseMove(e){if(this.state.mouseDownInfo&&1===e.buttons){const[t,n]=[e.clientX,e.clientY],o=t-this.state.mouseDownInfo.x,i=n-this.state.mouseDownInfo.y;(o>0||i>0)&&this.setState({mouseMoved:!0});const r=this.parentRef.current,s=r.parentElement.parentElement;this.setState({right:Math.min(s.clientWidth-r.clientWidth-a[2],Math.max(a[0],this.state.mouseDownInfo.right-o)),bottom:Math.min(s.clientHeight-r.clientHeight-a[3],Math.max(a[1],this.state.mouseDownInfo.bottom-i))})}else document.removeEventListener("mousemove",this.handleMouseMoveBinded)}}t.default=l},4332:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);class i extends o.Component{constructor(e){super(e)}render(){const e={};return this.props.onClick&&(e.cursor="pointer",e.textDecoration="underline"),o.createElement("tr",{id:"sponsorTimesInfoMessage"+this.props.idSuffix,onClick:this.props.onClick,style:e,className:"sponsorTimesInfoMessage"},o.createElement("td",null,this.props.icon?o.createElement("img",{src:chrome.runtime.getURL(this.props.icon),className:"sponsorTimesInfoIcon"}):null,o.createElement("span",null,this.getTextElements(this.props.text))))}getTextElements(e){const t=[],n=e.split(/(?=\s+)/);for(const e of n)e.match(/^\s*http/)?t.push(o.createElement("a",{href:e,target:"_blank",rel:"noreferrer"},e)):t.push(e);return t}}t.default=i},1507:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);class i extends o.Component{constructor(e){super(e),this.state={}}render(){return o.createElement("div",{id:this.props.id,style:{display:this.props.options.length>0?"inherit":"none"},className:"sbSelector"},o.createElement("div",{onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave,className:"sbSelectorBackground"},this.getOptions()))}getOptions(){const e=[];for(const t of this.props.options)e.push(o.createElement("div",{className:"sbSelectorOption",onClick:e=>{e.stopPropagation(),this.props.onChange(t.label)},key:t.label},t.label));return e}}t.default=i},2841:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),i=n(8272),r=n(8856),s=n(9209),a=n(4342),l=n(4332),u=new(n(205).default),c=n(1575),d=n(152),p=n(1727),h=n(4804),f=n(1159),m=n(3497),g=n(1740),v=n(7913),y=n(3683);var b;!function(e){e[e.Undo=0]="Undo",e[e.Redo=1]="Redo",e[e.Start=2]="Start"}(b||(b={}));class S extends o.Component{constructor(e){var t,n;super(e),this.noticeRef=o.createRef(),this.categoryOptionRef=o.createRef(),this.segments=e.segments,this.autoSkip=e.autoSkip,this.contentContainer=e.contentContainer;const i=this.props.voteNotice?(0,c.getVoteText)(this.segments):this.props.upcomingNotice?(0,c.getUpcomingText)(this.segments):(0,c.getSkippingText)(this.segments,this.props.autoSkip),a=document.querySelectorAll(".sponsorSkipNoticeParent:not(.sponsorSkipUpcomingNotice)");this.amountOfPreviousNotices=a.length,this.showInSecondSlot=a.length>0&&[...a].some((e=>!e.classList.contains("secondSkipNotice"))),this.segments.length>1&&this.segments.sort(((e,t)=>e.segment[0]-t.segment[0]));for(const e of this.segments)this.idSuffix+=e.UUID;this.idSuffix+=this.amountOfPreviousNotices,this.selectedColor=r.default.config.colorPalette.red,this.unselectedColor=r.default.config.colorPalette.white,this.lockedColor=r.default.config.colorPalette.locked;const l=this.segments[0].actionType===s.ActionType.Mute,u=e.maxCountdownTime?()=>e.maxCountdownTime:l?this.getFullDurationCountdown(0):()=>r.default.config.skipNoticeDuration,d=this.props.startReskip?b.Redo:b.Undo,p=[d,l?b.Start:d],h=this.props.startReskip?this.reskip.bind(this):this.unskip.bind(this),m=[h,l?this.reskip.bind(this):h];this.state={noticeTitle:i,messages:[],messageOnClick:null,maxCountdownTime:u,countdownTime:u(),countdownText:null,skipButtonStates:p,skipButtonCallbacks:m,showSkipButton:[!0,!0],editing:!1,choosingCategory:!1,thanksForVotingText:null,actionState:f.SkipNoticeAction.None,showKeybindHint:null===(t=this.props.showKeybindHint)||void 0===t||t,smaller:null!==(n=this.props.smaller)&&void 0!==n&&n,voted:new Array(this.props.segments.length).fill(f.SkipNoticeAction.None),copied:new Array(this.props.segments.length).fill(f.SkipNoticeAction.None)},this.autoSkip||Object.assign(this.state,this.getUnskippedModeInfo(null,0,b.Start))}render(){const e={};this.contentContainer().onMobileYouTube&&(e.bottom="4em",e.transform="scale(0.8) translate(10%, 10%)");const t=this.getSkipButton(0);return o.createElement(a.default,{noticeTitle:this.state.noticeTitle,amountOfPreviousNotices:this.amountOfPreviousNotices,showInSecondSlot:this.showInSecondSlot,idSuffix:this.idSuffix,fadeIn:this.props.fadeIn,fadeOut:!this.props.upcomingNotice,startFaded:r.default.config.noticeVisibilityMode>=s.NoticeVisibilityMode.FadedForAll||r.default.config.noticeVisibilityMode>=s.NoticeVisibilityMode.FadedForAutoSkip&&this.autoSkip,timed:!0,maxCountdownTime:this.state.maxCountdownTime,style:e,biggerCloseButton:this.contentContainer().onMobileYouTube,ref:this.noticeRef,closeListener:()=>this.closeListener(),smaller:this.state.smaller,logoFill:r.default.config.barTypes[this.segments[0].category].color,limitWidth:!0,firstColumn:t,dontPauseCountdown:!!this.props.upcomingNotice,bottomRow:[...this.getMessageBoxes(),...this.getBottomRow()],extraClass:this.props.upcomingNotice?"sponsorSkipUpcomingNotice":"",onMouseEnter:()=>this.onMouseEnter()})}componentDidMount(){this.props.componentDidMount&&this.props.componentDidMount()}getBottomRow(){return[o.createElement("tr",{id:"sponsorSkipNoticeSecondRow"+this.idSuffix,key:0},this.state.thanksForVotingText?o.createElement("td",{id:"sponsorTimesVoteButtonInfoMessage"+this.idSuffix,className:"sponsorTimesInfoMessage sponsorTimesVoteButtonMessage",style:{marginRight:"10px"}},o.createElement("span",{style:{marginRight:"10px"}},this.state.thanksForVotingText),o.createElement("button",{id:"sponsorTimesContinueVotingContainer"+this.idSuffix,className:"sponsorSkipObject sponsorSkipNoticeButton",title:"Continue Voting",onClick:()=>this.setState({thanksForVotingText:null,messages:[]})},chrome.i18n.getMessage("ContinueVoting"))):o.createElement("td",{id:"sponsorTimesVoteButtonsContainer"+this.idSuffix,className:"sponsorTimesVoteButtonsContainer"},o.createElement("div",{id:"sponsorTimesDownvoteButtonsContainerUpvote"+this.idSuffix,className:"voteButton",style:{marginRight:"5px"},title:chrome.i18n.getMessage("upvoteButtonInfo"),onClick:()=>this.prepAction(f.SkipNoticeAction.Upvote)},o.createElement(d.default,{fill:this.state.actionState===f.SkipNoticeAction.Upvote?this.selectedColor:this.unselectedColor})),o.createElement("div",{id:"sponsorTimesDownvoteButtonsContainerDownvote"+this.idSuffix,className:"voteButton",style:{marginRight:"5px",marginLeft:"5px"},title:chrome.i18n.getMessage("reportButtonInfo"),onClick:()=>this.prepAction(f.SkipNoticeAction.Downvote)},o.createElement(p.default,{fill:(0,f.downvoteButtonColor)(this.segments,this.state.actionState,f.SkipNoticeAction.Downvote)})),!this.props.voteNotice&&o.createElement("div",{id:"sponsorTimesDownvoteButtonsContainerCopyDownvote"+this.idSuffix,className:"voteButton",style:{marginLeft:"5px"},onClick:()=>this.openEditingOptions()},o.createElement(h.default,{fill:!0===this.state.editing||this.state.actionState===f.SkipNoticeAction.CopyDownvote||!0===this.state.choosingCategory?this.selectedColor:this.unselectedColor}))),this.props.voteNotice||this.props.smaller&&this.segments[0].actionType!==s.ActionType.Mute?null:this.getSkipButton(1),!this.autoSkip||this.props.startReskip||this.props.voteNotice?"":o.createElement("td",{className:"sponsorSkipNoticeRightSection",key:1},o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton",onClick:this.contentContainer().dontShowNoticeAgain},chrome.i18n.getMessage("Hide")))),this.state.editing&&!this.state.thanksForVotingText&&!(this.state.choosingCategory||this.state.actionState===f.SkipNoticeAction.CopyDownvote)&&o.createElement("tr",{id:"sponsorSkipNoticeEditSegmentsRow"+this.idSuffix,key:2},o.createElement("td",{id:"sponsorTimesEditSegmentsContainer"+this.idSuffix},o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton",title:chrome.i18n.getMessage("CopyDownvoteButtonInfo"),style:{color:(0,f.downvoteButtonColor)(this.segments,this.state.actionState,f.SkipNoticeAction.Downvote)},onClick:()=>this.prepAction(f.SkipNoticeAction.CopyDownvote)},chrome.i18n.getMessage("CopyAndDownvote")),o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton",title:chrome.i18n.getMessage("ChangeCategoryTooltip"),style:{color:this.state.actionState===f.SkipNoticeAction.CategoryVote&&1==this.state.editing?this.selectedColor:this.unselectedColor},onClick:()=>this.resetStateToStart(f.SkipNoticeAction.CategoryVote,!0,!0)},chrome.i18n.getMessage("incorrectCategory")))),this.state.choosingCategory&&!this.state.thanksForVotingText&&o.createElement("tr",{id:"sponsorSkipNoticeCategoryChooserRow"+this.idSuffix,key:3},o.createElement("td",null,o.createElement("select",{id:"sponsorTimeCategories"+this.idSuffix,className:"sponsorTimeCategories sponsorTimeEditSelector",defaultValue:this.segments[0].category,onMouseDown:e=>e.stopPropagation(),ref:this.categoryOptionRef},this.getCategoryOptions()),1===this.segments.length&&o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton",onClick:()=>this.prepAction(f.SkipNoticeAction.CategoryVote)},chrome.i18n.getMessage("submit")))),this.state.actionState!==f.SkipNoticeAction.None&&this.segments.length>1&&!this.state.thanksForVotingText&&o.createElement("tr",{id:"sponsorSkipNoticeSubmissionOptionsRow"+this.idSuffix,key:4},o.createElement("td",{id:"sponsorTimesSubmissionOptionsContainer"+this.idSuffix},this.getSubmissionChooser()))]}getSkipButton(e){if(this.state.showSkipButton[e]&&(this.segments.length>1||this.segments[0].actionType!==s.ActionType.Poi||this.props.unskipTime)){const t=1===e&&this.segments[0].actionType===s.ActionType.Mute,n={marginLeft:"4px",color:[f.SkipNoticeAction.Unskip0,f.SkipNoticeAction.Unskip1].includes(this.state.actionState)?this.selectedColor:this.unselectedColor};this.contentContainer().onMobileYouTube&&(n.padding="20px",n.minWidth="100px");const i=(0!==e||this.props.smaller||!this.props.voteNotice||this.segments[0].actionType===s.ActionType.Mute)&&!this.props.upcomingNotice;return o.createElement("span",{className:"sponsorSkipNoticeUnskipSection",style:{visibility:i?null:"hidden"}},o.createElement("button",{id:"sponsorSkipUnskipButton"+this.idSuffix,className:"sponsorSkipObject sponsorSkipNoticeButton",style:n,onClick:()=>this.prepAction(1===e?f.SkipNoticeAction.Unskip1:f.SkipNoticeAction.Unskip0)},this.getSkipButtonText(e,t?s.ActionType.Skip:null)+(!t&&this.state.showKeybindHint?" ("+(0,g.keybindToString)(r.default.config.skipKeybind)+")":"")))}return null}getSubmissionChooser(){const e=[];for(let t=0;t<this.segments.length;t++)e.push(o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton",style:{opacity:this.getSubmissionChooserOpacity(t),color:this.getSubmissionChooserColor(t)},onClick:()=>this.performAction(t),autoFocus:0==t,key:"submission"+t+this.segments[t].category+this.idSuffix},`${t+1}. ${chrome.i18n.getMessage("category_"+this.segments[t].category)} (${(0,v.getFormattedTime)(this.segments[t].segment[0])})`));return e}getSubmissionChooserOpacity(e){const t=this.state.actionState===f.SkipNoticeAction.Upvote,n=this.state.actionState==f.SkipNoticeAction.Downvote,o=this.state.actionState==f.SkipNoticeAction.CopyDownvote;return t&&this.state.voted[e]==f.SkipNoticeAction.Upvote||n&&this.state.voted[e]==f.SkipNoticeAction.Downvote||o&&this.state.copied[e]==f.SkipNoticeAction.CopyDownvote?.35:1}getSubmissionChooserColor(e){const t=this.state.actionState==f.SkipNoticeAction.Downvote,n=this.state.actionState==f.SkipNoticeAction.CopyDownvote;return r.default.config.isVip&&(t||n)&&1===this.segments[e].locked?this.lockedColor:this.unselectedColor}onMouseEnter(){this.state.smaller&&!this.props.upcomingNotice&&this.setState({smaller:!1})}getMessageBoxes(){if(0===this.state.messages.length)return[o.createElement("tr",{id:"sponsorSkipNoticeSpacer"+this.idSuffix,className:"sponsorBlockSpacer",key:"messageBoxSpacer"})];const e=[];for(let t=0;t<this.state.messages.length;t++)e.push(o.createElement("tr",{key:t+"_messageBox"},o.createElement("td",{key:t+"_messageBox"},o.createElement(l.default,{idSuffix:this.idSuffix,text:this.state.messages[t],onClick:this.state.messageOnClick,key:t+"_messageBox"}))));return e}prepAction(e){if(1===this.segments.length)this.performAction(0,e);else switch(this.state.smaller&&(this.setState({smaller:!1}),this.noticeRef.current.fadedMouseEnter(),this.noticeRef.current.resetCountdown()),null!=e?e:this.state.actionState){case f.SkipNoticeAction.None:this.resetStateToStart();break;case f.SkipNoticeAction.Upvote:this.resetStateToStart(f.SkipNoticeAction.Upvote);break;case f.SkipNoticeAction.Downvote:this.resetStateToStart(f.SkipNoticeAction.Downvote);break;case f.SkipNoticeAction.CategoryVote:this.resetStateToStart(f.SkipNoticeAction.CategoryVote,!0,!0);break;case f.SkipNoticeAction.CopyDownvote:this.resetStateToStart(f.SkipNoticeAction.CopyDownvote,!0);break;case f.SkipNoticeAction.Unskip0:this.resetStateToStart(f.SkipNoticeAction.Unskip0);break;case f.SkipNoticeAction.Unskip1:this.resetStateToStart(f.SkipNoticeAction.Unskip1)}}performAction(e,t){switch(null!=t?t:this.state.actionState){case f.SkipNoticeAction.None:this.noAction(e);break;case f.SkipNoticeAction.Upvote:this.upvote(e);break;case f.SkipNoticeAction.Downvote:this.downvote(e);break;case f.SkipNoticeAction.CategoryVote:this.categoryVote(e);break;case f.SkipNoticeAction.CopyDownvote:this.copyDownvote(e);break;case f.SkipNoticeAction.Unskip0:this.unskipAction(0,e,!1);break;case f.SkipNoticeAction.Unskip1:this.unskipAction(1,e,!0);break;default:this.resetStateToStart()}}noAction(e){const t=this.state.voted;t[e]=f.SkipNoticeAction.None,this.setState({voted:t})}upvote(e){1===this.segments.length&&this.resetStateToStart(),this.contentContainer().vote(1,this.segments[e].UUID,void 0,this)}downvote(e){1===this.segments.length&&this.resetStateToStart(),this.contentContainer().vote(0,this.segments[e].UUID,void 0,this)}categoryVote(e){this.contentContainer().vote(void 0,this.segments[e].UUID,this.categoryOptionRef.current.value,this)}copyDownvote(e){const t=this.props.contentContainer().sponsorVideoID,n={segment:this.segments[e].segment,UUID:(0,m.generateUserID)(),category:this.segments[e].category,actionType:this.segments[e].actionType,source:s.SponsorSourceType.Local},o=r.default.local.unsubmittedSegments[t]||[];o.push(n),r.default.local.unsubmittedSegments[t]=o,r.default.forceLocalUpdate("unsubmittedSegments"),this.props.contentContainer().sponsorTimesSubmitting.push(n),this.props.contentContainer().updatePreviewBar(),this.props.contentContainer().resetSponsorSubmissionNotice(),this.props.contentContainer().updateEditButtonsOnPlayer(),this.contentContainer().vote(0,this.segments[e].UUID,void 0,this);const i=this.state.copied;i[e]=f.SkipNoticeAction.CopyDownvote,this.setState({copied:i})}unskipAction(e,t,n){this.state.skipButtonCallbacks[e](e,t,n)}openEditingOptions(){this.resetStateToStart(void 0,!0)}getCategoryOptions(){const e=[],t=i.categoryList.filter((e=>i.categorySupport[e].includes(s.ActionType.Skip)));for(const n of t)e.push(o.createElement("option",{value:n,key:n,className:this.getCategoryNameClass(n)},chrome.i18n.getMessage("category_"+n)));return e}getCategoryNameClass(e){return this.props.contentContainer().lockedCategories.includes(e)?"sponsorBlockLockedColor":""}unskip(e,t,n){this.contentContainer().unskipSponsorTime(this.segments[t],this.props.unskipTime,n,this.props.voteNotice),this.unskippedMode(e,t,this.segments[0].actionType===s.ActionType.Poi?b.Undo:b.Redo)}reskip(e,t,n){this.contentContainer().reskipSponsorTime(this.segments[t],n),this.reskippedMode(e)}reskippedMode(e){const t=this.state.skipButtonStates;t[e]=b.Undo;const n=this.state.skipButtonCallbacks;n[e]=this.unskip.bind(this);const o={skipButtonStates:t,skipButtonCallbacks:n,maxCountdownTime:()=>r.default.config.skipNoticeDuration,countdownTime:r.default.config.skipNoticeDuration};this.setState(o,(()=>{this.noticeRef.current.resetCountdown()}))}unskippedMode(e,t,n){this.setState(this.getUnskippedModeInfo(e,t,n),(()=>{this.noticeRef.current.resetCountdown()}))}getUnskippedModeInfo(e,t,n){const o=this.props.voteNotice||this.segments[t].actionType===s.ActionType.Poi?this.state.maxCountdownTime:this.getFullDurationCountdown(t),i=this.state.skipButtonStates,r=this.state.skipButtonCallbacks;if(null===e)for(let e=0;e<i.length;e++)i[e]=n,r[e]=this.reskip.bind(this);else i[e]=n,r[e]=this.reskip.bind(this),1===e&&(i[0]=b.Redo,r[0]=this.reskip.bind(this));return{skipButtonStates:i,skipButtonCallbacks:r,maxCountdownTime:o,countdownTime:o(),showSkipButton:1===e?[!0,!0]:this.state.showSkipButton}}getFullDurationCountdown(e){return()=>{var t,n,o;const i=this.segments[e],s=Math.round((i.segment[1]-(null!==(t=(0,y.getCurrentTime)())&&void 0!==t?t:0))*(1/(null!==(o=null===(n=(0,y.getVideo)())||void 0===n?void 0:n.playbackRate)&&void 0!==o?o:1)));return Math.max(s,r.default.config.skipNoticeDuration)}}afterVote(e,t,n){const o=u.getSponsorIndexFromUUID(this.segments,e.UUID),r=i.wikiLinks[e.category],s=this.state.voted;switch(t){case 0:this.clearConfigListener(),this.setNoticeInfoMessageWithOnClick((()=>window.open(r)),chrome.i18n.getMessage("OpenCategoryWikiPage")),s[o]=f.SkipNoticeAction.Downvote;break;case 1:s[o]=f.SkipNoticeAction.Upvote;break;case 20:s[o]=f.SkipNoticeAction.None}this.setState({voted:s}),this.addVoteButtonInfo(chrome.i18n.getMessage("voted")),e&&n&&(this.segments[o].category=n)}setNoticeInfoMessageWithOnClick(e,...t){this.setState({messages:t,messageOnClick:t=>e(t)})}setNoticeInfoMessage(...e){this.setState({messages:e})}addVoteButtonInfo(e){this.setState({thanksForVotingText:e})}resetVoteButtonInfo(){this.setState({thanksForVotingText:null})}closeListener(){this.clearConfigListener(),this.props.closeListener()}clearConfigListener(){this.configListener&&(r.default.configSyncListeners.splice(r.default.configSyncListeners.indexOf(this.configListener),1),this.configListener=null)}unmutedListener(e){1===this.props.segments.length&&this.props.segments[0].actionType===s.ActionType.Mute&&e>=this.props.segments[0].segment[1]&&this.setState({showSkipButton:[!1,!0]})}resetStateToStart(e=f.SkipNoticeAction.None,t=!1,n=!1){this.setState({actionState:e,editing:t,choosingCategory:n,thanksForVotingText:null,messages:[]})}getSkipButtonText(e,t){switch(this.state.skipButtonStates[e]){case b.Undo:return this.getUndoText(t);case b.Redo:return this.getRedoText(t);case b.Start:return this.getStartText(t)}}getUndoText(e){switch(e||this.segments[0].actionType){case s.ActionType.Mute:return chrome.i18n.getMessage("unmute");case s.ActionType.Skip:default:return chrome.i18n.getMessage("unskip")}}getRedoText(e){switch(e||this.segments[0].actionType){case s.ActionType.Mute:return chrome.i18n.getMessage("mute");case s.ActionType.Skip:default:return chrome.i18n.getMessage("reskip")}}getStartText(e){switch(e||this.segments[0].actionType){case s.ActionType.Mute:return chrome.i18n.getMessage("mute");case s.ActionType.Skip:default:return chrome.i18n.getMessage("skip")}}}t.default=S},6821:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=n(6540),r=n(8272),s=n(8856),a=n(9209),l=n(2275),u=n(1507),c=n(1575),d=n(7913),p=n(6062),h=n(2271),f=n(3683),m=n(3225),g=n(2246),v=[].concat(...r.categoryList.filter((e=>!["chapter","intro"].includes(e))).map((e=>chrome.i18n.getMessage("category_"+e).split(/\/|\s|-/))));class y extends i.Component{constructor(e){var t;super(e),this.timesBeforeChanging=[],this.fullVideoWarningShown=!1,this.categoryNameWarningShown=!1,this.lastEditTime=0,this.editTimeTimeout=null,this.categoryOptionRef=i.createRef(),this.actionTypeOptionRef=i.createRef(),this.descriptionOptionRef=i.createRef(),this.idSuffix=this.props.idSuffix,this.previousSkipType=a.ActionType.Skip;const n=this.props.contentContainer().sponsorTimesSubmitting[this.props.index];this.state={editing:!1,sponsorTimeEdits:[null,null],selectedCategory:null!==(t=n.category)&&void 0!==t?t:c.DEFAULT_CATEGORY,selectedActionType:n.actionType,description:n.description||"",suggestedNames:[],chapterNameSelectorOpen:!1,chapterNameSelectorHovering:!1}}componentDidMount(){document.getElementById("sponsorTimeEditContainer"+this.idSuffix).addEventListener("keydown",(e=>{e.stopPropagation()})),document.getElementById("sponsorTimesContainer"+this.idSuffix).addEventListener("wheel",(e=>{this.state.editing&&e.preventDefault()}),{passive:!1}),this.configUpdateListener||(this.configUpdateListener=()=>this.configUpdate(),s.default.configSyncListeners.push(this.configUpdate.bind(this))),this.checkToShowFullVideoWarning()}componentWillUnmount(){this.configUpdateListener&&s.default.configSyncListeners.splice(s.default.configSyncListeners.indexOf(this.configUpdate.bind(this)),1)}render(){var e,t,n,o;this.checkToShowFullVideoWarning(),this.checkToShowChapterWarning();const s={textAlign:"center"};let l;0!=this.props.index&&(s.marginTop="15px");const c={},p=this.props.contentContainer().sponsorTimesSubmitting[this.props.index],h=p.segment;return this.state.selectedActionType===a.ActionType.Full&&(c.display="none"),l=this.state.editing?i.createElement("div",{id:"sponsorTimesContainer"+this.idSuffix,style:c,className:"sponsorTimeDisplay"},this.state.selectedActionType!==a.ActionType.Poi?i.createElement("span",{id:"startButton"+this.idSuffix,className:"sponsorNowButton",onClick:()=>this.setTimeTo(0,0)},chrome.i18n.getMessage("bracketStart")):"",i.createElement("span",{id:"nowButton0"+this.idSuffix,className:"sponsorNowButton",onClick:()=>this.setTimeToNow(0)},chrome.i18n.getMessage("bracketNow")),i.createElement("input",{id:"submittingTime0"+this.idSuffix,className:"sponsorTimeEdit sponsorTimeEditInput",type:"text",style:{color:"inherit",backgroundColor:"inherit"},value:null!==(e=this.state.sponsorTimeEdits[0])&&void 0!==e?e:"",onKeyDown:e=>e.stopPropagation(),onKeyUp:e=>e.stopPropagation(),onChange:e=>this.handleOnChange(0,e,p,e.target.value),onWheel:e=>this.changeTimesWhenScrolling(0,e,p)}),this.state.selectedActionType!==a.ActionType.Poi?i.createElement("span",null,i.createElement("span",null," "+chrome.i18n.getMessage("to")+" "),i.createElement("input",{id:"submittingTime1"+this.idSuffix,className:"sponsorTimeEdit sponsorTimeEditInput",type:"text",style:{color:"inherit",backgroundColor:"inherit"},value:null!==(t=this.state.sponsorTimeEdits[1])&&void 0!==t?t:"",onKeyDown:e=>e.stopPropagation(),onKeyUp:e=>e.stopPropagation(),onChange:e=>this.handleOnChange(1,e,p,e.target.value),onWheel:e=>this.changeTimesWhenScrolling(1,e,p)}),i.createElement("span",{id:"nowButton1"+this.idSuffix,className:"sponsorNowButton",onClick:()=>this.setTimeToNow(1)},chrome.i18n.getMessage("bracketNow")),i.createElement("span",{id:"endButton"+this.idSuffix,className:"sponsorNowButton",onClick:()=>this.setTimeToEnd()},chrome.i18n.getMessage("bracketEnd"))):""):i.createElement("div",{id:"sponsorTimesContainer"+this.idSuffix,style:c,className:"sponsorTimeDisplay",onClick:this.toggleEditTime.bind(this)},(0,d.getFormattedTime)(h[0],!0)+(isNaN(h[1])||this.state.selectedActionType===a.ActionType.Poi?"":" "+chrome.i18n.getMessage("to")+" "+(0,d.getFormattedTime)(h[1],!0))),i.createElement("div",{id:"sponsorTimeEditContainer"+this.idSuffix,style:s},l,i.createElement("div",{style:{position:"relative"}},i.createElement("select",{id:"sponsorTimeCategories"+this.idSuffix,className:"sponsorTimeEditSelector sponsorTimeCategories",ref:this.categoryOptionRef,style:{color:"inherit",backgroundColor:"inherit"},value:this.state.selectedCategory,onChange:e=>this.categorySelectionChange(e)},this.getCategoryOptions()),i.createElement("a",{href:r.wikiLinks[p.category]||"https://wiki.sponsor.ajay.app/index.php/Segment_Categories",target:"_blank",rel:"noreferrer"},i.createElement("img",{id:"sponsorTimeCategoriesHelpButton"+this.idSuffix,className:"helpButton",src:chrome.runtime.getURL("icons/help.svg"),title:chrome.i18n.getMessage("categoryGuidelines")}))),r.categorySupport[p.category]&&((null===(n=r.categorySupport[p.category])||void 0===n?void 0:n.length)>1||(null===(o=r.categorySupport[p.category])||void 0===o?void 0:o[0])===a.ActionType.Full)?i.createElement("div",{style:{position:"relative"}},i.createElement("select",{id:"sponsorTimeActionTypes"+this.idSuffix,className:"sponsorTimeEditSelector sponsorTimeActionTypes",value:this.state.selectedActionType,style:{color:"inherit",backgroundColor:"inherit"},ref:this.actionTypeOptionRef,onChange:e=>this.actionTypeSelectionChange(e)},this.getActionTypeOptions(p)),i.createElement("img",{className:"voteButton hideSegmentSubmitButton",title:chrome.i18n.getMessage("hideSegment"),src:p.hidden===a.SponsorHideType.Hidden?chrome.runtime.getURL("icons/not_visible.svg"):chrome.runtime.getURL("icons/visible.svg"),onClick:e=>{m.AnimationUtils.applyLoadingAnimation(e.currentTarget,.4)(),p.hidden===a.SponsorHideType.Hidden?p.hidden=a.SponsorHideType.Visible:p.hidden=a.SponsorHideType.Hidden,this.saveEditTimes()}})):"",this.state.selectedActionType===a.ActionType.Chapter?i.createElement("div",{onBlur:()=>this.setState({chapterNameSelectorOpen:!1})},i.createElement("input",{id:"chapterName"+this.idSuffix,className:"sponsorTimeEdit sponsorTimeEditInput sponsorChapterNameInput",style:{color:"inherit",backgroundColor:"inherit"},ref:this.descriptionOptionRef,type:"text",value:this.state.description,onKeyDown:e=>e.stopPropagation(),onKeyUp:e=>e.stopPropagation(),onContextMenu:e=>e.stopPropagation(),onChange:e=>this.descriptionUpdate(e.target.value),onFocus:()=>this.setState({chapterNameSelectorOpen:!0})}),this.state.description&&(this.state.chapterNameSelectorOpen||this.state.chapterNameSelectorHovering)&&i.createElement(u.default,{id:"chapterNameSelector"+this.idSuffix,options:this.state.suggestedNames,onMouseEnter:()=>this.setState({chapterNameSelectorHovering:!0}),onMouseLeave:()=>this.setState({chapterNameSelectorHovering:!1}),onChange:e=>this.descriptionUpdate(e)})):"",i.createElement("div",{style:{marginTop:"3px"}},i.createElement("span",{id:"sponsorTimeDeleteButton"+this.idSuffix,className:"sponsorTimeEditButton",onClick:this.deleteTime.bind(this)},chrome.i18n.getMessage("delete")),isNaN(h[1])||[a.ActionType.Poi,a.ActionType.Full].includes(this.state.selectedActionType)||this.state.selectedActionType===a.ActionType.Chapter?"":i.createElement("span",{id:"sponsorTimePreviewButton"+this.idSuffix,className:"sponsorTimeEditButton",onClick:e=>this.previewTime(e.ctrlKey,e.shiftKey)},chrome.i18n.getMessage("preview")),isNaN(h[1])||this.state.selectedActionType==a.ActionType.Full?"":i.createElement("span",{id:"sponsorTimeInspectButton"+this.idSuffix,className:"sponsorTimeEditButton",onClick:this.inspectTime.bind(this)},chrome.i18n.getMessage("inspect")),isNaN(h[1])||[a.ActionType.Poi,a.ActionType.Full].includes(this.state.selectedActionType)?"":i.createElement("span",{id:"sponsorTimePreviewEndButton"+this.idSuffix,className:"sponsorTimeEditButton",onClick:e=>this.previewTime(e.ctrlKey,e.shiftKey,!0)},chrome.i18n.getMessage("End")),isNaN(h[1])||this.state.selectedActionType==a.ActionType.Full?"":i.createElement("span",{id:"sponsorTimeEditButton"+this.idSuffix,className:"sponsorTimeEditButton",onClick:this.toggleEditTime.bind(this)},this.state.editing?chrome.i18n.getMessage("save"):chrome.i18n.getMessage("edit"))))}handleOnChange(e,t,n,o){const i=this.state.sponsorTimeEdits,r=(0,d.getFormattedTimeToSeconds)(i[e]),s=(0,d.getFormattedTimeToSeconds)(o),l=Math.abs(r-s);0<l&&l<.5&&this.showScrollToEditToolTip(),i[e]=o,0===e&&n.actionType===a.ActionType.Poi&&(i[1]=o),this.setState({sponsorTimeEdits:i},(()=>this.saveEditTimes()))}changeTimesWhenScrolling(e,t,n){if(!s.default.config.allowScrollingToEdit)return;let o=0;o=t.shiftKey?t.ctrlKey?1:.001:t.ctrlKey?.1:.01;const i=this.state.sponsorTimeEdits;let r=(0,d.getFormattedTimeToSeconds)(this.state.sponsorTimeEdits[e]);null!==r&&0!=t.deltaY&&(t.deltaY<0?r+=o:r>=o?r-=o:r=0,i[e]=(0,d.getFormattedTime)(r,!0),n.actionType===a.ActionType.Poi&&(i[1]=i[0]),this.setState({sponsorTimeEdits:i}),this.saveEditTimes())}showScrollToEditToolTip(){s.default.config.scrollToEditTimeUpdate||null!==document.getElementById("sponsorRectangleTooltipsponsorTimesContainer"+this.idSuffix)||this.showToolTip(chrome.i18n.getMessage("SponsorTimeEditScrollNewFeature"),"scrollToEdit",(()=>{s.default.config.scrollToEditTimeUpdate=!0}))}showToolTip(e,t,n){const o=document.getElementById("sponsorTimesContainer"+this.idSuffix);if(o){const i=`sponsorRectangleTooltip${t+this.idSuffix}`;return document.getElementById(i)||new l.RectangleTooltip({text:e,referenceNode:o.parentElement,prependElement:o,timeout:15,bottomOffset:"0px",leftOffset:"-318px",backgroundColor:"rgba(28, 28, 28, 1.0)",htmlId:i,buttonFunction:n,fontSize:"14px",maxHeight:"200px"}),!0}return!1}checkToShowFullVideoWarning(){const e=this.props.contentContainer().sponsorTimesSubmitting[this.props.index];(e.segment[1]-e.segment[0])/(0,f.getVideoDuration)()>.6&&!this.fullVideoWarningShown&&("sponsor"===e.category||"selfpromo"===e.category||"chooseACategory"===e.category)&&this.showToolTip(chrome.i18n.getMessage("fullVideoTooltipWarning"),"fullVideoWarning")&&(this.fullVideoWarningShown=!0)}checkToShowChapterWarning(){const e=this.props.contentContainer().sponsorTimesSubmitting[this.props.index];e.actionType===a.ActionType.Chapter&&e.description&&!this.categoryNameWarningShown&&v.some((t=>e.description.toLowerCase().includes(t.toLowerCase())))&&this.showToolTip(chrome.i18n.getMessage("chapterNameTooltipWarning"),"chapterWarning")&&(this.categoryNameWarningShown=!0)}getCategoryOptions(){var e;const t=[i.createElement("option",{value:c.DEFAULT_CATEGORY,key:c.DEFAULT_CATEGORY},chrome.i18n.getMessage(c.DEFAULT_CATEGORY))];for(const n of null!==(e=this.props.categoryList)&&void 0!==e?e:r.categoryList){const e=["chapter"],o=s.default.config.showCategoryWithoutPermission||s.default.config.permissions[n];(!e.includes(n)&&(void 0===o||s.default.config.showCategoryWithoutPermission)||o)&&t.push(i.createElement("option",{value:n,key:n,className:this.getCategoryLockedClass(n)},chrome.i18n.getMessage("category_"+n)))}return t}getCategoryLockedClass(e){return this.props.contentContainer().lockedCategories.includes(e)?"sponsorBlockLockedColor":""}categorySelectionChange(e){const t=e.target.value;if(this.setState({selectedCategory:t}),t!==c.DEFAULT_CATEGORY&&!s.default.config.categorySelections.some((e=>e.name===t)))return e.target.value=c.DEFAULT_CATEGORY,void(confirm(chrome.i18n.getMessage("enableThisCategoryFirst").replace("{0}",chrome.i18n.getMessage("category_"+t)))&&chrome.runtime.sendMessage({message:"openConfig",hash:"behavior"}));if(!s.default.config.hookUpdate&&"preview"===t){s.default.config.hookUpdate=!0;const t=e.target.closest(".sponsorSkipNotice tbody");t&&new g.Tooltip({text:chrome.i18n.getMessage("hookNewFeature"),referenceNode:t.parentElement,prependElement:t,bottomOffset:"30px",opacity:.9,timeout:100})}const n=this.props.contentContainer().sponsorTimesSubmitting[this.props.index];this.handleReplacingLostTimes(t,n.actionType,n),this.saveEditTimes(),this.props.categoryChangeListener&&this.props.categoryChangeListener(this.props.index,t)}actionTypeSelectionChange(e){const t=this.props.contentContainer().sponsorTimesSubmitting[this.props.index];this.setState({selectedActionType:e.target.value}),this.handleReplacingLostTimes(t.category,e.target.value,t),this.saveEditTimes()}handleReplacingLostTimes(e,t,n){var o,i,s,l,u;(null===(o=r.categorySupport[e])||void 0===o?void 0:o.includes(a.ActionType.Poi))?(this.previousSkipType!==a.ActionType.Poi&&(this.timesBeforeChanging=[null,n.segment[1]]),this.setTimeTo(1,null),this.props.contentContainer().updateEditButtonsOnPlayer(),this.props.contentContainer().sponsorTimesSubmitting.some(((t,n)=>t.category===e&&n!==this.props.index))&&alert(chrome.i18n.getMessage("poiOnlyOneSegment")),this.previousSkipType=a.ActionType.Poi):1===(null===(i=r.categorySupport[e])||void 0===i?void 0:i.length)&&(null===(s=r.categorySupport[e])||void 0===s?void 0:s[0])===a.ActionType.Full?(this.previousSkipType!==a.ActionType.Full&&(this.timesBeforeChanging=[...n.segment]),this.previousSkipType=a.ActionType.Full):"chooseACategory"!==e&&(!(null===(l=r.categorySupport[e])||void 0===l?void 0:l.includes(a.ActionType.Skip))&&!(null===(u=r.categorySupport[e])||void 0===u?void 0:u.includes(a.ActionType.Chapter))||[a.ActionType.Poi,a.ActionType.Full].includes(this.getNextActionType(e,t)))||this.previousSkipType===a.ActionType.Skip||(this.timesBeforeChanging[0]&&this.setTimeTo(0,this.timesBeforeChanging[0]),this.timesBeforeChanging[1]&&this.setTimeTo(1,this.timesBeforeChanging[1]),this.previousSkipType=a.ActionType.Skip)}getActionTypeOptions(e){const t=[];for(const n of r.categorySupport[e.category])t.push(i.createElement("option",{value:n,key:n},chrome.i18n.getMessage(n)));return t}setTimeToNow(e){this.setTimeTo(e,this.props.contentContainer().getRealCurrentTime())}setTimeToEnd(){this.setTimeTo(1,(0,f.getVideoDuration)())}setTimeTo(e,t){const n=this.props.contentContainer().sponsorTimesSubmitting[this.props.index];null===t&&(t=n.segment[0]);const o=1===n.segment.length;n.segment[e]=t,n.actionType===a.ActionType.Poi&&(n.segment[1]=t),o&&this.props.contentContainer().updateEditButtonsOnPlayer(),this.setState({sponsorTimeEdits:this.getFormattedSponsorTimesEdits(n)},(()=>this.saveEditTimes()))}toggleEditTime(){if(this.state.editing)this.setState({editing:!1}),this.saveEditTimes();else{const e=this.props.contentContainer().sponsorTimesSubmitting[this.props.index];this.setState({editing:!0,sponsorTimeEdits:this.getFormattedSponsorTimesEdits(e)})}}getFormattedSponsorTimesEdits(e){return[(0,d.getFormattedTime)(e.segment[0],!0),(0,d.getFormattedTime)(e.segment[1],!0)]}saveEditTimes(){var e,t,n,o;const i=Date.now()-this.lastEditTime;if(i<200)return void(this.editTimeTimeout||(this.editTimeTimeout=setTimeout((()=>{this.saveEditTimes()}),200-i)));this.lastEditTime=Date.now(),this.editTimeTimeout=null;const r=this.props.contentContainer().sponsorTimesSubmitting,l=this.categoryOptionRef.current.value;if(this.state.editing){const e=(0,d.getFormattedTimeToSeconds)(this.state.sponsorTimeEdits[0]),t=(0,d.getFormattedTimeToSeconds)(this.state.sponsorTimeEdits[1]);if(null!==e&&null!==t){const n=1===r[this.props.index].segment.length;r[this.props.index].segment=[e,t],n&&this.props.contentContainer().updateEditButtonsOnPlayer()}else null!==e&&(r[this.props.index].segment[0]=e)}else null!==this.state.sponsorTimeEdits[1]||"outro"!==l||r[this.props.index].segment[1]||(r[this.props.index].segment[1]=(0,f.getVideoDuration)(),this.props.contentContainer().updateEditButtonsOnPlayer());r[this.props.index].category=l;const u=this.getNextActionType(l,null===(t=null===(e=this.actionTypeOptionRef)||void 0===e?void 0:e.current)||void 0===t?void 0:t.value);r[this.props.index].actionType=u,this.setState({selectedActionType:u});const c=u===a.ActionType.Chapter?null===(o=null===(n=this.descriptionOptionRef)||void 0===n?void 0:n.current)||void 0===o?void 0:o.value:"";r[this.props.index].description=c,s.default.local.unsubmittedSegments[this.props.contentContainer().sponsorVideoID]=r,s.default.forceLocalUpdate("unsubmittedSegments"),this.props.contentContainer().updatePreviewBar(),r[this.props.index].actionType!==a.ActionType.Full||0===r[this.props.index].segment[0]&&0===r[this.props.index].segment[1]||(this.setTimeTo(0,0),this.setTimeTo(1,0))}getNextActionType(e,t){var n,o,i;return t&&(null===(n=r.categorySupport[e])||void 0===n?void 0:n.includes(t))?t:null!==(i=null===(o=r.categorySupport[e])||void 0===o?void 0:o[0])&&void 0!==i?i:a.ActionType.Skip}previewTime(e=!1,t=!1,n=!1){const o=this.props.contentContainer().sponsorTimesSubmitting,i=this.props.index;let r=h.defaultPreviewTime;e&&(r=.5),t&&(r=.25);const s=o[i].segment[0],a=o[i].segment[1],l=0===s||n?a:s-r*(0,f.getVideo)().playbackRate;this.props.contentContainer().previewTime(l,!n)}inspectTime(){const e=this.props.contentContainer().sponsorTimesSubmitting[this.props.index].segment[0];this.props.contentContainer().previewTime(e+1e-4,!1)}deleteTime(){const e=this.props.contentContainer().sponsorTimesSubmitting,t=this.props.index,n=e[t].segment.length<2;e.splice(t,1),e.length>0?s.default.local.unsubmittedSegments[this.props.contentContainer().sponsorVideoID]=e:delete s.default.local.unsubmittedSegments[this.props.contentContainer().sponsorVideoID],s.default.forceLocalUpdate("unsubmittedSegments"),this.props.contentContainer().updatePreviewBar(),0==e.length?this.props.submissionNotice.cancel():this.props.submissionNotice.forceUpdate(),(0===e.length||n)&&this.props.contentContainer().updateEditButtonsOnPlayer()}descriptionUpdate(e){this.setState({description:e},(()=>{this.saveEditTimes()})),this.fetchingSuggestions||this.fetchSuggestions(e)}fetchSuggestions(e){return o(this,void 0,void 0,(function*(){if(this.props.contentContainer().channelIDInfo.status!==a.ChannelIDStatus.Found)return;this.fetchingSuggestions=!0;const t=yield(0,p.asyncRequestToServer)("GET","/api/chapterNames",{description:e,channelID:this.props.contentContainer().channelIDInfo.id});if(t.ok)try{const e=JSON.parse(t.responseText);this.setState({suggestedNames:e.map((e=>({label:e.description})))})}catch(e){}this.fetchingSuggestions=!1}))}configUpdate(){this.forceUpdate()}}t.default=y},8818:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),i=n(8856),r=n(3936),s=n(8272),a=n(4342),l=n(4332),u=n(6821),c=n(2271),d=n(7621),p=n(3683);class h extends o.Component{constructor(e){super(e),this.noticeRef=o.createRef(),this.contentContainer=e.contentContainer,this.callback=e.callback;const t=chrome.i18n.getMessage("confirmNoticeTitle");this.lastSegmentCount=this.props.contentContainer().sponsorTimesSubmitting.length,this.state={noticeTitle:t,messages:[],idSuffix:"SubmissionNotice"}}componentDidMount(){this.videoObserver=new MutationObserver((()=>{this.forceUpdate()})),this.videoObserver.observe((0,p.getVideo)(),{attributes:!0}),document.getElementById("sponsorSkipNoticeMiddleRow"+this.state.idSuffix).addEventListener("wheel",(function(e){e.ctrlKey&&e.preventDefault()}),{passive:!1})}componentWillUnmount(){this.videoObserver&&this.videoObserver.disconnect()}componentDidUpdate(){const e=this.props.contentContainer().sponsorTimesSubmitting.length;e>this.lastSegmentCount&&(this.lastSegmentCount=e,this.scrollToBottom())}scrollToBottom(){const e=this.noticeRef.current.getElement().current.querySelector("#sponsorSkipNoticeMiddleRowSubmissionNotice");e.scrollTo({top:e.scrollHeight+1e3})}render(){var e;const t=o.createElement("img",{id:"sponsorSkipSortButton"+this.state.idSuffix,className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipSmallButton",onClick:()=>this.sortSegments(),title:chrome.i18n.getMessage("sortSegments"),key:"sortButton",src:chrome.runtime.getURL("icons/sort.svg")}),n=o.createElement("img",{id:"sponsorSkipExportButton"+this.state.idSuffix,className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipSmallButton",onClick:()=>this.exportSegments(),title:chrome.i18n.getMessage("exportSegments"),key:"exportButton",src:chrome.runtime.getURL("icons/export.svg")});return o.createElement(a.default,{noticeTitle:this.state.noticeTitle,idSuffix:this.state.idSuffix,ref:this.noticeRef,closeListener:this.cancel.bind(this),zIndex:5e3,firstColumn:[t,n]},this.getMessageBoxes(),o.createElement("tr",{id:"sponsorSkipNoticeMiddleRow"+this.state.idSuffix,className:"sponsorTimeMessagesRow",style:{maxHeight:(null===(e=(0,p.getVideo)())||void 0===e?void 0:e.offsetHeight)-200+"px"},onMouseDown:e=>e.stopPropagation()},o.createElement("td",{style:{width:"100%"}},this.getSponsorTimeMessages())),o.createElement("tr",{id:"sponsorSkipNoticeSecondRow"+this.state.idSuffix},o.createElement("td",{className:"sponsorSkipNoticeRightSection",style:{position:"relative"}},o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton",onClick:()=>window.open("https://wiki.sponsor.ajay.app/w/Guidelines")},chrome.i18n.getMessage(i.default.config.submissionCountSinceCategories>3?"guidelines":"readTheGuidelines")),o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton",onClick:this.submit.bind(this)},chrome.i18n.getMessage("submit")))))}getSponsorTimeMessages(){const e=[];this.timeEditRefs=[];const t=this.props.contentContainer().sponsorTimesSubmitting;for(let n=0;n<t.length;n++){const i=o.createRef();e.push(o.createElement(u.default,{key:t[n].UUID,idSuffix:this.state.idSuffix+n,index:n,contentContainer:this.props.contentContainer,submissionNotice:this,categoryChangeListener:this.categoryChangeListener.bind(this),ref:i})),this.timeEditRefs.push(i)}return e}getMessageBoxes(){const e=[];for(let t=0;t<this.state.messages.length;t++)e.push(o.createElement(l.default,{idSuffix:this.state.idSuffix+t,text:this.state.messages[t],key:t}));return e}cancel(){var e;null===(e=this.guidelinesReminder)||void 0===e||e.close(),this.noticeRef.current.close(!0),this.contentContainer().resetSponsorSubmissionNotice(!1),this.props.closeListener()}submit(){var e,t,n;if((0,p.isCurrentTimeWrong)())return void alert(chrome.i18n.getMessage("submissionFailedServerSideAds"));for(const e of this.timeEditRefs)e.current.saveEditTimes();const o=this.props.contentContainer().sponsorTimesSubmitting;for(const e of o)if("chooseACategory"===e.category)return void alert(chrome.i18n.getMessage("youMustSelectACategory"));if("Music"===(null===(n=null===(t=null===(e=this.contentContainer().videoInfo)||void 0===e?void 0:e.microformat)||void 0===t?void 0:t.playerMicroformatRenderer)||void 0===n?void 0:n.category))for(const e of o)if("sponsor"===e.category){if(!confirm(chrome.i18n.getMessage("nonMusicCategoryOnMusic")))return;break}this.props.callback().then((e=>{e&&this.cancel()}))}sortSegments(){let e=this.props.contentContainer().sponsorTimesSubmitting;e=e.sort(((e,t)=>e.segment[0]-t.segment[0])),i.default.local.unsubmittedSegments[this.props.contentContainer().sponsorVideoID]=e,i.default.forceLocalUpdate("unsubmittedSegments"),this.forceUpdate()}exportSegments(){const e=this.props.contentContainer().sponsorTimesSubmitting.sort(((e,t)=>e.segment[0]-t.segment[0]));window.navigator.clipboard.writeText((0,d.exportTimes)(e)),new r.default(null,"exportCopied",{title:chrome.i18n.getMessage("CopiedExclamation"),timed:!0,maxCountdownTime:()=>.6,referenceNode:document.querySelector(".noticeLeftIcon"),dontPauseCountdown:!0,style:{top:0,bottom:0,minWidth:0,right:"30px",margin:"auto"},hideLogo:!0,hideRightInfo:!0,extraClass:"exportCopiedNotice"})}categoryChangeListener(e,t){var n,o,a,l,u;const d=null===(l=null===(a=null===(o=null===(n=this.noticeRef)||void 0===n?void 0:n.current)||void 0===o?void 0:o.getElement())||void 0===a?void 0:a.current)||void 0===l?void 0:l.offsetWidth;if("chooseACategory"!==t&&i.default.config.showCategoryGuidelines&&(0,p.getVideo)().offsetWidth>2*d){const e={title:chrome.i18n.getMessage(`category_${t}`),textBoxes:(0,c.getGuidelineInfo)(t),buttons:[{name:chrome.i18n.getMessage("FullDetails"),listener:()=>window.open(s.wikiLinks[t])},{name:chrome.i18n.getMessage("Hide"),listener:()=>{var e;i.default.config.showCategoryGuidelines=!1,null===(e=this.guidelinesReminder)||void 0===e||e.close(),this.guidelinesReminder=null}}],timed:!1,style:{right:`${d+10}px`},extraClass:"sb-guidelines-notice"};e.textBoxes?this.guidelinesReminder?this.guidelinesReminder.update(e):this.guidelinesReminder=new r.default(null,"GuidelinesReminder",e):(null===(u=this.guidelinesReminder)||void 0===u||u.close(),this.guidelinesReminder=null)}}}t.default=h},8856:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.generateDebugDetails=void 0;const o=n(8272),i=n(5339),r=n(9209),s=n(1740);class a extends s.ProtoConfig{resetToDefault(){chrome.storage.sync.set(Object.assign(Object.assign({},this.syncDefaults),{userID:this.config.userID,minutesSaved:this.config.minutesSaved,skipCount:this.config.skipCount,sponsorTimesContributed:this.config.sponsorTimesContributed})),chrome.storage.local.set(Object.assign({},this.localDefaults))}}const l=new a({userID:null,isVip:!1,permissions:{},defaultCategory:"chooseACategory",renderSegmentsAsChapters:!1,whitelistedChannels:[],forceChannelCheck:!1,minutesSaved:0,skipCount:0,sponsorTimesContributed:0,submissionCountSinceCategories:0,showTimeWithSkips:!0,disableSkipping:!1,muteSegments:!0,fullVideoSegments:!0,fullVideoLabelsOnThumbnails:!0,manualSkipOnFullVideo:!1,trackViewCount:!0,trackViewCountInPrivate:!0,trackDownvotes:!0,trackDownvotesInPrivate:!1,dontShowNotice:!1,showUpcomingNotice:!1,noticeVisibilityMode:r.NoticeVisibilityMode.FadedForAutoSkip,hideVideoPlayerControls:!1,hideInfoButtonPlayerControls:!1,hideDeleteButtonPlayerControls:!1,hideUploadButtonPlayerControls:!1,hideSkipButtonPlayerControls:!1,hideDiscordLaunches:0,hideDiscordLink:!1,invidiousInstances:["invidious.snopyta.org"],supportInvidious:!1,serverAddress:o.serverAddress,minDuration:0,skipNoticeDuration:4,audioNotificationOnSkip:!1,checkForUnlistedVideos:!1,testingServer:!1,ytInfoPermissionGranted:!1,allowExpirements:!0,showDonationLink:!0,showPopupDonationCount:0,showUpsells:!0,showNewFeaturePopups:!0,donateClicked:0,autoHideInfoButton:!0,autoSkipOnMusicVideos:!1,skipNonMusicOnlyOnYoutubeMusic:!1,scrollToEditTimeUpdate:!1,categoryPillUpdate:!1,hookUpdate:!1,showChapterInfoMessage:!0,darkMode:!0,showCategoryGuidelines:!0,showCategoryWithoutPermission:!1,showSegmentNameInChapterBar:!0,showAutogeneratedChapters:!0,useVirtualTime:!0,showSegmentFailedToFetchWarning:!0,allowScrollingToEdit:!0,deArrowInstalled:!1,showDeArrowPromotion:!0,showDeArrowInSettings:!0,shownDeArrowPromotion:!1,showZoomToFillError2:!0,cleanPopup:!1,hideSegmentCreationInPopup:!1,categoryPillColors:{},skipKeybind:{key:"Enter"},skipToHighlightKeybind:{key:"Enter",ctrl:!0},startSponsorKeybind:{key:";"},submitKeybind:{key:"'"},actuallySubmitKeybind:{key:"'",ctrl:!0},previewKeybind:{key:";",ctrl:!0},nextChapterKeybind:{key:"ArrowRight",ctrl:!0},previousChapterKeybind:{key:"ArrowLeft",ctrl:!0},closeSkipNoticeKeybind:{key:"Backspace"},downvoteKeybind:{key:"h",shift:!0},upvoteKeybind:{key:"g",shift:!0},categorySelections:[{name:"sponsor",option:r.CategorySkipOption.AutoSkip},{name:"poi_highlight",option:r.CategorySkipOption.ManualSkip},{name:"exclusive_access",option:r.CategorySkipOption.ShowOverlay},{name:"chapter",option:r.CategorySkipOption.ShowOverlay}],payments:{licenseKey:null,lastCheck:0,lastFreeCheck:0,freeAccess:!1,chaptersAllowed:!1},colorPalette:{red:"#780303",white:"#ffffff",locked:"#ffc83d"},barTypes:{"preview-chooseACategory":{color:"#ffffff",opacity:"0.7"},sponsor:{color:"#00d400",opacity:"0.7"},"preview-sponsor":{color:"#007800",opacity:"0.7"},selfpromo:{color:"#ffff00",opacity:"0.7"},"preview-selfpromo":{color:"#bfbf35",opacity:"0.7"},exclusive_access:{color:"#008a5c",opacity:"0.7"},interaction:{color:"#cc00ff",opacity:"0.7"},"preview-interaction":{color:"#6c0087",opacity:"0.7"},intro:{color:"#00ffff",opacity:"0.7"},"preview-intro":{color:"#008080",opacity:"0.7"},outro:{color:"#0202ed",opacity:"0.7"},"preview-outro":{color:"#000070",opacity:"0.7"},preview:{color:"#008fd6",opacity:"0.7"},"preview-preview":{color:"#005799",opacity:"0.7"},hook:{color:"#395699",opacity:"0.8"},"preview-hook":{color:"#273963",opacity:"0.7"},music_offtopic:{color:"#ff9900",opacity:"0.7"},"preview-music_offtopic":{color:"#a6634a",opacity:"0.7"},poi_highlight:{color:"#ff1684",opacity:"0.7"},"preview-poi_highlight":{color:"#9b044c",opacity:"0.7"},filler:{color:"#7300FF",opacity:"0.9"},"preview-filler":{color:"#2E0066",opacity:"0.7"},chapter:{color:"#ffd983",opacity:"0"}}},{downvotedSegments:{},navigationApiAvailable:null,alreadyInstalled:!1,unsubmittedSegments:{},skipRules:[]},(function(e){if(e.changeChapterColor||(e.barTypes.chapter.color="#ffd983",e.changeChapterColor=!0,chrome.storage.sync.set({changeChapterColor:!0,barTypes:e.barTypes})),e.showZoomToFillError&&chrome.storage.sync.remove("showZoomToFillError"),e.unsubmittedSegments&&Object.keys(e.unsubmittedSegments).length>0&&chrome.storage.local.set({unsubmittedSegments:e.unsubmittedSegments},(()=>{chrome.storage.sync.remove("unsubmittedSegments")})),e.chapterCategoryAdded||(e.chapterCategoryAdded=!0,e.categorySelections.some((e=>"chapter"===e.name))||(e.categorySelections.push({name:"chapter",option:r.CategorySkipOption.ShowOverlay}),e.categorySelections=e.categorySelections)),void 0!==e.exclusive_accessCategoryAdded&&chrome.storage.sync.remove("exclusive_accessCategoryAdded"),void 0!==e.fillerUpdate&&chrome.storage.sync.remove("fillerUpdate"),void 0!==e.highlightCategoryAdded&&chrome.storage.sync.remove("highlightCategoryAdded"),void 0!==e.highlightCategoryUpdate&&chrome.storage.sync.remove("highlightCategoryUpdate"),e.askAboutUnlistedVideos&&chrome.storage.sync.remove("askAboutUnlistedVideos"),!e.autoSkipOnMusicVideosUpdate){e.autoSkipOnMusicVideosUpdate=!0;for(const t of e.categorySelections)if("music_offtopic"===t.name&&t.option===r.CategorySkipOption.AutoSkip){e.autoSkipOnMusicVideos=!0;break}}if(e.disableAutoSkip)for(const t of e.categorySelections)"sponsor"===t.name&&(t.option=r.CategorySkipOption.ManualSkip,chrome.storage.sync.remove("disableAutoSkip"));"string"==typeof e.skipKeybind&&(e.skipKeybind={key:e.skipKeybind}),"string"==typeof e.startSponsorKeybind&&(e.startSponsorKeybind={key:e.startSponsorKeybind}),"string"==typeof e.submitKeybind&&(e.submitKeybind={key:e.submitKeybind});const t=["skipKeybind","startSponsorKeybind","submitKeybind"];for(let n=t.length-1;n>=0;n--)for(let o=0;o<t.length;o++)n!=o&&(0,s.keybindEquals)(e[t[n]],e[t[o]])&&(e[t[n]]=null);void 0!==e.sponsorVideoID&&chrome.storage.sync.remove("sponsorVideoID"),void 0!==e.previousVideoID&&chrome.storage.sync.remove("previousVideoID"),!e.supportInvidious&&e.invidiousInstances.length<i.length&&(e.invidiousInstances=[...new Set([...i,...e.invidiousInstances])]),e.lastIsVipUpdate&&chrome.storage.sync.remove("lastIsVipUpdate")}));t.default=l,t.generateDebugDetails=function(){const e={debug:{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,extensionVersion:chrome.runtime.getManifest().version},config:JSON.parse(JSON.stringify(l.cachedSyncConfig))};return delete e.config.userID,e.config.serverAddress=e.config.serverAddress===o.serverAddress?"Default server address":"Custom server address",e.config.invidiousInstances=e.config.invidiousInstances.length,e.config.whitelistedChannels=e.config.whitelistedChannels.length,JSON.stringify(e,null,4)}},6069:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=n(8856),r=n(9209),s=n(205),a=n(9268),l=n(5474),u=n(4329),c=n(403),d=n(8480),p=n(2084),h=n(3726),f=n(6846),m=n(3225),g=n(7082),v=n(5144),y=n(7621),b=n(1924),S=n(5222),w=n(1108),T=n(7913),k=n(3683),C=n(1740),x=n(4148),E=n(3262),M=n(3497),I=n(8343),N=n(8537),P=n(8261),D=n(4982),L=n(5933),_=n(2184),A=n(9695),O=n(6062),B=n(2869),V=n(2271),R=n(6705),U=n(3611),F=n(6417);(0,L.cleanPage)();const z=new s.default;z.wait((()=>i.default.isReady()),5e3,10).then((()=>{!function(){if(!(0,w.isFirefoxOrSafari)()&&i.default.config.invidiousInstances.includes(new URL(document.URL).hostname)){const e=()=>{const e=document.getElementsByTagName("head")[0];for(const t of z.css){const n=document.createElement("link");n.rel="stylesheet",n.type="text/css",n.href=chrome.runtime.getURL(t),e.appendChild(n)}};"complete"===document.readyState?e():document.addEventListener("DOMContentLoaded",e)}}(),At(),(0,D.runCompatibilityChecks)()}));const j=.003,H=.5;let q=!1,$=[],Y=!1,W=!1,K=!1,G=null;const Q=[];let X=null,J=null,Z=!1,ee=null,te=!1,ne=null,oe=[];const ie={videoTime:null,preciseTime:null,fromPause:!1,approximateDelay:null};let re=null;const se={time:0,date:0};let ae=null,le=null,ue=null,ce=null,de=[],pe=!1;const he=[];(0,k.setupVideoModule)({videoIDChange:function(){if(null===be)if((0,k.isOnMobileYouTube)()){const e=new MutationObserver(Le);let t=null;z.wait((()=>(t=document.getElementById("player-control-container"),null!==t))).then((()=>{e.observe(document.getElementById("player-control-container"),{attributes:!0,childList:!0,subtree:!0})})).catch()}else z.wait(h.getControls).then(Ae);chrome.runtime.sendMessage({message:"videoChanged",videoID:(0,k.getVideoID)(),whitelisted:ye}),We(),ft(),xe=[],St(),(0,A.tryShowingDeArrowPromotion)().catch(v.logWarn),et(),(0,k.getIsInline)()&&(setTimeout(et,500),setTimeout(et,1e3),setTimeout(et,3e3))},channelIDChange:function(e){return o(this,void 0,void 0,(function*(){const t=i.default.config.whitelistedChannels;null!=t&&e.status===r.ChannelIDStatus.Found&&t.includes(e.id)&&(ye=!0),i.default.config.forceChannelCheck&&(null==$?void 0:$.length)>0&&Qe(),Je(),Ke()}))},videoElementChange:function(e,t){(0,w.waitFor)((()=>i.default.isReady())).then((()=>{e&&(function(e){if(e){if(e.addEventListener("loadstart",Be),e.addEventListener("durationchange",Oe),qe&&(0,_.addCleanupListener)((()=>{e.removeEventListener("loadstart",Be),e.removeEventListener("durationchange",Oe)})),!i.default.config.disableSkipping){fe=!1;let t=!1,n=!0,o=0;const i=()=>{$e(),Ye(),Re()};e.addEventListener("ratechange",i),e.addEventListener("videoSpeed_ratechange",i);const r=()=>{!ve&&Date.now()-o<200&&0===e.currentTime||(ve=!1,$e(),function(){const e=document.querySelector(".miniplayer");if(!(0,R.onVideoPage)()&&(0,h.isVisible)(e)){const t=(0,k.getLastNonInlineVideoID)();if(t){(0,k.triggerVideoIDChange)(t);const n=e.querySelector("video");n&&(0,k.getVideo)()!==n&&(0,k.triggerVideoElementChange)(n)}}}(),(fe||n)&&(fe=!1,(0,v.logDebug)("Setting switching videos to false"),$&&Qe()),n=!1,_t(),(Math.abs(ge-e.currentTime)>.3||ge!==e.currentTime&&Date.now()-me>2e3)&&(me=Date.now(),ge=e.currentTime,Re()))};e.addEventListener("play",r);const s=()=>{$e(),n=!1,t&&(t=!1,(0,v.logDebug)(`[SB] Playing event after buffering: ${Math.abs(ge-e.currentTime)>.3||ge!==e.currentTime&&Date.now()-me>2e3}`)),fe&&(fe=!1,(0,v.logDebug)("Setting switching videos to false"),$&&Qe()),(Math.abs(ge-e.currentTime)>.3||ge!==e.currentTime&&Date.now()-me>2e3)&&(me=Date.now(),ge=e.currentTime,Re()),je&&clearInterval(je),He=e.playbackRate,document.body.classList.contains("vsc-initialized")&&(je=setInterval((()=>{(0,k.getVideoID)()&&!e.paused||!je?e.playbackRate!==He&&(He=e.playbackRate,i()):clearInterval(je)}),2e3))};e.addEventListener("playing",s);const a=()=>{ie.fromPause=!1,e.paused?(Nt((0,k.getCurrentTime)()),0===(0,k.getCurrentTime)()&&(n=!0)):(me=Date.now(),ge=e.currentTime,$e(),Ye(),e.loop&&e.currentTime<.2&&(0,k.getCurrentTime)()<.2?Re(!1,0):Re())};e.addEventListener("seeking",a);const l=()=>{ge=-1,me=0,je&&clearInterval(je),ie.videoTime=null,ie.preciseTime=null,function(e){re=e.currentTime}(e),Ve()},u=()=>{ie.fromPause=!0,l()};e.addEventListener("pause",u);const c=()=>{(0,v.logDebug)("[SB] Not skipping due to buffering"),t=!0,l()};e.addEventListener("waiting",c);const d=()=>{o=Date.now(),ve&&0===e.currentTime&&r()};e.addEventListener("emptied",d);const p=()=>{ve&&0===(0,k.getCurrentTime)()&&r()};e.addEventListener("loadedmetadata",p),Re(),qe&&(0,_.addCleanupListener)((()=>{e.removeEventListener("play",r),e.removeEventListener("playing",s),e.removeEventListener("seeking",a),e.removeEventListener("ratechange",i),e.removeEventListener("videoSpeed_ratechange",i),e.removeEventListener("pause",u),e.removeEventListener("waiting",c),e.removeEventListener("empty",d),e.removeEventListener("loadedmetadata",p),je&&clearInterval(je)}))}qe=!1}}(t),Se||(Se=new d.SkipButtonControlBar({skip:e=>rt({v:(0,k.getVideo)(),skipTime:e.segment,skippingSegments:[e],openNotice:!0,forceAutoSkip:!0}),selectSegment:Xe,onMobileYouTube:(0,k.isOnMobileYouTube)(),onYTTV:(0,k.isOnYTTV)()})),Se.attachToPage(),we||(we=new f.CategoryPill),we.attachToPage((0,k.isOnMobileYouTube)(),(0,k.isOnInvidious)(),kt)),Je(),et(),setTimeout(et,100),setTimeout(et,1e3),setTimeout(et,5e3)}))},playerInit:()=>{be=null,Ae()},updatePlayerBar:()=>{Je(),ft()},resetValues:function(){var e;me=0,ge=-1,te=!1,ve=!0,$=[],Y=!1,de=[],G=null,Ce=0,Z=!1,ne=null,ye=!1,oe=[],null!==be&&be.clear(),q=!1,null!==fe&&(0,R.onVideoPage)()?(fe=!0,(0,v.logDebug)("Setting switching videos to true (reset data)")):fe=!1,null==Se||Se.disable(),null==we||we.setVisibility(!1);for(let t=0;t<Q.length;t++)null===(e=Q.pop())||void 0===e||e.close();X&&(X.close(),X=null),(0,A.hideDeArrowPromotion)()},documentScript:2===chrome.runtime.getManifest().manifest_version?P:void 0},(()=>i.default)),(0,N.setupThumbnailListener)();let fe=null,me=0,ge=-1,ve=!0,ye=!1,be=null,Se=null,we=null,Te=null;const ke={};document.addEventListener("keydown",Dt,!0),document.addEventListener("keyup",Lt,!0),(0,_.addCleanupListener)((()=>{document.body.removeEventListener("keydown",Dt,!0),document.body.removeEventListener("keyup",Lt,!0)}));let Ce,xe=[],Ee=!1,Me=!1,Ie=null;const Ne=()=>({vote:Tt,dontShowNoticeAgain:Ct,unskipSponsorTime:lt,sponsorTimes:$,sponsorTimesSubmitting:xe,skipNotices:Q,sponsorVideoID:(0,k.getVideoID)(),reskipSponsorTime:ut,updatePreviewBar:Je,onMobileYouTube:(0,k.isOnMobileYouTube)(),sponsorSubmissionNotice:Ie,resetSponsorSubmissionNotice:xt,updateEditButtonsOnPlayer:mt,previewTime:ot,videoInfo:ne,getRealCurrentTime:gt,lockedCategories:oe,channelIDInfo:(0,k.getChannelIDInfo)()}),Pe=.5;function De(e){for(const t in e)switch(t){case"hideVideoPlayerControls":case"hideInfoButtonPlayerControls":case"hideDeleteButtonPlayerControls":ft();break;case"categorySelections":We(!0,!0);break;case"barTypes":At();break;case"fullVideoSegments":case"fullVideoLabelsOnThumbnails":(0,I.updateAll)()}}function Le(){var e;if((null===(e=chrome.runtime)||void 0===e?void 0:e.id)&&!document.querySelector(".YtProgressBarProgressBarPlayheadDotInDragging")){if(ft(),null==Se||Se.updateMobileControls(),null!==be){if(!be.parent.contains(be.container)&&(0,B.isMobileControlsOpen)())return be.createElement(),void Je();be.parent.isConnected||(be.remove(),be=null)}Ae()}}function _e(){const e=[{selector:".ytChapteredProgressBarHost, .ytProgressBarLineHost, .YtProgressBarLineHost, .YtChapteredProgressBarHost",isVisibleCheck:!0},{selector:".YtmProgressBarProgressBarLine",isVisibleCheck:!0},{selector:"#video-preview .ytp-progress-bar, #video-preview .YtProgressBarLineHost",isVisibleCheck:!0},{selector:".ytp-progress-bar",isVisibleCheck:!0},{selector:".no-model.cue-range-marker",isVisibleCheck:!0},{selector:".vjs-progress-holder",isVisibleCheck:!1},{selector:"#progress-bar>#sliderContainer>div>#sliderBar>#progressContainer"},{selector:".shaka-ad-markers",isVisibleCheck:!1},{selector:".ytp-progress-bar-container > .html5-progress-bar > .ytp-progress-list"},{selector:".yssi-slider > div.ytu-ss-timeline-container",isVisibleCheck:!1}];for(const t of e){const e=document.querySelectorAll(t.selector),n=t.isVisibleCheck?(0,x.findValidElement)(e):e[0];if(n)return n}return null}function Ae(){if(null!==be)return;const e=_e();if(e){const t=new b.ChapterVote(kt);be=new a.default(e,(0,k.isOnMobileYouTube)(),(0,k.isOnInvidious)(),(0,k.isOnYTTV)(),t,(()=>Ge(!0))),Je()}}function Oe(){_t(),Je()}function Be(){Ae(),Je(),ft()}function Ve(){(0,v.logDebug)("Pausing skipping"),null!==ae&&(clearTimeout(ae),ae=null),null!==le&&(clearInterval(le),le=null),null!==ce&&(clearTimeout(ce),ce=null)}function Re(e=!1,t,n=!0){var s,a,l,u;return o(this,void 0,void 0,(function*(){if(Ve(),(0,k.getIsAdPlaying)())return ge=-1,me=0,void(0,v.logDebug)("[SB] Ad playing, pausing skipping");if(yield(0,k.checkIfNewVideoID)())return;if((0,v.logDebug)(`Considering to start skipping: ${!(0,k.getVideo)()}, ${null===(s=(0,k.getVideo)())||void 0===s?void 0:s.paused}`),!(0,k.getVideo)())return;if(null==t&&(t=Ue()),Ye(),Nt(t),(0,k.getVideo)().paused&&0!==(0,k.getCurrentTime)()||(0,k.getCurrentTime)()>=(0,k.getVideoDuration)()-.01&&(0,k.getVideoDuration)()>1)return;const o=function(e,t,n){var o;const i=e=>{var t;const n=null===(t=(0,F.getCategorySelection)(e))||void 0===t?void 0:t.option;return e.hidden!==r.SponsorHideType.Visible?3:n!==r.CategorySkipOption.AutoSkip&&!dt(e)||e.actionType!==r.ActionType.Skip&&e.actionType!==r.ActionType.Chapter?n!==r.CategorySkipOption.ShowOverlay?1:2:0},{includedTimes:s,scheduledTimes:a}=nt($,t,n),{scheduledTimes:l}=nt($,t,n,e,!0),u=g.GenericUtils.indexesOf(a,Math.min(...l)),c=null!==(o=u.sort(((e,t)=>i(s[e])-i(s[t])||s[e].segment[1]-s[e].segment[0]-(s[t].segment[1]-s[t].segment[0])))[0])&&void 0!==o?o:-1,d=u.filter((e=>e!==c&&0!==i(s[e]))),p=tt(s,c),{includedTimes:h,scheduledTimes:f}=nt(xe,t,n),{scheduledTimes:m}=nt(xe,t,n,e,!1),v=f.indexOf(Math.min(...m)),y=tt(h,v);return-1===v&&-1!==c||a[c]<f[v]?{array:s,index:c,endIndex:p,extraIndexes:d,openNotice:!0}:{array:h,index:v,endIndex:y,extraIndexes:[],openNotice:!1}}(t,e,n),c=o.array[o.index],d=[null==c?void 0:c.scheduledTime,null===(a=o.array[o.endIndex])||void 0===a?void 0:a.segment[1]],p=(null==d?void 0:d[0])-t,h=(0,k.getVideoID)();if(pe&&!Fe(t,-1!==o.index&&p<j&&dt(c))){(0,k.getVideo)().muted=!1,pe=!1;for(const e of Q)e.unmutedListener(t)}if((0,v.logDebug)(`Ready to start skipping: ${o.index} at ${t}`),-1===o.index)return;if(i.default.config.disableSkipping||ye||(0,k.getChannelIDInfo)().status===r.ChannelIDStatus.Fetching&&i.default.config.forceChannelCheck)return;if(ze())return;let f=[o.array[o.index]];if(o.index!==o.endIndex){f=[];for(const e of o.array)dt(e)&&e.segment[0]>=d[0]&&e.segment[1]<=d[1]&&e.segment[0]===e.scheduledTime&&f.push(e)}(0,v.logDebug)(`Next step in starting skipping: ${!pt(c)}, ${!(null==xe?void 0:xe.some((e=>e.segment===c.segment)))}`);const m=e=>{var t;let n=null,i=!1,s=!0;if(!ze(h,c)){if(e||(e=Math.max((0,k.getCurrentTime)(),Ue())),pt(c)||(null==xe?void 0:xe.some((e=>e.segment===c.segment&&e.actionType!==r.ActionType.Chapter&&e.hidden===r.SponsorHideType.Visible))))if(e>=d[0]-j&&(e<d[1]||d[1]<d[0])){rt({v:(0,k.getVideo)(),skipTime:d,skippingSegments:f,openNotice:o.openNotice});for(const e of o.extraIndexes){const t=o.array[e];pt(t)&&rt({v:(0,k.getVideo)(),skipTime:[t.scheduledTime,t.segment[1]],skippingSegments:[t],openNotice:o.openNotice})}(null===(t=(0,F.getCategorySelection)(c))||void 0===t?void 0:t.option)===r.CategorySkipOption.ManualSkip||c.actionType===r.ActionType.Mute?n=d[0]+.001:(n=d[1],s=!1,Math.abs(d[1]-(0,k.getVideoDuration)())>H&&(i=!0))}else n=e+.001;else n=e+.001;null!==n&&e>n&&d[1]>d[0]&&(n=e),Re(i,n,s)}};if(p<j)m(t);else{let e=1e3*p*(1/(0,k.getVideo)().playbackRate);if(e<((0,w.isFirefoxOrSafari)()&&!(0,C.isSafari)()?750:300)&&dt(f[0])){let n=null;(0,w.isFirefoxOrSafari)()&&!(0,C.isSafari)()&&e>300&&(n=yield new Promise((e=>{(0,k.getVideo)().addEventListener("timeupdate",(()=>e(performance.now())),{once:!0})})));const o=n||performance.now(),i=Math.max(t,Ue());e=1e3*((null==d?void 0:d[0])-i)*(1/(0,k.getVideo)().playbackRate);let r=!0;const s=(0,k.getCurrentTime)();(0,v.logDebug)(`Starting setInterval skipping ${(0,k.getCurrentTime)()} to skip at ${d[0]}`),null!==le&&clearInterval(le),le=setInterval((()=>{if((0,w.isFirefoxOrSafari)()&&!ie.fromPause&&r&&s!==(0,k.getCurrentTime)()){r=!1;const e=Ue()-(0,k.getCurrentTime)();e>0&&(ie.approximateDelay=e)}const t=performance.now()-o;(t+1e3*j>=e||Ue()+j>=d[0])&&(clearInterval(le),(0,w.isFirefoxOrSafari)()||(0,k.getVideo)().muted||Fe((0,k.getCurrentTime)(),!0)||((0,k.getVideo)().muted=!0,(0,k.getVideo)().muted=!1),m(Math.max(Ue(),i+(0,k.getVideo)().playbackRate*Math.max(e,t)/1e3)))}),0)}else{(0,v.logDebug)(`Starting timeout to skip ${(0,k.getCurrentTime)()} to skip at ${d[0]}`);const t=(0,w.isFirefoxOrSafari)()&&!(0,C.isSafari)()?600:150,n=Math.max(0,e-t);if(ae=setTimeout(m,n),i.default.config.showUpcomingNotice&&(0,k.getCurrentTime)()<f[0].segment[0]&&!(null==xe?void 0:xe.some((e=>e.segment===c.segment)))&&[r.ActionType.Skip,r.ActionType.Mute].includes(f[0].actionType)&&(null===(l=(0,F.getCategorySelection)(f[0]))||void 0===l?void 0:l.option)>r.CategorySkipOption.ShowOverlay&&!(null===(u=(0,k.getVideo)())||void 0===u?void 0:u.paused)){const e=3e3,t=Math.max(0,n-e),o=n-t,i=dt(f[0]);ce&&clearTimeout(ce),ce=setTimeout(at,t,[f[0]],o,i)}}}}))}function Ue(){var e;const t=null!=re?re:null!==ie.videoTime?(performance.now()-ie.preciseTime)*((null===(e=(0,k.getVideo)())||void 0===e?void 0:e.playbackRate)||1)/1e3+ie.videoTime:null;return i.default.config.useVirtualTime&&!(0,C.isSafari)()&&t&&t>(0,k.getCurrentTime)()&&t-(0,k.getCurrentTime)()<.8&&0!==(0,k.getCurrentTime)()?Math.max(t,(0,k.getCurrentTime)()):(0,k.getCurrentTime)()}function Fe(e,t){const n=n=>n.actionType===r.ActionType.Mute&&n.hidden===r.SponsorHideType.Visible&&n.segment[0]<=e&&(n.segment[1]>e||t&&n.segment[1]+.02>e);return(null==$?void 0:$.some(n))||xe.some(n)}function ze(e,t){if(!(0,R.onVideoPage)())return!1;const n=(0,k.getYouTubeVideoID)(),o=e||(0,k.getVideoID)();return!(n===o&&(!t||$&&(null==$?void 0:$.some((e=>e.segment[0]===t.segment[0]&&e.segment[1]===t.segment[1])))||xe.some((e=>e.segment[0]===t.segment[0]&&e.segment[1]===t.segment[1]))||ht(t))||(console.error("[SponsorBlock] The videoID recorded when trying to skip is different than what it should be."),console.error("[SponsorBlock] VideoID recorded: "+o+". Actual VideoID: "+n),console.error("[SponsorBlock] SponsorTime",t,"sponsorTimes",$,"sponsorTimesSubmitting",xe),(0,k.checkVideoIDChange)(),0))}chrome.runtime.onMessage.addListener((function(e,t,n){var o;switch(e.message){case"update":(0,k.checkVideoIDChange)();break;case"sponsorStart":vt(),n({creatingSegment:bt()});break;case"isInfoFound":n({found:q,status:Ce,sponsorTimes:$.filter((e=>(0,F.getCategorySelection)(e).option!==r.CategorySkipOption.Disabled)),time:null!==(o=(0,k.getCurrentTime)())&&void 0!==o?o:0,onMobileYouTube:(0,k.isOnMobileYouTube)(),videoID:(0,k.getVideoID)(),loopedChapter:null==G?void 0:G.UUID,channelWhitelisted:ye}),!e.updating&&Me&&null!=document.getElementById("sponsorBlockPopupContainer")&&wt(),Me=!0;break;case"getChannelID":n({channelID:(0,k.getChannelIDInfo)().id,isYTTV:"tv.youtube.com"===document.location.host});break;case"whitelistChange":ye=e.value,We();break;case"submitTimes":Et();break;case"refreshSegments":(0,k.getVideoID)()||(0,k.checkVideoIDChange)(),n({hasVideo:null!=(0,k.getVideoID)()}),(0,k.getVideoID)()&&We(!1,!0);break;case"unskip":lt($.find((t=>t.UUID===e.UUID)),null,!0);break;case"reskip":ut($.find((t=>t.UUID===e.UUID)),!0);break;case"selectSegment":Xe(e.UUID);break;case"submitVote":return Tt(e.type,e.UUID).then((e=>n(e))),!0;case"hideSegment":z.getSponsorTimeFromUUID($,e.UUID).hidden=e.type,z.addHiddenSegment((0,k.getVideoID)(),e.UUID,e.type),Je(),(null==Se?void 0:Se.isEnabled())&&xe.every((e=>e.hidden!==r.SponsorHideType.Visible||e.actionType!==r.ActionType.Poi))&&Se.disable();break;case"closePopup":wt();break;case"copyToClipboard":navigator.clipboard.writeText(e.text);break;case"loopChapter":if(!e.UUID){G=null;break}G=Object.assign({},z.getSponsorTimeFromUUID($,e.UUID)),G.segment=[G.segment[1],G.segment[0]];break;case"importSegments":{const t=(0,y.importTimes)(e.data,(0,k.getVideoDuration)());let o=!1;for(const e of t)if(!xe.some((t=>Math.abs(t.segment[0]-e.segment[0])<1&&Math.abs(t.segment[1]-e.segment[1])<1&&t.description===e.description))){const t=i.default.config.showCategoryWithoutPermission||i.default.config.permissions.chapter;"chapter"!==e.category||(0,F.getCategoryDefaultSelection)("chapter")&&t||(e.category="chooseACategory",e.actionType=r.ActionType.Skip,e.description=""),xe.push(e),o=!0}o&&(i.default.local.unsubmittedSegments[(0,k.getVideoID)()]=xe,i.default.forceLocalUpdate("unsubmittedSegments"),mt(),St(!1),Et()),n({importedSegments:t});break}case"keydown":(document.body||document).dispatchEvent(new KeyboardEvent("keydown",{key:e.key,keyCode:e.keyCode,code:e.code,which:e.which,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey}));break;case"getLogs":n({debug:window.SBLogs.debug,warn:window.SBLogs.warn})}n({})})),i.default.configSyncListeners.includes(De)||i.default.configSyncListeners.push(De);let je=null,He=1,qe=!0;function $e(){if(ue&&clearInterval(ue),ie.videoTime=(0,k.getCurrentTime)(),ie.preciseTime=performance.now(),(0,w.isFirefoxOrSafari)()){let e=0,t=0,n=ie.videoTime,o=performance.now();ue=setInterval((()=>{const i=performance.now()-o;if(n!==(0,k.getCurrentTime)()&&(t++,(i<20||t>30)&&e++,n=(0,k.getCurrentTime)()),e>1){const e=ie.fromPause&&ie.approximateDelay?ie.approximateDelay:0;ie.videoTime=(0,k.getCurrentTime)()+e,ie.preciseTime=performance.now(),clearInterval(ue),ue=null}o=performance.now()}),1)}}function Ye(){re=null}function We(e=!0,t=!1){return o(this,void 0,void 0,(function*(){const n=(0,k.getVideoID)();if(!n)return void console.error("[SponsorBlock] Attempted to fetch segments with a null/undefined videoID.");const s=yield(0,U.getSegmentsForVideo)(n,t);if(n===(0,k.getVideoID)()){if(Ce=s.status,200===s.status){const t=s.segments;if(t&&t.length){if(q=-1!==t.findIndex((e=>(0,F.getCategorySelection)(e).option!==r.CategorySkipOption.Disabled)),null!==$&&e)for(let e=0;e<$.length;e++)$[e].source===r.SponsorSourceType.Local&&t.push($[e]);const o=$||[];if($=t,Y=!1,0!==i.default.config.minDuration)for(const e of $){const t=e.segment[1]-e.segment[0];t>0&&t<i.default.config.minDuration&&(e.hidden=r.SponsorHideType.MinimumDuration)}if(e)for(const e of o){const t=$.find((t=>e.UUID===t.UUID));t&&(t.hidden=e.hidden,t.category=e.category)}const s=(yield(0,E.getHash)(n,1)).slice(0,4),a=i.default.local.downvotedSegments[s];if(a)for(const e of $){const t=yield(0,E.getHash)(e.UUID,1),n=a.segments.find((e=>e.uuid===t));n&&(e.hidden=n.hidden)}(0,k.getVideo)()||(yield(0,k.waitForVideo)()),Qe(),isNaN((0,k.getVideoDuration)())||Je()}}Ke(),Ge(!0),i.default.config.isVip&&function(){var e;o(this,void 0,void 0,(function*(){const t=(yield(0,E.getHash)((0,k.getVideoID)(),1)).slice(0,4),n=yield(0,O.asyncRequestToServer)("GET","/api/lockCategories/"+t);if(n.ok)try{const t=null===(e=JSON.parse(n.responseText).filter((e=>e.videoID===(0,k.getVideoID)()))[0])||void 0===e?void 0:e.categories;Array.isArray(t)&&(oe=t)}catch(e){}}))}()}}))}function Ke(){var e;chrome.runtime.sendMessage({message:"infoUpdated",found:q,status:Ce,sponsorTimes:$.filter((e=>(0,F.getCategorySelection)(e).option!==r.CategorySkipOption.Disabled)),time:null!==(e=(0,k.getCurrentTime)())&&void 0!==e?e:0,onMobileYouTube:(0,k.isOnMobileYouTube)(),videoID:(0,k.getVideoID)(),loopedChapter:null==G?void 0:G.UUID,channelWhitelisted:ye})}function Ge(e){if(!Y&&!K&&(0,R.onVideoPage)()&&!(0,k.isOnMobileYouTube)()){const t=()=>(0,k.getVideoDuration)()&&(0,h.getExistingChapters)((0,k.getVideoID)(),(0,k.getVideoDuration)());if(!e||document.hasFocus()||W||t())K=!0,(0,w.waitFor)(t,e?15e3:0,400,(e=>(null==e?void 0:e.length)>0)).then((e=>{K=!1,!Y&&(null==e?void 0:e.length)>0&&($=(null!=$?$:[]).concat(...e).sort(((e,t)=>e.segment[0]-t.segment[0])),Y=!0,Je())})).catch((()=>{K=!1})),i.default.config.showAutogeneratedChapters||(0,w.waitFor)((()=>(0,h.hasAutogeneratedChapters)()),e?15e3:0,400).then((()=>{Nt((0,k.getCurrentTime)())})).catch((()=>{}));else{W=!0;const t=()=>{Ge(e),window.removeEventListener("focus",t)};window.addEventListener("focus",t)}}}function Qe(){var e;if((!fe||(0,C.isSafari)())&&$){let t=(0,p.getStartTimeFromUrl)(document.URL)||-1,n=!1;for(const e of $)if(e.segment[0]<=(0,k.getCurrentTime)()&&e.segment[0]>t&&e.segment[1]>(0,k.getCurrentTime)()&&e.actionType!==r.ActionType.Poi){t=e.segment[0],n=!0;break}if(!n)for(const e of xe)if(e.segment[0]<=(0,k.getCurrentTime)()&&e.segment[0]>t&&e.segment[1]>(0,k.getCurrentTime)()&&e.actionType!==r.ActionType.Poi){t=e.segment[0],n=!0;break}const o=$.filter((e=>e.segment[1]>(0,k.getCurrentTime)()&&e.actionType===r.ActionType.Poi&&e.hidden===r.SponsorHideType.Visible&&(0,F.getCategorySelection)(e).option!==r.CategorySkipOption.Disabled)).sort(((e,t)=>t.segment[0]-e.segment[0]));for(const t of o){const n=null===(e=(0,F.getCategorySelection)(t))||void 0===e?void 0:e.option;if(n!==r.CategorySkipOption.ShowOverlay&&(rt({v:(0,k.getVideo)(),skipTime:t.segment,skippingSegments:[t],openNotice:!0,unskipTime:(0,k.getCurrentTime)()}),n===r.CategorySkipOption.AutoSkip))break}const i=$.filter((e=>e.actionType===r.ActionType.Full))[0];i&&(0,w.waitFor)((()=>we)).then((()=>{null==we||we.setSegment(i)})),-1!==t?Re(void 0,t):Re()}}function Xe(e){ee=e,Je()}function Je(){if(null===be)return;if((0,k.getIsAdPlaying)())return void be.clear();if(null===(0,k.getVideo)())return;const e=(0,h.getHashParams)(),t=(null==e?void 0:e.requiredSegment)||void 0,n=[];$&&$.forEach((e=>{var o;e.hidden===r.SponsorHideType.Visible&&(0,F.getCategorySelection)(e).option!==r.CategorySkipOption.Disabled&&n.push({segment:e.segment,category:e.category,actionType:e.actionType,unsubmitted:!1,showLarger:e.actionType===r.ActionType.Poi,description:e.description,source:e.source,requiredSegment:t&&(e.UUID===t||(null===(o=e.UUID)||void 0===o?void 0:o.startsWith(t))||t.startsWith(e.UUID)),selectedSegment:ee&&e.UUID===ee})})),xe.forEach((e=>{e.hidden===r.SponsorHideType.Visible&&(e.actionType!==r.ActionType.Chapter||e.segment.length>1)&&n.push({segment:e.segment,category:e.category,actionType:e.actionType,unsubmitted:!0,showLarger:e.actionType===r.ActionType.Poi,description:e.description,source:e.source})})),be.set(n.filter((e=>e.actionType!==r.ActionType.Full)),(0,k.getVideoDuration)()),(0,k.getVideo)()&&Nt((0,k.getCurrentTime)()),i.default.config.showTimeWithSkips&&function(e){(isNaN(e)||e<0)&&(e=0);const t=(0,k.isOnInvidious)()?".vjs-duration":(0,k.isOnYTTV)()?".ypl-full-controls .ypmcs-control .time-info-bar":(0,k.isOnMobileYouTube)()?".ytwPlayerTimeDisplayContent":".ytp-time-display.notranslate .ytp-time-wrapper .ytp-time-contents",n=document.querySelector(t);if(!n)return;const o="sponsorBlockDurationAfterSkips";let i=document.getElementById(o);null===i&&(i=document.createElement("span"),i.id=o,(0,k.isOnMobileYouTube)()?(i.style.paddingLeft="4px",n.insertBefore(i,n.lastChild)):n.appendChild(i));const r=(0,T.getFormattedTime)((0,k.getVideoDuration)()-e);i.innerText=null==r||e<=0?"":" ("+r+")"}(z.getTimestampsDuration(n.filter((({actionType:e})=>![r.ActionType.Mute,r.ActionType.Chapter].includes(e))).map((({segment:e})=>e))))}let Ze=!1;function et(){var e;if(!_e()&&!Ze&&(0,k.getVideo)()&&(0,k.getVideoID)())return Ze=!0,void setTimeout((()=>{Ze=!1,et()}),500);be&&!(null===(e=_e())||void 0===e?void 0:e.contains(be.container))&&(be.remove(),be=null),Ae()}function tt(e,t,n=!0){var o;if(-1==t||!dt(e[t])||e[t].actionType!==r.ActionType.Skip)return t;let i=-1;i=G&&G.segment[0]>e[t].segment[0]&&G.segment[0]<=(null===(o=e[t])||void 0===o?void 0:o.segment[1])?e.length-1:t;for(let t=0;t<(null==e?void 0:e.length);t++){const o=e[t].segment,s=e[i].segment[1];o[0]-j<=s&&o[1]>s&&(!n||e[t].hidden===r.SponsorHideType.Visible)&&dt(e[t])&&e[t].actionType===r.ActionType.Skip&&(i=t)}return i!==t&&(i=tt(e,i,n)),i}function nt(e,t,n,o,i=!1){if(!e)return{includedTimes:[],scheduledTimes:[]};const s=[],a=[],l=e=>(void 0===o||n&&e.scheduledTime>=o||t&&e.scheduledTime<o&&(e.segment[1]>o&&pt(e)||ht(e)))&&(!i||e.hidden===r.SponsorHideType.Visible)&&2===e.segment.length&&e.actionType!==r.ActionType.Poi&&e.actionType!==r.ActionType.Full,u=e.map((e=>Object.assign(Object.assign({},e),{scheduledTime:e.segment[0]})));e.forEach((e=>{!u.some((t=>e.segment[1]===t.scheduledTime&&l(t)))&&(void 0===o||e.segment[1]>o)&&u.push(Object.assign(Object.assign({},e),{scheduledTime:e.segment[1]}))})),G&&u.push(Object.assign(Object.assign({},G),{scheduledTime:G.segment[0]}));for(let e=0;e<u.length;e++)l(u[e])&&(a.push(u[e].scheduledTime),s.push(u[e]));return{includedTimes:s,scheduledTimes:a}}function ot(e,t=!0){te=!0,(0,k.setCurrentTime)(e),t&&(0,k.getVideo)().paused&&(0,k.getVideo)().play()}function it(e,t,n){for(const t of e)!te&&xe.some((e=>e.segment===t.segment))&&(te=!0);if(!i.default.config.trackViewCount||!i.default.config.trackViewCountInPrivate&&chrome.extension.inIncognitoContext)return;let o=!1;for(const s of e){const e=null==$?void 0:$.findIndex((e=>e.segment===s.segment));-1===e||de[e]||(de[e]=!0,o||(i.default.config.minutesSaved=i.default.config.minutesSaved+t/60,s.actionType!==r.ActionType.Chapter&&(i.default.config.skipCount=i.default.config.skipCount+1),o=!0),n&&(0,O.asyncRequestToServer)("POST","/api/viewedVideoSponsorTime?UUID="+s.UUID+"&videoID="+(0,k.getVideoID)()))}}function rt({v:e,skipTime:t,skippingSegments:n,openNotice:o,forceAutoSkip:s,unskipTime:a}){var l;if(i.default.config.disableSkipping)return;const u=s||dt(n[0]),c=xe.some((e=>e.segment===n[0].segment));if((u||c)&&(0,k.getCurrentTime)()!==t[1])switch(n[0].actionType){case r.ActionType.Poi:case r.ActionType.Chapter:case r.ActionType.Skip:e.loop&&(0,k.getVideoDuration)()>1&&t[1]>=(0,k.getVideoDuration)()-1?(0,k.setCurrentTime)(0):(0,k.getVideoDuration)()>1&&t[1]>=(0,k.getVideoDuration)()&&("Apple Computer, Inc."===navigator.vendor||(0,h.isPlayingPlaylist)())?(0,k.setCurrentTime)((0,k.getVideoDuration)()-.001):(0,k.getVideoDuration)()>1&&Math.abs(t[1]-(0,k.getVideoDuration)())<H&&(0,w.isFirefoxOrSafari)()&&!(0,C.isSafari)()?(0,k.setCurrentTime)((0,k.getVideoDuration)()):(Fe(t[1],!0)&&(e.muted=!0,pe=!0),(0,k.setCurrentTime)(t[1]));break;case r.ActionType.Mute:e.muted||(e.muted=!0,pe=!0)}if(u&&i.default.config.audioNotificationOnSkip&&!c&&!(null===(l=(0,k.getVideo)())||void 0===l?void 0:l.muted)){const e=new Audio(chrome.runtime.getURL("icons/beep.oga"));e.volume=.1*(0,k.getVideo)().volume;const t=navigator.mediaSession.metadata;e.play(),e.addEventListener("ended",(()=>{navigator.mediaSession.metadata=null,setTimeout((()=>{navigator.mediaSession.metadata=t,e.remove()}))}))}u||1!==n.length||n[0].actionType!==r.ActionType.Poi?o&&(i.default.config.dontShowNotice&&u?u&&(null==J||J.setShowKeybindHint(!1),J={setShowKeybindHint:()=>{},toggleSkip:()=>{lt(n[0],a),st(n,u,a,!0)}}):st(n,u,a,!1)):(0,w.waitFor)((()=>Se)).then((()=>{Se.enable(n[0]),((0,k.isOnMobileYouTube)()||null==i.default.config.skipKeybind)&&Se.setShowKeybindHint(!1),null==J||J.setShowKeybindHint(!1),J=Se})),(u||c)&&it(n,t[1]-t[0],!0)}function st(e,t,n,o,r=!1){for(const t of Q)if(e.length===t.segments.length&&e.every((e=>t.segments.some((t=>t.UUID===e.UUID)))))return;const s=!!X&&!X.closed,a=new l.default(e,t,Ne,(()=>{null==X||X.close(),X=null}),n,o,s,r);((0,k.isOnMobileYouTube)()||null==i.default.config.skipKeybind)&&a.setShowKeybindHint(!1),Q.push(a),null==J||J.setShowKeybindHint(!1),J=a}function at(e,t,n){X&&!X.closed&&X.sameNotice(e)||(null==X||X.close(),X=new u.default(e,Ne,t/1e3,n))}function lt(e,t=null,n=!1,o=!1){e.actionType===r.ActionType.Mute&&((0,k.getVideo)().muted=!1,pe=!1),(n||e.actionType===r.ActionType.Skip||e.actionType===r.ActionType.Chapter||o)&&(0,k.setCurrentTime)(null!=t?t:e.segment[0]+.001)}function ut(e,t=!1){if(e.actionType!==r.ActionType.Mute||t){const t=Math.max(e.segment[1]-(0,k.getCurrentTime)(),0),n=t/(e.segment[1]-e.segment[0])>Pe;(0,k.setCurrentTime)(e.segment[1]),it([e],e.actionType!==r.ActionType.Chapter?t:0,n),Re(!0,e.segment[1],!1)}else(0,k.getVideo)().muted=!0,pe=!0}function ct(e,t,n,o,i=!1){const r=document.getElementById(e+"Button");if(null!==r)return r;const s=document.createElement("button");s.draggable=i,s.id=e+"Button",s.classList.add("playerButton"),s.classList.add("ytp-button"),(0,k.isOnYTTV)()&&s.setAttribute("style","width: 40px; height: 40px"),s.setAttribute("title",chrome.i18n.getMessage(t)),s.addEventListener("click",(()=>{n()}));const a=document.createElement("img");return s.draggable=i,a.id=e+"Image",a.className="playerButtonImage",a.src=chrome.runtime.getURL("icons/"+o),s.appendChild(a),Te&&Te.prepend(s),ke[e]={button:s,image:a,setupListener:!1},s}function dt(e){var t;const n=!i.default.config.skipNonMusicOnlyOnYoutubeMusic||(0,k.isOnYouTubeMusic)();return!("music_offtopic"===e.category&&!n)&&((!i.default.config.manualSkipOnFullVideo||!(null==$?void 0:$.some((t=>t.category===e.category&&t.actionType===r.ActionType.Full))))&&((null===(t=(0,F.getCategorySelection)(e))||void 0===t?void 0:t.option)===r.CategorySkipOption.AutoSkip||i.default.config.autoSkipOnMusicVideos&&n&&(null==$?void 0:$.some((e=>"music_offtopic"===e.category)))&&e.actionType===r.ActionType.Skip||xe.some((t=>t.segment===e.segment)))||ht(e))}function pt(e){var t;return e.hidden===r.SponsorHideType.Visible&&e.actionType!==r.ActionType.Full&&(null===(t=(0,F.getCategorySelection)(e))||void 0===t?void 0:t.option)>r.CategorySkipOption.ShowOverlay||i.default.config.autoSkipOnMusicVideos&&(null==$?void 0:$.some((e=>"music_offtopic"===e.category)))&&e.actionType===r.ActionType.Skip||ht(e)}function ht(e){return!!e&&!!G&&null!=e.segment[1]&&e.segment[0]===G.segment[0]&&e.segment[1]===G.segment[1]}function ft(){return o(this,void 0,void 0,(function*(){(0,k.getVideoID)()&&!(0,k.isOnMobileYouTube)()&&(yield function(){var e;return o(this,void 0,void 0,(function*(){Te=yield z.wait(h.getControls).catch(),ct("startSegment","sponsorStart",(()=>vt()),"PlayerStartIconSponsorBlocker.svg"),ct("cancelSegment","sponsorCancel",(()=>(bt()&&(xe.length>1?(xe.pop(),i.default.local.unsubmittedSegments[(0,k.getVideoID)()]=xe):(xt(),xe=[],delete i.default.local.unsubmittedSegments[(0,k.getVideoID)()]),i.default.forceLocalUpdate("unsubmittedSegments")),mt(),void St(!1))),"PlayerCancelSegmentIconSponsorBlocker.svg"),ct("delete","clearTimes",(()=>function(){const e=(0,k.getVideoID)(),t=i.default.local.unsubmittedSegments[e];if(null!=t&&t.length>0){const n=chrome.i18n.getMessage("clearThis")+It(t)+"\n"+chrome.i18n.getMessage("confirmMSG");if(!confirm(n))return;xt(),delete i.default.local.unsubmittedSegments[e],i.default.forceLocalUpdate("unsubmittedSegments"),xe=[],Je(),mt()}}()),"PlayerDeleteIconSponsorBlocker.svg"),ct("submit","OpenSubmissionMenu",(()=>Et()),"PlayerUploadIconSponsorBlocker.svg"),ct("info","openPopup",(()=>function(){if(null!=document.getElementById("sponsorBlockPopupContainer"))return;Me=!1,ke.info&&(ke.info.button.style.display="none");const e=document.createElement("div");e.id="sponsorBlockPopupContainer";const t=document.createElement("iframe");t.width="374",t.height="500",t.style.borderRadius="12px",t.addEventListener("load",(()=>o(this,void 0,void 0,(function*(){t.contentWindow.postMessage("","*");const e=document.querySelector(".stylus");e&&t.contentWindow.postMessage({type:"style",css:e.textContent},"*");const n=document.getElementById("efyt-theme");if(n){const e=document.getElementById("efyt-theme-variables");if(e){const o=yield fetch(n.getAttribute("href")).then((e=>e.text())),i=yield fetch(e.getAttribute("href")).then((e=>e.text()));o&&i&&t.contentWindow.postMessage({type:"style",css:o.replace("./images/youtube-deep-dark/IconSponsorBlocker256px.png","https://raw.githubusercontent.com/RaitaroH/YouTube-DeepDark/master/YT_Images/IconSponsorBlocker256px.png")+i},"*")}}})))),t.src=chrome.runtime.getURL("popup.html"),e.appendChild(t);const n=e=>{let t;for(const n of e)null!==n.firstElementChild&&(t=n);return t},i=[{selector:"#secondary-inner",hasChildCheck:!0},{selector:"#watch7-sidebar-contents"}];for(const t of i){const o=document.querySelectorAll(t.selector),i=t.hasChildCheck?n(o):o[0];if(i){t.hasChildCheck&&i.insertBefore(e,i.firstChild);break}}}()),"PlayerInfoIconSponsorBlocker.svg");const t=(0,h.getControls)();i.default.config.autoHideInfoButton&&!(0,k.isOnInvidious)()&&t&&(null===(e=ke.info)||void 0===e?void 0:e.button)&&!he.includes(t)&&(he.push(t),m.AnimationUtils.setupAutoHideAnimation(ke.info.button,t))}))}(),mt(),i.default.config.hideInfoButtonPlayerControls||document.URL.includes("/embed/")||(0,k.isOnInvidious)()||(0,k.isOnYTTV)()||null!=document.getElementById("sponsorBlockPopupContainer")?ke.info.button.style.display="none":ke.info.button.style.removeProperty("display"))}))}function mt(){if(!(0,k.getVideoID)()||(0,k.isOnMobileYouTube)())return;const e=!(i.default.config.hideVideoPlayerControls||(0,k.isOnInvidious)());let t=!1,n=!1,o=!1;e&&(t=bt(),n=xe.length>0,o=xe.length>1||xe.length>0&&!t),ke.startSegment.button.style.display=e?"unset":"none",ke.cancelSegment.button.style.display=e&&t?"unset":"none",e&&(t?(ke.startSegment.image.src=chrome.runtime.getURL("icons/PlayerStopIconSponsorBlocker.svg"),ke.startSegment.button.setAttribute("title",chrome.i18n.getMessage("sponsorEnd"))):(ke.startSegment.image.src=chrome.runtime.getURL("icons/PlayerStartIconSponsorBlocker.svg"),ke.startSegment.button.setAttribute("title",chrome.i18n.getMessage("sponsorStart")))),ke.submit.button.style.display=n&&!i.default.config.hideUploadButtonPlayerControls?"unset":"none",ke.delete.button.style.display=o&&!i.default.config.hideDeleteButtonPlayerControls?"unset":"none"}function gt(){var e,t;return"M 18,11 V 7 l -5,5 5,5 v -4 c 3.3,0 6,2.7 6,6 0,3.3 -2.7,6 -6,6 -3.3,0 -6,-2.7 -6,-6 h -2 c 0,4.4 3.6,8 8,8 4.4,0 8,-3.6 8,-8 0,-4.4 -3.6,-8 -8,-8 z"===(null===(t=null===(e=document.querySelector(".ytp-play-button"))||void 0===e?void 0:e.querySelector(".ytp-svg-fill"))||void 0===t?void 0:t.getAttribute("d"))?(0,k.getVideoDuration)():(0,k.getCurrentTime)()}function vt(){if((0,k.isOnYTTV)()&&(0,k.getIsLivePremiere)())return void alert(chrome.i18n.getMessage("yttvLiveContentWarning"));(0,k.verifyCurrentTime)(gt());const e=Math.round(1e3*(gt()+Number.EPSILON))/1e3;if(bt()){const t=yt(),n=t.segment[0],o=e;t.segment=[Math.min(n,o),Math.max(n,o)]}else xe.push({segment:[e],UUID:(0,M.generateUserID)(),category:i.default.config.defaultCategory,actionType:r.ActionType.Skip,source:r.SponsorSourceType.Local});i.default.local.unsubmittedSegments[(0,k.getVideoID)()]=xe,i.default.forceLocalUpdate("unsubmittedSegments"),We(!0,!0),mt(),St(!1),Ge(!1),200!==Ce&&404!==Ce&&!Z&&i.default.config.showSegmentFailedToFetchWarning&&(alert(chrome.i18n.getMessage("segmentFetchFailureWarning")),Z=!0)}function yt(){return xe[xe.length-1]}function bt(){var e;const t=yt();return t&&2!==(null===(e=null==t?void 0:t.segment)||void 0===e?void 0:e.length)}function St(e=!0){const t=i.default.local.unsubmittedSegments[(0,k.getVideoID)()];if(e&&null!=t){xe=[];for(const e of t)xe.push({segment:e.segment,UUID:e.UUID,category:e.category,actionType:e.actionType,description:e.description,hidden:e.hidden,source:e.source});xe.length>0&&(te=!0,Ge(!0))}Je(),null!==(0,k.getVideo)()&&Re(),null!==Ie&&Ie.update(),function(){var e;if(Ee)return;Ee=!0;let t=!1;const n=(0,h.getHashParams)().segments;if(Array.isArray(n))for(const o of n)Array.isArray(o.segment)&&(xe.some((e=>e.segment[0]===o.segment[0]&&e.segment[1]==e.segment[1]))||(xe.push({segment:o.segment,UUID:(0,M.generateUserID)(),category:o.category?o.category:i.default.config.defaultCategory,actionType:o.actionType?o.actionType:r.ActionType.Skip,description:null!==(e=o.description)&&void 0!==e?e:"",source:r.SponsorSourceType.Local}),t=!0));t&&(i.default.local.unsubmittedSegments[(0,k.getVideoID)()]=xe,i.default.forceLocalUpdate("unsubmittedSegments"))}()}function wt(){const e=document.getElementById("sponsorBlockPopupContainer");null!==e&&(e.remove(),!document.URL.includes("/embed/")&&ke.info&&(ke.info.button.style.display="unset"))}function Tt(e,t,n,i){return o(this,void 0,void 0,(function*(){null!=i&&(i.addVoteButtonInfo.bind(i)(chrome.i18n.getMessage("Loading")),i.setNoticeInfoMessage.bind(i)());const o=yield kt(e,t,n);return null!=o&&null!=i&&(1==o.successType||-1==o.successType&&429==o.statusCode?i.afterVote.bind(i)(z.getSponsorTimeFromUUID($,t),e,n):-1==o.successType&&(403===o.statusCode&&o.responseText.startsWith("Vote rejected due to a tip from a moderator.")?(0,S.openWarningDialog)(Ne):i.setNoticeInfoMessage.bind(i)((0,T.getErrorMessage)(o.statusCode,o.responseText)),i.resetVoteButtonInfo.bind(i)())),o}))}function kt(e,t,n){return o(this,void 0,void 0,(function*(){const o=z.getSponsorIndexFromUUID($,t);if(-1==o||$[o].source!==r.SponsorSourceType.Server)return Promise.resolve(void 0);if(0===e&&de[o]||1===e&&!de[o]){let t=1;0==e&&(t=-1,de[o]=!1),i.default.config.minutesSaved=i.default.config.minutesSaved+t*($[o].segment[1]-$[o].segment[0])/60,i.default.config.skipCount=i.default.config.skipCount+t}return new Promise((o=>{chrome.runtime.sendMessage({message:"submitVote",type:e,UUID:t,category:n,videoID:(0,k.getVideoID)()},(s=>{if(1===s.successType){const o=z.getSponsorTimeFromUUID($,t);o&&(0===e?o.hidden=r.SponsorHideType.Downvoted:n?o.category=n:1===e&&(o.hidden=r.SponsorHideType.Visible),n||i.default.config.isVip||z.addHiddenSegment((0,k.getVideoID)(),o.UUID,o.hidden),Je())}o(s)}))}))}))}function Ct(){i.default.config.dontShowNotice=!0,function(){const e=document.getElementsByClassName("sponsorSkipNotice");for(let t=0;t<e.length;t++)e[t].remove()}()}function xt(e=!0){null==Ie||Ie.close(e),Ie=null}function Et(){if(null!==Ie)return null==Ie||Ie.close(),void(Ie=null);void 0!==xe&&xe.length>0&&(Ie=new c.default(Ne,Mt))}function Mt(){return o(this,void 0,void 0,(function*(){if(!xe.every((e=>e.actionType===r.ActionType.Full))&&((0,k.getIsLivePremiere)()||(0,h.isVisible)(document.querySelector(".ytp-live-badge"))))return alert(chrome.i18n.getMessage("liveOrPremiere")),!1;if(!te&&!xe.every((e=>[r.ActionType.Full,r.ActionType.Chapter,r.ActionType.Poi].includes(e.actionType)||e.segment[1]>=(0,k.getVideoDuration)()||0===e.segment[0])))return alert(`${chrome.i18n.getMessage("previewSegmentRequired")} ${(0,C.keybindToString)(i.default.config.previewKeybind)}`),!1;ke.submit.image.src=chrome.runtime.getURL("icons/PlayerUploadIconSponsorBlocker.svg");const e=m.AnimationUtils.applyLoadingAnimation(ke.submit.button,1,(()=>mt()));for(let e=0;e<xe.length;e++)xe[e].segment[1]>(0,k.getVideoDuration)()&&(xe[e].segment[1]=(0,k.getVideoDuration)());if(i.default.local.unsubmittedSegments[(0,k.getVideoID)()]=xe,i.default.forceLocalUpdate("unsubmittedSegments"),i.default.config.minDuration>0)for(let e=0;e<xe.length;e++){const t=xe[e].segment[1]-xe[e].segment[0];if(t>0&&t<i.default.config.minDuration){const e=chrome.i18n.getMessage("shortCheck")+"\n\n"+It(xe);if(!confirm(e))return!1}}const t=yield(0,O.asyncRequestToServer)("POST","/api/skipSegments",{videoID:(0,k.getVideoID)(),userID:i.default.config.userID,segments:xe,videoDuration:(0,k.getVideoDuration)(),userAgent:(0,w.extensionUserAgent)()});if(200===t.status){e(),delete i.default.local.unsubmittedSegments[(0,k.getVideoID)()],i.default.forceLocalUpdate("unsubmittedSegments");const n=xe;try{const e=JSON.parse(t.responseText);if((null==e?void 0:e.length)===n.length)for(let t=0;t<e.length;t++)n[t].UUID=e[t].UUID,n[t].source=r.SponsorSourceType.Server}catch(e){}$=($||[]).concat(n).sort(((e,t)=>e.segment[0]-t.segment[0])),i.default.config.sponsorTimesContributed=i.default.config.sponsorTimesContributed+xe.length,i.default.config.submissionCountSinceCategories=i.default.config.submissionCountSinceCategories+1,xe=[],Je();const o=$.filter((e=>e.actionType===r.ActionType.Full))[0];return o&&(null==we||we.setSegment(o)),!0}return ke.submit.button.style.animation="unset",ke.submit.image.src=chrome.runtime.getURL("icons/PlayerUploadFailedIconSponsorBlocker.svg"),403===t.status&&t.responseText.startsWith("Submission rejected due to a tip from a moderator.")?(0,S.openWarningDialog)(Ne):alert((0,T.getErrorMessage)(t.status,t.responseText)),!1}))}function It(e){let t="";for(let n=0;n<e.length;n++)for(let o=0;o<e[n].segment.length;o++){let i=(0,T.getFormattedTime)(e[n].segment[o]);1==o?i=" "+chrome.i18n.getMessage("to")+" "+i:n>0&&(i=", "+i),t+=i}return t}function Nt(e){var t;(null===(t=chrome.runtime)||void 0===t?void 0:t.id)&&(null==be||be.updateChapterText($,xe,e),chrome.runtime.sendMessage({message:"time",time:e}))}function Pt(e){var t,n,s;return o(this,void 0,void 0,(function*(){let o=null===(t=Q[0])||void 0===t?void 0:t.skipNoticeRef.current;if(null==o||o.onMouseEnter(),!o){const e=null===(n=[...$].reverse())||void 0===n?void 0:n.find((e=>e.source==r.SponsorSourceType.Server&&e.segment[0]<=(0,k.getCurrentTime)()&&(0,k.getCurrentTime)()-(e.segment[1]||e.segment[0])<=i.default.config.skipNoticeDuration));if(!e)return;st([e],dt(e),(null==e?void 0:e.segment[0])+.001,!1,!0),o=yield Q[0].waitForSkipNoticeRef(),null==o||o.reskippedMode(0)}Tt(e,null===(s=null==o?void 0:o.segments[0])||void 0===s?void 0:s.UUID,void 0,o)}))}function Dt(e){var t,n,o,s,a,l;if((["textarea","input"].includes(null===(n=null===(t=document.activeElement)||void 0===t?void 0:t.tagName)||void 0===n?void 0:n.toLowerCase())||(null===(o=document.activeElement)||void 0===o?void 0:o.isContentEditable)||(null===(l=null===(a=null===(s=document.activeElement)||void 0===s?void 0:s.id)||void 0===a?void 0:a.toLowerCase())||void 0===l?void 0:l.match(/editable|input/)))&&document.hasFocus())return;const u={key:e.key,code:e.code,alt:e.altKey,ctrl:e.ctrlKey,shift:e.shiftKey},c=i.default.config.skipKeybind,p=i.default.config.skipToHighlightKeybind,h=i.default.config.closeSkipNoticeKeybind,f=i.default.config.startSponsorKeybind,m=i.default.config.actuallySubmitKeybind,g=i.default.config.previewKeybind,v=i.default.config.submitKeybind,y=i.default.config.nextChapterKeybind,b=i.default.config.previousChapterKeybind,S=i.default.config.upvoteKeybind,w=i.default.config.downvoteKeybind;if((0,C.keybindEquals)(u,c))!J||J instanceof d.SkipButtonControlBar||J.toggleSkip.call(J);else if((0,C.keybindEquals)(u,p))Se&&Se.toggleSkip.call(Se);else{if((0,C.keybindEquals)(u,h)){for(let e=0;e<Q.length;e++)Q.pop().close();return null==X||X.close(),void(X=null)}if((0,C.keybindEquals)(u,f))vt();else if((0,C.keybindEquals)(u,m))void 0!==xe&&xe.length>0&&null!==Ie&&Ie.submit();else{if((0,C.keybindEquals)(u,v))return e.preventDefault(),void Et();if(!(0,C.keybindEquals)(u,g))return(0,C.keybindEquals)(u,y)?($.length>0&&e.stopPropagation(),void function(){var e;const t=null===(e=be.unfilteredChapterGroups)||void 0===e?void 0:e.filter((e=>[r.ActionType.Chapter,null].includes(e.actionType)));if(!t||t.length<=0)return;se.time=(0,k.getCurrentTime)(),se.date=Date.now();const n=t.findIndex((e=>e.segment[0]>(0,k.getCurrentTime)()));-1!==n?(0,k.setCurrentTime)(t[n].segment[0]):(0,k.setCurrentTime)((0,k.getVideoDuration)())}()):(0,C.keybindEquals)(u,b)?($.length>0&&e.stopPropagation(),void function(){var e;if(Date.now()-se.date<3e3)return(0,k.setCurrentTime)(se.time),void(se.date=0);const t=null===(e=be.unfilteredChapterGroups)||void 0===e?void 0:e.filter((e=>[r.ActionType.Chapter,null].includes(e.actionType)));if(!t||t.length<=0)return void(0,k.setCurrentTime)(0);const n=t.findIndex((e=>e.segment[0]>(0,k.getCurrentTime)()-Math.min(5,e.segment[1]-e.segment[0]))),o=-1!==n?n-1:t.length-1;-1!==o?(0,k.setCurrentTime)(t[o].segment[0]):(0,k.setCurrentTime)(0)}()):void((0,C.keybindEquals)(u,S)?Pt(1):(0,C.keybindEquals)(u,w)&&Pt(0));void 0!==xe&&xe.length>0&&(ot(xe[xe.length-1].segment[0]-V.defaultPreviewTime),Ie&&Ie.scrollToBottom())}}}function Lt(e){var t,n,o,r,s,a;if((["textarea","input"].includes(null===(n=null===(t=document.activeElement)||void 0===t?void 0:t.tagName)||void 0===n?void 0:n.toLowerCase())||(null===(o=document.activeElement)||void 0===o?void 0:o.isContentEditable)||(null===(a=null===(s=null===(r=document.activeElement)||void 0===r?void 0:r.id)||void 0===s?void 0:s.toLowerCase())||void 0===a?void 0:a.match(/editable|input/)))&&document.hasFocus())return;const l={key:e.key,code:e.code,alt:e.altKey,ctrl:e.ctrlKey,shift:e.shiftKey},u=i.default.config.nextChapterKeybind,c=i.default.config.previousChapterKeybind;(0,C.keybindEquals)(l,u)?$.length>0&&e.stopPropagation():(0,C.keybindEquals)(l,c)&&$.length>0&&e.stopPropagation()}function _t(){const e=(0,k.getIsAdPlaying)();(0,k.setIsAdPlaying)(document.getElementsByClassName("ad-showing").length>0),e!=(0,k.getIsAdPlaying)()&&(Je(),ft())}function At(){let e=document.getElementById("sbCategoryColorStyle");e||(e=document.createElement("style"),e.id="sbCategoryColorStyle",(0,D.isVorapisInstalled)()&&(e.className="stylus"),(document.head||document.documentElement).appendChild(e));let t=":root {";for(const[e,n]of Object.entries(i.default.config.barTypes)){t+=`--sb-category-${e}: ${n.color};`,t+=`--darkreader-bg--sb-category-${e}: ${n.color};`;const o=g.GenericUtils.getLuminance(n.color);t+=`--sb-category-text-${e}: ${o>128?"black":"white"};`,t+=`--darkreader-text--sb-category-text-${e}: ${o>128?"black":"white"};`}t+="}",e.innerText=t}},9695:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.hideDeArrowPromotion=t.tryShowingDeArrowPromotion=void 0,n(1108),n(8423),n(3262),n(3683),n(8856),n(2246),n(8249),n(3726),n(6062);t.tryShowingDeArrowPromotion=function(){return o(this,void 0,void 0,(function*(){}))},t.hideDeArrowPromotion=function(){}},9268:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(8856),i=n(9209),r=n(3126),s=n(1575),a=n(7621),l=n(4148),u=n(2184),c=n(3726),d=n(4982),p=n(3683),h=n(6417),f="sponsorCategoryTooltipVisible";t.default=class{constructor(e,t,n,o,i,r,s=!1){this.lastSmallestSegment={},this.segments=[],this.hasYouTubeChapters=!1,this.existingChapters=[],this.videoDuration=0,this.lastChapterUpdate=0,s||(this.container=document.createElement("ul"),this.container.id="previewbar",o&&this.container.classList.add("sponsorblock-yttv-container"),this.parent=e,this.onMobileYouTube=t,this.onInvidious=n,this.onYTTV=o,this.chapterVote=i,this.updateExistingChapters=r,this.updatePageElements(),this.createElement(e),this.createChapterMutationObservers(),this.setupHoverText())}setupHoverText(){var e;if(this.onMobileYouTube||this.onInvidious)return;document.querySelectorAll(".sponsorCategoryTooltip").forEach((e=>e.remove())),this.categoryTooltip=document.createElement("div"),(0,p.isOnYTTV)()?this.categoryTooltip.className="sponsorCategoryTooltip":this.categoryTooltip.className="ytp-tooltip-title sponsorCategoryTooltip",this.chapterTooltip=document.createElement("div"),(0,p.isOnYTTV)()?this.chapterTooltip.className="sponsorCategoryTooltip":this.chapterTooltip.className="ytp-tooltip-title sponsorCategoryTooltip",(0,p.isOnYTTV)()&&(this.categoryScrubTooltip=document.createElement("div"),this.categoryScrubTooltip.className="sponsorCategoryTooltip",this.chapterScrubTooltip=document.createElement("div"),this.chapterScrubTooltip.className="sponsorCategoryTooltip");const t=null!==(e=document.querySelector(".ytp-tooltip-text-wrapper, .ytp-progress-tooltip-text-container, .yssi-slider .ys-seek-details .time-info-bar"))&&void 0!==e?e:document.querySelector("#progress-bar-container.ytk-player > #hover-time-info"),n=(0,l.findNonEmptyElement)([".ytp-tooltip-title:not(.sponsorCategoryTooltip), .ytp-progress-tooltip-text:not(.sponsorCategoryTooltip), .current-time:not(.sponsorCategoryTooltip)",".ytp-tooltip-progress-bar-pill-title"]);if(!t||!t.parentElement)return;this.categoryTooltipContainer=t.parentElement;const s=t.querySelector(".ytp-tooltip-title, .ytp-progress-tooltip-text, .current-time");if(!this.categoryTooltipContainer||!s)return;if(t.insertBefore(this.categoryTooltip,s.nextSibling),t.insertBefore(this.chapterTooltip,s.nextSibling),(0,p.isOnYTTV)()){const e=document.querySelector(".yssi-slider .ysl-filmstrip-lens .time-info-bar");if(!this.categoryTooltipContainer)return;e.appendChild(this.categoryScrubTooltip),e.appendChild(this.chapterScrubTooltip)}const u=document.querySelector(".ytp-progress-bar-container, .ypcs-scrub-slider-slot.ytu-player-controls");if(!u)return;let h=!1;u.addEventListener("mouseenter",(()=>{h=!0})),u.addEventListener("mouseleave",(()=>{h=!1})),u.addEventListener("mousemove",(e=>{var l;if(!(h&&this.categoryTooltip&&this.categoryTooltipContainer&&(null===(l=chrome.runtime)||void 0===l?void 0:l.id)))return;let p=!!t.querySelector(".ytp-tooltip-text.ytp-tooltip-text-no-title, .ytp-progress-tooltip-timestamp");const m=this.decimalToTime((e.clientX-u.getBoundingClientRect().x)/u.clientWidth),[g,v]=(0,r.partition)(this.segments,(e=>e.actionType!==i.ActionType.Chapter));let y=this.getSmallestSegment(m,g,"normal"),b=this.getSmallestSegment(m,v,"chapter");null===y&&null!==b&&(y=b,b=this.getSmallestSegment(m,v.filter((e=>e!==b))));const S=this.hasYouTubeChapters||!o.default.config.showAutogeneratedChapters&&(0,c.hasAutogeneratedChapters)();S&&(n.style.display="none",p=!0),null===y&&null===b?(S||(this.categoryTooltipContainer.classList.remove(f),n.style.removeProperty("display")),this.onYTTV&&(this.setTooltipTitle(y,this.categoryTooltip),this.setTooltipTitle(b,this.chapterTooltip),this.setTooltipTitle(y,this.categoryScrubTooltip),this.setTooltipTitle(b,this.chapterScrubTooltip)),this.categoryTooltipContainer.classList.remove("sponsorHasOriginalTooltip")):(this.categoryTooltipContainer.classList.add(f),null!==y&&null!==b?this.categoryTooltipContainer.classList.add("sponsorTwoTooltips"):this.categoryTooltipContainer.classList.remove("sponsorTwoTooltips"),this.setTooltipTitle(y,this.categoryTooltip),this.setTooltipTitle(b,this.chapterTooltip),this.onYTTV&&(this.setTooltipTitle(y,this.categoryScrubTooltip),this.setTooltipTitle(b,this.chapterScrubTooltip)),(0,d.isVorapisInstalled)()&&t.parentElement.classList.add("with-text"),(0,a.normalizeChapterName)(n.textContent)!==(0,a.normalizeChapterName)(this.categoryTooltip.textContent)&&(0,a.normalizeChapterName)(n.textContent)!==(0,a.normalizeChapterName)(this.chapterTooltip.textContent)&&n.textContent?"none"===n.style.display&&(n.style.removeProperty("display"),this.categoryTooltipContainer.classList.add("sponsorHasOriginalTooltip"),p=!1):("none"!==n.style.display&&(n.style.display="none"),this.categoryTooltipContainer.classList.remove("sponsorHasOriginalTooltip"),p=!0),this.categoryTooltip.style.right=s.style.right,this.chapterTooltip.style.right=s.style.right,this.categoryTooltip.style.textAlign=s.style.textAlign,this.chapterTooltip.style.textAlign=s.style.textAlign),this.categoryTooltip.classList.toggle("ytp-tooltip-text-no-title",p),this.chapterTooltip.classList.toggle("ytp-tooltip-text-no-title",p)}))}setTooltipTitle(e,t){if(e){const n=e.description||(0,s.shortCategoryName)(e.category);e.unsubmitted?t.textContent=chrome.i18n.getMessage("unsubmitted")+" "+n:t.textContent=n,t.style.removeProperty("display"),document.querySelector(".ytp-delhi-modern")&&(t.style.display="inline-block",t.style.removeProperty("top"),t.classList.remove("ytp-tooltip-text-no-title"),t===this.chapterTooltip?t.style.top=`calc(${window.getComputedStyle(t).getPropertyValue("top")} + 5px)`:t.style.top=window.getComputedStyle(t).getPropertyValue("top"))}else t.style.display="none"}createElement(e){e&&(this.parent=e),this.onMobileYouTube?this.container.style.transform="none":this.onInvidious||this.container.classList.add("sbNotInvidious"),this.onYTTV?this.parent.insertBefore(this.container,this.parent.firstChild.nextSibling.nextSibling):this.parent.prepend(this.container)}clear(){for(var e,t,n;this.container.firstChild;)this.container.removeChild(this.container.firstChild);this.customChaptersBar&&(this.customChaptersBar.style.display="none"),null===(t=null===(e=this.originalChapterBar)||void 0===e?void 0:e.style)||void 0===t||t.removeProperty("display"),null===(n=this.chapterVote)||void 0===n||n.setVisibility(!1),document.querySelectorAll(".sponsorBlockChapterBar").forEach((e=>{e!==this.customChaptersBar&&e.remove()}))}set(e,t){var n,o;this.segments=null!=e?e:[],this.videoDuration=null!=t?t:0,this.hasYouTubeChapters=e.some((e=>[i.SponsorSourceType.YouTube,i.SponsorSourceType.Autogenerated].includes(e.source)));for(const e of this.segments.filter((e=>e.actionType===i.ActionType.Chapter&&e.source===i.SponsorSourceType.Server))){const t=e.segment[1]-e.segment[0],n=this.segments.find((n=>n.actionType===i.ActionType.Chapter&&[i.SponsorSourceType.YouTube,i.SponsorSourceType.Autogenerated].includes(n.source)&&Math.abs(n.segment[0]-e.segment[0])<Math.min(3,t/3)&&Math.abs(n.segment[1]-e.segment[1])<Math.min(3,t/3)));if(n){const e=this.segments.indexOf(n);this.segments.splice(e,1)}}this.updatePageElements();const r=null!==(o=parseInt(null===(n=this.progressBar)||void 0===n?void 0:n.getAttribute("aria-valuemax")))&&void 0!==o?o:0;!([...document.querySelectorAll("video")].filter((e=>(0,c.isVisible)(e))).length>1)&&r&&Math.abs(r-this.videoDuration)>3&&(this.videoDuration=r),this.update()}updatePageElements(){var e,t,n;const o=document.querySelectorAll(".ytp-progress-bar, .ytp-progress-bar-container > .html5-progress-bar > .ytp-progress-list");if(this.progressBar=null!==(e=(0,l.findValidElement)(o))&&void 0!==e?e:null==o?void 0:o[0],this.progressBar){const e=this.progressBar.querySelector(".ytp-chapters-container:not(.sponsorBlockChapterBar)");this.originalChapterBar!==e&&(null===(n=null===(t=this.originalChapterBar)||void 0===t?void 0:t.style)||void 0===n||n.removeProperty("display"),this.originalChapterBar=e)}}update(){var e,t,n,o,r,s;this.clear();const a=this.getChapterChevron();if(this.segments||null===(e=null==a?void 0:a.style)||void 0===e||e.removeProperty("display"),this.chapterMargin=2,this.originalChapterBar&&(this.originalChapterBarBlocks=this.originalChapterBar.querySelectorAll(":scope > div"),this.existingChapters=this.segments.filter((e=>[i.SponsorSourceType.YouTube,i.SponsorSourceType.Autogenerated].includes(e.source))).sort(((e,t)=>e.segment[0]-t.segment[0])),(null===(t=this.existingChapters)||void 0===t?void 0:t.length)>0)){const e=parseFloat(null===(s=null===(r=null===(o=null===(n=this.originalChapterBarBlocks)||void 0===n?void 0:n[0])||void 0===o?void 0:o.style)||void 0===r?void 0:r.marginRight)||void 0===s?void 0:s.replace("px",""));e&&(this.chapterMargin=e)}const l=this.segments.sort((({segment:e},{segment:t})=>t[1]-t[0]-(e[1]-e[0])));for(const e of l){if(e.actionType===i.ActionType.Chapter)continue;const t=this.createBar(e);this.container.appendChild(t)}this.createChaptersBar(this.segments.sort(((e,t)=>e.segment[0]-t.segment[0]))),a&&(this.segments.some((e=>[i.SponsorSourceType.YouTube,i.SponsorSourceType.Autogenerated].includes(e.source)))?a.style.removeProperty("display"):this.segments&&(a.style.display="none"))}createBar(e){var t;const{category:n,unsubmitted:i,segment:r,showLarger:s}=e,a=document.createElement("li");a.classList.add("previewbar"),e.requiredSegment&&a.classList.add("requiredSegment"),e.selectedSegment&&a.classList.add("selectedSegment"),a.innerHTML=s?"&nbsp;&nbsp;":"&nbsp;";const l=(i?"preview-":"")+n;a.setAttribute("sponsorblock-category",l),a.style.backgroundColor=`var(--sb-category-${l})`,this.onMobileYouTube||(a.style.opacity=null===(t=o.default.config.barTypes[l])||void 0===t?void 0:t.opacity),a.style.position="absolute";const u=Math.min(r[1],this.videoDuration)-r[0],c=r[1]?Math.min(this.videoDuration,r[0]):r[0],d=Math.min(this.videoDuration,r[1]);return a.style.left=this.timeToPercentage(c),u>0&&(a.style.right=this.timeToRightPercentage(d)),this.chapterFilter(e)&&r[1]<this.videoDuration&&(a.style.marginRight=`${this.chapterMargin}px`),this.onYTTV&&a.classList.add("previewbar-yttv"),a}createChaptersBar(e){var t;if(!this.progressBar||!this.originalChapterBar||this.originalChapterBar.childElementCount<=0)return this.originalChapterBar&&this.originalChapterBar.style.removeProperty("display"),document.querySelectorAll(".sponsorBlockChapterBar").forEach((e=>e.remove())),void(this.customChaptersBar=null);const n=e!==this.lastRenderedSegments;if(n&&(this.lastRenderedSegments=e,this.unfilteredChapterGroups=this.createChapterRenderGroups(e)),(e.every((e=>[i.SponsorSourceType.YouTube,i.SponsorSourceType.Autogenerated].includes(e.source)))||!o.default.config.renderSegmentsAsChapters&&e.every((e=>e.actionType!==i.ActionType.Chapter||[i.SponsorSourceType.YouTube,i.SponsorSourceType.Autogenerated].includes(e.source))))&&(!(0,c.hasAutogeneratedChapters)()||o.default.config.showAutogeneratedChapters))return this.customChaptersBar&&(this.customChaptersBar.style.display="none"),void this.originalChapterBar.style.removeProperty("display");const r=null==e?void 0:e.filter((e=>this.chapterFilter(e)));if(r){let t=this.unfilteredChapterGroups;if(r.length!==e.length&&(t=this.createChapterRenderGroups(r)),this.chapterGroups=t.filter((e=>this.chapterGroupFilter(e))),t.length!==this.chapterGroups.length)for(let e=1;e<this.chapterGroups.length;e++)this.chapterGroups[e].segment[0]!==this.chapterGroups[e-1].segment[1]&&(this.chapterGroups[e-1].segment[1]=this.chapterGroups[e].segment[0])}else this.chapterGroups=this.unfilteredChapterGroups;if(0===this.chapterGroups.length&&!o.default.config.showAutogeneratedChapters&&(0,c.hasAutogeneratedChapters)()&&(this.chapterGroups=[{segment:[0,this.videoDuration],originalDuration:0,actionType:null}]),!this.chapterGroups||this.chapterGroups.length<=0)return this.customChaptersBar&&(this.customChaptersBar.style.display="none"),void this.originalChapterBar.style.removeProperty("display");let s=!1;this.customChaptersBar&&this.progressBar.contains(this.customChaptersBar)||(document.querySelectorAll(".sponsorBlockChapterBar").forEach((e=>e.remove())),s=!0,this.customChaptersBar=this.originalChapterBar.cloneNode(!0),this.customChaptersBar.classList.add("sponsorBlockChapterBar")),this.customChaptersBar.style.display="none";const a=this.customChaptersBar.querySelectorAll(".ytp-chapter-hover-container"),l=a[0];if(a.length>this.chapterGroups.length)for(let e=a.length-1;e>=this.chapterGroups.length;e--)this.customChaptersBar.removeChild(a[e]);for(let e=0;e<this.chapterGroups.length;e++){const t=this.chapterGroups[e].segment;let n=a[e];n?s&&this.firstTimeSetupChapterSection(n):(n=l.cloneNode(!0),this.firstTimeSetupChapterSection(n),this.customChaptersBar.appendChild(n)),this.setupChapterSection(n,t[0],t[1],e!==this.chapterGroups.length-1)}this.originalChapterBar.style.display="none",this.customChaptersBar.style.removeProperty("display"),s&&((null===(t=this.container)||void 0===t?void 0:t.parentElement)===this.progressBar?this.progressBar.insertBefore(this.customChaptersBar,this.container.nextSibling):this.progressBar.prepend(this.customChaptersBar)),n&&this.updateChapterAllMutation(this.originalChapterBar,this.progressBar,!0)}createChapterRenderGroups(e){const t=[];return null==e||e.forEach(((n,o)=>{var i;const r=t[t.length-1];if(r&&r.segment[1]>n.segment[0]){const e=n.segment[1]-n.segment[0];if(n.segment[0]<r.segment[0]||e<r.originalDuration){let o=r;const i=[];for(;(null==o?void 0:o.segment[0])>=n.segment[0];){const e=t.pop();e.segment[1]>n.segment[1]&&(e.segment[0]===n.segment[0]&&(e.segment[0]=n.segment[1]),i.push(e)),o=t[t.length-1]}const s=this.getActionTypePrioritized([n.actionType,null==r?void 0:r.actionType]);t.push({segment:[n.segment[0],n.segment[1]],originalDuration:e,actionType:s}),(null==o?void 0:o.segment[1])>n.segment[1]&&t.push({segment:[n.segment[1],o.segment[1]],originalDuration:o.originalDuration,actionType:o.actionType}),i.reverse();let a=n.segment;for(const e of i)e.segment[0]<a[1]&&(e.segment[0]=a[1]),a=e.segment;t.push(...i),o&&(o.segment[1]=n.segment[0])}else t.push({segment:[r.segment[1],n.segment[1]],originalDuration:e,actionType:n.actionType})}else{const e=(null==r?void 0:r.segment[1])||0;n.segment[0]>e&&t.push({segment:[e,n.segment[0]],originalDuration:0,actionType:null});const o=Math.min(n.segment[1],this.videoDuration);t.push({segment:[n.segment[0],o],originalDuration:o-n.segment[0],actionType:n.actionType})}if(o===e.length-1){const r=e[o+1],s=r?r.segment[0]:this.videoDuration,a=(null===(i=t[t.length-1])||void 0===i?void 0:i.segment[1])||n.segment[1];this.intervalToDecimal(a,s)>.003&&t.push({segment:[a,s],originalDuration:0,actionType:null})}})),t}getActionTypePrioritized(e){var t;return e.includes(i.ActionType.Skip)?i.ActionType.Skip:e.includes(i.ActionType.Mute)?i.ActionType.Mute:null!==(t=e.find((e=>e)))&&void 0!==t?t:e[0]}setupChapterSection(e,t,n,o){const i=this.intervalToPercentage(t,n);o?(e.style.marginRight=`${this.chapterMargin}px`,e.style.width=`calc(${i} - ${this.chapterMargin}px)`):(e.style.marginRight="0",e.style.width=i),e.setAttribute("decimal-width",String(this.intervalToDecimal(t,n)))}firstTimeSetupChapterSection(e){e.addEventListener("mouseenter",(()=>{var t;null===(t=this.hoveredSection)||void 0===t||t.classList.remove("ytp-exp-chapter-hover-effect"),e.classList.add("ytp-exp-chapter-hover-effect"),this.hoveredSection=e}))}createChapterMutationObservers(){if(!this.progressBar||!this.originalChapterBar)return;const e=new MutationObserver((e=>{var t;const n={};for(const o of e){const e=o.target;"attributes"===o.type&&(null===(t=e.parentElement)||void 0===t?void 0:t.classList.contains("ytp-progress-list"))&&(n[e.classList[0]]=o.target)}this.updateChapterMutation(n,this.progressBar)}));e.observe(this.originalChapterBar,{subtree:!0,attributes:!0,attributeFilter:["style","class"]});const t=new MutationObserver((e=>{for(const t of e)if("childList"===t.type){this.update();break}this.updateChapterMutation({},this.progressBar)}));t.observe(this.originalChapterBar,{childList:!0}),(0,u.addCleanupListener)((()=>{e.disconnect(),t.disconnect()}))}updateChapterAllMutation(e,t,n=!1){const o=e.querySelectorAll(".ytp-progress-list > *"),i={};for(const e of o)i[e.classList[0]]=e;this.updateChapterMutation(i,t,n)}updateChapterMutation(e,t,n=!1){var o;if(this.customChaptersBar){let i=0;const r=this.customChaptersBar.querySelectorAll(".ytp-chapter-hover-container");for(let o=0;o<r.length;o++){const s=r[o],a=parseFloat(s.getAttribute("decimal-width")),l=a-this.chapterMargin/t.clientWidth;for(const u in e){const c=`.${u}`,d=s.querySelector(c);if(d){const s=o===r.length-1?a:l,p=e[u],h=this.findLeftAndScale(c,p,t),f=h.left/t.clientWidth,m=Math.max(0,Math.min(1,(f-i)/s));if(isNaN(f)||isNaN(m)||(d.style.left=100*m+"%",d.style.removeProperty("display")),null!==h.scale){const e=h.scale/t.clientWidth,o=Math.max(0,Math.min(1-m,(e-i)/s-m));if(d.style.transform=`scaleX(${o})`,d.style.backgroundSize){const e=Math.max(h.scale/o,s*t.clientWidth);d.style.backgroundSize=`${e}px`,h.scale<(i+s)*t.clientWidth?d.style.backgroundPosition=`-${e-s*t.clientWidth}px`:d.style.backgroundPosition=`-${i*t.clientWidth}px`}n&&(d.style.transition="none",setTimeout((()=>d.style.removeProperty("transition")),50))}d.className!==p.className&&(d.className=p.className)}}i+=a}0!==r.length&&r.length!==(null===(o=this.existingChapters)||void 0===o?void 0:o.length)&&Date.now()-this.lastChapterUpdate>3e3&&(this.lastChapterUpdate=Date.now(),this.updateExistingChapters())}}findLeftAndScale(e,t,n){var o;const i=t.parentElement.parentElement.parentElement.children;let r=0,s=0,a=0,l=0,u=null,c=0,d=0,p=0;for(let t=0;t<i.length;t++){const h=i[t],f=h.querySelector(e),m=null!==(o=this.getPartialChapterSectionStyle(h,"width"))&&void 0!==o?o:n.clientWidth,g=m+this.getPartialChapterSectionStyle(h,"marginRight"),v=parseFloat(f.style.left.replace("px",""));0!==v&&(a=v,l=r);const y=f.style.transform.match(/scaleX\(([0-9.]+?)\)/);if(y){const e=parseFloat(y[1]),n=e+v/m;if(p>.99999&&0===n){c=r-s;break}if(p=n,u=e,d=m,(t===i.length-1||n<.99999)&&n>0){c=r,0!==v&&(c+=a);break}}s=g,r+=s}return{left:a+l,scale:null!==u?u*d+c:null}}getPartialChapterSectionStyle(e,t){var n;const o=e.style[t];return(null==o?void 0:o.includes("%"))?this.customChaptersBar.clientWidth*(parseFloat(o.replace("%",""))/100):parseInt(null===(n=e.style[t].match(/\d+/g))||void 0===n?void 0:n[0])||0}updateChapterText(e,t,n){var r;if(!o.default.config.showSegmentNameInChapterBar||o.default.config.disableSkipping||(!e||e.length<=0)&&(null==t?void 0:t.length)<=0&&(o.default.config.showAutogeneratedChapters||!(0,c.hasAutogeneratedChapters)())){const e=this.getChaptersContainer();return e&&(null===(r=e.querySelector(".sponsorChapterText"))||void 0===r||r.remove(),e.querySelector(".ytp-chapter-title-content").style.removeProperty("display"),e.classList.remove("sponsorblock-chapter-visible")),[]}null!=e||(e=[]),(null==t?void 0:t.length)>0&&(e=e.concat(t));const a=e.filter((e=>e.hidden===i.SponsorHideType.Visible&&e.segment[0]<=n&&e.segment[1]>n&&e.category!==s.DEFAULT_CATEGORY&&(0,h.getCategorySelection)(e).option!==i.CategorySkipOption.Disabled));return this.setActiveSegments(a),a}setActiveSegments(e){var t,n;const r=this.getChaptersContainer();if(r)if(e.length>0){r.classList.add("sponsorblock-chapter-visible");const t=e.sort(((e,t)=>e.actionType===i.ActionType.Chapter&&t.actionType!==i.ActionType.Chapter?-1:e.actionType!==i.ActionType.Chapter&&t.actionType===i.ActionType.Chapter?1:e.actionType===i.ActionType.Chapter&&t.actionType===i.ActionType.Chapter&&e.source===i.SponsorSourceType.Server&&t.source!==i.SponsorSourceType.Server?-.5:e.actionType===i.ActionType.Chapter&&t.actionType===i.ActionType.Chapter&&e.source!==i.SponsorSourceType.Server&&t.source===i.SponsorSourceType.Server?.5:4*(t.segment[0]-e.segment[0])))[0],n=this.getChapterButton(r);n&&(n.classList.remove("ytp-chapter-container-disabled"),n.disabled=!1);const o=r.querySelector(".ytp-chapter-title-content");if(o.style.display="none",(o.parentElement.querySelector(".sponsorChapterText")||(()=>{const e=document.createElement("div");return o.parentElement.insertBefore(e,o),e.classList.add("sponsorChapterText"),"tv.youtube.com"===document.location.host&&(e.style.lineHeight="initial"),e})()).innerText=t.description||(0,s.shortCategoryName)(t.category),t.actionType!==i.ActionType.Chapter?o.classList.add("sponsorBlock-segment-title"):o.classList.remove("sponsorBlock-segment-title"),t.source===i.SponsorSourceType.Server){const e=this.chapterVote.getContainer();if("tv.youtube.com"===document.location.host){if(!r.contains(e)){const t=document.querySelectorAll("#chapterVote");t.length>0&&t.forEach((e=>e.remove())),r.appendChild(e)}}else if(!n.contains(e)){const t=document.querySelectorAll("#chapterVote");t.length>0&&t.forEach((e=>e.remove())),n.insertBefore(e,this.getChapterChevron())}this.chapterVote.setVisibility(!0),this.chapterVote.setSegment(t)}else this.chapterVote.setVisibility(!1)}else if(!o.default.config.showAutogeneratedChapters&&(0,c.hasAutogeneratedChapters)()){null===(t=r.querySelector(".sponsorChapterText"))||void 0===t||t.remove(),r.querySelector(".ytp-chapter-title-content").style.display="none",r.classList.remove("sponsorblock-chapter-visible");const e=r.querySelector(".ytp-chapter-title-prefix");e&&(e.style.display="none"),this.chapterVote.setVisibility(!1)}else null===(n=r.querySelector(".sponsorChapterText"))||void 0===n||n.remove(),r.querySelector(".ytp-chapter-title-content").style.removeProperty("display"),r.classList.remove("sponsorblock-chapter-visible"),this.chapterVote.setVisibility(!1)}getChaptersContainer(){if("tv.youtube.com"===document.location.host&&!document.querySelector(".ytp-chapter-container")){const e=document.querySelector(".ypcs-control-buttons-left");if(!e)return null;const t=document.createElement("div");t.className="ytp-chapter-container";const n=document.createElement("div");n.className="ytp-chapter-title-content",t.appendChild(n),e.appendChild(t)}return document.querySelector(".ytp-chapter-container")}getChapterButton(e){var t;return null===(t=null!=e?e:this.getChaptersContainer())||void 0===t?void 0:t.querySelector("button.ytp-chapter-title")}remove(){this.container.remove(),this.categoryTooltip&&(this.categoryTooltip.remove(),this.categoryTooltip=void 0),this.categoryTooltipContainer&&(this.categoryTooltipContainer.classList.remove(f),this.categoryTooltipContainer=void 0)}chapterFilter(e){return(o.default.config.renderSegmentsAsChapters||e.actionType===i.ActionType.Chapter)&&e.actionType!==i.ActionType.Poi&&this.chapterGroupFilter(e)}chapterGroupFilter(e){return 2===e.segment.length&&this.intervalToDecimal(e.segment[0],e.segment[1])>.003}intervalToPercentage(e,t){return 100*this.intervalToDecimal(e,t)+"%"}intervalToDecimal(e,t){return this.timeToDecimal(t)-this.timeToDecimal(e)}timeToPercentage(e){return 100*this.timeToDecimal(e)+"%"}timeToRightPercentage(e){return 100*(1-this.timeToDecimal(e))+"%"}timeToDecimal(e){return this.decimalTimeConverter(e,!0)}decimalToTime(e){return this.decimalTimeConverter(e,!1)}decimalTimeConverter(e,t){var n,o;if((null===(n=this.originalChapterBarBlocks)||void 0===n?void 0:n.length)>1&&this.existingChapters.length===(null===(o=this.originalChapterBarBlocks)||void 0===o?void 0:o.length)){const n=this.originalChapterBar.parentElement.clientWidth;let o=0,i=-1;for(let r=0;r<this.originalChapterBarBlocks.length;r++){const s=this.originalChapterBarBlocks[r],a=parseFloat(s.style.width.replace("px","")),l=s.style.marginRight?parseFloat(s.style.marginRight.replace("px","")):0;if(!(t&&e>=this.existingChapters[r].segment[1]||!t&&e>=(o+a+l)/n))break;o+=a+l,i=r}const r=this.existingChapters[i+1];if(r){const s=parseFloat(this.originalChapterBarBlocks[i+1].style.width.replace("px","")),a=r.segment[1]-r.segment[0];if(t){const t=(e-r.segment[0])/a,i=s/n;return Math.min(1,o/n+t*i)}{const t=(e*n-o)/s;return Math.max(0,r.segment[0]+t*a)}}}return t?Math.min(1,e/this.videoDuration):Math.max(0,e*this.videoDuration)}getMinimumSize(e=!1){return this.videoDuration*(e?.006:.003)}getSmallestSegment(e,t,n){var o;const i=n?null===(o=this.lastSmallestSegment[n])||void 0===o?void 0:o.index:null,r=i&&t[i]===this.lastSmallestSegment[n].segment?i:0,s=r>0&&e<this.lastSmallestSegment[n].segment.segment[0]?-1:1;let a=null,l=-1,u=1/0;for(let n=r;n<t.length&&n>=0;n+=s){const o=t[n],i=o.segment[1]-o.segment[0],r=this.getMinimumSize(o.showLarger),c=0!==i?o.segment[0]:Math.floor(o.segment[0]),d=i>r?o.segment[1]:Math.ceil(o.segment[0]+r);if(c<=e&&d>=e&&i<u&&(u=i,a=o,l=n),1===s&&o.segment[0]>e)break}return a&&(this.lastSmallestSegment[n]={index:l,segment:a}),a}getChapterChevron(){return document.querySelector(".ytp-chapter-title-chevron")}}},8480:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SkipButtonControlBar=void 0;const o=n(8856),i=n(1575),r=n(3225),s=n(1740),a=n(2869);t.SkipButtonControlBar=class{constructor(e){this.showKeybindHint=!0,this.enabled=!1,this.duration=0,this.left=0,this.swipeStart=0,this.skip=e.skip,this.onMobileYouTube=e.onMobileYouTube,this.onYTTV=e.onYTTV,this.container=document.createElement("div"),this.container.classList.add("skipButtonControlBarContainer"),this.container.classList.add("sbhidden"),this.onMobileYouTube&&this.container.classList.add("mobile"),this.skipIcon=document.createElement("img"),this.skipIcon.src=chrome.runtime.getURL("icons/skipIcon.svg"),this.skipIcon.classList.add("ytp-button"),this.skipIcon.id="sbSkipIconControlBarImage",this.onYTTV&&(this.skipIcon.style.width="24px",this.skipIcon.style.height="24px"),this.textContainer=document.createElement("div"),this.container.appendChild(this.skipIcon),this.container.appendChild(this.textContainer),this.container.addEventListener("click",(()=>this.toggleSkip())),this.container.addEventListener("mouseenter",(()=>{this.stopTimer(),this.segment&&e.selectSegment(this.segment.UUID)})),this.container.addEventListener("mouseleave",(()=>{this.startTimer(),e.selectSegment(null)})),this.onMobileYouTube&&(this.container.addEventListener("touchstart",(e=>this.handleTouchStart(e))),this.container.addEventListener("touchmove",(e=>this.handleTouchMove(e))),this.container.addEventListener("touchend",(()=>this.handleTouchEnd())))}getElement(){return this.container}attachToPage(){const e=this.getMountingContainer();if(this.chapterText=document.querySelector(".ytp-chapter-container"),e&&!e.contains(this.container))if(this.onMobileYouTube||this.onYTTV?e.appendChild(this.container):e.insertBefore(this.container,this.chapterText),this.onMobileYouTube){const{hide:t,show:n}=r.AnimationUtils.setupCustomHideAnimation(this.skipIcon,e,!1,!1);this.hideButton=t,this.showButton=n}else r.AnimationUtils.setupAutoHideAnimation(this.skipIcon,e,!1,!1)}getMountingContainer(){return this.onMobileYouTube||this.onYTTV?this.onYTTV?document.querySelector(".ypcs-control-buttons-left"):document.getElementById("player-container-id"):document.querySelector(".ytp-left-controls")}enable(e,t){var n,o,i,s;t&&(this.duration=t),this.segment=e,this.enabled=!0,this.refreshText(),null===(o=null===(n=this.container)||void 0===n?void 0:n.classList)||void 0===o||o.remove("textDisabled"),null===(s=null===(i=this.textContainer)||void 0===i?void 0:i.classList)||void 0===s||s.remove("sbhidden"),r.AnimationUtils.disableAutoHideAnimation(this.skipIcon),this.startTimer()}refreshText(){var e,t;this.segment&&(null===(t=null===(e=this.chapterText)||void 0===e?void 0:e.classList)||void 0===t||t.add("sbhidden"),this.container.classList.remove("sbhidden"),this.textContainer.innerText=this.getTitle(),this.skipIcon.setAttribute("title",this.getTitle()))}setShowKeybindHint(e){this.showKeybindHint=e,this.refreshText()}stopTimer(){this.timeout&&clearTimeout(this.timeout)}startTimer(){this.stopTimer(),this.timeout=setTimeout((()=>this.disableText()),1e3*Math.max(o.default.config.skipNoticeDuration,this.duration))}disable(){var e,t,n,o;this.container.classList.add("sbhidden"),null===(t=null===(e=this.chapterText)||void 0===e?void 0:e.classList)||void 0===t||t.remove("sbhidden"),null===(o=null===(n=this.getChapterPrefix())||void 0===n?void 0:n.classList)||void 0===o||o.remove("sbhidden"),this.enabled=!1}isEnabled(){return this.enabled}toggleSkip(){this.segment&&this.enabled&&(this.skip(this.segment),this.disableText())}disableText(){var e,t,n,i,s,a;o.default.config.hideSkipButtonPlayerControls?this.disable():(this.container.classList.add("textDisabled"),null===(t=null===(e=this.textContainer)||void 0===e?void 0:e.classList)||void 0===t||t.add("sbhidden"),null===(i=null===(n=this.chapterText)||void 0===n?void 0:n.classList)||void 0===i||i.remove("sbhidden"),null===(a=null===(s=this.getChapterPrefix())||void 0===s?void 0:s.classList)||void 0===a||a.add("sbhidden"),r.AnimationUtils.enableAutoHideAnimation(this.skipIcon),this.onMobileYouTube&&this.hideButton())}updateMobileControls(){this.enabled&&((0,a.isMobileControlsOpen)()?this.showButton():this.hideButton())}getTitle(){return(0,i.getSkippingText)([this.segment],!1)+(this.showKeybindHint?" ("+(0,s.keybindToString)(o.default.config.skipToHighlightKeybind)+")":"")}getChapterPrefix(){return document.querySelector(".ytp-chapter-title-prefix")}handleTouchStart(e){this.swipeStart=e.touches[0].clientX}handleTouchMove(e){const t=this.swipeStart-e.touches[0].clientX;this.left=Math.min(-t,0),this.updateLeftStyle()}handleTouchEnd(){this.left<-this.container.offsetWidth/2&&(this.disableText(),this.skipIcon.style.display="none",setTimeout((()=>this.skipIcon.style.removeProperty("display")),200)),this.left=0,this.updateLeftStyle()}updateLeftStyle(){this.container.style.left=this.left+"px"}}},6846:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.CategoryPill=void 0;const i=n(6540),r=n(5338),s=n(421),a=n(8856),l=n(2246),u=n(1108),c=n(8423),d=n(2184);t.CategoryPill=class{constructor(){this.ref=i.createRef(),(0,d.addCleanupListener)((()=>{this.mutationObserver&&this.mutationObserver.disconnect()}))}attachToPage(e,t,n){return o(this,void 0,void 0,(function*(){this.onMobileYouTube=e,this.onInvidious=t,this.vote=n,this.attachToPageInternal()}))}attachToPageInternal(){return o(this,void 0,void 0,(function*(){let e=yield(0,u.waitFor)((()=>(0,c.getYouTubeTitleNode)()));const t=document.querySelector("#title #description");if(t&&(e=e.parentElement),e&&!e.contains(this.container)){this.container||(this.container=document.createElement("span"),this.container.id="categoryPill",this.container.style.display="relative",this.root=(0,r.createRoot)(this.container),this.ref=i.createRef(),this.root.render(i.createElement(s.default,{ref:this.ref,vote:this.vote,showTextByDefault:!this.onMobileYouTube,showTooltipOnClick:this.onMobileYouTube})),this.onMobileYouTube&&(this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=new MutationObserver((e=>{e.some((e=>e.removedNodes.length>0))&&this.attachToPageInternal()})),this.mutationObserver.observe(e,{childList:!0,subtree:!0}))),this.lastState&&(0,u.waitFor)((()=>this.ref.current)).then((()=>{var e;null===(e=this.ref.current)||void 0===e||e.setState(this.lastState)}));const n=document.createElement("span");n.id="categoryPillParent",n.appendChild(this.container),e.prepend(n),t||(e.style.display="flex")}}))}close(){this.root.unmount(),this.container.remove()}setVisibility(e){var t,n;const o={show:e,open:!!e&&(null===(t=this.ref.current)||void 0===t?void 0:t.state.open)};null===(n=this.ref.current)||void 0===n||n.setState(o),this.lastState=o}setSegment(e){var t,n,i;return o(this,void 0,void 0,(function*(){if(yield(0,u.waitFor)((()=>this.ref.current)),(null===(n=null===(t=this.ref.current)||void 0===t?void 0:t.state)||void 0===n?void 0:n.segment)!==e){const t={segment:e,show:!0,open:!1};if(null===(i=this.ref.current)||void 0===i||i.setState(t),this.lastState=t,!a.default.config.categoryPillUpdate){a.default.config.categoryPillUpdate=!0;const e=yield(0,u.waitFor)((()=>document.querySelector("#info.ytd-watch-flexy")));e&&new l.Tooltip({text:chrome.i18n.getMessage("categoryPillNewFeature"),link:"https://blog.ajay.app/full-video-sponsorblock",referenceNode:e,prependElement:e.firstChild,bottomOffset:"-10px",opacity:.95,timeout:5e4})}}this.onMobileYouTube&&!document.contains(this.container)&&this.attachToPageInternal()}))}}},1924:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.ChapterVote=void 0;const i=n(6540),r=n(5338),s=n(6387);t.ChapterVote=class{constructor(e){this.ref=i.createRef(),this.container=document.createElement("span"),this.container.id="chapterVote",this.container.style.height="100%","tv.youtube.com"===document.location.host&&(this.container.style.lineHeight="initial"),this.root=(0,r.createRoot)(this.container),this.root.render(i.createElement(s.default,{ref:this.ref,vote:e}))}getContainer(){return this.container}close(){this.root.unmount(),this.container.remove()}setVisibility(e){var t;const n=Object.assign({show:e},e?{}:{segment:null});this.ref.current?null===(t=this.ref.current)||void 0===t||t.setState(n):this.unsavedState=n}setSegment(e){var t,n,i;return o(this,void 0,void 0,(function*(){if((null===(n=null===(t=this.ref.current)||void 0===t?void 0:t.state)||void 0===n?void 0:n.segment)!==e){const t={segment:e,show:!0};this.ref.current?null===(i=this.ref.current)||void 0===i||i.setState(t):this.unsavedState=t}}))}}},3936:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),i=n(5338),r=n(4342),s=new(n(205).default),a=n(4332),l=n(3683);t.default=class{constructor(e,t,n){var r;this.noticeRef=o.createRef(),this.idSuffix=t,this.contentContainer=e;const a=null!==(r=n.referenceNode)&&void 0!==r?r:s.findReferenceNode();this.noticeElement=document.createElement("div"),this.noticeElement.className="sponsorSkipNoticeContainer",this.noticeElement.id="sponsorSkipNoticeContainer"+t,a.prepend(this.noticeElement),this.root=(0,i.createRoot)(this.noticeElement),this.update(n)}update(e){var t,n,i;this.root.render(o.createElement(r.default,{noticeTitle:e.title,idSuffix:this.idSuffix,fadeIn:null===(t=e.fadeIn)||void 0===t||t,timed:null===(n=e.timed)||void 0===n||n,ref:this.noticeRef,style:e.style,extraClass:e.extraClass,maxCountdownTime:e.maxCountdownTime,dontPauseCountdown:e.dontPauseCountdown,hideLogo:e.hideLogo,hideRightInfo:e.hideRightInfo,closeListener:()=>this.close()},(null===(i=e.textBoxes)||void 0===i?void 0:i.length)>0?o.createElement("tr",{id:"sponsorSkipNoticeMiddleRow"+this.idSuffix,className:"sponsorTimeMessagesRow",style:{maxHeight:(0,l.getVideo)()?(0,l.getVideo)().offsetHeight-200+"px":null}},o.createElement("td",{style:{width:"100%"}},this.getMessageBoxes(this.idSuffix,e.textBoxes))):null,e.hideLogo?null:o.createElement(o.Fragment,null,o.createElement("tr",{id:"sponsorSkipNoticeSpacer"+this.idSuffix,className:"sponsorBlockSpacer"}),o.createElement("tr",{className:"sponsorSkipNoticeRightSection",style:{position:"relative"}},o.createElement("td",null,this.getButtons(e.buttons))))))}getMessageBoxes(e,t){if(t){const n=[];for(let i=0;i<t.length;i++)n.push(o.createElement(a.default,{idSuffix:e,key:i,icon:t[i].icon,text:t[i].text}));return n}return null}getButtons(e){if(e){const t=[];for(const n of e)t.push(o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton",key:n.name,onClick:e=>n.listener(e)},n.name));return t}return null}close(){this.root.unmount(),this.noticeElement.remove()}}},2275:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RectangleTooltip=void 0;const o=n(6540),i=n(5338);t.RectangleTooltip=class{constructor(e){var t,n,r,s,a,l,u;null!==(t=e.bottomOffset)&&void 0!==t||(e.bottomOffset="0px"),null!==(n=e.leftOffset)&&void 0!==n||(e.leftOffset="0px"),null!==(r=e.maxHeight)&&void 0!==r||(e.maxHeight="100px"),null!==(s=e.maxWidth)&&void 0!==s||(e.maxWidth="300px"),null!==(a=e.backgroundColor)&&void 0!==a||(e.backgroundColor="rgba(28, 28, 28, 0.7)"),this.text=e.text,null!==(l=e.fontSize)&&void 0!==l||(e.fontSize="10px"),this.container=document.createElement("div"),null!==(u=e.htmlId)&&void 0!==u||(e.htmlId="sponsorRectangleTooltip"+e.text),this.container.id=e.htmlId,this.container.style.display="relative",e.prependElement?e.referenceNode.insertBefore(this.container,e.prependElement):e.referenceNode.appendChild(this.container),e.timeout&&(this.timer=setTimeout((()=>this.close()),1e3*e.timeout)),this.root=(0,i.createRoot)(this.container),this.root.render(o.createElement("div",{style:{bottom:e.bottomOffset,left:e.leftOffset,maxHeight:e.maxHeight,maxWidth:e.maxWidth,backgroundColor:e.backgroundColor,fontSize:e.fontSize},className:"sponsorBlockRectangleTooltip"},o.createElement("div",null,o.createElement("img",{className:"sponsorSkipLogo sponsorSkipObject",src:chrome.runtime.getURL("icons/IconSponsorBlocker256px.png")}),o.createElement("span",{className:"sponsorSkipObject"},this.text+(e.link?". ":""),e.link?o.createElement("a",{style:{textDecoration:"underline"},target:"_blank",rel:"noopener noreferrer",href:e.link},chrome.i18n.getMessage("LearnMore")):null)),o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton",style:{float:"right"},onClick:()=>{e.buttonFunction&&e.buttonFunction(),this.close()}},chrome.i18n.getMessage("GotIt"))))}close(){this.root.unmount(),this.container.remove(),this.timer&&clearTimeout(this.timer)}}},5474:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=n(6540),r=n(5338),s=new(n(205).default),a=n(2841),l=n(9209),u=n(8856),c=n(1159);t.default=class{constructor(e,t=!1,n,o,c=null,d=!1,p,h=!1){this.skipNoticeRef=i.createRef(),this.segments=e,this.autoSkip=t,this.contentContainer=n;const f=s.findReferenceNode(),m=document.getElementsByClassName("sponsorSkipNotice").length;let g="";for(const e of this.segments)g+=e.UUID;g+=m,this.noticeElement=document.createElement("div"),this.noticeElement.className="sponsorSkipNoticeContainer",this.noticeElement.id="sponsorSkipNoticeContainer"+g,f.prepend(this.noticeElement),this.root=(0,r.createRoot)(this.noticeElement),this.root.render(i.createElement(a.default,{segments:e,autoSkip:t,startReskip:d,voteNotice:h,contentContainer:n,ref:this.skipNoticeRef,closeListener:()=>this.close(),smaller:!h&&(u.default.config.noticeVisibilityMode>=l.NoticeVisibilityMode.MiniForAll||u.default.config.noticeVisibilityMode>=l.NoticeVisibilityMode.MiniForAutoSkip&&t),fadeIn:!p&&!h,unskipTime:c,componentDidMount:o}))}setShowKeybindHint(e){var t,n;null===(n=null===(t=this.skipNoticeRef)||void 0===t?void 0:t.current)||void 0===n||n.setState({showKeybindHint:e})}close(){this.root.unmount(),this.noticeElement.remove();const e=this.contentContainer().skipNotices;e.splice(e.indexOf(this),1)}toggleSkip(){var e,t;null===(t=null===(e=this.skipNoticeRef)||void 0===e?void 0:e.current)||void 0===t||t.prepAction(c.SkipNoticeAction.Unskip0)}unmutedListener(e){var t,n;null===(n=null===(t=this.skipNoticeRef)||void 0===t?void 0:t.current)||void 0===n||n.unmutedListener(e)}waitForSkipNoticeRef(){var e;return o(this,void 0,void 0,(function*(){return(null===(e=this.skipNoticeRef)||void 0===e?void 0:e.current)||(yield(()=>new Promise((e=>{const t=new MutationObserver((()=>{this.skipNoticeRef.current&&(t.disconnect(),e(this.skipNoticeRef.current))}));t.observe(document.getElementsByClassName("sponsorSkipNoticeContainer")[0],{childList:!0,subtree:!0}),this.skipNoticeRef.current&&(t.disconnect(),e(this.skipNoticeRef.current))})))())}))}}},403:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),i=n(5338),r=new(n(205).default),s=n(8818);t.default=class{constructor(e,t){this.noticeRef=o.createRef(),this.contentContainer=e,this.callback=t;const n=r.findReferenceNode();this.noticeElement=document.createElement("div"),this.noticeElement.id="submissionNoticeContainer",n.prepend(this.noticeElement),this.root=(0,i.createRoot)(this.noticeElement),this.root.render(o.createElement(s.default,{contentContainer:e,callback:t,ref:this.noticeRef,closeListener:()=>this.close(!1)}))}update(){this.noticeRef.current.forceUpdate()}close(e=!0){e&&this.noticeRef.current.cancel(),this.root.unmount(),this.noticeElement.remove()}submit(){var e,t;null===(t=null===(e=this.noticeRef.current)||void 0===e?void 0:e.submit)||void 0===t||t.call(e)}scrollToBottom(){var e,t;null===(t=null===(e=this.noticeRef.current)||void 0===e?void 0:e.scrollToBottom)||void 0===t||t.call(e)}}},2246:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Tooltip=void 0;const o=n(4586);class i extends o.GenericTooltip{constructor(e){super(e,"icons/IconSponsorBlocker256px.png")}}t.Tooltip=i},4329:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),i=n(5338),r=n(205),s=n(2841),a=new r.default;t.default=class{constructor(e,t,n,r){this.closed=!1,this.upcomingNoticeRef=o.createRef(),this.segments=e,this.contentContainer=t;const l=a.findReferenceNode();this.noticeElement=document.createElement("div"),this.noticeElement.className="sponsorSkipNoticeContainer",l.prepend(this.noticeElement),this.root=(0,i.createRoot)(this.noticeElement),this.root.render(o.createElement(s.default,{segments:e,autoSkip:r,upcomingNotice:!0,contentContainer:t,ref:this.upcomingNoticeRef,closeListener:()=>this.close(),smaller:!0,fadeIn:!0,maxCountdownTime:n}))}close(){this.root.unmount(),this.noticeElement.remove(),this.closed=!0}sameNotice(e){if(e.length!==this.segments.length)return!1;for(let t=0;t<e.length;t++)if(e[t].UUID!==this.segments[t].UUID)return!1;return!0}}},4804:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);t.default=({fill:e="#ffffff"})=>o.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"18",height:"18",viewBox:"0 0 24 24",fill:e},o.createElement("path",{d:"M14.1 7.1l2.9 2.9L6.1 20.7l-3.6.7.7-3.6L14.1 7.1zm0-2.8L1.4 16.9 0 24l7.1-1.4L19.8 9.9l-5.7-5.7zm7.1 4.3L24 5.7 18.3 0l-2.8 2.8 5.7 5.7z"}))},7152:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);t.default=function({id:e="",fill:t="#ff0000",className:n="",onClick:i}){return o.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 565.15 568",id:e,className:n,onClick:()=>null==i?void 0:i()},o.createElement("g",{id:"Layer_2","data-name":"Layer 2"},o.createElement("g",{id:"Layer_1-2","data-name":"Layer 1",style:{fill:t}},o.createElement("path",{d:"M282.58,568a65,65,0,0,1-34.14-9.66C95.41,463.94,2.54,300.46,0,121A64.91,64.91,0,0,1,34,62.91a522.56,522.56,0,0,1,497.16,0,64.91,64.91,0,0,1,34,58.12c-2.53,179.43-95.4,342.91-248.42,437.3A65,65,0,0,1,282.58,568Zm0-548.31A502.24,502.24,0,0,0,43.4,80.22a45.27,45.27,0,0,0-23.7,40.53c2.44,172.67,91.81,330,239.07,420.83a46.19,46.19,0,0,0,47.61,0C453.64,450.73,543,293.42,545.45,120.75a45.26,45.26,0,0,0-23.7-40.54A502.26,502.26,0,0,0,282.58,19.69Z",id:"path8",style:{fill:t}}),o.createElement("path",{style:{fill:t},d:"M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 220.41016 145.74023 L 411.2793 255.93945 L 220.41016 366.14062 L 220.41016 145.74023 z ",id:"path10"}))),o.createElement("polygon",{style:{fill:"#fff"},points:"411.28 255.94 220.41 145.74 220.41 366.14 411.28 255.94"}))}},1727:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);t.default=({fill:e="#ffffff",className:t="",width:n="18",height:i="18"})=>o.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:n,height:i,fill:e,className:t,viewBox:"0 0 24 24"},o.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}),o.createElement("path",{d:"M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z"}))},152:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);t.default=({fill:e="#ffffff",className:t="",width:n="18",height:i="18"})=>o.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",fill:e,width:n,height:i,className:t,viewBox:"0 0 24 24"},o.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),o.createElement("path",{d:"M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2z"}))},9209:(e,t)=>{var n,o,i,r,s,a;Object.defineProperty(t,"__esModule",{value:!0}),t.NoticeVisibilityMode=t.ChannelIDStatus=t.SponsorSourceType=t.ActionTypes=t.ActionType=t.SponsorHideType=t.CategorySkipOption=void 0,(a=t.CategorySkipOption||(t.CategorySkipOption={}))[a.Disabled=-1]="Disabled",a[a.ShowOverlay=0]="ShowOverlay",a[a.ManualSkip=1]="ManualSkip",a[a.AutoSkip=2]="AutoSkip",(s=t.SponsorHideType||(t.SponsorHideType={}))[s.Visible=void 0]="Visible",s[s.Downvoted=1]="Downvoted",s[s.MinimumDuration=2]="MinimumDuration",s[s.Hidden=3]="Hidden",function(e){e.Skip="skip",e.Mute="mute",e.Chapter="chapter",e.Full="full",e.Poi="poi"}(n=t.ActionType||(t.ActionType={})),t.ActionTypes=[n.Skip,n.Mute,n.Chapter,n.Full,n.Poi],(r=t.SponsorSourceType||(t.SponsorSourceType={}))[r.Server=void 0]="Server",r[r.Local=1]="Local",r[r.YouTube=2]="YouTube",r[r.Autogenerated=3]="Autogenerated",(i=t.ChannelIDStatus||(t.ChannelIDStatus={}))[i.Fetching=0]="Fetching",i[i.Found=1]="Found",i[i.Failed=2]="Failed",(o=t.NoticeVisibilityMode||(t.NoticeVisibilityMode={}))[o.FullSize=0]="FullSize",o[o.MiniForAutoSkip=1]="MiniForAutoSkip",o[o.MiniForAll=2]="MiniForAll",o[o.FadedForAutoSkip=3]="FadedForAutoSkip",o[o.FadedForAll=4]="FadedForAll"},205:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=n(8856),r=n(9209),s=n(3262),a=n(1108),l=n(4148),u=n(1740),c=n(6062);t.default=class{constructor(e=null){this.js=["./js/content.js"],this.css=["content.css","./libs/Source+Sans+Pro.css","popup.css","shared.css"],this.backgroundScriptContainer=e}wait(e,t=5e3,n=100){return o(this,void 0,void 0,(function*(){return(0,a.waitFor)(e,t,n)}))}containsPermission(e){return new Promise((t=>{chrome.permissions.contains(e,t)}))}setupExtraSitePermissions(e){const t=[];(0,u.isSafari)()&&t.push("webNavigation"),chrome.permissions.request({origins:this.getPermissionRegex(),permissions:t},(t=>o(this,void 0,void 0,(function*(){t?this.setupExtraSiteContentScripts():this.removeExtraSiteRegistration(),e(t)}))))}getExtraSiteRegistration(){return{message:"registerContentScript",id:"invidious",allFrames:!0,js:this.js,css:this.css,matches:this.getPermissionRegex()}}setupExtraSiteContentScripts(){const e=this.getExtraSiteRegistration();this.backgroundScriptContainer?this.backgroundScriptContainer.registerFirefoxContentScript(e):chrome.runtime.sendMessage(e)}removeExtraSiteRegistration(){const e="invidious";this.backgroundScriptContainer?this.backgroundScriptContainer.unregisterFirefoxContentScript(e):chrome.runtime.sendMessage({message:"unregisterContentScript",id:e}),chrome.permissions.remove({origins:this.getPermissionRegex()})}applyInvidiousPermissions(e,t="supportInvidious"){return new Promise((n=>{e?this.setupExtraSitePermissions((e=>{e||(i.default.config[t]=!1),n(e)})):(this.removeExtraSiteRegistration(),n(!1))}))}containsInvidiousPermission(){return new Promise((e=>{const t=[];(0,u.isSafari)()&&t.push("webNavigation"),chrome.permissions.contains({origins:this.getPermissionRegex(),permissions:t},(function(t){e(t)}))}))}getMergedTimestamps(e){let t=[];return e.forEach((e=>{const n=t.findIndex((t=>e[0]>=t[0]&&e[0]<=t[1])),o=t.findIndex((t=>e[1]>=t[0]&&e[1]<=t[1]));if(~n&&~o){if(n===o)return;const e=t.splice(Math.max(n,o),1)[0],i=t.splice(Math.min(n,o),1)[0];t.push([Math.min(e[0],i[0]),Math.max(e[1],i[1])])}else~n?t[n][1]=e[1]:~o?t[o][0]=e[0]:t.push(e.slice());t=t.filter((t=>!(t[0]>e[0]&&t[1]<e[1])))})),t}getTimestampsDuration(e){return this.getMergedTimestamps(e).reduce(((e,t)=>e+t[1]-t[0]),0)}getSponsorIndexFromUUID(e,t){for(let n=0;n<e.length;n++)if(e[n].UUID&&(e[n].UUID.startsWith(t)||t.startsWith(e[n].UUID)))return n;return-1}getSponsorTimeFromUUID(e,t){return e[this.getSponsorIndexFromUUID(e,t)]}getPermissionRegex(e=[]){const t=[];0===e.length&&(e=[...i.default.config.invidiousInstances]);for(const n of e)t.push("https://*."+n+"/*"),t.push("http://*."+n+"/*");return t}findReferenceNode(){var e,t;let n=(0,l.findValidElementFromSelector)(["#player-container-id","#movie_player",".html5-video-player","#c4-player","#player-container","#main-panel.ytmusic-player-page","#player-container .video-js",".main-video-section > .video-container",".shaka-video-container","#player-container.ytk-player","#id-tv-container"]);if(null==n){const o=document.getElementById("player");if(n=null==o?void 0:o.firstChild,n){let i=1;for(;i<o.children.length&&(!(null===(e=n.classList)||void 0===e?void 0:e.contains("html5-video-player"))||!(null===(t=n.classList)||void 0===t?void 0:t.contains("ytp-embed")));)n=o.children[i],i++}}return n}isContentScript(){return"http:"===window.location.protocol||"https:"===window.location.protocol}isHex(e){return Boolean(e.match(/^[0-9a-f]+$/i))}addHiddenSegment(e,t,n){return o(this,void 0,void 0,(function*(){if(chrome.extension.inIncognitoContext&&!i.default.config.trackDownvotesInPrivate||!i.default.config.trackDownvotes)return;if(t.length<60){const n=yield(0,c.asyncRequestToServer)("GET","/api/segmentID",{UUID:t,videoID:e});n.ok&&n.responseText&&(t=n.responseText)}const o=(yield(0,s.getHash)(e,1)).slice(0,4),a=yield(0,s.getHash)(t,1),l=i.default.local.downvotedSegments,u=l[o]||{segments:[],lastAccess:0};u.lastAccess=Date.now();const d=u.segments.find((e=>e.uuid===a));n===r.SponsorHideType.Visible?(u.segments.splice(u.segments.indexOf(d),1),0===u.segments.length&&delete l[o]):(d?d.hidden=n:u.segments.push({uuid:a,hidden:n}),l[o]=u);const p=Object.entries(l);if(p.length>1e4){let e=null;for(let t=0;t<p[0].length;t++)(null===e||p[t][1].lastAccess<e[1].lastAccess)&&(e=p[t]);delete l[e[0]]}i.default.forceLocalUpdate("downvotedSegments")}))}}},3126:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.partition=void 0,t.partition=function(e,t){const n=[],o=[];return e.forEach((e=>(t(e)?n:o).push(e))),[n,o]}},1575:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CATEGORY=t.shortCategoryName=t.getCategorySuffix=t.getVoteText=t.getUpcomingText=t.getSkippingText=void 0;const o=n(9209);t.getSkippingText=function(e,t){const n=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);if(t){let t="";switch(e[0].actionType){case o.ActionType.Chapter:case o.ActionType.Skip:t="skipped";break;case o.ActionType.Mute:t="muted";break;case o.ActionType.Poi:t="skipped_to_category"}return chrome.i18n.getMessage(t).replace("{0}",n)}{let t="";switch(e[0].actionType){case o.ActionType.Chapter:case o.ActionType.Skip:t="skip_category";break;case o.ActionType.Mute:t="mute_category";break;case o.ActionType.Poi:t="skip_to_category"}return chrome.i18n.getMessage(t).replace("{0}",n)}},t.getUpcomingText=function(e){const t=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);return chrome.i18n.getMessage("upcoming").replace("{0}",t)},t.getVoteText=function(e){const t=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);return chrome.i18n.getMessage("voted_on").replace("{0}",t)},t.getCategorySuffix=function(e){return e.startsWith("poi_")?"_POI":"exclusive_access"===e?"_full":"chapter"===e?"_chapter":""},t.shortCategoryName=function(e){return chrome.i18n.getMessage("category_"+e+"_short")||chrome.i18n.getMessage("category_"+e)},t.DEFAULT_CATEGORY="chooseACategory"},4982:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isVorapisInstalled=t.runCompatibilityChecks=void 0;const o=n(8856);t.runCompatibilityChecks=function(){o.default.config.showZoomToFillError2&&document.URL.includes("watch?v=")&&setTimeout((()=>{document.querySelector(".zoomtofillBtn")&&alert(chrome.i18n.getMessage("zoomToFillUnsupported")),o.default.config.showZoomToFillError2=!1}),1e4)},t.isVorapisInstalled=function(){return document.querySelector(".v3")}},2271:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.defaultPreviewTime=t.getGuidelineInfo=void 0,t.getGuidelineInfo=function(e){switch(e){case"sponsor":return[{icon:"icons/money.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"selfpromo":return[{icon:"icons/money.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/campaign.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline3`)},{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"exclusive_access":return[{icon:"icons/money.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)}];case"interaction":return[{icon:"icons/lightbulb.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/lightbulb.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline3`)},{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"intro":return[{icon:"icons/check-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"outro":return[{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"preview":return[{icon:"icons/check-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/check-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline3`)},{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"hook":return[{icon:"icons/campaign.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/check-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline3`)},{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"filler":return[{icon:"icons/stopwatch.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/stopwatch.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline3`)},{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"music_offtopic":return[{icon:"icons/music-note.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/music-note.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}];case"poi_highlight":return[{icon:"icons/star.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/bolt.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/bolt.svg",text:chrome.i18n.getMessage(`category_${e}_guideline3`)}];case"chapter":return[{icon:"icons/close-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline1`)},{icon:"icons/check-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline2`)},{icon:"icons/check-smaller.svg",text:chrome.i18n.getMessage(`category_${e}_guideline3`)}];default:return[{icon:"icons/segway.png",text:chrome.i18n.getMessage("generic_guideline1")},{icon:"icons/right-arrow.svg",text:chrome.i18n.getMessage("generic_guideline2")}]}},t.defaultPreviewTime=2},8249:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getExtensionIdsToImportFrom=t.isDeArrowInstalled=void 0;const o=n(8272),i=n(8856),r=n(1740),s=n(1108);function a(){return(0,r.isSafari)()?o.extensionImportList.safari:(0,s.isFirefoxOrSafari)()?o.extensionImportList.firefox:o.extensionImportList.chromium}t.isDeArrowInstalled=function(){return i.default.config.deArrowInstalled?Promise.resolve(!0):new Promise((e=>{const t=a();let n=0;for(const o of t)chrome.runtime.sendMessage(o,{message:"isInstalled"},(o=>{if(chrome.runtime.lastError)return n++,void(n===t.length&&e(!1));e(o),o&&(i.default.config.deArrowInstalled=!0)}))}))},t.getExtensionIdsToImportFrom=a},7621:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.normalizeChapterName=t.exportTimesAsHashParam=t.importTimes=t.exportTimes=void 0;const o=n(9209),i=n(1575),r=n(8272),s=n(7913),a=n(3497),l="undefined"==typeof chrome,u=r.categoryList.filter((e=>"chapter"!==e)).map((e=>({code:e,names:l?[e]:[chrome.i18n.getMessage("category_"+e),(0,i.shortCategoryName)(e)]})));function c(e){const t=e.description||(0,i.shortCategoryName)(e.category);return`${(0,s.getFormattedTime)(e.segment[0],!0)}${e.segment[1]&&e.segment[0]!==e.segment[1]?` - ${(0,s.getFormattedTime)(e.segment[1],!0)}`:""} ${t}`}function d(e,t){let n=e;for(const o of t)o.condition&&!o.condition(e)||(n=n.replace(o.matcher,""));return n}t.exportTimes=function(e){let t="";for(const n of e)[o.ActionType.Full,o.ActionType.Mute].includes(n.actionType)||[o.SponsorSourceType.YouTube,o.SponsorSourceType.Autogenerated].includes(n.source)||(t+=c(n)+"\n");return t.replace(/\n$/,"")},t.importTimes=function(e,t){var n;const i=e.split("\n"),r=/(?:((?:\d+:)?\d+:\d+)+(?:\.\d+)?)|(?:\d+(?=s| second))/g,l=i.some((e=>r.test(e))),c=[];for(const e of i){const t=e.match(r);if(t){const i=(0,s.getFormattedTimeToSeconds)(t[0]);if(null!==i){const r=[{matcher:/^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:(\s]+$/g},{matcher:/[-:()\s]*$/g,condition:e=>!!e.match(/^\s*\(/)}],l=d(e.split(t[0])[0],r);let p=null;const h=e.split(t[1]||t[0]);p=d(h[h.length-1],r);const f=(null==l?void 0:l.length)>(null==p?void 0:p.length)?l:p,m=null===(n=u.find((e=>e.names.includes(f))))||void 0===n?void 0:n.code,g=f?null!=m?m:"chapter":"chooseACategory",v={segment:[i,(0,s.getFormattedTimeToSeconds)(t[1])],category:g,actionType:"chapter"===g?o.ActionType.Chapter:o.ActionType.Skip,description:"chapter"===g?f:null,source:o.SponsorSourceType.Local,UUID:(0,a.generateUserID)()};c.length>0&&null===c[c.length-1].segment[1]&&(c[c.length-1].segment[1]=v.segment[0]),c.push(v)}}else if(!l){const t={segment:[0,0],category:"chapter",actionType:o.ActionType.Chapter,description:e,source:o.SponsorSourceType.Local,UUID:(0,a.generateUserID)()};c.push(t)}}return c.length>0&&null===c[c.length-1].segment[1]&&(c[c.length-1].segment[1]=t),c},t.exportTimesAsHashParam=function(e){const t=e.map((e=>Object.assign({actionType:e.actionType,category:e.category,segment:e.segment},e.description?{description:e.description}:{})));return`#segments=${JSON.stringify(t)}`},t.normalizeChapterName=function(e){return e.toLowerCase().replace(/[.:'’`‛‘"‟”-]/gu,"").replace(/\s+/g," ")}},7082:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenericUtils=void 0;const n="0123456789abcdef";t.GenericUtils={getLuminance:function(e){const{r:t,g:o,b:i}=(4==(r=e).length&&(r="#"+r[1]+r[1]+r[2]+r[2]+r[3]+r[3]),/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(r)?{r:16*n.indexOf(r[1])+n.indexOf(r[2]),g:16*n.indexOf(r[3])+n.indexOf(r[4]),b:16*n.indexOf(r[5])+n.indexOf(r[6])}:null);var r;return Math.sqrt(t*t*.299+o*o*.587+i*i*.114)},indexesOf:function(e,t){return e.map(((e,n)=>e===t?n:-1)).filter((e=>-1!==e))}}},5144:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.logWarn=t.logDebug=void 0,"undefined"!=typeof window&&(window.SBLogs={debug:[],warn:[]}),t.logDebug=function(e){"undefined"!=typeof window?window.SBLogs.debug.push(`[${(new Date).toISOString()}] ${e}`):console.log(`[${(new Date).toISOString()}] ${e}`)},t.logWarn=function(e){"undefined"!=typeof window?window.SBLogs.warn.push(`[${(new Date).toISOString()}] ${e}`):console.warn(`[${(new Date).toISOString()}] ${e}`)}},2869:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isMobileControlsOpen=void 0,t.isMobileControlsOpen=function(){var e;const t=document.getElementById("player-control-overlay");return!!t&&!!(null===(e=null==t?void 0:t.classList)||void 0===e?void 0:e.contains("fadein"))}},1159:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.downvoteButtonColor=t.SkipNoticeAction=void 0;const o=n(8856);var i;(i=t.SkipNoticeAction||(t.SkipNoticeAction={}))[i.None=0]="None",i[i.Upvote=1]="Upvote",i[i.Downvote=2]="Downvote",i[i.CategoryVote=3]="CategoryVote",i[i.CopyDownvote=4]="CopyDownvote",i[i.Unskip0=5]="Unskip0",i[i.Unskip1=6]="Unskip1",t.downvoteButtonColor=function(e,t,n){return(null==e?void 0:e.length)>1?t===n?o.default.config.colorPalette.red:o.default.config.colorPalette.white:o.default.config.isVip&&1===(null==e?void 0:e[0].locked)?o.default.config.colorPalette.locked:o.default.config.colorPalette.white}},5933:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cleanPage=void 0,t.cleanPage=function(){if("complete"===document.readyState)for(const e of document.querySelectorAll("#categoryPillParent, .playerButton, .sponsorThumbnailLabel, #submissionNoticeContainer, .sponsorSkipNoticeContainer, #sponsorBlockPopupContainer, .skipButtonControlBarContainer, #previewbar, .sponsorBlockChapterBar"))e.remove()}},3726:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isPlayingPlaylist=t.getExistingChapters=t.hasAutogeneratedChapters=t.getHashParams=t.isVisible=t.isInPreviewPlayer=t.getControls=void 0;const o=n(9209),i=n(7913),r=n(8856);function s(e){return!!e.closest("#inline-preview-player")}function a(){return!!document.querySelector("ytd-engagement-panel-section-list-renderer ytd-macro-markers-list-renderer #menu")}t.getControls=function(){const e=[".ytp-right-controls-right",".ytp-right-controls",".player-controls-top",".vjs-control-bar",".shaka-bottom-controls",".html5-player-chrome",".ypcs-control-buttons-right"];for(const t of e){const e=Array.from(document.querySelectorAll(t)).filter((e=>!s(e)));if(e.length>0)return e[e.length-1]}return null},t.isInPreviewPlayer=s,t.isVisible=function(e){return e&&e.offsetWidth>0&&e.offsetHeight>0},t.getHashParams=function(){const e=window.location.hash.slice(1);return e?e.split("&").reduce(((e,t)=>{const[n,o]=t.split("="),i=decodeURIComponent(o);try{e[n]=(null==i?void 0:i.match(/{|\[/))?JSON.parse(i):o}catch(e){console.error(`Failed to parse hash parameter ${n}: ${o}`)}return e}),{}):{}},t.hasAutogeneratedChapters=a,t.getExistingChapters=function(e,t){var n,s,l,u;const c=document.querySelector("ytd-macro-markers-list-renderer"),d=null===(n=null==c?void 0:c.closest("ytd-engagement-panel-section-list-renderer"))||void 0===n?void 0:n.querySelector("#title-text.ytd-engagement-panel-title-header-renderer");if(null===(s=null==d?void 0:d.textContent)||void 0===s?void 0:s.includes("Key moment"))return[];const p=a();if(!r.default.config.showAutogeneratedChapters&&p)return[];const h=[];if(c){let n=null;const r=c.querySelectorAll("ytd-macro-markers-list-item-renderer > a");for(const t of r){const r=t.querySelector("#time"),s=t.querySelector("#details h4");if(r&&(null===(l=null==s?void 0:s.innerText)||void 0===l?void 0:l.length)>0&&(null===(u=t.getAttribute("href"))||void 0===u?void 0:u.includes(e))){const e=(0,i.getFormattedTimeToSeconds)(r.innerText.replace(/\./g,":"));if(null===e)return[];n&&(n.segment[1]=e,h.push(n)),n={segment:[e,null],category:"chapter",actionType:o.ActionType.Chapter,description:s.innerText,source:p?o.SponsorSourceType.Autogenerated:o.SponsorSourceType.YouTube,UUID:null}}}n&&(n.segment[1]=t,h.push(n))}return h},t.isPlayingPlaylist=function(){return!!document.URL.includes("&list=")}},6062:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendRequestToServer=t.asyncRequestToServer=t.asyncRequestToCustomServer=void 0;const i=n(8856),r=n(8272),s=n(3531);function a(e,t,n={},o={}){return(0,s.sendRequestToCustomServer)(e,t,n,o)}t.asyncRequestToCustomServer=a,t.asyncRequestToServer=function(e,t,n={},s={}){return o(this,void 0,void 0,(function*(){const o=i.default.config.testingServer?r.testingServerAddress:i.default.config.serverAddress;return yield a(e,o+t,n,s)}))},t.sendRequestToServer=function(e,t,n){const o=i.default.config.testingServer?r.testingServerAddress:i.default.config.serverAddress;chrome.runtime.sendMessage({message:"sendRequest",type:e,url:o+t},(e=>{n(e)}))}},3611:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.getSegmentsForVideo=void 0;const i=n(2146),r=n(3262),s=n(8856),a=n(8272),l=n(9209),u=n(3726),c=n(6062),d=n(1108),p=new i.DataCache((()=>({segments:null,status:200})),5),h={};t.getSegmentsForVideo=function(e,t){return o(this,void 0,void 0,(function*(){if(!t){const t=p.getFromCache(e);if(t)return p.cacheUsed(e),t}if(h[e])return yield h[e];const n=function(e){var t,n,i,h,f,m;return o(this,void 0,void 0,(function*(){const o={},g=(0,u.getHashParams)();g.requiredSegment&&(o.requiredSegment=g.requiredSegment);const v=(yield(0,r.getHash)(e,1)).slice(0,5),y=!!s.default.local.downvotedSegments[v.slice(0,4)],b=yield(0,c.asyncRequestToServer)("GET","/api/skipSegments/"+v,Object.assign({categories:a.categoryList,actionTypes:l.ActionTypes,trimUUIDs:y?null:5},o),{"X-CLIENT-NAME":(0,d.extensionUserAgent)()});if(b.ok){const o=function(e=!1){const t=[l.ActionType.Skip,l.ActionType.Poi,l.ActionType.Chapter];return s.default.config.muteSegments&&t.push(l.ActionType.Mute),(s.default.config.fullVideoSegments||e)&&t.push(l.ActionType.Full),t}(),r=null===(m=null===(f=null===(h=null===(i=null===(n=null===(t=JSON.parse(b.responseText))||void 0===t?void 0:t.filter((t=>t.videoID===e)))||void 0===n?void 0:n.map((e=>e.segments)))||void 0===i?void 0:i[0])||void 0===h?void 0:h.filter((e=>o.includes(e.actionType))))||void 0===f?void 0:f.map((e=>Object.assign(Object.assign({},e),{source:l.SponsorSourceType.Server}))))||void 0===m?void 0:m.sort(((e,t)=>e.segment[0]-t.segment[0]));if(r&&r.length){const t={segments:r,status:b.status};return p.setupCache(e).segments=t.segments,t}p.setupCache(e)}return{segments:null,status:b.status}}))}(e);h[e]=n;const i=yield n;return delete h[e],i}))}},6417:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getCategoryDefaultSelection=t.getCategorySelection=t.SkipRuleOperator=t.SkipRuleAttribute=void 0;const o=n(8423),i=n(3683),r=n(8856),s=n(9209);var a,l;function u(e,t){const n=function(e,t){var n,r,l,u,c,d,p,h;switch(t.attribute){case a.StartTime:return null===(n=e.segment)||void 0===n?void 0:n[0];case a.EndTime:return null===(r=e.segment)||void 0===r?void 0:r[1];case a.Duration:return(null===(l=e.segment)||void 0===l?void 0:l[1])-(null===(u=e.segment)||void 0===u?void 0:u[0]);case a.StartTimePercent:{const t=null===(c=e.segment)||void 0===c?void 0:c[0];if(void 0===t)return;return t/(0,i.getVideoDuration)()*100}case a.EndTimePercent:{const t=null===(d=e.segment)||void 0===d?void 0:d[1];if(void 0===t)return;return t/(0,i.getVideoDuration)()*100}case a.DurationPercent:{const t=null===(p=e.segment)||void 0===p?void 0:p[0],n=null===(h=e.segment)||void 0===h?void 0:h[1];if(void 0===t||void 0===n)return;return(n-t)/(0,i.getVideoDuration)()*100}case a.Category:return e.category;case a.ActionType:return e.actionType;case a.Description:return e.description||"";case a.Source:switch(e.source){case s.SponsorSourceType.Local:return"local";case s.SponsorSourceType.YouTube:return"youtube";case s.SponsorSourceType.Autogenerated:return"autogenerated";case s.SponsorSourceType.Server:return"server";default:return}case a.ChannelID:return(0,i.getChannelIDInfo)(),(0,i.getChannelIDInfo)().id;case a.ChannelName:return(0,i.getChannelIDInfo)(),(0,i.getChannelIDInfo)().author;case a.VideoDuration:return(0,i.getVideoDuration)();case a.Title:return(0,o.getCurrentPageTitle)()||"";default:return}}(e,t);switch(t.operator){case l.Less:return"number"==typeof n&&n<t.value;case l.LessOrEqual:return"number"==typeof n&&n<=t.value;case l.Greater:return"number"==typeof n&&n>t.value;case l.GreaterOrEqual:return"number"==typeof n&&n>=t.value;case l.Equal:return n===t.value;case l.NotEqual:return n!==t.value;case l.Contains:return String(n).toLocaleLowerCase().includes(String(t.value).toLocaleLowerCase());case l.NotContains:return!String(n).toLocaleLowerCase().includes(String(t.value).toLocaleLowerCase());case l.Regex:return new RegExp(t.value).test(String(n));case l.RegexIgnoreCase:return new RegExp(t.value,"i").test(String(n));case l.NotRegex:return!new RegExp(t.value).test(String(n));case l.NotRegexIgnoreCase:return!new RegExp(t.value,"i").test(String(n));default:return!1}}!function(e){e.StartTime="time.start",e.EndTime="time.end",e.Duration="time.duration",e.StartTimePercent="time.startPercent",e.EndTimePercent="time.endPercent",e.DurationPercent="time.durationPercent",e.Category="category",e.ActionType="actionType",e.Description="chapter.name",e.Source="chapter.source",e.ChannelID="channel.id",e.ChannelName="channel.name",e.VideoDuration="video.duration",e.Title="video.title"}(a=t.SkipRuleAttribute||(t.SkipRuleAttribute={})),function(e){e.Less="<",e.LessOrEqual="<=",e.Greater=">",e.GreaterOrEqual=">=",e.Equal="==",e.NotEqual="!=",e.Contains="*=",e.NotContains="!*=",e.Regex="~=",e.RegexIgnoreCase="~i=",e.NotRegex="!~=",e.NotRegexIgnoreCase="!~i="}(l=t.SkipRuleOperator||(t.SkipRuleOperator={})),t.getCategorySelection=function(e){for(const t of r.default.local.skipRules)if(t.rules.every((t=>u(e,t))))return{name:e.category,option:t.skipOption};for(const t of r.default.config.categorySelections)if(t.name===e.category)return t;return{name:e.category,option:s.CategorySkipOption.Disabled}},t.getCategoryDefaultSelection=function(e){for(const t of r.default.config.categorySelections)if(t.name===e)return t;return{name:e,option:s.CategorySkipOption.Disabled}}},8537:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.setupThumbnailListener=t.setupThumbnailHover=t.labelThumbnail=t.handleThumbnails=void 0;const i=n(3683),r=n(8856),s=n(1990),a=n(8343),l=n(3611);function u(e){return o(this,void 0,void 0,(function*(){yield Promise.all(e.map((e=>{c(e),d(e)})))}))}function c(e){var t,n;return o(this,void 0,void 0,(function*(){if(!(null===(t=r.default.config)||void 0===t?void 0:t.fullVideoSegments)||!(null===(n=r.default.config)||void 0===n?void 0:n.fullVideoLabelsOnThumbnails))return m(e),null;const o=h(e);if(!o)return m(e),null;const i=yield(0,s.getVideoLabel)(o);if(!i)return m(e),null;const{overlay:a,text:l}=function(e){const t=f(e);if(t)return{overlay:t,text:t.querySelector("span")};const n=document.createElement("div");n.classList.add("sponsorThumbnailLabel"),n.addEventListener("pointerenter",(t=>{t.stopPropagation(),e.dispatchEvent(new PointerEvent("pointerleave",{bubbles:!0}))})),n.addEventListener("pointerleave",(t=>{t.stopPropagation(),e.dispatchEvent(new PointerEvent("pointerenter",{bubbles:!0}))}));const o=function(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttribute("viewBox","0 0 565.15 568");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttribute("href","#SponsorBlockIcon"),e.appendChild(t),e}(),i=document.createElement("span");return n.appendChild(o),n.appendChild(i),e.appendChild(n),{overlay:n,text:i}}(e);return a.style.setProperty("--category-color",`var(--sb-category-preview-${i}, var(--sb-category-${i}))`),a.style.setProperty("--category-text-color",`var(--sb-category-text-preview-${i}, var(--sb-category-text-${i}))`),l.innerText=chrome.i18n.getMessage(`category_${i}`),a.classList.add("sponsorThumbnailLabelVisible"),a}))}function d(e){return o(this,void 0,void 0,(function*(){if((0,i.isOnInvidious)())return;const t=e.closest("#dismissible");t&&(t.removeEventListener("mouseenter",p),t.addEventListener("mouseenter",p))}))}function p(e){var t;if(!(null===(t=chrome.runtime)||void 0===t?void 0:t.id))return;const n=e.target.querySelector((0,a.getThumbnailSelector)());if(!n)return;let i=!1;const r=()=>o(this,void 0,void 0,(function*(){i=!0;const e=h(n);e&&(yield(0,s.getHasStartSegment)(e))&&(0,l.getSegmentsForVideo)(e,!1)})),u=setTimeout(r,100),c=()=>{clearTimeout(u),i||r()};e.target.addEventListener("mousedown",c,{once:!0}),e.target.addEventListener("mouseleave",(()=>{clearTimeout(u),e.target.removeEventListener("mousedown",c)}),{once:!0})}function h(e){var t;const n=function(e){var t;return(0,i.isOnInvidious)()?e.parentElement:"yt-thumbnail-view-model"===e.nodeName.toLowerCase()?null===(t=e.closest("yt-lockup-view-model"))||void 0===t?void 0:t.querySelector("a.yt-lockup-metadata-view-model-wiz__title"):e.querySelector("#thumbnail")}(e);return n&&"A"===n.nodeName&&n.href?null===(t=(0,i.parseYouTubeVideoIDFromURL)(n.href))||void 0===t?void 0:t.videoID:null}function f(e){return e.querySelector(".sponsorThumbnailLabel")}function m(e){const t=f(e);t&&t.classList.remove("sponsorThumbnailLabelVisible")}t.handleThumbnails=u,t.labelThumbnail=c,t.setupThumbnailHover=d,t.setupThumbnailListener=function(){(0,a.setThumbnailListener)(u,(()=>{!function(){const e=document.createElement("span");e.innerHTML='\n<svg viewBox="0 0 565.15 568" style="display: none">\n <defs>\n <g id="SponsorBlockIcon">\n <path d="M282.58,568a65,65,0,0,1-34.14-9.66C95.41,463.94,2.54,300.46,0,121A64.91,64.91,0,0,1,34,62.91a522.56,522.56,0,0,1,497.16,0,64.91,64.91,0,0,1,34,58.12c-2.53,179.43-95.4,342.91-248.42,437.3A65,65,0,0,1,282.58,568Zm0-548.31A502.24,502.24,0,0,0,43.4,80.22a45.27,45.27,0,0,0-23.7,40.53c2.44,172.67,91.81,330,239.07,420.83a46.19,46.19,0,0,0,47.61,0C453.64,450.73,543,293.42,545.45,120.75a45.26,45.26,0,0,0-23.7-40.54A502.26,502.26,0,0,0,282.58,19.69Z"/>\n <path d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 220.41016 145.74023 L 411.2793 255.93945 L 220.41016 366.14062 L 220.41016 145.74023 z "/>\n </g>\n </defs>\n</svg>',document.body.appendChild(e.children[0])}()}),(()=>r.default.isReady()))}},2084:(e,t)=>{function n(e){var t,n,o;if(!e)return 0;const i=/(?:(\d{1,3})h)?(?:(\d{1,2})m)?(\d+)s?/.exec(e);return i?3600*parseInt(null!==(t=i[1])&&void 0!==t?t:"0",10)+60*parseInt(null!==(n=i[2])&&void 0!==n?n:"0",10)+parseInt(null!==(o=i[3])&&void 0!==o?o:"0",10):/\d+/.test(e)?parseInt(e,10):0}Object.defineProperty(t,"__esModule",{value:!0}),t.urlTimeToSeconds=t.getStartTimeFromUrl=void 0,t.getStartTimeFromUrl=function(e){const t=new URLSearchParams(e);return n((null==t?void 0:t.get("t"))||(null==t?void 0:t.get("time_continue")))},t.urlTimeToSeconds=n},1990:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.getHasStartSegment=t.getVideoLabel=void 0;const i=n(9209),r=n(3262),s=n(5144),a=n(6062),l=n(6417),u={};function c(e){return o(this,void 0,void 0,(function*(){const t=u[e];if(t)return t;const n=yield(0,a.asyncRequestToServer)("GET",`/api/videoLabels/${e}?hasStartSegment=true`);if(200!==n.status)return u[e]={timestamp:Date.now(),videos:{}},null;try{const t=JSON.parse(n.responseText),o={timestamp:Date.now(),videos:Object.fromEntries(t.map((e=>{var t;return[e.videoID,{category:null===(t=e.segments[0])||void 0===t?void 0:t.category,hasStartSegment:e.hasStartSegment}]})))};if(u[e]=o,Object.keys(u).length>1e3){const e=Object.entries(u).reduce(((e,t)=>e[1].timestamp<t[1].timestamp?e:t));delete u[e[0]]}return o}catch(e){return(0,s.logWarn)(`Error parsing video labels: ${e}`),null}}))}t.getVideoLabel=function(e){var t;return o(this,void 0,void 0,(function*(){const n=(yield(0,r.getHash)(e,1)).slice(0,4),o=yield c(n);if(o){const n=null===(t=o.videos[e])||void 0===t?void 0:t.category;return n&&(0,l.getCategorySelection)(o.videos[e]).option!==i.CategorySkipOption.Disabled?n:null}return null}))},t.getHasStartSegment=function(e){var t,n;return o(this,void 0,void 0,(function*(){const o=(yield(0,r.getHash)(e,1)).slice(0,4),i=yield c(o);return i?null!==(n=null===(t=null==i?void 0:i.videos[e])||void 0===t?void 0:t.hasStartSegment)&&void 0!==n&&n:null}))}},5222:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(i,r){function s(e){try{l(o.next(e))}catch(e){r(e)}}function a(e){try{l(o.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.openChat=t.openWarningDialog=void 0;const i=n(1108),r=n(3262),s=n(8856),a=n(3936),l=n(6062);function u(e){window.open("https://chat.sponsor.ajay.app/#"+(0,i.objectToURI)("",e,!1))}t.openWarningDialog=function(e){var t;return o(this,void 0,void 0,(function*(){const n=yield(0,l.asyncRequestToServer)("GET","/api/userInfo",{publicUserID:yield(0,r.getHash)(s.default.config.userID),values:["warningReason"]});if(n.ok){const i=null===(t=JSON.parse(n.responseText))||void 0===t?void 0:t.warningReason,c=yield(0,l.asyncRequestToServer)("GET","/api/getUsername?userID="+s.default.config.userID),d=c.ok?JSON.parse(c.responseText).userName:"",p=yield(0,r.getHash)(s.default.config.userID);let h=null;const f={title:chrome.i18n.getMessage("deArrowMessageRecieved"),textBoxes:[{text:chrome.i18n.getMessage("warningChatInfo"),icon:null},...i.split("\n").map((e=>({text:e,icon:null})))],buttons:[{name:chrome.i18n.getMessage("questionButton"),listener:()=>u({displayName:`${d||""}${d!==p?` | ${p}`:""}`})},{name:chrome.i18n.getMessage("warningConfirmButton"),listener:()=>o(this,void 0,void 0,(function*(){const e=yield(0,l.asyncRequestToServer)("POST","/api/warnUser",{userID:s.default.config.userID,enabled:!1});e.ok?null==h||h.close():alert(`${chrome.i18n.getMessage("warningError")} ${e.status}`)}))}],timed:!1};h=new a.default(e,"warningNotice",f)}}))},t.openChat=u},8261:e=>{e.exports='(()=>{"use strict";var e={907:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.YT_DOMAINS=void 0,t.YT_DOMAINS=["m.youtube.com","www.youtube.com","www.youtube-nocookie.com","music.youtube.com","www.youtubekids.com","tv.youtube.com"]},148:function(e,t){var n=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(o,r){function a(e){try{d(i.next(e))}catch(e){r(e)}}function l(e){try{d(i.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}d((i=i.apply(e,t||[])).next())}))};function i(e,t=!1){var n,i,o;if(!e)return!1;if("VIDEO"===e.tagName&&(e.classList.contains("html5-main-video")||"player"===e.id||"player_html5_api"===e.id)&&1===[...document.querySelectorAll("video")].filter((e=>e.duration)).length&&e.duration)return!0;if(0===e.offsetHeight||0===e.offsetWidth&&!t)return!1;const r=null==e?void 0:e.getBoundingClientRect(),a=document.elementFromPoint(r.left+r.width/2,r.top+r.height/2)||document.elementFromPoint(r.left,r.top);return!a&&"movie_player"===e.id&&r.top<0||!!(a===e||a&&e.contains(a)||a&&a.contains(e))||"VIDEO"===e.tagName&&(!!(null===(n=null==a?void 0:a.closest(".html5-video-player"))||void 0===n?void 0:n.contains(e))||!!(null===(o=null===(i=null==e?void 0:e.closest("#inline-preview-player"))||void 0===i?void 0:i.classList)||void 0===o?void 0:o.contains("playing-mode")))}function o(e,t=!1,n=!0){var o,r;return i(e,t)||n&&!!e&&(i(e.parentElement,t)||i(null!==(r=null===(o=e.parentElement)||void 0===o?void 0:o.parentElement)&&void 0!==r?r:null,t))}function r(e,t=!1,n=!1){return a(e,t,n)}function a(e,t=!1,n=!1,i){for(const r of e){const e=i?i(r):r;if(e&&o(e,t,n))return e}return null}function l(e,t){for(const n of e){const e=document.querySelector(n);if(e&&t(e))return e}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.getElement=t.waitForElement=t.findNonEmptyElement=t.findPredicatedElement=t.findValidElement=t.findValidElementFromSelector=t.isVisibleOrParent=t.isVisible=void 0,t.isVisible=i,t.isVisibleOrParent=o,t.findValidElementFromSelector=function(e,t=!1,n=!1){return a(e,t,n,(e=>document.querySelector(e)))},t.findValidElement=r,t.findPredicatedElement=l,t.findNonEmptyElement=function(e){return l(e,(e=>{var t,n;return(null!==(n=null===(t=e.textContent)||void 0===t?void 0:t.trim())&&void 0!==n?n:"").length>0}))};let d=!1,s=null,u=[];function c(){if(!s){const e=e=>{var t;const n=[];for(const i of u){const{selector:o,visibleCheck:a,ignoreWidth:l,checkParent:d,callbacks:s}=i;let u=!0;if(e){let t=!1;for(const n of e)if("childList"===n.type&&n.addedNodes.length>0){if(n.target instanceof HTMLElement&&(n.target.matches(o)||n.target.querySelector(o))){t=!0;break}for(const e of n.addedNodes)if(e instanceof HTMLElement&&(e.matches(o)||e.querySelector(o))){t=!0;break}if(t)break}t||(u=!1)}const c=u?document.querySelectorAll(o):i.elements;if(c&&c.length>0){i.elements=c;const e=a?r(c,l,d):c[0];if(e){if(null===(t=chrome.runtime)||void 0===t?void 0:t.id)for(const t of s)t(e);n.push(o)}}}u=u.filter((e=>!n.includes(e.selector))),0===u.length&&(null==s||s.disconnect(),s=null,d=!1)};e(),u.length>0&&(s=new MutationObserver(e),s.observe(document.documentElement,{childList:!0,subtree:!0}))}}function m(e,t,n=!1,i=!1){return t?r(document.querySelectorAll(e),n,i):document.querySelector(e)}t.waitForElement=function(e,t=!1,i=!1,o=!1){return n(this,void 0,void 0,(function*(){return yield new Promise((n=>{const r=m(e,t,i,o);if(r)return void n(r);const a=u.find((n=>n.selector===e&&n.visibleCheck===t));a?a.callbacks.push(n):u.push({selector:e,visibleCheck:t,ignoreWidth:i,checkParent:o,callbacks:[n]}),d||(d=!0,document.body?c():window.addEventListener("DOMContentLoaded",(()=>{c()})))}))}))},t.getElement=m},860:function(e,t,n){var i=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(o,r){function a(e){try{d(i.next(e))}catch(e){r(e)}}function l(e){try{d(i.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}d((i=i.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.init=void 0;const o=n(291),r=n(303),a=n(907),l=n(395),d=n(705),s=n(445),u=n(148);let c,m="",v=!1,f=!1;const y=(0,l.getThumbnailElementsToListenFor)(),p=["/youtubei/v1/search","/youtubei/v1/guide","/youtubei/v1/browse","/youtubei/v1/next","/youtubei/v1/player"],h=["videoDetails","videoPrimaryInfoRenderer","videoSecondaryInfoRenderer","currentVideoEndpoint"],w=e=>{window.postMessage(Object.assign({source:"sponsorblock"},e),"/")};function b(e){var t,n;const i=c;if("ytu.app.lib.player.interaction-event"===e.type){if(!document.querySelector("#movie_player"))return;c=document.querySelector("#movie_player"),null===(t=c.querySelector("video"))||void 0===t||t.addEventListener("durationchange",T),null===(n=c.querySelector("video"))||void 0===n||n.addEventListener("loadstart",T)}else c=document.getElementById("movie_player");T(),i||(c.addEventListener("onAdStart",(()=>w({type:"ad",playing:!0}))),c.addEventListener("onAdFinish",(()=>w({type:"ad",playing:!1}))))}function g(e){const t=e.detail.pageType;if(t){const n={type:"navigation",pageType:t,videoID:null};if("shorts"===t||"watch"===t){const i=e.detail.endpoint;if(!i)return null;n.videoID=("shorts"===t?i.reelWatchEndpoint:i.watchEndpoint).videoId}return n}return null}function E(e){const t=g(e);t&&w(t)}function S(e){var t,n,i,o,r;T();const a=null===(r=null===(o=null===(i=null!==(n=null===(t=e.detail)||void 0===t?void 0:t.data)&&void 0!==n?n:e.detail)||void 0===i?void 0:i.response)||void 0===o?void 0:o.playerResponse)||void 0===r?void 0:r.videoDetails;if(a)w(Object.assign({channelID:a.channelId,channelTitle:a.author},g(e)));else{const t=g(e);t&&w(t)}}function T(){if(!c)return;const e=c.getVideoData(),t=c.isInline();e&&(e.video_id!==m||f!==e.isLive||v!==t||t)&&(m=e.video_id,v=t,f=e.isLive,w({type:"data",videoID:e.video_id,isLive:e.isLive,isPremiere:e.isPremiere,isInline:t}))}function L(e){w({type:"videoIDsLoaded",videoIDs:Array.from(I(e))})}function I(e){const t=new Set;for(const n in e)"videoId"===n?t.add(e[n]):"object"!=typeof e[n]||h.includes(n)||I(e[n]).forEach((e=>t.add(e)));return t}function k(e){var t,n,i,o,r,a,l,d;if(null===(t=e.data)||void 0===t?void 0:t.source)if("dearrow-media-session"===(null===(n=e.data)||void 0===n?void 0:n.source))(0,s.setMediaSessionInfo)(e.data.data);else if("dearrow-reset-media-session-thumbnail"===(null===(i=e.data)||void 0===i?void 0:i.source))(0,s.resetMediaSessionThumbnail)();else if("sb-reset-media-session-link"===(null===(o=e.data)||void 0===o?void 0:o.source))(0,s.resetLastArtworkSrc)();else if("sb-verify-time"===(null===(r=e.data)||void 0===r?void 0:r.source)){const t=[...document.querySelectorAll("video")].filter((e=>(0,u.isVisible)(e)))[0];c&&(null===(a=e.data)||void 0===a?void 0:a.rawTime)===(null==t?void 0:t.currentTime)&&Math.abs(c.getCurrentTime()-(null===(l=e.data)||void 0===l?void 0:l.time))>.1&&2===c.getPlayerState()&&w({type:"currentTimeWrong",playerTime:c.getCurrentTime(),expectedTime:null===(d=e.data)||void 0===d?void 0:d.time})}}const P={browserFetch:null,browserPush:null,customElementDefine:null,waitingInterval:null};let M=!1,_=null;function O(){var e;document.removeEventListener("yt-player-updated",b),document.removeEventListener("yt-navigate-start",E),document.removeEventListener("yt-navigate-finish",S),"tv.youtube.com"===document.location.host&&(document.removeEventListener("yt-navigate",S),document.removeEventListener("ytu.app.lib.player.interaction-event",b)),(0,d.onMobile)()&&window.removeEventListener("state-navigateend",S),P.browserFetch&&(window.fetch=P.browserFetch),P.browserPush&&(window.Array.prototype.push=P.browserPush),P.customElementDefine&&(window.customElements.define=P.customElementDefine),P.waitingInterval&&clearInterval(P.waitingInterval),window.removeEventListener("message",k),window.teardownCB=null,M=!0,null===(e=null==_?void 0:_.disconnect)||void 0===e||e.call(_)}function C(){_&&_.disconnect(),_=new MutationObserver((e=>{for(const t of e)for(const e of t.addedNodes)if(e instanceof HTMLElement)for(const t of y)if(e.tagName.toLowerCase()===t||e.querySelector(t))return void w({type:"newElement",name:t})})),_.observe(document.documentElement,{childList:!0,subtree:!0});for(const e of y)document.querySelector(e)&&w({type:"newElement",name:e})}t.init=function(){var e,t,n,l;const s="true"===(null===(t=null===(e=document.querySelector("#sponsorblock-document-script"))||void 0===e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"teardown")),u=window.versionCB&&(!window.versionCB||(0,o.versionHigher)(r.version,window.versionCB));if(s||u)null===(n=window.teardownCB)||void 0===n||n.call(window);else if(window.versionCB&&!(0,o.versionHigher)(r.version,window.versionCB))return;if(window.versionCB=r.version,window.teardownCB=O,!document.querySelector("#sponsorblock-document-script")){const e=document.createElement("div");e.id="sponsorblock-document-script",e.setAttribute("version",r.version),(document.head||document.documentElement).appendChild(e)}if(document.addEventListener("yt-player-updated",b),document.addEventListener("yt-navigate-start",E),document.addEventListener("yt-navigate-finish",S),"tv.youtube.com"===document.location.host&&(document.addEventListener("yt-navigate",S),document.addEventListener("ytu.app.lib.player.interaction-event",b),document.getElementById("#movie_player")&&(b({target:null===(l=document.getElementById("#movie_player"))||void 0===l?void 0:l.parentElement}),T())),(0,d.onMobile)()&&window.addEventListener("state-navigateend",S),a.YT_DOMAINS.includes(window.location.host)&&!(0,d.onMobile)()&&!(0,d.onYouTubeCableTV)())if(window.customElements){setTimeout((()=>{M||C()}),2e3);const e=window.customElements.define.bind(window.customElements);P.customElementDefine=e,Object.defineProperty(window.customElements,"define",{configurable:!0,enumerable:!1,writable:!0,value:(t,n,i)=>{let o=n;if(y.includes(t))if(M=!0,_&&(_.disconnect(),_=null),n.toString().startsWith("class")){class e extends n{constructor(){super(),w({type:"newElement",name:t})}}o=e}else o=function(){n.call(this),w({type:"newElement",name:t})},Object.setPrototypeOf(o.prototype,n.prototype),Object.setPrototypeOf(o,n);e(t,o,i)}})}else C();const c=window.fetch;P.browserFetch=c,window.fetch=(e,t=void 0)=>e instanceof Request&&p.some((t=>e.url.includes(t)))?(e.url.includes("/youtubei/v1/next")&&(setTimeout((()=>w({type:"newElement",name:""})),1e3),setTimeout((()=>w({type:"newElement",name:""})),2500),setTimeout((()=>w({type:"newElement",name:""})),8e3)),new Promise(((n,o)=>i(this,void 0,void 0,(function*(){try{const i=yield c(e,t),o=yield i.json();n(new Response(JSON.stringify(o),i)),L(o)}catch(e){o(e)}}))))):c(e,t);let m=0;const v={apply:(e,t,n)=>{if(n[0]&&n[0]!==window&&"number"==typeof n[0].start&&n[0].end&&"ssap"===n[0].namespace&&n[0].id){const e=n[0];if(e){const t=e.start;0!==t&&m!==t&&(m=t,w({type:"adDuration",duration:t/1e3}))}}return Reflect.apply(e,t,n)}};if(P.browserPush=window.Array.prototype.push,window.Array.prototype.push=new Proxy(window.Array.prototype.push,v),window.addEventListener("message",k),"undefined"!=typeof ytInitialData)L(ytInitialData);else{const e=setInterval((()=>{"undefined"!=typeof ytInitialData&&(L(ytInitialData),clearInterval(e))}),1);P.waitingInterval=e}setTimeout((()=>{setInterval.toString().includes("console.log(SCRIPTID, \'original interval:\', interval, location.href)")&&alert(\'Warning: You have the user script "YouTube CPU Tamer". This causes performance issues with SponsorBlock, and does not actually improve CPU performance. Please uninstall this user script.\')}),1e3)}},445:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.resetLastArtworkSrc=t.resetMediaSessionThumbnail=t.setMediaSessionInfo=void 0;let n=null,i=null,o=null;function r(e){var t,r,d;"mediaSession"in navigator&&(o||(o={}),o=Object.assign(Object.assign({},o),e),(null===(d=null===(r=null===(t=navigator.mediaSession.metadata)||void 0===t?void 0:t.artwork)||void 0===r?void 0:r[0])||void 0===d?void 0:d.src)&&!navigator.mediaSession.metadata.artwork[0].src.includes("dearrow-thumb")&&(n=navigator.mediaSession.metadata.artwork[0].src),l(navigator.mediaSession.metadata,o)&&(a(o),i&&clearTimeout(i),i=setTimeout((()=>{o&&l(navigator.mediaSession.metadata,o)&&a(o),i=null}),500)))}function a(e){var t,n,i,o,r,a,l,d;if("mediaSession"in navigator){const s=Object.assign({},function(){var e,t,n,i,o,r,a,l,d,s;const u=Object.assign(Object.assign({},navigator.mediaSession.metadata),{artwork:[...null!==(t=null===(e=navigator.mediaSession.metadata)||void 0===e?void 0:e.artwork)&&void 0!==t?t:[]]});return void 0===u.title?{title:null!==(i=null===(n=navigator.mediaSession.metadata)||void 0===n?void 0:n.title)&&void 0!==i?i:"",artist:null!==(r=null===(o=navigator.mediaSession.metadata)||void 0===o?void 0:o.artist)&&void 0!==r?r:"",album:null!==(l=null===(a=navigator.mediaSession.metadata)||void 0===a?void 0:a.album)&&void 0!==l?l:"",artwork:[...null!==(s=null===(d=navigator.mediaSession.metadata)||void 0===d?void 0:d.artwork)&&void 0!==s?s:[]]}:u}());for(const t in e)s[t]=e[t];(null===(n=null===(t=s.artwork)||void 0===t?void 0:t[0])||void 0===n?void 0:n.src)&&(null===(o=null===(i=s.artwork)||void 0===i?void 0:i[0])||void 0===o?void 0:o.src)!==(null===(l=null===(a=null===(r=navigator.mediaSession.metadata)||void 0===r?void 0:r.artwork)||void 0===a?void 0:a[0])||void 0===l?void 0:l.src)&&((null===(d=s.title)||void 0===d?void 0:d.endsWith(" "))?s.title=s.title.trim():s.title=s.title+" "),navigator.mediaSession.metadata=new MediaMetadata(s)}}function l(e,t){if(e&&t)for(const n of Object.keys(t)){if("object"==typeof t[n]&&l(e[n],t[n]))return!0;if(e[n]!==t[n])return!0}return!1}t.setMediaSessionInfo=r,t.resetMediaSessionThumbnail=function(){var e,t,i;n&&r({title:null===(i=null!==(e=null==o?void 0:o.title)&&void 0!==e?e:null===(t=navigator.mediaSession.metadata)||void 0===t?void 0:t.title)||void 0===i?void 0:i.trim(),artwork:[{src:n}]})},t.resetLastArtworkSrc=function(){n=null}},705:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.onVideoPage=t.onYouTubeCableTV=t.onMobile=void 0,t.onMobile=function(){return"m.youtube.com"===window.location.hostname},t.onYouTubeCableTV=function(){return"tv.youtube.com"===window.location.hostname},t.onVideoPage=function(){return!!document.URL.match(/\\/watch|\\/shorts|\\/live|\\/embed/)}},395:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getThumbnailSelectors=t.getThumbnailBoxSelectors=t.getThumbnailLink=t.getThumbnailImageSelectors=t.getThumbnailElementsToListenFor=t.getThumbnailElements=void 0;const i=n(705);function o(){return(0,i.onMobile)()?[".media-item-thumbnail-container",".video-thumbnail-container-compact","ytm-thumbnail-cover",".video-thumbnail-container-vertical","ytm-hero-playlist-thumbnail-renderer"]:["ytd-thumbnail","ytd-playlist-thumbnail","ytm-shorts-lockup-view-model","yt-thumbnail-view-model"]}function r(...e){return 0===e.length&&(e=[""]),o().map((t=>e.map((e=>`${t}${e}`)).join(", "))).join(", ")}t.getThumbnailElements=o,t.getThumbnailElementsToListenFor=function(){const e=o();return(0,i.onMobile)()||(e.push("yt-lockup-view-model"),e.push("ytm-shorts-lockup-view-model-v2")),e},t.getThumbnailImageSelectors=function(){return(0,i.onMobile)()?"img.video-thumbnail-img, img.amsterdam-playlist-thumbnail":"ytd-thumbnail:not([hidden]) img, ytd-playlist-thumbnail yt-image:not(.blurred-image) img, yt-img-shadow.ytd-hero-playlist-thumbnail-renderer img, ytm-shorts-lockup-view-model img, .yt-thumbnail-view-model__image img"},t.getThumbnailLink=function(e){return(0,i.onMobile)()?e.querySelector(["a.media-item-thumbnail-container","ytm-channel-featured-video-renderer a","a.compact-media-item-image","a.reel-item-endpoint",".amsterdam-playlist-thumbnail-wrapper a"].join(", ")):e.querySelector(r(" a"))},t.getThumbnailBoxSelectors=function(){return(0,i.onMobile)()?".media-item-thumbnail-container":r(":not([hidden])",".ytd-hero-playlist-thumbnail-renderer")},t.getThumbnailSelectors=r},291:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.versionHigher=void 0,t.versionHigher=function(e,t){const n=e.split("."),i=t.split(".");if(n.length!==i.length)return!0;for(let e=0;e<n.length;e++){const t=parseInt(n[e]),o=parseInt(i[e]);if(t>o)return!0;if(t<o)return!1}return!1}},303:e=>{e.exports={version:"1.1.48"}}},t={};(0,function n(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={exports:{}};return e[i].call(r.exports,r,r.exports,n),r.exports}(860).init)()})();'},5339:e=>{e.exports=JSON.parse('["www.youtubekids.com","inv.nadeko.net","inv.tux.pizza","invidious.adminforge.de","invidious.jing.rocks","invidious.nerdvpn.de","invidious.perennialte.ch","invidious.privacyredirect.com","invidious.reallyaweso.me","invidious.yourdevice.ch","iv.ggtyler.dev","iv.nboeck.de","yewtu.be"]')},8272:e=>{e.exports=JSON.parse('{"serverAddress":"https://sponsor.ajay.app","testingServerAddress":"https://sponsor.ajay.app/test","serverAddressComment":"This specifies the default SponsorBlock server to connect to","categoryList":["sponsor","selfpromo","exclusive_access","interaction","poi_highlight","intro","outro","preview","hook","filler","chapter","music_offtopic"],"categorySupport":{"sponsor":["skip","mute","full"],"selfpromo":["skip","mute","full"],"exclusive_access":["full"],"interaction":["skip","mute"],"intro":["skip","mute"],"outro":["skip","mute"],"preview":["skip","mute"],"hook":["skip","mute"],"filler":["skip","mute"],"music_offtopic":["skip"],"poi_highlight":["poi"],"chapter":["chapter"]},"wikiLinks":{"sponsor":"https://wiki.sponsor.ajay.app/w/Sponsor","selfpromo":"https://wiki.sponsor.ajay.app/w/Unpaid/Self_Promotion","exclusive_access":"https://wiki.sponsor.ajay.app/w/Exclusive_Access","interaction":"https://wiki.sponsor.ajay.app/w/Interaction_Reminder_(Subscribe)","intro":"https://wiki.sponsor.ajay.app/w/Intermission/Intro_Animation","outro":"https://wiki.sponsor.ajay.app/w/Endcards/Credits","preview":"https://wiki.sponsor.ajay.app/w/Preview/Recap","hook":"https://wiki.sponsor.ajay.app/w/Hook/Greetings","filler":"https://wiki.sponsor.ajay.app/w/Tangents/Jokes","music_offtopic":"https://wiki.sponsor.ajay.app/w/Music:_Non-Music_Section","poi_highlight":"https://wiki.sponsor.ajay.app/w/Highlight","guidelines":"https://wiki.sponsor.ajay.app/w/Guidelines","mute":"https://wiki.sponsor.ajay.app/w/Mute_Segment","chapter":"https://wiki.sponsor.ajay.app/w/Chapter"},"extensionImportList":{"chromium":["enamippconapkdmgfgjchkhakpfinmaj"],"firefox":["deArrow@ajay.app","deArrowBETA@ajay.app"],"safari":["app.ajay.dearrow.extension"]}}')},2303:e=>{e.exports={version:"1.1.48"}}},t={};!function n(o){var i=t[o];if(void 0!==i)return i.exports;var r=t[o]={exports:{}};return e[o].call(r.exports,r,r.exports,n),r.exports}(6069)})(); +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/js/content.js.LICENSE.txt b/data/extensions/sponsorBlocker@ajay.app/js/content.js.LICENSE.txt @@ -0,0 +1,29 @@ +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/data/extensions/sponsorBlocker@ajay.app/js/document.js b/data/extensions/sponsorBlocker@ajay.app/js/document.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={907:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.YT_DOMAINS=void 0,t.YT_DOMAINS=["m.youtube.com","www.youtube.com","www.youtube-nocookie.com","music.youtube.com","www.youtubekids.com","tv.youtube.com"]},148:function(e,t){var n=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(o,r){function a(e){try{d(i.next(e))}catch(e){r(e)}}function l(e){try{d(i.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}d((i=i.apply(e,t||[])).next())}))};function i(e,t=!1){var n,i,o;if(!e)return!1;if("VIDEO"===e.tagName&&(e.classList.contains("html5-main-video")||"player"===e.id||"player_html5_api"===e.id)&&1===[...document.querySelectorAll("video")].filter((e=>e.duration)).length&&e.duration)return!0;if(0===e.offsetHeight||0===e.offsetWidth&&!t)return!1;const r=null==e?void 0:e.getBoundingClientRect(),a=document.elementFromPoint(r.left+r.width/2,r.top+r.height/2)||document.elementFromPoint(r.left,r.top);return!a&&"movie_player"===e.id&&r.top<0||!!(a===e||a&&e.contains(a)||a&&a.contains(e))||"VIDEO"===e.tagName&&(!!(null===(n=null==a?void 0:a.closest(".html5-video-player"))||void 0===n?void 0:n.contains(e))||!!(null===(o=null===(i=null==e?void 0:e.closest("#inline-preview-player"))||void 0===i?void 0:i.classList)||void 0===o?void 0:o.contains("playing-mode")))}function o(e,t=!1,n=!0){var o,r;return i(e,t)||n&&!!e&&(i(e.parentElement,t)||i(null!==(r=null===(o=e.parentElement)||void 0===o?void 0:o.parentElement)&&void 0!==r?r:null,t))}function r(e,t=!1,n=!1){return a(e,t,n)}function a(e,t=!1,n=!1,i){for(const r of e){const e=i?i(r):r;if(e&&o(e,t,n))return e}return null}function l(e,t){for(const n of e){const e=document.querySelector(n);if(e&&t(e))return e}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.getElement=t.waitForElement=t.findNonEmptyElement=t.findPredicatedElement=t.findValidElement=t.findValidElementFromSelector=t.isVisibleOrParent=t.isVisible=void 0,t.isVisible=i,t.isVisibleOrParent=o,t.findValidElementFromSelector=function(e,t=!1,n=!1){return a(e,t,n,(e=>document.querySelector(e)))},t.findValidElement=r,t.findPredicatedElement=l,t.findNonEmptyElement=function(e){return l(e,(e=>{var t,n;return(null!==(n=null===(t=e.textContent)||void 0===t?void 0:t.trim())&&void 0!==n?n:"").length>0}))};let d=!1,s=null,u=[];function c(){if(!s){const e=e=>{var t;const n=[];for(const i of u){const{selector:o,visibleCheck:a,ignoreWidth:l,checkParent:d,callbacks:s}=i;let u=!0;if(e){let t=!1;for(const n of e)if("childList"===n.type&&n.addedNodes.length>0){if(n.target instanceof HTMLElement&&(n.target.matches(o)||n.target.querySelector(o))){t=!0;break}for(const e of n.addedNodes)if(e instanceof HTMLElement&&(e.matches(o)||e.querySelector(o))){t=!0;break}if(t)break}t||(u=!1)}const c=u?document.querySelectorAll(o):i.elements;if(c&&c.length>0){i.elements=c;const e=a?r(c,l,d):c[0];if(e){if(null===(t=chrome.runtime)||void 0===t?void 0:t.id)for(const t of s)t(e);n.push(o)}}}u=u.filter((e=>!n.includes(e.selector))),0===u.length&&(null==s||s.disconnect(),s=null,d=!1)};e(),u.length>0&&(s=new MutationObserver(e),s.observe(document.documentElement,{childList:!0,subtree:!0}))}}function m(e,t,n=!1,i=!1){return t?r(document.querySelectorAll(e),n,i):document.querySelector(e)}t.waitForElement=function(e,t=!1,i=!1,o=!1){return n(this,void 0,void 0,(function*(){return yield new Promise((n=>{const r=m(e,t,i,o);if(r)return void n(r);const a=u.find((n=>n.selector===e&&n.visibleCheck===t));a?a.callbacks.push(n):u.push({selector:e,visibleCheck:t,ignoreWidth:i,checkParent:o,callbacks:[n]}),d||(d=!0,document.body?c():window.addEventListener("DOMContentLoaded",(()=>{c()})))}))}))},t.getElement=m},860:function(e,t,n){var i=this&&this.__awaiter||function(e,t,n,i){return new(n||(n=Promise))((function(o,r){function a(e){try{d(i.next(e))}catch(e){r(e)}}function l(e){try{d(i.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}d((i=i.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.init=void 0;const o=n(291),r=n(303),a=n(907),l=n(395),d=n(705),s=n(445),u=n(148);let c,m="",v=!1,f=!1;const y=(0,l.getThumbnailElementsToListenFor)(),p=["/youtubei/v1/search","/youtubei/v1/guide","/youtubei/v1/browse","/youtubei/v1/next","/youtubei/v1/player"],h=["videoDetails","videoPrimaryInfoRenderer","videoSecondaryInfoRenderer","currentVideoEndpoint"],w=e=>{window.postMessage(Object.assign({source:"sponsorblock"},e),"/")};function b(e){var t,n;const i=c;if("ytu.app.lib.player.interaction-event"===e.type){if(!document.querySelector("#movie_player"))return;c=document.querySelector("#movie_player"),null===(t=c.querySelector("video"))||void 0===t||t.addEventListener("durationchange",T),null===(n=c.querySelector("video"))||void 0===n||n.addEventListener("loadstart",T)}else c=document.getElementById("movie_player");T(),i||(c.addEventListener("onAdStart",(()=>w({type:"ad",playing:!0}))),c.addEventListener("onAdFinish",(()=>w({type:"ad",playing:!1}))))}function g(e){const t=e.detail.pageType;if(t){const n={type:"navigation",pageType:t,videoID:null};if("shorts"===t||"watch"===t){const i=e.detail.endpoint;if(!i)return null;n.videoID=("shorts"===t?i.reelWatchEndpoint:i.watchEndpoint).videoId}return n}return null}function E(e){const t=g(e);t&&w(t)}function S(e){var t,n,i,o,r;T();const a=null===(r=null===(o=null===(i=null!==(n=null===(t=e.detail)||void 0===t?void 0:t.data)&&void 0!==n?n:e.detail)||void 0===i?void 0:i.response)||void 0===o?void 0:o.playerResponse)||void 0===r?void 0:r.videoDetails;if(a)w(Object.assign({channelID:a.channelId,channelTitle:a.author},g(e)));else{const t=g(e);t&&w(t)}}function T(){if(!c)return;const e=c.getVideoData(),t=c.isInline();e&&(e.video_id!==m||f!==e.isLive||v!==t||t)&&(m=e.video_id,v=t,f=e.isLive,w({type:"data",videoID:e.video_id,isLive:e.isLive,isPremiere:e.isPremiere,isInline:t}))}function L(e){w({type:"videoIDsLoaded",videoIDs:Array.from(I(e))})}function I(e){const t=new Set;for(const n in e)"videoId"===n?t.add(e[n]):"object"!=typeof e[n]||h.includes(n)||I(e[n]).forEach((e=>t.add(e)));return t}function k(e){var t,n,i,o,r,a,l,d;if(null===(t=e.data)||void 0===t?void 0:t.source)if("dearrow-media-session"===(null===(n=e.data)||void 0===n?void 0:n.source))(0,s.setMediaSessionInfo)(e.data.data);else if("dearrow-reset-media-session-thumbnail"===(null===(i=e.data)||void 0===i?void 0:i.source))(0,s.resetMediaSessionThumbnail)();else if("sb-reset-media-session-link"===(null===(o=e.data)||void 0===o?void 0:o.source))(0,s.resetLastArtworkSrc)();else if("sb-verify-time"===(null===(r=e.data)||void 0===r?void 0:r.source)){const t=[...document.querySelectorAll("video")].filter((e=>(0,u.isVisible)(e)))[0];c&&(null===(a=e.data)||void 0===a?void 0:a.rawTime)===(null==t?void 0:t.currentTime)&&Math.abs(c.getCurrentTime()-(null===(l=e.data)||void 0===l?void 0:l.time))>.1&&2===c.getPlayerState()&&w({type:"currentTimeWrong",playerTime:c.getCurrentTime(),expectedTime:null===(d=e.data)||void 0===d?void 0:d.time})}}const P={browserFetch:null,browserPush:null,customElementDefine:null,waitingInterval:null};let M=!1,_=null;function O(){var e;document.removeEventListener("yt-player-updated",b),document.removeEventListener("yt-navigate-start",E),document.removeEventListener("yt-navigate-finish",S),"tv.youtube.com"===document.location.host&&(document.removeEventListener("yt-navigate",S),document.removeEventListener("ytu.app.lib.player.interaction-event",b)),(0,d.onMobile)()&&window.removeEventListener("state-navigateend",S),P.browserFetch&&(window.fetch=P.browserFetch),P.browserPush&&(window.Array.prototype.push=P.browserPush),P.customElementDefine&&(window.customElements.define=P.customElementDefine),P.waitingInterval&&clearInterval(P.waitingInterval),window.removeEventListener("message",k),window.teardownCB=null,M=!0,null===(e=null==_?void 0:_.disconnect)||void 0===e||e.call(_)}function C(){_&&_.disconnect(),_=new MutationObserver((e=>{for(const t of e)for(const e of t.addedNodes)if(e instanceof HTMLElement)for(const t of y)if(e.tagName.toLowerCase()===t||e.querySelector(t))return void w({type:"newElement",name:t})})),_.observe(document.documentElement,{childList:!0,subtree:!0});for(const e of y)document.querySelector(e)&&w({type:"newElement",name:e})}t.init=function(){var e,t,n,l;const s="true"===(null===(t=null===(e=document.querySelector("#sponsorblock-document-script"))||void 0===e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"teardown")),u=window.versionCB&&(!window.versionCB||(0,o.versionHigher)(r.version,window.versionCB));if(s||u)null===(n=window.teardownCB)||void 0===n||n.call(window);else if(window.versionCB&&!(0,o.versionHigher)(r.version,window.versionCB))return;if(window.versionCB=r.version,window.teardownCB=O,!document.querySelector("#sponsorblock-document-script")){const e=document.createElement("div");e.id="sponsorblock-document-script",e.setAttribute("version",r.version),(document.head||document.documentElement).appendChild(e)}if(document.addEventListener("yt-player-updated",b),document.addEventListener("yt-navigate-start",E),document.addEventListener("yt-navigate-finish",S),"tv.youtube.com"===document.location.host&&(document.addEventListener("yt-navigate",S),document.addEventListener("ytu.app.lib.player.interaction-event",b),document.getElementById("#movie_player")&&(b({target:null===(l=document.getElementById("#movie_player"))||void 0===l?void 0:l.parentElement}),T())),(0,d.onMobile)()&&window.addEventListener("state-navigateend",S),a.YT_DOMAINS.includes(window.location.host)&&!(0,d.onMobile)()&&!(0,d.onYouTubeCableTV)())if(window.customElements){setTimeout((()=>{M||C()}),2e3);const e=window.customElements.define.bind(window.customElements);P.customElementDefine=e,Object.defineProperty(window.customElements,"define",{configurable:!0,enumerable:!1,writable:!0,value:(t,n,i)=>{let o=n;if(y.includes(t))if(M=!0,_&&(_.disconnect(),_=null),n.toString().startsWith("class")){class e extends n{constructor(){super(),w({type:"newElement",name:t})}}o=e}else o=function(){n.call(this),w({type:"newElement",name:t})},Object.setPrototypeOf(o.prototype,n.prototype),Object.setPrototypeOf(o,n);e(t,o,i)}})}else C();const c=window.fetch;P.browserFetch=c,window.fetch=(e,t=void 0)=>e instanceof Request&&p.some((t=>e.url.includes(t)))?(e.url.includes("/youtubei/v1/next")&&(setTimeout((()=>w({type:"newElement",name:""})),1e3),setTimeout((()=>w({type:"newElement",name:""})),2500),setTimeout((()=>w({type:"newElement",name:""})),8e3)),new Promise(((n,o)=>i(this,void 0,void 0,(function*(){try{const i=yield c(e,t),o=yield i.json();n(new Response(JSON.stringify(o),i)),L(o)}catch(e){o(e)}}))))):c(e,t);let m=0;const v={apply:(e,t,n)=>{if(n[0]&&n[0]!==window&&"number"==typeof n[0].start&&n[0].end&&"ssap"===n[0].namespace&&n[0].id){const e=n[0];if(e){const t=e.start;0!==t&&m!==t&&(m=t,w({type:"adDuration",duration:t/1e3}))}}return Reflect.apply(e,t,n)}};if(P.browserPush=window.Array.prototype.push,window.Array.prototype.push=new Proxy(window.Array.prototype.push,v),window.addEventListener("message",k),"undefined"!=typeof ytInitialData)L(ytInitialData);else{const e=setInterval((()=>{"undefined"!=typeof ytInitialData&&(L(ytInitialData),clearInterval(e))}),1);P.waitingInterval=e}setTimeout((()=>{setInterval.toString().includes("console.log(SCRIPTID, 'original interval:', interval, location.href)")&&alert('Warning: You have the user script "YouTube CPU Tamer". This causes performance issues with SponsorBlock, and does not actually improve CPU performance. Please uninstall this user script.')}),1e3)}},445:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.resetLastArtworkSrc=t.resetMediaSessionThumbnail=t.setMediaSessionInfo=void 0;let n=null,i=null,o=null;function r(e){var t,r,d;"mediaSession"in navigator&&(o||(o={}),o=Object.assign(Object.assign({},o),e),(null===(d=null===(r=null===(t=navigator.mediaSession.metadata)||void 0===t?void 0:t.artwork)||void 0===r?void 0:r[0])||void 0===d?void 0:d.src)&&!navigator.mediaSession.metadata.artwork[0].src.includes("dearrow-thumb")&&(n=navigator.mediaSession.metadata.artwork[0].src),l(navigator.mediaSession.metadata,o)&&(a(o),i&&clearTimeout(i),i=setTimeout((()=>{o&&l(navigator.mediaSession.metadata,o)&&a(o),i=null}),500)))}function a(e){var t,n,i,o,r,a,l,d;if("mediaSession"in navigator){const s=Object.assign({},function(){var e,t,n,i,o,r,a,l,d,s;const u=Object.assign(Object.assign({},navigator.mediaSession.metadata),{artwork:[...null!==(t=null===(e=navigator.mediaSession.metadata)||void 0===e?void 0:e.artwork)&&void 0!==t?t:[]]});return void 0===u.title?{title:null!==(i=null===(n=navigator.mediaSession.metadata)||void 0===n?void 0:n.title)&&void 0!==i?i:"",artist:null!==(r=null===(o=navigator.mediaSession.metadata)||void 0===o?void 0:o.artist)&&void 0!==r?r:"",album:null!==(l=null===(a=navigator.mediaSession.metadata)||void 0===a?void 0:a.album)&&void 0!==l?l:"",artwork:[...null!==(s=null===(d=navigator.mediaSession.metadata)||void 0===d?void 0:d.artwork)&&void 0!==s?s:[]]}:u}());for(const t in e)s[t]=e[t];(null===(n=null===(t=s.artwork)||void 0===t?void 0:t[0])||void 0===n?void 0:n.src)&&(null===(o=null===(i=s.artwork)||void 0===i?void 0:i[0])||void 0===o?void 0:o.src)!==(null===(l=null===(a=null===(r=navigator.mediaSession.metadata)||void 0===r?void 0:r.artwork)||void 0===a?void 0:a[0])||void 0===l?void 0:l.src)&&((null===(d=s.title)||void 0===d?void 0:d.endsWith(" "))?s.title=s.title.trim():s.title=s.title+" "),navigator.mediaSession.metadata=new MediaMetadata(s)}}function l(e,t){if(e&&t)for(const n of Object.keys(t)){if("object"==typeof t[n]&&l(e[n],t[n]))return!0;if(e[n]!==t[n])return!0}return!1}t.setMediaSessionInfo=r,t.resetMediaSessionThumbnail=function(){var e,t,i;n&&r({title:null===(i=null!==(e=null==o?void 0:o.title)&&void 0!==e?e:null===(t=navigator.mediaSession.metadata)||void 0===t?void 0:t.title)||void 0===i?void 0:i.trim(),artwork:[{src:n}]})},t.resetLastArtworkSrc=function(){n=null}},705:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.onVideoPage=t.onYouTubeCableTV=t.onMobile=void 0,t.onMobile=function(){return"m.youtube.com"===window.location.hostname},t.onYouTubeCableTV=function(){return"tv.youtube.com"===window.location.hostname},t.onVideoPage=function(){return!!document.URL.match(/\/watch|\/shorts|\/live|\/embed/)}},395:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getThumbnailSelectors=t.getThumbnailBoxSelectors=t.getThumbnailLink=t.getThumbnailImageSelectors=t.getThumbnailElementsToListenFor=t.getThumbnailElements=void 0;const i=n(705);function o(){return(0,i.onMobile)()?[".media-item-thumbnail-container",".video-thumbnail-container-compact","ytm-thumbnail-cover",".video-thumbnail-container-vertical","ytm-hero-playlist-thumbnail-renderer"]:["ytd-thumbnail","ytd-playlist-thumbnail","ytm-shorts-lockup-view-model","yt-thumbnail-view-model"]}function r(...e){return 0===e.length&&(e=[""]),o().map((t=>e.map((e=>`${t}${e}`)).join(", "))).join(", ")}t.getThumbnailElements=o,t.getThumbnailElementsToListenFor=function(){const e=o();return(0,i.onMobile)()||(e.push("yt-lockup-view-model"),e.push("ytm-shorts-lockup-view-model-v2")),e},t.getThumbnailImageSelectors=function(){return(0,i.onMobile)()?"img.video-thumbnail-img, img.amsterdam-playlist-thumbnail":"ytd-thumbnail:not([hidden]) img, ytd-playlist-thumbnail yt-image:not(.blurred-image) img, yt-img-shadow.ytd-hero-playlist-thumbnail-renderer img, ytm-shorts-lockup-view-model img, .yt-thumbnail-view-model__image img"},t.getThumbnailLink=function(e){return(0,i.onMobile)()?e.querySelector(["a.media-item-thumbnail-container","ytm-channel-featured-video-renderer a","a.compact-media-item-image","a.reel-item-endpoint",".amsterdam-playlist-thumbnail-wrapper a"].join(", ")):e.querySelector(r(" a"))},t.getThumbnailBoxSelectors=function(){return(0,i.onMobile)()?".media-item-thumbnail-container":r(":not([hidden])",".ytd-hero-playlist-thumbnail-renderer")},t.getThumbnailSelectors=r},291:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.versionHigher=void 0,t.versionHigher=function(e,t){const n=e.split("."),i=t.split(".");if(n.length!==i.length)return!0;for(let e=0;e<n.length;e++){const t=parseInt(n[e]),o=parseInt(i[e]);if(t>o)return!0;if(t<o)return!1}return!1}},303:e=>{e.exports={version:"1.1.48"}}},t={};(0,function n(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={exports:{}};return e[i].call(r.exports,r,r.exports,n),r.exports}(860).init)()})(); +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/js/help.js b/data/extensions/sponsorBlocker@ajay.app/js/help.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={1740:function(e,o,t){var i=this&&this.__awaiter||function(e,o,t,i){return new(t||(t=Promise))((function(n,r){function s(e){try{c(i.next(e))}catch(e){r(e)}}function a(e){try{c(i.throw(e))}catch(e){r(e)}}function c(e){var o;e.done?n(e.value):(o=e.value,o instanceof t?o:new t((function(e){e(o)}))).then(s,a)}c((i=i.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.keybindToString=o.formatKey=o.keybindEquals=o.isSafari=o.ProtoConfig=void 0;const n=t(1108);function r(){return"undefined"!=typeof navigator&&"Apple Computer, Inc."===navigator.vendor}function s(e){return null==e?"":" "==e?"Space":1==e.length?e.toUpperCase():e}o.ProtoConfig=class{constructor(e,o,t,i=!1){this.configLocalListeners=[],this.configSyncListeners=[],this.cachedSyncConfig=null,this.cachedLocalStorage=null,this.config=null,this.local=null,this.inDeArrow=!1,this.syncDefaults=e,this.localDefaults=o,this.inDeArrow=i,this.setupConfig(t).then((e=>{this.config=null==e?void 0:e.sync,this.local=null==e?void 0:e.local}))}configProxy(){chrome.storage.onChanged.addListener(((e,o)=>{if("sync"===o){for(const o in e)this.cachedSyncConfig[o]=e[o].newValue;for(const o of this.configSyncListeners)o(e)}else if("local"===o){for(const o in e)this.cachedLocalStorage[o]=e[o].newValue;for(const o of this.configLocalListeners)o(e)}}));let e=0;const o=new Set;let t=null;const i=this,n={set(n,r,s){if(i.cachedSyncConfig[r]=s,Date.now()-e<100){if(o.add(r),!t){const e=()=>{const e=[...o];o.clear(),chrome.storage.sync.set(e.map((e=>[e,i.cachedSyncConfig[e]])).reduce(((e,[o,t])=>(e[o]=t,e)),{})),t=null};t=setTimeout(e,20)}return!0}return chrome.storage.sync.set({[r]:s}),e=Date.now(),!0},get(e,o){const t=i.cachedSyncConfig[o];return e[o]||t},deleteProperty:(e,o)=>(chrome.storage.sync.remove(o),!0)},r={set:(e,o,t)=>(i.cachedLocalStorage[o]=t,chrome.storage.local.set({[o]:t}),!0),get(e,o){const t=i.cachedLocalStorage[o];return e[o]||t},deleteProperty:(e,o)=>(chrome.storage.local.remove(o),!0)};return{sync:new Proxy({handler:n},n),local:new Proxy({handler:r},r)}}forceSyncUpdate(e){const o=this.cachedSyncConfig[e];chrome.storage.sync.set({[e]:o})}forceLocalUpdate(e){const o=this.cachedLocalStorage[e];chrome.storage.local.set({[e]:o},(()=>{const o=chrome.runtime.lastError;o&&"navigationApiAvailable"!==e&&alert(`SponsorBlock/DeArrow: ${chrome.i18n.getMessage("storageFull")}\n\n${o}`)}))}fetchConfig(){return i(this,void 0,void 0,(function*(){yield Promise.all([new Promise((e=>{chrome.storage.sync.get(null,(o=>{this.cachedSyncConfig=o,void 0===this.cachedSyncConfig&&(this.cachedSyncConfig={},(this.inDeArrow||window.location.href.includes("options.html"))&&alert(`${chrome.i18n.getMessage("syncDisabledWarning")}${this.inDeArrow?`\n\n${chrome.i18n.getMessage("syncDisabledWarningDeArrow")}`:""}${(0,n.isFirefoxOrSafari)()&&!r()?`\n\n${chrome.i18n.getMessage("syncDisabledFirefoxSuggestions")}`:""}`)),e()}))})),new Promise((e=>{chrome.storage.local.get(null,(o=>{this.cachedLocalStorage=null!=o?o:{},e()}))}))])}))}setupConfig(e){return i(this,void 0,void 0,(function*(){if("undefined"==typeof chrome)return null;yield this.fetchConfig(),this.addDefaults();const o=this.configProxy();return e(o.sync),o}))}addDefaults(){for(const e in this.syncDefaults)if(Object.prototype.hasOwnProperty.call(this.cachedSyncConfig,e)){if("barTypes"===e)for(const o in this.syncDefaults[e])Object.prototype.hasOwnProperty.call(this.cachedSyncConfig[e],o)||(this.cachedSyncConfig[e][o]=this.syncDefaults[e][o])}else this.cachedSyncConfig[e]=this.syncDefaults[e];for(const e in this.localDefaults)Object.prototype.hasOwnProperty.call(this.cachedLocalStorage,e)||(this.cachedLocalStorage[e]=this.localDefaults[e])}isReady(){return null!==this.config}},o.isSafari=r,o.keybindEquals=function(e,o){return!(null==e||null==o||Boolean(e.alt)!=Boolean(o.alt)||Boolean(e.ctrl)!=Boolean(o.ctrl)||Boolean(e.shift)!=Boolean(o.shift)||null==e.key&&null==e.code||null==o.key&&null==o.code)&&(null!=e.code&&null!=o.code?e.code===o.code:null!=e.key&&null!=o.key&&e.key.toUpperCase()===o.key.toUpperCase())},o.formatKey=s,o.keybindToString=function(e){if(null==e||null==e.key)return"";let o="";return e.ctrl&&(o+="Ctrl + "),e.alt&&(o+="Alt + "),e.shift&&(o+="Shift + "),o+s(e.key)}},1108:function(e,o){var t=this&&this.__awaiter||function(e,o,t,i){return new(t||(t=Promise))((function(n,r){function s(e){try{c(i.next(e))}catch(e){r(e)}}function a(e){try{c(i.throw(e))}catch(e){r(e)}}function c(e){var o;e.done?n(e.value):(o=e.value,o instanceof t?o:new t((function(e){e(o)}))).then(s,a)}c((i=i.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.extensionUserAgent=o.isFirefoxOrSafari=o.timeoutPomise=o.PromiseTimeoutError=o.objectToURI=o.waitFor=void 0,o.waitFor=function(e,o=5e3,i=100,n){return t(this,void 0,void 0,(function*(){return yield new Promise(((t,r)=>{let s=null;const a=()=>{const o=e();(n?n(o):o)&&(t(o),s&&clearInterval(s))};o&&(setTimeout((()=>{clearInterval(s),r(`TIMEOUT waiting for ${null==e?void 0:e.toString()}: ${Error().stack}`)}),o),s=setInterval(a,i)),a()}))}))},o.objectToURI=function(e,o,t){let i=0;for(const n in o){const r=e.includes("?")||i>0?"&":t?"?":"",s="string"==typeof o[n]?o[n]:JSON.stringify(o[n]);e+=r+encodeURIComponent(n)+"="+encodeURIComponent(s),i++}return e};class i extends Error{constructor(e){super("Promise timed out"),this.promise=e}}let n;o.PromiseTimeoutError=i,o.timeoutPomise=function(e){return new Promise(((o,t)=>{e&&setTimeout((()=>{t(new i)}),e)}))},o.isFirefoxOrSafari=function(){return"undefined"!=typeof browser},o.extensionUserAgent=function(){return null!=n||(n=`${chrome.runtime.id}/v${chrome.runtime.getManifest().version}`),n}},3497:(e,o)=>{function t(e){const o=e.replace(/__MSG_(\w+)__/g,(function(e,o){return o?chrome.i18n.getMessage(o).replace(/</g,"&#60;").replace(/"/g,"&quot;").replace(/\n/g,"<br/>"):""}));return o!=e&&o}Object.defineProperty(o,"__esModule",{value:!0}),o.getLocalizedMessage=o.localizeHtmlPage=o.generateUserID=void 0,o.generateUserID=function(e=36){const o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let t="";const i="undefined"==typeof window?crypto:window.crypto;if(i&&i.getRandomValues){const n=new Uint32Array(e);i.getRandomValues(n);for(let i=0;i<e;i++)t+=o[n[i]%62];return t}for(let i=0;i<e;i++)t+=o[Math.floor(62*Math.random())];return t},o.localizeHtmlPage=function(){const e=t(document.title);e&&(document.title=e);const o=document.querySelector(".sponsorBlockPageBody"),i=t(o.innerHTML.toString());i&&(o.innerHTML=i)},o.getLocalizedMessage=t},8856:(e,o,t)=>{Object.defineProperty(o,"__esModule",{value:!0}),o.generateDebugDetails=void 0;const i=t(8272),n=t(5339),r=t(9209),s=t(1740);class a extends s.ProtoConfig{resetToDefault(){chrome.storage.sync.set(Object.assign(Object.assign({},this.syncDefaults),{userID:this.config.userID,minutesSaved:this.config.minutesSaved,skipCount:this.config.skipCount,sponsorTimesContributed:this.config.sponsorTimesContributed})),chrome.storage.local.set(Object.assign({},this.localDefaults))}}const c=new a({userID:null,isVip:!1,permissions:{},defaultCategory:"chooseACategory",renderSegmentsAsChapters:!1,whitelistedChannels:[],forceChannelCheck:!1,minutesSaved:0,skipCount:0,sponsorTimesContributed:0,submissionCountSinceCategories:0,showTimeWithSkips:!0,disableSkipping:!1,muteSegments:!0,fullVideoSegments:!0,fullVideoLabelsOnThumbnails:!0,manualSkipOnFullVideo:!1,trackViewCount:!0,trackViewCountInPrivate:!0,trackDownvotes:!0,trackDownvotesInPrivate:!1,dontShowNotice:!1,showUpcomingNotice:!1,noticeVisibilityMode:r.NoticeVisibilityMode.FadedForAutoSkip,hideVideoPlayerControls:!1,hideInfoButtonPlayerControls:!1,hideDeleteButtonPlayerControls:!1,hideUploadButtonPlayerControls:!1,hideSkipButtonPlayerControls:!1,hideDiscordLaunches:0,hideDiscordLink:!1,invidiousInstances:["invidious.snopyta.org"],supportInvidious:!1,serverAddress:i.serverAddress,minDuration:0,skipNoticeDuration:4,audioNotificationOnSkip:!1,checkForUnlistedVideos:!1,testingServer:!1,ytInfoPermissionGranted:!1,allowExpirements:!0,showDonationLink:!0,showPopupDonationCount:0,showUpsells:!0,showNewFeaturePopups:!0,donateClicked:0,autoHideInfoButton:!0,autoSkipOnMusicVideos:!1,skipNonMusicOnlyOnYoutubeMusic:!1,scrollToEditTimeUpdate:!1,categoryPillUpdate:!1,hookUpdate:!1,showChapterInfoMessage:!0,darkMode:!0,showCategoryGuidelines:!0,showCategoryWithoutPermission:!1,showSegmentNameInChapterBar:!0,showAutogeneratedChapters:!0,useVirtualTime:!0,showSegmentFailedToFetchWarning:!0,allowScrollingToEdit:!0,deArrowInstalled:!1,showDeArrowPromotion:!0,showDeArrowInSettings:!0,shownDeArrowPromotion:!1,showZoomToFillError2:!0,cleanPopup:!1,hideSegmentCreationInPopup:!1,categoryPillColors:{},skipKeybind:{key:"Enter"},skipToHighlightKeybind:{key:"Enter",ctrl:!0},startSponsorKeybind:{key:";"},submitKeybind:{key:"'"},actuallySubmitKeybind:{key:"'",ctrl:!0},previewKeybind:{key:";",ctrl:!0},nextChapterKeybind:{key:"ArrowRight",ctrl:!0},previousChapterKeybind:{key:"ArrowLeft",ctrl:!0},closeSkipNoticeKeybind:{key:"Backspace"},downvoteKeybind:{key:"h",shift:!0},upvoteKeybind:{key:"g",shift:!0},categorySelections:[{name:"sponsor",option:r.CategorySkipOption.AutoSkip},{name:"poi_highlight",option:r.CategorySkipOption.ManualSkip},{name:"exclusive_access",option:r.CategorySkipOption.ShowOverlay},{name:"chapter",option:r.CategorySkipOption.ShowOverlay}],payments:{licenseKey:null,lastCheck:0,lastFreeCheck:0,freeAccess:!1,chaptersAllowed:!1},colorPalette:{red:"#780303",white:"#ffffff",locked:"#ffc83d"},barTypes:{"preview-chooseACategory":{color:"#ffffff",opacity:"0.7"},sponsor:{color:"#00d400",opacity:"0.7"},"preview-sponsor":{color:"#007800",opacity:"0.7"},selfpromo:{color:"#ffff00",opacity:"0.7"},"preview-selfpromo":{color:"#bfbf35",opacity:"0.7"},exclusive_access:{color:"#008a5c",opacity:"0.7"},interaction:{color:"#cc00ff",opacity:"0.7"},"preview-interaction":{color:"#6c0087",opacity:"0.7"},intro:{color:"#00ffff",opacity:"0.7"},"preview-intro":{color:"#008080",opacity:"0.7"},outro:{color:"#0202ed",opacity:"0.7"},"preview-outro":{color:"#000070",opacity:"0.7"},preview:{color:"#008fd6",opacity:"0.7"},"preview-preview":{color:"#005799",opacity:"0.7"},hook:{color:"#395699",opacity:"0.8"},"preview-hook":{color:"#273963",opacity:"0.7"},music_offtopic:{color:"#ff9900",opacity:"0.7"},"preview-music_offtopic":{color:"#a6634a",opacity:"0.7"},poi_highlight:{color:"#ff1684",opacity:"0.7"},"preview-poi_highlight":{color:"#9b044c",opacity:"0.7"},filler:{color:"#7300FF",opacity:"0.9"},"preview-filler":{color:"#2E0066",opacity:"0.7"},chapter:{color:"#ffd983",opacity:"0"}}},{downvotedSegments:{},navigationApiAvailable:null,alreadyInstalled:!1,unsubmittedSegments:{},skipRules:[]},(function(e){if(e.changeChapterColor||(e.barTypes.chapter.color="#ffd983",e.changeChapterColor=!0,chrome.storage.sync.set({changeChapterColor:!0,barTypes:e.barTypes})),e.showZoomToFillError&&chrome.storage.sync.remove("showZoomToFillError"),e.unsubmittedSegments&&Object.keys(e.unsubmittedSegments).length>0&&chrome.storage.local.set({unsubmittedSegments:e.unsubmittedSegments},(()=>{chrome.storage.sync.remove("unsubmittedSegments")})),e.chapterCategoryAdded||(e.chapterCategoryAdded=!0,e.categorySelections.some((e=>"chapter"===e.name))||(e.categorySelections.push({name:"chapter",option:r.CategorySkipOption.ShowOverlay}),e.categorySelections=e.categorySelections)),void 0!==e.exclusive_accessCategoryAdded&&chrome.storage.sync.remove("exclusive_accessCategoryAdded"),void 0!==e.fillerUpdate&&chrome.storage.sync.remove("fillerUpdate"),void 0!==e.highlightCategoryAdded&&chrome.storage.sync.remove("highlightCategoryAdded"),void 0!==e.highlightCategoryUpdate&&chrome.storage.sync.remove("highlightCategoryUpdate"),e.askAboutUnlistedVideos&&chrome.storage.sync.remove("askAboutUnlistedVideos"),!e.autoSkipOnMusicVideosUpdate){e.autoSkipOnMusicVideosUpdate=!0;for(const o of e.categorySelections)if("music_offtopic"===o.name&&o.option===r.CategorySkipOption.AutoSkip){e.autoSkipOnMusicVideos=!0;break}}if(e.disableAutoSkip)for(const o of e.categorySelections)"sponsor"===o.name&&(o.option=r.CategorySkipOption.ManualSkip,chrome.storage.sync.remove("disableAutoSkip"));"string"==typeof e.skipKeybind&&(e.skipKeybind={key:e.skipKeybind}),"string"==typeof e.startSponsorKeybind&&(e.startSponsorKeybind={key:e.startSponsorKeybind}),"string"==typeof e.submitKeybind&&(e.submitKeybind={key:e.submitKeybind});const o=["skipKeybind","startSponsorKeybind","submitKeybind"];for(let t=o.length-1;t>=0;t--)for(let i=0;i<o.length;i++)t!=i&&(0,s.keybindEquals)(e[o[t]],e[o[i]])&&(e[o[t]]=null);void 0!==e.sponsorVideoID&&chrome.storage.sync.remove("sponsorVideoID"),void 0!==e.previousVideoID&&chrome.storage.sync.remove("previousVideoID"),!e.supportInvidious&&e.invidiousInstances.length<n.length&&(e.invidiousInstances=[...new Set([...n,...e.invidiousInstances])]),e.lastIsVipUpdate&&chrome.storage.sync.remove("lastIsVipUpdate")}));o.default=c,o.generateDebugDetails=function(){const e={debug:{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,extensionVersion:chrome.runtime.getManifest().version},config:JSON.parse(JSON.stringify(c.cachedSyncConfig))};return delete e.config.userID,e.config.serverAddress=e.config.serverAddress===i.serverAddress?"Default server address":"Custom server address",e.config.invidiousInstances=e.config.invidiousInstances.length,e.config.whitelistedChannels=e.config.whitelistedChannels.length,JSON.stringify(e,null,4)}},3105:function(e,o,t){var i=this&&this.__awaiter||function(e,o,t,i){return new(t||(t=Promise))((function(n,r){function s(e){try{c(i.next(e))}catch(e){r(e)}}function a(e){try{c(i.throw(e))}catch(e){r(e)}}function c(e){var o;e.done?n(e.value):(o=e.value,o instanceof t?o:new t((function(e){e(o)}))).then(s,a)}c((i=i.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0});const n=t(3497),r=t(8856),s=t(997),a=t(1108),c=t(8249);function l(){return i(this,void 0,void 0,(function*(){(0,n.localizeHtmlPage)(),yield(0,a.waitFor)((()=>null!==r.default.config)),r.default.config.darkMode||document.documentElement.setAttribute("data-theme","light"),(0,s.showDonationLink)()||(document.getElementById("donate-component").style.display="none")}))}"complete"===document.readyState?l():document.addEventListener("DOMContentLoaded",l),(0,a.waitFor)((()=>r.default.isReady())).then((()=>{r.default.config.showNewFeaturePopups&&r.default.config.showUpsells&&(0,c.isDeArrowInstalled)().then((e=>{if(!e){const e=document.getElementById("dearrow-link");e.classList.remove("hidden"),e.addEventListener("click",(()=>r.default.config.showDeArrowPromotion=!1)),e.querySelector("#dearrow-link-text").textContent=`${chrome.i18n.getMessage("DeArrowPromotionMessage2").split("?")[0]}? ${chrome.i18n.getMessage("DeArrowPromotionMessage3")}`,e.querySelector(".close-button").addEventListener("click",(o=>{o.preventDefault(),e.classList.add("hidden"),r.default.config.showDeArrowPromotion=!1,r.default.config.showDeArrowInSettings=!1}))}}))}))},9209:(e,o)=>{var t,i,n,r,s,a;Object.defineProperty(o,"__esModule",{value:!0}),o.NoticeVisibilityMode=o.ChannelIDStatus=o.SponsorSourceType=o.ActionTypes=o.ActionType=o.SponsorHideType=o.CategorySkipOption=void 0,(a=o.CategorySkipOption||(o.CategorySkipOption={}))[a.Disabled=-1]="Disabled",a[a.ShowOverlay=0]="ShowOverlay",a[a.ManualSkip=1]="ManualSkip",a[a.AutoSkip=2]="AutoSkip",(s=o.SponsorHideType||(o.SponsorHideType={}))[s.Visible=void 0]="Visible",s[s.Downvoted=1]="Downvoted",s[s.MinimumDuration=2]="MinimumDuration",s[s.Hidden=3]="Hidden",function(e){e.Skip="skip",e.Mute="mute",e.Chapter="chapter",e.Full="full",e.Poi="poi"}(t=o.ActionType||(o.ActionType={})),o.ActionTypes=[t.Skip,t.Mute,t.Chapter,t.Full,t.Poi],(r=o.SponsorSourceType||(o.SponsorSourceType={}))[r.Server=void 0]="Server",r[r.Local=1]="Local",r[r.YouTube=2]="YouTube",r[r.Autogenerated=3]="Autogenerated",(n=o.ChannelIDStatus||(o.ChannelIDStatus={}))[n.Fetching=0]="Fetching",n[n.Found=1]="Found",n[n.Failed=2]="Failed",(i=o.NoticeVisibilityMode||(o.NoticeVisibilityMode={}))[i.FullSize=0]="FullSize",i[i.MiniForAutoSkip=1]="MiniForAutoSkip",i[i.MiniForAll=2]="MiniForAll",i[i.FadedForAutoSkip=3]="FadedForAutoSkip",i[i.FadedForAll=4]="FadedForAll"},997:(e,o,t)=>{Object.defineProperty(o,"__esModule",{value:!0}),o.showDonationLink=void 0;const i=t(8856);o.showDonationLink=function(){return"Apple Computer, Inc."!==navigator.vendor&&i.default.config.showDonationLink}},8249:(e,o,t)=>{Object.defineProperty(o,"__esModule",{value:!0}),o.getExtensionIdsToImportFrom=o.isDeArrowInstalled=void 0;const i=t(8272),n=t(8856),r=t(1740),s=t(1108);function a(){return(0,r.isSafari)()?i.extensionImportList.safari:(0,s.isFirefoxOrSafari)()?i.extensionImportList.firefox:i.extensionImportList.chromium}o.isDeArrowInstalled=function(){return n.default.config.deArrowInstalled?Promise.resolve(!0):new Promise((e=>{const o=a();let t=0;for(const i of o)chrome.runtime.sendMessage(i,{message:"isInstalled"},(i=>{if(chrome.runtime.lastError)return t++,void(t===o.length&&e(!1));e(i),i&&(n.default.config.deArrowInstalled=!0)}))}))},o.getExtensionIdsToImportFrom=a},5339:e=>{e.exports=JSON.parse('["www.youtubekids.com","inv.nadeko.net","inv.tux.pizza","invidious.adminforge.de","invidious.jing.rocks","invidious.nerdvpn.de","invidious.perennialte.ch","invidious.privacyredirect.com","invidious.reallyaweso.me","invidious.yourdevice.ch","iv.ggtyler.dev","iv.nboeck.de","yewtu.be"]')},8272:e=>{e.exports=JSON.parse('{"serverAddress":"https://sponsor.ajay.app","testingServerAddress":"https://sponsor.ajay.app/test","serverAddressComment":"This specifies the default SponsorBlock server to connect to","categoryList":["sponsor","selfpromo","exclusive_access","interaction","poi_highlight","intro","outro","preview","hook","filler","chapter","music_offtopic"],"categorySupport":{"sponsor":["skip","mute","full"],"selfpromo":["skip","mute","full"],"exclusive_access":["full"],"interaction":["skip","mute"],"intro":["skip","mute"],"outro":["skip","mute"],"preview":["skip","mute"],"hook":["skip","mute"],"filler":["skip","mute"],"music_offtopic":["skip"],"poi_highlight":["poi"],"chapter":["chapter"]},"wikiLinks":{"sponsor":"https://wiki.sponsor.ajay.app/w/Sponsor","selfpromo":"https://wiki.sponsor.ajay.app/w/Unpaid/Self_Promotion","exclusive_access":"https://wiki.sponsor.ajay.app/w/Exclusive_Access","interaction":"https://wiki.sponsor.ajay.app/w/Interaction_Reminder_(Subscribe)","intro":"https://wiki.sponsor.ajay.app/w/Intermission/Intro_Animation","outro":"https://wiki.sponsor.ajay.app/w/Endcards/Credits","preview":"https://wiki.sponsor.ajay.app/w/Preview/Recap","hook":"https://wiki.sponsor.ajay.app/w/Hook/Greetings","filler":"https://wiki.sponsor.ajay.app/w/Tangents/Jokes","music_offtopic":"https://wiki.sponsor.ajay.app/w/Music:_Non-Music_Section","poi_highlight":"https://wiki.sponsor.ajay.app/w/Highlight","guidelines":"https://wiki.sponsor.ajay.app/w/Guidelines","mute":"https://wiki.sponsor.ajay.app/w/Mute_Segment","chapter":"https://wiki.sponsor.ajay.app/w/Chapter"},"extensionImportList":{"chromium":["enamippconapkdmgfgjchkhakpfinmaj"],"firefox":["deArrow@ajay.app","deArrowBETA@ajay.app"],"safari":["app.ajay.dearrow.extension"]}}')}},o={};!function t(i){var n=o[i];if(void 0!==n)return n.exports;var r=o[i]={exports:{}};return e[i].call(r.exports,r,r.exports,t),r.exports}(3105)})(); +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/js/options.js b/data/extensions/sponsorBlocker@ajay.app/js/options.js @@ -0,0 +1,2 @@ +/*! For license information please see options.js.LICENSE.txt */ +(()=>{"use strict";var e={2551:(e,t,n)=>{var r=n(6540),o=n(9982);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var a=new Set,l={};function s(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(l[e]=t,e=0;e<t.length;e++)a.add(t[e])}var c=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p={},h={};function m(e,t,n,r,o,i,a){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=a}var g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new m(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function b(e,t,n,r){var o=g.hasOwnProperty(t)?g[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(h,e)||!d.call(p,e)&&(f.test(e)?h[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);g[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);g[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);g[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var k=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,w=Symbol.for("react.element"),S=Symbol.for("react.portal"),C=Symbol.for("react.fragment"),E=Symbol.for("react.strict_mode"),x=Symbol.for("react.profiler"),T=Symbol.for("react.provider"),_=Symbol.for("react.context"),L=Symbol.for("react.forward_ref"),I=Symbol.for("react.suspense"),P=Symbol.for("react.suspense_list"),D=Symbol.for("react.memo"),M=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var N=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var O=Symbol.iterator;function A(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=O&&e[O]||e["@@iterator"])?e:null}var F,R=Object.assign;function U(e){if(void 0===F)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);F=t&&t[1]||""}return"\n"+F+e}var z=!1;function V(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(e){var r=e}Reflect.construct(e,[],t)}else{try{t.call()}catch(e){r=e}e.call(t.prototype)}else{try{throw Error()}catch(e){r=e}e()}}catch(t){if(t&&r&&"string"==typeof t.stack){for(var o=t.stack.split("\n"),i=r.stack.split("\n"),a=o.length-1,l=i.length-1;1<=a&&0<=l&&o[a]!==i[l];)l--;for(;1<=a&&0<=l;a--,l--)if(o[a]!==i[l]){if(1!==a||1!==l)do{if(a--,0>--l||o[a]!==i[l]){var s="\n"+o[a].replace(" at new "," at ");return e.displayName&&s.includes("<anonymous>")&&(s=s.replace("<anonymous>",e.displayName)),s}}while(1<=a&&0<=l);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?U(e):""}function j(e){switch(e.tag){case 5:return U(e.type);case 16:return U("Lazy");case 13:return U("Suspense");case 19:return U("SuspenseList");case 0:case 2:case 15:return V(e.type,!1);case 11:return V(e.type.render,!1);case 1:return V(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case C:return"Fragment";case S:return"Portal";case x:return"Profiler";case E:return"StrictMode";case I:return"Suspense";case P:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case _:return(e.displayName||"Context")+".Consumer";case T:return(e._context.displayName||"Context")+".Provider";case L:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case D:return null!==(t=e.displayName||null)?t:q(e.type)||"Memo";case M:t=e._payload,e=e._init;try{return q(e(t))}catch(e){}}return null}function B(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return q(t);case 8:return t===E?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function $(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function H(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function K(e){e._valueTracker||(e._valueTracker=function(e){var t=H(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,i.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=H(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Y(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Q(e,t){var n=t.checked;return R({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function G(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=$(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function J(e,t){null!=(t=t.checked)&&b(e,"checked",t,!1)}function X(e,t){J(e,t);var n=$(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,$(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function Z(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&Y(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+$(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return R({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(te(n)){if(1<n.length)throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:$(n)}}function ie(e,t){var n=$(t.value),r=$(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ae(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function le(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function se(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?le(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ue,ce,de=(ce=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ue=ue||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ue.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ce(e,t)}))}:ce);function fe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},he=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||pe.hasOwnProperty(e)&&pe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(pe).forEach((function(e){he.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var ve=R({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ye(e,t){if(t){if(ve[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function be(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ke=null;function we(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Se=null,Ce=null,Ee=null;function xe(e){if(e=ko(e)){if("function"!=typeof Se)throw Error(i(280));var t=e.stateNode;t&&(t=So(t),Se(e.stateNode,e.type,t))}}function Te(e){Ce?Ee?Ee.push(e):Ee=[e]:Ce=e}function _e(){if(Ce){var e=Ce,t=Ee;if(Ee=Ce=null,xe(e),t)for(e=0;e<t.length;e++)xe(t[e])}}function Le(e,t){return e(t)}function Ie(){}var Pe=!1;function De(e,t,n){if(Pe)return e(t,n);Pe=!0;try{return Le(e,t,n)}finally{Pe=!1,(null!==Ce||null!==Ee)&&(Ie(),_e())}}function Me(e,t){var n=e.stateNode;if(null===n)return null;var r=So(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var Ne=!1;if(c)try{var Oe={};Object.defineProperty(Oe,"passive",{get:function(){Ne=!0}}),window.addEventListener("test",Oe,Oe),window.removeEventListener("test",Oe,Oe)}catch(ce){Ne=!1}function Ae(e,t,n,r,o,i,a,l,s){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(e){this.onError(e)}}var Fe=!1,Re=null,Ue=!1,ze=null,Ve={onError:function(e){Fe=!0,Re=e}};function je(e,t,n,r,o,i,a,l,s){Fe=!1,Re=null,Ae.apply(Ve,arguments)}function qe(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Be(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==(e=e.alternate)&&(t=e.memoizedState),null!==t)return t.dehydrated}return null}function $e(e){if(qe(e)!==e)throw Error(i(188))}function He(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=qe(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var a=o.alternate;if(null===a){if(null!==(r=o.return)){n=r;continue}break}if(o.child===a.child){for(a=o.child;a;){if(a===n)return $e(o),e;if(a===r)return $e(o),t;a=a.sibling}throw Error(i(188))}if(n.return!==r.return)n=o,r=a;else{for(var l=!1,s=o.child;s;){if(s===n){l=!0,n=o,r=a;break}if(s===r){l=!0,r=o,n=a;break}s=s.sibling}if(!l){for(s=a.child;s;){if(s===n){l=!0,n=a,r=o;break}if(s===r){l=!0,r=a,n=o;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e))?Ke(e):null}function Ke(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ke(e);if(null!==t)return t;e=e.sibling}return null}var We=o.unstable_scheduleCallback,Ye=o.unstable_cancelCallback,Qe=o.unstable_shouldYield,Ge=o.unstable_requestPaint,Je=o.unstable_now,Xe=o.unstable_getCurrentPriorityLevel,Ze=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,it=null,at=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(lt(e)/st|0)|0},lt=Math.log,st=Math.LN2,ut=64,ct=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,a=268435455&n;if(0!==a){var l=a&~o;0!==l?r=dt(l):0!=(i&=a)&&(r=dt(i))}else 0!=(a=n&~o)?r=dt(a):0!==i&&(r=dt(i));if(0===r)return 0;if(0!==t&&t!==r&&!(t&o)&&((o=r&-r)>=(i=t&-t)||16===o&&4194240&i))return t;if(4&r&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-at(t)),r|=e[n],t&=~o;return r}function pt(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function ht(e){return 0!=(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function mt(){var e=ut;return!(4194240&(ut<<=1))&&(ut=64),e}function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function vt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-at(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-at(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var bt=0;function kt(e){return 1<(e&=-e)?4<e?268435455&e?16:536870912:4:1}var wt,St,Ct,Et,xt,Tt=!1,_t=[],Lt=null,It=null,Pt=null,Dt=new Map,Mt=new Map,Nt=[],Ot="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function At(e,t){switch(e){case"focusin":case"focusout":Lt=null;break;case"dragenter":case"dragleave":It=null;break;case"mouseover":case"mouseout":Pt=null;break;case"pointerover":case"pointerout":Dt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Mt.delete(t.pointerId)}}function Ft(e,t,n,r,o,i){return null===e||e.nativeEvent!==i?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:i,targetContainers:[o]},null!==t&&null!==(t=ko(t))&&St(t),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Rt(e){var t=bo(e.target);if(null!==t){var n=qe(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Be(n)))return e.blockedOn=t,void xt(e.priority,(function(){Ct(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ut(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=ko(n))&&St(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);ke=r,n.target.dispatchEvent(r),ke=null,t.shift()}return!0}function zt(e,t,n){Ut(e)&&n.delete(t)}function Vt(){Tt=!1,null!==Lt&&Ut(Lt)&&(Lt=null),null!==It&&Ut(It)&&(It=null),null!==Pt&&Ut(Pt)&&(Pt=null),Dt.forEach(zt),Mt.forEach(zt)}function jt(e,t){e.blockedOn===t&&(e.blockedOn=null,Tt||(Tt=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Vt)))}function qt(e){function t(t){return jt(t,e)}if(0<_t.length){jt(_t[0],e);for(var n=1;n<_t.length;n++){var r=_t[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Lt&&jt(Lt,e),null!==It&&jt(It,e),null!==Pt&&jt(Pt,e),Dt.forEach(t),Mt.forEach(t),n=0;n<Nt.length;n++)(r=Nt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Nt.length&&null===(n=Nt[0]).blockedOn;)Rt(n),null===n.blockedOn&&Nt.shift()}var Bt=k.ReactCurrentBatchConfig,$t=!0;function Ht(e,t,n,r){var o=bt,i=Bt.transition;Bt.transition=null;try{bt=1,Wt(e,t,n,r)}finally{bt=o,Bt.transition=i}}function Kt(e,t,n,r){var o=bt,i=Bt.transition;Bt.transition=null;try{bt=4,Wt(e,t,n,r)}finally{bt=o,Bt.transition=i}}function Wt(e,t,n,r){if($t){var o=Qt(e,t,n,r);if(null===o)$r(e,t,r,Yt,n),At(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return Lt=Ft(Lt,e,t,n,r,o),!0;case"dragenter":return It=Ft(It,e,t,n,r,o),!0;case"mouseover":return Pt=Ft(Pt,e,t,n,r,o),!0;case"pointerover":var i=o.pointerId;return Dt.set(i,Ft(Dt.get(i)||null,e,t,n,r,o)),!0;case"gotpointercapture":return i=o.pointerId,Mt.set(i,Ft(Mt.get(i)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(At(e,r),4&t&&-1<Ot.indexOf(e)){for(;null!==o;){var i=ko(o);if(null!==i&&wt(i),null===(i=Qt(e,t,n,r))&&$r(e,t,r,Yt,n),i===o)break;o=i}null!==o&&r.stopPropagation()}else $r(e,t,r,null,n)}}var Yt=null;function Qt(e,t,n,r){if(Yt=null,null!==(e=bo(e=we(r))))if(null===(t=qe(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=Be(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Yt=e,null}function Gt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Xe()){case Ze:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Jt=null,Xt=null,Zt=null;function en(){if(Zt)return Zt;var e,t,n=Xt,r=n.length,o="value"in Jt?Jt.value:Jt.textContent,i=o.length;for(e=0;e<r&&n[e]===o[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===o[i-t];t++);return Zt=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,i){for(var a in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=i,this.currentTarget=null,e)e.hasOwnProperty(a)&&(t=e[a],this[a]=t?t(o):o[a]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return R(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,ln,sn,un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},cn=on(un),dn=R({},un,{view:0,detail:0}),fn=on(dn),pn=R({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:xn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==sn&&(sn&&"mousemove"===e.type?(an=e.screenX-sn.screenX,ln=e.screenY-sn.screenY):ln=an=0,sn=e),an)},movementY:function(e){return"movementY"in e?e.movementY:ln}}),hn=on(pn),mn=on(R({},pn,{dataTransfer:0})),gn=on(R({},dn,{relatedTarget:0})),vn=on(R({},un,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=R({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),bn=on(yn),kn=on(R({},un,{data:0})),wn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Sn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Cn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function En(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Cn[e])&&!!t[e]}function xn(){return En}var Tn=R({},dn,{key:function(e){if(e.key){var t=wn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?Sn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:xn,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),_n=on(Tn),Ln=on(R({},pn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),In=on(R({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:xn})),Pn=on(R({},un,{propertyName:0,elapsedTime:0,pseudoElement:0})),Dn=R({},pn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Mn=on(Dn),Nn=[9,13,27,32],On=c&&"CompositionEvent"in window,An=null;c&&"documentMode"in document&&(An=document.documentMode);var Fn=c&&"TextEvent"in window&&!An,Rn=c&&(!On||An&&8<An&&11>=An),Un=String.fromCharCode(32),zn=!1;function Vn(e,t){switch(e){case"keyup":return-1!==Nn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function jn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var qn=!1,Bn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function $n(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Bn[e.type]:"textarea"===t}function Hn(e,t,n,r){Te(r),0<(t=Kr(t,"onChange")).length&&(n=new cn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Kn=null,Wn=null;function Yn(e){Ur(e,0)}function Qn(e){if(W(wo(e)))return e}function Gn(e,t){if("change"===e)return t}var Jn=!1;if(c){var Xn;if(c){var Zn="oninput"in document;if(!Zn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Zn="function"==typeof er.oninput}Xn=Zn}else Xn=!1;Jn=Xn&&(!document.documentMode||9<document.documentMode)}function tr(){Kn&&(Kn.detachEvent("onpropertychange",nr),Wn=Kn=null)}function nr(e){if("value"===e.propertyName&&Qn(Wn)){var t=[];Hn(t,Wn,e,we(e)),De(Yn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Wn=n,(Kn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Qn(Wn)}function ir(e,t){if("click"===e)return Qn(t)}function ar(e,t){if("input"===e||"change"===e)return Qn(t)}var lr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function sr(e,t){if(lr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!d.call(t,o)||!lr(e[o],t[o]))return!1}return!0}function ur(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function cr(e,t){var n,r=ur(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=ur(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function fr(){for(var e=window,t=Y();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=Y((e=t.contentWindow).document)}return t}function pr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function hr(e){var t=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&pr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=void 0===r.end?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=cr(n,i);var a=cr(n,r);o&&a&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var mr=c&&"documentMode"in document&&11>=document.documentMode,gr=null,vr=null,yr=null,br=!1;function kr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;br||null==gr||gr!==Y(r)||(r="selectionStart"in(r=gr)&&pr(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},yr&&sr(yr,r)||(yr=r,0<(r=Kr(vr,"onSelect")).length&&(t=new cn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function wr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Sr={animationend:wr("Animation","AnimationEnd"),animationiteration:wr("Animation","AnimationIteration"),animationstart:wr("Animation","AnimationStart"),transitionend:wr("Transition","TransitionEnd")},Cr={},Er={};function xr(e){if(Cr[e])return Cr[e];if(!Sr[e])return e;var t,n=Sr[e];for(t in n)if(n.hasOwnProperty(t)&&t in Er)return Cr[e]=n[t];return e}c&&(Er=document.createElement("div").style,"AnimationEvent"in window||(delete Sr.animationend.animation,delete Sr.animationiteration.animation,delete Sr.animationstart.animation),"TransitionEvent"in window||delete Sr.transitionend.transition);var Tr=xr("animationend"),_r=xr("animationiteration"),Lr=xr("animationstart"),Ir=xr("transitionend"),Pr=new Map,Dr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Mr(e,t){Pr.set(e,t),s(t,[e])}for(var Nr=0;Nr<Dr.length;Nr++){var Or=Dr[Nr];Mr(Or.toLowerCase(),"on"+(Or[0].toUpperCase()+Or.slice(1)))}Mr(Tr,"onAnimationEnd"),Mr(_r,"onAnimationIteration"),Mr(Lr,"onAnimationStart"),Mr("dblclick","onDoubleClick"),Mr("focusin","onFocus"),Mr("focusout","onBlur"),Mr(Ir,"onTransitionEnd"),u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),s("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),s("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),s("onBeforeInput",["compositionend","keypress","textInput","paste"]),s("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ar="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Fr=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ar));function Rr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,a,l,s,u){if(je.apply(this,arguments),Fe){if(!Fe)throw Error(i(198));var c=Re;Fe=!1,Re=null,Ue||(Ue=!0,ze=c)}}(r,t,void 0,e),e.currentTarget=null}function Ur(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var i=void 0;if(t)for(var a=r.length-1;0<=a;a--){var l=r[a],s=l.instance,u=l.currentTarget;if(l=l.listener,s!==i&&o.isPropagationStopped())break e;Rr(o,l,u),i=s}else for(a=0;a<r.length;a++){if(s=(l=r[a]).instance,u=l.currentTarget,l=l.listener,s!==i&&o.isPropagationStopped())break e;Rr(o,l,u),i=s}}}if(Ue)throw e=ze,Ue=!1,ze=null,e}function zr(e,t){var n=t[go];void 0===n&&(n=t[go]=new Set);var r=e+"__bubble";n.has(r)||(Br(t,e,2,!1),n.add(r))}function Vr(e,t,n){var r=0;t&&(r|=4),Br(n,e,r,t)}var jr="_reactListening"+Math.random().toString(36).slice(2);function qr(e){if(!e[jr]){e[jr]=!0,a.forEach((function(t){"selectionchange"!==t&&(Fr.has(t)||Vr(t,!1,e),Vr(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[jr]||(t[jr]=!0,Vr("selectionchange",!1,t))}}function Br(e,t,n,r){switch(Gt(t)){case 1:var o=Ht;break;case 4:o=Kt;break;default:o=Wt}n=o.bind(null,t,n,e),o=void 0,!Ne||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function $r(e,t,n,r,o){var i=r;if(!(1&t||2&t||null===r))e:for(;;){if(null===r)return;var a=r.tag;if(3===a||4===a){var l=r.stateNode.containerInfo;if(l===o||8===l.nodeType&&l.parentNode===o)break;if(4===a)for(a=r.return;null!==a;){var s=a.tag;if((3===s||4===s)&&((s=a.stateNode.containerInfo)===o||8===s.nodeType&&s.parentNode===o))return;a=a.return}for(;null!==l;){if(null===(a=bo(l)))return;if(5===(s=a.tag)||6===s){r=i=a;continue e}l=l.parentNode}}r=r.return}De((function(){var r=i,o=we(n),a=[];e:{var l=Pr.get(e);if(void 0!==l){var s=cn,u=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":s=_n;break;case"focusin":u="focus",s=gn;break;case"focusout":u="blur",s=gn;break;case"beforeblur":case"afterblur":s=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=hn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=mn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=In;break;case Tr:case _r:case Lr:s=vn;break;case Ir:s=Pn;break;case"scroll":s=fn;break;case"wheel":s=Mn;break;case"copy":case"cut":case"paste":s=bn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=Ln}var c=!!(4&t),d=!c&&"scroll"===e,f=c?null!==l?l+"Capture":null:l;c=[];for(var p,h=r;null!==h;){var m=(p=h).stateNode;if(5===p.tag&&null!==m&&(p=m,null!==f&&null!=(m=Me(h,f))&&c.push(Hr(h,m,p))),d)break;h=h.return}0<c.length&&(l=new s(l,u,null,n,o),a.push({event:l,listeners:c}))}}if(!(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||n===ke||!(u=n.relatedTarget||n.fromElement)||!bo(u)&&!u[mo])&&(s||l)&&(l=o.window===o?o:(l=o.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(u=(u=n.relatedTarget||n.toElement)?bo(u):null)&&(u!==(d=qe(u))||5!==u.tag&&6!==u.tag)&&(u=null)):(s=null,u=r),s!==u)){if(c=hn,m="onMouseLeave",f="onMouseEnter",h="mouse","pointerout"!==e&&"pointerover"!==e||(c=Ln,m="onPointerLeave",f="onPointerEnter",h="pointer"),d=null==s?l:wo(s),p=null==u?l:wo(u),(l=new c(m,h+"leave",s,n,o)).target=d,l.relatedTarget=p,m=null,bo(o)===r&&((c=new c(f,h+"enter",u,n,o)).target=p,c.relatedTarget=d,m=c),d=m,s&&u)e:{for(f=u,h=0,p=c=s;p;p=Wr(p))h++;for(p=0,m=f;m;m=Wr(m))p++;for(;0<h-p;)c=Wr(c),h--;for(;0<p-h;)f=Wr(f),p--;for(;h--;){if(c===f||null!==f&&c===f.alternate)break e;c=Wr(c),f=Wr(f)}c=null}else c=null;null!==s&&Yr(a,l,s,c,!1),null!==u&&null!==d&&Yr(a,d,u,c,!0)}if("select"===(s=(l=r?wo(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var g=Gn;else if($n(l))if(Jn)g=ar;else{g=or;var v=rr}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(g=ir);switch(g&&(g=g(e,r))?Hn(a,g,n,o):(v&&v(e,l,r),"focusout"===e&&(v=l._wrapperState)&&v.controlled&&"number"===l.type&&ee(l,"number",l.value)),v=r?wo(r):window,e){case"focusin":($n(v)||"true"===v.contentEditable)&&(gr=v,vr=r,yr=null);break;case"focusout":yr=vr=gr=null;break;case"mousedown":br=!0;break;case"contextmenu":case"mouseup":case"dragend":br=!1,kr(a,n,o);break;case"selectionchange":if(mr)break;case"keydown":case"keyup":kr(a,n,o)}var y;if(On)e:{switch(e){case"compositionstart":var b="onCompositionStart";break e;case"compositionend":b="onCompositionEnd";break e;case"compositionupdate":b="onCompositionUpdate";break e}b=void 0}else qn?Vn(e,n)&&(b="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(b="onCompositionStart");b&&(Rn&&"ko"!==n.locale&&(qn||"onCompositionStart"!==b?"onCompositionEnd"===b&&qn&&(y=en()):(Xt="value"in(Jt=o)?Jt.value:Jt.textContent,qn=!0)),0<(v=Kr(r,b)).length&&(b=new kn(b,e,null,n,o),a.push({event:b,listeners:v}),(y||null!==(y=jn(n)))&&(b.data=y))),(y=Fn?function(e,t){switch(e){case"compositionend":return jn(t);case"keypress":return 32!==t.which?null:(zn=!0,Un);case"textInput":return(e=t.data)===Un&&zn?null:e;default:return null}}(e,n):function(e,t){if(qn)return"compositionend"===e||!On&&Vn(e,t)?(e=en(),Zt=Xt=Jt=null,qn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Rn&&"ko"!==t.locale?null:t.data}}(e,n))&&0<(r=Kr(r,"onBeforeInput")).length&&(o=new kn("onBeforeInput","beforeinput",null,n,o),a.push({event:o,listeners:r}),o.data=y)}Ur(a,t)}))}function Hr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Kr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,i=o.stateNode;5===o.tag&&null!==i&&(o=i,null!=(i=Me(e,n))&&r.unshift(Hr(e,i,o)),null!=(i=Me(e,t))&&r.push(Hr(e,i,o))),e=e.return}return r}function Wr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Yr(e,t,n,r,o){for(var i=t._reactName,a=[];null!==n&&n!==r;){var l=n,s=l.alternate,u=l.stateNode;if(null!==s&&s===r)break;5===l.tag&&null!==u&&(l=u,o?null!=(s=Me(n,i))&&a.unshift(Hr(n,s,l)):o||null!=(s=Me(n,i))&&a.push(Hr(n,s,l))),n=n.return}0!==a.length&&e.push({event:t,listeners:a})}var Qr=/\r\n?/g,Gr=/\u0000|\uFFFD/g;function Jr(e){return("string"==typeof e?e:""+e).replace(Qr,"\n").replace(Gr,"")}function Xr(e,t,n){if(t=Jr(t),Jr(e)!==t&&n)throw Error(i(425))}function Zr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"==typeof setTimeout?setTimeout:void 0,oo="function"==typeof clearTimeout?clearTimeout:void 0,io="function"==typeof Promise?Promise:void 0,ao="function"==typeof queueMicrotask?queueMicrotask:void 0!==io?function(e){return io.resolve(null).then(e).catch(lo)}:ro;function lo(e){setTimeout((function(){throw e}))}function so(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void qt(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);qt(t)}function uo(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function co(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var fo=Math.random().toString(36).slice(2),po="__reactFiber$"+fo,ho="__reactProps$"+fo,mo="__reactContainer$"+fo,go="__reactEvents$"+fo,vo="__reactListeners$"+fo,yo="__reactHandles$"+fo;function bo(e){var t=e[po];if(t)return t;for(var n=e.parentNode;n;){if(t=n[mo]||n[po]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=co(e);null!==e;){if(n=e[po])return n;e=co(e)}return t}n=(e=n).parentNode}return null}function ko(e){return!(e=e[po]||e[mo])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wo(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function So(e){return e[ho]||null}var Co=[],Eo=-1;function xo(e){return{current:e}}function To(e){0>Eo||(e.current=Co[Eo],Co[Eo]=null,Eo--)}function _o(e,t){Eo++,Co[Eo]=e.current,e.current=t}var Lo={},Io=xo(Lo),Po=xo(!1),Do=Lo;function Mo(e,t){var n=e.type.contextTypes;if(!n)return Lo;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,i={};for(o in n)i[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function No(e){return null!=e.childContextTypes}function Oo(){To(Po),To(Io)}function Ao(e,t,n){if(Io.current!==Lo)throw Error(i(168));_o(Io,t),_o(Po,n)}function Fo(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(i(108,B(e)||"Unknown",o));return R({},n,r)}function Ro(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Lo,Do=Io.current,_o(Io,e),_o(Po,Po.current),!0}function Uo(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=Fo(e,t,Do),r.__reactInternalMemoizedMergedChildContext=e,To(Po),To(Io),_o(Io,e)):To(Po),_o(Po,n)}var zo=null,Vo=!1,jo=!1;function qo(e){null===zo?zo=[e]:zo.push(e)}function Bo(){if(!jo&&null!==zo){jo=!0;var e=0,t=bt;try{var n=zo;for(bt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}zo=null,Vo=!1}catch(t){throw null!==zo&&(zo=zo.slice(e+1)),We(Ze,Bo),t}finally{bt=t,jo=!1}}return null}var $o=[],Ho=0,Ko=null,Wo=0,Yo=[],Qo=0,Go=null,Jo=1,Xo="";function Zo(e,t){$o[Ho++]=Wo,$o[Ho++]=Ko,Ko=e,Wo=t}function ei(e,t,n){Yo[Qo++]=Jo,Yo[Qo++]=Xo,Yo[Qo++]=Go,Go=e;var r=Jo;e=Xo;var o=32-at(r)-1;r&=~(1<<o),n+=1;var i=32-at(t)+o;if(30<i){var a=o-o%5;i=(r&(1<<a)-1).toString(32),r>>=a,o-=a,Jo=1<<32-at(t)+o|n<<o|r,Xo=i+e}else Jo=1<<i|n<<o|r,Xo=e}function ti(e){null!==e.return&&(Zo(e,1),ei(e,1,0))}function ni(e){for(;e===Ko;)Ko=$o[--Ho],$o[Ho]=null,Wo=$o[--Ho],$o[Ho]=null;for(;e===Go;)Go=Yo[--Qo],Yo[Qo]=null,Xo=Yo[--Qo],Yo[Qo]=null,Jo=Yo[--Qo],Yo[Qo]=null}var ri=null,oi=null,ii=!1,ai=null;function li(e,t){var n=Mu(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function si(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ri=e,oi=uo(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ri=e,oi=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Go?{id:Jo,overflow:Xo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Mu(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ri=e,oi=null,!0);default:return!1}}function ui(e){return!(!(1&e.mode)||128&e.flags)}function ci(e){if(ii){var t=oi;if(t){var n=t;if(!si(e,t)){if(ui(e))throw Error(i(418));t=uo(n.nextSibling);var r=ri;t&&si(e,t)?li(r,n):(e.flags=-4097&e.flags|2,ii=!1,ri=e)}}else{if(ui(e))throw Error(i(418));e.flags=-4097&e.flags|2,ii=!1,ri=e}}}function di(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ri=e}function fi(e){if(e!==ri)return!1;if(!ii)return di(e),ii=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oi)){if(ui(e))throw pi(),Error(i(418));for(;t;)li(e,t),t=uo(t.nextSibling)}if(di(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oi=uo(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oi=null}}else oi=ri?uo(e.stateNode.nextSibling):null;return!0}function pi(){for(var e=oi;e;)e=uo(e.nextSibling)}function hi(){oi=ri=null,ii=!1}function mi(e){null===ai?ai=[e]:ai.push(e)}var gi=k.ReactCurrentBatchConfig;function vi(e,t){if(e&&e.defaultProps){for(var n in t=R({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var yi=xo(null),bi=null,ki=null,wi=null;function Si(){wi=ki=bi=null}function Ci(e){var t=yi.current;To(yi),e._currentValue=t}function Ei(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function xi(e,t){bi=e,wi=ki=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(kl=!0),e.firstContext=null)}function Ti(e){var t=e._currentValue;if(wi!==e)if(e={context:e,memoizedValue:t,next:null},null===ki){if(null===bi)throw Error(i(308));ki=e,bi.dependencies={lanes:0,firstContext:e}}else ki=ki.next=e;return t}var _i=null;function Li(e){null===_i?_i=[e]:_i.push(e)}function Ii(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Li(t)):(n.next=o.next,o.next=n),t.interleaved=n,Pi(e,r)}function Pi(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Di=!1;function Mi(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Ni(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Oi(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ai(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&Is){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Pi(e,n)}return null===(o=r.interleaved)?(t.next=t,Li(r)):(t.next=o.next,o.next=t),r.interleaved=t,Pi(e,n)}function Fi(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}function Ri(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,i=null;if(null!==(n=n.firstBaseUpdate)){do{var a={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===i?o=i=a:i=i.next=a,n=n.next}while(null!==n);null===i?o=i=t:i=i.next=t}else o=i=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Ui(e,t,n,r){var o=e.updateQueue;Di=!1;var i=o.firstBaseUpdate,a=o.lastBaseUpdate,l=o.shared.pending;if(null!==l){o.shared.pending=null;var s=l,u=s.next;s.next=null,null===a?i=u:a.next=u,a=s;var c=e.alternate;null!==c&&(l=(c=c.updateQueue).lastBaseUpdate)!==a&&(null===l?c.firstBaseUpdate=u:l.next=u,c.lastBaseUpdate=s)}if(null!==i){var d=o.baseState;for(a=0,c=u=s=null,l=i;;){var f=l.lane,p=l.eventTime;if((r&f)===f){null!==c&&(c=c.next={eventTime:p,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var h=e,m=l;switch(f=t,p=n,m.tag){case 1:if("function"==typeof(h=m.payload)){d=h.call(p,d,f);break e}d=h;break e;case 3:h.flags=-65537&h.flags|128;case 0:if(null==(f="function"==typeof(h=m.payload)?h.call(p,d,f):h))break e;d=R({},d,f);break e;case 2:Di=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(f=o.effects)?o.effects=[l]:f.push(l))}else p={eventTime:p,lane:f,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===c?(u=c=p,s=d):c=c.next=p,a|=f;if(null===(l=l.next)){if(null===(l=o.shared.pending))break;l=(f=l).next,f.next=null,o.lastBaseUpdate=f,o.shared.pending=null}}if(null===c&&(s=d),o.baseState=s,o.firstBaseUpdate=u,o.lastBaseUpdate=c,null!==(t=o.shared.interleaved)){o=t;do{a|=o.lane,o=o.next}while(o!==t)}else null===i&&(o.shared.lanes=0);Rs|=a,e.lanes=a,e.memoizedState=d}}function zi(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(i(191,o));o.call(r)}}}var Vi=(new r.Component).refs;function ji(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:R({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var qi={isMounted:function(e){return!!(e=e._reactInternals)&&qe(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=tu(),o=nu(e),i=Oi(r,o);i.payload=t,null!=n&&(i.callback=n),null!==(t=Ai(e,i,o))&&(ru(t,e,o,r),Fi(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=tu(),o=nu(e),i=Oi(r,o);i.tag=1,i.payload=t,null!=n&&(i.callback=n),null!==(t=Ai(e,i,o))&&(ru(t,e,o,r),Fi(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=tu(),r=nu(e),o=Oi(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Ai(e,o,r))&&(ru(t,e,r,n),Fi(t,e,r))}};function Bi(e,t,n,r,o,i,a){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,i,a):!(t.prototype&&t.prototype.isPureReactComponent&&sr(n,r)&&sr(o,i))}function $i(e,t,n){var r=!1,o=Lo,i=t.contextType;return"object"==typeof i&&null!==i?i=Ti(i):(o=No(t)?Do:Io.current,i=(r=null!=(r=t.contextTypes))?Mo(e,o):Lo),t=new t(n,i),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=qi,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=i),t}function Hi(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&qi.enqueueReplaceState(t,t.state,null)}function Ki(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=Vi,Mi(e);var i=t.contextType;"object"==typeof i&&null!==i?o.context=Ti(i):(i=No(t)?Do:Io.current,o.context=Mo(e,i)),o.state=e.memoizedState,"function"==typeof(i=t.getDerivedStateFromProps)&&(ji(e,t,i,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&qi.enqueueReplaceState(o,o.state,null),Ui(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function Wi(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var o=r,a=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=o.refs;t===Vi&&(t=o.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function Yi(e,t){throw e=Object.prototype.toString.call(t),Error(i(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Qi(e){return(0,e._init)(e._payload)}function Gi(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Ou(e,t)).index=0,e.sibling=null,e}function a(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function l(t){return e&&null===t.alternate&&(t.flags|=2),t}function s(e,t,n,r){return null===t||6!==t.tag?((t=Uu(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function u(e,t,n,r){var i=n.type;return i===C?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===i||"object"==typeof i&&null!==i&&i.$$typeof===M&&Qi(i)===t.type)?((r=o(t,n.props)).ref=Wi(e,t,n),r.return=e,r):((r=Au(n.type,n.key,n.props,null,e.mode,r)).ref=Wi(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=zu(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,i){return null===t||7!==t.tag?((t=Fu(n,e.mode,r,i)).return=e,t):((t=o(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Uu(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case w:return(n=Au(t.type,t.key,t.props,null,e.mode,n)).ref=Wi(e,null,t),n.return=e,n;case S:return(t=zu(t,e.mode,n)).return=e,t;case M:return f(e,(0,t._init)(t._payload),n)}if(te(t)||A(t))return(t=Fu(t,e.mode,n,null)).return=e,t;Yi(e,t)}return null}function p(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==o?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case w:return n.key===o?u(e,t,n,r):null;case S:return n.key===o?c(e,t,n,r):null;case M:return p(e,t,(o=n._init)(n._payload),r)}if(te(n)||A(n))return null!==o?null:d(e,t,n,r,null);Yi(e,n)}return null}function h(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case w:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case S:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case M:return h(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||A(r))return d(t,e=e.get(n)||null,r,o,null);Yi(t,r)}return null}function m(o,i,l,s){for(var u=null,c=null,d=i,m=i=0,g=null;null!==d&&m<l.length;m++){d.index>m?(g=d,d=null):g=d.sibling;var v=p(o,d,l[m],s);if(null===v){null===d&&(d=g);break}e&&d&&null===v.alternate&&t(o,d),i=a(v,i,m),null===c?u=v:c.sibling=v,c=v,d=g}if(m===l.length)return n(o,d),ii&&Zo(o,m),u;if(null===d){for(;m<l.length;m++)null!==(d=f(o,l[m],s))&&(i=a(d,i,m),null===c?u=d:c.sibling=d,c=d);return ii&&Zo(o,m),u}for(d=r(o,d);m<l.length;m++)null!==(g=h(d,o,m,l[m],s))&&(e&&null!==g.alternate&&d.delete(null===g.key?m:g.key),i=a(g,i,m),null===c?u=g:c.sibling=g,c=g);return e&&d.forEach((function(e){return t(o,e)})),ii&&Zo(o,m),u}function g(o,l,s,u){var c=A(s);if("function"!=typeof c)throw Error(i(150));if(null==(s=c.call(s)))throw Error(i(151));for(var d=c=null,m=l,g=l=0,v=null,y=s.next();null!==m&&!y.done;g++,y=s.next()){m.index>g?(v=m,m=null):v=m.sibling;var b=p(o,m,y.value,u);if(null===b){null===m&&(m=v);break}e&&m&&null===b.alternate&&t(o,m),l=a(b,l,g),null===d?c=b:d.sibling=b,d=b,m=v}if(y.done)return n(o,m),ii&&Zo(o,g),c;if(null===m){for(;!y.done;g++,y=s.next())null!==(y=f(o,y.value,u))&&(l=a(y,l,g),null===d?c=y:d.sibling=y,d=y);return ii&&Zo(o,g),c}for(m=r(o,m);!y.done;g++,y=s.next())null!==(y=h(m,o,g,y.value,u))&&(e&&null!==y.alternate&&m.delete(null===y.key?g:y.key),l=a(y,l,g),null===d?c=y:d.sibling=y,d=y);return e&&m.forEach((function(e){return t(o,e)})),ii&&Zo(o,g),c}return function e(r,i,a,s){if("object"==typeof a&&null!==a&&a.type===C&&null===a.key&&(a=a.props.children),"object"==typeof a&&null!==a){switch(a.$$typeof){case w:e:{for(var u=a.key,c=i;null!==c;){if(c.key===u){if((u=a.type)===C){if(7===c.tag){n(r,c.sibling),(i=o(c,a.props.children)).return=r,r=i;break e}}else if(c.elementType===u||"object"==typeof u&&null!==u&&u.$$typeof===M&&Qi(u)===c.type){n(r,c.sibling),(i=o(c,a.props)).ref=Wi(r,c,a),i.return=r,r=i;break e}n(r,c);break}t(r,c),c=c.sibling}a.type===C?((i=Fu(a.props.children,r.mode,s,a.key)).return=r,r=i):((s=Au(a.type,a.key,a.props,null,r.mode,s)).ref=Wi(r,i,a),s.return=r,r=s)}return l(r);case S:e:{for(c=a.key;null!==i;){if(i.key===c){if(4===i.tag&&i.stateNode.containerInfo===a.containerInfo&&i.stateNode.implementation===a.implementation){n(r,i.sibling),(i=o(i,a.children||[])).return=r,r=i;break e}n(r,i);break}t(r,i),i=i.sibling}(i=zu(a,r.mode,s)).return=r,r=i}return l(r);case M:return e(r,i,(c=a._init)(a._payload),s)}if(te(a))return m(r,i,a,s);if(A(a))return g(r,i,a,s);Yi(r,a)}return"string"==typeof a&&""!==a||"number"==typeof a?(a=""+a,null!==i&&6===i.tag?(n(r,i.sibling),(i=o(i,a)).return=r,r=i):(n(r,i),(i=Uu(a,r.mode,s)).return=r,r=i),l(r)):n(r,i)}}var Ji=Gi(!0),Xi=Gi(!1),Zi={},ea=xo(Zi),ta=xo(Zi),na=xo(Zi);function ra(e){if(e===Zi)throw Error(i(174));return e}function oa(e,t){switch(_o(na,t),_o(ta,e),_o(ea,Zi),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:se(null,"");break;default:t=se(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}To(ea),_o(ea,t)}function ia(){To(ea),To(ta),To(na)}function aa(e){ra(na.current);var t=ra(ea.current),n=se(t,e.type);t!==n&&(_o(ta,e),_o(ea,n))}function la(e){ta.current===e&&(To(ea),To(ta))}var sa=xo(0);function ua(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ca=[];function da(){for(var e=0;e<ca.length;e++)ca[e]._workInProgressVersionPrimary=null;ca.length=0}var fa=k.ReactCurrentDispatcher,pa=k.ReactCurrentBatchConfig,ha=0,ma=null,ga=null,va=null,ya=!1,ba=!1,ka=0,wa=0;function Sa(){throw Error(i(321))}function Ca(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!lr(e[n],t[n]))return!1;return!0}function Ea(e,t,n,r,o,a){if(ha=a,ma=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,fa.current=null===e||null===e.memoizedState?ll:sl,e=n(r,o),ba){a=0;do{if(ba=!1,ka=0,25<=a)throw Error(i(301));a+=1,va=ga=null,t.updateQueue=null,fa.current=ul,e=n(r,o)}while(ba)}if(fa.current=al,t=null!==ga&&null!==ga.next,ha=0,va=ga=ma=null,ya=!1,t)throw Error(i(300));return e}function xa(){var e=0!==ka;return ka=0,e}function Ta(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===va?ma.memoizedState=va=e:va=va.next=e,va}function _a(){if(null===ga){var e=ma.alternate;e=null!==e?e.memoizedState:null}else e=ga.next;var t=null===va?ma.memoizedState:va.next;if(null!==t)va=t,ga=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ga=e).memoizedState,baseState:ga.baseState,baseQueue:ga.baseQueue,queue:ga.queue,next:null},null===va?ma.memoizedState=va=e:va=va.next=e}return va}function La(e,t){return"function"==typeof t?t(e):t}function Ia(e){var t=_a(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=ga,o=r.baseQueue,a=n.pending;if(null!==a){if(null!==o){var l=o.next;o.next=a.next,a.next=l}r.baseQueue=o=a,n.pending=null}if(null!==o){a=o.next,r=r.baseState;var s=l=null,u=null,c=a;do{var d=c.lane;if((ha&d)===d)null!==u&&(u=u.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),r=c.hasEagerState?c.eagerState:e(r,c.action);else{var f={lane:d,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};null===u?(s=u=f,l=r):u=u.next=f,ma.lanes|=d,Rs|=d}c=c.next}while(null!==c&&c!==a);null===u?l=r:u.next=s,lr(r,t.memoizedState)||(kl=!0),t.memoizedState=r,t.baseState=l,t.baseQueue=u,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{a=o.lane,ma.lanes|=a,Rs|=a,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Pa(e){var t=_a(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,a=t.memoizedState;if(null!==o){n.pending=null;var l=o=o.next;do{a=e(a,l.action),l=l.next}while(l!==o);lr(a,t.memoizedState)||(kl=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function Da(){}function Ma(e,t){var n=ma,r=_a(),o=t(),a=!lr(r.memoizedState,o);if(a&&(r.memoizedState=o,kl=!0),r=r.queue,$a(Aa.bind(null,n,r,e),[e]),r.getSnapshot!==t||a||null!==va&&1&va.memoizedState.tag){if(n.flags|=2048,za(9,Oa.bind(null,n,r,o,t),void 0,null),null===Ps)throw Error(i(349));30&ha||Na(n,t,o)}return o}function Na(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=ma.updateQueue)?(t={lastEffect:null,stores:null},ma.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Oa(e,t,n,r){t.value=n,t.getSnapshot=r,Fa(t)&&Ra(e)}function Aa(e,t,n){return n((function(){Fa(t)&&Ra(e)}))}function Fa(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n)}catch(e){return!0}}function Ra(e){var t=Pi(e,1);null!==t&&ru(t,e,1,-1)}function Ua(e){var t=Ta();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:La,lastRenderedState:e},t.queue=e,e=e.dispatch=nl.bind(null,ma,e),[t.memoizedState,e]}function za(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=ma.updateQueue)?(t={lastEffect:null,stores:null},ma.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Va(){return _a().memoizedState}function ja(e,t,n,r){var o=Ta();ma.flags|=e,o.memoizedState=za(1|t,n,void 0,void 0===r?null:r)}function qa(e,t,n,r){var o=_a();r=void 0===r?null:r;var i=void 0;if(null!==ga){var a=ga.memoizedState;if(i=a.destroy,null!==r&&Ca(r,a.deps))return void(o.memoizedState=za(t,n,i,r))}ma.flags|=e,o.memoizedState=za(1|t,n,i,r)}function Ba(e,t){return ja(8390656,8,e,t)}function $a(e,t){return qa(2048,8,e,t)}function Ha(e,t){return qa(4,2,e,t)}function Ka(e,t){return qa(4,4,e,t)}function Wa(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Ya(e,t,n){return n=null!=n?n.concat([e]):null,qa(4,4,Wa.bind(null,t,e),n)}function Qa(){}function Ga(e,t){var n=_a();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Ca(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ja(e,t){var n=_a();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Ca(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Xa(e,t,n){return 21&ha?(lr(n,t)||(n=mt(),ma.lanes|=n,Rs|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,kl=!0),e.memoizedState=n)}function Za(e,t){var n=bt;bt=0!==n&&4>n?n:4,e(!0);var r=pa.transition;pa.transition={};try{e(!1),t()}finally{bt=n,pa.transition=r}}function el(){return _a().memoizedState}function tl(e,t,n){var r=nu(e);n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rl(e)?ol(t,n):null!==(n=Ii(e,t,n,r))&&(ru(n,e,r,tu()),il(n,t,r))}function nl(e,t,n){var r=nu(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rl(e))ol(t,o);else{var i=e.alternate;if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var a=t.lastRenderedState,l=i(a,n);if(o.hasEagerState=!0,o.eagerState=l,lr(l,a)){var s=t.interleaved;return null===s?(o.next=o,Li(t)):(o.next=s.next,s.next=o),void(t.interleaved=o)}}catch(e){}null!==(n=Ii(e,t,o,r))&&(ru(n,e,r,o=tu()),il(n,t,r))}}function rl(e){var t=e.alternate;return e===ma||null!==t&&t===ma}function ol(e,t){ba=ya=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function il(e,t,n){if(4194240&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var al={readContext:Ti,useCallback:Sa,useContext:Sa,useEffect:Sa,useImperativeHandle:Sa,useInsertionEffect:Sa,useLayoutEffect:Sa,useMemo:Sa,useReducer:Sa,useRef:Sa,useState:Sa,useDebugValue:Sa,useDeferredValue:Sa,useTransition:Sa,useMutableSource:Sa,useSyncExternalStore:Sa,useId:Sa,unstable_isNewReconciler:!1},ll={readContext:Ti,useCallback:function(e,t){return Ta().memoizedState=[e,void 0===t?null:t],e},useContext:Ti,useEffect:Ba,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,ja(4194308,4,Wa.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ja(4194308,4,e,t)},useInsertionEffect:function(e,t){return ja(4,2,e,t)},useMemo:function(e,t){var n=Ta();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ta();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=tl.bind(null,ma,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Ta().memoizedState=e},useState:Ua,useDebugValue:Qa,useDeferredValue:function(e){return Ta().memoizedState=e},useTransition:function(){var e=Ua(!1),t=e[0];return e=Za.bind(null,e[1]),Ta().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ma,o=Ta();if(ii){if(void 0===n)throw Error(i(407));n=n()}else{if(n=t(),null===Ps)throw Error(i(349));30&ha||Na(r,t,n)}o.memoizedState=n;var a={value:n,getSnapshot:t};return o.queue=a,Ba(Aa.bind(null,r,a,e),[e]),r.flags|=2048,za(9,Oa.bind(null,r,a,n,t),void 0,null),n},useId:function(){var e=Ta(),t=Ps.identifierPrefix;if(ii){var n=Xo;t=":"+t+"R"+(n=(Jo&~(1<<32-at(Jo)-1)).toString(32)+n),0<(n=ka++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=wa++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},sl={readContext:Ti,useCallback:Ga,useContext:Ti,useEffect:$a,useImperativeHandle:Ya,useInsertionEffect:Ha,useLayoutEffect:Ka,useMemo:Ja,useReducer:Ia,useRef:Va,useState:function(){return Ia(La)},useDebugValue:Qa,useDeferredValue:function(e){return Xa(_a(),ga.memoizedState,e)},useTransition:function(){return[Ia(La)[0],_a().memoizedState]},useMutableSource:Da,useSyncExternalStore:Ma,useId:el,unstable_isNewReconciler:!1},ul={readContext:Ti,useCallback:Ga,useContext:Ti,useEffect:$a,useImperativeHandle:Ya,useInsertionEffect:Ha,useLayoutEffect:Ka,useMemo:Ja,useReducer:Pa,useRef:Va,useState:function(){return Pa(La)},useDebugValue:Qa,useDeferredValue:function(e){var t=_a();return null===ga?t.memoizedState=e:Xa(t,ga.memoizedState,e)},useTransition:function(){return[Pa(La)[0],_a().memoizedState]},useMutableSource:Da,useSyncExternalStore:Ma,useId:el,unstable_isNewReconciler:!1};function cl(e,t){try{var n="",r=t;do{n+=j(r),r=r.return}while(r);var o=n}catch(e){o="\nError generating stack: "+e.message+"\n"+e.stack}return{value:e,source:t,stack:o,digest:null}}function dl(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function fl(e,t){try{console.error(t.value)}catch(e){setTimeout((function(){throw e}))}}var pl="function"==typeof WeakMap?WeakMap:Map;function hl(e,t,n){(n=Oi(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Hs||(Hs=!0,Ks=r),fl(0,t)},n}function ml(e,t,n){(n=Oi(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){fl(0,t)}}var i=e.stateNode;return null!==i&&"function"==typeof i.componentDidCatch&&(n.callback=function(){fl(0,t),"function"!=typeof r&&(null===Ws?Ws=new Set([this]):Ws.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function gl(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new pl;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Tu.bind(null,e,t,n),t.then(e,e))}function vl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function yl(e,t,n,r,o){return 1&e.mode?(e.flags|=65536,e.lanes=o,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Oi(-1,1)).tag=2,Ai(n,t,1))),n.lanes|=1),e)}var bl=k.ReactCurrentOwner,kl=!1;function wl(e,t,n,r){t.child=null===e?Xi(t,null,n,r):Ji(t,e.child,n,r)}function Sl(e,t,n,r,o){n=n.render;var i=t.ref;return xi(t,o),r=Ea(e,t,n,r,i,o),n=xa(),null===e||kl?(ii&&n&&ti(t),t.flags|=1,wl(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hl(e,t,o))}function Cl(e,t,n,r,o){if(null===e){var i=n.type;return"function"!=typeof i||Nu(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Au(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,El(e,t,i,r,o))}if(i=e.child,!(e.lanes&o)){var a=i.memoizedProps;if((n=null!==(n=n.compare)?n:sr)(a,r)&&e.ref===t.ref)return Hl(e,t,o)}return t.flags|=1,(e=Ou(i,r)).ref=t.ref,e.return=t,t.child=e}function El(e,t,n,r,o){if(null!==e){var i=e.memoizedProps;if(sr(i,r)&&e.ref===t.ref){if(kl=!1,t.pendingProps=r=i,!(e.lanes&o))return t.lanes=e.lanes,Hl(e,t,o);131072&e.flags&&(kl=!0)}}return _l(e,t,n,r,o)}function xl(e,t,n){var r=t.pendingProps,o=r.children,i=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==i?i.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,_o(Os,Ns),Ns|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==i?i.baseLanes:n,_o(Os,Ns),Ns|=r}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},_o(Os,Ns),Ns|=n;else null!==i?(r=i.baseLanes|n,t.memoizedState=null):r=n,_o(Os,Ns),Ns|=r;return wl(e,t,o,n),t.child}function Tl(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function _l(e,t,n,r,o){var i=No(n)?Do:Io.current;return i=Mo(t,i),xi(t,o),n=Ea(e,t,n,r,i,o),r=xa(),null===e||kl?(ii&&r&&ti(t),t.flags|=1,wl(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hl(e,t,o))}function Ll(e,t,n,r,o){if(No(n)){var i=!0;Ro(t)}else i=!1;if(xi(t,o),null===t.stateNode)$l(e,t),$i(t,n,r),Ki(t,n,r,o),r=!0;else if(null===e){var a=t.stateNode,l=t.memoizedProps;a.props=l;var s=a.context,u=n.contextType;u="object"==typeof u&&null!==u?Ti(u):Mo(t,u=No(n)?Do:Io.current);var c=n.getDerivedStateFromProps,d="function"==typeof c||"function"==typeof a.getSnapshotBeforeUpdate;d||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(l!==r||s!==u)&&Hi(t,a,r,u),Di=!1;var f=t.memoizedState;a.state=f,Ui(t,r,a,o),s=t.memoizedState,l!==r||f!==s||Po.current||Di?("function"==typeof c&&(ji(t,n,c,r),s=t.memoizedState),(l=Di||Bi(t,n,l,r,f,s,u))?(d||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||("function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"==typeof a.componentDidMount&&(t.flags|=4194308)):("function"==typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),a.props=r,a.state=s,a.context=u,r=l):("function"==typeof a.componentDidMount&&(t.flags|=4194308),r=!1)}else{a=t.stateNode,Ni(e,t),l=t.memoizedProps,u=t.type===t.elementType?l:vi(t.type,l),a.props=u,d=t.pendingProps,f=a.context,s="object"==typeof(s=n.contextType)&&null!==s?Ti(s):Mo(t,s=No(n)?Do:Io.current);var p=n.getDerivedStateFromProps;(c="function"==typeof p||"function"==typeof a.getSnapshotBeforeUpdate)||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(l!==d||f!==s)&&Hi(t,a,r,s),Di=!1,f=t.memoizedState,a.state=f,Ui(t,r,a,o);var h=t.memoizedState;l!==d||f!==h||Po.current||Di?("function"==typeof p&&(ji(t,n,p,r),h=t.memoizedState),(u=Di||Bi(t,n,u,r,f,h,s)||!1)?(c||"function"!=typeof a.UNSAFE_componentWillUpdate&&"function"!=typeof a.componentWillUpdate||("function"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,h,s),"function"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,h,s)),"function"==typeof a.componentDidUpdate&&(t.flags|=4),"function"==typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof a.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=h),a.props=r,a.state=h,a.context=s,r=u):("function"!=typeof a.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return Il(e,t,n,r,i,o)}function Il(e,t,n,r,o,i){Tl(e,t);var a=!!(128&t.flags);if(!r&&!a)return o&&Uo(t,n,!1),Hl(e,t,i);r=t.stateNode,bl.current=t;var l=a&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&a?(t.child=Ji(t,e.child,null,i),t.child=Ji(t,null,l,i)):wl(e,t,l,i),t.memoizedState=r.state,o&&Uo(t,n,!0),t.child}function Pl(e){var t=e.stateNode;t.pendingContext?Ao(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Ao(0,t.context,!1),oa(e,t.containerInfo)}function Dl(e,t,n,r,o){return hi(),mi(o),t.flags|=256,wl(e,t,n,r),t.child}var Ml,Nl,Ol,Al,Fl={dehydrated:null,treeContext:null,retryLane:0};function Rl(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ul(e,t,n){var r,o=t.pendingProps,a=sa.current,l=!1,s=!!(128&t.flags);if((r=s)||(r=(null===e||null!==e.memoizedState)&&!!(2&a)),r?(l=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(a|=1),_o(sa,1&a),null===e)return ci(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(s=o.children,e=o.fallback,l?(o=t.mode,l=t.child,s={mode:"hidden",children:s},1&o||null===l?l=Ru(s,o,0,null):(l.childLanes=0,l.pendingProps=s),e=Fu(e,o,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Rl(n),t.memoizedState=Fl,e):zl(t,s));if(null!==(a=e.memoizedState)&&null!==(r=a.dehydrated))return function(e,t,n,r,o,a,l){if(n)return 256&t.flags?(t.flags&=-257,Vl(e,t,l,r=dl(Error(i(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(a=r.fallback,o=t.mode,r=Ru({mode:"visible",children:r.children},o,0,null),(a=Fu(a,o,l,null)).flags|=2,r.return=t,a.return=t,r.sibling=a,t.child=r,1&t.mode&&Ji(t,e.child,null,l),t.child.memoizedState=Rl(l),t.memoizedState=Fl,a);if(!(1&t.mode))return Vl(e,t,l,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var s=r.dgst;return r=s,Vl(e,t,l,r=dl(a=Error(i(419)),r,void 0))}if(s=!!(l&e.childLanes),kl||s){if(null!==(r=Ps)){switch(l&-l){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=o&(r.suspendedLanes|l)?0:o)&&o!==a.retryLane&&(a.retryLane=o,Pi(e,o),ru(r,e,o,-1))}return gu(),Vl(e,t,l,r=dl(Error(i(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=Lu.bind(null,e),o._reactRetry=t,null):(e=a.treeContext,oi=uo(o.nextSibling),ri=t,ii=!0,ai=null,null!==e&&(Yo[Qo++]=Jo,Yo[Qo++]=Xo,Yo[Qo++]=Go,Jo=e.id,Xo=e.overflow,Go=t),(t=zl(t,r.children)).flags|=4096,t)}(e,t,s,o,r,a,n);if(l){l=o.fallback,s=t.mode,r=(a=e.child).sibling;var u={mode:"hidden",children:o.children};return 1&s||t.child===a?(o=Ou(a,u)).subtreeFlags=14680064&a.subtreeFlags:((o=t.child).childLanes=0,o.pendingProps=u,t.deletions=null),null!==r?l=Ou(r,l):(l=Fu(l,s,n,null)).flags|=2,l.return=t,o.return=t,o.sibling=l,t.child=o,o=l,l=t.child,s=null===(s=e.child.memoizedState)?Rl(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},l.memoizedState=s,l.childLanes=e.childLanes&~n,t.memoizedState=Fl,o}return e=(l=e.child).sibling,o=Ou(l,{mode:"visible",children:o.children}),!(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function zl(e,t){return(t=Ru({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Vl(e,t,n,r){return null!==r&&mi(r),Ji(t,e.child,null,n),(e=zl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function jl(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),Ei(e.return,t,n)}function ql(e,t,n,r,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=o)}function Bl(e,t,n){var r=t.pendingProps,o=r.revealOrder,i=r.tail;if(wl(e,t,r.children,n),2&(r=sa.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&jl(e,n,t);else if(19===e.tag)jl(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(_o(sa,r),1&t.mode)switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ua(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),ql(t,!1,o,n,i);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ua(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}ql(t,!0,n,null,i);break;case"together":ql(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function $l(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Hl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Rs|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Ou(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Ou(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Kl(e,t){if(!ii)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Wl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Yl(e,t,n){var r=t.pendingProps;switch(ni(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Wl(t),null;case 1:case 17:return No(t.type)&&Oo(),Wl(t),null;case 3:return r=t.stateNode,ia(),To(Po),To(Io),da(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(fi(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==ai&&(lu(ai),ai=null))),Nl(e,t),Wl(t),null;case 5:la(t);var o=ra(na.current);if(n=t.type,null!==e&&null!=t.stateNode)Ol(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(i(166));return Wl(t),null}if(e=ra(ea.current),fi(t)){r=t.stateNode,n=t.type;var a=t.memoizedProps;switch(r[po]=t,r[ho]=a,e=!!(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(o=0;o<Ar.length;o++)zr(Ar[o],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":G(r,a),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!a.multiple},zr("invalid",r);break;case"textarea":oe(r,a),zr("invalid",r)}for(var s in ye(n,a),o=null,a)if(a.hasOwnProperty(s)){var u=a[s];"children"===s?"string"==typeof u?r.textContent!==u&&(!0!==a.suppressHydrationWarning&&Xr(r.textContent,u,e),o=["children",u]):"number"==typeof u&&r.textContent!==""+u&&(!0!==a.suppressHydrationWarning&&Xr(r.textContent,u,e),o=["children",""+u]):l.hasOwnProperty(s)&&null!=u&&"onScroll"===s&&zr("scroll",r)}switch(n){case"input":K(r),Z(r,a,!0);break;case"textarea":K(r),ae(r);break;case"select":case"option":break;default:"function"==typeof a.onClick&&(r.onclick=Zr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{s=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=le(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=s.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),"select"===n&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[po]=t,e[ho]=r,Ml(e,t,!1,!1),t.stateNode=e;e:{switch(s=be(n,r),n){case"dialog":zr("cancel",e),zr("close",e),o=r;break;case"iframe":case"object":case"embed":zr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Ar.length;o++)zr(Ar[o],e);o=r;break;case"source":zr("error",e),o=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),o=r;break;case"details":zr("toggle",e),o=r;break;case"input":G(e,r),o=Q(e,r),zr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=R({},r,{value:void 0}),zr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),zr("invalid",e)}for(a in ye(n,o),u=o)if(u.hasOwnProperty(a)){var c=u[a];"style"===a?ge(e,c):"dangerouslySetInnerHTML"===a?null!=(c=c?c.__html:void 0)&&de(e,c):"children"===a?"string"==typeof c?("textarea"!==n||""!==c)&&fe(e,c):"number"==typeof c&&fe(e,""+c):"suppressContentEditableWarning"!==a&&"suppressHydrationWarning"!==a&&"autoFocus"!==a&&(l.hasOwnProperty(a)?null!=c&&"onScroll"===a&&zr("scroll",e):null!=c&&b(e,a,c,s))}switch(n){case"input":K(e),Z(e,r,!1);break;case"textarea":K(e),ae(e);break;case"option":null!=r.value&&e.setAttribute("value",""+$(r.value));break;case"select":e.multiple=!!r.multiple,null!=(a=r.value)?ne(e,!!r.multiple,a,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Zr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Wl(t),null;case 6:if(e&&null!=t.stateNode)Al(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));if(n=ra(na.current),ra(ea.current),fi(t)){if(r=t.stateNode,n=t.memoizedProps,r[po]=t,(a=r.nodeValue!==n)&&null!==(e=ri))switch(e.tag){case 3:Xr(r.nodeValue,n,!!(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,!!(1&e.mode))}a&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[po]=t,t.stateNode=r}return Wl(t),null;case 13:if(To(sa),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(ii&&null!==oi&&1&t.mode&&!(128&t.flags))pi(),hi(),t.flags|=98560,a=!1;else if(a=fi(t),null!==r&&null!==r.dehydrated){if(null===e){if(!a)throw Error(i(318));if(!(a=null!==(a=t.memoizedState)?a.dehydrated:null))throw Error(i(317));a[po]=t}else hi(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Wl(t),a=!1}else null!==ai&&(lu(ai),ai=null),a=!0;if(!a)return 65536&t.flags?t:null}return 128&t.flags?(t.lanes=n,t):((r=null!==r)!=(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,1&t.mode&&(null===e||1&sa.current?0===As&&(As=3):gu())),null!==t.updateQueue&&(t.flags|=4),Wl(t),null);case 4:return ia(),Nl(e,t),null===e&&qr(t.stateNode.containerInfo),Wl(t),null;case 10:return Ci(t.type._context),Wl(t),null;case 19:if(To(sa),null===(a=t.memoizedState))return Wl(t),null;if(r=!!(128&t.flags),null===(s=a.rendering))if(r)Kl(a,!1);else{if(0!==As||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(s=ua(e))){for(t.flags|=128,Kl(a,!1),null!==(r=s.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(a=n).flags&=14680066,null===(s=a.alternate)?(a.childLanes=0,a.lanes=e,a.child=null,a.subtreeFlags=0,a.memoizedProps=null,a.memoizedState=null,a.updateQueue=null,a.dependencies=null,a.stateNode=null):(a.childLanes=s.childLanes,a.lanes=s.lanes,a.child=s.child,a.subtreeFlags=0,a.deletions=null,a.memoizedProps=s.memoizedProps,a.memoizedState=s.memoizedState,a.updateQueue=s.updateQueue,a.type=s.type,e=s.dependencies,a.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return _o(sa,1&sa.current|2),t.child}e=e.sibling}null!==a.tail&&Je()>Bs&&(t.flags|=128,r=!0,Kl(a,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ua(s))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Kl(a,!0),null===a.tail&&"hidden"===a.tailMode&&!s.alternate&&!ii)return Wl(t),null}else 2*Je()-a.renderingStartTime>Bs&&1073741824!==n&&(t.flags|=128,r=!0,Kl(a,!1),t.lanes=4194304);a.isBackwards?(s.sibling=t.child,t.child=s):(null!==(n=a.last)?n.sibling=s:t.child=s,a.last=s)}return null!==a.tail?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=Je(),t.sibling=null,n=sa.current,_o(sa,r?1&n|2:1&n),t):(Wl(t),null);case 22:case 23:return fu(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&1&t.mode?!!(1073741824&Ns)&&(Wl(t),6&t.subtreeFlags&&(t.flags|=8192)):Wl(t),null;case 24:case 25:return null}throw Error(i(156,t.tag))}function Ql(e,t){switch(ni(t),t.tag){case 1:return No(t.type)&&Oo(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ia(),To(Po),To(Io),da(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return la(t),null;case 13:if(To(sa),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(i(340));hi()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return To(sa),null;case 4:return ia(),null;case 10:return Ci(t.type._context),null;case 22:case 23:return fu(),null;default:return null}}Ml=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Nl=function(){},Ol=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,ra(ea.current);var i,a=null;switch(n){case"input":o=Q(e,o),r=Q(e,r),a=[];break;case"select":o=R({},o,{value:void 0}),r=R({},r,{value:void 0}),a=[];break;case"textarea":o=re(e,o),r=re(e,r),a=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Zr)}for(c in ye(n,r),n=null,o)if(!r.hasOwnProperty(c)&&o.hasOwnProperty(c)&&null!=o[c])if("style"===c){var s=o[c];for(i in s)s.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==c&&"children"!==c&&"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&"autoFocus"!==c&&(l.hasOwnProperty(c)?a||(a=[]):(a=a||[]).push(c,null));for(c in r){var u=r[c];if(s=null!=o?o[c]:void 0,r.hasOwnProperty(c)&&u!==s&&(null!=u||null!=s))if("style"===c)if(s){for(i in s)!s.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&s[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(a||(a=[]),a.push(c,n)),n=u;else"dangerouslySetInnerHTML"===c?(u=u?u.__html:void 0,s=s?s.__html:void 0,null!=u&&s!==u&&(a=a||[]).push(c,u)):"children"===c?"string"!=typeof u&&"number"!=typeof u||(a=a||[]).push(c,""+u):"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&(l.hasOwnProperty(c)?(null!=u&&"onScroll"===c&&zr("scroll",e),a||s===u||(a=[])):(a=a||[]).push(c,u))}n&&(a=a||[]).push("style",n);var c=a;(t.updateQueue=c)&&(t.flags|=4)}},Al=function(e,t,n,r){n!==r&&(t.flags|=4)};var Gl=!1,Jl=!1,Xl="function"==typeof WeakSet?WeakSet:Set,Zl=null;function es(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(n){xu(e,t,n)}else n.current=null}function ts(e,t,n){try{n()}catch(n){xu(e,t,n)}}var ns=!1;function rs(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,void 0!==i&&ts(t,n,i)}o=o.next}while(o!==r)}}function os(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function is(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function as(e){var t=e.alternate;null!==t&&(e.alternate=null,as(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&null!==(t=e.stateNode)&&(delete t[po],delete t[ho],delete t[go],delete t[vo],delete t[yo]),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function ls(e){return 5===e.tag||3===e.tag||4===e.tag}function ss(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||ls(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function us(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Zr));else if(4!==r&&null!==(e=e.child))for(us(e,t,n),e=e.sibling;null!==e;)us(e,t,n),e=e.sibling}function cs(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(cs(e,t,n),e=e.sibling;null!==e;)cs(e,t,n),e=e.sibling}var ds=null,fs=!1;function ps(e,t,n){for(n=n.child;null!==n;)hs(e,t,n),n=n.sibling}function hs(e,t,n){if(it&&"function"==typeof it.onCommitFiberUnmount)try{it.onCommitFiberUnmount(ot,n)}catch(e){}switch(n.tag){case 5:Jl||es(n,t);case 6:var r=ds,o=fs;ds=null,ps(e,t,n),fs=o,null!==(ds=r)&&(fs?(e=ds,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):ds.removeChild(n.stateNode));break;case 18:null!==ds&&(fs?(e=ds,n=n.stateNode,8===e.nodeType?so(e.parentNode,n):1===e.nodeType&&so(e,n),qt(e)):so(ds,n.stateNode));break;case 4:r=ds,o=fs,ds=n.stateNode.containerInfo,fs=!0,ps(e,t,n),ds=r,fs=o;break;case 0:case 11:case 14:case 15:if(!Jl&&null!==(r=n.updateQueue)&&null!==(r=r.lastEffect)){o=r=r.next;do{var i=o,a=i.destroy;i=i.tag,void 0!==a&&(2&i||4&i)&&ts(n,t,a),o=o.next}while(o!==r)}ps(e,t,n);break;case 1:if(!Jl&&(es(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(e){xu(n,t,e)}ps(e,t,n);break;case 21:ps(e,t,n);break;case 22:1&n.mode?(Jl=(r=Jl)||null!==n.memoizedState,ps(e,t,n),Jl=r):ps(e,t,n);break;default:ps(e,t,n)}}function ms(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Xl),t.forEach((function(t){var r=Iu.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function gs(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var a=e,l=t,s=l;e:for(;null!==s;){switch(s.tag){case 5:ds=s.stateNode,fs=!1;break e;case 3:case 4:ds=s.stateNode.containerInfo,fs=!0;break e}s=s.return}if(null===ds)throw Error(i(160));hs(a,l,o),ds=null,fs=!1;var u=o.alternate;null!==u&&(u.return=null),o.return=null}catch(e){xu(o,t,e)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)vs(t,e),t=t.sibling}function vs(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(gs(t,e),ys(e),4&r){try{rs(3,e,e.return),os(3,e)}catch(t){xu(e,e.return,t)}try{rs(5,e,e.return)}catch(t){xu(e,e.return,t)}}break;case 1:gs(t,e),ys(e),512&r&&null!==n&&es(n,n.return);break;case 5:if(gs(t,e),ys(e),512&r&&null!==n&&es(n,n.return),32&e.flags){var o=e.stateNode;try{fe(o,"")}catch(t){xu(e,e.return,t)}}if(4&r&&null!=(o=e.stateNode)){var a=e.memoizedProps,l=null!==n?n.memoizedProps:a,s=e.type,u=e.updateQueue;if(e.updateQueue=null,null!==u)try{"input"===s&&"radio"===a.type&&null!=a.name&&J(o,a),be(s,l);var c=be(s,a);for(l=0;l<u.length;l+=2){var d=u[l],f=u[l+1];"style"===d?ge(o,f):"dangerouslySetInnerHTML"===d?de(o,f):"children"===d?fe(o,f):b(o,d,f,c)}switch(s){case"input":X(o,a);break;case"textarea":ie(o,a);break;case"select":var p=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!a.multiple;var h=a.value;null!=h?ne(o,!!a.multiple,h,!1):p!==!!a.multiple&&(null!=a.defaultValue?ne(o,!!a.multiple,a.defaultValue,!0):ne(o,!!a.multiple,a.multiple?[]:"",!1))}o[ho]=a}catch(t){xu(e,e.return,t)}}break;case 6:if(gs(t,e),ys(e),4&r){if(null===e.stateNode)throw Error(i(162));o=e.stateNode,a=e.memoizedProps;try{o.nodeValue=a}catch(t){xu(e,e.return,t)}}break;case 3:if(gs(t,e),ys(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{qt(t.containerInfo)}catch(t){xu(e,e.return,t)}break;case 4:default:gs(t,e),ys(e);break;case 13:gs(t,e),ys(e),8192&(o=e.child).flags&&(a=null!==o.memoizedState,o.stateNode.isHidden=a,!a||null!==o.alternate&&null!==o.alternate.memoizedState||(qs=Je())),4&r&&ms(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Jl=(c=Jl)||d,gs(t,e),Jl=c):gs(t,e),ys(e),8192&r){if(c=null!==e.memoizedState,(e.stateNode.isHidden=c)&&!d&&1&e.mode)for(Zl=e,d=e.child;null!==d;){for(f=Zl=d;null!==Zl;){switch(h=(p=Zl).child,p.tag){case 0:case 11:case 14:case 15:rs(4,p,p.return);break;case 1:es(p,p.return);var m=p.stateNode;if("function"==typeof m.componentWillUnmount){r=p,n=p.return;try{t=r,m.props=t.memoizedProps,m.state=t.memoizedState,m.componentWillUnmount()}catch(e){xu(r,n,e)}}break;case 5:es(p,p.return);break;case 22:if(null!==p.memoizedState){Ss(f);continue}}null!==h?(h.return=p,Zl=h):Ss(f)}d=d.sibling}e:for(d=null,f=e;;){if(5===f.tag){if(null===d){d=f;try{o=f.stateNode,c?"function"==typeof(a=o.style).setProperty?a.setProperty("display","none","important"):a.display="none":(s=f.stateNode,l=null!=(u=f.memoizedProps.style)&&u.hasOwnProperty("display")?u.display:null,s.style.display=me("display",l))}catch(t){xu(e,e.return,t)}}}else if(6===f.tag){if(null===d)try{f.stateNode.nodeValue=c?"":f.memoizedProps}catch(t){xu(e,e.return,t)}}else if((22!==f.tag&&23!==f.tag||null===f.memoizedState||f===e)&&null!==f.child){f.child.return=f,f=f.child;continue}if(f===e)break e;for(;null===f.sibling;){if(null===f.return||f.return===e)break e;d===f&&(d=null),f=f.return}d===f&&(d=null),f.sibling.return=f.return,f=f.sibling}}break;case 19:gs(t,e),ys(e),4&r&&ms(e);case 21:}}function ys(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(ls(n)){var r=n;break e}n=n.return}throw Error(i(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(fe(o,""),r.flags&=-33),cs(e,ss(e),o);break;case 3:case 4:var a=r.stateNode.containerInfo;us(e,ss(e),a);break;default:throw Error(i(161))}}catch(t){xu(e,e.return,t)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function bs(e,t,n){Zl=e,ks(e,t,n)}function ks(e,t,n){for(var r=!!(1&e.mode);null!==Zl;){var o=Zl,i=o.child;if(22===o.tag&&r){var a=null!==o.memoizedState||Gl;if(!a){var l=o.alternate,s=null!==l&&null!==l.memoizedState||Jl;l=Gl;var u=Jl;if(Gl=a,(Jl=s)&&!u)for(Zl=o;null!==Zl;)s=(a=Zl).child,22===a.tag&&null!==a.memoizedState?Cs(o):null!==s?(s.return=a,Zl=s):Cs(o);for(;null!==i;)Zl=i,ks(i,t,n),i=i.sibling;Zl=o,Gl=l,Jl=u}ws(e)}else 8772&o.subtreeFlags&&null!==i?(i.return=o,Zl=i):ws(e)}}function ws(e){for(;null!==Zl;){var t=Zl;if(8772&t.flags){var n=t.alternate;try{if(8772&t.flags)switch(t.tag){case 0:case 11:case 15:Jl||os(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Jl)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:vi(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var a=t.updateQueue;null!==a&&zi(t,a,r);break;case 3:var l=t.updateQueue;if(null!==l){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}zi(t,l,n)}break;case 5:var s=t.stateNode;if(null===n&&4&t.flags){n=s;var u=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":u.autoFocus&&n.focus();break;case"img":u.src&&(n.src=u.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var c=t.alternate;if(null!==c){var d=c.memoizedState;if(null!==d){var f=d.dehydrated;null!==f&&qt(f)}}}break;default:throw Error(i(163))}Jl||512&t.flags&&is(t)}catch(e){xu(t,t.return,e)}}if(t===e){Zl=null;break}if(null!==(n=t.sibling)){n.return=t.return,Zl=n;break}Zl=t.return}}function Ss(e){for(;null!==Zl;){var t=Zl;if(t===e){Zl=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Zl=n;break}Zl=t.return}}function Cs(e){for(;null!==Zl;){var t=Zl;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{os(4,t)}catch(e){xu(t,n,e)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(e){xu(t,o,e)}}var i=t.return;try{is(t)}catch(e){xu(t,i,e)}break;case 5:var a=t.return;try{is(t)}catch(e){xu(t,a,e)}}}catch(e){xu(t,t.return,e)}if(t===e){Zl=null;break}var l=t.sibling;if(null!==l){l.return=t.return,Zl=l;break}Zl=t.return}}var Es,xs=Math.ceil,Ts=k.ReactCurrentDispatcher,_s=k.ReactCurrentOwner,Ls=k.ReactCurrentBatchConfig,Is=0,Ps=null,Ds=null,Ms=0,Ns=0,Os=xo(0),As=0,Fs=null,Rs=0,Us=0,zs=0,Vs=null,js=null,qs=0,Bs=1/0,$s=null,Hs=!1,Ks=null,Ws=null,Ys=!1,Qs=null,Gs=0,Js=0,Xs=null,Zs=-1,eu=0;function tu(){return 6&Is?Je():-1!==Zs?Zs:Zs=Je()}function nu(e){return 1&e.mode?2&Is&&0!==Ms?Ms&-Ms:null!==gi.transition?(0===eu&&(eu=mt()),eu):0!==(e=bt)?e:e=void 0===(e=window.event)?16:Gt(e.type):1}function ru(e,t,n,r){if(50<Js)throw Js=0,Xs=null,Error(i(185));vt(e,n,r),2&Is&&e===Ps||(e===Ps&&(!(2&Is)&&(Us|=n),4===As&&su(e,Ms)),ou(e,r),1===n&&0===Is&&!(1&t.mode)&&(Bs=Je()+500,Vo&&Bo()))}function ou(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,i=e.pendingLanes;0<i;){var a=31-at(i),l=1<<a,s=o[a];-1===s?l&n&&!(l&r)||(o[a]=pt(l,t)):s<=t&&(e.expiredLanes|=l),i&=~l}}(e,t);var r=ft(e,e===Ps?Ms:0);if(0===r)null!==n&&Ye(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ye(n),1===t)0===e.tag?function(e){Vo=!0,qo(e)}(uu.bind(null,e)):qo(uu.bind(null,e)),ao((function(){!(6&Is)&&Bo()})),n=null;else{switch(kt(r)){case 1:n=Ze;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Pu(n,iu.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function iu(e,t){if(Zs=-1,eu=0,6&Is)throw Error(i(327));var n=e.callbackNode;if(Cu()&&e.callbackNode!==n)return null;var r=ft(e,e===Ps?Ms:0);if(0===r)return null;if(30&r||r&e.expiredLanes||t)t=vu(e,r);else{t=r;var o=Is;Is|=2;var a=mu();for(Ps===e&&Ms===t||($s=null,Bs=Je()+500,pu(e,t));;)try{bu();break}catch(t){hu(e,t)}Si(),Ts.current=a,Is=o,null!==Ds?t=0:(Ps=null,Ms=0,t=As)}if(0!==t){if(2===t&&0!==(o=ht(e))&&(r=o,t=au(e,o)),1===t)throw n=Fs,pu(e,0),su(e,r),ou(e,Je()),n;if(6===t)su(e,r);else{if(o=e.current.alternate,!(30&r||function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],i=o.getSnapshot;o=o.value;try{if(!lr(i(),o))return!1}catch(e){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)||(t=vu(e,r),2===t&&(a=ht(e),0!==a&&(r=a,t=au(e,a))),1!==t)))throw n=Fs,pu(e,0),su(e,r),ou(e,Je()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(i(345));case 2:case 5:Su(e,js,$s);break;case 3:if(su(e,r),(130023424&r)===r&&10<(t=qs+500-Je())){if(0!==ft(e,0))break;if(((o=e.suspendedLanes)&r)!==r){tu(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(Su.bind(null,e,js,$s),t);break}Su(e,js,$s);break;case 4:if(su(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var l=31-at(r);a=1<<l,(l=t[l])>o&&(o=l),r&=~a}if(r=o,10<(r=(120>(r=Je()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*xs(r/1960))-r)){e.timeoutHandle=ro(Su.bind(null,e,js,$s),r);break}Su(e,js,$s);break;default:throw Error(i(329))}}}return ou(e,Je()),e.callbackNode===n?iu.bind(null,e):null}function au(e,t){var n=Vs;return e.current.memoizedState.isDehydrated&&(pu(e,t).flags|=256),2!==(e=vu(e,t))&&(t=js,js=n,null!==t&&lu(t)),e}function lu(e){null===js?js=e:js.push.apply(js,e)}function su(e,t){for(t&=~zs,t&=~Us,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-at(t),r=1<<n;e[n]=-1,t&=~r}}function uu(e){if(6&Is)throw Error(i(327));Cu();var t=ft(e,0);if(!(1&t))return ou(e,Je()),null;var n=vu(e,t);if(0!==e.tag&&2===n){var r=ht(e);0!==r&&(t=r,n=au(e,r))}if(1===n)throw n=Fs,pu(e,0),su(e,t),ou(e,Je()),n;if(6===n)throw Error(i(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Su(e,js,$s),ou(e,Je()),null}function cu(e,t){var n=Is;Is|=1;try{return e(t)}finally{0===(Is=n)&&(Bs=Je()+500,Vo&&Bo())}}function du(e){null!==Qs&&0===Qs.tag&&!(6&Is)&&Cu();var t=Is;Is|=1;var n=Ls.transition,r=bt;try{if(Ls.transition=null,bt=1,e)return e()}finally{bt=r,Ls.transition=n,!(6&(Is=t))&&Bo()}}function fu(){Ns=Os.current,To(Os)}function pu(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Ds)for(n=Ds.return;null!==n;){var r=n;switch(ni(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Oo();break;case 3:ia(),To(Po),To(Io),da();break;case 5:la(r);break;case 4:ia();break;case 13:case 19:To(sa);break;case 10:Ci(r.type._context);break;case 22:case 23:fu()}n=n.return}if(Ps=e,Ds=e=Ou(e.current,null),Ms=Ns=t,As=0,Fs=null,zs=Us=Rs=0,js=Vs=null,null!==_i){for(t=0;t<_i.length;t++)if(null!==(r=(n=_i[t]).interleaved)){n.interleaved=null;var o=r.next,i=n.pending;if(null!==i){var a=i.next;i.next=o,r.next=a}n.pending=r}_i=null}return e}function hu(e,t){for(;;){var n=Ds;try{if(Si(),fa.current=al,ya){for(var r=ma.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ya=!1}if(ha=0,va=ga=ma=null,ba=!1,ka=0,_s.current=null,null===n||null===n.return){As=1,Fs=t,Ds=null;break}e:{var a=e,l=n.return,s=n,u=t;if(t=Ms,s.flags|=32768,null!==u&&"object"==typeof u&&"function"==typeof u.then){var c=u,d=s,f=d.tag;if(!(1&d.mode||0!==f&&11!==f&&15!==f)){var p=d.alternate;p?(d.updateQueue=p.updateQueue,d.memoizedState=p.memoizedState,d.lanes=p.lanes):(d.updateQueue=null,d.memoizedState=null)}var h=vl(l);if(null!==h){h.flags&=-257,yl(h,l,s,0,t),1&h.mode&&gl(a,c,t),u=c;var m=(t=h).updateQueue;if(null===m){var g=new Set;g.add(u),t.updateQueue=g}else m.add(u);break e}if(!(1&t)){gl(a,c,t),gu();break e}u=Error(i(426))}else if(ii&&1&s.mode){var v=vl(l);if(null!==v){!(65536&v.flags)&&(v.flags|=256),yl(v,l,s,0,t),mi(cl(u,s));break e}}a=u=cl(u,s),4!==As&&(As=2),null===Vs?Vs=[a]:Vs.push(a),a=l;do{switch(a.tag){case 3:a.flags|=65536,t&=-t,a.lanes|=t,Ri(a,hl(0,u,t));break e;case 1:s=u;var y=a.type,b=a.stateNode;if(!(128&a.flags||"function"!=typeof y.getDerivedStateFromError&&(null===b||"function"!=typeof b.componentDidCatch||null!==Ws&&Ws.has(b)))){a.flags|=65536,t&=-t,a.lanes|=t,Ri(a,ml(a,s,t));break e}}a=a.return}while(null!==a)}wu(n)}catch(e){t=e,Ds===n&&null!==n&&(Ds=n=n.return);continue}break}}function mu(){var e=Ts.current;return Ts.current=al,null===e?al:e}function gu(){0!==As&&3!==As&&2!==As||(As=4),null===Ps||!(268435455&Rs)&&!(268435455&Us)||su(Ps,Ms)}function vu(e,t){var n=Is;Is|=2;var r=mu();for(Ps===e&&Ms===t||($s=null,pu(e,t));;)try{yu();break}catch(t){hu(e,t)}if(Si(),Is=n,Ts.current=r,null!==Ds)throw Error(i(261));return Ps=null,Ms=0,As}function yu(){for(;null!==Ds;)ku(Ds)}function bu(){for(;null!==Ds&&!Qe();)ku(Ds)}function ku(e){var t=Es(e.alternate,e,Ns);e.memoizedProps=e.pendingProps,null===t?wu(e):Ds=t,_s.current=null}function wu(e){var t=e;do{var n=t.alternate;if(e=t.return,32768&t.flags){if(null!==(n=Ql(n,t)))return n.flags&=32767,void(Ds=n);if(null===e)return As=6,void(Ds=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}else if(null!==(n=Yl(n,t,Ns)))return void(Ds=n);if(null!==(t=t.sibling))return void(Ds=t);Ds=t=e}while(null!==t);0===As&&(As=5)}function Su(e,t,n){var r=bt,o=Ls.transition;try{Ls.transition=null,bt=1,function(e,t,n,r){do{Cu()}while(null!==Qs);if(6&Is)throw Error(i(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null,e.callbackPriority=0;var a=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-at(n),i=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~i}}(e,a),e===Ps&&(Ds=Ps=null,Ms=0),!(2064&n.subtreeFlags)&&!(2064&n.flags)||Ys||(Ys=!0,Pu(tt,(function(){return Cu(),null}))),a=!!(15990&n.flags),15990&n.subtreeFlags||a){a=Ls.transition,Ls.transition=null;var l=bt;bt=1;var s=Is;Is|=4,_s.current=null,function(e,t){if(eo=$t,pr(e=fr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch(e){n=null;break e}var l=0,s=-1,u=-1,c=0,d=0,f=e,p=null;t:for(;;){for(var h;f!==n||0!==o&&3!==f.nodeType||(s=l+o),f!==a||0!==r&&3!==f.nodeType||(u=l+r),3===f.nodeType&&(l+=f.nodeValue.length),null!==(h=f.firstChild);)p=f,f=h;for(;;){if(f===e)break t;if(p===n&&++c===o&&(s=l),p===a&&++d===r&&(u=l),null!==(h=f.nextSibling))break;p=(f=p).parentNode}f=h}n=-1===s||-1===u?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},$t=!1,Zl=t;null!==Zl;)if(e=(t=Zl).child,1028&t.subtreeFlags&&null!==e)e.return=t,Zl=e;else for(;null!==Zl;){t=Zl;try{var m=t.alternate;if(1024&t.flags)switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==m){var g=m.memoizedProps,v=m.memoizedState,y=t.stateNode,b=y.getSnapshotBeforeUpdate(t.elementType===t.type?g:vi(t.type,g),v);y.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var k=t.stateNode.containerInfo;1===k.nodeType?k.textContent="":9===k.nodeType&&k.documentElement&&k.removeChild(k.documentElement);break;default:throw Error(i(163))}}catch(e){xu(t,t.return,e)}if(null!==(e=t.sibling)){e.return=t.return,Zl=e;break}Zl=t.return}m=ns,ns=!1}(e,n),vs(n,e),hr(to),$t=!!eo,to=eo=null,e.current=n,bs(n,e,o),Ge(),Is=s,bt=l,Ls.transition=a}else e.current=n;if(Ys&&(Ys=!1,Qs=e,Gs=o),0===(a=e.pendingLanes)&&(Ws=null),function(e){if(it&&"function"==typeof it.onCommitFiberRoot)try{it.onCommitFiberRoot(ot,e,void 0,!(128&~e.current.flags))}catch(e){}}(n.stateNode),ou(e,Je()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)r((o=t[n]).value,{componentStack:o.stack,digest:o.digest});if(Hs)throw Hs=!1,e=Ks,Ks=null,e;!!(1&Gs)&&0!==e.tag&&Cu(),1&(a=e.pendingLanes)?e===Xs?Js++:(Js=0,Xs=e):Js=0,Bo()}(e,t,n,r)}finally{Ls.transition=o,bt=r}return null}function Cu(){if(null!==Qs){var e=kt(Gs),t=Ls.transition,n=bt;try{if(Ls.transition=null,bt=16>e?16:e,null===Qs)var r=!1;else{if(e=Qs,Qs=null,Gs=0,6&Is)throw Error(i(331));var o=Is;for(Is|=4,Zl=e.current;null!==Zl;){var a=Zl,l=a.child;if(16&Zl.flags){var s=a.deletions;if(null!==s){for(var u=0;u<s.length;u++){var c=s[u];for(Zl=c;null!==Zl;){var d=Zl;switch(d.tag){case 0:case 11:case 15:rs(8,d,a)}var f=d.child;if(null!==f)f.return=d,Zl=f;else for(;null!==Zl;){var p=(d=Zl).sibling,h=d.return;if(as(d),d===c){Zl=null;break}if(null!==p){p.return=h,Zl=p;break}Zl=h}}}var m=a.alternate;if(null!==m){var g=m.child;if(null!==g){m.child=null;do{var v=g.sibling;g.sibling=null,g=v}while(null!==g)}}Zl=a}}if(2064&a.subtreeFlags&&null!==l)l.return=a,Zl=l;else e:for(;null!==Zl;){if(2048&(a=Zl).flags)switch(a.tag){case 0:case 11:case 15:rs(9,a,a.return)}var y=a.sibling;if(null!==y){y.return=a.return,Zl=y;break e}Zl=a.return}}var b=e.current;for(Zl=b;null!==Zl;){var k=(l=Zl).child;if(2064&l.subtreeFlags&&null!==k)k.return=l,Zl=k;else e:for(l=b;null!==Zl;){if(2048&(s=Zl).flags)try{switch(s.tag){case 0:case 11:case 15:os(9,s)}}catch(e){xu(s,s.return,e)}if(s===l){Zl=null;break e}var w=s.sibling;if(null!==w){w.return=s.return,Zl=w;break e}Zl=s.return}}if(Is=o,Bo(),it&&"function"==typeof it.onPostCommitFiberRoot)try{it.onPostCommitFiberRoot(ot,e)}catch(e){}r=!0}return r}finally{bt=n,Ls.transition=t}}return!1}function Eu(e,t,n){e=Ai(e,t=hl(0,t=cl(n,t),1),1),t=tu(),null!==e&&(vt(e,1,t),ou(e,t))}function xu(e,t,n){if(3===e.tag)Eu(e,e,n);else for(;null!==t;){if(3===t.tag){Eu(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Ws||!Ws.has(r))){t=Ai(t,e=ml(t,e=cl(n,e),1),1),e=tu(),null!==t&&(vt(t,1,e),ou(t,e));break}}t=t.return}}function Tu(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=tu(),e.pingedLanes|=e.suspendedLanes&n,Ps===e&&(Ms&n)===n&&(4===As||3===As&&(130023424&Ms)===Ms&&500>Je()-qs?pu(e,0):zs|=n),ou(e,t)}function _u(e,t){0===t&&(1&e.mode?(t=ct,!(130023424&(ct<<=1))&&(ct=4194304)):t=1);var n=tu();null!==(e=Pi(e,t))&&(vt(e,t,n),ou(e,n))}function Lu(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),_u(e,n)}function Iu(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(i(314))}null!==r&&r.delete(t),_u(e,n)}function Pu(e,t){return We(e,t)}function Du(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Mu(e,t,n,r){return new Du(e,t,n,r)}function Nu(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Ou(e,t){var n=e.alternate;return null===n?((n=Mu(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Au(e,t,n,r,o,a){var l=2;if(r=e,"function"==typeof e)Nu(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case C:return Fu(n.children,o,a,t);case E:l=8,o|=8;break;case x:return(e=Mu(12,n,t,2|o)).elementType=x,e.lanes=a,e;case I:return(e=Mu(13,n,t,o)).elementType=I,e.lanes=a,e;case P:return(e=Mu(19,n,t,o)).elementType=P,e.lanes=a,e;case N:return Ru(n,o,a,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case T:l=10;break e;case _:l=9;break e;case L:l=11;break e;case D:l=14;break e;case M:l=16,r=null;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Mu(l,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Fu(e,t,n,r){return(e=Mu(7,e,r,t)).lanes=n,e}function Ru(e,t,n,r){return(e=Mu(22,e,r,t)).elementType=N,e.lanes=n,e.stateNode={isHidden:!1},e}function Uu(e,t,n){return(e=Mu(6,e,null,t)).lanes=n,e}function zu(e,t,n){return(t=Mu(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Vu(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function ju(e,t,n,r,o,i,a,l,s){return e=new Vu(e,t,n,l,s),1===t?(t=1,!0===i&&(t|=8)):t=0,i=Mu(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Mi(i),e}function qu(e){if(!e)return Lo;e:{if(qe(e=e._reactInternals)!==e||1!==e.tag)throw Error(i(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(No(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(i(171))}if(1===e.tag){var n=e.type;if(No(n))return Fo(e,n,t)}return t}function Bu(e,t,n,r,o,i,a,l,s){return(e=ju(n,r,!0,e,0,i,0,l,s)).context=qu(null),n=e.current,(i=Oi(r=tu(),o=nu(n))).callback=null!=t?t:null,Ai(n,i,o),e.current.lanes=o,vt(e,o,r),ou(e,r),e}function $u(e,t,n,r){var o=t.current,i=tu(),a=nu(o);return n=qu(n),null===t.context?t.context=n:t.pendingContext=n,(t=Oi(i,a)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Ai(o,t,a))&&(ru(e,o,a,i),Fi(e,o,a)),a}function Hu(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Ku(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Wu(e,t){Ku(e,t),(e=e.alternate)&&Ku(e,t)}Es=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Po.current)kl=!0;else{if(!(e.lanes&n||128&t.flags))return kl=!1,function(e,t,n){switch(t.tag){case 3:Pl(t),hi();break;case 5:aa(t);break;case 1:No(t.type)&&Ro(t);break;case 4:oa(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;_o(yi,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(_o(sa,1&sa.current),t.flags|=128,null):n&t.child.childLanes?Ul(e,t,n):(_o(sa,1&sa.current),null!==(e=Hl(e,t,n))?e.sibling:null);_o(sa,1&sa.current);break;case 19:if(r=!!(n&t.childLanes),128&e.flags){if(r)return Bl(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),_o(sa,sa.current),r)break;return null;case 22:case 23:return t.lanes=0,xl(e,t,n)}return Hl(e,t,n)}(e,t,n);kl=!!(131072&e.flags)}else kl=!1,ii&&1048576&t.flags&&ei(t,Wo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;$l(e,t),e=t.pendingProps;var o=Mo(t,Io.current);xi(t,n),o=Ea(null,t,r,e,o,n);var a=xa();return t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,No(r)?(a=!0,Ro(t)):a=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Mi(t),o.updater=qi,t.stateNode=o,o._reactInternals=t,Ki(t,r,e,n),t=Il(null,t,r,!0,a,n)):(t.tag=0,ii&&a&&ti(t),wl(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch($l(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Nu(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===D)return 14}return 2}(r),e=vi(r,e),o){case 0:t=_l(null,t,r,e,n);break e;case 1:t=Ll(null,t,r,e,n);break e;case 11:t=Sl(null,t,r,e,n);break e;case 14:t=Cl(null,t,r,vi(r.type,e),n);break e}throw Error(i(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,_l(e,t,r,o=t.elementType===r?o:vi(r,o),n);case 1:return r=t.type,o=t.pendingProps,Ll(e,t,r,o=t.elementType===r?o:vi(r,o),n);case 3:e:{if(Pl(t),null===e)throw Error(i(387));r=t.pendingProps,o=(a=t.memoizedState).element,Ni(e,t),Ui(t,r,null,n);var l=t.memoizedState;if(r=l.element,a.isDehydrated){if(a={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=Dl(e,t,r,n,o=cl(Error(i(423)),t));break e}if(r!==o){t=Dl(e,t,r,n,o=cl(Error(i(424)),t));break e}for(oi=uo(t.stateNode.containerInfo.firstChild),ri=t,ii=!0,ai=null,n=Xi(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(hi(),r===o){t=Hl(e,t,n);break e}wl(e,t,r,n)}t=t.child}return t;case 5:return aa(t),null===e&&ci(t),r=t.type,o=t.pendingProps,a=null!==e?e.memoizedProps:null,l=o.children,no(r,o)?l=null:null!==a&&no(r,a)&&(t.flags|=32),Tl(e,t),wl(e,t,l,n),t.child;case 6:return null===e&&ci(t),null;case 13:return Ul(e,t,n);case 4:return oa(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ji(t,null,r,n):wl(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Sl(e,t,r,o=t.elementType===r?o:vi(r,o),n);case 7:return wl(e,t,t.pendingProps,n),t.child;case 8:case 12:return wl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,a=t.memoizedProps,l=o.value,_o(yi,r._currentValue),r._currentValue=l,null!==a)if(lr(a.value,l)){if(a.children===o.children&&!Po.current){t=Hl(e,t,n);break e}}else for(null!==(a=t.child)&&(a.return=t);null!==a;){var s=a.dependencies;if(null!==s){l=a.child;for(var u=s.firstContext;null!==u;){if(u.context===r){if(1===a.tag){(u=Oi(-1,n&-n)).tag=2;var c=a.updateQueue;if(null!==c){var d=(c=c.shared).pending;null===d?u.next=u:(u.next=d.next,d.next=u),c.pending=u}}a.lanes|=n,null!==(u=a.alternate)&&(u.lanes|=n),Ei(a.return,n,t),s.lanes|=n;break}u=u.next}}else if(10===a.tag)l=a.type===t.type?null:a.child;else if(18===a.tag){if(null===(l=a.return))throw Error(i(341));l.lanes|=n,null!==(s=l.alternate)&&(s.lanes|=n),Ei(l,n,t),l=a.sibling}else l=a.child;if(null!==l)l.return=a;else for(l=a;null!==l;){if(l===t){l=null;break}if(null!==(a=l.sibling)){a.return=l.return,l=a;break}l=l.return}a=l}wl(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,xi(t,n),r=r(o=Ti(o)),t.flags|=1,wl(e,t,r,n),t.child;case 14:return o=vi(r=t.type,t.pendingProps),Cl(e,t,r,o=vi(r.type,o),n);case 15:return El(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:vi(r,o),$l(e,t),t.tag=1,No(r)?(e=!0,Ro(t)):e=!1,xi(t,n),$i(t,r,o),Ki(t,r,o,n),Il(null,t,r,!0,e,n);case 19:return Bl(e,t,n);case 22:return xl(e,t,n)}throw Error(i(156,t.tag))};var Yu="function"==typeof reportError?reportError:function(e){console.error(e)};function Qu(e){this._internalRoot=e}function Gu(e){this._internalRoot=e}function Ju(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Xu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Zu(){}function ec(e,t,n,r,o){var i=n._reactRootContainer;if(i){var a=i;if("function"==typeof o){var l=o;o=function(){var e=Hu(a);l.call(e)}}$u(t,a,e,o)}else a=function(e,t,n,r,o){if(o){if("function"==typeof r){var i=r;r=function(){var e=Hu(a);i.call(e)}}var a=Bu(t,r,e,0,null,!1,0,"",Zu);return e._reactRootContainer=a,e[mo]=a.current,qr(8===e.nodeType?e.parentNode:e),du(),a}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var l=r;r=function(){var e=Hu(s);l.call(e)}}var s=ju(e,0,!1,null,0,!1,0,"",Zu);return e._reactRootContainer=s,e[mo]=s.current,qr(8===e.nodeType?e.parentNode:e),du((function(){$u(t,s,n,r)})),s}(n,t,e,o,r);return Hu(a)}Gu.prototype.render=Qu.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(i(409));$u(e,t,null,null)},Gu.prototype.unmount=Qu.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;du((function(){$u(null,e,null,null)})),t[mo]=null}},Gu.prototype.unstable_scheduleHydration=function(e){if(e){var t=Et();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Nt.length&&0!==t&&t<Nt[n].priority;n++);Nt.splice(n,0,e),0===n&&Rt(e)}},wt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(yt(t,1|n),ou(t,Je()),!(6&Is)&&(Bs=Je()+500,Bo()))}break;case 13:du((function(){var t=Pi(e,1);if(null!==t){var n=tu();ru(t,e,1,n)}})),Wu(e,1)}},St=function(e){if(13===e.tag){var t=Pi(e,134217728);null!==t&&ru(t,e,134217728,tu()),Wu(e,134217728)}},Ct=function(e){if(13===e.tag){var t=nu(e),n=Pi(e,t);null!==n&&ru(n,e,t,tu()),Wu(e,t)}},Et=function(){return bt},xt=function(e,t){var n=bt;try{return bt=e,t()}finally{bt=n}},Se=function(e,t,n){switch(t){case"input":if(X(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=So(r);if(!o)throw Error(i(90));W(r),X(r,o)}}}break;case"textarea":ie(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Le=cu,Ie=du;var tc={usingClientEntryPoint:!1,Events:[ko,wo,So,Te,_e,cu]},nc={findFiberByHostInstance:bo,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"},rc={bundleType:nc.bundleType,version:nc.version,rendererPackageName:nc.rendererPackageName,rendererConfig:nc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:k.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=He(e))?null:e.stateNode},findFiberByHostInstance:nc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var oc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!oc.isDisabled&&oc.supportsFiber)try{ot=oc.inject(rc),it=oc}catch(ce){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tc,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Ju(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:S,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Ju(e))throw Error(i(299));var n=!1,r="",o=Yu;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=ju(e,1,!1,null,0,n,0,r,o),e[mo]=t.current,qr(8===e.nodeType?e.parentNode:e),new Qu(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(i(188));throw e=Object.keys(e).join(","),Error(i(268,e))}return null===(e=He(t))?null:e.stateNode},t.flushSync=function(e){return du(e)},t.hydrate=function(e,t,n){if(!Xu(t))throw Error(i(200));return ec(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Ju(e))throw Error(i(405));var r=null!=n&&n.hydratedSources||null,o=!1,a="",l=Yu;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(a=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=Bu(t,null,e,1,null!=n?n:null,o,0,a,l),e[mo]=t.current,qr(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Gu(t)},t.render=function(e,t,n){if(!Xu(t))throw Error(i(200));return ec(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Xu(e))throw Error(i(40));return!!e._reactRootContainer&&(du((function(){ec(null,null,e,!1,(function(){e._reactRootContainer=null,e[mo]=null}))})),!0)},t.unstable_batchedUpdates=cu,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Xu(n))throw Error(i(200));if(null==e||void 0===e._reactInternals)throw Error(i(38));return ec(e,t,n,!1,r)},t.version="18.2.0-next-9e3b772b8-20220608"},5338:(e,t,n)=>{var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(e,t,n)=>{!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(2551)},5287:(e,t)=>{var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),s=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator,h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,g={};function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}function y(){}function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=v.prototype;var k=b.prototype=new y;k.constructor=b,m(k,v.prototype),k.isPureReactComponent=!0;var w=Array.isArray,S=Object.prototype.hasOwnProperty,C={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,r){var o,i={},a=null,l=null;if(null!=t)for(o in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(a=""+t.key),t)S.call(t,o)&&!E.hasOwnProperty(o)&&(i[o]=t[o]);var s=arguments.length-2;if(1===s)i.children=r;else if(1<s){for(var u=Array(s),c=0;c<s;c++)u[c]=arguments[c+2];i.children=u}if(e&&e.defaultProps)for(o in s=e.defaultProps)void 0===i[o]&&(i[o]=s[o]);return{$$typeof:n,type:e,key:a,ref:l,props:i,_owner:C.current}}function T(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var _=/\/+/g;function L(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function I(e,t,o,i,a){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case n:case r:s=!0}}if(s)return a=a(s=e),e=""===i?"."+L(s,0):i,w(a)?(o="",null!=e&&(o=e.replace(_,"$&/")+"/"),I(a,t,o,"",(function(e){return e}))):null!=a&&(T(a)&&(a=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,o+(!a.key||s&&s.key===a.key?"":(""+a.key).replace(_,"$&/")+"/")+e)),t.push(a)),1;if(s=0,i=""===i?".":i+":",w(e))for(var u=0;u<e.length;u++){var c=i+L(l=e[u],u);s+=I(l,t,o,c,a)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),u=0;!(l=e.next()).done;)s+=I(l=l.value,t,o,c=i+L(l,u++),a);else if("object"===l)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return s}function P(e,t,n){if(null==e)return e;var r=[],o=0;return I(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function D(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var M={current:null},N={transition:null},O={ReactCurrentDispatcher:M,ReactCurrentBatchConfig:N,ReactCurrentOwner:C};t.Children={map:P,forEach:function(e,t,n){P(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return P(e,(function(){t++})),t},toArray:function(e){return P(e,(function(e){return e}))||[]},only:function(e){if(!T(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=v,t.Fragment=o,t.Profiler=a,t.PureComponent=b,t.StrictMode=i,t.Suspense=c,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=m({},e.props),i=e.key,a=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(a=t.ref,l=C.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(u in t)S.call(t,u)&&!E.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==s?s[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=r;else if(1<u){s=Array(u);for(var c=0;c<u;c++)s[c]=arguments[c+2];o.children=s}return{$$typeof:n,type:e.type,key:i,ref:a,props:o,_owner:l}},t.createContext=function(e){return(e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:l,_context:e},e.Consumer=e},t.createElement=x,t.createFactory=function(e){var t=x.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=T,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:D}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=N.transition;N.transition={};try{e()}finally{N.transition=t}},t.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")},t.useCallback=function(e,t){return M.current.useCallback(e,t)},t.useContext=function(e){return M.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return M.current.useDeferredValue(e)},t.useEffect=function(e,t){return M.current.useEffect(e,t)},t.useId=function(){return M.current.useId()},t.useImperativeHandle=function(e,t,n){return M.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return M.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return M.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return M.current.useMemo(e,t)},t.useReducer=function(e,t,n){return M.current.useReducer(e,t,n)},t.useRef=function(e){return M.current.useRef(e)},t.useState=function(e){return M.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return M.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return M.current.useTransition()},t.version="18.2.0"},6540:(e,t,n)=>{e.exports=n(5287)},7463:(e,t)=>{function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<i(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,a=o>>>1;r<a;){var l=2*(r+1)-1,s=e[l],u=l+1,c=e[u];if(0>i(s,n))u<o&&0>i(c,s)?(e[r]=c,e[u]=n,r=u):(e[r]=s,e[l]=n,r=l);else{if(!(u<o&&0>i(c,n)))break e;e[r]=c,e[u]=n,r=u}}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var a=performance;t.unstable_now=function(){return a.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}var u=[],c=[],d=1,f=null,p=3,h=!1,m=!1,g=!1,v="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,b="undefined"!=typeof setImmediate?setImmediate:null;function k(e){for(var t=r(c);null!==t;){if(null===t.callback)o(c);else{if(!(t.startTime<=e))break;o(c),t.sortIndex=t.expirationTime,n(u,t)}t=r(c)}}function w(e){if(g=!1,k(e),!m)if(null!==r(u))m=!0,N(S);else{var t=r(c);null!==t&&O(w,t.startTime-e)}}function S(e,n){m=!1,g&&(g=!1,y(T),T=-1),h=!0;var i=p;try{for(k(n),f=r(u);null!==f&&(!(f.expirationTime>n)||e&&!I());){var a=f.callback;if("function"==typeof a){f.callback=null,p=f.priorityLevel;var l=a(f.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?f.callback=l:f===r(u)&&o(u),k(n)}else o(u);f=r(u)}if(null!==f)var s=!0;else{var d=r(c);null!==d&&O(w,d.startTime-n),s=!1}return s}finally{f=null,p=i,h=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var C,E=!1,x=null,T=-1,_=5,L=-1;function I(){return!(t.unstable_now()-L<_)}function P(){if(null!==x){var e=t.unstable_now();L=e;var n=!0;try{n=x(!0,e)}finally{n?C():(E=!1,x=null)}}else E=!1}if("function"==typeof b)C=function(){b(P)};else if("undefined"!=typeof MessageChannel){var D=new MessageChannel,M=D.port2;D.port1.onmessage=P,C=function(){M.postMessage(null)}}else C=function(){v(P,0)};function N(e){x=e,E||(E=!0,C())}function O(e,n){T=v((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){m||h||(m=!0,N(S))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):_=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_getFirstCallbackNode=function(){return r(u)},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,o,i){var a=t.unstable_now();switch(i="object"==typeof i&&null!==i&&"number"==typeof(i=i.delay)&&0<i?a+i:a,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:i,expirationTime:l=i+l,sortIndex:-1},i>a?(e.sortIndex=i,n(c,e),null===r(u)&&e===r(c)&&(g?(y(T),T=-1):g=!0,O(w,i-a))):(e.sortIndex=l,n(u,e),m||h||(m=!0,N(S))),e},t.unstable_shouldYield=I,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},9982:(e,t,n)=>{e.exports=n(7463)},3531:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendBinaryRequestToCustomServer=t.sendRequestToCustomServer=t.setupBackgroundRequestProxy=t.sendRealRequestToCustomServer=void 0;const o=n(1108),i=n(1740),a=n(3262);function l(e,t,n={},i={}){return r(this,void 0,void 0,(function*(){return"get"===e.toLowerCase()&&(t=(0,o.objectToURI)(t,n,!0),n=null),yield fetch(t,{method:e,headers:Object.assign({"Content-Type":"application/json"},i||{}),redirect:"follow",body:n?JSON.stringify(n):null})}))}t.sendRealRequestToCustomServer=l,t.setupBackgroundRequestProxy=function(){chrome.runtime.onMessage.addListener(((e,t,n)=>"sendRequest"===e.message?(l(e.type,e.url,e.data,e.headers).then((t=>r(this,void 0,void 0,(function*(){const r=e.binary?(0,o.isFirefoxOrSafari)()&&!(0,i.isSafari)()?yield t.blob():Array.from(new Uint8Array(yield t.arrayBuffer())):null;n({responseText:e.binary?"":yield t.text(),responseBinary:r,headers:e.returnHeaders&&t.headers?[...t.headers.entries()].reduce(((e,[t,n])=>(e[t]=n,e)),{}):null,status:t.status,ok:t.ok})})))).catch((()=>{n({responseText:"",responseBinary:null,headers:null,status:-1,ok:!1})})),!0):"getHash"===e.message&&((0,a.getHash)(e.value,e.times).then(n).catch((e=>{n({error:null==e?void 0:e.message})})),!0)))},t.sendRequestToCustomServer=function(e,t,n={},r={}){return new Promise(((o,i)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:n,headers:r},(e=>{-1!==e.status?o(e):i(e)}))}))},t.sendBinaryRequestToCustomServer=function(e,t,n={},r={}){return new Promise(((o,i)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:n,headers:r,binary:!0,returnHeaders:!0},(e=>{-1!==e.status?o(e):i(e)}))}))}},7046:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.chromeP=void 0,t.chromeP="undefined"==typeof browser?"undefined"!=typeof chrome?chrome:null:browser},2146:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DataCache=void 0,t.DataCache=class{constructor(e,t=2e3){this.cache={},this.init=e,this.cacheLimit=t}getFromCache(e){return this.cache[e]}setupCache(e){if(!this.cache[e]&&(this.cache[e]=Object.assign(Object.assign({},this.init()),{lastUsed:Date.now()}),Object.keys(this.cache).length>this.cacheLimit)){const e=Object.entries(this.cache).reduce(((e,t)=>e[1].lastUsed<t[1].lastUsed?e:t));delete this.cache[e[0]]}return this.cache[e]}cacheUsed(e){return this.cache[e]&&(this.cache[e].lastUsed=Date.now()),!!this.cache[e]}}},2184:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.injectUpdatedScripts=t.getCleanupStartMessage=t.getCleanupId=t.setupCleanupListener=t.addCleanupListener=void 0;const o=n(7046),i=[];function a(){return`${chrome.runtime.id}-cleanup`}t.addCleanupListener=function(e){i.push(e)},t.setupCleanupListener=function(){const e=a(),t=performance.now();window.postMessage({source:e,message:"cleanup-start"}),window.addEventListener("message",(n=>{var r;if((null===(r=n.data)||void 0===r?void 0:r.source)&&n.data.source===e&&"cleanup-start"===n.data.message&&performance.now()-t>5e3)for(const e of i)e()}))},t.getCleanupId=a,t.getCleanupStartMessage=function(){return"cleanup-start"},t.injectUpdatedScripts=function(e=[],t=!1){return r(this,void 0,void 0,(function*(){const n=t?e:e.concat(chrome.runtime.getManifest().content_scripts||[]);if("scripting"in chrome)for(const e of n)for(const t of yield o.chromeP.tabs.query({url:e.matches}))e.css&&e.css.length>0&&(yield o.chromeP.scripting.insertCSS({target:{tabId:t.id},files:e.css||[]})),yield o.chromeP.scripting.executeScript({target:{tabId:t.id},files:e.js||[],world:e.world||"ISOLATED"});else chrome.windows.getAll({populate:!0},(e=>{var t,r;for(const o of e)if(o.tabs)for(const e of o.tabs)for(const o of n)if(e.url&&(null===(r=null===(t=o.matches)||void 0===t?void 0:t.some)||void 0===r?void 0:r.call(t,(t=>e.url.match(t.replace(/\//g,"\\/").replace(/\./g,"\\.").replace(/\*/g,".*")))))){if(o.js)for(const t of o.js)chrome.tabs.executeScript(e.id,{file:t});if(o.css)for(const t of o.css)chrome.tabs.insertCSS(e.id,{file:t})}}))}))}},1740:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.keybindToString=t.formatKey=t.keybindEquals=t.isSafari=t.ProtoConfig=void 0;const o=n(1108);function i(){return"undefined"!=typeof navigator&&"Apple Computer, Inc."===navigator.vendor}function a(e){return null==e?"":" "==e?"Space":1==e.length?e.toUpperCase():e}t.ProtoConfig=class{constructor(e,t,n,r=!1){this.configLocalListeners=[],this.configSyncListeners=[],this.cachedSyncConfig=null,this.cachedLocalStorage=null,this.config=null,this.local=null,this.inDeArrow=!1,this.syncDefaults=e,this.localDefaults=t,this.inDeArrow=r,this.setupConfig(n).then((e=>{this.config=null==e?void 0:e.sync,this.local=null==e?void 0:e.local}))}configProxy(){chrome.storage.onChanged.addListener(((e,t)=>{if("sync"===t){for(const t in e)this.cachedSyncConfig[t]=e[t].newValue;for(const t of this.configSyncListeners)t(e)}else if("local"===t){for(const t in e)this.cachedLocalStorage[t]=e[t].newValue;for(const t of this.configLocalListeners)t(e)}}));let e=0;const t=new Set;let n=null;const r=this,o={set(o,i,a){if(r.cachedSyncConfig[i]=a,Date.now()-e<100){if(t.add(i),!n){const e=()=>{const e=[...t];t.clear(),chrome.storage.sync.set(e.map((e=>[e,r.cachedSyncConfig[e]])).reduce(((e,[t,n])=>(e[t]=n,e)),{})),n=null};n=setTimeout(e,20)}return!0}return chrome.storage.sync.set({[i]:a}),e=Date.now(),!0},get(e,t){const n=r.cachedSyncConfig[t];return e[t]||n},deleteProperty:(e,t)=>(chrome.storage.sync.remove(t),!0)},i={set:(e,t,n)=>(r.cachedLocalStorage[t]=n,chrome.storage.local.set({[t]:n}),!0),get(e,t){const n=r.cachedLocalStorage[t];return e[t]||n},deleteProperty:(e,t)=>(chrome.storage.local.remove(t),!0)};return{sync:new Proxy({handler:o},o),local:new Proxy({handler:i},i)}}forceSyncUpdate(e){const t=this.cachedSyncConfig[e];chrome.storage.sync.set({[e]:t})}forceLocalUpdate(e){const t=this.cachedLocalStorage[e];chrome.storage.local.set({[e]:t},(()=>{const t=chrome.runtime.lastError;t&&"navigationApiAvailable"!==e&&alert(`SponsorBlock/DeArrow: ${chrome.i18n.getMessage("storageFull")}\n\n${t}`)}))}fetchConfig(){return r(this,void 0,void 0,(function*(){yield Promise.all([new Promise((e=>{chrome.storage.sync.get(null,(t=>{this.cachedSyncConfig=t,void 0===this.cachedSyncConfig&&(this.cachedSyncConfig={},(this.inDeArrow||window.location.href.includes("options.html"))&&alert(`${chrome.i18n.getMessage("syncDisabledWarning")}${this.inDeArrow?`\n\n${chrome.i18n.getMessage("syncDisabledWarningDeArrow")}`:""}${(0,o.isFirefoxOrSafari)()&&!i()?`\n\n${chrome.i18n.getMessage("syncDisabledFirefoxSuggestions")}`:""}`)),e()}))})),new Promise((e=>{chrome.storage.local.get(null,(t=>{this.cachedLocalStorage=null!=t?t:{},e()}))}))])}))}setupConfig(e){return r(this,void 0,void 0,(function*(){if("undefined"==typeof chrome)return null;yield this.fetchConfig(),this.addDefaults();const t=this.configProxy();return e(t.sync),t}))}addDefaults(){for(const e in this.syncDefaults)if(Object.prototype.hasOwnProperty.call(this.cachedSyncConfig,e)){if("barTypes"===e)for(const t in this.syncDefaults[e])Object.prototype.hasOwnProperty.call(this.cachedSyncConfig[e],t)||(this.cachedSyncConfig[e][t]=this.syncDefaults[e][t])}else this.cachedSyncConfig[e]=this.syncDefaults[e];for(const e in this.localDefaults)Object.prototype.hasOwnProperty.call(this.cachedLocalStorage,e)||(this.cachedLocalStorage[e]=this.localDefaults[e])}isReady(){return null!==this.config}},t.isSafari=i,t.keybindEquals=function(e,t){return!(null==e||null==t||Boolean(e.alt)!=Boolean(t.alt)||Boolean(e.ctrl)!=Boolean(t.ctrl)||Boolean(e.shift)!=Boolean(t.shift)||null==e.key&&null==e.code||null==t.key&&null==t.code)&&(null!=e.code&&null!=t.code?e.code===t.code:null!=e.key&&null!=t.key&&e.key.toUpperCase()===t.key.toUpperCase())},t.formatKey=a,t.keybindToString=function(e){if(null==e||null==e.key)return"";let t="";return e.ctrl&&(t+="Ctrl + "),e.alt&&(t+="Alt + "),e.shift&&(t+="Shift + "),t+a(e.key)}},2907:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.YT_DOMAINS=void 0,t.YT_DOMAINS=["m.youtube.com","www.youtube.com","www.youtube-nocookie.com","music.youtube.com","www.youtubekids.com","tv.youtube.com"]},4148:function(e,t){var n=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};function r(e,t=!1){var n,r,o;if(!e)return!1;if("VIDEO"===e.tagName&&(e.classList.contains("html5-main-video")||"player"===e.id||"player_html5_api"===e.id)&&1===[...document.querySelectorAll("video")].filter((e=>e.duration)).length&&e.duration)return!0;if(0===e.offsetHeight||0===e.offsetWidth&&!t)return!1;const i=null==e?void 0:e.getBoundingClientRect(),a=document.elementFromPoint(i.left+i.width/2,i.top+i.height/2)||document.elementFromPoint(i.left,i.top);return!a&&"movie_player"===e.id&&i.top<0||!!(a===e||a&&e.contains(a)||a&&a.contains(e))||"VIDEO"===e.tagName&&(!!(null===(n=null==a?void 0:a.closest(".html5-video-player"))||void 0===n?void 0:n.contains(e))||!!(null===(o=null===(r=null==e?void 0:e.closest("#inline-preview-player"))||void 0===r?void 0:r.classList)||void 0===o?void 0:o.contains("playing-mode")))}function o(e,t=!1,n=!0){var o,i;return r(e,t)||n&&!!e&&(r(e.parentElement,t)||r(null!==(i=null===(o=e.parentElement)||void 0===o?void 0:o.parentElement)&&void 0!==i?i:null,t))}function i(e,t=!1,n=!1){return a(e,t,n)}function a(e,t=!1,n=!1,r){for(const i of e){const e=r?r(i):i;if(e&&o(e,t,n))return e}return null}function l(e,t){for(const n of e){const e=document.querySelector(n);if(e&&t(e))return e}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.getElement=t.waitForElement=t.findNonEmptyElement=t.findPredicatedElement=t.findValidElement=t.findValidElementFromSelector=t.isVisibleOrParent=t.isVisible=void 0,t.isVisible=r,t.isVisibleOrParent=o,t.findValidElementFromSelector=function(e,t=!1,n=!1){return a(e,t,n,(e=>document.querySelector(e)))},t.findValidElement=i,t.findPredicatedElement=l,t.findNonEmptyElement=function(e){return l(e,(e=>{var t,n;return(null!==(n=null===(t=e.textContent)||void 0===t?void 0:t.trim())&&void 0!==n?n:"").length>0}))};let s=!1,u=null,c=[];function d(){if(!u){const e=e=>{var t;const n=[];for(const r of c){const{selector:o,visibleCheck:a,ignoreWidth:l,checkParent:s,callbacks:u}=r;let c=!0;if(e){let t=!1;for(const n of e)if("childList"===n.type&&n.addedNodes.length>0){if(n.target instanceof HTMLElement&&(n.target.matches(o)||n.target.querySelector(o))){t=!0;break}for(const e of n.addedNodes)if(e instanceof HTMLElement&&(e.matches(o)||e.querySelector(o))){t=!0;break}if(t)break}t||(c=!1)}const d=c?document.querySelectorAll(o):r.elements;if(d&&d.length>0){r.elements=d;const e=a?i(d,l,s):d[0];if(e){if(null===(t=chrome.runtime)||void 0===t?void 0:t.id)for(const t of u)t(e);n.push(o)}}}c=c.filter((e=>!n.includes(e.selector))),0===c.length&&(null==u||u.disconnect(),u=null,s=!1)};e(),c.length>0&&(u=new MutationObserver(e),u.observe(document.documentElement,{childList:!0,subtree:!0}))}}function f(e,t,n=!1,r=!1){return t?i(document.querySelectorAll(e),n,r):document.querySelector(e)}t.waitForElement=function(e,t=!1,r=!1,o=!1){return n(this,void 0,void 0,(function*(){return yield new Promise((n=>{const i=f(e,t,r,o);if(i)return void n(i);const a=c.find((n=>n.selector===e&&n.visibleCheck===t));a?a.callbacks.push(n):c.push({selector:e,visibleCheck:t,ignoreWidth:r,checkParent:o,callbacks:[n]}),s||(s=!0,document.body?d():window.addEventListener("DOMContentLoaded",(()=>{d()})))}))}))},t.getElement=f},8423:(e,t)=>{function n(){return document.querySelector("#title h1, .ytd-video-primary-info-renderer.title, .slim-video-information-title, #player-container + .h-box > h1, .ytd-video-primary-info-renderer > h1.title, #watch7-headline, .ypcs-video-info")}Object.defineProperty(t,"__esModule",{value:!0}),t.getCurrentPageTitle=t.getYouTubeTitleNode=t.getYouTubeTitleNodeSelector=void 0,t.getYouTubeTitleNodeSelector=function(){return"#title h1, .ytd-video-primary-info-renderer.title, .slim-video-information-title, #player-container + .h-box > h1, .ytd-video-primary-info-renderer > h1.title, #watch7-headline, .ypcs-video-info"},t.getYouTubeTitleNode=n,t.getCurrentPageTitle=function(){const e=n();if(e){const t=e.querySelector("yt-formatted-string.ytd-watch-metadata, .slim-video-information-title .yt-core-attributed-string:not(.cbCustomTitle)");if(t)return t.innerText;for(const t of e.children)if("#text"===t.nodeName&&t.nodeValue&&""!==t.nodeValue.trim())return t.nodeValue}return null}},7913:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorMessage=t.getFormattedTime=t.getFormattedTimeToSeconds=void 0,t.getFormattedTimeToSeconds=function(e){const t=/^(?:(?:(\d+):)?(\d+):)?(\d*(?:[.,]\d+)?)$/.exec(e);return null===t?null:3600*(t[1]?parseInt(t[1]):0)+60*(t[2]?parseInt(t[2]||"0"):0)+(t[3]?parseFloat(t[3].replace(",",".")):0)},t.getFormattedTime=function(e,t){e=Math.max(e,0);const n=Math.floor(e/60/60),r=Math.floor(e/60)%60;let o=String(r),i=e%60;t||(i=Math.floor(i));let a=String(t?i.toFixed(3):i);return i<10&&(a="0"+a),n&&r<10&&(o="0"+o),isNaN(n)||isNaN(r)?null:(n?n+":":"")+o+":"+a},t.getErrorMessage=function(e,t){const n=!t||t.includes("cf-wrapper")||t.includes("<!DOCTYPE html>")?"":"\n\n"+t;return[400,409,0].includes(e)?chrome.i18n.getMessage(e+"")+" "+chrome.i18n.getMessage("errorCode")+e+n:e>=500&&e<=599?(503==e&&(e=502),chrome.i18n.getMessage(e+"")+" "+chrome.i18n.getMessage("errorCode")+e+"\n\n"+chrome.i18n.getMessage("statusReminder")):chrome.i18n.getMessage("connectionError")+e+n}},3262:function(e,t){var n=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.getHash=void 0,t.getHash=function(e,t=5e3){return n(this,void 0,void 0,(function*(){if(t<=0)return"";if(!("subtle"in crypto))return new Promise(((n,r)=>chrome.runtime.sendMessage({message:"getHash",value:e,times:t},(e=>{e.error?r(e.error):n(e)}))));let n=e;for(let e=0;e<t;e++){const e=yield crypto.subtle.digest("SHA-256",(new TextEncoder).encode(n).buffer);n=Array.from(new Uint8Array(e)).map((e=>e.toString(16).padStart(2,"0"))).join("")}return n}))}},1108:function(e,t){var n=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.extensionUserAgent=t.isFirefoxOrSafari=t.timeoutPomise=t.PromiseTimeoutError=t.objectToURI=t.waitFor=void 0,t.waitFor=function(e,t=5e3,r=100,o){return n(this,void 0,void 0,(function*(){return yield new Promise(((n,i)=>{let a=null;const l=()=>{const t=e();(o?o(t):t)&&(n(t),a&&clearInterval(a))};t&&(setTimeout((()=>{clearInterval(a),i(`TIMEOUT waiting for ${null==e?void 0:e.toString()}: ${Error().stack}`)}),t),a=setInterval(l,r)),l()}))}))},t.objectToURI=function(e,t,n){let r=0;for(const o in t){const i=e.includes("?")||r>0?"&":n?"?":"",a="string"==typeof t[o]?t[o]:JSON.stringify(t[o]);e+=i+encodeURIComponent(o)+"="+encodeURIComponent(a),r++}return e};class r extends Error{constructor(e){super("Promise timed out"),this.promise=e}}let o;t.PromiseTimeoutError=r,t.timeoutPomise=function(e){return new Promise(((t,n)=>{e&&setTimeout((()=>{n(new r)}),e)}))},t.isFirefoxOrSafari=function(){return"undefined"!=typeof browser},t.extensionUserAgent=function(){return null!=o||(o=`${chrome.runtime.id}/v${chrome.runtime.getManifest().version}`),o}},3184:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.isMainMetadataFetcher=t.isLiveSync=t.isLiveOrUpcoming=t.getChannelIDSync=t.getChannelID=t.getPlaybackFormats=t.fetchVideoDataDesktopClient=t.fetchVideoDataAndroidClient=t.fetchVideoMetadata=t.setupMetadataOnRecieve=t.videoMetadataCache=void 0;const o=n(2146),i=n(2184),a=n(1740),l=n(6705);t.videoMetadataCache=new o.DataCache((()=>({playbackUrls:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null})));const s=[];let u=!1;t.setupMetadataOnRecieve=function(){const e=document.getElementById("sponsorblock-document-script");if(e){const t=e.getAttribute("claim-id");t&&t!==chrome.runtime.id||(u=!0,t||e.setAttribute("claim-id",chrome.runtime.id))}const n=e=>{var n,r;if("maze-utils:video-metadata-received"===(null===(n=e.data)||void 0===n?void 0:n.type)){const n=e.data;if(n.videoID&&n.metadata&&!t.videoMetadataCache.getFromCache(n.videoID)){const e=n.metadata,r=t.videoMetadataCache.setupCache(n.videoID);r.playbackUrls=e.playbackUrls,r.duration=e.duration,r.channelID=e.channelID,r.author=e.author,r.isLive=e.isLive,r.isUpcoming=e.isUpcoming;const o=s.findIndex((e=>e.videoID===n.videoID));-1!==o&&(s[o].callbacks.forEach((e=>{e(n.metadata)})),s.splice(o,1))}}else"maze-utils:video-metadata-requested"!==(null===(r=e.data)||void 0===r?void 0:r.type)||e.data.videoID in c||s.push({videoID:e.data.videoID,callbacks:[]})};window.addEventListener("message",n),(0,i.addCleanupListener)((()=>{window.removeEventListener("message",n)}))};const c={};function d(e,n,o=!1){var i;return r(this,void 0,void 0,(function*(){const u=t.videoMetadataCache.getFromCache(e);if(!n&&u&&null!==u.duration)return u;let d=s.find((t=>t.videoID===e));if(d||o)return new Promise((n=>{d||(d={videoID:e,callbacks:[]},s.push(d)),d.callbacks.push((r=>{t.videoMetadataCache.cacheUsed(e),n(r)}))}));try{const n=null!==(i=c[e])&&void 0!==i?i:(()=>r(this,void 0,void 0,(function*(){window.postMessage({type:"maze-utils:video-metadata-requested",videoID:e},"*");let n=yield f(e).catch((()=>null));if((0,l.onMobile)()||n&&(0!==n.formats.length||"LOGIN_REQUIRED"===n.playabilityStatus)||(n=yield f(e).catch((()=>null))),n){let r=n.formats;(0,a.isSafari)()&&(r=r.filter((e=>e.mimeType.includes("avc"))));const o=r.some((e=>e.mimeType.includes("vp9"))),i=r.reverse().filter((e=>e.width&&e.height&&(!o||e.mimeType.includes("vp9")))).sort(((e,t)=>(null==e?void 0:e.width)-(null==t?void 0:t.width))),l=t.videoMetadataCache.setupCache(e);return l.playbackUrls=i.map((e=>({url:e.url,width:e.width,height:e.height}))),l.duration=n.duration,l.channelID=n.channelID,l.author=n.author,l.isLive=n.isLive,l.isUpcoming=n.isUpcoming,setTimeout((()=>delete c[e]),500),window.postMessage({type:"maze-utils:video-metadata-received",videoID:e,metadata:l},"*"),l}return window.postMessage({type:"maze-utils:video-metadata-received",videoID:e,metadata:{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}},"*"),{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}})))();return c[e]=n,yield n}catch(e){}return{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}}))}function f(e){var t,n,o,i,a,l,s,u,c,d,f,p,h,m;return r(this,void 0,void 0,(function*(){const r={context:{client:{clientName:"WEB",clientVersion:"2.20230327.07.00"}},videoId:e};try{const g=yield fetch("https://www.youtube.com/youtubei/v1/player",{body:JSON.stringify(r),headers:{"Content-Type":"application/json"},method:"POST"});if(g.ok){const r=yield g.json();if((null!==(n=null===(t=null==r?void 0:r.videoDetails)||void 0===t?void 0:t.videoId)&&void 0!==n?n:null)!==e)return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null};const v=(null===(o=null==r?void 0:r.streamingData)||void 0===o?void 0:o.adaptiveFormats)||[],y=(null===(i=null==r?void 0:r.videoDetails)||void 0===i?void 0:i.lengthSeconds)?parseInt(r.videoDetails.lengthSeconds):null,b=null!==(l=null===(a=null==r?void 0:r.videoDetails)||void 0===a?void 0:a.channelId)&&void 0!==l?l:null,k=null!==(u=null===(s=null==r?void 0:r.videoDetails)||void 0===s?void 0:s.author)&&void 0!==u?u:null,w=null!==(d=null===(c=null==r?void 0:r.videoDetails)||void 0===c?void 0:c.isLive)&&void 0!==d?d:null;return{formats:v,duration:y,channelID:b,author:k,isLive:w,isUpcoming:null!==(p=null===(f=null==r?void 0:r.videoDetails)||void 0===f?void 0:f.isUpcoming)&&void 0!==p?p:null,playabilityStatus:null!==(m=null===(h=null==r?void 0:r.playabilityStatus)||void 0===h?void 0:h.status)&&void 0!==m?m:null}}}catch(e){}return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null}}))}t.fetchVideoMetadata=d,t.fetchVideoDataAndroidClient=function(e){var t,n,o,i,a,l,s,u,c,d,f,p,h,m;return r(this,void 0,void 0,(function*(){const r="17.31.35",g={context:{client:{clientName:"ANDROID",clientVersion:r,androidSdkVersion:31,osName:"Android",osVersion:"12",hl:"en",gl:"US"}},videoId:e,params:"8AEB",playbackContext:{contentPlaybackContext:{html5Preference:"HTML5_PREF_WANTS"}},contentCheckOk:!0,racyCheckOk:!0};try{const v=yield fetch("https://www.youtube.com/youtubei/v1/player?key=AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w",{body:JSON.stringify(g),headers:{"X-Youtube-Client-Name":"3","X-Youtube-Client-Version":r,"User-Agent":`com.google.android.youtube/${r} (Linux; U; Android 12) gzip`,"Content-Type":"application/json",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-us,en;q=0.5","Sec-Fetch-Mode":"navigate",Connection:"close"},method:"POST"});if(v.ok){const r=yield v.json();if((null!==(n=null===(t=null==r?void 0:r.videoDetails)||void 0===t?void 0:t.videoId)&&void 0!==n?n:null)!==e)return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null};const g=null===(o=null==r?void 0:r.streamingData)||void 0===o?void 0:o.adaptiveFormats,y=(null===(i=null==r?void 0:r.videoDetails)||void 0===i?void 0:i.lengthSeconds)?parseInt(r.videoDetails.lengthSeconds):null,b=null!==(l=null===(a=null==r?void 0:r.videoDetails)||void 0===a?void 0:a.channelId)&&void 0!==l?l:null,k=null!==(u=null===(s=null==r?void 0:r.videoDetails)||void 0===s?void 0:s.author)&&void 0!==u?u:null,w=null!==(d=null===(c=null==r?void 0:r.videoDetails)||void 0===c?void 0:c.isLive)&&void 0!==d?d:null,S=null!==(p=null===(f=null==r?void 0:r.videoDetails)||void 0===f?void 0:f.isUpcoming)&&void 0!==p?p:null,C=null!==(m=null===(h=null==r?void 0:r.playabilityStatus)||void 0===h?void 0:h.status)&&void 0!==m?m:null;if(g)return{formats:g,duration:y,channelID:b,author:k,isLive:w,isUpcoming:S,playabilityStatus:C}}}catch(e){}return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null}}))},t.fetchVideoDataDesktopClient=f,t.getPlaybackFormats=function(e,n,o,i=!1){var a,l,s;return r(this,void 0,void 0,(function*(){const r=yield d(e,i);if(n&&o){const i=null===(l=null===(a=null==r?void 0:r.playbackUrls)||void 0===a?void 0:a.find)||void 0===l?void 0:l.call(a,(e=>(null==e?void 0:e.width)>=n&&(null==e?void 0:e.height)>=o));if(i)return t.videoMetadataCache.cacheUsed(e),i}else if((null===(s=null==r?void 0:r.playbackUrls)||void 0===s?void 0:s.length)>0)return r[0];return null}))},t.getChannelID=function(e,t=!1){return r(this,void 0,void 0,(function*(){const n=yield d(e,!1,t);return n?{channelID:n.channelID,author:n.author}:{channelID:null,author:null}}))},t.getChannelIDSync=function(e){const n=t.videoMetadataCache.getFromCache(e);return n?{channelID:n.channelID,author:n.author}:null},t.isLiveOrUpcoming=function(e){return r(this,void 0,void 0,(function*(){const t=yield d(e,!1);return t?t.isLive||t.isUpcoming:null}))},t.isLiveSync=function(e){const n=t.videoMetadataCache.getFromCache(e);return n?n.isLive&&!n.isUpcoming:null},t.isMainMetadataFetcher=function(){return u}},6705:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.onVideoPage=t.onYouTubeCableTV=t.onMobile=void 0,t.onMobile=function(){return"m.youtube.com"===window.location.hostname},t.onYouTubeCableTV=function(){return"tv.youtube.com"===window.location.hostname},t.onVideoPage=function(){return!!document.URL.match(/\/watch|\/shorts|\/live|\/embed/)}},9249:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.injectScript=void 0;const r=n(9291),o=n(2303);t.injectScript=function(e){const t=document.createElement("script");t.id="sponsorblock-document-script",t.setAttribute("version",o.version),t.innerHTML=e;const n=document.head||document.documentElement,i=document.getElementById("sponsorblock-document-script"),a=null==i?void 0:i.getAttribute("version");!n||i&&!(0,r.versionHigher)(o.version,null!=a?a:"")||(i&&(t.setAttribute("teardown","true"),i.remove()),n.appendChild(t))}},3497:(e,t)=>{function n(e){const t=e.replace(/__MSG_(\w+)__/g,(function(e,t){return t?chrome.i18n.getMessage(t).replace(/</g,"&#60;").replace(/"/g,"&quot;").replace(/\n/g,"<br/>"):""}));return t!=e&&t}Object.defineProperty(t,"__esModule",{value:!0}),t.getLocalizedMessage=t.localizeHtmlPage=t.generateUserID=void 0,t.generateUserID=function(e=36){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let n="";const r="undefined"==typeof window?crypto:window.crypto;if(r&&r.getRandomValues){const o=new Uint32Array(e);r.getRandomValues(o);for(let r=0;r<e;r++)n+=t[o[r]%62];return n}for(let r=0;r<e;r++)n+=t[Math.floor(62*Math.random())];return n},t.localizeHtmlPage=function(){const e=n(document.title);e&&(document.title=e);const t=document.querySelector(".sponsorBlockPageBody"),r=n(t.innerHTML.toString());r&&(t.innerHTML=r)},t.getLocalizedMessage=n},4395:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getThumbnailSelectors=t.getThumbnailBoxSelectors=t.getThumbnailLink=t.getThumbnailImageSelectors=t.getThumbnailElementsToListenFor=t.getThumbnailElements=void 0;const r=n(6705);function o(){return(0,r.onMobile)()?[".media-item-thumbnail-container",".video-thumbnail-container-compact","ytm-thumbnail-cover",".video-thumbnail-container-vertical","ytm-hero-playlist-thumbnail-renderer"]:["ytd-thumbnail","ytd-playlist-thumbnail","ytm-shorts-lockup-view-model","yt-thumbnail-view-model"]}function i(...e){return 0===e.length&&(e=[""]),o().map((t=>e.map((e=>`${t}${e}`)).join(", "))).join(", ")}t.getThumbnailElements=o,t.getThumbnailElementsToListenFor=function(){const e=o();return(0,r.onMobile)()||(e.push("yt-lockup-view-model"),e.push("ytm-shorts-lockup-view-model-v2")),e},t.getThumbnailImageSelectors=function(){return(0,r.onMobile)()?"img.video-thumbnail-img, img.amsterdam-playlist-thumbnail":"ytd-thumbnail:not([hidden]) img, ytd-playlist-thumbnail yt-image:not(.blurred-image) img, yt-img-shadow.ytd-hero-playlist-thumbnail-renderer img, ytm-shorts-lockup-view-model img, .yt-thumbnail-view-model__image img"},t.getThumbnailLink=function(e){return(0,r.onMobile)()?e.querySelector(["a.media-item-thumbnail-container","ytm-channel-featured-video-renderer a","a.compact-media-item-image","a.reel-item-endpoint",".amsterdam-playlist-thumbnail-wrapper a"].join(", ")):e.querySelector(i(" a"))},t.getThumbnailBoxSelectors=function(){return(0,r.onMobile)()?".media-item-thumbnail-container":i(":not([hidden])",".ytd-hero-playlist-thumbnail-renderer")},t.getThumbnailSelectors=i},8343:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.updateAll=t.newThumbnails=t.setThumbnailListener=t.getThumbnailSelector=void 0;const r=n(1108),o=n(2184),i=n(6705),a=n(4395),l=n(3683),s=new Map;let u=0,c=null,d=(0,a.getThumbnailSelectors)(),f="div.thumbnail";function p(){return(0,l.isOnInvidious)()?f:d}t.getThumbnailSelector=p,t.setThumbnailListener=function(e,t,n,a,u){c=e,a&&(d=a),u&&(f=u);const p=()=>{null==t||t(),(0,r.waitFor)((()=>null!==(0,l.isOnInvidious)())).then((()=>{(0,l.isOnInvidious)()&&g()}))};if("complete"===document.readyState?p():window.addEventListener("load",p),(0,r.waitFor)((()=>n()),5e3,10).then((()=>{g()})),(0,i.onMobile)()){const e=()=>b();window.addEventListener("updateui",e),window.addEventListener("state-navigateend",e),(0,o.addCleanupListener)((()=>{window.removeEventListener("updateui",e),window.removeEventListener("state-navigateend",e)}))}(0,o.addCleanupListener)((()=>{for(const e of s)e[1].disconnect();s.clear()}))};let h=0,m=null;function g(){if(performance.now()-h<50||m)return m?void 0:void(m=setTimeout((()=>{m=null,g()}),50));h=performance.now();const e=s.keys(),t=document.querySelectorAll(p()),n=[];for(const e of t)if(!s.has(e)){n.push(e);const t=new MutationObserver((t=>{for(const n of t)if("attributes"===n.type&&"href"===n.attributeName){null==c||c([e]);break}}));s.set(e,t);const r=(0,a.getThumbnailLink)(e);r&&t.observe(r,{attributes:!0});const o=new MutationObserver((t=>{var n,r;for(const o of t)if("childList"===o.type&&(null===(n=o.addedNodes[0])||void 0===n?void 0:n.nodeName.toLowerCase().includes("shorts"))||(null===(r=o.previousSibling)||void 0===r?void 0:r.nodeName.toLowerCase().includes("shorts"))){null==c||c([e]);break}})),i=e.querySelector("#content");i&&o.observe(i,{childList:!0})}if(null==c||c(n),performance.now()-u>5e3){for(const t of e)if(document.body&&!document.body.contains(t)){const e=s.get(t);null==e||e.disconnect(),s.delete(t)}u=performance.now()}}t.newThumbnails=g,t.updateAll=function(){c&&c([...s.keys()])};const v=[100,200,300,400,500,750,1e3,1500,2500,5e3,1e4];let y=null;function b(e=0){if(e>=v.length)return;y&&clearTimeout(y);const t=v[e]-(e>0?v[e-1]:0);y=setTimeout((()=>{g(),b(e+1)}),t),g()}},9291:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.versionHigher=void 0,t.versionHigher=function(e,t){const n=e.split("."),r=t.split(".");if(n.length!==r.length)return!0;for(let e=0;e<n.length;e++){const t=parseInt(n[e]),o=parseInt(r[e]);if(t>o)return!0;if(t<o)return!1}return!1}},3683:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.isOnChannelPage=t.isCurrentTimeWrong=t.getIsInline=t.getLastNonInlineVideoID=t.getIsLivePremiere=t.setIsAdPlaying=t.getIsAdPlaying=t.getChannelIDInfo=t.getWaitingForChannelID=t.isOnYTTV=t.isOnYouTubeMusic=t.isOnMobileYouTube=t.isOnInvidious=t.setCurrentTime=t.verifyCurrentTime=t.getCurrentTime=t.getVideoDuration=t.getVideoID=t.getVideo=t.triggerVideoElementChange=t.waitForVideo=t.whitelistCheck=t.parseYouTubeVideoIDFromURL=t.getYouTubeVideoID=t.triggerVideoIDChange=t.checkVideoIDChange=t.checkIfNewVideoID=t.setupVideoModule=t.ChannelIDStatus=t.PageType=void 0;const o=n(1108),i=n(1740),a=n(4148),l=n(8343),s=n(2907),u=n(2184),c=n(9249),d=n(3184);var f,p;!function(e){e.Unknown="unknown",e.Shorts="shorts",e.Watch="watch",e.Search="search",e.Browse="browse",e.Channel="channel",e.Embed="embed"}(f=t.PageType||(t.PageType={})),function(e){e[e.Fetching=0]="Fetching",e[e.Found=1]="Found",e[e.Failed=2]="Failed"}(p=t.ChannelIDStatus||(t.ChannelIDStatus={}));const h="a.ytp-title-link[data-sessionlink='feature=player-title']:not(.cbCustomTitle)",m="ytd-channel-video-player-renderer a.ytp-title-link[data-sessionlink='feature=player-title']:not(.cbCustomTitle)";let g=null,v=null,y=null,b=null;const k=[];let w,S,C,E=!1,x=!1,T=null,_=null,L=!1,I=!1,P=!1,D=f.Unknown,M=!1,N=null,O=!1,A=0,F=!1,R={videoIDChange:()=>{},channelIDChange:()=>{},videoElementChange:()=>{},playerInit:()=>{},resetValues:()=>{},windowListenerHandler:()=>{},newVideosLoaded:()=>{},onNavigateToChannel:()=>{},documentScript:"",allowClipPage:!1};function U(e,t=!1){var n,i;return r(this,void 0,void 0,(function*(){return!(!e&&T&&(R.allowClipPage||!(null===(n=null===document||void 0===document?void 0:document.URL)||void 0===n?void 0:n.includes("youtube.com/clip/")))||(t&&e&&(setTimeout((()=>{G()}),200),setTimeout((()=>{G()}),1e3)),T!==e||!(0,a.isVisible)(g)&&g?((0,a.isVisible)(g)||G(),R.resetValues(),T=null,D=f.Unknown,S={status:p.Fetching,id:null,author:null},w=!1,O=!1,A=0,F=!1,x=!1,window.postMessage({source:"sb-reset-media-session-link",videoID:null},"/"),T=e,O=t,!e||(yield(0,o.waitFor)((()=>C().isReady()),5e3,1),B(e),R.videoIDChange(e),0)):(ne()&&T&&(null===(i=R.onNavigateToChannel)||void 0===i||i.call(R)),1)))}))}function z(e){return e||(e=null===document||void 0===document?void 0:document.URL),D===f.Channel?V(!0,f.Channel):!R.allowClipPage&&e.includes("youtube.com/clip/")?null:e.includes("/embed/")&&e.includes("youtube.com")?V(!1,f.Embed):!e.includes("youtube.com")||e.match(/\/watch|\/shorts\/|playlist|\/live\//)?j(e):ne()?V(!0,f.Channel):j(e)||V(!1)}function V(e=!0,t=f.Watch){var n,r;const o=t===f.Embed?document.querySelector(h):t===f.Channel?document.querySelector(m):null===(r=null===(n=null==g?void 0:g.parentElement)||void 0===n?void 0:n.parentElement)||void 0===r?void 0:r.querySelector(h),i=null==o?void 0:o.getAttribute("href");return i?(_=e,D=t,j(i)):null}function j(e){const t=q(e);return t.callLater?((0,o.waitFor)((()=>C().isReady())).then((()=>U(j(e)))),null):(_=t.onInvidious,L=t.onMobileYouTube,I=t.onYTTV,P=t.onYouTubeMusic,t.videoID)}function q(e){var t;e.startsWith("https://www.youtube.com/tv#/")&&(e=e.replace("#","")),e.startsWith("https://www.youtube.com/tv?")&&(e=e.replace(/\?[^#]+#/,""));let n=!1,r=!1,o=!1,i=!1,a=null;try{a=new URL(e)}catch(t){return console.error("[SB] Unable to parse URL: "+e),{videoID:null,onInvidious:n,onMobileYouTube:r,onYTTV:o,onYouTubeMusic:i,callLater:!1}}if(s.YT_DOMAINS.includes(a.host))"m.youtube.com"===a.host&&(r=!0),"tv.youtube.com"===a.host&&(o=!0),"music.youtube.com"===a.host&&(i=!0),n=!1;else{if(!C().isReady()||!(null===(t=C().config.invidiousInstances)||void 0===t?void 0:t.includes(a.hostname)))return{videoID:null,onInvidious:n,onMobileYouTube:r,onYTTV:o,onYouTubeMusic:i,callLater:!C().isReady()};n=!0}if(a.searchParams.has("v")&&["/watch","/watch/"].includes(a.pathname)||a.pathname.startsWith("/tv/watch")){const e=a.searchParams.get("v");return{videoID:11==(null==e?void 0:e.length)?e:null,onInvidious:n,onMobileYouTube:r,onYTTV:o,onYouTubeMusic:i,callLater:!1}}if(a.pathname.match(/^\/embed\/|^\/shorts\/|^\/live\//)||"tv.youtube.com"===a.host&&a.pathname.startsWith("/watch/"))try{const e=a.pathname.split("/")[2];if((null==e?void 0:e.length)>=11)return{videoID:e.slice(0,11),onInvidious:n,onMobileYouTube:r,onYTTV:o,onYouTubeMusic:i,callLater:!1}}catch(t){return console.error("[SB] Video ID not valid for "+e),{videoID:null,onInvidious:n,onMobileYouTube:r,onYTTV:o,onYouTubeMusic:i,callLater:!1}}return{videoID:null,onInvidious:n,onMobileYouTube:r,onYTTV:o,onYouTubeMusic:i,callLater:!1}}function B(e){var t,n,i,a,l,s,u,c,f,h,m;return r(this,void 0,void 0,(function*(){try{M=!0;const t=[(0,o.waitFor)((()=>S.status===p.Found),6e3,20),(0,d.getChannelID)(e,!(0,d.isMainMetadataFetcher)())];if(yield Promise.race(t),S.status!==p.Found){const t=(0,d.getChannelIDSync)(e);t&&(S={status:p.Found,id:t.channelID,author:t.author})}}catch(e){const r=null===(t=document.querySelector("#social-links yt-button-shape a"))||void 0===t?void 0:t.getAttribute("href");let o=null;r&&r.includes("/channel/")&&(o=null===(n=r.match(/\/channel\/(UC[a-zA-Z0-9_-]{22})/))||void 0===n?void 0:n[1]),null!=o||(o=null===(h=null===(f=null===(c=null!==(u=null!==(a=null!==(i=document.querySelector("a.ytd-video-owner-renderer"))&&void 0!==i?i:document.querySelector("a.ytp-title-channel-logo"))&&void 0!==a?a:null===(s=null===(l=document.querySelector(".channel-profile #channel-name"))||void 0===l?void 0:l.parentElement)||void 0===s?void 0:s.parentElement)&&void 0!==u?u:document.querySelector("a.slim-owner-icon-and-title"))||void 0===c?void 0:c.getAttribute("href"))||void 0===f?void 0:f.match(/\/(?:(?:channel|c|user|)\/|@)(UC[a-zA-Z0-9_-]{22}|[a-zA-Z0-9_-]+)/))||void 0===h?void 0:h[1]);const d=null===(m=document.querySelector("ytd-channel-name a.yt-formatted-string"))||void 0===m?void 0:m.innerText;S=o?{status:p.Found,id:o,author:d}:{status:p.Failed,id:null,author:null}}M=!1,R.channelIDChange(S)}))}t.setupVideoModule=function(e,t){R=e,C=t,(0,u.setupCleanupListener)(),function(){const e=()=>{(0,a.isVisible)(g)||G()};R.documentScript&&(0,c.injectScript)(R.documentScript),document.addEventListener("yt-navigate-finish",e);const t=()=>{var e;document.querySelector('meta[property="og:title"][content="Piped"]')&&(null===(e=R.playerInit)||void 0===e||e.call(R))};window.addEventListener("playerInit",t),window.addEventListener("message",X),(0,u.addCleanupListener)((()=>{document.removeEventListener("yt-navigate-finish",e),window.removeEventListener("playerInit",t),window.removeEventListener("message",X)})),(0,d.setupMetadataOnRecieve)()}(),(0,o.waitFor)((()=>C().isReady()),1e3,1).then((()=>U(z()))),s.YT_DOMAINS.includes(location.host)&&(document.URL.includes("/embed/")||"complete"===document.readyState&&ne())&&(0,a.waitForElement)(ne()?m:h).then((e=>(0,o.waitFor)((()=>e.getAttribute("href"))))).then((()=>U(z()))).catch((()=>{}));const n="navigation"in window;if(n){const e=e=>{U(z(e.destination.url))};window.navigation.addEventListener("navigate",e),(0,u.addCleanupListener)((()=>{window.navigation.removeEventListener("navigate",e)}))}(0,o.waitFor)((()=>null!==t().local)).then((()=>{t().local.navigationApiAvailable!==n&&(t().local.navigationApiAvailable=n,t().forceLocalUpdate("navigationApiAvailable"))})),K(),(0,u.addCleanupListener)((()=>{y&&(y.disconnect(),y=null)}))},t.checkIfNewVideoID=function(){return r(this,void 0,void 0,(function*(){const e=z();return e!==T&&(yield U(e))}))},t.checkVideoIDChange=function(){return r(this,void 0,void 0,(function*(){const e=z();return yield U(e)}))},t.triggerVideoIDChange=function(e){return r(this,void 0,void 0,(function*(){return yield U(e)}))},t.getYouTubeVideoID=z,t.parseYouTubeVideoIDFromURL=q,t.whitelistCheck=B;let $=0,H=null;function K(){if(!(_||null!==y&&(0,a.isVisible)(b.parentElement))){if(H&&clearTimeout(H),Date.now()-$<2e3)return void(H=setTimeout(K,Math.max(1e3,Date.now()-$)));$=Date.now();const e=(0,a.getElement)("#movie_player",!0);if(!e)return;const t=e.querySelector(".html5-video-container");if(!t)return;y&&y.disconnect(),y=new MutationObserver(G),b=t,y.observe(t,{attributes:!0,childList:!0,subtree:!0})}}const W=[];t.waitForVideo=function(){return g?Promise.resolve(g):new Promise((e=>{W.push(e)}))};let Y="",Q=!1;function G(){var e;return r(this,void 0,void 0,(function*(){if(E)return;(0,a.isVisible)(g)||J()||(g=null),E=!0;let t=(0,i.isSafari)()&&document.querySelector('video[vinegared="true"]')||(yield(0,a.waitForElement)("video",!0)),n=!1;if(document.querySelector(".miniplayer video")&&t){const e=[...document.querySelectorAll("video")].filter((e=>(0,a.isVisible)(e)));if(e.length>1){const r=t.duration,i=e.find((e=>!e.closest(".miniplayer")));i&&(t=i),isNaN(t.duration)&&(yield(0,o.waitFor)((()=>!!t.duration),5e3,50)),n=r!==t.duration}}if(E=!1,g===t&&v===t.style.width&&!n)return;g=t,v=t.style.width;const r=!k.includes(g);if(r&&k.push(g),null===(e=R.videoElementChange)||void 0===e||e.call(R,r,g),W.forEach((e=>e(t))),W.length=0,K(),document.URL.includes("/embed/")){if(Q)return;Q=!0;const e=(0,a.waitForElement)(h).then((e=>(0,o.waitFor)((()=>e),void 0,void 0,(e=>e.getAttribute("href")!==Y&&!!e.getAttribute("href")&&!!e.textContent))));e.catch((()=>Q=!1)),e.then((e=>Y=e.getAttribute("href"))).then((()=>Q=!1)).then((()=>U(z())))}else U(z())}))}function J(){return(0,i.isSafari)()&&!!document.querySelector('video[vinegared="true"]')}function X(e){var t,n,r,o;const i=e.data,a=i.type;"sponsorblock"!==i.source||!R.allowClipPage&&(null===(t=null===document||void 0===document?void 0:document.URL)||void 0===t?void 0:t.includes("youtube.com/clip/"))||("navigation"===a&&(0,l.newThumbnails)(),"navigation"===a&&i.videoID?(D=i.pageType,i.channelID&&(S={id:i.channelID,author:i.channelTitle,status:p.Found},M||B(i.videoID)),U(i.videoID)):"ad"===a?x!=i.playing&&(x=i.playing,null===(n=R.updatePlayerBar)||void 0===n||n.call(R)):"data"===a&&i.videoID?(i.isInline||(N=i.videoID),U(i.videoID,i.isInline),w=i.isLive||i.isPremiere):"newElement"===a?(0,l.newThumbnails)():"videoIDsLoaded"===a?null===(r=R.newVideosLoaded)||void 0===r||r.call(R,i.videoIDs):"adDuration"===a?A=i.duration:"currentTimeWrong"===a&&(F=!0,alert(`${chrome.i18n.getMessage("submissionFailedServerSideAds")}\n\nInclude the following:\n${i.playerTime}\n${i.expectedTime}`)),null===(o=R.windowListenerHandler)||void 0===o||o.call(R,e))}t.triggerVideoElementChange=function(e){var t;g=e,v=e.style.width;const n=!k.includes(g);n&&k.push(g),null===(t=R.videoElementChange)||void 0===t||t.call(R,n,g)};let Z=0;function ee(){return K(),(!(0,a.isVisible)(g)||L&&g&&isNaN(g.duration))&&Date.now()-Z>500&&(Z=Date.now(),(0,a.isVisible)(g)||J()||(g=null),G()),g}function te(){var e;const t=null===(e=ee())||void 0===e?void 0:e.currentTime;return t?t-A:t}function ne(){return!!document.URL.match(/@|\/c\/|\/channel\/|\/user\//)}t.getVideo=ee,t.getVideoID=function(){return T},t.getVideoDuration=function(){var e;return Math.max(0,(null!==(e=null==g?void 0:g.duration)&&void 0!==e?e:0)-A)},t.getCurrentTime=te,t.verifyCurrentTime=function(e){ee()&&ee().paused&&window.postMessage({source:"sb-verify-time",time:null!=e?e:te(),rawTime:ee().currentTime},"/")},t.setCurrentTime=function(e){ee()&&(ee().currentTime=e+A)},t.isOnInvidious=function(){return _},t.isOnMobileYouTube=function(){return L},t.isOnYouTubeMusic=function(){return P},t.isOnYTTV=function(){return I},t.getWaitingForChannelID=function(){return M},t.getChannelIDInfo=function(){return S},t.getIsAdPlaying=function(){return x},t.setIsAdPlaying=function(e){x=e},t.getIsLivePremiere=function(){return w},t.getLastNonInlineVideoID=function(){return N},t.getIsInline=function(){return O},t.isCurrentTimeWrong=function(){return F},t.isOnChannelPage=ne},8702:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AdvancedSkipOptionsComponent=void 0;const r=n(6540),o=n(8272),i=n(8856),a=n(6417),l=n(9209);let s=null;function u(e){return e&&Object.values(a.SkipRuleAttribute).includes(e)?e:null}function c(e){return e&&Object.values(a.SkipRuleOperator).includes(e)?e:null}function d(e){if(!e)return null;if(!e.startsWith('"')){const t=Number(e);return isNaN(t)?null:t}try{return JSON.parse(e)}catch(e){return null}}t.AdvancedSkipOptionsComponent=function(){const[e,t]=r.useState(!1),[n,f]=r.useState(function(e){let t="";for(const n of e){n.comment&&(t+="// "+n.comment+"\n"),t+="if ";let e=!0;for(const r of n.rules)e||(t+=" and "),t+=`${r.attribute} ${r.operator} ${JSON.stringify(r.value)}`,e=!1;switch(n.skipOption){case l.CategorySkipOption.Disabled:t+="\nDisabled";break;case l.CategorySkipOption.ShowOverlay:t+="\nShow Overlay";break;case l.CategorySkipOption.ManualSkip:t+="\nManual Skip";break;case l.CategorySkipOption.AutoSkip:t+="\nAuto Skip";break;default:return null}t+="\n\n"}return t.trim()}(i.default.local.skipRules)),[p,h]=r.useState(!0);return r.createElement("div",null,r.createElement("div",{className:"option-button",onClick:()=>{t(!e)}},chrome.i18n.getMessage("openAdvancedSkipOptions")),e&&r.createElement("div",{className:"advanced-skip-options-menu"},r.createElement("div",{className:"advanced-config-help-message"},r.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://wiki.sponsor.ajay.app/w/Advanced_Skip_Options"},chrome.i18n.getMessage("advancedSkipSettingsHelp")),r.createElement("span",{className:p?"hidden":"invalid-advanced-config"}," - ",chrome.i18n.getMessage("advancedSkipNotSaved"))),r.createElement("textarea",{className:"option-text-box "+(p?"":"invalid-advanced-config"),rows:10,style:{width:"80%"},value:n,spellCheck:!1,onChange:e=>{f(e.target.value);const t=function(e){const t=[];let n={rules:[],skipOption:null,comment:""};for(const r of e.split("\n")){if(0===r.trim().length)continue;const e=r.match(/^\s*\/\/(.+)$/);if(e){if(n.rules.length>0){if(!(null!==n.skipOption&&n.rules.length>0))return null;t.push(n),n={rules:[],skipOption:null,comment:""}}n.comment.length>0&&(n.comment+="; "),n.comment+=e[1].trim()}else if(r.startsWith("if ")){if(n.rules.length>0){if(!(null!==n.skipOption&&n.rules.length>0))return null;t.push(n),n={rules:[],skipOption:null,comment:""}}const e=[...r.matchAll(/\S+ \S+ (?:"[^"\\]*(?:\\.[^"\\]*)*"|\d+)(?= and |$)/g)];for(const t of e){if(!t[0])return null;const e=t[0].match(/(\S+) (\S+) ("[^"\\]*(?:\\.[^"\\]*)*"|\d+)/);if(4!==e.length)return null;const r=u(e[1]),i=c(e[2]),s=d(e[3]);if(null===r||null===i||null===s)return null;if([a.SkipRuleOperator.Equal,a.SkipRuleOperator.NotEqual].includes(i)){if(r===a.SkipRuleAttribute.Category&&!o.categoryList.includes(s))return null;if(r===a.SkipRuleAttribute.ActionType&&!l.ActionTypes.includes(s))return null;if(r===a.SkipRuleAttribute.Source&&!["local","youtube","autogenerated","server"].includes(s))return null}n.rules.push({attribute:r,operator:i,value:s})}if(0===e.length||!r.endsWith(e[e.length-1][0]))return null}else{if(0===n.rules.length)return null;switch(r.trim().toLowerCase()){case"disabled":n.skipOption=l.CategorySkipOption.Disabled;break;case"show overlay":n.skipOption=l.CategorySkipOption.ShowOverlay;break;case"manual skip":n.skipOption=l.CategorySkipOption.ManualSkip;break;case"auto skip":n.skipOption=l.CategorySkipOption.AutoSkip;break;default:return null}}}if(n.rules.length>0&&null!==n.skipOption)t.push(n);else if(n.rules.length>0||null!==n.skipOption)return null;return t}(e.target.value);h(!(!t||e.target.value.length>0&&0===t.length)),t&&(s&&clearTimeout(s),s=setTimeout((()=>{i.default.local.skipRules=t}),200))}})))}},1874:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(8272),i=n(840);class a extends r.Component{constructor(e){super(e),this.state={}}render(){return r.createElement("table",{id:"categoryChooserTable",className:"categoryChooserTable"},r.createElement("tbody",null,r.createElement("tr",{id:"CategoryOptionsRow",className:"categoryTableElement categoryTableHeader"},r.createElement("th",{id:"CategoryOptionName"},chrome.i18n.getMessage("category")),r.createElement("th",{id:"CategorySkipOption",className:"skipOption"},chrome.i18n.getMessage("skipOption")),r.createElement("th",{id:"CategoryColorOption",className:"colorOption"},chrome.i18n.getMessage("seekBarColor")),r.createElement("th",{id:"CategoryPreviewColorOption",className:"previewColorOption"},chrome.i18n.getMessage("previewColor"))),this.getCategorySkipOptions()))}getCategorySkipOptions(){const e=[];for(const t of o.categoryList)e.push(r.createElement(i.default,{category:t,key:t}));return e}}t.default=a},840:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(8856),i=n(8272),a=n(9209),l=n(1575),s=n(8536);class u extends r.Component{constructor(e){var t,n;super(e),this.state={color:e.defaultColor||(null===(t=o.default.config.barTypes[this.props.category])||void 0===t?void 0:t.color),previewColor:e.defaultPreviewColor||(null===(n=o.default.config.barTypes["preview-"+this.props.category])||void 0===n?void 0:n.color)}}render(){let e="disable";for(const t of o.default.config.categorySelections)if(t.name===this.props.category){switch(t.option){case a.CategorySkipOption.ShowOverlay:e="showOverlay";break;case a.CategorySkipOption.ManualSkip:e="manualSkip";break;case a.CategorySkipOption.AutoSkip:e="autoSkip"}break}return r.createElement(r.Fragment,null,r.createElement("tr",{id:this.props.category+"OptionsRow",className:"categoryTableElement"},r.createElement("td",{id:this.props.category+"OptionName",className:"categoryTableLabel"},chrome.i18n.getMessage("category_"+this.props.category)),r.createElement("td",{id:this.props.category+"SkipOption",className:"skipOption"},r.createElement("select",{className:"optionsSelector",defaultValue:e,onChange:this.skipOptionSelected.bind(this)},this.getCategorySkipOptions())),"chapter"!==this.props.category&&r.createElement("td",{id:this.props.category+"ColorOption",className:"colorOption"},r.createElement("input",{className:"categoryColorTextBox option-text-box",type:"color",onChange:e=>this.setColorState(e,!1),value:this.state.color})),!["chapter","exclusive_access"].includes(this.props.category)&&r.createElement("td",{id:this.props.category+"PreviewColorOption",className:"previewColorOption"},r.createElement("input",{className:"categoryColorTextBox option-text-box",type:"color",onChange:e=>this.setColorState(e,!0),value:this.state.previewColor}))),r.createElement("tr",{id:this.props.category+"DescriptionRow",className:"small-description categoryTableDescription"},r.createElement("td",{colSpan:2},chrome.i18n.getMessage("category_"+this.props.category+"_description")," ",r.createElement("a",{href:i.wikiLinks[this.props.category],target:"_blank",rel:"noreferrer"},`${chrome.i18n.getMessage("LearnMore")}`))),this.getExtraOptionComponents(this.props.category))}skipOptionSelected(e){let t;switch(e.target.value){case"disable":return void(o.default.config.categorySelections=o.default.config.categorySelections.filter((e=>e.name!==this.props.category)));case"showOverlay":t=a.CategorySkipOption.ShowOverlay;break;case"manualSkip":t=a.CategorySkipOption.ManualSkip;break;case"autoSkip":t=a.CategorySkipOption.AutoSkip,"filler"!==this.props.category||o.default.config.isVip||confirm(chrome.i18n.getMessage("FillerWarning"))||(e.target.value="disable")}const n=o.default.config.categorySelections.find((e=>e.name===this.props.category));n?n.option=t:o.default.config.categorySelections.push({name:this.props.category,option:t}),o.default.forceSyncUpdate("categorySelections")}getCategorySkipOptions(){const e=[];let t=["disable","showOverlay","manualSkip","autoSkip"];("chapter"===this.props.category||"exclusive_access"===this.props.category)&&(t=["disable","showOverlay"]);for(const n of t)e.push(r.createElement("option",{key:n,value:n},chrome.i18n.getMessage("disable"!==n?n+(0,l.getCategorySuffix)(this.props.category):n)));return e}setColorState(e,t){clearTimeout(this.setBarColorTimeout),t?(this.setState({previewColor:e.currentTarget.value}),o.default.config.barTypes["preview-"+this.props.category].color=e.currentTarget.value):(this.setState({color:e.currentTarget.value}),o.default.config.barTypes[this.props.category].color=e.currentTarget.value),this.setBarColorTimeout=setTimeout((()=>{o.default.config.barTypes=o.default.config.barTypes}),50)}getExtraOptionComponents(e){const t=[];for(const n of this.getExtraOptions(e))t.push(r.createElement("tr",{key:n.configKey},r.createElement("td",{id:`${e}_${n.configKey}`,className:"categoryExtraOptions"},r.createElement(s.default,{configKey:n.configKey,label:n.label,style:{width:"inherit"}}))));return t}getExtraOptions(e){switch(e){case"chapter":return[{configKey:"renderSegmentsAsChapters",label:chrome.i18n.getMessage("renderAsChapters"),dontDisable:!0},{configKey:"showSegmentNameInChapterBar",label:chrome.i18n.getMessage("showSegmentNameInChapterBar"),dontDisable:!0},{configKey:"showAutogeneratedChapters",label:chrome.i18n.getMessage("showAutogeneratedChapters"),dontDisable:!0}];case"music_offtopic":return[{configKey:"autoSkipOnMusicVideos",label:chrome.i18n.getMessage("autoSkipOnMusicVideos")},{configKey:"skipNonMusicOnlyOnYoutubeMusic",label:chrome.i18n.getMessage("skipNonMusicOnlyOnYoutubeMusic")}];default:return[]}}}t.default=u},3711:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(5338),i=n(8856),a=n(6891),l=n(1740);let s,u;class c extends r.Component{constructor(e){super(e),this.state={keybind:i.default.config[this.props.option]}}render(){var e,t,n,o,i,a,s;return r.createElement(r.Fragment,null,r.createElement("div",{className:"keybind-buttons inline",title:chrome.i18n.getMessage("change"),onClick:()=>this.openEditDialog()},(null===(e=this.state.keybind)||void 0===e?void 0:e.ctrl)&&r.createElement("div",{className:"key keyControl"},"Ctrl"),(null===(t=this.state.keybind)||void 0===t?void 0:t.ctrl)&&r.createElement("span",{className:"keyControl"},"+"),(null===(n=this.state.keybind)||void 0===n?void 0:n.alt)&&r.createElement("div",{className:"key keyAlt"},"Alt"),(null===(o=this.state.keybind)||void 0===o?void 0:o.alt)&&r.createElement("span",{className:"keyAlt"},"+"),(null===(i=this.state.keybind)||void 0===i?void 0:i.shift)&&r.createElement("div",{className:"key keyShift"},"Shift"),(null===(a=this.state.keybind)||void 0===a?void 0:a.shift)&&r.createElement("span",{className:"keyShift"},"+"),null!=(null===(s=this.state.keybind)||void 0===s?void 0:s.key)&&r.createElement("div",{className:"key keyBase"},(0,l.formatKey)(this.state.keybind.key)),null==this.state.keybind&&r.createElement("span",{className:"unbound"},chrome.i18n.getMessage("notSet"))),null!=this.state.keybind&&r.createElement("div",{className:"option-button trigger-button inline",onClick:()=>this.unbind()},chrome.i18n.getMessage("unbind")))}equals(e){return(0,l.keybindEquals)(this.state.keybind,e)}toString(){return(0,l.keybindToString)(this.state.keybind)}openEditDialog(){s=parent.document.createElement("div"),s.id="keybind-dialog",parent.document.body.prepend(s),u=(0,o.createRoot)(s),u.render(r.createElement(a.default,{option:this.props.option,closeListener:e=>this.closeEditDialog(e)}))}closeEditDialog(e){u.unmount(),s.remove(),null!=e&&this.setState({keybind:e})}unbind(){this.setState({keybind:null}),i.default.config[this.props.option]=null}}t.default=c},6891:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(8856),i=n(1740);class a extends r.Component{constructor(e){super(e),this.keybindKeyPressed=e=>{if(!(e.altKey||e.shiftKey||e.ctrlKey||e.metaKey||e.getModifierState("AltGraph"))){if("Escape"==e.code)return void this.props.closeListener(null);this.setState({key:{key:e.key,code:e.code,ctrl:this.state.key.ctrl,alt:this.state.key.alt,shift:this.state.key.shift}},(()=>this.setState({error:this.isKeybindAvailable()})))}},this.keybindModifierChecked=e=>{const t=e.target.id,n=e.target.checked;this.setState({key:{key:this.state.key.key,code:this.state.key.code,ctrl:"change-keybind-ctrl"==t?n:this.state.key.ctrl,alt:"change-keybind-alt"==t?n:this.state.key.alt,shift:"change-keybind-shift"==t?n:this.state.key.shift}},(()=>this.setState({error:this.isKeybindAvailable()})))},this.state={key:{key:null,code:null,ctrl:!1,alt:!1,shift:!1},error:{message:null,blocking:!1}}}render(){var e,t;return r.createElement(r.Fragment,null,r.createElement("div",{className:"blocker"}),r.createElement("div",{className:"dialog"},r.createElement("div",{id:"change-keybind-description"},chrome.i18n.getMessage("keybindDescription")),r.createElement("div",{id:"change-keybind-settings"},r.createElement("div",{id:"change-keybind-modifiers",className:"inline"},r.createElement("div",null,r.createElement("input",{id:"change-keybind-ctrl",type:"checkbox",onChange:this.keybindModifierChecked}),r.createElement("label",{htmlFor:"change-keybind-ctrl"},"Ctrl")),r.createElement("div",null,r.createElement("input",{id:"change-keybind-alt",type:"checkbox",onChange:this.keybindModifierChecked}),r.createElement("label",{htmlFor:"change-keybind-alt"},"Alt")),r.createElement("div",null,r.createElement("input",{id:"change-keybind-shift",type:"checkbox",onChange:this.keybindModifierChecked}),r.createElement("label",{htmlFor:"change-keybind-shift"},"Shift"))),r.createElement("div",{className:"key inline"},(0,i.formatKey)(this.state.key.key))),r.createElement("div",{id:"change-keybind-error"},null===(e=this.state.error)||void 0===e?void 0:e.message),r.createElement("div",{id:"change-keybind-buttons"},r.createElement("div",{className:"option-button save-button inline"+((null===(t=this.state.error)||void 0===t?void 0:t.blocking)||null==this.state.key.key?" disabled":""),onClick:()=>this.save()},chrome.i18n.getMessage("save")),r.createElement("div",{className:"option-button cancel-button inline",onClick:()=>this.props.closeListener(null)},chrome.i18n.getMessage("cancel")))))}componentDidMount(){parent.document.addEventListener("keydown",this.keybindKeyPressed),document.addEventListener("keydown",this.keybindKeyPressed)}componentWillUnmount(){parent.document.removeEventListener("keydown",this.keybindKeyPressed),document.removeEventListener("keydown",this.keybindKeyPressed)}isKeybindAvailable(){if(null==this.state.key.key)return null;let e;e=/[a-zA-Z0-9,.+\-\][:]/.test(this.state.key.key)?[{key:"k"},{key:"j"},{key:"l"},{key:"p",shift:!0},{key:"n",shift:!0},{key:","},{key:"."},{key:",",shift:!0},{key:".",shift:!0},{key:"ArrowRight"},{key:"ArrowLeft"},{key:"ArrowUp"},{key:"ArrowDown"},{key:"c"},{key:"o"},{key:"w"},{key:"+"},{key:"-"},{key:"f"},{key:"t"},{key:"i"},{key:"m"},{key:"a"},{key:"s"},{key:"d"},{key:"Home"},{key:"End"},{key:"0"},{key:"1"},{key:"2"},{key:"3"},{key:"4"},{key:"5"},{key:"6"},{key:"7"},{key:"8"},{key:"9"},{key:"]"},{key:"["}]:[{key:null,code:"KeyK"},{key:null,code:"KeyJ"},{key:null,code:"KeyL"},{key:null,code:"KeyP",shift:!0},{key:null,code:"KeyN",shift:!0},{key:null,code:"Comma"},{key:null,code:"Period"},{key:null,code:"Comma",shift:!0},{key:null,code:"Period",shift:!0},{key:null,code:"Space"},{key:null,code:"KeyC"},{key:null,code:"KeyO"},{key:null,code:"KeyW"},{key:null,code:"Equal"},{key:null,code:"Minus"},{key:null,code:"KeyF"},{key:null,code:"KeyT"},{key:null,code:"KeyI"},{key:null,code:"KeyM"},{key:null,code:"KeyA"},{key:null,code:"KeyS"},{key:null,code:"KeyD"},{key:null,code:"BracketLeft"},{key:null,code:"BracketRight"}];for(const t of e){const e=Object.assign({},t);if(/[0-9]/.test(this.state.key.key)||(e.shift=!0),this.equals(t)||this.equals(e))return{message:chrome.i18n.getMessage("youtubeKeybindWarning"),blocking:!1}}return"skipKeybind"!==this.props.option&&this.equals(o.default.config.skipKeybind)||"submitKeybind"!==this.props.option&&this.equals(o.default.config.submitKeybind)||"actuallySubmitKeybind"!==this.props.option&&this.equals(o.default.config.actuallySubmitKeybind)||"previewKeybind"!==this.props.option&&this.equals(o.default.config.previewKeybind)||"closeSkipNoticeKeybind"!==this.props.option&&this.equals(o.default.config.closeSkipNoticeKeybind)||"startSponsorKeybind"!==this.props.option&&this.equals(o.default.config.startSponsorKeybind)||"downvoteKeybind"!==this.props.option&&this.equals(o.default.config.downvoteKeybind)||"upvoteKeybind"!==this.props.option&&this.equals(o.default.config.upvoteKeybind)?{message:chrome.i18n.getMessage("keyAlreadyUsed"),blocking:!0}:null}equals(e){return(0,i.keybindEquals)(this.state.key,e)}save(){var e;null==this.state.key.key||(null===(e=this.state.error)||void 0===e?void 0:e.blocking)||(o.default.config[this.props.option]=this.state.key,this.props.closeListener(this.state.key))}}t.default=a},8536:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(8856);class i extends r.Component{constructor(e){super(e),this.state={enabled:o.default.config[e.configKey]}}render(){return r.createElement("div",{className:"sb-toggle-option "+(this.props.disabled?"disabled":"")},r.createElement("div",{className:"switch-container",style:this.props.style},r.createElement("label",{className:"switch"},r.createElement("input",{id:this.props.configKey,type:"checkbox",checked:this.state.enabled,disabled:this.props.disabled,onChange:e=>this.clicked(e)}),r.createElement("span",{className:"slider round"})),r.createElement("label",{className:"switch-label",htmlFor:this.props.configKey},this.props.label)))}clicked(e){o.default.config[this.props.configKey]=e.target.checked,this.setState({enabled:e.target.checked})}}t.default=i},4298:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(8856),i=n(5130);class a extends r.Component{constructor(e){super(e),this.state={}}render(){return 0==Object.keys(o.default.local.unsubmittedSegments).length?r.createElement(r.Fragment,null):r.createElement("table",{id:"unsubmittedVideosList",className:"categoryChooserTable",style:{marginTop:"10px"}},r.createElement("tbody",null,r.createElement("tr",{id:"UnsubmittedVideosListHeader",className:"categoryTableElement categoryTableHeader"},r.createElement("th",{id:"UnsubmittedVideoID"},chrome.i18n.getMessage("videoID")),r.createElement("th",{id:"UnsubmittedSegmentCount"},chrome.i18n.getMessage("segmentCount")),r.createElement("th",{id:"UnsubmittedVideoActions"},chrome.i18n.getMessage("actions"))),this.getUnsubmittedVideos()))}getUnsubmittedVideos(){const e=[];for(const t of Object.keys(o.default.local.unsubmittedSegments))e.push(r.createElement(i.default,{videoID:t,key:t}));return e}}t.default=a},5130:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(8856),i=n(7621);class a extends r.Component{constructor(e){super(e),this.state={}}render(){var e,t;const n=null!==(t=null===(e=o.default.local.unsubmittedSegments[this.props.videoID])||void 0===e?void 0:e.length)&&void 0!==t?t:0;return r.createElement(r.Fragment,null,r.createElement("tr",{id:this.props.videoID+"UnsubmittedSegmentsRow",className:"categoryTableElement"},r.createElement("td",{id:this.props.videoID+"UnsubmittedVideoID",className:"categoryTableLabel"},r.createElement("a",{href:`https://youtu.be/${this.props.videoID}`,target:"_blank",rel:"noreferrer"},this.props.videoID)),r.createElement("td",{id:this.props.videoID+"UnsubmittedSegmentCount"},n),r.createElement("td",{id:this.props.videoID+"UnsubmittedVideoActions"},r.createElement("div",{id:this.props.videoID+"ExportSegmentsAction",className:"option-button inline low-profile",onClick:this.exportSegments.bind(this)},chrome.i18n.getMessage("exportSegments"))," ",r.createElement("div",{id:this.props.videoID+"ExportSegmentsAsURLAction",className:"option-button inline low-profile",onClick:this.exportSegmentsAsURL.bind(this)},chrome.i18n.getMessage("exportSegmentsAsURL"))," ",r.createElement("div",{id:this.props.videoID+"ClearSegmentsAction",className:"option-button inline low-profile",onClick:this.clearSegments.bind(this)},chrome.i18n.getMessage("clearTimes")))))}clearSegments(){confirm(chrome.i18n.getMessage("clearThis"))&&(delete o.default.local.unsubmittedSegments[this.props.videoID],o.default.forceLocalUpdate("unsubmittedSegments"))}exportSegments(){this.copyToClipboard((0,i.exportTimes)(o.default.local.unsubmittedSegments[this.props.videoID]))}exportSegmentsAsURL(){this.copyToClipboard(`https://youtube.com/watch?v=${this.props.videoID}${(0,i.exportTimesAsHashParam)(o.default.local.unsubmittedSegments[this.props.videoID])}`)}copyToClipboard(e){navigator.clipboard.writeText(e).then((()=>{alert(chrome.i18n.getMessage("CopiedExclamation"))})).catch((()=>{alert(chrome.i18n.getMessage("copyDebugInformationFailed"))}))}}t.default=a},2415:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(8856),i=n(4298);class a extends r.Component{constructor(e){super(e),this.state={tableVisible:!1}}render(){const e=Object.keys(o.default.local.unsubmittedSegments).length,t=Object.values(o.default.local.unsubmittedSegments).reduce(((e,t)=>e+t.length),0);return r.createElement(r.Fragment,null,r.createElement("div",{style:{marginBottom:"10px"}},0==t?chrome.i18n.getMessage("unsubmittedSegmentCountsZero"):chrome.i18n.getMessage("unsubmittedSegmentCounts").replace("{0}",`${t} ${chrome.i18n.getMessage("unsubmittedSegments"+(1==t?"Singular":"Plural"))}`).replace("{1}",`${e} ${chrome.i18n.getMessage("videos"+(1==e?"Singular":"Plural"))}`)),e>0&&r.createElement("div",{className:"option-button inline",onClick:()=>this.setState({tableVisible:!this.state.tableVisible})},chrome.i18n.getMessage(this.state.tableVisible?"hideUnsubmittedSegments":"showUnsubmittedSegments"))," ",r.createElement("div",{className:"option-button inline",onClick:this.clearAllSegments},chrome.i18n.getMessage("clearUnsubmittedSegments")),this.state.tableVisible&&r.createElement(i.default,null))}clearAllSegments(){confirm(chrome.i18n.getMessage("clearUnsubmittedSegmentsConfirm"))&&(o.default.local.unsubmittedSegments={})}}t.default=a},8856:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.generateDebugDetails=void 0;const r=n(8272),o=n(5339),i=n(9209),a=n(1740);class l extends a.ProtoConfig{resetToDefault(){chrome.storage.sync.set(Object.assign(Object.assign({},this.syncDefaults),{userID:this.config.userID,minutesSaved:this.config.minutesSaved,skipCount:this.config.skipCount,sponsorTimesContributed:this.config.sponsorTimesContributed})),chrome.storage.local.set(Object.assign({},this.localDefaults))}}const s=new l({userID:null,isVip:!1,permissions:{},defaultCategory:"chooseACategory",renderSegmentsAsChapters:!1,whitelistedChannels:[],forceChannelCheck:!1,minutesSaved:0,skipCount:0,sponsorTimesContributed:0,submissionCountSinceCategories:0,showTimeWithSkips:!0,disableSkipping:!1,muteSegments:!0,fullVideoSegments:!0,fullVideoLabelsOnThumbnails:!0,manualSkipOnFullVideo:!1,trackViewCount:!0,trackViewCountInPrivate:!0,trackDownvotes:!0,trackDownvotesInPrivate:!1,dontShowNotice:!1,showUpcomingNotice:!1,noticeVisibilityMode:i.NoticeVisibilityMode.FadedForAutoSkip,hideVideoPlayerControls:!1,hideInfoButtonPlayerControls:!1,hideDeleteButtonPlayerControls:!1,hideUploadButtonPlayerControls:!1,hideSkipButtonPlayerControls:!1,hideDiscordLaunches:0,hideDiscordLink:!1,invidiousInstances:["invidious.snopyta.org"],supportInvidious:!1,serverAddress:r.serverAddress,minDuration:0,skipNoticeDuration:4,audioNotificationOnSkip:!1,checkForUnlistedVideos:!1,testingServer:!1,ytInfoPermissionGranted:!1,allowExpirements:!0,showDonationLink:!0,showPopupDonationCount:0,showUpsells:!0,showNewFeaturePopups:!0,donateClicked:0,autoHideInfoButton:!0,autoSkipOnMusicVideos:!1,skipNonMusicOnlyOnYoutubeMusic:!1,scrollToEditTimeUpdate:!1,categoryPillUpdate:!1,hookUpdate:!1,showChapterInfoMessage:!0,darkMode:!0,showCategoryGuidelines:!0,showCategoryWithoutPermission:!1,showSegmentNameInChapterBar:!0,showAutogeneratedChapters:!0,useVirtualTime:!0,showSegmentFailedToFetchWarning:!0,allowScrollingToEdit:!0,deArrowInstalled:!1,showDeArrowPromotion:!0,showDeArrowInSettings:!0,shownDeArrowPromotion:!1,showZoomToFillError2:!0,cleanPopup:!1,hideSegmentCreationInPopup:!1,categoryPillColors:{},skipKeybind:{key:"Enter"},skipToHighlightKeybind:{key:"Enter",ctrl:!0},startSponsorKeybind:{key:";"},submitKeybind:{key:"'"},actuallySubmitKeybind:{key:"'",ctrl:!0},previewKeybind:{key:";",ctrl:!0},nextChapterKeybind:{key:"ArrowRight",ctrl:!0},previousChapterKeybind:{key:"ArrowLeft",ctrl:!0},closeSkipNoticeKeybind:{key:"Backspace"},downvoteKeybind:{key:"h",shift:!0},upvoteKeybind:{key:"g",shift:!0},categorySelections:[{name:"sponsor",option:i.CategorySkipOption.AutoSkip},{name:"poi_highlight",option:i.CategorySkipOption.ManualSkip},{name:"exclusive_access",option:i.CategorySkipOption.ShowOverlay},{name:"chapter",option:i.CategorySkipOption.ShowOverlay}],payments:{licenseKey:null,lastCheck:0,lastFreeCheck:0,freeAccess:!1,chaptersAllowed:!1},colorPalette:{red:"#780303",white:"#ffffff",locked:"#ffc83d"},barTypes:{"preview-chooseACategory":{color:"#ffffff",opacity:"0.7"},sponsor:{color:"#00d400",opacity:"0.7"},"preview-sponsor":{color:"#007800",opacity:"0.7"},selfpromo:{color:"#ffff00",opacity:"0.7"},"preview-selfpromo":{color:"#bfbf35",opacity:"0.7"},exclusive_access:{color:"#008a5c",opacity:"0.7"},interaction:{color:"#cc00ff",opacity:"0.7"},"preview-interaction":{color:"#6c0087",opacity:"0.7"},intro:{color:"#00ffff",opacity:"0.7"},"preview-intro":{color:"#008080",opacity:"0.7"},outro:{color:"#0202ed",opacity:"0.7"},"preview-outro":{color:"#000070",opacity:"0.7"},preview:{color:"#008fd6",opacity:"0.7"},"preview-preview":{color:"#005799",opacity:"0.7"},hook:{color:"#395699",opacity:"0.8"},"preview-hook":{color:"#273963",opacity:"0.7"},music_offtopic:{color:"#ff9900",opacity:"0.7"},"preview-music_offtopic":{color:"#a6634a",opacity:"0.7"},poi_highlight:{color:"#ff1684",opacity:"0.7"},"preview-poi_highlight":{color:"#9b044c",opacity:"0.7"},filler:{color:"#7300FF",opacity:"0.9"},"preview-filler":{color:"#2E0066",opacity:"0.7"},chapter:{color:"#ffd983",opacity:"0"}}},{downvotedSegments:{},navigationApiAvailable:null,alreadyInstalled:!1,unsubmittedSegments:{},skipRules:[]},(function(e){if(e.changeChapterColor||(e.barTypes.chapter.color="#ffd983",e.changeChapterColor=!0,chrome.storage.sync.set({changeChapterColor:!0,barTypes:e.barTypes})),e.showZoomToFillError&&chrome.storage.sync.remove("showZoomToFillError"),e.unsubmittedSegments&&Object.keys(e.unsubmittedSegments).length>0&&chrome.storage.local.set({unsubmittedSegments:e.unsubmittedSegments},(()=>{chrome.storage.sync.remove("unsubmittedSegments")})),e.chapterCategoryAdded||(e.chapterCategoryAdded=!0,e.categorySelections.some((e=>"chapter"===e.name))||(e.categorySelections.push({name:"chapter",option:i.CategorySkipOption.ShowOverlay}),e.categorySelections=e.categorySelections)),void 0!==e.exclusive_accessCategoryAdded&&chrome.storage.sync.remove("exclusive_accessCategoryAdded"),void 0!==e.fillerUpdate&&chrome.storage.sync.remove("fillerUpdate"),void 0!==e.highlightCategoryAdded&&chrome.storage.sync.remove("highlightCategoryAdded"),void 0!==e.highlightCategoryUpdate&&chrome.storage.sync.remove("highlightCategoryUpdate"),e.askAboutUnlistedVideos&&chrome.storage.sync.remove("askAboutUnlistedVideos"),!e.autoSkipOnMusicVideosUpdate){e.autoSkipOnMusicVideosUpdate=!0;for(const t of e.categorySelections)if("music_offtopic"===t.name&&t.option===i.CategorySkipOption.AutoSkip){e.autoSkipOnMusicVideos=!0;break}}if(e.disableAutoSkip)for(const t of e.categorySelections)"sponsor"===t.name&&(t.option=i.CategorySkipOption.ManualSkip,chrome.storage.sync.remove("disableAutoSkip"));"string"==typeof e.skipKeybind&&(e.skipKeybind={key:e.skipKeybind}),"string"==typeof e.startSponsorKeybind&&(e.startSponsorKeybind={key:e.startSponsorKeybind}),"string"==typeof e.submitKeybind&&(e.submitKeybind={key:e.submitKeybind});const t=["skipKeybind","startSponsorKeybind","submitKeybind"];for(let n=t.length-1;n>=0;n--)for(let r=0;r<t.length;r++)n!=r&&(0,a.keybindEquals)(e[t[n]],e[t[r]])&&(e[t[n]]=null);void 0!==e.sponsorVideoID&&chrome.storage.sync.remove("sponsorVideoID"),void 0!==e.previousVideoID&&chrome.storage.sync.remove("previousVideoID"),!e.supportInvidious&&e.invidiousInstances.length<o.length&&(e.invidiousInstances=[...new Set([...o,...e.invidiousInstances])]),e.lastIsVipUpdate&&chrome.storage.sync.remove("lastIsVipUpdate")}));t.default=s,t.generateDebugDetails=function(){const e={debug:{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,extensionVersion:chrome.runtime.getManifest().version},config:JSON.parse(JSON.stringify(s.cachedSyncConfig))};return delete e.config.userID,e.config.serverAddress=e.config.serverAddress===r.serverAddress?"Default server address":"Custom server address",e.config.invidiousInstances=e.config.invidiousInstances.length,e.config.whitelistedChannels=e.config.whitelistedChannels.length,JSON.stringify(e,null,4)}},1070:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),i=n(5338),a=n(8856),l=n(5339);window.SB=a.default;const s=n(205),u=n(4192),c=n(2535),d=n(3711),f=n(997),p=n(3497),h=n(3262),m=n(1108),g=n(8249),v=n(6062),y=n(8616),b=new s.default;let k=!1;const w=[],S=[];function C(){return r(this,void 0,void 0,(function*(){if((0,p.localizeHtmlPage)(),""!=location.hash){const e=location.hash.slice(1);let t=document.querySelector(`[data-for='${e}']`);null==t&&(t=document.querySelector("[data-for='behavior']")),t.classList.add("selected")}else document.querySelector("[data-for='behavior']").classList.add("selected");if(document.getElementById("version").innerText="v. "+chrome.runtime.getManifest().version,"#embed"===window.location.hash){k=!0;for(const e of document.getElementsByClassName("titleBar"))e.classList.add("hidden");document.getElementById("options").classList.add("embed"),E()}a.default.configSyncListeners.includes(T)||a.default.configSyncListeners.push(T),a.default.configLocalListeners.includes(_)||a.default.configLocalListeners.push(_),yield b.wait((()=>null!==a.default.config)),a.default.config.darkMode||document.documentElement.setAttribute("data-theme","light");const e=document.getElementById("sbDonate");e.addEventListener("click",(()=>a.default.config.donateClicked=a.default.config.donateClicked+1)),(0,f.showDonationLink)()||e.classList.add("hidden"),a.default.config.showNewFeaturePopups&&a.default.config.showUpsells&&a.default.config.showDeArrowInSettings&&(0,g.isDeArrowInstalled)().then((e=>{if(!e){const e=document.getElementById("deArrowPromotion");e.classList.remove("hidden"),e.addEventListener("click",(()=>a.default.config.showDeArrowPromotion=!1)),e.querySelector(".close-button").addEventListener("click",(t=>{t.preventDefault(),e.classList.add("hidden"),a.default.config.showDeArrowPromotion=!1,a.default.config.showDeArrowInSettings=!1}))}})),document.querySelector('[data-sync="skipToHighlightKeybind"] .optionLabel').innerText=`${chrome.i18n.getMessage("skip_to_category").replace("{0}",chrome.i18n.getMessage("category_poi_highlight")).replace("?","")}:`;const t=document.getElementById("options"),n=t.querySelectorAll("*");for(let e=0;e<n.length;e++){const l=n[e].getAttribute("data-dependent-on"),s=t.querySelector(`[data-sync='${l}']`);let f=!1;if(s&&(f="reverse"===s.getAttribute("data-toggle-type")||"true"===n[e].getAttribute("data-dependent-on-inverted")),((yield x(n[e]))||s&&(f?a.default.config[l]:!a.default.config[l]))&&(n[e].classList.add("hidden","hiding"),!s)){if("true"===n[e].getAttribute("data-no-safari")&&"support-invidious"===n[e].id){const t=document.createElement("div");t.innerText=chrome.i18n.getMessage("invidiousDisabledSafari");const r=document.createElement("a");r.style.display="block";const o="https://bugs.webkit.org/show_bug.cgi?id=290508";r.href=o,r.innerText=o,t.appendChild(r),n[e].parentElement.insertBefore(t,n[e].nextSibling)}continue}const p=n[e].getAttribute("data-sync");switch(n[e].getAttribute("data-type")){case"toggle":{const o=a.default.config[p],i=n[e].querySelector("input"),l="reverse"===n[e].getAttribute("data-toggle-type"),s=n[e].getAttribute("data-confirm-message"),u="false"!==n[e].getAttribute("data-confirm-on");null!=o&&(i.checked=l?!o:o),"supportInvidious"===p&&P(i,p),i.addEventListener("click",(()=>r(this,void 0,void 0,(function*(){if(s&&(u&&i.checked||!u&&!i.checked)&&!confirm(chrome.i18n.getMessage(s)))return void(i.checked=!i.checked);switch(a.default.config[p]=l?!i.checked:i.checked,p){case"supportInvidious":D(i,p);break;case"disableAutoSkip":i.checked||(a.default.config.dontShowNotice=!1,document.querySelector("[data-sync='dontShowNotice'] > div > label > input").checked=!0);break;case"showDonationLink":i.checked?document.getElementById("sbDonate").classList.add("hidden"):document.getElementById("sbDonate").classList.remove("hidden");break;case"darkMode":i.checked?document.documentElement.setAttribute("data-theme","dark"):document.documentElement.setAttribute("data-theme","light");break;case"trackDownvotes":i.checked||(a.default.local.downvotedSegments={})}const e=t.querySelectorAll(`[data-dependent-on='${p}']`);for(let t=0;t<e.length;t++){const n="true"===e[t].getAttribute("data-dependent-on-inverted");!(yield x(e[t]))&&(!n&&i.checked||n&&!i.checked)?(e[t].classList.remove("hidden"),setTimeout((()=>e[t].classList.remove("hiding")),1)):(e[t].classList.add("hiding"),setTimeout((()=>e[t].classList.add("hidden")),400))}}))));break}case"text-change":{const t=n[e].querySelector(".option-text-box"),o=n[e].querySelector(".text-change-set");t.value=a.default.config[p],o.addEventListener("click",(()=>r(this,void 0,void 0,(function*(){switch(p){case"serverAddress":{const n=(e=(e=(e=t.value).trim()).replace(/\/+$/,"")).startsWith("https://")||e.startsWith("http://")?e:(alert(chrome.i18n.getMessage("customAddressError")),null);if(null===n)return;if(t.value=n,(0,m.isFirefoxOrSafari)()&&!(yield new Promise((e=>{chrome.permissions.request({origins:[t.value+"/"],permissions:[]},e)}))))return;break}}var e;a.default.config[p]=t.value})))),n[e].querySelector(".text-change-reset").addEventListener("click",(()=>{confirm(chrome.i18n.getMessage("areYouSureReset"))&&(a.default.config[p]=a.default.syncDefaults[p],t.value=a.default.config[p])}));break}case"private-text-change":{n[e].querySelector(".trigger-button").addEventListener("click",(()=>M(n[e]))),"*"==p&&(n[e].querySelector(".download-button").addEventListener("click",(()=>O(n[e]))),n[e].querySelector(".upload-button").addEventListener("change",(t=>A(t,n[e]))));const t=n[e].getAttribute("data-sync");"invidiousInstances"===t&&I(n[e],t);break}case"button-press":{const t=n[e].querySelector(".trigger-button"),r=n[e].getAttribute("data-confirm-message");t.addEventListener("click",(()=>{if(null===r||confirm(chrome.i18n.getMessage(r)))switch(n[e].getAttribute("data-sync")){case"copyDebugInformation":navigator.clipboard.writeText((0,a.generateDebugDetails)()).then((()=>{alert(chrome.i18n.getMessage("copyDebugInformationComplete"))})).catch((()=>{alert(chrome.i18n.getMessage("copyDebugInformationFailed"))}));break;case"resetToDefault":a.default.resetToDefault(),setTimeout((()=>window.location.reload()),200)}}));break}case"keybind-change":(0,i.createRoot)(n[e].querySelector("div")).render(o.createElement(d.default,{option:p}));break;case"display":L(n[e]);break;case"number-change":{const t=a.default.config[p],r=n[e].querySelector("input");isNaN(t)||t<0?r.value=a.default.syncDefaults[p]:r.value=t,r.addEventListener("input",(()=>{a.default.config[p]=r.value}));break}case"selector":{const t=a.default.config[p],r=n[e].querySelector(".selector-element");r.value=t,r.addEventListener("change",(()=>{let e=r.value;isNaN(Number(e))||(e=Number(e)),a.default.config[p]=e}));break}case"react-CategoryChooserComponent":w.push(new u.default(n[e]));break;case"react-AdvancedSkipOptionsComponent":new y.default(n[e]);break;case"react-UnsubmittedVideosComponent":S.push(new c.default(n[e]))}}const l=document.getElementsByClassName("tab-heading");for(let e=0;e<l.length;e++){const n=l[e].getAttribute("data-for");l[e].classList.contains("selected")&&document.getElementById(n).classList.remove("hidden"),l[e].addEventListener("click",(()=>{k||(location.hash=n),E(),document.querySelectorAll(".tab-heading").forEach((e=>{e.classList.remove("selected")})),t.querySelectorAll(".option-group").forEach((e=>{e.classList.add("hidden")})),l[e].classList.add("selected"),document.getElementById(n).classList.remove("hidden")}))}window.addEventListener("scroll",(()=>E())),t.classList.add("animated")}))}function E(){const e=document.getElementById("options-container"),t=document.getElementById("options");!k&&window.pageYOffset>90&&(window.innerHeight<=770||window.innerWidth<=1200)?e.classList.contains("sticky")||(t.style.marginTop=t.offsetTop.toString()+"px",e.classList.add("sticky")):(t.style.marginTop="unset",e.classList.remove("sticky"))}function x(e){return r(this,void 0,void 0,(function*(){return"true"===e.getAttribute("data-private-only")&&!(yield new Promise((e=>chrome.extension.isAllowedIncognitoAccess(e))))||"true"===e.getAttribute("data-no-safari")&&"Apple Computer, Inc."===navigator.vendor}))}function T(e){const t=document.getElementById("options").querySelectorAll("*");for(let e=0;e<t.length;e++)"display"===t[e].getAttribute("data-type")&&L(t[e]);if(e.categorySelections||e.payments)for(const e of w)e.update()}function _(e){if(e.unsubmittedSegments)for(const e of S)e.update()}function L(e){const t=e.getAttribute("data-sync"),n=a.default.config[t];switch(e.innerText=n,t){case"invidiousInstances":{e.innerText=n.join(", ");let t=n.length==l.length;for(let e=0;e<l.length&&t;e++)n[e]!=l[e]&&(t=!1);t||e.parentElement.querySelector(".invidious-instance-reset").classList.remove("hidden");break}}}function I(e,t){const n=e.querySelector(".option-text-box"),o=e.querySelector(".trigger-button"),i=e.querySelector(".text-change-set"),s=e.querySelector(".text-change-reset"),u=e.querySelector(".invidious-instance-reset");i.addEventListener("click",(function(){return r(this,void 0,void 0,(function*(){if(""==n.value||n.value.includes("/")||n.value.includes("http"))alert(chrome.i18n.getMessage("addInvidiousInstanceError"));else{let r=a.default.config[t];r||(r=[]);let i=n.value.trim().toLowerCase();i.includes(":")&&(i=i.split(":")[0]),r.push(i),a.default.config[t]=r;const l=document.querySelector("#support-invidious input");l.checked=!0,D(l,"supportInvidious"),u.classList.remove("hidden"),n.value="",e.querySelector(".option-hidden-section").classList.add("hidden"),o.classList.remove("disabled")}}))})),s.addEventListener("click",(function(){return r(this,void 0,void 0,(function*(){n.value="",e.querySelector(".option-hidden-section").classList.add("hidden"),o.classList.remove("disabled")}))})),u.addEventListener("click",(function(){confirm(chrome.i18n.getMessage("resetInvidiousInstanceAlert"))&&(a.default.config[t]=l,u.classList.add("hidden"))}))}function P(e,t){b.containsInvidiousPermission().then((n=>{n!=e.checked&&(a.default.config[t]=n,e.checked=n)}))}function D(e,t){return r(this,void 0,void 0,(function*(){const n=yield b.applyInvidiousPermissions(e.checked,t);e.checked=n}))}function M(e){const t=e.querySelector(".trigger-button");if(t.classList.contains("disabled"))return;t.classList.add("disabled");const n=e.querySelector(".option-text-box"),o=e.getAttribute("data-sync"),i=e.getAttribute("data-sync-type");if("invidiousInstances"===o)return void e.querySelector(".option-hidden-section").classList.remove("hidden");let l=a.default.config[o];"*"===o&&(l="local"===i?JSON.stringify(a.default.cachedLocalStorage):JSON.stringify(a.default.cachedSyncConfig)),n.value=l;const s=e.querySelector(".text-change-set");s.addEventListener("click",(()=>r(this,void 0,void 0,(function*(){N(o,e,n.value)})))),"userID"===o&&a.default.config[o]&&(0,v.asyncRequestToServer)("GET","/api/userInfo",{publicUserID:(0,h.getHash)(a.default.config[o]),values:["warnings","banned"]}).then((e=>{const t=JSON.parse(e.responseText);(t.warnings>0||t.banned)&&s.classList.add("hidden")})),e.querySelector(".option-hidden-section").classList.remove("hidden")}function N(e,t,n,o){return r(this,void 0,void 0,(function*(){const r=t.getAttribute("data-confirm-message"),i=t.getAttribute("data-sync-type");if(null===r||confirm(chrome.i18n.getMessage(r)))if("*"===e)try{const e=JSON.parse(n);for(const t in e)"local"===i?a.default.local[t]=e[t]:a.default.config[t]=e[t];if("local"!==i&&e.supportInvidious){const e=document.querySelector("#support-invidious > div > label > input");e.checked=!0,yield D(e,"supportInvidious")}setTimeout((()=>window.location.reload()),200)}catch(e){alert(chrome.i18n.getMessage("incorrectlyFormattedOptions"))}else a.default.config[e]=n;else"function"==typeof o&&o()}))}function O(e){const t=e.getAttribute("data-sync-type"),n=document.createElement("a"),r=JSON.parse(JSON.stringify("local"===t?a.default.cachedLocalStorage:a.default.cachedSyncConfig)),o=(new Date).toJSON().replace("T","_").replace(/:/g,".").replace(/.\d+Z/g,"");n.setAttribute("href",`data:text/json;charset=utf-8,${encodeURIComponent(JSON.stringify(r))}`),n.setAttribute("download",`SponsorBlock${"local"===t?"OtherData":"Config"}_${o}.json`),document.body.append(n),n.click(),n.remove()}function A(e,t){const n=e.target;if(1==n.files.length){const e=n.files[0],r=new FileReader;r.onload=function(e){N("*",t,e.target.result,(()=>{n.value=null}))},r.readAsText(e)}}"complete"===document.readyState?C():document.addEventListener("DOMContentLoaded",C)},8616:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(5338),i=n(8702);t.default=class{constructor(e){(0,o.createRoot)(e).render(r.createElement(i.AdvancedSkipOptionsComponent,null))}}},4192:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(5338),i=n(1874);t.default=class{constructor(e){this.ref=r.createRef(),(0,o.createRoot)(e).render(r.createElement(i.default,{ref:this.ref}))}update(){var e;null===(e=this.ref.current)||void 0===e||e.forceUpdate()}}},2535:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),o=n(5338),i=n(2415);t.default=class{constructor(e){this.ref=r.createRef(),(0,o.createRoot)(e).render(r.createElement(i.default,{ref:this.ref}))}update(){var e;null===(e=this.ref.current)||void 0===e||e.forceUpdate()}}},9209:(e,t)=>{var n,r,o,i,a,l;Object.defineProperty(t,"__esModule",{value:!0}),t.NoticeVisibilityMode=t.ChannelIDStatus=t.SponsorSourceType=t.ActionTypes=t.ActionType=t.SponsorHideType=t.CategorySkipOption=void 0,(l=t.CategorySkipOption||(t.CategorySkipOption={}))[l.Disabled=-1]="Disabled",l[l.ShowOverlay=0]="ShowOverlay",l[l.ManualSkip=1]="ManualSkip",l[l.AutoSkip=2]="AutoSkip",(a=t.SponsorHideType||(t.SponsorHideType={}))[a.Visible=void 0]="Visible",a[a.Downvoted=1]="Downvoted",a[a.MinimumDuration=2]="MinimumDuration",a[a.Hidden=3]="Hidden",function(e){e.Skip="skip",e.Mute="mute",e.Chapter="chapter",e.Full="full",e.Poi="poi"}(n=t.ActionType||(t.ActionType={})),t.ActionTypes=[n.Skip,n.Mute,n.Chapter,n.Full,n.Poi],(i=t.SponsorSourceType||(t.SponsorSourceType={}))[i.Server=void 0]="Server",i[i.Local=1]="Local",i[i.YouTube=2]="YouTube",i[i.Autogenerated=3]="Autogenerated",(o=t.ChannelIDStatus||(t.ChannelIDStatus={}))[o.Fetching=0]="Fetching",o[o.Found=1]="Found",o[o.Failed=2]="Failed",(r=t.NoticeVisibilityMode||(t.NoticeVisibilityMode={}))[r.FullSize=0]="FullSize",r[r.MiniForAutoSkip=1]="MiniForAutoSkip",r[r.MiniForAll=2]="MiniForAll",r[r.FadedForAutoSkip=3]="FadedForAutoSkip",r[r.FadedForAll=4]="FadedForAll"},205:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const o=n(8856),i=n(9209),a=n(3262),l=n(1108),s=n(4148),u=n(1740),c=n(6062);t.default=class{constructor(e=null){this.js=["./js/content.js"],this.css=["content.css","./libs/Source+Sans+Pro.css","popup.css","shared.css"],this.backgroundScriptContainer=e}wait(e,t=5e3,n=100){return r(this,void 0,void 0,(function*(){return(0,l.waitFor)(e,t,n)}))}containsPermission(e){return new Promise((t=>{chrome.permissions.contains(e,t)}))}setupExtraSitePermissions(e){const t=[];(0,u.isSafari)()&&t.push("webNavigation"),chrome.permissions.request({origins:this.getPermissionRegex(),permissions:t},(t=>r(this,void 0,void 0,(function*(){t?this.setupExtraSiteContentScripts():this.removeExtraSiteRegistration(),e(t)}))))}getExtraSiteRegistration(){return{message:"registerContentScript",id:"invidious",allFrames:!0,js:this.js,css:this.css,matches:this.getPermissionRegex()}}setupExtraSiteContentScripts(){const e=this.getExtraSiteRegistration();this.backgroundScriptContainer?this.backgroundScriptContainer.registerFirefoxContentScript(e):chrome.runtime.sendMessage(e)}removeExtraSiteRegistration(){const e="invidious";this.backgroundScriptContainer?this.backgroundScriptContainer.unregisterFirefoxContentScript(e):chrome.runtime.sendMessage({message:"unregisterContentScript",id:e}),chrome.permissions.remove({origins:this.getPermissionRegex()})}applyInvidiousPermissions(e,t="supportInvidious"){return new Promise((n=>{e?this.setupExtraSitePermissions((e=>{e||(o.default.config[t]=!1),n(e)})):(this.removeExtraSiteRegistration(),n(!1))}))}containsInvidiousPermission(){return new Promise((e=>{const t=[];(0,u.isSafari)()&&t.push("webNavigation"),chrome.permissions.contains({origins:this.getPermissionRegex(),permissions:t},(function(t){e(t)}))}))}getMergedTimestamps(e){let t=[];return e.forEach((e=>{const n=t.findIndex((t=>e[0]>=t[0]&&e[0]<=t[1])),r=t.findIndex((t=>e[1]>=t[0]&&e[1]<=t[1]));if(~n&&~r){if(n===r)return;const e=t.splice(Math.max(n,r),1)[0],o=t.splice(Math.min(n,r),1)[0];t.push([Math.min(e[0],o[0]),Math.max(e[1],o[1])])}else~n?t[n][1]=e[1]:~r?t[r][0]=e[0]:t.push(e.slice());t=t.filter((t=>!(t[0]>e[0]&&t[1]<e[1])))})),t}getTimestampsDuration(e){return this.getMergedTimestamps(e).reduce(((e,t)=>e+t[1]-t[0]),0)}getSponsorIndexFromUUID(e,t){for(let n=0;n<e.length;n++)if(e[n].UUID&&(e[n].UUID.startsWith(t)||t.startsWith(e[n].UUID)))return n;return-1}getSponsorTimeFromUUID(e,t){return e[this.getSponsorIndexFromUUID(e,t)]}getPermissionRegex(e=[]){const t=[];0===e.length&&(e=[...o.default.config.invidiousInstances]);for(const n of e)t.push("https://*."+n+"/*"),t.push("http://*."+n+"/*");return t}findReferenceNode(){var e,t;let n=(0,s.findValidElementFromSelector)(["#player-container-id","#movie_player",".html5-video-player","#c4-player","#player-container","#main-panel.ytmusic-player-page","#player-container .video-js",".main-video-section > .video-container",".shaka-video-container","#player-container.ytk-player","#id-tv-container"]);if(null==n){const r=document.getElementById("player");if(n=null==r?void 0:r.firstChild,n){let o=1;for(;o<r.children.length&&(!(null===(e=n.classList)||void 0===e?void 0:e.contains("html5-video-player"))||!(null===(t=n.classList)||void 0===t?void 0:t.contains("ytp-embed")));)n=r.children[o],o++}}return n}isContentScript(){return"http:"===window.location.protocol||"https:"===window.location.protocol}isHex(e){return Boolean(e.match(/^[0-9a-f]+$/i))}addHiddenSegment(e,t,n){return r(this,void 0,void 0,(function*(){if(chrome.extension.inIncognitoContext&&!o.default.config.trackDownvotesInPrivate||!o.default.config.trackDownvotes)return;if(t.length<60){const n=yield(0,c.asyncRequestToServer)("GET","/api/segmentID",{UUID:t,videoID:e});n.ok&&n.responseText&&(t=n.responseText)}const r=(yield(0,a.getHash)(e,1)).slice(0,4),l=yield(0,a.getHash)(t,1),s=o.default.local.downvotedSegments,u=s[r]||{segments:[],lastAccess:0};u.lastAccess=Date.now();const d=u.segments.find((e=>e.uuid===l));n===i.SponsorHideType.Visible?(u.segments.splice(u.segments.indexOf(d),1),0===u.segments.length&&delete s[r]):(d?d.hidden=n:u.segments.push({uuid:l,hidden:n}),s[r]=u);const f=Object.entries(s);if(f.length>1e4){let e=null;for(let t=0;t<f[0].length;t++)(null===e||f[t][1].lastAccess<e[1].lastAccess)&&(e=f[t]);delete s[e[0]]}o.default.forceLocalUpdate("downvotedSegments")}))}}},1575:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CATEGORY=t.shortCategoryName=t.getCategorySuffix=t.getVoteText=t.getUpcomingText=t.getSkippingText=void 0;const r=n(9209);t.getSkippingText=function(e,t){const n=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);if(t){let t="";switch(e[0].actionType){case r.ActionType.Chapter:case r.ActionType.Skip:t="skipped";break;case r.ActionType.Mute:t="muted";break;case r.ActionType.Poi:t="skipped_to_category"}return chrome.i18n.getMessage(t).replace("{0}",n)}{let t="";switch(e[0].actionType){case r.ActionType.Chapter:case r.ActionType.Skip:t="skip_category";break;case r.ActionType.Mute:t="mute_category";break;case r.ActionType.Poi:t="skip_to_category"}return chrome.i18n.getMessage(t).replace("{0}",n)}},t.getUpcomingText=function(e){const t=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);return chrome.i18n.getMessage("upcoming").replace("{0}",t)},t.getVoteText=function(e){const t=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);return chrome.i18n.getMessage("voted_on").replace("{0}",t)},t.getCategorySuffix=function(e){return e.startsWith("poi_")?"_POI":"exclusive_access"===e?"_full":"chapter"===e?"_chapter":""},t.shortCategoryName=function(e){return chrome.i18n.getMessage("category_"+e+"_short")||chrome.i18n.getMessage("category_"+e)},t.DEFAULT_CATEGORY="chooseACategory"},997:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.showDonationLink=void 0;const r=n(8856);t.showDonationLink=function(){return"Apple Computer, Inc."!==navigator.vendor&&r.default.config.showDonationLink}},8249:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getExtensionIdsToImportFrom=t.isDeArrowInstalled=void 0;const r=n(8272),o=n(8856),i=n(1740),a=n(1108);function l(){return(0,i.isSafari)()?r.extensionImportList.safari:(0,a.isFirefoxOrSafari)()?r.extensionImportList.firefox:r.extensionImportList.chromium}t.isDeArrowInstalled=function(){return o.default.config.deArrowInstalled?Promise.resolve(!0):new Promise((e=>{const t=l();let n=0;for(const r of t)chrome.runtime.sendMessage(r,{message:"isInstalled"},(r=>{if(chrome.runtime.lastError)return n++,void(n===t.length&&e(!1));e(r),r&&(o.default.config.deArrowInstalled=!0)}))}))},t.getExtensionIdsToImportFrom=l},7621:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.normalizeChapterName=t.exportTimesAsHashParam=t.importTimes=t.exportTimes=void 0;const r=n(9209),o=n(1575),i=n(8272),a=n(7913),l=n(3497),s="undefined"==typeof chrome,u=i.categoryList.filter((e=>"chapter"!==e)).map((e=>({code:e,names:s?[e]:[chrome.i18n.getMessage("category_"+e),(0,o.shortCategoryName)(e)]})));function c(e){const t=e.description||(0,o.shortCategoryName)(e.category);return`${(0,a.getFormattedTime)(e.segment[0],!0)}${e.segment[1]&&e.segment[0]!==e.segment[1]?` - ${(0,a.getFormattedTime)(e.segment[1],!0)}`:""} ${t}`}function d(e,t){let n=e;for(const r of t)r.condition&&!r.condition(e)||(n=n.replace(r.matcher,""));return n}t.exportTimes=function(e){let t="";for(const n of e)[r.ActionType.Full,r.ActionType.Mute].includes(n.actionType)||[r.SponsorSourceType.YouTube,r.SponsorSourceType.Autogenerated].includes(n.source)||(t+=c(n)+"\n");return t.replace(/\n$/,"")},t.importTimes=function(e,t){var n;const o=e.split("\n"),i=/(?:((?:\d+:)?\d+:\d+)+(?:\.\d+)?)|(?:\d+(?=s| second))/g,s=o.some((e=>i.test(e))),c=[];for(const e of o){const t=e.match(i);if(t){const o=(0,a.getFormattedTimeToSeconds)(t[0]);if(null!==o){const i=[{matcher:/^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:(\s]+$/g},{matcher:/[-:()\s]*$/g,condition:e=>!!e.match(/^\s*\(/)}],s=d(e.split(t[0])[0],i);let f=null;const p=e.split(t[1]||t[0]);f=d(p[p.length-1],i);const h=(null==s?void 0:s.length)>(null==f?void 0:f.length)?s:f,m=null===(n=u.find((e=>e.names.includes(h))))||void 0===n?void 0:n.code,g=h?null!=m?m:"chapter":"chooseACategory",v={segment:[o,(0,a.getFormattedTimeToSeconds)(t[1])],category:g,actionType:"chapter"===g?r.ActionType.Chapter:r.ActionType.Skip,description:"chapter"===g?h:null,source:r.SponsorSourceType.Local,UUID:(0,l.generateUserID)()};c.length>0&&null===c[c.length-1].segment[1]&&(c[c.length-1].segment[1]=v.segment[0]),c.push(v)}}else if(!s){const t={segment:[0,0],category:"chapter",actionType:r.ActionType.Chapter,description:e,source:r.SponsorSourceType.Local,UUID:(0,l.generateUserID)()};c.push(t)}}return c.length>0&&null===c[c.length-1].segment[1]&&(c[c.length-1].segment[1]=t),c},t.exportTimesAsHashParam=function(e){const t=e.map((e=>Object.assign({actionType:e.actionType,category:e.category,segment:e.segment},e.description?{description:e.description}:{})));return`#segments=${JSON.stringify(t)}`},t.normalizeChapterName=function(e){return e.toLowerCase().replace(/[.:'’`‛‘"‟”-]/gu,"").replace(/\s+/g," ")}},6062:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendRequestToServer=t.asyncRequestToServer=t.asyncRequestToCustomServer=void 0;const o=n(8856),i=n(8272),a=n(3531);function l(e,t,n={},r={}){return(0,a.sendRequestToCustomServer)(e,t,n,r)}t.asyncRequestToCustomServer=l,t.asyncRequestToServer=function(e,t,n={},a={}){return r(this,void 0,void 0,(function*(){const r=o.default.config.testingServer?i.testingServerAddress:o.default.config.serverAddress;return yield l(e,r+t,n,a)}))},t.sendRequestToServer=function(e,t,n){const r=o.default.config.testingServer?i.testingServerAddress:o.default.config.serverAddress;chrome.runtime.sendMessage({message:"sendRequest",type:e,url:r+t},(e=>{n(e)}))}},6417:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getCategoryDefaultSelection=t.getCategorySelection=t.SkipRuleOperator=t.SkipRuleAttribute=void 0;const r=n(8423),o=n(3683),i=n(8856),a=n(9209);var l,s;function u(e,t){const n=function(e,t){var n,i,s,u,c,d,f,p;switch(t.attribute){case l.StartTime:return null===(n=e.segment)||void 0===n?void 0:n[0];case l.EndTime:return null===(i=e.segment)||void 0===i?void 0:i[1];case l.Duration:return(null===(s=e.segment)||void 0===s?void 0:s[1])-(null===(u=e.segment)||void 0===u?void 0:u[0]);case l.StartTimePercent:{const t=null===(c=e.segment)||void 0===c?void 0:c[0];if(void 0===t)return;return t/(0,o.getVideoDuration)()*100}case l.EndTimePercent:{const t=null===(d=e.segment)||void 0===d?void 0:d[1];if(void 0===t)return;return t/(0,o.getVideoDuration)()*100}case l.DurationPercent:{const t=null===(f=e.segment)||void 0===f?void 0:f[0],n=null===(p=e.segment)||void 0===p?void 0:p[1];if(void 0===t||void 0===n)return;return(n-t)/(0,o.getVideoDuration)()*100}case l.Category:return e.category;case l.ActionType:return e.actionType;case l.Description:return e.description||"";case l.Source:switch(e.source){case a.SponsorSourceType.Local:return"local";case a.SponsorSourceType.YouTube:return"youtube";case a.SponsorSourceType.Autogenerated:return"autogenerated";case a.SponsorSourceType.Server:return"server";default:return}case l.ChannelID:return(0,o.getChannelIDInfo)(),(0,o.getChannelIDInfo)().id;case l.ChannelName:return(0,o.getChannelIDInfo)(),(0,o.getChannelIDInfo)().author;case l.VideoDuration:return(0,o.getVideoDuration)();case l.Title:return(0,r.getCurrentPageTitle)()||"";default:return}}(e,t);switch(t.operator){case s.Less:return"number"==typeof n&&n<t.value;case s.LessOrEqual:return"number"==typeof n&&n<=t.value;case s.Greater:return"number"==typeof n&&n>t.value;case s.GreaterOrEqual:return"number"==typeof n&&n>=t.value;case s.Equal:return n===t.value;case s.NotEqual:return n!==t.value;case s.Contains:return String(n).toLocaleLowerCase().includes(String(t.value).toLocaleLowerCase());case s.NotContains:return!String(n).toLocaleLowerCase().includes(String(t.value).toLocaleLowerCase());case s.Regex:return new RegExp(t.value).test(String(n));case s.RegexIgnoreCase:return new RegExp(t.value,"i").test(String(n));case s.NotRegex:return!new RegExp(t.value).test(String(n));case s.NotRegexIgnoreCase:return!new RegExp(t.value,"i").test(String(n));default:return!1}}!function(e){e.StartTime="time.start",e.EndTime="time.end",e.Duration="time.duration",e.StartTimePercent="time.startPercent",e.EndTimePercent="time.endPercent",e.DurationPercent="time.durationPercent",e.Category="category",e.ActionType="actionType",e.Description="chapter.name",e.Source="chapter.source",e.ChannelID="channel.id",e.ChannelName="channel.name",e.VideoDuration="video.duration",e.Title="video.title"}(l=t.SkipRuleAttribute||(t.SkipRuleAttribute={})),function(e){e.Less="<",e.LessOrEqual="<=",e.Greater=">",e.GreaterOrEqual=">=",e.Equal="==",e.NotEqual="!=",e.Contains="*=",e.NotContains="!*=",e.Regex="~=",e.RegexIgnoreCase="~i=",e.NotRegex="!~=",e.NotRegexIgnoreCase="!~i="}(s=t.SkipRuleOperator||(t.SkipRuleOperator={})),t.getCategorySelection=function(e){for(const t of i.default.local.skipRules)if(t.rules.every((t=>u(e,t))))return{name:e.category,option:t.skipOption};for(const t of i.default.config.categorySelections)if(t.name===e.category)return t;return{name:e.category,option:a.CategorySkipOption.Disabled}},t.getCategoryDefaultSelection=function(e){for(const t of i.default.config.categorySelections)if(t.name===e)return t;return{name:e,option:a.CategorySkipOption.Disabled}}},5339:e=>{e.exports=JSON.parse('["www.youtubekids.com","inv.nadeko.net","inv.tux.pizza","invidious.adminforge.de","invidious.jing.rocks","invidious.nerdvpn.de","invidious.perennialte.ch","invidious.privacyredirect.com","invidious.reallyaweso.me","invidious.yourdevice.ch","iv.ggtyler.dev","iv.nboeck.de","yewtu.be"]')},8272:e=>{e.exports=JSON.parse('{"serverAddress":"https://sponsor.ajay.app","testingServerAddress":"https://sponsor.ajay.app/test","serverAddressComment":"This specifies the default SponsorBlock server to connect to","categoryList":["sponsor","selfpromo","exclusive_access","interaction","poi_highlight","intro","outro","preview","hook","filler","chapter","music_offtopic"],"categorySupport":{"sponsor":["skip","mute","full"],"selfpromo":["skip","mute","full"],"exclusive_access":["full"],"interaction":["skip","mute"],"intro":["skip","mute"],"outro":["skip","mute"],"preview":["skip","mute"],"hook":["skip","mute"],"filler":["skip","mute"],"music_offtopic":["skip"],"poi_highlight":["poi"],"chapter":["chapter"]},"wikiLinks":{"sponsor":"https://wiki.sponsor.ajay.app/w/Sponsor","selfpromo":"https://wiki.sponsor.ajay.app/w/Unpaid/Self_Promotion","exclusive_access":"https://wiki.sponsor.ajay.app/w/Exclusive_Access","interaction":"https://wiki.sponsor.ajay.app/w/Interaction_Reminder_(Subscribe)","intro":"https://wiki.sponsor.ajay.app/w/Intermission/Intro_Animation","outro":"https://wiki.sponsor.ajay.app/w/Endcards/Credits","preview":"https://wiki.sponsor.ajay.app/w/Preview/Recap","hook":"https://wiki.sponsor.ajay.app/w/Hook/Greetings","filler":"https://wiki.sponsor.ajay.app/w/Tangents/Jokes","music_offtopic":"https://wiki.sponsor.ajay.app/w/Music:_Non-Music_Section","poi_highlight":"https://wiki.sponsor.ajay.app/w/Highlight","guidelines":"https://wiki.sponsor.ajay.app/w/Guidelines","mute":"https://wiki.sponsor.ajay.app/w/Mute_Segment","chapter":"https://wiki.sponsor.ajay.app/w/Chapter"},"extensionImportList":{"chromium":["enamippconapkdmgfgjchkhakpfinmaj"],"firefox":["deArrow@ajay.app","deArrowBETA@ajay.app"],"safari":["app.ajay.dearrow.extension"]}}')},2303:e=>{e.exports={version:"1.1.48"}}},t={};!function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}(1070)})(); +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/js/options.js.LICENSE.txt b/data/extensions/sponsorBlocker@ajay.app/js/options.js.LICENSE.txt @@ -0,0 +1,29 @@ +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/data/extensions/sponsorBlocker@ajay.app/js/permissions.js b/data/extensions/sponsorBlocker@ajay.app/js/permissions.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={3531:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendBinaryRequestToCustomServer=t.sendRequestToCustomServer=t.setupBackgroundRequestProxy=t.sendRealRequestToCustomServer=void 0;const i=o(1108),r=o(1740),s=o(3262);function a(e,t,o={},r={}){return n(this,void 0,void 0,(function*(){return"get"===e.toLowerCase()&&(t=(0,i.objectToURI)(t,o,!0),o=null),yield fetch(t,{method:e,headers:Object.assign({"Content-Type":"application/json"},r||{}),redirect:"follow",body:o?JSON.stringify(o):null})}))}t.sendRealRequestToCustomServer=a,t.setupBackgroundRequestProxy=function(){chrome.runtime.onMessage.addListener(((e,t,o)=>"sendRequest"===e.message?(a(e.type,e.url,e.data,e.headers).then((t=>n(this,void 0,void 0,(function*(){const n=e.binary?(0,i.isFirefoxOrSafari)()&&!(0,r.isSafari)()?yield t.blob():Array.from(new Uint8Array(yield t.arrayBuffer())):null;o({responseText:e.binary?"":yield t.text(),responseBinary:n,headers:e.returnHeaders&&t.headers?[...t.headers.entries()].reduce(((e,[t,o])=>(e[t]=o,e)),{}):null,status:t.status,ok:t.ok})})))).catch((()=>{o({responseText:"",responseBinary:null,headers:null,status:-1,ok:!1})})),!0):"getHash"===e.message&&((0,s.getHash)(e.value,e.times).then(o).catch((e=>{o({error:null==e?void 0:e.message})})),!0)))},t.sendRequestToCustomServer=function(e,t,o={},n={}){return new Promise(((i,r)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:o,headers:n},(e=>{-1!==e.status?i(e):r(e)}))}))},t.sendBinaryRequestToCustomServer=function(e,t,o={},n={}){return new Promise(((i,r)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:o,headers:n,binary:!0,returnHeaders:!0},(e=>{-1!==e.status?i(e):r(e)}))}))}},1740:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.keybindToString=t.formatKey=t.keybindEquals=t.isSafari=t.ProtoConfig=void 0;const i=o(1108);function r(){return"undefined"!=typeof navigator&&"Apple Computer, Inc."===navigator.vendor}function s(e){return null==e?"":" "==e?"Space":1==e.length?e.toUpperCase():e}t.ProtoConfig=class{constructor(e,t,o,n=!1){this.configLocalListeners=[],this.configSyncListeners=[],this.cachedSyncConfig=null,this.cachedLocalStorage=null,this.config=null,this.local=null,this.inDeArrow=!1,this.syncDefaults=e,this.localDefaults=t,this.inDeArrow=n,this.setupConfig(o).then((e=>{this.config=null==e?void 0:e.sync,this.local=null==e?void 0:e.local}))}configProxy(){chrome.storage.onChanged.addListener(((e,t)=>{if("sync"===t){for(const t in e)this.cachedSyncConfig[t]=e[t].newValue;for(const t of this.configSyncListeners)t(e)}else if("local"===t){for(const t in e)this.cachedLocalStorage[t]=e[t].newValue;for(const t of this.configLocalListeners)t(e)}}));let e=0;const t=new Set;let o=null;const n=this,i={set(i,r,s){if(n.cachedSyncConfig[r]=s,Date.now()-e<100){if(t.add(r),!o){const e=()=>{const e=[...t];t.clear(),chrome.storage.sync.set(e.map((e=>[e,n.cachedSyncConfig[e]])).reduce(((e,[t,o])=>(e[t]=o,e)),{})),o=null};o=setTimeout(e,20)}return!0}return chrome.storage.sync.set({[r]:s}),e=Date.now(),!0},get(e,t){const o=n.cachedSyncConfig[t];return e[t]||o},deleteProperty:(e,t)=>(chrome.storage.sync.remove(t),!0)},r={set:(e,t,o)=>(n.cachedLocalStorage[t]=o,chrome.storage.local.set({[t]:o}),!0),get(e,t){const o=n.cachedLocalStorage[t];return e[t]||o},deleteProperty:(e,t)=>(chrome.storage.local.remove(t),!0)};return{sync:new Proxy({handler:i},i),local:new Proxy({handler:r},r)}}forceSyncUpdate(e){const t=this.cachedSyncConfig[e];chrome.storage.sync.set({[e]:t})}forceLocalUpdate(e){const t=this.cachedLocalStorage[e];chrome.storage.local.set({[e]:t},(()=>{const t=chrome.runtime.lastError;t&&"navigationApiAvailable"!==e&&alert(`SponsorBlock/DeArrow: ${chrome.i18n.getMessage("storageFull")}\n\n${t}`)}))}fetchConfig(){return n(this,void 0,void 0,(function*(){yield Promise.all([new Promise((e=>{chrome.storage.sync.get(null,(t=>{this.cachedSyncConfig=t,void 0===this.cachedSyncConfig&&(this.cachedSyncConfig={},(this.inDeArrow||window.location.href.includes("options.html"))&&alert(`${chrome.i18n.getMessage("syncDisabledWarning")}${this.inDeArrow?`\n\n${chrome.i18n.getMessage("syncDisabledWarningDeArrow")}`:""}${(0,i.isFirefoxOrSafari)()&&!r()?`\n\n${chrome.i18n.getMessage("syncDisabledFirefoxSuggestions")}`:""}`)),e()}))})),new Promise((e=>{chrome.storage.local.get(null,(t=>{this.cachedLocalStorage=null!=t?t:{},e()}))}))])}))}setupConfig(e){return n(this,void 0,void 0,(function*(){if("undefined"==typeof chrome)return null;yield this.fetchConfig(),this.addDefaults();const t=this.configProxy();return e(t.sync),t}))}addDefaults(){for(const e in this.syncDefaults)if(Object.prototype.hasOwnProperty.call(this.cachedSyncConfig,e)){if("barTypes"===e)for(const t in this.syncDefaults[e])Object.prototype.hasOwnProperty.call(this.cachedSyncConfig[e],t)||(this.cachedSyncConfig[e][t]=this.syncDefaults[e][t])}else this.cachedSyncConfig[e]=this.syncDefaults[e];for(const e in this.localDefaults)Object.prototype.hasOwnProperty.call(this.cachedLocalStorage,e)||(this.cachedLocalStorage[e]=this.localDefaults[e])}isReady(){return null!==this.config}},t.isSafari=r,t.keybindEquals=function(e,t){return!(null==e||null==t||Boolean(e.alt)!=Boolean(t.alt)||Boolean(e.ctrl)!=Boolean(t.ctrl)||Boolean(e.shift)!=Boolean(t.shift)||null==e.key&&null==e.code||null==t.key&&null==t.code)&&(null!=e.code&&null!=t.code?e.code===t.code:null!=e.key&&null!=t.key&&e.key.toUpperCase()===t.key.toUpperCase())},t.formatKey=s,t.keybindToString=function(e){if(null==e||null==e.key)return"";let t="";return e.ctrl&&(t+="Ctrl + "),e.alt&&(t+="Alt + "),e.shift&&(t+="Shift + "),t+s(e.key)}},4148:function(e,t){var o=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};function n(e,t=!1){var o,n,i;if(!e)return!1;if("VIDEO"===e.tagName&&(e.classList.contains("html5-main-video")||"player"===e.id||"player_html5_api"===e.id)&&1===[...document.querySelectorAll("video")].filter((e=>e.duration)).length&&e.duration)return!0;if(0===e.offsetHeight||0===e.offsetWidth&&!t)return!1;const r=null==e?void 0:e.getBoundingClientRect(),s=document.elementFromPoint(r.left+r.width/2,r.top+r.height/2)||document.elementFromPoint(r.left,r.top);return!s&&"movie_player"===e.id&&r.top<0||!!(s===e||s&&e.contains(s)||s&&s.contains(e))||"VIDEO"===e.tagName&&(!!(null===(o=null==s?void 0:s.closest(".html5-video-player"))||void 0===o?void 0:o.contains(e))||!!(null===(i=null===(n=null==e?void 0:e.closest("#inline-preview-player"))||void 0===n?void 0:n.classList)||void 0===i?void 0:i.contains("playing-mode")))}function i(e,t=!1,o=!0){var i,r;return n(e,t)||o&&!!e&&(n(e.parentElement,t)||n(null!==(r=null===(i=e.parentElement)||void 0===i?void 0:i.parentElement)&&void 0!==r?r:null,t))}function r(e,t=!1,o=!1){return s(e,t,o)}function s(e,t=!1,o=!1,n){for(const r of e){const e=n?n(r):r;if(e&&i(e,t,o))return e}return null}function a(e,t){for(const o of e){const e=document.querySelector(o);if(e&&t(e))return e}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.getElement=t.waitForElement=t.findNonEmptyElement=t.findPredicatedElement=t.findValidElement=t.findValidElementFromSelector=t.isVisibleOrParent=t.isVisible=void 0,t.isVisible=n,t.isVisibleOrParent=i,t.findValidElementFromSelector=function(e,t=!1,o=!1){return s(e,t,o,(e=>document.querySelector(e)))},t.findValidElement=r,t.findPredicatedElement=a,t.findNonEmptyElement=function(e){return a(e,(e=>{var t,o;return(null!==(o=null===(t=e.textContent)||void 0===t?void 0:t.trim())&&void 0!==o?o:"").length>0}))};let c=!1,l=null,u=[];function d(){if(!l){const e=e=>{var t;const o=[];for(const n of u){const{selector:i,visibleCheck:s,ignoreWidth:a,checkParent:c,callbacks:l}=n;let u=!0;if(e){let t=!1;for(const o of e)if("childList"===o.type&&o.addedNodes.length>0){if(o.target instanceof HTMLElement&&(o.target.matches(i)||o.target.querySelector(i))){t=!0;break}for(const e of o.addedNodes)if(e instanceof HTMLElement&&(e.matches(i)||e.querySelector(i))){t=!0;break}if(t)break}t||(u=!1)}const d=u?document.querySelectorAll(i):n.elements;if(d&&d.length>0){n.elements=d;const e=s?r(d,a,c):d[0];if(e){if(null===(t=chrome.runtime)||void 0===t?void 0:t.id)for(const t of l)t(e);o.push(i)}}}u=u.filter((e=>!o.includes(e.selector))),0===u.length&&(null==l||l.disconnect(),l=null,c=!1)};e(),u.length>0&&(l=new MutationObserver(e),l.observe(document.documentElement,{childList:!0,subtree:!0}))}}function p(e,t,o=!1,n=!1){return t?r(document.querySelectorAll(e),o,n):document.querySelector(e)}t.waitForElement=function(e,t=!1,n=!1,i=!1){return o(this,void 0,void 0,(function*(){return yield new Promise((o=>{const r=p(e,t,n,i);if(r)return void o(r);const s=u.find((o=>o.selector===e&&o.visibleCheck===t));s?s.callbacks.push(o):u.push({selector:e,visibleCheck:t,ignoreWidth:n,checkParent:i,callbacks:[o]}),c||(c=!0,document.body?d():window.addEventListener("DOMContentLoaded",(()=>{d()})))}))}))},t.getElement=p},3262:function(e,t){var o=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.getHash=void 0,t.getHash=function(e,t=5e3){return o(this,void 0,void 0,(function*(){if(t<=0)return"";if(!("subtle"in crypto))return new Promise(((o,n)=>chrome.runtime.sendMessage({message:"getHash",value:e,times:t},(e=>{e.error?n(e.error):o(e)}))));let o=e;for(let e=0;e<t;e++){const e=yield crypto.subtle.digest("SHA-256",(new TextEncoder).encode(o).buffer);o=Array.from(new Uint8Array(e)).map((e=>e.toString(16).padStart(2,"0"))).join("")}return o}))}},1108:function(e,t){var o=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.extensionUserAgent=t.isFirefoxOrSafari=t.timeoutPomise=t.PromiseTimeoutError=t.objectToURI=t.waitFor=void 0,t.waitFor=function(e,t=5e3,n=100,i){return o(this,void 0,void 0,(function*(){return yield new Promise(((o,r)=>{let s=null;const a=()=>{const t=e();(i?i(t):t)&&(o(t),s&&clearInterval(s))};t&&(setTimeout((()=>{clearInterval(s),r(`TIMEOUT waiting for ${null==e?void 0:e.toString()}: ${Error().stack}`)}),t),s=setInterval(a,n)),a()}))}))},t.objectToURI=function(e,t,o){let n=0;for(const i in t){const r=e.includes("?")||n>0?"&":o?"?":"",s="string"==typeof t[i]?t[i]:JSON.stringify(t[i]);e+=r+encodeURIComponent(i)+"="+encodeURIComponent(s),n++}return e};class n extends Error{constructor(e){super("Promise timed out"),this.promise=e}}let i;t.PromiseTimeoutError=n,t.timeoutPomise=function(e){return new Promise(((t,o)=>{e&&setTimeout((()=>{o(new n)}),e)}))},t.isFirefoxOrSafari=function(){return"undefined"!=typeof browser},t.extensionUserAgent=function(){return null!=i||(i=`${chrome.runtime.id}/v${chrome.runtime.getManifest().version}`),i}},3497:(e,t)=>{function o(e){const t=e.replace(/__MSG_(\w+)__/g,(function(e,t){return t?chrome.i18n.getMessage(t).replace(/</g,"&#60;").replace(/"/g,"&quot;").replace(/\n/g,"<br/>"):""}));return t!=e&&t}Object.defineProperty(t,"__esModule",{value:!0}),t.getLocalizedMessage=t.localizeHtmlPage=t.generateUserID=void 0,t.generateUserID=function(e=36){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let o="";const n="undefined"==typeof window?crypto:window.crypto;if(n&&n.getRandomValues){const i=new Uint32Array(e);n.getRandomValues(i);for(let n=0;n<e;n++)o+=t[i[n]%62];return o}for(let n=0;n<e;n++)o+=t[Math.floor(62*Math.random())];return o},t.localizeHtmlPage=function(){const e=o(document.title);e&&(document.title=e);const t=document.querySelector(".sponsorBlockPageBody"),n=o(t.innerHTML.toString());n&&(t.innerHTML=n)},t.getLocalizedMessage=o},8856:(e,t,o)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.generateDebugDetails=void 0;const n=o(8272),i=o(5339),r=o(9209),s=o(1740);class a extends s.ProtoConfig{resetToDefault(){chrome.storage.sync.set(Object.assign(Object.assign({},this.syncDefaults),{userID:this.config.userID,minutesSaved:this.config.minutesSaved,skipCount:this.config.skipCount,sponsorTimesContributed:this.config.sponsorTimesContributed})),chrome.storage.local.set(Object.assign({},this.localDefaults))}}const c=new a({userID:null,isVip:!1,permissions:{},defaultCategory:"chooseACategory",renderSegmentsAsChapters:!1,whitelistedChannels:[],forceChannelCheck:!1,minutesSaved:0,skipCount:0,sponsorTimesContributed:0,submissionCountSinceCategories:0,showTimeWithSkips:!0,disableSkipping:!1,muteSegments:!0,fullVideoSegments:!0,fullVideoLabelsOnThumbnails:!0,manualSkipOnFullVideo:!1,trackViewCount:!0,trackViewCountInPrivate:!0,trackDownvotes:!0,trackDownvotesInPrivate:!1,dontShowNotice:!1,showUpcomingNotice:!1,noticeVisibilityMode:r.NoticeVisibilityMode.FadedForAutoSkip,hideVideoPlayerControls:!1,hideInfoButtonPlayerControls:!1,hideDeleteButtonPlayerControls:!1,hideUploadButtonPlayerControls:!1,hideSkipButtonPlayerControls:!1,hideDiscordLaunches:0,hideDiscordLink:!1,invidiousInstances:["invidious.snopyta.org"],supportInvidious:!1,serverAddress:n.serverAddress,minDuration:0,skipNoticeDuration:4,audioNotificationOnSkip:!1,checkForUnlistedVideos:!1,testingServer:!1,ytInfoPermissionGranted:!1,allowExpirements:!0,showDonationLink:!0,showPopupDonationCount:0,showUpsells:!0,showNewFeaturePopups:!0,donateClicked:0,autoHideInfoButton:!0,autoSkipOnMusicVideos:!1,skipNonMusicOnlyOnYoutubeMusic:!1,scrollToEditTimeUpdate:!1,categoryPillUpdate:!1,hookUpdate:!1,showChapterInfoMessage:!0,darkMode:!0,showCategoryGuidelines:!0,showCategoryWithoutPermission:!1,showSegmentNameInChapterBar:!0,showAutogeneratedChapters:!0,useVirtualTime:!0,showSegmentFailedToFetchWarning:!0,allowScrollingToEdit:!0,deArrowInstalled:!1,showDeArrowPromotion:!0,showDeArrowInSettings:!0,shownDeArrowPromotion:!1,showZoomToFillError2:!0,cleanPopup:!1,hideSegmentCreationInPopup:!1,categoryPillColors:{},skipKeybind:{key:"Enter"},skipToHighlightKeybind:{key:"Enter",ctrl:!0},startSponsorKeybind:{key:";"},submitKeybind:{key:"'"},actuallySubmitKeybind:{key:"'",ctrl:!0},previewKeybind:{key:";",ctrl:!0},nextChapterKeybind:{key:"ArrowRight",ctrl:!0},previousChapterKeybind:{key:"ArrowLeft",ctrl:!0},closeSkipNoticeKeybind:{key:"Backspace"},downvoteKeybind:{key:"h",shift:!0},upvoteKeybind:{key:"g",shift:!0},categorySelections:[{name:"sponsor",option:r.CategorySkipOption.AutoSkip},{name:"poi_highlight",option:r.CategorySkipOption.ManualSkip},{name:"exclusive_access",option:r.CategorySkipOption.ShowOverlay},{name:"chapter",option:r.CategorySkipOption.ShowOverlay}],payments:{licenseKey:null,lastCheck:0,lastFreeCheck:0,freeAccess:!1,chaptersAllowed:!1},colorPalette:{red:"#780303",white:"#ffffff",locked:"#ffc83d"},barTypes:{"preview-chooseACategory":{color:"#ffffff",opacity:"0.7"},sponsor:{color:"#00d400",opacity:"0.7"},"preview-sponsor":{color:"#007800",opacity:"0.7"},selfpromo:{color:"#ffff00",opacity:"0.7"},"preview-selfpromo":{color:"#bfbf35",opacity:"0.7"},exclusive_access:{color:"#008a5c",opacity:"0.7"},interaction:{color:"#cc00ff",opacity:"0.7"},"preview-interaction":{color:"#6c0087",opacity:"0.7"},intro:{color:"#00ffff",opacity:"0.7"},"preview-intro":{color:"#008080",opacity:"0.7"},outro:{color:"#0202ed",opacity:"0.7"},"preview-outro":{color:"#000070",opacity:"0.7"},preview:{color:"#008fd6",opacity:"0.7"},"preview-preview":{color:"#005799",opacity:"0.7"},hook:{color:"#395699",opacity:"0.8"},"preview-hook":{color:"#273963",opacity:"0.7"},music_offtopic:{color:"#ff9900",opacity:"0.7"},"preview-music_offtopic":{color:"#a6634a",opacity:"0.7"},poi_highlight:{color:"#ff1684",opacity:"0.7"},"preview-poi_highlight":{color:"#9b044c",opacity:"0.7"},filler:{color:"#7300FF",opacity:"0.9"},"preview-filler":{color:"#2E0066",opacity:"0.7"},chapter:{color:"#ffd983",opacity:"0"}}},{downvotedSegments:{},navigationApiAvailable:null,alreadyInstalled:!1,unsubmittedSegments:{},skipRules:[]},(function(e){if(e.changeChapterColor||(e.barTypes.chapter.color="#ffd983",e.changeChapterColor=!0,chrome.storage.sync.set({changeChapterColor:!0,barTypes:e.barTypes})),e.showZoomToFillError&&chrome.storage.sync.remove("showZoomToFillError"),e.unsubmittedSegments&&Object.keys(e.unsubmittedSegments).length>0&&chrome.storage.local.set({unsubmittedSegments:e.unsubmittedSegments},(()=>{chrome.storage.sync.remove("unsubmittedSegments")})),e.chapterCategoryAdded||(e.chapterCategoryAdded=!0,e.categorySelections.some((e=>"chapter"===e.name))||(e.categorySelections.push({name:"chapter",option:r.CategorySkipOption.ShowOverlay}),e.categorySelections=e.categorySelections)),void 0!==e.exclusive_accessCategoryAdded&&chrome.storage.sync.remove("exclusive_accessCategoryAdded"),void 0!==e.fillerUpdate&&chrome.storage.sync.remove("fillerUpdate"),void 0!==e.highlightCategoryAdded&&chrome.storage.sync.remove("highlightCategoryAdded"),void 0!==e.highlightCategoryUpdate&&chrome.storage.sync.remove("highlightCategoryUpdate"),e.askAboutUnlistedVideos&&chrome.storage.sync.remove("askAboutUnlistedVideos"),!e.autoSkipOnMusicVideosUpdate){e.autoSkipOnMusicVideosUpdate=!0;for(const t of e.categorySelections)if("music_offtopic"===t.name&&t.option===r.CategorySkipOption.AutoSkip){e.autoSkipOnMusicVideos=!0;break}}if(e.disableAutoSkip)for(const t of e.categorySelections)"sponsor"===t.name&&(t.option=r.CategorySkipOption.ManualSkip,chrome.storage.sync.remove("disableAutoSkip"));"string"==typeof e.skipKeybind&&(e.skipKeybind={key:e.skipKeybind}),"string"==typeof e.startSponsorKeybind&&(e.startSponsorKeybind={key:e.startSponsorKeybind}),"string"==typeof e.submitKeybind&&(e.submitKeybind={key:e.submitKeybind});const t=["skipKeybind","startSponsorKeybind","submitKeybind"];for(let o=t.length-1;o>=0;o--)for(let n=0;n<t.length;n++)o!=n&&(0,s.keybindEquals)(e[t[o]],e[t[n]])&&(e[t[o]]=null);void 0!==e.sponsorVideoID&&chrome.storage.sync.remove("sponsorVideoID"),void 0!==e.previousVideoID&&chrome.storage.sync.remove("previousVideoID"),!e.supportInvidious&&e.invidiousInstances.length<i.length&&(e.invidiousInstances=[...new Set([...i,...e.invidiousInstances])]),e.lastIsVipUpdate&&chrome.storage.sync.remove("lastIsVipUpdate")}));t.default=c,t.generateDebugDetails=function(){const e={debug:{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,extensionVersion:chrome.runtime.getManifest().version},config:JSON.parse(JSON.stringify(c.cachedSyncConfig))};return delete e.config.userID,e.config.serverAddress=e.config.serverAddress===n.serverAddress?"Default server address":"Custom server address",e.config.invidiousInstances=e.config.invidiousInstances.length,e.config.whitelistedChannels=e.config.whitelistedChannels.length,JSON.stringify(e,null,4)}},5004:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=o(8856),r=o(205),s=o(3497),a=new r.default;function c(){return n(this,void 0,void 0,(function*(){(0,s.localizeHtmlPage)(),document.getElementById("acceptPermissionButton").addEventListener("click",(()=>{a.applyInvidiousPermissions(i.default.config.supportInvidious).then((e=>{i.default.config.supportInvidious=e,e?(alert(chrome.i18n.getMessage("permissionRequestSuccess")),window.close()):alert(chrome.i18n.getMessage("permissionRequestFailed"))}))}))}))}i.default.config,"complete"===document.readyState?c():document.addEventListener("DOMContentLoaded",c)},9209:(e,t)=>{var o,n,i,r,s,a;Object.defineProperty(t,"__esModule",{value:!0}),t.NoticeVisibilityMode=t.ChannelIDStatus=t.SponsorSourceType=t.ActionTypes=t.ActionType=t.SponsorHideType=t.CategorySkipOption=void 0,(a=t.CategorySkipOption||(t.CategorySkipOption={}))[a.Disabled=-1]="Disabled",a[a.ShowOverlay=0]="ShowOverlay",a[a.ManualSkip=1]="ManualSkip",a[a.AutoSkip=2]="AutoSkip",(s=t.SponsorHideType||(t.SponsorHideType={}))[s.Visible=void 0]="Visible",s[s.Downvoted=1]="Downvoted",s[s.MinimumDuration=2]="MinimumDuration",s[s.Hidden=3]="Hidden",function(e){e.Skip="skip",e.Mute="mute",e.Chapter="chapter",e.Full="full",e.Poi="poi"}(o=t.ActionType||(t.ActionType={})),t.ActionTypes=[o.Skip,o.Mute,o.Chapter,o.Full,o.Poi],(r=t.SponsorSourceType||(t.SponsorSourceType={}))[r.Server=void 0]="Server",r[r.Local=1]="Local",r[r.YouTube=2]="YouTube",r[r.Autogenerated=3]="Autogenerated",(i=t.ChannelIDStatus||(t.ChannelIDStatus={}))[i.Fetching=0]="Fetching",i[i.Found=1]="Found",i[i.Failed=2]="Failed",(n=t.NoticeVisibilityMode||(t.NoticeVisibilityMode={}))[n.FullSize=0]="FullSize",n[n.MiniForAutoSkip=1]="MiniForAutoSkip",n[n.MiniForAll=2]="MiniForAll",n[n.FadedForAutoSkip=3]="FadedForAutoSkip",n[n.FadedForAll=4]="FadedForAll"},205:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=o(8856),r=o(9209),s=o(3262),a=o(1108),c=o(4148),l=o(1740),u=o(6062);t.default=class{constructor(e=null){this.js=["./js/content.js"],this.css=["content.css","./libs/Source+Sans+Pro.css","popup.css","shared.css"],this.backgroundScriptContainer=e}wait(e,t=5e3,o=100){return n(this,void 0,void 0,(function*(){return(0,a.waitFor)(e,t,o)}))}containsPermission(e){return new Promise((t=>{chrome.permissions.contains(e,t)}))}setupExtraSitePermissions(e){const t=[];(0,l.isSafari)()&&t.push("webNavigation"),chrome.permissions.request({origins:this.getPermissionRegex(),permissions:t},(t=>n(this,void 0,void 0,(function*(){t?this.setupExtraSiteContentScripts():this.removeExtraSiteRegistration(),e(t)}))))}getExtraSiteRegistration(){return{message:"registerContentScript",id:"invidious",allFrames:!0,js:this.js,css:this.css,matches:this.getPermissionRegex()}}setupExtraSiteContentScripts(){const e=this.getExtraSiteRegistration();this.backgroundScriptContainer?this.backgroundScriptContainer.registerFirefoxContentScript(e):chrome.runtime.sendMessage(e)}removeExtraSiteRegistration(){const e="invidious";this.backgroundScriptContainer?this.backgroundScriptContainer.unregisterFirefoxContentScript(e):chrome.runtime.sendMessage({message:"unregisterContentScript",id:e}),chrome.permissions.remove({origins:this.getPermissionRegex()})}applyInvidiousPermissions(e,t="supportInvidious"){return new Promise((o=>{e?this.setupExtraSitePermissions((e=>{e||(i.default.config[t]=!1),o(e)})):(this.removeExtraSiteRegistration(),o(!1))}))}containsInvidiousPermission(){return new Promise((e=>{const t=[];(0,l.isSafari)()&&t.push("webNavigation"),chrome.permissions.contains({origins:this.getPermissionRegex(),permissions:t},(function(t){e(t)}))}))}getMergedTimestamps(e){let t=[];return e.forEach((e=>{const o=t.findIndex((t=>e[0]>=t[0]&&e[0]<=t[1])),n=t.findIndex((t=>e[1]>=t[0]&&e[1]<=t[1]));if(~o&&~n){if(o===n)return;const e=t.splice(Math.max(o,n),1)[0],i=t.splice(Math.min(o,n),1)[0];t.push([Math.min(e[0],i[0]),Math.max(e[1],i[1])])}else~o?t[o][1]=e[1]:~n?t[n][0]=e[0]:t.push(e.slice());t=t.filter((t=>!(t[0]>e[0]&&t[1]<e[1])))})),t}getTimestampsDuration(e){return this.getMergedTimestamps(e).reduce(((e,t)=>e+t[1]-t[0]),0)}getSponsorIndexFromUUID(e,t){for(let o=0;o<e.length;o++)if(e[o].UUID&&(e[o].UUID.startsWith(t)||t.startsWith(e[o].UUID)))return o;return-1}getSponsorTimeFromUUID(e,t){return e[this.getSponsorIndexFromUUID(e,t)]}getPermissionRegex(e=[]){const t=[];0===e.length&&(e=[...i.default.config.invidiousInstances]);for(const o of e)t.push("https://*."+o+"/*"),t.push("http://*."+o+"/*");return t}findReferenceNode(){var e,t;let o=(0,c.findValidElementFromSelector)(["#player-container-id","#movie_player",".html5-video-player","#c4-player","#player-container","#main-panel.ytmusic-player-page","#player-container .video-js",".main-video-section > .video-container",".shaka-video-container","#player-container.ytk-player","#id-tv-container"]);if(null==o){const n=document.getElementById("player");if(o=null==n?void 0:n.firstChild,o){let i=1;for(;i<n.children.length&&(!(null===(e=o.classList)||void 0===e?void 0:e.contains("html5-video-player"))||!(null===(t=o.classList)||void 0===t?void 0:t.contains("ytp-embed")));)o=n.children[i],i++}}return o}isContentScript(){return"http:"===window.location.protocol||"https:"===window.location.protocol}isHex(e){return Boolean(e.match(/^[0-9a-f]+$/i))}addHiddenSegment(e,t,o){return n(this,void 0,void 0,(function*(){if(chrome.extension.inIncognitoContext&&!i.default.config.trackDownvotesInPrivate||!i.default.config.trackDownvotes)return;if(t.length<60){const o=yield(0,u.asyncRequestToServer)("GET","/api/segmentID",{UUID:t,videoID:e});o.ok&&o.responseText&&(t=o.responseText)}const n=(yield(0,s.getHash)(e,1)).slice(0,4),a=yield(0,s.getHash)(t,1),c=i.default.local.downvotedSegments,l=c[n]||{segments:[],lastAccess:0};l.lastAccess=Date.now();const d=l.segments.find((e=>e.uuid===a));o===r.SponsorHideType.Visible?(l.segments.splice(l.segments.indexOf(d),1),0===l.segments.length&&delete c[n]):(d?d.hidden=o:l.segments.push({uuid:a,hidden:o}),c[n]=l);const p=Object.entries(c);if(p.length>1e4){let e=null;for(let t=0;t<p[0].length;t++)(null===e||p[t][1].lastAccess<e[1].lastAccess)&&(e=p[t]);delete c[e[0]]}i.default.forceLocalUpdate("downvotedSegments")}))}}},6062:function(e,t,o){var n=this&&this.__awaiter||function(e,t,o,n){return new(o||(o=Promise))((function(i,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendRequestToServer=t.asyncRequestToServer=t.asyncRequestToCustomServer=void 0;const i=o(8856),r=o(8272),s=o(3531);function a(e,t,o={},n={}){return(0,s.sendRequestToCustomServer)(e,t,o,n)}t.asyncRequestToCustomServer=a,t.asyncRequestToServer=function(e,t,o={},s={}){return n(this,void 0,void 0,(function*(){const n=i.default.config.testingServer?r.testingServerAddress:i.default.config.serverAddress;return yield a(e,n+t,o,s)}))},t.sendRequestToServer=function(e,t,o){const n=i.default.config.testingServer?r.testingServerAddress:i.default.config.serverAddress;chrome.runtime.sendMessage({message:"sendRequest",type:e,url:n+t},(e=>{o(e)}))}},5339:e=>{e.exports=JSON.parse('["www.youtubekids.com","inv.nadeko.net","inv.tux.pizza","invidious.adminforge.de","invidious.jing.rocks","invidious.nerdvpn.de","invidious.perennialte.ch","invidious.privacyredirect.com","invidious.reallyaweso.me","invidious.yourdevice.ch","iv.ggtyler.dev","iv.nboeck.de","yewtu.be"]')},8272:e=>{e.exports=JSON.parse('{"serverAddress":"https://sponsor.ajay.app","testingServerAddress":"https://sponsor.ajay.app/test","serverAddressComment":"This specifies the default SponsorBlock server to connect to","categoryList":["sponsor","selfpromo","exclusive_access","interaction","poi_highlight","intro","outro","preview","hook","filler","chapter","music_offtopic"],"categorySupport":{"sponsor":["skip","mute","full"],"selfpromo":["skip","mute","full"],"exclusive_access":["full"],"interaction":["skip","mute"],"intro":["skip","mute"],"outro":["skip","mute"],"preview":["skip","mute"],"hook":["skip","mute"],"filler":["skip","mute"],"music_offtopic":["skip"],"poi_highlight":["poi"],"chapter":["chapter"]},"wikiLinks":{"sponsor":"https://wiki.sponsor.ajay.app/w/Sponsor","selfpromo":"https://wiki.sponsor.ajay.app/w/Unpaid/Self_Promotion","exclusive_access":"https://wiki.sponsor.ajay.app/w/Exclusive_Access","interaction":"https://wiki.sponsor.ajay.app/w/Interaction_Reminder_(Subscribe)","intro":"https://wiki.sponsor.ajay.app/w/Intermission/Intro_Animation","outro":"https://wiki.sponsor.ajay.app/w/Endcards/Credits","preview":"https://wiki.sponsor.ajay.app/w/Preview/Recap","hook":"https://wiki.sponsor.ajay.app/w/Hook/Greetings","filler":"https://wiki.sponsor.ajay.app/w/Tangents/Jokes","music_offtopic":"https://wiki.sponsor.ajay.app/w/Music:_Non-Music_Section","poi_highlight":"https://wiki.sponsor.ajay.app/w/Highlight","guidelines":"https://wiki.sponsor.ajay.app/w/Guidelines","mute":"https://wiki.sponsor.ajay.app/w/Mute_Segment","chapter":"https://wiki.sponsor.ajay.app/w/Chapter"},"extensionImportList":{"chromium":["enamippconapkdmgfgjchkhakpfinmaj"],"firefox":["deArrow@ajay.app","deArrowBETA@ajay.app"],"safari":["app.ajay.dearrow.extension"]}}')}},t={};!function o(n){var i=t[n];if(void 0!==i)return i.exports;var r=t[n]={exports:{}};return e[n].call(r.exports,r,r.exports,o),r.exports}(5004)})(); +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/js/popup.js b/data/extensions/sponsorBlocker@ajay.app/js/popup.js @@ -0,0 +1,2 @@ +/*! For license information please see popup.js.LICENSE.txt */ +(()=>{"use strict";var e={2551:(e,t,n)=>{var o=n(6540),r=n(9982);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var a=new Set,l={};function s(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(l[e]=t,e=0;e<t.length;e++)a.add(t[e])}var c=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p={},m={};function h(e,t,n,o,r,i,a){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=o,this.attributeNamespace=r,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=a}var g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function b(e,t,n,o){var r=g.hasOwnProperty(t)?g[t]:null;(null!==r?0!==r.type:o||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,o){if(null==t||function(e,t,n,o){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!o&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,o))return!0;if(o)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,r,o)&&(n=null),o||null===r?function(e){return!!d.call(m,e)||!d.call(p,e)&&(f.test(e)?m[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):r.mustUseProperty?e[r.propertyName]=null===n?3!==r.type&&"":n:(t=r.attributeName,o=r.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(r=r.type)||4===r&&!0===n?"":""+n,o?e.setAttributeNS(o,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);g[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);g[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);g[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,S=Symbol.for("react.element"),k=Symbol.for("react.portal"),C=Symbol.for("react.fragment"),E=Symbol.for("react.strict_mode"),T=Symbol.for("react.profiler"),x=Symbol.for("react.provider"),M=Symbol.for("react.context"),_=Symbol.for("react.forward_ref"),I=Symbol.for("react.suspense"),L=Symbol.for("react.suspense_list"),P=Symbol.for("react.memo"),N=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var D=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var F=Symbol.iterator;function U(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=F&&e[F]||e["@@iterator"])?e:null}var O,A=Object.assign;function R(e){if(void 0===O)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);O=t&&t[1]||""}return"\n"+O+e}var z=!1;function V(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(e){var o=e}Reflect.construct(e,[],t)}else{try{t.call()}catch(e){o=e}e.call(t.prototype)}else{try{throw Error()}catch(e){o=e}e()}}catch(t){if(t&&o&&"string"==typeof t.stack){for(var r=t.stack.split("\n"),i=o.stack.split("\n"),a=r.length-1,l=i.length-1;1<=a&&0<=l&&r[a]!==i[l];)l--;for(;1<=a&&0<=l;a--,l--)if(r[a]!==i[l]){if(1!==a||1!==l)do{if(a--,0>--l||r[a]!==i[l]){var s="\n"+r[a].replace(" at new "," at ");return e.displayName&&s.includes("<anonymous>")&&(s=s.replace("<anonymous>",e.displayName)),s}}while(1<=a&&0<=l);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?R(e):""}function j(e){switch(e.tag){case 5:return R(e.type);case 16:return R("Lazy");case 13:return R("Suspense");case 19:return R("SuspenseList");case 0:case 2:case 15:return V(e.type,!1);case 11:return V(e.type.render,!1);case 1:return V(e.type,!0);default:return""}}function B(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case C:return"Fragment";case k:return"Portal";case T:return"Profiler";case E:return"StrictMode";case I:return"Suspense";case L:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case M:return(e.displayName||"Context")+".Consumer";case x:return(e._context.displayName||"Context")+".Provider";case _:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case P:return null!==(t=e.displayName||null)?t:B(e.type)||"Memo";case N:t=e._payload,e=e._init;try{return B(e(t))}catch(e){}}return null}function H(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return B(t);case 8:return t===E?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function W(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function $(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function q(e){e._valueTracker||(e._valueTracker=function(e){var t=$(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var r=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(e){o=""+e,i.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return o},setValue:function(e){o=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Y(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),o="";return e&&(o=$(e)?e.checked?"true":"false":e.value),(e=o)!==n&&(t.setValue(e),!0)}function Q(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function K(e,t){var n=t.checked;return A({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function G(e,t){var n=null==t.defaultValue?"":t.defaultValue,o=null!=t.checked?t.checked:t.defaultChecked;n=W(null!=t.value?t.value:n),e._wrapperState={initialChecked:o,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function X(e,t){null!=(t=t.checked)&&b(e,"checked",t,!1)}function Z(e,t){X(e,t);var n=W(t.value),o=t.type;if(null!=n)"number"===o?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===o||"reset"===o)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,W(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!("submit"!==o&&"reset"!==o||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&Q(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,o){if(e=e.options,t){t={};for(var r=0;r<n.length;r++)t["$"+n[r]]=!0;for(n=0;n<e.length;n++)r=t.hasOwnProperty("$"+e[n].value),e[n].selected!==r&&(e[n].selected=r),r&&o&&(e[n].defaultSelected=!0)}else{for(n=""+W(n),t=null,r=0;r<e.length;r++){if(e[r].value===n)return e[r].selected=!0,void(o&&(e[r].defaultSelected=!0));null!==t||e[r].disabled||(t=e[r])}null!==t&&(t.selected=!0)}}function oe(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return A({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function re(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(te(n)){if(1<n.length)throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:W(n)}}function ie(e,t){var n=W(t.value),o=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=o&&(e.defaultValue=""+o)}function ae(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function le(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function se(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?le(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ue,ce,de=(ce=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ue=ue||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ue.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,o){MSApp.execUnsafeLocalFunction((function(){return ce(e,t)}))}:ce);function fe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=["Webkit","ms","Moz","O"];function he(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||pe.hasOwnProperty(e)&&pe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var o=0===n.indexOf("--"),r=he(n,t[n],o);"float"===n&&(n="cssFloat"),o?e.setProperty(n,r):e[n]=r}}Object.keys(pe).forEach((function(e){me.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var ve=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ye(e,t){if(t){if(ve[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function be(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var we=null;function Se(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var ke=null,Ce=null,Ee=null;function Te(e){if(e=wr(e)){if("function"!=typeof ke)throw Error(i(280));var t=e.stateNode;t&&(t=kr(t),ke(e.stateNode,e.type,t))}}function xe(e){Ce?Ee?Ee.push(e):Ee=[e]:Ce=e}function Me(){if(Ce){var e=Ce,t=Ee;if(Ee=Ce=null,Te(e),t)for(e=0;e<t.length;e++)Te(t[e])}}function _e(e,t){return e(t)}function Ie(){}var Le=!1;function Pe(e,t,n){if(Le)return e(t,n);Le=!0;try{return _e(e,t,n)}finally{Le=!1,(null!==Ce||null!==Ee)&&(Ie(),Me())}}function Ne(e,t){var n=e.stateNode;if(null===n)return null;var o=kr(n);if(null===o)return null;n=o[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(o=!o.disabled)||(o=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!o;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var De=!1;if(c)try{var Fe={};Object.defineProperty(Fe,"passive",{get:function(){De=!0}}),window.addEventListener("test",Fe,Fe),window.removeEventListener("test",Fe,Fe)}catch(ce){De=!1}function Ue(e,t,n,o,r,i,a,l,s){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(e){this.onError(e)}}var Oe=!1,Ae=null,Re=!1,ze=null,Ve={onError:function(e){Oe=!0,Ae=e}};function je(e,t,n,o,r,i,a,l,s){Oe=!1,Ae=null,Ue.apply(Ve,arguments)}function Be(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function He(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==(e=e.alternate)&&(t=e.memoizedState),null!==t)return t.dehydrated}return null}function We(e){if(Be(e)!==e)throw Error(i(188))}function $e(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=Be(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,o=t;;){var r=n.return;if(null===r)break;var a=r.alternate;if(null===a){if(null!==(o=r.return)){n=o;continue}break}if(r.child===a.child){for(a=r.child;a;){if(a===n)return We(r),e;if(a===o)return We(r),t;a=a.sibling}throw Error(i(188))}if(n.return!==o.return)n=r,o=a;else{for(var l=!1,s=r.child;s;){if(s===n){l=!0,n=r,o=a;break}if(s===o){l=!0,o=r,n=a;break}s=s.sibling}if(!l){for(s=a.child;s;){if(s===n){l=!0,n=a,o=r;break}if(s===o){l=!0,o=a,n=r;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==o)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e))?qe(e):null}function qe(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=qe(e);if(null!==t)return t;e=e.sibling}return null}var Ye=r.unstable_scheduleCallback,Qe=r.unstable_cancelCallback,Ke=r.unstable_shouldYield,Ge=r.unstable_requestPaint,Xe=r.unstable_now,Ze=r.unstable_getCurrentPriorityLevel,Je=r.unstable_ImmediatePriority,et=r.unstable_UserBlockingPriority,tt=r.unstable_NormalPriority,nt=r.unstable_LowPriority,ot=r.unstable_IdlePriority,rt=null,it=null,at=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(lt(e)/st|0)|0},lt=Math.log,st=Math.LN2,ut=64,ct=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var o=0,r=e.suspendedLanes,i=e.pingedLanes,a=268435455&n;if(0!==a){var l=a&~r;0!==l?o=dt(l):0!=(i&=a)&&(o=dt(i))}else 0!=(a=n&~r)?o=dt(a):0!==i&&(o=dt(i));if(0===o)return 0;if(0!==t&&t!==o&&!(t&r)&&((r=o&-o)>=(i=t&-t)||16===r&&4194240&i))return t;if(4&o&&(o|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=o;0<t;)r=1<<(n=31-at(t)),o|=e[n],t&=~r;return o}function pt(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function mt(e){return 0!=(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function ht(){var e=ut;return!(4194240&(ut<<=1))&&(ut=64),e}function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function vt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-at(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var o=31-at(n),r=1<<o;r&t|e[o]&t&&(e[o]|=t),n&=~r}}var bt=0;function wt(e){return 1<(e&=-e)?4<e?268435455&e?16:536870912:4:1}var St,kt,Ct,Et,Tt,xt=!1,Mt=[],_t=null,It=null,Lt=null,Pt=new Map,Nt=new Map,Dt=[],Ft="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Ut(e,t){switch(e){case"focusin":case"focusout":_t=null;break;case"dragenter":case"dragleave":It=null;break;case"mouseover":case"mouseout":Lt=null;break;case"pointerover":case"pointerout":Pt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Nt.delete(t.pointerId)}}function Ot(e,t,n,o,r,i){return null===e||e.nativeEvent!==i?(e={blockedOn:t,domEventName:n,eventSystemFlags:o,nativeEvent:i,targetContainers:[r]},null!==t&&null!==(t=wr(t))&&kt(t),e):(e.eventSystemFlags|=o,t=e.targetContainers,null!==r&&-1===t.indexOf(r)&&t.push(r),e)}function At(e){var t=br(e.target);if(null!==t){var n=Be(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=He(n)))return e.blockedOn=t,void Tt(e.priority,(function(){Ct(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Rt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Kt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=wr(n))&&kt(t),e.blockedOn=n,!1;var o=new(n=e.nativeEvent).constructor(n.type,n);we=o,n.target.dispatchEvent(o),we=null,t.shift()}return!0}function zt(e,t,n){Rt(e)&&n.delete(t)}function Vt(){xt=!1,null!==_t&&Rt(_t)&&(_t=null),null!==It&&Rt(It)&&(It=null),null!==Lt&&Rt(Lt)&&(Lt=null),Pt.forEach(zt),Nt.forEach(zt)}function jt(e,t){e.blockedOn===t&&(e.blockedOn=null,xt||(xt=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Vt)))}function Bt(e){function t(t){return jt(t,e)}if(0<Mt.length){jt(Mt[0],e);for(var n=1;n<Mt.length;n++){var o=Mt[n];o.blockedOn===e&&(o.blockedOn=null)}}for(null!==_t&&jt(_t,e),null!==It&&jt(It,e),null!==Lt&&jt(Lt,e),Pt.forEach(t),Nt.forEach(t),n=0;n<Dt.length;n++)(o=Dt[n]).blockedOn===e&&(o.blockedOn=null);for(;0<Dt.length&&null===(n=Dt[0]).blockedOn;)At(n),null===n.blockedOn&&Dt.shift()}var Ht=w.ReactCurrentBatchConfig,Wt=!0;function $t(e,t,n,o){var r=bt,i=Ht.transition;Ht.transition=null;try{bt=1,Yt(e,t,n,o)}finally{bt=r,Ht.transition=i}}function qt(e,t,n,o){var r=bt,i=Ht.transition;Ht.transition=null;try{bt=4,Yt(e,t,n,o)}finally{bt=r,Ht.transition=i}}function Yt(e,t,n,o){if(Wt){var r=Kt(e,t,n,o);if(null===r)$o(e,t,o,Qt,n),Ut(e,o);else if(function(e,t,n,o,r){switch(t){case"focusin":return _t=Ot(_t,e,t,n,o,r),!0;case"dragenter":return It=Ot(It,e,t,n,o,r),!0;case"mouseover":return Lt=Ot(Lt,e,t,n,o,r),!0;case"pointerover":var i=r.pointerId;return Pt.set(i,Ot(Pt.get(i)||null,e,t,n,o,r)),!0;case"gotpointercapture":return i=r.pointerId,Nt.set(i,Ot(Nt.get(i)||null,e,t,n,o,r)),!0}return!1}(r,e,t,n,o))o.stopPropagation();else if(Ut(e,o),4&t&&-1<Ft.indexOf(e)){for(;null!==r;){var i=wr(r);if(null!==i&&St(i),null===(i=Kt(e,t,n,o))&&$o(e,t,o,Qt,n),i===r)break;r=i}null!==r&&o.stopPropagation()}else $o(e,t,o,null,n)}}var Qt=null;function Kt(e,t,n,o){if(Qt=null,null!==(e=br(e=Se(o))))if(null===(t=Be(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=He(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Qt=e,null}function Gt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Ze()){case Je:return 1;case et:return 4;case tt:case nt:return 16;case ot:return 536870912;default:return 16}default:return 16}}var Xt=null,Zt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Zt,o=n.length,r="value"in Xt?Xt.value:Xt.textContent,i=r.length;for(e=0;e<o&&n[e]===r[e];e++);var a=o-e;for(t=1;t<=a&&n[o-t]===r[i-t];t++);return Jt=r.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function on(){return!1}function rn(e){function t(t,n,o,r,i){for(var a in this._reactName=t,this._targetInst=o,this.type=n,this.nativeEvent=r,this.target=i,this.currentTarget=null,e)e.hasOwnProperty(a)&&(t=e[a],this[a]=t?t(r):r[a]);return this.isDefaultPrevented=(null!=r.defaultPrevented?r.defaultPrevented:!1===r.returnValue)?nn:on,this.isPropagationStopped=on,this}return A(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,ln,sn,un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},cn=rn(un),dn=A({},un,{view:0,detail:0}),fn=rn(dn),pn=A({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Tn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==sn&&(sn&&"mousemove"===e.type?(an=e.screenX-sn.screenX,ln=e.screenY-sn.screenY):ln=an=0,sn=e),an)},movementY:function(e){return"movementY"in e?e.movementY:ln}}),mn=rn(pn),hn=rn(A({},pn,{dataTransfer:0})),gn=rn(A({},dn,{relatedTarget:0})),vn=rn(A({},un,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=A({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),bn=rn(yn),wn=rn(A({},un,{data:0})),Sn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},kn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Cn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function En(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Cn[e])&&!!t[e]}function Tn(){return En}var xn=A({},dn,{key:function(e){if(e.key){var t=Sn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?kn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Tn,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Mn=rn(xn),_n=rn(A({},pn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),In=rn(A({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Tn})),Ln=rn(A({},un,{propertyName:0,elapsedTime:0,pseudoElement:0})),Pn=A({},pn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Nn=rn(Pn),Dn=[9,13,27,32],Fn=c&&"CompositionEvent"in window,Un=null;c&&"documentMode"in document&&(Un=document.documentMode);var On=c&&"TextEvent"in window&&!Un,An=c&&(!Fn||Un&&8<Un&&11>=Un),Rn=String.fromCharCode(32),zn=!1;function Vn(e,t){switch(e){case"keyup":return-1!==Dn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function jn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Bn=!1,Hn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Wn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Hn[e.type]:"textarea"===t}function $n(e,t,n,o){xe(o),0<(t=Yo(t,"onChange")).length&&(n=new cn("onChange","change",null,n,o),e.push({event:n,listeners:t}))}var qn=null,Yn=null;function Qn(e){zo(e,0)}function Kn(e){if(Y(Sr(e)))return e}function Gn(e,t){if("change"===e)return t}var Xn=!1;if(c){var Zn;if(c){var Jn="oninput"in document;if(!Jn){var eo=document.createElement("div");eo.setAttribute("oninput","return;"),Jn="function"==typeof eo.oninput}Zn=Jn}else Zn=!1;Xn=Zn&&(!document.documentMode||9<document.documentMode)}function to(){qn&&(qn.detachEvent("onpropertychange",no),Yn=qn=null)}function no(e){if("value"===e.propertyName&&Kn(Yn)){var t=[];$n(t,Yn,e,Se(e)),Pe(Qn,t)}}function oo(e,t,n){"focusin"===e?(to(),Yn=n,(qn=t).attachEvent("onpropertychange",no)):"focusout"===e&&to()}function ro(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Kn(Yn)}function io(e,t){if("click"===e)return Kn(t)}function ao(e,t){if("input"===e||"change"===e)return Kn(t)}var lo="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function so(e,t){if(lo(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;for(o=0;o<n.length;o++){var r=n[o];if(!d.call(t,r)||!lo(e[r],t[r]))return!1}return!0}function uo(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function co(e,t){var n,o=uo(e);for(e=0;o;){if(3===o.nodeType){if(n=e+o.textContent.length,e<=t&&n>=t)return{node:o,offset:t-e};e=n}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=uo(o)}}function fo(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?fo(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function po(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function mo(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function ho(e){var t=po(),n=e.focusedElem,o=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&fo(n.ownerDocument.documentElement,n)){if(null!==o&&mo(n))if(t=o.start,void 0===(e=o.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var r=n.textContent.length,i=Math.min(o.start,r);o=void 0===o.end?i:Math.min(o.end,r),!e.extend&&i>o&&(r=o,o=i,i=r),r=co(n,i);var a=co(n,o);r&&a&&(1!==e.rangeCount||e.anchorNode!==r.node||e.anchorOffset!==r.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&((t=t.createRange()).setStart(r.node,r.offset),e.removeAllRanges(),i>o?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var go=c&&"documentMode"in document&&11>=document.documentMode,vo=null,yo=null,bo=null,wo=!1;function So(e,t,n){var o=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;wo||null==vo||vo!==Q(o)||(o="selectionStart"in(o=vo)&&mo(o)?{start:o.selectionStart,end:o.selectionEnd}:{anchorNode:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset},bo&&so(bo,o)||(bo=o,0<(o=Yo(yo,"onSelect")).length&&(t=new cn("onSelect","select",null,t,n),e.push({event:t,listeners:o}),t.target=vo)))}function ko(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Co={animationend:ko("Animation","AnimationEnd"),animationiteration:ko("Animation","AnimationIteration"),animationstart:ko("Animation","AnimationStart"),transitionend:ko("Transition","TransitionEnd")},Eo={},To={};function xo(e){if(Eo[e])return Eo[e];if(!Co[e])return e;var t,n=Co[e];for(t in n)if(n.hasOwnProperty(t)&&t in To)return Eo[e]=n[t];return e}c&&(To=document.createElement("div").style,"AnimationEvent"in window||(delete Co.animationend.animation,delete Co.animationiteration.animation,delete Co.animationstart.animation),"TransitionEvent"in window||delete Co.transitionend.transition);var Mo=xo("animationend"),_o=xo("animationiteration"),Io=xo("animationstart"),Lo=xo("transitionend"),Po=new Map,No="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Do(e,t){Po.set(e,t),s(t,[e])}for(var Fo=0;Fo<No.length;Fo++){var Uo=No[Fo];Do(Uo.toLowerCase(),"on"+(Uo[0].toUpperCase()+Uo.slice(1)))}Do(Mo,"onAnimationEnd"),Do(_o,"onAnimationIteration"),Do(Io,"onAnimationStart"),Do("dblclick","onDoubleClick"),Do("focusin","onFocus"),Do("focusout","onBlur"),Do(Lo,"onTransitionEnd"),u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),s("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),s("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),s("onBeforeInput",["compositionend","keypress","textInput","paste"]),s("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Oo="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ao=new Set("cancel close invalid load scroll toggle".split(" ").concat(Oo));function Ro(e,t,n){var o=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,o,r,a,l,s,u){if(je.apply(this,arguments),Oe){if(!Oe)throw Error(i(198));var c=Ae;Oe=!1,Ae=null,Re||(Re=!0,ze=c)}}(o,t,void 0,e),e.currentTarget=null}function zo(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var o=e[n],r=o.event;o=o.listeners;e:{var i=void 0;if(t)for(var a=o.length-1;0<=a;a--){var l=o[a],s=l.instance,u=l.currentTarget;if(l=l.listener,s!==i&&r.isPropagationStopped())break e;Ro(r,l,u),i=s}else for(a=0;a<o.length;a++){if(s=(l=o[a]).instance,u=l.currentTarget,l=l.listener,s!==i&&r.isPropagationStopped())break e;Ro(r,l,u),i=s}}}if(Re)throw e=ze,Re=!1,ze=null,e}function Vo(e,t){var n=t[gr];void 0===n&&(n=t[gr]=new Set);var o=e+"__bubble";n.has(o)||(Wo(t,e,2,!1),n.add(o))}function jo(e,t,n){var o=0;t&&(o|=4),Wo(n,e,o,t)}var Bo="_reactListening"+Math.random().toString(36).slice(2);function Ho(e){if(!e[Bo]){e[Bo]=!0,a.forEach((function(t){"selectionchange"!==t&&(Ao.has(t)||jo(t,!1,e),jo(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Bo]||(t[Bo]=!0,jo("selectionchange",!1,t))}}function Wo(e,t,n,o){switch(Gt(t)){case 1:var r=$t;break;case 4:r=qt;break;default:r=Yt}n=r.bind(null,t,n,e),r=void 0,!De||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(r=!0),o?void 0!==r?e.addEventListener(t,n,{capture:!0,passive:r}):e.addEventListener(t,n,!0):void 0!==r?e.addEventListener(t,n,{passive:r}):e.addEventListener(t,n,!1)}function $o(e,t,n,o,r){var i=o;if(!(1&t||2&t||null===o))e:for(;;){if(null===o)return;var a=o.tag;if(3===a||4===a){var l=o.stateNode.containerInfo;if(l===r||8===l.nodeType&&l.parentNode===r)break;if(4===a)for(a=o.return;null!==a;){var s=a.tag;if((3===s||4===s)&&((s=a.stateNode.containerInfo)===r||8===s.nodeType&&s.parentNode===r))return;a=a.return}for(;null!==l;){if(null===(a=br(l)))return;if(5===(s=a.tag)||6===s){o=i=a;continue e}l=l.parentNode}}o=o.return}Pe((function(){var o=i,r=Se(n),a=[];e:{var l=Po.get(e);if(void 0!==l){var s=cn,u=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":s=Mn;break;case"focusin":u="focus",s=gn;break;case"focusout":u="blur",s=gn;break;case"beforeblur":case"afterblur":s=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=hn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=In;break;case Mo:case _o:case Io:s=vn;break;case Lo:s=Ln;break;case"scroll":s=fn;break;case"wheel":s=Nn;break;case"copy":case"cut":case"paste":s=bn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=_n}var c=!!(4&t),d=!c&&"scroll"===e,f=c?null!==l?l+"Capture":null:l;c=[];for(var p,m=o;null!==m;){var h=(p=m).stateNode;if(5===p.tag&&null!==h&&(p=h,null!==f&&null!=(h=Ne(m,f))&&c.push(qo(m,h,p))),d)break;m=m.return}0<c.length&&(l=new s(l,u,null,n,r),a.push({event:l,listeners:c}))}}if(!(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||n===we||!(u=n.relatedTarget||n.fromElement)||!br(u)&&!u[hr])&&(s||l)&&(l=r.window===r?r:(l=r.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=o,null!==(u=(u=n.relatedTarget||n.toElement)?br(u):null)&&(u!==(d=Be(u))||5!==u.tag&&6!==u.tag)&&(u=null)):(s=null,u=o),s!==u)){if(c=mn,h="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(c=_n,h="onPointerLeave",f="onPointerEnter",m="pointer"),d=null==s?l:Sr(s),p=null==u?l:Sr(u),(l=new c(h,m+"leave",s,n,r)).target=d,l.relatedTarget=p,h=null,br(r)===o&&((c=new c(f,m+"enter",u,n,r)).target=p,c.relatedTarget=d,h=c),d=h,s&&u)e:{for(f=u,m=0,p=c=s;p;p=Qo(p))m++;for(p=0,h=f;h;h=Qo(h))p++;for(;0<m-p;)c=Qo(c),m--;for(;0<p-m;)f=Qo(f),p--;for(;m--;){if(c===f||null!==f&&c===f.alternate)break e;c=Qo(c),f=Qo(f)}c=null}else c=null;null!==s&&Ko(a,l,s,c,!1),null!==u&&null!==d&&Ko(a,d,u,c,!0)}if("select"===(s=(l=o?Sr(o):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var g=Gn;else if(Wn(l))if(Xn)g=ao;else{g=ro;var v=oo}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(g=io);switch(g&&(g=g(e,o))?$n(a,g,n,r):(v&&v(e,l,o),"focusout"===e&&(v=l._wrapperState)&&v.controlled&&"number"===l.type&&ee(l,"number",l.value)),v=o?Sr(o):window,e){case"focusin":(Wn(v)||"true"===v.contentEditable)&&(vo=v,yo=o,bo=null);break;case"focusout":bo=yo=vo=null;break;case"mousedown":wo=!0;break;case"contextmenu":case"mouseup":case"dragend":wo=!1,So(a,n,r);break;case"selectionchange":if(go)break;case"keydown":case"keyup":So(a,n,r)}var y;if(Fn)e:{switch(e){case"compositionstart":var b="onCompositionStart";break e;case"compositionend":b="onCompositionEnd";break e;case"compositionupdate":b="onCompositionUpdate";break e}b=void 0}else Bn?Vn(e,n)&&(b="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(b="onCompositionStart");b&&(An&&"ko"!==n.locale&&(Bn||"onCompositionStart"!==b?"onCompositionEnd"===b&&Bn&&(y=en()):(Zt="value"in(Xt=r)?Xt.value:Xt.textContent,Bn=!0)),0<(v=Yo(o,b)).length&&(b=new wn(b,e,null,n,r),a.push({event:b,listeners:v}),(y||null!==(y=jn(n)))&&(b.data=y))),(y=On?function(e,t){switch(e){case"compositionend":return jn(t);case"keypress":return 32!==t.which?null:(zn=!0,Rn);case"textInput":return(e=t.data)===Rn&&zn?null:e;default:return null}}(e,n):function(e,t){if(Bn)return"compositionend"===e||!Fn&&Vn(e,t)?(e=en(),Jt=Zt=Xt=null,Bn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return An&&"ko"!==t.locale?null:t.data}}(e,n))&&0<(o=Yo(o,"onBeforeInput")).length&&(r=new wn("onBeforeInput","beforeinput",null,n,r),a.push({event:r,listeners:o}),r.data=y)}zo(a,t)}))}function qo(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Yo(e,t){for(var n=t+"Capture",o=[];null!==e;){var r=e,i=r.stateNode;5===r.tag&&null!==i&&(r=i,null!=(i=Ne(e,n))&&o.unshift(qo(e,i,r)),null!=(i=Ne(e,t))&&o.push(qo(e,i,r))),e=e.return}return o}function Qo(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Ko(e,t,n,o,r){for(var i=t._reactName,a=[];null!==n&&n!==o;){var l=n,s=l.alternate,u=l.stateNode;if(null!==s&&s===o)break;5===l.tag&&null!==u&&(l=u,r?null!=(s=Ne(n,i))&&a.unshift(qo(n,s,l)):r||null!=(s=Ne(n,i))&&a.push(qo(n,s,l))),n=n.return}0!==a.length&&e.push({event:t,listeners:a})}var Go=/\r\n?/g,Xo=/\u0000|\uFFFD/g;function Zo(e){return("string"==typeof e?e:""+e).replace(Go,"\n").replace(Xo,"")}function Jo(e,t,n){if(t=Zo(t),Zo(e)!==t&&n)throw Error(i(425))}function er(){}var tr=null,nr=null;function or(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var rr="function"==typeof setTimeout?setTimeout:void 0,ir="function"==typeof clearTimeout?clearTimeout:void 0,ar="function"==typeof Promise?Promise:void 0,lr="function"==typeof queueMicrotask?queueMicrotask:void 0!==ar?function(e){return ar.resolve(null).then(e).catch(sr)}:rr;function sr(e){setTimeout((function(){throw e}))}function ur(e,t){var n=t,o=0;do{var r=n.nextSibling;if(e.removeChild(n),r&&8===r.nodeType)if("/$"===(n=r.data)){if(0===o)return e.removeChild(r),void Bt(t);o--}else"$"!==n&&"$?"!==n&&"$!"!==n||o++;n=r}while(n);Bt(t)}function cr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function dr(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var fr=Math.random().toString(36).slice(2),pr="__reactFiber$"+fr,mr="__reactProps$"+fr,hr="__reactContainer$"+fr,gr="__reactEvents$"+fr,vr="__reactListeners$"+fr,yr="__reactHandles$"+fr;function br(e){var t=e[pr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[hr]||n[pr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=dr(e);null!==e;){if(n=e[pr])return n;e=dr(e)}return t}n=(e=n).parentNode}return null}function wr(e){return!(e=e[pr]||e[hr])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function Sr(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function kr(e){return e[mr]||null}var Cr=[],Er=-1;function Tr(e){return{current:e}}function xr(e){0>Er||(e.current=Cr[Er],Cr[Er]=null,Er--)}function Mr(e,t){Er++,Cr[Er]=e.current,e.current=t}var _r={},Ir=Tr(_r),Lr=Tr(!1),Pr=_r;function Nr(e,t){var n=e.type.contextTypes;if(!n)return _r;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var r,i={};for(r in n)i[r]=t[r];return o&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Dr(e){return null!=e.childContextTypes}function Fr(){xr(Lr),xr(Ir)}function Ur(e,t,n){if(Ir.current!==_r)throw Error(i(168));Mr(Ir,t),Mr(Lr,n)}function Or(e,t,n){var o=e.stateNode;if(t=t.childContextTypes,"function"!=typeof o.getChildContext)return n;for(var r in o=o.getChildContext())if(!(r in t))throw Error(i(108,H(e)||"Unknown",r));return A({},n,o)}function Ar(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||_r,Pr=Ir.current,Mr(Ir,e),Mr(Lr,Lr.current),!0}function Rr(e,t,n){var o=e.stateNode;if(!o)throw Error(i(169));n?(e=Or(e,t,Pr),o.__reactInternalMemoizedMergedChildContext=e,xr(Lr),xr(Ir),Mr(Ir,e)):xr(Lr),Mr(Lr,n)}var zr=null,Vr=!1,jr=!1;function Br(e){null===zr?zr=[e]:zr.push(e)}function Hr(){if(!jr&&null!==zr){jr=!0;var e=0,t=bt;try{var n=zr;for(bt=1;e<n.length;e++){var o=n[e];do{o=o(!0)}while(null!==o)}zr=null,Vr=!1}catch(t){throw null!==zr&&(zr=zr.slice(e+1)),Ye(Je,Hr),t}finally{bt=t,jr=!1}}return null}var Wr=[],$r=0,qr=null,Yr=0,Qr=[],Kr=0,Gr=null,Xr=1,Zr="";function Jr(e,t){Wr[$r++]=Yr,Wr[$r++]=qr,qr=e,Yr=t}function ei(e,t,n){Qr[Kr++]=Xr,Qr[Kr++]=Zr,Qr[Kr++]=Gr,Gr=e;var o=Xr;e=Zr;var r=32-at(o)-1;o&=~(1<<r),n+=1;var i=32-at(t)+r;if(30<i){var a=r-r%5;i=(o&(1<<a)-1).toString(32),o>>=a,r-=a,Xr=1<<32-at(t)+r|n<<r|o,Zr=i+e}else Xr=1<<i|n<<r|o,Zr=e}function ti(e){null!==e.return&&(Jr(e,1),ei(e,1,0))}function ni(e){for(;e===qr;)qr=Wr[--$r],Wr[$r]=null,Yr=Wr[--$r],Wr[$r]=null;for(;e===Gr;)Gr=Qr[--Kr],Qr[Kr]=null,Zr=Qr[--Kr],Qr[Kr]=null,Xr=Qr[--Kr],Qr[Kr]=null}var oi=null,ri=null,ii=!1,ai=null;function li(e,t){var n=Nu(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function si(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,oi=e,ri=cr(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,oi=e,ri=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Gr?{id:Xr,overflow:Zr}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Nu(18,null,null,0)).stateNode=t,n.return=e,e.child=n,oi=e,ri=null,!0);default:return!1}}function ui(e){return!(!(1&e.mode)||128&e.flags)}function ci(e){if(ii){var t=ri;if(t){var n=t;if(!si(e,t)){if(ui(e))throw Error(i(418));t=cr(n.nextSibling);var o=oi;t&&si(e,t)?li(o,n):(e.flags=-4097&e.flags|2,ii=!1,oi=e)}}else{if(ui(e))throw Error(i(418));e.flags=-4097&e.flags|2,ii=!1,oi=e}}}function di(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;oi=e}function fi(e){if(e!==oi)return!1;if(!ii)return di(e),ii=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!or(e.type,e.memoizedProps)),t&&(t=ri)){if(ui(e))throw pi(),Error(i(418));for(;t;)li(e,t),t=cr(t.nextSibling)}if(di(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){ri=cr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}ri=null}}else ri=oi?cr(e.stateNode.nextSibling):null;return!0}function pi(){for(var e=ri;e;)e=cr(e.nextSibling)}function mi(){ri=oi=null,ii=!1}function hi(e){null===ai?ai=[e]:ai.push(e)}var gi=w.ReactCurrentBatchConfig;function vi(e,t){if(e&&e.defaultProps){for(var n in t=A({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var yi=Tr(null),bi=null,wi=null,Si=null;function ki(){Si=wi=bi=null}function Ci(e){var t=yi.current;xr(yi),e._currentValue=t}function Ei(e,t,n){for(;null!==e;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==o&&(o.childLanes|=t)):null!==o&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===n)break;e=e.return}}function Ti(e,t){bi=e,Si=wi=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(wl=!0),e.firstContext=null)}function xi(e){var t=e._currentValue;if(Si!==e)if(e={context:e,memoizedValue:t,next:null},null===wi){if(null===bi)throw Error(i(308));wi=e,bi.dependencies={lanes:0,firstContext:e}}else wi=wi.next=e;return t}var Mi=null;function _i(e){null===Mi?Mi=[e]:Mi.push(e)}function Ii(e,t,n,o){var r=t.interleaved;return null===r?(n.next=n,_i(t)):(n.next=r.next,r.next=n),t.interleaved=n,Li(e,o)}function Li(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Pi=!1;function Ni(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Di(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Fi(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ui(e,t,n){var o=e.updateQueue;if(null===o)return null;if(o=o.shared,2&Is){var r=o.pending;return null===r?t.next=t:(t.next=r.next,r.next=t),o.pending=t,Li(e,n)}return null===(r=o.interleaved)?(t.next=t,_i(o)):(t.next=r.next,r.next=t),o.interleaved=t,Li(e,n)}function Oi(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var o=t.lanes;n|=o&=e.pendingLanes,t.lanes=n,yt(e,n)}}function Ai(e,t){var n=e.updateQueue,o=e.alternate;if(null!==o&&n===(o=o.updateQueue)){var r=null,i=null;if(null!==(n=n.firstBaseUpdate)){do{var a={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===i?r=i=a:i=i.next=a,n=n.next}while(null!==n);null===i?r=i=t:i=i.next=t}else r=i=t;return n={baseState:o.baseState,firstBaseUpdate:r,lastBaseUpdate:i,shared:o.shared,effects:o.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Ri(e,t,n,o){var r=e.updateQueue;Pi=!1;var i=r.firstBaseUpdate,a=r.lastBaseUpdate,l=r.shared.pending;if(null!==l){r.shared.pending=null;var s=l,u=s.next;s.next=null,null===a?i=u:a.next=u,a=s;var c=e.alternate;null!==c&&(l=(c=c.updateQueue).lastBaseUpdate)!==a&&(null===l?c.firstBaseUpdate=u:l.next=u,c.lastBaseUpdate=s)}if(null!==i){var d=r.baseState;for(a=0,c=u=s=null,l=i;;){var f=l.lane,p=l.eventTime;if((o&f)===f){null!==c&&(c=c.next={eventTime:p,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var m=e,h=l;switch(f=t,p=n,h.tag){case 1:if("function"==typeof(m=h.payload)){d=m.call(p,d,f);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(f="function"==typeof(m=h.payload)?m.call(p,d,f):m))break e;d=A({},d,f);break e;case 2:Pi=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(f=r.effects)?r.effects=[l]:f.push(l))}else p={eventTime:p,lane:f,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===c?(u=c=p,s=d):c=c.next=p,a|=f;if(null===(l=l.next)){if(null===(l=r.shared.pending))break;l=(f=l).next,f.next=null,r.lastBaseUpdate=f,r.shared.pending=null}}if(null===c&&(s=d),r.baseState=s,r.firstBaseUpdate=u,r.lastBaseUpdate=c,null!==(t=r.shared.interleaved)){r=t;do{a|=r.lane,r=r.next}while(r!==t)}else null===i&&(r.shared.lanes=0);As|=a,e.lanes=a,e.memoizedState=d}}function zi(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var o=e[t],r=o.callback;if(null!==r){if(o.callback=null,o=n,"function"!=typeof r)throw Error(i(191,r));r.call(o)}}}var Vi=(new o.Component).refs;function ji(e,t,n,o){n=null==(n=n(o,t=e.memoizedState))?t:A({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var Bi={isMounted:function(e){return!!(e=e._reactInternals)&&Be(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var o=tu(),r=nu(e),i=Fi(o,r);i.payload=t,null!=n&&(i.callback=n),null!==(t=Ui(e,i,r))&&(ou(t,e,r,o),Oi(t,e,r))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var o=tu(),r=nu(e),i=Fi(o,r);i.tag=1,i.payload=t,null!=n&&(i.callback=n),null!==(t=Ui(e,i,r))&&(ou(t,e,r,o),Oi(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=tu(),o=nu(e),r=Fi(n,o);r.tag=2,null!=t&&(r.callback=t),null!==(t=Ui(e,r,o))&&(ou(t,e,o,n),Oi(t,e,o))}};function Hi(e,t,n,o,r,i,a){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(o,i,a):!(t.prototype&&t.prototype.isPureReactComponent&&so(n,o)&&so(r,i))}function Wi(e,t,n){var o=!1,r=_r,i=t.contextType;return"object"==typeof i&&null!==i?i=xi(i):(r=Dr(t)?Pr:Ir.current,i=(o=null!=(o=t.contextTypes))?Nr(e,r):_r),t=new t(n,i),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=Bi,e.stateNode=t,t._reactInternals=e,o&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=i),t}function $i(e,t,n,o){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,o),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,o),t.state!==e&&Bi.enqueueReplaceState(t,t.state,null)}function qi(e,t,n,o){var r=e.stateNode;r.props=n,r.state=e.memoizedState,r.refs=Vi,Ni(e);var i=t.contextType;"object"==typeof i&&null!==i?r.context=xi(i):(i=Dr(t)?Pr:Ir.current,r.context=Nr(e,i)),r.state=e.memoizedState,"function"==typeof(i=t.getDerivedStateFromProps)&&(ji(e,t,i,n),r.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof r.getSnapshotBeforeUpdate||"function"!=typeof r.UNSAFE_componentWillMount&&"function"!=typeof r.componentWillMount||(t=r.state,"function"==typeof r.componentWillMount&&r.componentWillMount(),"function"==typeof r.UNSAFE_componentWillMount&&r.UNSAFE_componentWillMount(),t!==r.state&&Bi.enqueueReplaceState(r,r.state,null),Ri(e,n,r,o),r.state=e.memoizedState),"function"==typeof r.componentDidMount&&(e.flags|=4194308)}function Yi(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var o=n.stateNode}if(!o)throw Error(i(147,e));var r=o,a=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=r.refs;t===Vi&&(t=r.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function Qi(e,t){throw e=Object.prototype.toString.call(t),Error(i(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Ki(e){return(0,e._init)(e._payload)}function Gi(e){function t(t,n){if(e){var o=t.deletions;null===o?(t.deletions=[n],t.flags|=16):o.push(n)}}function n(n,o){if(!e)return null;for(;null!==o;)t(n,o),o=o.sibling;return null}function o(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function r(e,t){return(e=Fu(e,t)).index=0,e.sibling=null,e}function a(t,n,o){return t.index=o,e?null!==(o=t.alternate)?(o=o.index)<n?(t.flags|=2,n):o:(t.flags|=2,n):(t.flags|=1048576,n)}function l(t){return e&&null===t.alternate&&(t.flags|=2),t}function s(e,t,n,o){return null===t||6!==t.tag?((t=Ru(n,e.mode,o)).return=e,t):((t=r(t,n)).return=e,t)}function u(e,t,n,o){var i=n.type;return i===C?d(e,t,n.props.children,o,n.key):null!==t&&(t.elementType===i||"object"==typeof i&&null!==i&&i.$$typeof===N&&Ki(i)===t.type)?((o=r(t,n.props)).ref=Yi(e,t,n),o.return=e,o):((o=Uu(n.type,n.key,n.props,null,e.mode,o)).ref=Yi(e,t,n),o.return=e,o)}function c(e,t,n,o){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=zu(n,e.mode,o)).return=e,t):((t=r(t,n.children||[])).return=e,t)}function d(e,t,n,o,i){return null===t||7!==t.tag?((t=Ou(n,e.mode,o,i)).return=e,t):((t=r(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Ru(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case S:return(n=Uu(t.type,t.key,t.props,null,e.mode,n)).ref=Yi(e,null,t),n.return=e,n;case k:return(t=zu(t,e.mode,n)).return=e,t;case N:return f(e,(0,t._init)(t._payload),n)}if(te(t)||U(t))return(t=Ou(t,e.mode,n,null)).return=e,t;Qi(e,t)}return null}function p(e,t,n,o){var r=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==r?null:s(e,t,""+n,o);if("object"==typeof n&&null!==n){switch(n.$$typeof){case S:return n.key===r?u(e,t,n,o):null;case k:return n.key===r?c(e,t,n,o):null;case N:return p(e,t,(r=n._init)(n._payload),o)}if(te(n)||U(n))return null!==r?null:d(e,t,n,o,null);Qi(e,n)}return null}function m(e,t,n,o,r){if("string"==typeof o&&""!==o||"number"==typeof o)return s(t,e=e.get(n)||null,""+o,r);if("object"==typeof o&&null!==o){switch(o.$$typeof){case S:return u(t,e=e.get(null===o.key?n:o.key)||null,o,r);case k:return c(t,e=e.get(null===o.key?n:o.key)||null,o,r);case N:return m(e,t,n,(0,o._init)(o._payload),r)}if(te(o)||U(o))return d(t,e=e.get(n)||null,o,r,null);Qi(t,o)}return null}function h(r,i,l,s){for(var u=null,c=null,d=i,h=i=0,g=null;null!==d&&h<l.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var v=p(r,d,l[h],s);if(null===v){null===d&&(d=g);break}e&&d&&null===v.alternate&&t(r,d),i=a(v,i,h),null===c?u=v:c.sibling=v,c=v,d=g}if(h===l.length)return n(r,d),ii&&Jr(r,h),u;if(null===d){for(;h<l.length;h++)null!==(d=f(r,l[h],s))&&(i=a(d,i,h),null===c?u=d:c.sibling=d,c=d);return ii&&Jr(r,h),u}for(d=o(r,d);h<l.length;h++)null!==(g=m(d,r,h,l[h],s))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),i=a(g,i,h),null===c?u=g:c.sibling=g,c=g);return e&&d.forEach((function(e){return t(r,e)})),ii&&Jr(r,h),u}function g(r,l,s,u){var c=U(s);if("function"!=typeof c)throw Error(i(150));if(null==(s=c.call(s)))throw Error(i(151));for(var d=c=null,h=l,g=l=0,v=null,y=s.next();null!==h&&!y.done;g++,y=s.next()){h.index>g?(v=h,h=null):v=h.sibling;var b=p(r,h,y.value,u);if(null===b){null===h&&(h=v);break}e&&h&&null===b.alternate&&t(r,h),l=a(b,l,g),null===d?c=b:d.sibling=b,d=b,h=v}if(y.done)return n(r,h),ii&&Jr(r,g),c;if(null===h){for(;!y.done;g++,y=s.next())null!==(y=f(r,y.value,u))&&(l=a(y,l,g),null===d?c=y:d.sibling=y,d=y);return ii&&Jr(r,g),c}for(h=o(r,h);!y.done;g++,y=s.next())null!==(y=m(h,r,g,y.value,u))&&(e&&null!==y.alternate&&h.delete(null===y.key?g:y.key),l=a(y,l,g),null===d?c=y:d.sibling=y,d=y);return e&&h.forEach((function(e){return t(r,e)})),ii&&Jr(r,g),c}return function e(o,i,a,s){if("object"==typeof a&&null!==a&&a.type===C&&null===a.key&&(a=a.props.children),"object"==typeof a&&null!==a){switch(a.$$typeof){case S:e:{for(var u=a.key,c=i;null!==c;){if(c.key===u){if((u=a.type)===C){if(7===c.tag){n(o,c.sibling),(i=r(c,a.props.children)).return=o,o=i;break e}}else if(c.elementType===u||"object"==typeof u&&null!==u&&u.$$typeof===N&&Ki(u)===c.type){n(o,c.sibling),(i=r(c,a.props)).ref=Yi(o,c,a),i.return=o,o=i;break e}n(o,c);break}t(o,c),c=c.sibling}a.type===C?((i=Ou(a.props.children,o.mode,s,a.key)).return=o,o=i):((s=Uu(a.type,a.key,a.props,null,o.mode,s)).ref=Yi(o,i,a),s.return=o,o=s)}return l(o);case k:e:{for(c=a.key;null!==i;){if(i.key===c){if(4===i.tag&&i.stateNode.containerInfo===a.containerInfo&&i.stateNode.implementation===a.implementation){n(o,i.sibling),(i=r(i,a.children||[])).return=o,o=i;break e}n(o,i);break}t(o,i),i=i.sibling}(i=zu(a,o.mode,s)).return=o,o=i}return l(o);case N:return e(o,i,(c=a._init)(a._payload),s)}if(te(a))return h(o,i,a,s);if(U(a))return g(o,i,a,s);Qi(o,a)}return"string"==typeof a&&""!==a||"number"==typeof a?(a=""+a,null!==i&&6===i.tag?(n(o,i.sibling),(i=r(i,a)).return=o,o=i):(n(o,i),(i=Ru(a,o.mode,s)).return=o,o=i),l(o)):n(o,i)}}var Xi=Gi(!0),Zi=Gi(!1),Ji={},ea=Tr(Ji),ta=Tr(Ji),na=Tr(Ji);function oa(e){if(e===Ji)throw Error(i(174));return e}function ra(e,t){switch(Mr(na,t),Mr(ta,e),Mr(ea,Ji),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:se(null,"");break;default:t=se(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}xr(ea),Mr(ea,t)}function ia(){xr(ea),xr(ta),xr(na)}function aa(e){oa(na.current);var t=oa(ea.current),n=se(t,e.type);t!==n&&(Mr(ta,e),Mr(ea,n))}function la(e){ta.current===e&&(xr(ea),xr(ta))}var sa=Tr(0);function ua(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ca=[];function da(){for(var e=0;e<ca.length;e++)ca[e]._workInProgressVersionPrimary=null;ca.length=0}var fa=w.ReactCurrentDispatcher,pa=w.ReactCurrentBatchConfig,ma=0,ha=null,ga=null,va=null,ya=!1,ba=!1,wa=0,Sa=0;function ka(){throw Error(i(321))}function Ca(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!lo(e[n],t[n]))return!1;return!0}function Ea(e,t,n,o,r,a){if(ma=a,ha=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,fa.current=null===e||null===e.memoizedState?ll:sl,e=n(o,r),ba){a=0;do{if(ba=!1,wa=0,25<=a)throw Error(i(301));a+=1,va=ga=null,t.updateQueue=null,fa.current=ul,e=n(o,r)}while(ba)}if(fa.current=al,t=null!==ga&&null!==ga.next,ma=0,va=ga=ha=null,ya=!1,t)throw Error(i(300));return e}function Ta(){var e=0!==wa;return wa=0,e}function xa(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===va?ha.memoizedState=va=e:va=va.next=e,va}function Ma(){if(null===ga){var e=ha.alternate;e=null!==e?e.memoizedState:null}else e=ga.next;var t=null===va?ha.memoizedState:va.next;if(null!==t)va=t,ga=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ga=e).memoizedState,baseState:ga.baseState,baseQueue:ga.baseQueue,queue:ga.queue,next:null},null===va?ha.memoizedState=va=e:va=va.next=e}return va}function _a(e,t){return"function"==typeof t?t(e):t}function Ia(e){var t=Ma(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var o=ga,r=o.baseQueue,a=n.pending;if(null!==a){if(null!==r){var l=r.next;r.next=a.next,a.next=l}o.baseQueue=r=a,n.pending=null}if(null!==r){a=r.next,o=o.baseState;var s=l=null,u=null,c=a;do{var d=c.lane;if((ma&d)===d)null!==u&&(u=u.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),o=c.hasEagerState?c.eagerState:e(o,c.action);else{var f={lane:d,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};null===u?(s=u=f,l=o):u=u.next=f,ha.lanes|=d,As|=d}c=c.next}while(null!==c&&c!==a);null===u?l=o:u.next=s,lo(o,t.memoizedState)||(wl=!0),t.memoizedState=o,t.baseState=l,t.baseQueue=u,n.lastRenderedState=o}if(null!==(e=n.interleaved)){r=e;do{a=r.lane,ha.lanes|=a,As|=a,r=r.next}while(r!==e)}else null===r&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function La(e){var t=Ma(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var o=n.dispatch,r=n.pending,a=t.memoizedState;if(null!==r){n.pending=null;var l=r=r.next;do{a=e(a,l.action),l=l.next}while(l!==r);lo(a,t.memoizedState)||(wl=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,o]}function Pa(){}function Na(e,t){var n=ha,o=Ma(),r=t(),a=!lo(o.memoizedState,r);if(a&&(o.memoizedState=r,wl=!0),o=o.queue,Wa(Ua.bind(null,n,o,e),[e]),o.getSnapshot!==t||a||null!==va&&1&va.memoizedState.tag){if(n.flags|=2048,za(9,Fa.bind(null,n,o,r,t),void 0,null),null===Ls)throw Error(i(349));30&ma||Da(n,t,r)}return r}function Da(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=ha.updateQueue)?(t={lastEffect:null,stores:null},ha.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Fa(e,t,n,o){t.value=n,t.getSnapshot=o,Oa(t)&&Aa(e)}function Ua(e,t,n){return n((function(){Oa(t)&&Aa(e)}))}function Oa(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lo(e,n)}catch(e){return!0}}function Aa(e){var t=Li(e,1);null!==t&&ou(t,e,1,-1)}function Ra(e){var t=xa();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:_a,lastRenderedState:e},t.queue=e,e=e.dispatch=nl.bind(null,ha,e),[t.memoizedState,e]}function za(e,t,n,o){return e={tag:e,create:t,destroy:n,deps:o,next:null},null===(t=ha.updateQueue)?(t={lastEffect:null,stores:null},ha.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(o=n.next,n.next=e,e.next=o,t.lastEffect=e),e}function Va(){return Ma().memoizedState}function ja(e,t,n,o){var r=xa();ha.flags|=e,r.memoizedState=za(1|t,n,void 0,void 0===o?null:o)}function Ba(e,t,n,o){var r=Ma();o=void 0===o?null:o;var i=void 0;if(null!==ga){var a=ga.memoizedState;if(i=a.destroy,null!==o&&Ca(o,a.deps))return void(r.memoizedState=za(t,n,i,o))}ha.flags|=e,r.memoizedState=za(1|t,n,i,o)}function Ha(e,t){return ja(8390656,8,e,t)}function Wa(e,t){return Ba(2048,8,e,t)}function $a(e,t){return Ba(4,2,e,t)}function qa(e,t){return Ba(4,4,e,t)}function Ya(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Qa(e,t,n){return n=null!=n?n.concat([e]):null,Ba(4,4,Ya.bind(null,t,e),n)}function Ka(){}function Ga(e,t){var n=Ma();t=void 0===t?null:t;var o=n.memoizedState;return null!==o&&null!==t&&Ca(t,o[1])?o[0]:(n.memoizedState=[e,t],e)}function Xa(e,t){var n=Ma();t=void 0===t?null:t;var o=n.memoizedState;return null!==o&&null!==t&&Ca(t,o[1])?o[0]:(e=e(),n.memoizedState=[e,t],e)}function Za(e,t,n){return 21&ma?(lo(n,t)||(n=ht(),ha.lanes|=n,As|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,wl=!0),e.memoizedState=n)}function Ja(e,t){var n=bt;bt=0!==n&&4>n?n:4,e(!0);var o=pa.transition;pa.transition={};try{e(!1),t()}finally{bt=n,pa.transition=o}}function el(){return Ma().memoizedState}function tl(e,t,n){var o=nu(e);n={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null},ol(e)?rl(t,n):null!==(n=Ii(e,t,n,o))&&(ou(n,e,o,tu()),il(n,t,o))}function nl(e,t,n){var o=nu(e),r={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null};if(ol(e))rl(t,r);else{var i=e.alternate;if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var a=t.lastRenderedState,l=i(a,n);if(r.hasEagerState=!0,r.eagerState=l,lo(l,a)){var s=t.interleaved;return null===s?(r.next=r,_i(t)):(r.next=s.next,s.next=r),void(t.interleaved=r)}}catch(e){}null!==(n=Ii(e,t,r,o))&&(ou(n,e,o,r=tu()),il(n,t,o))}}function ol(e){var t=e.alternate;return e===ha||null!==t&&t===ha}function rl(e,t){ba=ya=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function il(e,t,n){if(4194240&n){var o=t.lanes;n|=o&=e.pendingLanes,t.lanes=n,yt(e,n)}}var al={readContext:xi,useCallback:ka,useContext:ka,useEffect:ka,useImperativeHandle:ka,useInsertionEffect:ka,useLayoutEffect:ka,useMemo:ka,useReducer:ka,useRef:ka,useState:ka,useDebugValue:ka,useDeferredValue:ka,useTransition:ka,useMutableSource:ka,useSyncExternalStore:ka,useId:ka,unstable_isNewReconciler:!1},ll={readContext:xi,useCallback:function(e,t){return xa().memoizedState=[e,void 0===t?null:t],e},useContext:xi,useEffect:Ha,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,ja(4194308,4,Ya.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ja(4194308,4,e,t)},useInsertionEffect:function(e,t){return ja(4,2,e,t)},useMemo:function(e,t){var n=xa();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var o=xa();return t=void 0!==n?n(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=tl.bind(null,ha,e),[o.memoizedState,e]},useRef:function(e){return e={current:e},xa().memoizedState=e},useState:Ra,useDebugValue:Ka,useDeferredValue:function(e){return xa().memoizedState=e},useTransition:function(){var e=Ra(!1),t=e[0];return e=Ja.bind(null,e[1]),xa().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var o=ha,r=xa();if(ii){if(void 0===n)throw Error(i(407));n=n()}else{if(n=t(),null===Ls)throw Error(i(349));30&ma||Da(o,t,n)}r.memoizedState=n;var a={value:n,getSnapshot:t};return r.queue=a,Ha(Ua.bind(null,o,a,e),[e]),o.flags|=2048,za(9,Fa.bind(null,o,a,n,t),void 0,null),n},useId:function(){var e=xa(),t=Ls.identifierPrefix;if(ii){var n=Zr;t=":"+t+"R"+(n=(Xr&~(1<<32-at(Xr)-1)).toString(32)+n),0<(n=wa++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=Sa++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},sl={readContext:xi,useCallback:Ga,useContext:xi,useEffect:Wa,useImperativeHandle:Qa,useInsertionEffect:$a,useLayoutEffect:qa,useMemo:Xa,useReducer:Ia,useRef:Va,useState:function(){return Ia(_a)},useDebugValue:Ka,useDeferredValue:function(e){return Za(Ma(),ga.memoizedState,e)},useTransition:function(){return[Ia(_a)[0],Ma().memoizedState]},useMutableSource:Pa,useSyncExternalStore:Na,useId:el,unstable_isNewReconciler:!1},ul={readContext:xi,useCallback:Ga,useContext:xi,useEffect:Wa,useImperativeHandle:Qa,useInsertionEffect:$a,useLayoutEffect:qa,useMemo:Xa,useReducer:La,useRef:Va,useState:function(){return La(_a)},useDebugValue:Ka,useDeferredValue:function(e){var t=Ma();return null===ga?t.memoizedState=e:Za(t,ga.memoizedState,e)},useTransition:function(){return[La(_a)[0],Ma().memoizedState]},useMutableSource:Pa,useSyncExternalStore:Na,useId:el,unstable_isNewReconciler:!1};function cl(e,t){try{var n="",o=t;do{n+=j(o),o=o.return}while(o);var r=n}catch(e){r="\nError generating stack: "+e.message+"\n"+e.stack}return{value:e,source:t,stack:r,digest:null}}function dl(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function fl(e,t){try{console.error(t.value)}catch(e){setTimeout((function(){throw e}))}}var pl="function"==typeof WeakMap?WeakMap:Map;function ml(e,t,n){(n=Fi(-1,n)).tag=3,n.payload={element:null};var o=t.value;return n.callback=function(){$s||($s=!0,qs=o),fl(0,t)},n}function hl(e,t,n){(n=Fi(-1,n)).tag=3;var o=e.type.getDerivedStateFromError;if("function"==typeof o){var r=t.value;n.payload=function(){return o(r)},n.callback=function(){fl(0,t)}}var i=e.stateNode;return null!==i&&"function"==typeof i.componentDidCatch&&(n.callback=function(){fl(0,t),"function"!=typeof o&&(null===Ys?Ys=new Set([this]):Ys.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function gl(e,t,n){var o=e.pingCache;if(null===o){o=e.pingCache=new pl;var r=new Set;o.set(t,r)}else void 0===(r=o.get(t))&&(r=new Set,o.set(t,r));r.has(n)||(r.add(n),e=xu.bind(null,e,t,n),t.then(e,e))}function vl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function yl(e,t,n,o,r){return 1&e.mode?(e.flags|=65536,e.lanes=r,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Fi(-1,1)).tag=2,Ui(n,t,1))),n.lanes|=1),e)}var bl=w.ReactCurrentOwner,wl=!1;function Sl(e,t,n,o){t.child=null===e?Zi(t,null,n,o):Xi(t,e.child,n,o)}function kl(e,t,n,o,r){n=n.render;var i=t.ref;return Ti(t,r),o=Ea(e,t,n,o,i,r),n=Ta(),null===e||wl?(ii&&n&&ti(t),t.flags|=1,Sl(e,t,o,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,$l(e,t,r))}function Cl(e,t,n,o,r){if(null===e){var i=n.type;return"function"!=typeof i||Du(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Uu(n.type,null,o,t,t.mode,r)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,El(e,t,i,o,r))}if(i=e.child,!(e.lanes&r)){var a=i.memoizedProps;if((n=null!==(n=n.compare)?n:so)(a,o)&&e.ref===t.ref)return $l(e,t,r)}return t.flags|=1,(e=Fu(i,o)).ref=t.ref,e.return=t,t.child=e}function El(e,t,n,o,r){if(null!==e){var i=e.memoizedProps;if(so(i,o)&&e.ref===t.ref){if(wl=!1,t.pendingProps=o=i,!(e.lanes&r))return t.lanes=e.lanes,$l(e,t,r);131072&e.flags&&(wl=!0)}}return Ml(e,t,n,o,r)}function Tl(e,t,n){var o=t.pendingProps,r=o.children,i=null!==e?e.memoizedState:null;if("hidden"===o.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==i?i.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Mr(Fs,Ds),Ds|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},o=null!==i?i.baseLanes:n,Mr(Fs,Ds),Ds|=o}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Mr(Fs,Ds),Ds|=n;else null!==i?(o=i.baseLanes|n,t.memoizedState=null):o=n,Mr(Fs,Ds),Ds|=o;return Sl(e,t,r,n),t.child}function xl(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Ml(e,t,n,o,r){var i=Dr(n)?Pr:Ir.current;return i=Nr(t,i),Ti(t,r),n=Ea(e,t,n,o,i,r),o=Ta(),null===e||wl?(ii&&o&&ti(t),t.flags|=1,Sl(e,t,n,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,$l(e,t,r))}function _l(e,t,n,o,r){if(Dr(n)){var i=!0;Ar(t)}else i=!1;if(Ti(t,r),null===t.stateNode)Wl(e,t),Wi(t,n,o),qi(t,n,o,r),o=!0;else if(null===e){var a=t.stateNode,l=t.memoizedProps;a.props=l;var s=a.context,u=n.contextType;u="object"==typeof u&&null!==u?xi(u):Nr(t,u=Dr(n)?Pr:Ir.current);var c=n.getDerivedStateFromProps,d="function"==typeof c||"function"==typeof a.getSnapshotBeforeUpdate;d||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(l!==o||s!==u)&&$i(t,a,o,u),Pi=!1;var f=t.memoizedState;a.state=f,Ri(t,o,a,r),s=t.memoizedState,l!==o||f!==s||Lr.current||Pi?("function"==typeof c&&(ji(t,n,c,o),s=t.memoizedState),(l=Pi||Hi(t,n,l,o,f,s,u))?(d||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||("function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"==typeof a.componentDidMount&&(t.flags|=4194308)):("function"==typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=o,t.memoizedState=s),a.props=o,a.state=s,a.context=u,o=l):("function"==typeof a.componentDidMount&&(t.flags|=4194308),o=!1)}else{a=t.stateNode,Di(e,t),l=t.memoizedProps,u=t.type===t.elementType?l:vi(t.type,l),a.props=u,d=t.pendingProps,f=a.context,s="object"==typeof(s=n.contextType)&&null!==s?xi(s):Nr(t,s=Dr(n)?Pr:Ir.current);var p=n.getDerivedStateFromProps;(c="function"==typeof p||"function"==typeof a.getSnapshotBeforeUpdate)||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(l!==d||f!==s)&&$i(t,a,o,s),Pi=!1,f=t.memoizedState,a.state=f,Ri(t,o,a,r);var m=t.memoizedState;l!==d||f!==m||Lr.current||Pi?("function"==typeof p&&(ji(t,n,p,o),m=t.memoizedState),(u=Pi||Hi(t,n,u,o,f,m,s)||!1)?(c||"function"!=typeof a.UNSAFE_componentWillUpdate&&"function"!=typeof a.componentWillUpdate||("function"==typeof a.componentWillUpdate&&a.componentWillUpdate(o,m,s),"function"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(o,m,s)),"function"==typeof a.componentDidUpdate&&(t.flags|=4),"function"==typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof a.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=o,t.memoizedState=m),a.props=o,a.state=m,a.context=s,o=u):("function"!=typeof a.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),o=!1)}return Il(e,t,n,o,i,r)}function Il(e,t,n,o,r,i){xl(e,t);var a=!!(128&t.flags);if(!o&&!a)return r&&Rr(t,n,!1),$l(e,t,i);o=t.stateNode,bl.current=t;var l=a&&"function"!=typeof n.getDerivedStateFromError?null:o.render();return t.flags|=1,null!==e&&a?(t.child=Xi(t,e.child,null,i),t.child=Xi(t,null,l,i)):Sl(e,t,l,i),t.memoizedState=o.state,r&&Rr(t,n,!0),t.child}function Ll(e){var t=e.stateNode;t.pendingContext?Ur(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Ur(0,t.context,!1),ra(e,t.containerInfo)}function Pl(e,t,n,o,r){return mi(),hi(r),t.flags|=256,Sl(e,t,n,o),t.child}var Nl,Dl,Fl,Ul,Ol={dehydrated:null,treeContext:null,retryLane:0};function Al(e){return{baseLanes:e,cachePool:null,transitions:null}}function Rl(e,t,n){var o,r=t.pendingProps,a=sa.current,l=!1,s=!!(128&t.flags);if((o=s)||(o=(null===e||null!==e.memoizedState)&&!!(2&a)),o?(l=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(a|=1),Mr(sa,1&a),null===e)return ci(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(s=r.children,e=r.fallback,l?(r=t.mode,l=t.child,s={mode:"hidden",children:s},1&r||null===l?l=Au(s,r,0,null):(l.childLanes=0,l.pendingProps=s),e=Ou(e,r,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Al(n),t.memoizedState=Ol,e):zl(t,s));if(null!==(a=e.memoizedState)&&null!==(o=a.dehydrated))return function(e,t,n,o,r,a,l){if(n)return 256&t.flags?(t.flags&=-257,Vl(e,t,l,o=dl(Error(i(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(a=o.fallback,r=t.mode,o=Au({mode:"visible",children:o.children},r,0,null),(a=Ou(a,r,l,null)).flags|=2,o.return=t,a.return=t,o.sibling=a,t.child=o,1&t.mode&&Xi(t,e.child,null,l),t.child.memoizedState=Al(l),t.memoizedState=Ol,a);if(!(1&t.mode))return Vl(e,t,l,null);if("$!"===r.data){if(o=r.nextSibling&&r.nextSibling.dataset)var s=o.dgst;return o=s,Vl(e,t,l,o=dl(a=Error(i(419)),o,void 0))}if(s=!!(l&e.childLanes),wl||s){if(null!==(o=Ls)){switch(l&-l){case 4:r=2;break;case 16:r=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:r=32;break;case 536870912:r=268435456;break;default:r=0}0!==(r=r&(o.suspendedLanes|l)?0:r)&&r!==a.retryLane&&(a.retryLane=r,Li(e,r),ou(o,e,r,-1))}return gu(),Vl(e,t,l,o=dl(Error(i(421))))}return"$?"===r.data?(t.flags|=128,t.child=e.child,t=_u.bind(null,e),r._reactRetry=t,null):(e=a.treeContext,ri=cr(r.nextSibling),oi=t,ii=!0,ai=null,null!==e&&(Qr[Kr++]=Xr,Qr[Kr++]=Zr,Qr[Kr++]=Gr,Xr=e.id,Zr=e.overflow,Gr=t),(t=zl(t,o.children)).flags|=4096,t)}(e,t,s,r,o,a,n);if(l){l=r.fallback,s=t.mode,o=(a=e.child).sibling;var u={mode:"hidden",children:r.children};return 1&s||t.child===a?(r=Fu(a,u)).subtreeFlags=14680064&a.subtreeFlags:((r=t.child).childLanes=0,r.pendingProps=u,t.deletions=null),null!==o?l=Fu(o,l):(l=Ou(l,s,n,null)).flags|=2,l.return=t,r.return=t,r.sibling=l,t.child=r,r=l,l=t.child,s=null===(s=e.child.memoizedState)?Al(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},l.memoizedState=s,l.childLanes=e.childLanes&~n,t.memoizedState=Ol,r}return e=(l=e.child).sibling,r=Fu(l,{mode:"visible",children:r.children}),!(1&t.mode)&&(r.lanes=n),r.return=t,r.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function zl(e,t){return(t=Au({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Vl(e,t,n,o){return null!==o&&hi(o),Xi(t,e.child,null,n),(e=zl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function jl(e,t,n){e.lanes|=t;var o=e.alternate;null!==o&&(o.lanes|=t),Ei(e.return,t,n)}function Bl(e,t,n,o,r){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:o,tail:n,tailMode:r}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=o,i.tail=n,i.tailMode=r)}function Hl(e,t,n){var o=t.pendingProps,r=o.revealOrder,i=o.tail;if(Sl(e,t,o.children,n),2&(o=sa.current))o=1&o|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&jl(e,n,t);else if(19===e.tag)jl(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}o&=1}if(Mr(sa,o),1&t.mode)switch(r){case"forwards":for(n=t.child,r=null;null!==n;)null!==(e=n.alternate)&&null===ua(e)&&(r=n),n=n.sibling;null===(n=r)?(r=t.child,t.child=null):(r=n.sibling,n.sibling=null),Bl(t,!1,r,n,i);break;case"backwards":for(n=null,r=t.child,t.child=null;null!==r;){if(null!==(e=r.alternate)&&null===ua(e)){t.child=r;break}e=r.sibling,r.sibling=n,n=r,r=e}Bl(t,!0,n,null,i);break;case"together":Bl(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function Wl(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function $l(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),As|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Fu(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Fu(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function ql(e,t){if(!ii)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var o=null;null!==n;)null!==n.alternate&&(o=n),n=n.sibling;null===o?t||null===e.tail?e.tail=null:e.tail.sibling=null:o.sibling=null}}function Yl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,o=0;if(t)for(var r=e.child;null!==r;)n|=r.lanes|r.childLanes,o|=14680064&r.subtreeFlags,o|=14680064&r.flags,r.return=e,r=r.sibling;else for(r=e.child;null!==r;)n|=r.lanes|r.childLanes,o|=r.subtreeFlags,o|=r.flags,r.return=e,r=r.sibling;return e.subtreeFlags|=o,e.childLanes=n,t}function Ql(e,t,n){var o=t.pendingProps;switch(ni(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Yl(t),null;case 1:case 17:return Dr(t.type)&&Fr(),Yl(t),null;case 3:return o=t.stateNode,ia(),xr(Lr),xr(Ir),da(),o.pendingContext&&(o.context=o.pendingContext,o.pendingContext=null),null!==e&&null!==e.child||(fi(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==ai&&(lu(ai),ai=null))),Dl(e,t),Yl(t),null;case 5:la(t);var r=oa(na.current);if(n=t.type,null!==e&&null!=t.stateNode)Fl(e,t,n,o,r),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!o){if(null===t.stateNode)throw Error(i(166));return Yl(t),null}if(e=oa(ea.current),fi(t)){o=t.stateNode,n=t.type;var a=t.memoizedProps;switch(o[pr]=t,o[mr]=a,e=!!(1&t.mode),n){case"dialog":Vo("cancel",o),Vo("close",o);break;case"iframe":case"object":case"embed":Vo("load",o);break;case"video":case"audio":for(r=0;r<Oo.length;r++)Vo(Oo[r],o);break;case"source":Vo("error",o);break;case"img":case"image":case"link":Vo("error",o),Vo("load",o);break;case"details":Vo("toggle",o);break;case"input":G(o,a),Vo("invalid",o);break;case"select":o._wrapperState={wasMultiple:!!a.multiple},Vo("invalid",o);break;case"textarea":re(o,a),Vo("invalid",o)}for(var s in ye(n,a),r=null,a)if(a.hasOwnProperty(s)){var u=a[s];"children"===s?"string"==typeof u?o.textContent!==u&&(!0!==a.suppressHydrationWarning&&Jo(o.textContent,u,e),r=["children",u]):"number"==typeof u&&o.textContent!==""+u&&(!0!==a.suppressHydrationWarning&&Jo(o.textContent,u,e),r=["children",""+u]):l.hasOwnProperty(s)&&null!=u&&"onScroll"===s&&Vo("scroll",o)}switch(n){case"input":q(o),J(o,a,!0);break;case"textarea":q(o),ae(o);break;case"select":case"option":break;default:"function"==typeof a.onClick&&(o.onclick=er)}o=r,t.updateQueue=o,null!==o&&(t.flags|=4)}else{s=9===r.nodeType?r:r.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=le(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=s.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof o.is?e=s.createElement(n,{is:o.is}):(e=s.createElement(n),"select"===n&&(s=e,o.multiple?s.multiple=!0:o.size&&(s.size=o.size))):e=s.createElementNS(e,n),e[pr]=t,e[mr]=o,Nl(e,t,!1,!1),t.stateNode=e;e:{switch(s=be(n,o),n){case"dialog":Vo("cancel",e),Vo("close",e),r=o;break;case"iframe":case"object":case"embed":Vo("load",e),r=o;break;case"video":case"audio":for(r=0;r<Oo.length;r++)Vo(Oo[r],e);r=o;break;case"source":Vo("error",e),r=o;break;case"img":case"image":case"link":Vo("error",e),Vo("load",e),r=o;break;case"details":Vo("toggle",e),r=o;break;case"input":G(e,o),r=K(e,o),Vo("invalid",e);break;case"option":default:r=o;break;case"select":e._wrapperState={wasMultiple:!!o.multiple},r=A({},o,{value:void 0}),Vo("invalid",e);break;case"textarea":re(e,o),r=oe(e,o),Vo("invalid",e)}for(a in ye(n,r),u=r)if(u.hasOwnProperty(a)){var c=u[a];"style"===a?ge(e,c):"dangerouslySetInnerHTML"===a?null!=(c=c?c.__html:void 0)&&de(e,c):"children"===a?"string"==typeof c?("textarea"!==n||""!==c)&&fe(e,c):"number"==typeof c&&fe(e,""+c):"suppressContentEditableWarning"!==a&&"suppressHydrationWarning"!==a&&"autoFocus"!==a&&(l.hasOwnProperty(a)?null!=c&&"onScroll"===a&&Vo("scroll",e):null!=c&&b(e,a,c,s))}switch(n){case"input":q(e),J(e,o,!1);break;case"textarea":q(e),ae(e);break;case"option":null!=o.value&&e.setAttribute("value",""+W(o.value));break;case"select":e.multiple=!!o.multiple,null!=(a=o.value)?ne(e,!!o.multiple,a,!1):null!=o.defaultValue&&ne(e,!!o.multiple,o.defaultValue,!0);break;default:"function"==typeof r.onClick&&(e.onclick=er)}switch(n){case"button":case"input":case"select":case"textarea":o=!!o.autoFocus;break e;case"img":o=!0;break e;default:o=!1}}o&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Yl(t),null;case 6:if(e&&null!=t.stateNode)Ul(e,t,e.memoizedProps,o);else{if("string"!=typeof o&&null===t.stateNode)throw Error(i(166));if(n=oa(na.current),oa(ea.current),fi(t)){if(o=t.stateNode,n=t.memoizedProps,o[pr]=t,(a=o.nodeValue!==n)&&null!==(e=oi))switch(e.tag){case 3:Jo(o.nodeValue,n,!!(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Jo(o.nodeValue,n,!!(1&e.mode))}a&&(t.flags|=4)}else(o=(9===n.nodeType?n:n.ownerDocument).createTextNode(o))[pr]=t,t.stateNode=o}return Yl(t),null;case 13:if(xr(sa),o=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(ii&&null!==ri&&1&t.mode&&!(128&t.flags))pi(),mi(),t.flags|=98560,a=!1;else if(a=fi(t),null!==o&&null!==o.dehydrated){if(null===e){if(!a)throw Error(i(318));if(!(a=null!==(a=t.memoizedState)?a.dehydrated:null))throw Error(i(317));a[pr]=t}else mi(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Yl(t),a=!1}else null!==ai&&(lu(ai),ai=null),a=!0;if(!a)return 65536&t.flags?t:null}return 128&t.flags?(t.lanes=n,t):((o=null!==o)!=(null!==e&&null!==e.memoizedState)&&o&&(t.child.flags|=8192,1&t.mode&&(null===e||1&sa.current?0===Us&&(Us=3):gu())),null!==t.updateQueue&&(t.flags|=4),Yl(t),null);case 4:return ia(),Dl(e,t),null===e&&Ho(t.stateNode.containerInfo),Yl(t),null;case 10:return Ci(t.type._context),Yl(t),null;case 19:if(xr(sa),null===(a=t.memoizedState))return Yl(t),null;if(o=!!(128&t.flags),null===(s=a.rendering))if(o)ql(a,!1);else{if(0!==Us||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(s=ua(e))){for(t.flags|=128,ql(a,!1),null!==(o=s.updateQueue)&&(t.updateQueue=o,t.flags|=4),t.subtreeFlags=0,o=n,n=t.child;null!==n;)e=o,(a=n).flags&=14680066,null===(s=a.alternate)?(a.childLanes=0,a.lanes=e,a.child=null,a.subtreeFlags=0,a.memoizedProps=null,a.memoizedState=null,a.updateQueue=null,a.dependencies=null,a.stateNode=null):(a.childLanes=s.childLanes,a.lanes=s.lanes,a.child=s.child,a.subtreeFlags=0,a.deletions=null,a.memoizedProps=s.memoizedProps,a.memoizedState=s.memoizedState,a.updateQueue=s.updateQueue,a.type=s.type,e=s.dependencies,a.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return Mr(sa,1&sa.current|2),t.child}e=e.sibling}null!==a.tail&&Xe()>Hs&&(t.flags|=128,o=!0,ql(a,!1),t.lanes=4194304)}else{if(!o)if(null!==(e=ua(s))){if(t.flags|=128,o=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),ql(a,!0),null===a.tail&&"hidden"===a.tailMode&&!s.alternate&&!ii)return Yl(t),null}else 2*Xe()-a.renderingStartTime>Hs&&1073741824!==n&&(t.flags|=128,o=!0,ql(a,!1),t.lanes=4194304);a.isBackwards?(s.sibling=t.child,t.child=s):(null!==(n=a.last)?n.sibling=s:t.child=s,a.last=s)}return null!==a.tail?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=Xe(),t.sibling=null,n=sa.current,Mr(sa,o?1&n|2:1&n),t):(Yl(t),null);case 22:case 23:return fu(),o=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==o&&(t.flags|=8192),o&&1&t.mode?!!(1073741824&Ds)&&(Yl(t),6&t.subtreeFlags&&(t.flags|=8192)):Yl(t),null;case 24:case 25:return null}throw Error(i(156,t.tag))}function Kl(e,t){switch(ni(t),t.tag){case 1:return Dr(t.type)&&Fr(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ia(),xr(Lr),xr(Ir),da(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return la(t),null;case 13:if(xr(sa),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(i(340));mi()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return xr(sa),null;case 4:return ia(),null;case 10:return Ci(t.type._context),null;case 22:case 23:return fu(),null;default:return null}}Nl=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Dl=function(){},Fl=function(e,t,n,o){var r=e.memoizedProps;if(r!==o){e=t.stateNode,oa(ea.current);var i,a=null;switch(n){case"input":r=K(e,r),o=K(e,o),a=[];break;case"select":r=A({},r,{value:void 0}),o=A({},o,{value:void 0}),a=[];break;case"textarea":r=oe(e,r),o=oe(e,o),a=[];break;default:"function"!=typeof r.onClick&&"function"==typeof o.onClick&&(e.onclick=er)}for(c in ye(n,o),n=null,r)if(!o.hasOwnProperty(c)&&r.hasOwnProperty(c)&&null!=r[c])if("style"===c){var s=r[c];for(i in s)s.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==c&&"children"!==c&&"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&"autoFocus"!==c&&(l.hasOwnProperty(c)?a||(a=[]):(a=a||[]).push(c,null));for(c in o){var u=o[c];if(s=null!=r?r[c]:void 0,o.hasOwnProperty(c)&&u!==s&&(null!=u||null!=s))if("style"===c)if(s){for(i in s)!s.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&s[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(a||(a=[]),a.push(c,n)),n=u;else"dangerouslySetInnerHTML"===c?(u=u?u.__html:void 0,s=s?s.__html:void 0,null!=u&&s!==u&&(a=a||[]).push(c,u)):"children"===c?"string"!=typeof u&&"number"!=typeof u||(a=a||[]).push(c,""+u):"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&(l.hasOwnProperty(c)?(null!=u&&"onScroll"===c&&Vo("scroll",e),a||s===u||(a=[])):(a=a||[]).push(c,u))}n&&(a=a||[]).push("style",n);var c=a;(t.updateQueue=c)&&(t.flags|=4)}},Ul=function(e,t,n,o){n!==o&&(t.flags|=4)};var Gl=!1,Xl=!1,Zl="function"==typeof WeakSet?WeakSet:Set,Jl=null;function es(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(n){Tu(e,t,n)}else n.current=null}function ts(e,t,n){try{n()}catch(n){Tu(e,t,n)}}var ns=!1;function os(e,t,n){var o=t.updateQueue;if(null!==(o=null!==o?o.lastEffect:null)){var r=o=o.next;do{if((r.tag&e)===e){var i=r.destroy;r.destroy=void 0,void 0!==i&&ts(t,n,i)}r=r.next}while(r!==o)}}function rs(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var o=n.create;n.destroy=o()}n=n.next}while(n!==t)}}function is(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function as(e){var t=e.alternate;null!==t&&(e.alternate=null,as(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&null!==(t=e.stateNode)&&(delete t[pr],delete t[mr],delete t[gr],delete t[vr],delete t[yr]),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function ls(e){return 5===e.tag||3===e.tag||4===e.tag}function ss(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||ls(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function us(e,t,n){var o=e.tag;if(5===o||6===o)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=er));else if(4!==o&&null!==(e=e.child))for(us(e,t,n),e=e.sibling;null!==e;)us(e,t,n),e=e.sibling}function cs(e,t,n){var o=e.tag;if(5===o||6===o)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==o&&null!==(e=e.child))for(cs(e,t,n),e=e.sibling;null!==e;)cs(e,t,n),e=e.sibling}var ds=null,fs=!1;function ps(e,t,n){for(n=n.child;null!==n;)ms(e,t,n),n=n.sibling}function ms(e,t,n){if(it&&"function"==typeof it.onCommitFiberUnmount)try{it.onCommitFiberUnmount(rt,n)}catch(e){}switch(n.tag){case 5:Xl||es(n,t);case 6:var o=ds,r=fs;ds=null,ps(e,t,n),fs=r,null!==(ds=o)&&(fs?(e=ds,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):ds.removeChild(n.stateNode));break;case 18:null!==ds&&(fs?(e=ds,n=n.stateNode,8===e.nodeType?ur(e.parentNode,n):1===e.nodeType&&ur(e,n),Bt(e)):ur(ds,n.stateNode));break;case 4:o=ds,r=fs,ds=n.stateNode.containerInfo,fs=!0,ps(e,t,n),ds=o,fs=r;break;case 0:case 11:case 14:case 15:if(!Xl&&null!==(o=n.updateQueue)&&null!==(o=o.lastEffect)){r=o=o.next;do{var i=r,a=i.destroy;i=i.tag,void 0!==a&&(2&i||4&i)&&ts(n,t,a),r=r.next}while(r!==o)}ps(e,t,n);break;case 1:if(!Xl&&(es(n,t),"function"==typeof(o=n.stateNode).componentWillUnmount))try{o.props=n.memoizedProps,o.state=n.memoizedState,o.componentWillUnmount()}catch(e){Tu(n,t,e)}ps(e,t,n);break;case 21:ps(e,t,n);break;case 22:1&n.mode?(Xl=(o=Xl)||null!==n.memoizedState,ps(e,t,n),Xl=o):ps(e,t,n);break;default:ps(e,t,n)}}function hs(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Zl),t.forEach((function(t){var o=Iu.bind(null,e,t);n.has(t)||(n.add(t),t.then(o,o))}))}}function gs(e,t){var n=t.deletions;if(null!==n)for(var o=0;o<n.length;o++){var r=n[o];try{var a=e,l=t,s=l;e:for(;null!==s;){switch(s.tag){case 5:ds=s.stateNode,fs=!1;break e;case 3:case 4:ds=s.stateNode.containerInfo,fs=!0;break e}s=s.return}if(null===ds)throw Error(i(160));ms(a,l,r),ds=null,fs=!1;var u=r.alternate;null!==u&&(u.return=null),r.return=null}catch(e){Tu(r,t,e)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)vs(t,e),t=t.sibling}function vs(e,t){var n=e.alternate,o=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(gs(t,e),ys(e),4&o){try{os(3,e,e.return),rs(3,e)}catch(t){Tu(e,e.return,t)}try{os(5,e,e.return)}catch(t){Tu(e,e.return,t)}}break;case 1:gs(t,e),ys(e),512&o&&null!==n&&es(n,n.return);break;case 5:if(gs(t,e),ys(e),512&o&&null!==n&&es(n,n.return),32&e.flags){var r=e.stateNode;try{fe(r,"")}catch(t){Tu(e,e.return,t)}}if(4&o&&null!=(r=e.stateNode)){var a=e.memoizedProps,l=null!==n?n.memoizedProps:a,s=e.type,u=e.updateQueue;if(e.updateQueue=null,null!==u)try{"input"===s&&"radio"===a.type&&null!=a.name&&X(r,a),be(s,l);var c=be(s,a);for(l=0;l<u.length;l+=2){var d=u[l],f=u[l+1];"style"===d?ge(r,f):"dangerouslySetInnerHTML"===d?de(r,f):"children"===d?fe(r,f):b(r,d,f,c)}switch(s){case"input":Z(r,a);break;case"textarea":ie(r,a);break;case"select":var p=r._wrapperState.wasMultiple;r._wrapperState.wasMultiple=!!a.multiple;var m=a.value;null!=m?ne(r,!!a.multiple,m,!1):p!==!!a.multiple&&(null!=a.defaultValue?ne(r,!!a.multiple,a.defaultValue,!0):ne(r,!!a.multiple,a.multiple?[]:"",!1))}r[mr]=a}catch(t){Tu(e,e.return,t)}}break;case 6:if(gs(t,e),ys(e),4&o){if(null===e.stateNode)throw Error(i(162));r=e.stateNode,a=e.memoizedProps;try{r.nodeValue=a}catch(t){Tu(e,e.return,t)}}break;case 3:if(gs(t,e),ys(e),4&o&&null!==n&&n.memoizedState.isDehydrated)try{Bt(t.containerInfo)}catch(t){Tu(e,e.return,t)}break;case 4:default:gs(t,e),ys(e);break;case 13:gs(t,e),ys(e),8192&(r=e.child).flags&&(a=null!==r.memoizedState,r.stateNode.isHidden=a,!a||null!==r.alternate&&null!==r.alternate.memoizedState||(Bs=Xe())),4&o&&hs(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Xl=(c=Xl)||d,gs(t,e),Xl=c):gs(t,e),ys(e),8192&o){if(c=null!==e.memoizedState,(e.stateNode.isHidden=c)&&!d&&1&e.mode)for(Jl=e,d=e.child;null!==d;){for(f=Jl=d;null!==Jl;){switch(m=(p=Jl).child,p.tag){case 0:case 11:case 14:case 15:os(4,p,p.return);break;case 1:es(p,p.return);var h=p.stateNode;if("function"==typeof h.componentWillUnmount){o=p,n=p.return;try{t=o,h.props=t.memoizedProps,h.state=t.memoizedState,h.componentWillUnmount()}catch(e){Tu(o,n,e)}}break;case 5:es(p,p.return);break;case 22:if(null!==p.memoizedState){ks(f);continue}}null!==m?(m.return=p,Jl=m):ks(f)}d=d.sibling}e:for(d=null,f=e;;){if(5===f.tag){if(null===d){d=f;try{r=f.stateNode,c?"function"==typeof(a=r.style).setProperty?a.setProperty("display","none","important"):a.display="none":(s=f.stateNode,l=null!=(u=f.memoizedProps.style)&&u.hasOwnProperty("display")?u.display:null,s.style.display=he("display",l))}catch(t){Tu(e,e.return,t)}}}else if(6===f.tag){if(null===d)try{f.stateNode.nodeValue=c?"":f.memoizedProps}catch(t){Tu(e,e.return,t)}}else if((22!==f.tag&&23!==f.tag||null===f.memoizedState||f===e)&&null!==f.child){f.child.return=f,f=f.child;continue}if(f===e)break e;for(;null===f.sibling;){if(null===f.return||f.return===e)break e;d===f&&(d=null),f=f.return}d===f&&(d=null),f.sibling.return=f.return,f=f.sibling}}break;case 19:gs(t,e),ys(e),4&o&&hs(e);case 21:}}function ys(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(ls(n)){var o=n;break e}n=n.return}throw Error(i(160))}switch(o.tag){case 5:var r=o.stateNode;32&o.flags&&(fe(r,""),o.flags&=-33),cs(e,ss(e),r);break;case 3:case 4:var a=o.stateNode.containerInfo;us(e,ss(e),a);break;default:throw Error(i(161))}}catch(t){Tu(e,e.return,t)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function bs(e,t,n){Jl=e,ws(e,t,n)}function ws(e,t,n){for(var o=!!(1&e.mode);null!==Jl;){var r=Jl,i=r.child;if(22===r.tag&&o){var a=null!==r.memoizedState||Gl;if(!a){var l=r.alternate,s=null!==l&&null!==l.memoizedState||Xl;l=Gl;var u=Xl;if(Gl=a,(Xl=s)&&!u)for(Jl=r;null!==Jl;)s=(a=Jl).child,22===a.tag&&null!==a.memoizedState?Cs(r):null!==s?(s.return=a,Jl=s):Cs(r);for(;null!==i;)Jl=i,ws(i,t,n),i=i.sibling;Jl=r,Gl=l,Xl=u}Ss(e)}else 8772&r.subtreeFlags&&null!==i?(i.return=r,Jl=i):Ss(e)}}function Ss(e){for(;null!==Jl;){var t=Jl;if(8772&t.flags){var n=t.alternate;try{if(8772&t.flags)switch(t.tag){case 0:case 11:case 15:Xl||rs(5,t);break;case 1:var o=t.stateNode;if(4&t.flags&&!Xl)if(null===n)o.componentDidMount();else{var r=t.elementType===t.type?n.memoizedProps:vi(t.type,n.memoizedProps);o.componentDidUpdate(r,n.memoizedState,o.__reactInternalSnapshotBeforeUpdate)}var a=t.updateQueue;null!==a&&zi(t,a,o);break;case 3:var l=t.updateQueue;if(null!==l){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}zi(t,l,n)}break;case 5:var s=t.stateNode;if(null===n&&4&t.flags){n=s;var u=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":u.autoFocus&&n.focus();break;case"img":u.src&&(n.src=u.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var c=t.alternate;if(null!==c){var d=c.memoizedState;if(null!==d){var f=d.dehydrated;null!==f&&Bt(f)}}}break;default:throw Error(i(163))}Xl||512&t.flags&&is(t)}catch(e){Tu(t,t.return,e)}}if(t===e){Jl=null;break}if(null!==(n=t.sibling)){n.return=t.return,Jl=n;break}Jl=t.return}}function ks(e){for(;null!==Jl;){var t=Jl;if(t===e){Jl=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Jl=n;break}Jl=t.return}}function Cs(e){for(;null!==Jl;){var t=Jl;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rs(4,t)}catch(e){Tu(t,n,e)}break;case 1:var o=t.stateNode;if("function"==typeof o.componentDidMount){var r=t.return;try{o.componentDidMount()}catch(e){Tu(t,r,e)}}var i=t.return;try{is(t)}catch(e){Tu(t,i,e)}break;case 5:var a=t.return;try{is(t)}catch(e){Tu(t,a,e)}}}catch(e){Tu(t,t.return,e)}if(t===e){Jl=null;break}var l=t.sibling;if(null!==l){l.return=t.return,Jl=l;break}Jl=t.return}}var Es,Ts=Math.ceil,xs=w.ReactCurrentDispatcher,Ms=w.ReactCurrentOwner,_s=w.ReactCurrentBatchConfig,Is=0,Ls=null,Ps=null,Ns=0,Ds=0,Fs=Tr(0),Us=0,Os=null,As=0,Rs=0,zs=0,Vs=null,js=null,Bs=0,Hs=1/0,Ws=null,$s=!1,qs=null,Ys=null,Qs=!1,Ks=null,Gs=0,Xs=0,Zs=null,Js=-1,eu=0;function tu(){return 6&Is?Xe():-1!==Js?Js:Js=Xe()}function nu(e){return 1&e.mode?2&Is&&0!==Ns?Ns&-Ns:null!==gi.transition?(0===eu&&(eu=ht()),eu):0!==(e=bt)?e:e=void 0===(e=window.event)?16:Gt(e.type):1}function ou(e,t,n,o){if(50<Xs)throw Xs=0,Zs=null,Error(i(185));vt(e,n,o),2&Is&&e===Ls||(e===Ls&&(!(2&Is)&&(Rs|=n),4===Us&&su(e,Ns)),ru(e,o),1===n&&0===Is&&!(1&t.mode)&&(Hs=Xe()+500,Vr&&Hr()))}function ru(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,o=e.pingedLanes,r=e.expirationTimes,i=e.pendingLanes;0<i;){var a=31-at(i),l=1<<a,s=r[a];-1===s?l&n&&!(l&o)||(r[a]=pt(l,t)):s<=t&&(e.expiredLanes|=l),i&=~l}}(e,t);var o=ft(e,e===Ls?Ns:0);if(0===o)null!==n&&Qe(n),e.callbackNode=null,e.callbackPriority=0;else if(t=o&-o,e.callbackPriority!==t){if(null!=n&&Qe(n),1===t)0===e.tag?function(e){Vr=!0,Br(e)}(uu.bind(null,e)):Br(uu.bind(null,e)),lr((function(){!(6&Is)&&Hr()})),n=null;else{switch(wt(o)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=ot}n=Lu(n,iu.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function iu(e,t){if(Js=-1,eu=0,6&Is)throw Error(i(327));var n=e.callbackNode;if(Cu()&&e.callbackNode!==n)return null;var o=ft(e,e===Ls?Ns:0);if(0===o)return null;if(30&o||o&e.expiredLanes||t)t=vu(e,o);else{t=o;var r=Is;Is|=2;var a=hu();for(Ls===e&&Ns===t||(Ws=null,Hs=Xe()+500,pu(e,t));;)try{bu();break}catch(t){mu(e,t)}ki(),xs.current=a,Is=r,null!==Ps?t=0:(Ls=null,Ns=0,t=Us)}if(0!==t){if(2===t&&0!==(r=mt(e))&&(o=r,t=au(e,r)),1===t)throw n=Os,pu(e,0),su(e,o),ru(e,Xe()),n;if(6===t)su(e,o);else{if(r=e.current.alternate,!(30&o||function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var o=0;o<n.length;o++){var r=n[o],i=r.getSnapshot;r=r.value;try{if(!lo(i(),r))return!1}catch(e){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(r)||(t=vu(e,o),2===t&&(a=mt(e),0!==a&&(o=a,t=au(e,a))),1!==t)))throw n=Os,pu(e,0),su(e,o),ru(e,Xe()),n;switch(e.finishedWork=r,e.finishedLanes=o,t){case 0:case 1:throw Error(i(345));case 2:case 5:ku(e,js,Ws);break;case 3:if(su(e,o),(130023424&o)===o&&10<(t=Bs+500-Xe())){if(0!==ft(e,0))break;if(((r=e.suspendedLanes)&o)!==o){tu(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=rr(ku.bind(null,e,js,Ws),t);break}ku(e,js,Ws);break;case 4:if(su(e,o),(4194240&o)===o)break;for(t=e.eventTimes,r=-1;0<o;){var l=31-at(o);a=1<<l,(l=t[l])>r&&(r=l),o&=~a}if(o=r,10<(o=(120>(o=Xe()-o)?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Ts(o/1960))-o)){e.timeoutHandle=rr(ku.bind(null,e,js,Ws),o);break}ku(e,js,Ws);break;default:throw Error(i(329))}}}return ru(e,Xe()),e.callbackNode===n?iu.bind(null,e):null}function au(e,t){var n=Vs;return e.current.memoizedState.isDehydrated&&(pu(e,t).flags|=256),2!==(e=vu(e,t))&&(t=js,js=n,null!==t&&lu(t)),e}function lu(e){null===js?js=e:js.push.apply(js,e)}function su(e,t){for(t&=~zs,t&=~Rs,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-at(t),o=1<<n;e[n]=-1,t&=~o}}function uu(e){if(6&Is)throw Error(i(327));Cu();var t=ft(e,0);if(!(1&t))return ru(e,Xe()),null;var n=vu(e,t);if(0!==e.tag&&2===n){var o=mt(e);0!==o&&(t=o,n=au(e,o))}if(1===n)throw n=Os,pu(e,0),su(e,t),ru(e,Xe()),n;if(6===n)throw Error(i(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,ku(e,js,Ws),ru(e,Xe()),null}function cu(e,t){var n=Is;Is|=1;try{return e(t)}finally{0===(Is=n)&&(Hs=Xe()+500,Vr&&Hr())}}function du(e){null!==Ks&&0===Ks.tag&&!(6&Is)&&Cu();var t=Is;Is|=1;var n=_s.transition,o=bt;try{if(_s.transition=null,bt=1,e)return e()}finally{bt=o,_s.transition=n,!(6&(Is=t))&&Hr()}}function fu(){Ds=Fs.current,xr(Fs)}function pu(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,ir(n)),null!==Ps)for(n=Ps.return;null!==n;){var o=n;switch(ni(o),o.tag){case 1:null!=(o=o.type.childContextTypes)&&Fr();break;case 3:ia(),xr(Lr),xr(Ir),da();break;case 5:la(o);break;case 4:ia();break;case 13:case 19:xr(sa);break;case 10:Ci(o.type._context);break;case 22:case 23:fu()}n=n.return}if(Ls=e,Ps=e=Fu(e.current,null),Ns=Ds=t,Us=0,Os=null,zs=Rs=As=0,js=Vs=null,null!==Mi){for(t=0;t<Mi.length;t++)if(null!==(o=(n=Mi[t]).interleaved)){n.interleaved=null;var r=o.next,i=n.pending;if(null!==i){var a=i.next;i.next=r,o.next=a}n.pending=o}Mi=null}return e}function mu(e,t){for(;;){var n=Ps;try{if(ki(),fa.current=al,ya){for(var o=ha.memoizedState;null!==o;){var r=o.queue;null!==r&&(r.pending=null),o=o.next}ya=!1}if(ma=0,va=ga=ha=null,ba=!1,wa=0,Ms.current=null,null===n||null===n.return){Us=1,Os=t,Ps=null;break}e:{var a=e,l=n.return,s=n,u=t;if(t=Ns,s.flags|=32768,null!==u&&"object"==typeof u&&"function"==typeof u.then){var c=u,d=s,f=d.tag;if(!(1&d.mode||0!==f&&11!==f&&15!==f)){var p=d.alternate;p?(d.updateQueue=p.updateQueue,d.memoizedState=p.memoizedState,d.lanes=p.lanes):(d.updateQueue=null,d.memoizedState=null)}var m=vl(l);if(null!==m){m.flags&=-257,yl(m,l,s,0,t),1&m.mode&&gl(a,c,t),u=c;var h=(t=m).updateQueue;if(null===h){var g=new Set;g.add(u),t.updateQueue=g}else h.add(u);break e}if(!(1&t)){gl(a,c,t),gu();break e}u=Error(i(426))}else if(ii&&1&s.mode){var v=vl(l);if(null!==v){!(65536&v.flags)&&(v.flags|=256),yl(v,l,s,0,t),hi(cl(u,s));break e}}a=u=cl(u,s),4!==Us&&(Us=2),null===Vs?Vs=[a]:Vs.push(a),a=l;do{switch(a.tag){case 3:a.flags|=65536,t&=-t,a.lanes|=t,Ai(a,ml(0,u,t));break e;case 1:s=u;var y=a.type,b=a.stateNode;if(!(128&a.flags||"function"!=typeof y.getDerivedStateFromError&&(null===b||"function"!=typeof b.componentDidCatch||null!==Ys&&Ys.has(b)))){a.flags|=65536,t&=-t,a.lanes|=t,Ai(a,hl(a,s,t));break e}}a=a.return}while(null!==a)}Su(n)}catch(e){t=e,Ps===n&&null!==n&&(Ps=n=n.return);continue}break}}function hu(){var e=xs.current;return xs.current=al,null===e?al:e}function gu(){0!==Us&&3!==Us&&2!==Us||(Us=4),null===Ls||!(268435455&As)&&!(268435455&Rs)||su(Ls,Ns)}function vu(e,t){var n=Is;Is|=2;var o=hu();for(Ls===e&&Ns===t||(Ws=null,pu(e,t));;)try{yu();break}catch(t){mu(e,t)}if(ki(),Is=n,xs.current=o,null!==Ps)throw Error(i(261));return Ls=null,Ns=0,Us}function yu(){for(;null!==Ps;)wu(Ps)}function bu(){for(;null!==Ps&&!Ke();)wu(Ps)}function wu(e){var t=Es(e.alternate,e,Ds);e.memoizedProps=e.pendingProps,null===t?Su(e):Ps=t,Ms.current=null}function Su(e){var t=e;do{var n=t.alternate;if(e=t.return,32768&t.flags){if(null!==(n=Kl(n,t)))return n.flags&=32767,void(Ps=n);if(null===e)return Us=6,void(Ps=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}else if(null!==(n=Ql(n,t,Ds)))return void(Ps=n);if(null!==(t=t.sibling))return void(Ps=t);Ps=t=e}while(null!==t);0===Us&&(Us=5)}function ku(e,t,n){var o=bt,r=_s.transition;try{_s.transition=null,bt=1,function(e,t,n,o){do{Cu()}while(null!==Ks);if(6&Is)throw Error(i(327));n=e.finishedWork;var r=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null,e.callbackPriority=0;var a=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0<n;){var r=31-at(n),i=1<<r;t[r]=0,o[r]=-1,e[r]=-1,n&=~i}}(e,a),e===Ls&&(Ps=Ls=null,Ns=0),!(2064&n.subtreeFlags)&&!(2064&n.flags)||Qs||(Qs=!0,Lu(tt,(function(){return Cu(),null}))),a=!!(15990&n.flags),15990&n.subtreeFlags||a){a=_s.transition,_s.transition=null;var l=bt;bt=1;var s=Is;Is|=4,Ms.current=null,function(e,t){if(tr=Wt,mo(e=po())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var o=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(o&&0!==o.rangeCount){n=o.anchorNode;var r=o.anchorOffset,a=o.focusNode;o=o.focusOffset;try{n.nodeType,a.nodeType}catch(e){n=null;break e}var l=0,s=-1,u=-1,c=0,d=0,f=e,p=null;t:for(;;){for(var m;f!==n||0!==r&&3!==f.nodeType||(s=l+r),f!==a||0!==o&&3!==f.nodeType||(u=l+o),3===f.nodeType&&(l+=f.nodeValue.length),null!==(m=f.firstChild);)p=f,f=m;for(;;){if(f===e)break t;if(p===n&&++c===r&&(s=l),p===a&&++d===o&&(u=l),null!==(m=f.nextSibling))break;p=(f=p).parentNode}f=m}n=-1===s||-1===u?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(nr={focusedElem:e,selectionRange:n},Wt=!1,Jl=t;null!==Jl;)if(e=(t=Jl).child,1028&t.subtreeFlags&&null!==e)e.return=t,Jl=e;else for(;null!==Jl;){t=Jl;try{var h=t.alternate;if(1024&t.flags)switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==h){var g=h.memoizedProps,v=h.memoizedState,y=t.stateNode,b=y.getSnapshotBeforeUpdate(t.elementType===t.type?g:vi(t.type,g),v);y.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var w=t.stateNode.containerInfo;1===w.nodeType?w.textContent="":9===w.nodeType&&w.documentElement&&w.removeChild(w.documentElement);break;default:throw Error(i(163))}}catch(e){Tu(t,t.return,e)}if(null!==(e=t.sibling)){e.return=t.return,Jl=e;break}Jl=t.return}h=ns,ns=!1}(e,n),vs(n,e),ho(nr),Wt=!!tr,nr=tr=null,e.current=n,bs(n,e,r),Ge(),Is=s,bt=l,_s.transition=a}else e.current=n;if(Qs&&(Qs=!1,Ks=e,Gs=r),0===(a=e.pendingLanes)&&(Ys=null),function(e){if(it&&"function"==typeof it.onCommitFiberRoot)try{it.onCommitFiberRoot(rt,e,void 0,!(128&~e.current.flags))}catch(e){}}(n.stateNode),ru(e,Xe()),null!==t)for(o=e.onRecoverableError,n=0;n<t.length;n++)o((r=t[n]).value,{componentStack:r.stack,digest:r.digest});if($s)throw $s=!1,e=qs,qs=null,e;!!(1&Gs)&&0!==e.tag&&Cu(),1&(a=e.pendingLanes)?e===Zs?Xs++:(Xs=0,Zs=e):Xs=0,Hr()}(e,t,n,o)}finally{_s.transition=r,bt=o}return null}function Cu(){if(null!==Ks){var e=wt(Gs),t=_s.transition,n=bt;try{if(_s.transition=null,bt=16>e?16:e,null===Ks)var o=!1;else{if(e=Ks,Ks=null,Gs=0,6&Is)throw Error(i(331));var r=Is;for(Is|=4,Jl=e.current;null!==Jl;){var a=Jl,l=a.child;if(16&Jl.flags){var s=a.deletions;if(null!==s){for(var u=0;u<s.length;u++){var c=s[u];for(Jl=c;null!==Jl;){var d=Jl;switch(d.tag){case 0:case 11:case 15:os(8,d,a)}var f=d.child;if(null!==f)f.return=d,Jl=f;else for(;null!==Jl;){var p=(d=Jl).sibling,m=d.return;if(as(d),d===c){Jl=null;break}if(null!==p){p.return=m,Jl=p;break}Jl=m}}}var h=a.alternate;if(null!==h){var g=h.child;if(null!==g){h.child=null;do{var v=g.sibling;g.sibling=null,g=v}while(null!==g)}}Jl=a}}if(2064&a.subtreeFlags&&null!==l)l.return=a,Jl=l;else e:for(;null!==Jl;){if(2048&(a=Jl).flags)switch(a.tag){case 0:case 11:case 15:os(9,a,a.return)}var y=a.sibling;if(null!==y){y.return=a.return,Jl=y;break e}Jl=a.return}}var b=e.current;for(Jl=b;null!==Jl;){var w=(l=Jl).child;if(2064&l.subtreeFlags&&null!==w)w.return=l,Jl=w;else e:for(l=b;null!==Jl;){if(2048&(s=Jl).flags)try{switch(s.tag){case 0:case 11:case 15:rs(9,s)}}catch(e){Tu(s,s.return,e)}if(s===l){Jl=null;break e}var S=s.sibling;if(null!==S){S.return=s.return,Jl=S;break e}Jl=s.return}}if(Is=r,Hr(),it&&"function"==typeof it.onPostCommitFiberRoot)try{it.onPostCommitFiberRoot(rt,e)}catch(e){}o=!0}return o}finally{bt=n,_s.transition=t}}return!1}function Eu(e,t,n){e=Ui(e,t=ml(0,t=cl(n,t),1),1),t=tu(),null!==e&&(vt(e,1,t),ru(e,t))}function Tu(e,t,n){if(3===e.tag)Eu(e,e,n);else for(;null!==t;){if(3===t.tag){Eu(t,e,n);break}if(1===t.tag){var o=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof o.componentDidCatch&&(null===Ys||!Ys.has(o))){t=Ui(t,e=hl(t,e=cl(n,e),1),1),e=tu(),null!==t&&(vt(t,1,e),ru(t,e));break}}t=t.return}}function xu(e,t,n){var o=e.pingCache;null!==o&&o.delete(t),t=tu(),e.pingedLanes|=e.suspendedLanes&n,Ls===e&&(Ns&n)===n&&(4===Us||3===Us&&(130023424&Ns)===Ns&&500>Xe()-Bs?pu(e,0):zs|=n),ru(e,t)}function Mu(e,t){0===t&&(1&e.mode?(t=ct,!(130023424&(ct<<=1))&&(ct=4194304)):t=1);var n=tu();null!==(e=Li(e,t))&&(vt(e,t,n),ru(e,n))}function _u(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Mu(e,n)}function Iu(e,t){var n=0;switch(e.tag){case 13:var o=e.stateNode,r=e.memoizedState;null!==r&&(n=r.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(i(314))}null!==o&&o.delete(t),Mu(e,n)}function Lu(e,t){return Ye(e,t)}function Pu(e,t,n,o){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Nu(e,t,n,o){return new Pu(e,t,n,o)}function Du(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Fu(e,t){var n=e.alternate;return null===n?((n=Nu(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Uu(e,t,n,o,r,a){var l=2;if(o=e,"function"==typeof e)Du(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case C:return Ou(n.children,r,a,t);case E:l=8,r|=8;break;case T:return(e=Nu(12,n,t,2|r)).elementType=T,e.lanes=a,e;case I:return(e=Nu(13,n,t,r)).elementType=I,e.lanes=a,e;case L:return(e=Nu(19,n,t,r)).elementType=L,e.lanes=a,e;case D:return Au(n,r,a,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case x:l=10;break e;case M:l=9;break e;case _:l=11;break e;case P:l=14;break e;case N:l=16,o=null;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Nu(l,n,t,r)).elementType=e,t.type=o,t.lanes=a,t}function Ou(e,t,n,o){return(e=Nu(7,e,o,t)).lanes=n,e}function Au(e,t,n,o){return(e=Nu(22,e,o,t)).elementType=D,e.lanes=n,e.stateNode={isHidden:!1},e}function Ru(e,t,n){return(e=Nu(6,e,null,t)).lanes=n,e}function zu(e,t,n){return(t=Nu(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Vu(e,t,n,o,r){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=o,this.onRecoverableError=r,this.mutableSourceEagerHydrationData=null}function ju(e,t,n,o,r,i,a,l,s){return e=new Vu(e,t,n,l,s),1===t?(t=1,!0===i&&(t|=8)):t=0,i=Nu(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:o,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ni(i),e}function Bu(e){if(!e)return _r;e:{if(Be(e=e._reactInternals)!==e||1!==e.tag)throw Error(i(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Dr(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(i(171))}if(1===e.tag){var n=e.type;if(Dr(n))return Or(e,n,t)}return t}function Hu(e,t,n,o,r,i,a,l,s){return(e=ju(n,o,!0,e,0,i,0,l,s)).context=Bu(null),n=e.current,(i=Fi(o=tu(),r=nu(n))).callback=null!=t?t:null,Ui(n,i,r),e.current.lanes=r,vt(e,r,o),ru(e,o),e}function Wu(e,t,n,o){var r=t.current,i=tu(),a=nu(r);return n=Bu(n),null===t.context?t.context=n:t.pendingContext=n,(t=Fi(i,a)).payload={element:e},null!==(o=void 0===o?null:o)&&(t.callback=o),null!==(e=Ui(r,t,a))&&(ou(e,r,a,i),Oi(e,r,a)),a}function $u(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function qu(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Yu(e,t){qu(e,t),(e=e.alternate)&&qu(e,t)}Es=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Lr.current)wl=!0;else{if(!(e.lanes&n||128&t.flags))return wl=!1,function(e,t,n){switch(t.tag){case 3:Ll(t),mi();break;case 5:aa(t);break;case 1:Dr(t.type)&&Ar(t);break;case 4:ra(t,t.stateNode.containerInfo);break;case 10:var o=t.type._context,r=t.memoizedProps.value;Mr(yi,o._currentValue),o._currentValue=r;break;case 13:if(null!==(o=t.memoizedState))return null!==o.dehydrated?(Mr(sa,1&sa.current),t.flags|=128,null):n&t.child.childLanes?Rl(e,t,n):(Mr(sa,1&sa.current),null!==(e=$l(e,t,n))?e.sibling:null);Mr(sa,1&sa.current);break;case 19:if(o=!!(n&t.childLanes),128&e.flags){if(o)return Hl(e,t,n);t.flags|=128}if(null!==(r=t.memoizedState)&&(r.rendering=null,r.tail=null,r.lastEffect=null),Mr(sa,sa.current),o)break;return null;case 22:case 23:return t.lanes=0,Tl(e,t,n)}return $l(e,t,n)}(e,t,n);wl=!!(131072&e.flags)}else wl=!1,ii&&1048576&t.flags&&ei(t,Yr,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;Wl(e,t),e=t.pendingProps;var r=Nr(t,Ir.current);Ti(t,n),r=Ea(null,t,o,e,r,n);var a=Ta();return t.flags|=1,"object"==typeof r&&null!==r&&"function"==typeof r.render&&void 0===r.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Dr(o)?(a=!0,Ar(t)):a=!1,t.memoizedState=null!==r.state&&void 0!==r.state?r.state:null,Ni(t),r.updater=Bi,t.stateNode=r,r._reactInternals=t,qi(t,o,e,n),t=Il(null,t,o,!0,a,n)):(t.tag=0,ii&&a&&ti(t),Sl(null,t,r,n),t=t.child),t;case 16:o=t.elementType;e:{switch(Wl(e,t),e=t.pendingProps,o=(r=o._init)(o._payload),t.type=o,r=t.tag=function(e){if("function"==typeof e)return Du(e)?1:0;if(null!=e){if((e=e.$$typeof)===_)return 11;if(e===P)return 14}return 2}(o),e=vi(o,e),r){case 0:t=Ml(null,t,o,e,n);break e;case 1:t=_l(null,t,o,e,n);break e;case 11:t=kl(null,t,o,e,n);break e;case 14:t=Cl(null,t,o,vi(o.type,e),n);break e}throw Error(i(306,o,""))}return t;case 0:return o=t.type,r=t.pendingProps,Ml(e,t,o,r=t.elementType===o?r:vi(o,r),n);case 1:return o=t.type,r=t.pendingProps,_l(e,t,o,r=t.elementType===o?r:vi(o,r),n);case 3:e:{if(Ll(t),null===e)throw Error(i(387));o=t.pendingProps,r=(a=t.memoizedState).element,Di(e,t),Ri(t,o,null,n);var l=t.memoizedState;if(o=l.element,a.isDehydrated){if(a={element:o,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=Pl(e,t,o,n,r=cl(Error(i(423)),t));break e}if(o!==r){t=Pl(e,t,o,n,r=cl(Error(i(424)),t));break e}for(ri=cr(t.stateNode.containerInfo.firstChild),oi=t,ii=!0,ai=null,n=Zi(t,null,o,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(mi(),o===r){t=$l(e,t,n);break e}Sl(e,t,o,n)}t=t.child}return t;case 5:return aa(t),null===e&&ci(t),o=t.type,r=t.pendingProps,a=null!==e?e.memoizedProps:null,l=r.children,or(o,r)?l=null:null!==a&&or(o,a)&&(t.flags|=32),xl(e,t),Sl(e,t,l,n),t.child;case 6:return null===e&&ci(t),null;case 13:return Rl(e,t,n);case 4:return ra(t,t.stateNode.containerInfo),o=t.pendingProps,null===e?t.child=Xi(t,null,o,n):Sl(e,t,o,n),t.child;case 11:return o=t.type,r=t.pendingProps,kl(e,t,o,r=t.elementType===o?r:vi(o,r),n);case 7:return Sl(e,t,t.pendingProps,n),t.child;case 8:case 12:return Sl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(o=t.type._context,r=t.pendingProps,a=t.memoizedProps,l=r.value,Mr(yi,o._currentValue),o._currentValue=l,null!==a)if(lo(a.value,l)){if(a.children===r.children&&!Lr.current){t=$l(e,t,n);break e}}else for(null!==(a=t.child)&&(a.return=t);null!==a;){var s=a.dependencies;if(null!==s){l=a.child;for(var u=s.firstContext;null!==u;){if(u.context===o){if(1===a.tag){(u=Fi(-1,n&-n)).tag=2;var c=a.updateQueue;if(null!==c){var d=(c=c.shared).pending;null===d?u.next=u:(u.next=d.next,d.next=u),c.pending=u}}a.lanes|=n,null!==(u=a.alternate)&&(u.lanes|=n),Ei(a.return,n,t),s.lanes|=n;break}u=u.next}}else if(10===a.tag)l=a.type===t.type?null:a.child;else if(18===a.tag){if(null===(l=a.return))throw Error(i(341));l.lanes|=n,null!==(s=l.alternate)&&(s.lanes|=n),Ei(l,n,t),l=a.sibling}else l=a.child;if(null!==l)l.return=a;else for(l=a;null!==l;){if(l===t){l=null;break}if(null!==(a=l.sibling)){a.return=l.return,l=a;break}l=l.return}a=l}Sl(e,t,r.children,n),t=t.child}return t;case 9:return r=t.type,o=t.pendingProps.children,Ti(t,n),o=o(r=xi(r)),t.flags|=1,Sl(e,t,o,n),t.child;case 14:return r=vi(o=t.type,t.pendingProps),Cl(e,t,o,r=vi(o.type,r),n);case 15:return El(e,t,t.type,t.pendingProps,n);case 17:return o=t.type,r=t.pendingProps,r=t.elementType===o?r:vi(o,r),Wl(e,t),t.tag=1,Dr(o)?(e=!0,Ar(t)):e=!1,Ti(t,n),Wi(t,o,r),qi(t,o,r,n),Il(null,t,o,!0,e,n);case 19:return Hl(e,t,n);case 22:return Tl(e,t,n)}throw Error(i(156,t.tag))};var Qu="function"==typeof reportError?reportError:function(e){console.error(e)};function Ku(e){this._internalRoot=e}function Gu(e){this._internalRoot=e}function Xu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Zu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Ju(){}function ec(e,t,n,o,r){var i=n._reactRootContainer;if(i){var a=i;if("function"==typeof r){var l=r;r=function(){var e=$u(a);l.call(e)}}Wu(t,a,e,r)}else a=function(e,t,n,o,r){if(r){if("function"==typeof o){var i=o;o=function(){var e=$u(a);i.call(e)}}var a=Hu(t,o,e,0,null,!1,0,"",Ju);return e._reactRootContainer=a,e[hr]=a.current,Ho(8===e.nodeType?e.parentNode:e),du(),a}for(;r=e.lastChild;)e.removeChild(r);if("function"==typeof o){var l=o;o=function(){var e=$u(s);l.call(e)}}var s=ju(e,0,!1,null,0,!1,0,"",Ju);return e._reactRootContainer=s,e[hr]=s.current,Ho(8===e.nodeType?e.parentNode:e),du((function(){Wu(t,s,n,o)})),s}(n,t,e,r,o);return $u(a)}Gu.prototype.render=Ku.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(i(409));Wu(e,t,null,null)},Gu.prototype.unmount=Ku.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;du((function(){Wu(null,e,null,null)})),t[hr]=null}},Gu.prototype.unstable_scheduleHydration=function(e){if(e){var t=Et();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Dt.length&&0!==t&&t<Dt[n].priority;n++);Dt.splice(n,0,e),0===n&&At(e)}},St=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(yt(t,1|n),ru(t,Xe()),!(6&Is)&&(Hs=Xe()+500,Hr()))}break;case 13:du((function(){var t=Li(e,1);if(null!==t){var n=tu();ou(t,e,1,n)}})),Yu(e,1)}},kt=function(e){if(13===e.tag){var t=Li(e,134217728);null!==t&&ou(t,e,134217728,tu()),Yu(e,134217728)}},Ct=function(e){if(13===e.tag){var t=nu(e),n=Li(e,t);null!==n&&ou(n,e,t,tu()),Yu(e,t)}},Et=function(){return bt},Tt=function(e,t){var n=bt;try{return bt=e,t()}finally{bt=n}},ke=function(e,t,n){switch(t){case"input":if(Z(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var o=n[t];if(o!==e&&o.form===e.form){var r=kr(o);if(!r)throw Error(i(90));Y(o),Z(o,r)}}}break;case"textarea":ie(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},_e=cu,Ie=du;var tc={usingClientEntryPoint:!1,Events:[wr,Sr,kr,xe,Me,cu]},nc={findFiberByHostInstance:br,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"},oc={bundleType:nc.bundleType,version:nc.version,rendererPackageName:nc.rendererPackageName,rendererConfig:nc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=$e(e))?null:e.stateNode},findFiberByHostInstance:nc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var rc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!rc.isDisabled&&rc.supportsFiber)try{rt=rc.inject(oc),it=rc}catch(ce){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tc,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Xu(t))throw Error(i(200));return function(e,t,n){var o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:k,key:null==o?null:""+o,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Xu(e))throw Error(i(299));var n=!1,o="",r=Qu;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(o=t.identifierPrefix),void 0!==t.onRecoverableError&&(r=t.onRecoverableError)),t=ju(e,1,!1,null,0,n,0,o,r),e[hr]=t.current,Ho(8===e.nodeType?e.parentNode:e),new Ku(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(i(188));throw e=Object.keys(e).join(","),Error(i(268,e))}return null===(e=$e(t))?null:e.stateNode},t.flushSync=function(e){return du(e)},t.hydrate=function(e,t,n){if(!Zu(t))throw Error(i(200));return ec(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Xu(e))throw Error(i(405));var o=null!=n&&n.hydratedSources||null,r=!1,a="",l=Qu;if(null!=n&&(!0===n.unstable_strictMode&&(r=!0),void 0!==n.identifierPrefix&&(a=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=Hu(t,null,e,1,null!=n?n:null,r,0,a,l),e[hr]=t.current,Ho(e),o)for(e=0;e<o.length;e++)r=(r=(n=o[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,r]:t.mutableSourceEagerHydrationData.push(n,r);return new Gu(t)},t.render=function(e,t,n){if(!Zu(t))throw Error(i(200));return ec(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zu(e))throw Error(i(40));return!!e._reactRootContainer&&(du((function(){ec(null,null,e,!1,(function(){e._reactRootContainer=null,e[hr]=null}))})),!0)},t.unstable_batchedUpdates=cu,t.unstable_renderSubtreeIntoContainer=function(e,t,n,o){if(!Zu(n))throw Error(i(200));if(null==e||void 0===e._reactInternals)throw Error(i(38));return ec(e,t,n,!1,o)},t.version="18.2.0-next-9e3b772b8-20220608"},5338:(e,t,n)=>{var o=n(961);t.createRoot=o.createRoot,t.hydrateRoot=o.hydrateRoot},961:(e,t,n)=>{!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(2551)},5287:(e,t)=>{var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),s=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator,m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function y(){}function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=v.prototype;var w=b.prototype=new y;w.constructor=b,h(w,v.prototype),w.isPureReactComponent=!0;var S=Array.isArray,k=Object.prototype.hasOwnProperty,C={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function T(e,t,o){var r,i={},a=null,l=null;if(null!=t)for(r in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(a=""+t.key),t)k.call(t,r)&&!E.hasOwnProperty(r)&&(i[r]=t[r]);var s=arguments.length-2;if(1===s)i.children=o;else if(1<s){for(var u=Array(s),c=0;c<s;c++)u[c]=arguments[c+2];i.children=u}if(e&&e.defaultProps)for(r in s=e.defaultProps)void 0===i[r]&&(i[r]=s[r]);return{$$typeof:n,type:e,key:a,ref:l,props:i,_owner:C.current}}function x(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var M=/\/+/g;function _(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function I(e,t,r,i,a){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case n:case o:s=!0}}if(s)return a=a(s=e),e=""===i?"."+_(s,0):i,S(a)?(r="",null!=e&&(r=e.replace(M,"$&/")+"/"),I(a,t,r,"",(function(e){return e}))):null!=a&&(x(a)&&(a=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,r+(!a.key||s&&s.key===a.key?"":(""+a.key).replace(M,"$&/")+"/")+e)),t.push(a)),1;if(s=0,i=""===i?".":i+":",S(e))for(var u=0;u<e.length;u++){var c=i+_(l=e[u],u);s+=I(l,t,r,c,a)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),u=0;!(l=e.next()).done;)s+=I(l=l.value,t,r,c=i+_(l,u++),a);else if("object"===l)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return s}function L(e,t,n){if(null==e)return e;var o=[],r=0;return I(e,o,"","",(function(e){return t.call(n,e,r++)})),o}function P(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var N={current:null},D={transition:null},F={ReactCurrentDispatcher:N,ReactCurrentBatchConfig:D,ReactCurrentOwner:C};t.Children={map:L,forEach:function(e,t,n){L(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return L(e,(function(){t++})),t},toArray:function(e){return L(e,(function(e){return e}))||[]},only:function(e){if(!x(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=v,t.Fragment=r,t.Profiler=a,t.PureComponent=b,t.StrictMode=i,t.Suspense=c,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=F,t.cloneElement=function(e,t,o){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var r=h({},e.props),i=e.key,a=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(a=t.ref,l=C.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(u in t)k.call(t,u)&&!E.hasOwnProperty(u)&&(r[u]=void 0===t[u]&&void 0!==s?s[u]:t[u])}var u=arguments.length-2;if(1===u)r.children=o;else if(1<u){s=Array(u);for(var c=0;c<u;c++)s[c]=arguments[c+2];r.children=s}return{$$typeof:n,type:e.type,key:i,ref:a,props:r,_owner:l}},t.createContext=function(e){return(e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:l,_context:e},e.Consumer=e},t.createElement=T,t.createFactory=function(e){var t=T.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=x,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:P}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=D.transition;D.transition={};try{e()}finally{D.transition=t}},t.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")},t.useCallback=function(e,t){return N.current.useCallback(e,t)},t.useContext=function(e){return N.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return N.current.useDeferredValue(e)},t.useEffect=function(e,t){return N.current.useEffect(e,t)},t.useId=function(){return N.current.useId()},t.useImperativeHandle=function(e,t,n){return N.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return N.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return N.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return N.current.useMemo(e,t)},t.useReducer=function(e,t,n){return N.current.useReducer(e,t,n)},t.useRef=function(e){return N.current.useRef(e)},t.useState=function(e){return N.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return N.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return N.current.useTransition()},t.version="18.2.0"},6540:(e,t,n)=>{e.exports=n(5287)},7463:(e,t)=>{function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var o=n-1>>>1,r=e[o];if(!(0<i(r,t)))break e;e[o]=t,e[n]=r,n=o}}function o(e){return 0===e.length?null:e[0]}function r(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var o=0,r=e.length,a=r>>>1;o<a;){var l=2*(o+1)-1,s=e[l],u=l+1,c=e[u];if(0>i(s,n))u<r&&0>i(c,s)?(e[o]=c,e[u]=n,o=u):(e[o]=s,e[l]=n,o=l);else{if(!(u<r&&0>i(c,n)))break e;e[o]=c,e[u]=n,o=u}}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var a=performance;t.unstable_now=function(){return a.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}var u=[],c=[],d=1,f=null,p=3,m=!1,h=!1,g=!1,v="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,b="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=o(c);null!==t;){if(null===t.callback)r(c);else{if(!(t.startTime<=e))break;r(c),t.sortIndex=t.expirationTime,n(u,t)}t=o(c)}}function S(e){if(g=!1,w(e),!h)if(null!==o(u))h=!0,D(k);else{var t=o(c);null!==t&&F(S,t.startTime-e)}}function k(e,n){h=!1,g&&(g=!1,y(x),x=-1),m=!0;var i=p;try{for(w(n),f=o(u);null!==f&&(!(f.expirationTime>n)||e&&!I());){var a=f.callback;if("function"==typeof a){f.callback=null,p=f.priorityLevel;var l=a(f.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?f.callback=l:f===o(u)&&r(u),w(n)}else r(u);f=o(u)}if(null!==f)var s=!0;else{var d=o(c);null!==d&&F(S,d.startTime-n),s=!1}return s}finally{f=null,p=i,m=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var C,E=!1,T=null,x=-1,M=5,_=-1;function I(){return!(t.unstable_now()-_<M)}function L(){if(null!==T){var e=t.unstable_now();_=e;var n=!0;try{n=T(!0,e)}finally{n?C():(E=!1,T=null)}}else E=!1}if("function"==typeof b)C=function(){b(L)};else if("undefined"!=typeof MessageChannel){var P=new MessageChannel,N=P.port2;P.port1.onmessage=L,C=function(){N.postMessage(null)}}else C=function(){v(L,0)};function D(e){T=e,E||(E=!0,C())}function F(e,n){x=v((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){h||m||(h=!0,D(k))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):M=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_getFirstCallbackNode=function(){return o(u)},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,r,i){var a=t.unstable_now();switch(i="object"==typeof i&&null!==i&&"number"==typeof(i=i.delay)&&0<i?a+i:a,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:d++,callback:r,priorityLevel:e,startTime:i,expirationTime:l=i+l,sortIndex:-1},i>a?(e.sortIndex=i,n(c,e),null===o(u)&&e===o(c)&&(g?(y(x),x=-1):g=!0,F(S,i-a))):(e.sortIndex=l,n(u,e),h||m||(h=!0,D(k))),e},t.unstable_shouldYield=I,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},9982:(e,t,n)=>{e.exports=n(7463)},3225:function(e,t){var n=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.AnimationUtils=void 0,t.AnimationUtils={applyLoadingAnimation:function(e,t,o){return e.style.animation=`rotate ${t}s 0s infinite`,()=>n(this,void 0,void 0,(function*(){return new Promise((n=>{e.style.animation=`rotate ${t}s`;const r=()=>{o&&o(),e.style.animation="none",e.removeEventListener("animationend",r),n()};e.addEventListener("animationend",r)}))}))},setupAutoHideAnimation:function(e,t,n=!0,o=!0){const{hide:r,show:i}=this.setupCustomHideAnimation(e,t,n,o);t.addEventListener("mouseleave",(()=>r())),t.addEventListener("mouseenter",(()=>i()))},setupCustomHideAnimation:function(e,t,n=!0,o=!0){n&&e.classList.add("autoHiding"),e.classList.add("sbhidden"),e.classList.add("animationDone"),o||e.classList.add("autoHideLeft");let r=!1;return{hide:()=>{r=!1,e.classList.contains("autoHiding")&&e.classList.add("sbhidden")},show:()=>{r=!0,e.classList.remove("animationDone"),setTimeout((()=>{r&&e.classList.remove("sbhidden")}),10)}}},enableAutoHideAnimation:function(e){e.classList.add("autoHiding"),e.classList.add("sbhidden")},disableAutoHideAnimation:function(e){e.classList.remove("autoHiding"),e.classList.remove("sbhidden")}}},3531:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendBinaryRequestToCustomServer=t.sendRequestToCustomServer=t.setupBackgroundRequestProxy=t.sendRealRequestToCustomServer=void 0;const r=n(1108),i=n(1740),a=n(3262);function l(e,t,n={},i={}){return o(this,void 0,void 0,(function*(){return"get"===e.toLowerCase()&&(t=(0,r.objectToURI)(t,n,!0),n=null),yield fetch(t,{method:e,headers:Object.assign({"Content-Type":"application/json"},i||{}),redirect:"follow",body:n?JSON.stringify(n):null})}))}t.sendRealRequestToCustomServer=l,t.setupBackgroundRequestProxy=function(){chrome.runtime.onMessage.addListener(((e,t,n)=>"sendRequest"===e.message?(l(e.type,e.url,e.data,e.headers).then((t=>o(this,void 0,void 0,(function*(){const o=e.binary?(0,r.isFirefoxOrSafari)()&&!(0,i.isSafari)()?yield t.blob():Array.from(new Uint8Array(yield t.arrayBuffer())):null;n({responseText:e.binary?"":yield t.text(),responseBinary:o,headers:e.returnHeaders&&t.headers?[...t.headers.entries()].reduce(((e,[t,n])=>(e[t]=n,e)),{}):null,status:t.status,ok:t.ok})})))).catch((()=>{n({responseText:"",responseBinary:null,headers:null,status:-1,ok:!1})})),!0):"getHash"===e.message&&((0,a.getHash)(e.value,e.times).then(n).catch((e=>{n({error:null==e?void 0:e.message})})),!0)))},t.sendRequestToCustomServer=function(e,t,n={},o={}){return new Promise(((r,i)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:n,headers:o},(e=>{-1!==e.status?r(e):i(e)}))}))},t.sendBinaryRequestToCustomServer=function(e,t,n={},o={}){return new Promise(((r,i)=>{chrome.runtime.sendMessage({message:"sendRequest",type:e,url:t,data:n,headers:o,binary:!0,returnHeaders:!0},(e=>{-1!==e.status?r(e):i(e)}))}))}},7046:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.chromeP=void 0,t.chromeP="undefined"==typeof browser?"undefined"!=typeof chrome?chrome:null:browser},2146:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DataCache=void 0,t.DataCache=class{constructor(e,t=2e3){this.cache={},this.init=e,this.cacheLimit=t}getFromCache(e){return this.cache[e]}setupCache(e){if(!this.cache[e]&&(this.cache[e]=Object.assign(Object.assign({},this.init()),{lastUsed:Date.now()}),Object.keys(this.cache).length>this.cacheLimit)){const e=Object.entries(this.cache).reduce(((e,t)=>e[1].lastUsed<t[1].lastUsed?e:t));delete this.cache[e[0]]}return this.cache[e]}cacheUsed(e){return this.cache[e]&&(this.cache[e].lastUsed=Date.now()),!!this.cache[e]}}},2184:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.injectUpdatedScripts=t.getCleanupStartMessage=t.getCleanupId=t.setupCleanupListener=t.addCleanupListener=void 0;const r=n(7046),i=[];function a(){return`${chrome.runtime.id}-cleanup`}t.addCleanupListener=function(e){i.push(e)},t.setupCleanupListener=function(){const e=a(),t=performance.now();window.postMessage({source:e,message:"cleanup-start"}),window.addEventListener("message",(n=>{var o;if((null===(o=n.data)||void 0===o?void 0:o.source)&&n.data.source===e&&"cleanup-start"===n.data.message&&performance.now()-t>5e3)for(const e of i)e()}))},t.getCleanupId=a,t.getCleanupStartMessage=function(){return"cleanup-start"},t.injectUpdatedScripts=function(e=[],t=!1){return o(this,void 0,void 0,(function*(){const n=t?e:e.concat(chrome.runtime.getManifest().content_scripts||[]);if("scripting"in chrome)for(const e of n)for(const t of yield r.chromeP.tabs.query({url:e.matches}))e.css&&e.css.length>0&&(yield r.chromeP.scripting.insertCSS({target:{tabId:t.id},files:e.css||[]})),yield r.chromeP.scripting.executeScript({target:{tabId:t.id},files:e.js||[],world:e.world||"ISOLATED"});else chrome.windows.getAll({populate:!0},(e=>{var t,o;for(const r of e)if(r.tabs)for(const e of r.tabs)for(const r of n)if(e.url&&(null===(o=null===(t=r.matches)||void 0===t?void 0:t.some)||void 0===o?void 0:o.call(t,(t=>e.url.match(t.replace(/\//g,"\\/").replace(/\./g,"\\.").replace(/\*/g,".*")))))){if(r.js)for(const t of r.js)chrome.tabs.executeScript(e.id,{file:t});if(r.css)for(const t of r.css)chrome.tabs.insertCSS(e.id,{file:t})}}))}))}},1740:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.keybindToString=t.formatKey=t.keybindEquals=t.isSafari=t.ProtoConfig=void 0;const r=n(1108);function i(){return"undefined"!=typeof navigator&&"Apple Computer, Inc."===navigator.vendor}function a(e){return null==e?"":" "==e?"Space":1==e.length?e.toUpperCase():e}t.ProtoConfig=class{constructor(e,t,n,o=!1){this.configLocalListeners=[],this.configSyncListeners=[],this.cachedSyncConfig=null,this.cachedLocalStorage=null,this.config=null,this.local=null,this.inDeArrow=!1,this.syncDefaults=e,this.localDefaults=t,this.inDeArrow=o,this.setupConfig(n).then((e=>{this.config=null==e?void 0:e.sync,this.local=null==e?void 0:e.local}))}configProxy(){chrome.storage.onChanged.addListener(((e,t)=>{if("sync"===t){for(const t in e)this.cachedSyncConfig[t]=e[t].newValue;for(const t of this.configSyncListeners)t(e)}else if("local"===t){for(const t in e)this.cachedLocalStorage[t]=e[t].newValue;for(const t of this.configLocalListeners)t(e)}}));let e=0;const t=new Set;let n=null;const o=this,r={set(r,i,a){if(o.cachedSyncConfig[i]=a,Date.now()-e<100){if(t.add(i),!n){const e=()=>{const e=[...t];t.clear(),chrome.storage.sync.set(e.map((e=>[e,o.cachedSyncConfig[e]])).reduce(((e,[t,n])=>(e[t]=n,e)),{})),n=null};n=setTimeout(e,20)}return!0}return chrome.storage.sync.set({[i]:a}),e=Date.now(),!0},get(e,t){const n=o.cachedSyncConfig[t];return e[t]||n},deleteProperty:(e,t)=>(chrome.storage.sync.remove(t),!0)},i={set:(e,t,n)=>(o.cachedLocalStorage[t]=n,chrome.storage.local.set({[t]:n}),!0),get(e,t){const n=o.cachedLocalStorage[t];return e[t]||n},deleteProperty:(e,t)=>(chrome.storage.local.remove(t),!0)};return{sync:new Proxy({handler:r},r),local:new Proxy({handler:i},i)}}forceSyncUpdate(e){const t=this.cachedSyncConfig[e];chrome.storage.sync.set({[e]:t})}forceLocalUpdate(e){const t=this.cachedLocalStorage[e];chrome.storage.local.set({[e]:t},(()=>{const t=chrome.runtime.lastError;t&&"navigationApiAvailable"!==e&&alert(`SponsorBlock/DeArrow: ${chrome.i18n.getMessage("storageFull")}\n\n${t}`)}))}fetchConfig(){return o(this,void 0,void 0,(function*(){yield Promise.all([new Promise((e=>{chrome.storage.sync.get(null,(t=>{this.cachedSyncConfig=t,void 0===this.cachedSyncConfig&&(this.cachedSyncConfig={},(this.inDeArrow||window.location.href.includes("options.html"))&&alert(`${chrome.i18n.getMessage("syncDisabledWarning")}${this.inDeArrow?`\n\n${chrome.i18n.getMessage("syncDisabledWarningDeArrow")}`:""}${(0,r.isFirefoxOrSafari)()&&!i()?`\n\n${chrome.i18n.getMessage("syncDisabledFirefoxSuggestions")}`:""}`)),e()}))})),new Promise((e=>{chrome.storage.local.get(null,(t=>{this.cachedLocalStorage=null!=t?t:{},e()}))}))])}))}setupConfig(e){return o(this,void 0,void 0,(function*(){if("undefined"==typeof chrome)return null;yield this.fetchConfig(),this.addDefaults();const t=this.configProxy();return e(t.sync),t}))}addDefaults(){for(const e in this.syncDefaults)if(Object.prototype.hasOwnProperty.call(this.cachedSyncConfig,e)){if("barTypes"===e)for(const t in this.syncDefaults[e])Object.prototype.hasOwnProperty.call(this.cachedSyncConfig[e],t)||(this.cachedSyncConfig[e][t]=this.syncDefaults[e][t])}else this.cachedSyncConfig[e]=this.syncDefaults[e];for(const e in this.localDefaults)Object.prototype.hasOwnProperty.call(this.cachedLocalStorage,e)||(this.cachedLocalStorage[e]=this.localDefaults[e])}isReady(){return null!==this.config}},t.isSafari=i,t.keybindEquals=function(e,t){return!(null==e||null==t||Boolean(e.alt)!=Boolean(t.alt)||Boolean(e.ctrl)!=Boolean(t.ctrl)||Boolean(e.shift)!=Boolean(t.shift)||null==e.key&&null==e.code||null==t.key&&null==t.code)&&(null!=e.code&&null!=t.code?e.code===t.code:null!=e.key&&null!=t.key&&e.key.toUpperCase()===t.key.toUpperCase())},t.formatKey=a,t.keybindToString=function(e){if(null==e||null==e.key)return"";let t="";return e.ctrl&&(t+="Ctrl + "),e.alt&&(t+="Alt + "),e.shift&&(t+="Shift + "),t+a(e.key)}},2907:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.YT_DOMAINS=void 0,t.YT_DOMAINS=["m.youtube.com","www.youtube.com","www.youtube-nocookie.com","music.youtube.com","www.youtubekids.com","tv.youtube.com"]},4148:function(e,t){var n=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};function o(e,t=!1){var n,o,r;if(!e)return!1;if("VIDEO"===e.tagName&&(e.classList.contains("html5-main-video")||"player"===e.id||"player_html5_api"===e.id)&&1===[...document.querySelectorAll("video")].filter((e=>e.duration)).length&&e.duration)return!0;if(0===e.offsetHeight||0===e.offsetWidth&&!t)return!1;const i=null==e?void 0:e.getBoundingClientRect(),a=document.elementFromPoint(i.left+i.width/2,i.top+i.height/2)||document.elementFromPoint(i.left,i.top);return!a&&"movie_player"===e.id&&i.top<0||!!(a===e||a&&e.contains(a)||a&&a.contains(e))||"VIDEO"===e.tagName&&(!!(null===(n=null==a?void 0:a.closest(".html5-video-player"))||void 0===n?void 0:n.contains(e))||!!(null===(r=null===(o=null==e?void 0:e.closest("#inline-preview-player"))||void 0===o?void 0:o.classList)||void 0===r?void 0:r.contains("playing-mode")))}function r(e,t=!1,n=!0){var r,i;return o(e,t)||n&&!!e&&(o(e.parentElement,t)||o(null!==(i=null===(r=e.parentElement)||void 0===r?void 0:r.parentElement)&&void 0!==i?i:null,t))}function i(e,t=!1,n=!1){return a(e,t,n)}function a(e,t=!1,n=!1,o){for(const i of e){const e=o?o(i):i;if(e&&r(e,t,n))return e}return null}function l(e,t){for(const n of e){const e=document.querySelector(n);if(e&&t(e))return e}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.getElement=t.waitForElement=t.findNonEmptyElement=t.findPredicatedElement=t.findValidElement=t.findValidElementFromSelector=t.isVisibleOrParent=t.isVisible=void 0,t.isVisible=o,t.isVisibleOrParent=r,t.findValidElementFromSelector=function(e,t=!1,n=!1){return a(e,t,n,(e=>document.querySelector(e)))},t.findValidElement=i,t.findPredicatedElement=l,t.findNonEmptyElement=function(e){return l(e,(e=>{var t,n;return(null!==(n=null===(t=e.textContent)||void 0===t?void 0:t.trim())&&void 0!==n?n:"").length>0}))};let s=!1,u=null,c=[];function d(){if(!u){const e=e=>{var t;const n=[];for(const o of c){const{selector:r,visibleCheck:a,ignoreWidth:l,checkParent:s,callbacks:u}=o;let c=!0;if(e){let t=!1;for(const n of e)if("childList"===n.type&&n.addedNodes.length>0){if(n.target instanceof HTMLElement&&(n.target.matches(r)||n.target.querySelector(r))){t=!0;break}for(const e of n.addedNodes)if(e instanceof HTMLElement&&(e.matches(r)||e.querySelector(r))){t=!0;break}if(t)break}t||(c=!1)}const d=c?document.querySelectorAll(r):o.elements;if(d&&d.length>0){o.elements=d;const e=a?i(d,l,s):d[0];if(e){if(null===(t=chrome.runtime)||void 0===t?void 0:t.id)for(const t of u)t(e);n.push(r)}}}c=c.filter((e=>!n.includes(e.selector))),0===c.length&&(null==u||u.disconnect(),u=null,s=!1)};e(),c.length>0&&(u=new MutationObserver(e),u.observe(document.documentElement,{childList:!0,subtree:!0}))}}function f(e,t,n=!1,o=!1){return t?i(document.querySelectorAll(e),n,o):document.querySelector(e)}t.waitForElement=function(e,t=!1,o=!1,r=!1){return n(this,void 0,void 0,(function*(){return yield new Promise((n=>{const i=f(e,t,o,r);if(i)return void n(i);const a=c.find((n=>n.selector===e&&n.visibleCheck===t));a?a.callbacks.push(n):c.push({selector:e,visibleCheck:t,ignoreWidth:o,checkParent:r,callbacks:[n]}),s||(s=!0,document.body?d():window.addEventListener("DOMContentLoaded",(()=>{d()})))}))}))},t.getElement=f},7913:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorMessage=t.getFormattedTime=t.getFormattedTimeToSeconds=void 0,t.getFormattedTimeToSeconds=function(e){const t=/^(?:(?:(\d+):)?(\d+):)?(\d*(?:[.,]\d+)?)$/.exec(e);return null===t?null:3600*(t[1]?parseInt(t[1]):0)+60*(t[2]?parseInt(t[2]||"0"):0)+(t[3]?parseFloat(t[3].replace(",",".")):0)},t.getFormattedTime=function(e,t){e=Math.max(e,0);const n=Math.floor(e/60/60),o=Math.floor(e/60)%60;let r=String(o),i=e%60;t||(i=Math.floor(i));let a=String(t?i.toFixed(3):i);return i<10&&(a="0"+a),n&&o<10&&(r="0"+r),isNaN(n)||isNaN(o)?null:(n?n+":":"")+r+":"+a},t.getErrorMessage=function(e,t){const n=!t||t.includes("cf-wrapper")||t.includes("<!DOCTYPE html>")?"":"\n\n"+t;return[400,409,0].includes(e)?chrome.i18n.getMessage(e+"")+" "+chrome.i18n.getMessage("errorCode")+e+n:e>=500&&e<=599?(503==e&&(e=502),chrome.i18n.getMessage(e+"")+" "+chrome.i18n.getMessage("errorCode")+e+"\n\n"+chrome.i18n.getMessage("statusReminder")):chrome.i18n.getMessage("connectionError")+e+n}},3262:function(e,t){var n=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.getHash=void 0,t.getHash=function(e,t=5e3){return n(this,void 0,void 0,(function*(){if(t<=0)return"";if(!("subtle"in crypto))return new Promise(((n,o)=>chrome.runtime.sendMessage({message:"getHash",value:e,times:t},(e=>{e.error?o(e.error):n(e)}))));let n=e;for(let e=0;e<t;e++){const e=yield crypto.subtle.digest("SHA-256",(new TextEncoder).encode(n).buffer);n=Array.from(new Uint8Array(e)).map((e=>e.toString(16).padStart(2,"0"))).join("")}return n}))}},1108:function(e,t){var n=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.extensionUserAgent=t.isFirefoxOrSafari=t.timeoutPomise=t.PromiseTimeoutError=t.objectToURI=t.waitFor=void 0,t.waitFor=function(e,t=5e3,o=100,r){return n(this,void 0,void 0,(function*(){return yield new Promise(((n,i)=>{let a=null;const l=()=>{const t=e();(r?r(t):t)&&(n(t),a&&clearInterval(a))};t&&(setTimeout((()=>{clearInterval(a),i(`TIMEOUT waiting for ${null==e?void 0:e.toString()}: ${Error().stack}`)}),t),a=setInterval(l,o)),l()}))}))},t.objectToURI=function(e,t,n){let o=0;for(const r in t){const i=e.includes("?")||o>0?"&":n?"?":"",a="string"==typeof t[r]?t[r]:JSON.stringify(t[r]);e+=i+encodeURIComponent(r)+"="+encodeURIComponent(a),o++}return e};class o extends Error{constructor(e){super("Promise timed out"),this.promise=e}}let r;t.PromiseTimeoutError=o,t.timeoutPomise=function(e){return new Promise(((t,n)=>{e&&setTimeout((()=>{n(new o)}),e)}))},t.isFirefoxOrSafari=function(){return"undefined"!=typeof browser},t.extensionUserAgent=function(){return null!=r||(r=`${chrome.runtime.id}/v${chrome.runtime.getManifest().version}`),r}},3184:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.isMainMetadataFetcher=t.isLiveSync=t.isLiveOrUpcoming=t.getChannelIDSync=t.getChannelID=t.getPlaybackFormats=t.fetchVideoDataDesktopClient=t.fetchVideoDataAndroidClient=t.fetchVideoMetadata=t.setupMetadataOnRecieve=t.videoMetadataCache=void 0;const r=n(2146),i=n(2184),a=n(1740),l=n(6705);t.videoMetadataCache=new r.DataCache((()=>({playbackUrls:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null})));const s=[];let u=!1;t.setupMetadataOnRecieve=function(){const e=document.getElementById("sponsorblock-document-script");if(e){const t=e.getAttribute("claim-id");t&&t!==chrome.runtime.id||(u=!0,t||e.setAttribute("claim-id",chrome.runtime.id))}const n=e=>{var n,o;if("maze-utils:video-metadata-received"===(null===(n=e.data)||void 0===n?void 0:n.type)){const n=e.data;if(n.videoID&&n.metadata&&!t.videoMetadataCache.getFromCache(n.videoID)){const e=n.metadata,o=t.videoMetadataCache.setupCache(n.videoID);o.playbackUrls=e.playbackUrls,o.duration=e.duration,o.channelID=e.channelID,o.author=e.author,o.isLive=e.isLive,o.isUpcoming=e.isUpcoming;const r=s.findIndex((e=>e.videoID===n.videoID));-1!==r&&(s[r].callbacks.forEach((e=>{e(n.metadata)})),s.splice(r,1))}}else"maze-utils:video-metadata-requested"!==(null===(o=e.data)||void 0===o?void 0:o.type)||e.data.videoID in c||s.push({videoID:e.data.videoID,callbacks:[]})};window.addEventListener("message",n),(0,i.addCleanupListener)((()=>{window.removeEventListener("message",n)}))};const c={};function d(e,n,r=!1){var i;return o(this,void 0,void 0,(function*(){const u=t.videoMetadataCache.getFromCache(e);if(!n&&u&&null!==u.duration)return u;let d=s.find((t=>t.videoID===e));if(d||r)return new Promise((n=>{d||(d={videoID:e,callbacks:[]},s.push(d)),d.callbacks.push((o=>{t.videoMetadataCache.cacheUsed(e),n(o)}))}));try{const n=null!==(i=c[e])&&void 0!==i?i:(()=>o(this,void 0,void 0,(function*(){window.postMessage({type:"maze-utils:video-metadata-requested",videoID:e},"*");let n=yield f(e).catch((()=>null));if((0,l.onMobile)()||n&&(0!==n.formats.length||"LOGIN_REQUIRED"===n.playabilityStatus)||(n=yield f(e).catch((()=>null))),n){let o=n.formats;(0,a.isSafari)()&&(o=o.filter((e=>e.mimeType.includes("avc"))));const r=o.some((e=>e.mimeType.includes("vp9"))),i=o.reverse().filter((e=>e.width&&e.height&&(!r||e.mimeType.includes("vp9")))).sort(((e,t)=>(null==e?void 0:e.width)-(null==t?void 0:t.width))),l=t.videoMetadataCache.setupCache(e);return l.playbackUrls=i.map((e=>({url:e.url,width:e.width,height:e.height}))),l.duration=n.duration,l.channelID=n.channelID,l.author=n.author,l.isLive=n.isLive,l.isUpcoming=n.isUpcoming,setTimeout((()=>delete c[e]),500),window.postMessage({type:"maze-utils:video-metadata-received",videoID:e,metadata:l},"*"),l}return window.postMessage({type:"maze-utils:video-metadata-received",videoID:e,metadata:{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}},"*"),{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}})))();return c[e]=n,yield n}catch(e){}return{duration:null,channelID:null,author:null,playbackUrls:[],isLive:null,isUpcoming:null}}))}function f(e){var t,n,r,i,a,l,s,u,c,d,f,p,m,h;return o(this,void 0,void 0,(function*(){const o={context:{client:{clientName:"WEB",clientVersion:"2.20230327.07.00"}},videoId:e};try{const g=yield fetch("https://www.youtube.com/youtubei/v1/player",{body:JSON.stringify(o),headers:{"Content-Type":"application/json"},method:"POST"});if(g.ok){const o=yield g.json();if((null!==(n=null===(t=null==o?void 0:o.videoDetails)||void 0===t?void 0:t.videoId)&&void 0!==n?n:null)!==e)return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null};const v=(null===(r=null==o?void 0:o.streamingData)||void 0===r?void 0:r.adaptiveFormats)||[],y=(null===(i=null==o?void 0:o.videoDetails)||void 0===i?void 0:i.lengthSeconds)?parseInt(o.videoDetails.lengthSeconds):null,b=null!==(l=null===(a=null==o?void 0:o.videoDetails)||void 0===a?void 0:a.channelId)&&void 0!==l?l:null,w=null!==(u=null===(s=null==o?void 0:o.videoDetails)||void 0===s?void 0:s.author)&&void 0!==u?u:null,S=null!==(d=null===(c=null==o?void 0:o.videoDetails)||void 0===c?void 0:c.isLive)&&void 0!==d?d:null;return{formats:v,duration:y,channelID:b,author:w,isLive:S,isUpcoming:null!==(p=null===(f=null==o?void 0:o.videoDetails)||void 0===f?void 0:f.isUpcoming)&&void 0!==p?p:null,playabilityStatus:null!==(h=null===(m=null==o?void 0:o.playabilityStatus)||void 0===m?void 0:m.status)&&void 0!==h?h:null}}}catch(e){}return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null}}))}t.fetchVideoMetadata=d,t.fetchVideoDataAndroidClient=function(e){var t,n,r,i,a,l,s,u,c,d,f,p,m,h;return o(this,void 0,void 0,(function*(){const o="17.31.35",g={context:{client:{clientName:"ANDROID",clientVersion:o,androidSdkVersion:31,osName:"Android",osVersion:"12",hl:"en",gl:"US"}},videoId:e,params:"8AEB",playbackContext:{contentPlaybackContext:{html5Preference:"HTML5_PREF_WANTS"}},contentCheckOk:!0,racyCheckOk:!0};try{const v=yield fetch("https://www.youtube.com/youtubei/v1/player?key=AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w",{body:JSON.stringify(g),headers:{"X-Youtube-Client-Name":"3","X-Youtube-Client-Version":o,"User-Agent":`com.google.android.youtube/${o} (Linux; U; Android 12) gzip`,"Content-Type":"application/json",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-us,en;q=0.5","Sec-Fetch-Mode":"navigate",Connection:"close"},method:"POST"});if(v.ok){const o=yield v.json();if((null!==(n=null===(t=null==o?void 0:o.videoDetails)||void 0===t?void 0:t.videoId)&&void 0!==n?n:null)!==e)return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null};const g=null===(r=null==o?void 0:o.streamingData)||void 0===r?void 0:r.adaptiveFormats,y=(null===(i=null==o?void 0:o.videoDetails)||void 0===i?void 0:i.lengthSeconds)?parseInt(o.videoDetails.lengthSeconds):null,b=null!==(l=null===(a=null==o?void 0:o.videoDetails)||void 0===a?void 0:a.channelId)&&void 0!==l?l:null,w=null!==(u=null===(s=null==o?void 0:o.videoDetails)||void 0===s?void 0:s.author)&&void 0!==u?u:null,S=null!==(d=null===(c=null==o?void 0:o.videoDetails)||void 0===c?void 0:c.isLive)&&void 0!==d?d:null,k=null!==(p=null===(f=null==o?void 0:o.videoDetails)||void 0===f?void 0:f.isUpcoming)&&void 0!==p?p:null,C=null!==(h=null===(m=null==o?void 0:o.playabilityStatus)||void 0===m?void 0:m.status)&&void 0!==h?h:null;if(g)return{formats:g,duration:y,channelID:b,author:w,isLive:S,isUpcoming:k,playabilityStatus:C}}}catch(e){}return{formats:[],duration:null,channelID:null,author:null,isLive:null,isUpcoming:null}}))},t.fetchVideoDataDesktopClient=f,t.getPlaybackFormats=function(e,n,r,i=!1){var a,l,s;return o(this,void 0,void 0,(function*(){const o=yield d(e,i);if(n&&r){const i=null===(l=null===(a=null==o?void 0:o.playbackUrls)||void 0===a?void 0:a.find)||void 0===l?void 0:l.call(a,(e=>(null==e?void 0:e.width)>=n&&(null==e?void 0:e.height)>=r));if(i)return t.videoMetadataCache.cacheUsed(e),i}else if((null===(s=null==o?void 0:o.playbackUrls)||void 0===s?void 0:s.length)>0)return o[0];return null}))},t.getChannelID=function(e,t=!1){return o(this,void 0,void 0,(function*(){const n=yield d(e,!1,t);return n?{channelID:n.channelID,author:n.author}:{channelID:null,author:null}}))},t.getChannelIDSync=function(e){const n=t.videoMetadataCache.getFromCache(e);return n?{channelID:n.channelID,author:n.author}:null},t.isLiveOrUpcoming=function(e){return o(this,void 0,void 0,(function*(){const t=yield d(e,!1);return t?t.isLive||t.isUpcoming:null}))},t.isLiveSync=function(e){const n=t.videoMetadataCache.getFromCache(e);return n?n.isLive&&!n.isUpcoming:null},t.isMainMetadataFetcher=function(){return u}},6705:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.onVideoPage=t.onYouTubeCableTV=t.onMobile=void 0,t.onMobile=function(){return"m.youtube.com"===window.location.hostname},t.onYouTubeCableTV=function(){return"tv.youtube.com"===window.location.hostname},t.onVideoPage=function(){return!!document.URL.match(/\/watch|\/shorts|\/live|\/embed/)}},9249:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.injectScript=void 0;const o=n(9291),r=n(2303);t.injectScript=function(e){const t=document.createElement("script");t.id="sponsorblock-document-script",t.setAttribute("version",r.version),t.innerHTML=e;const n=document.head||document.documentElement,i=document.getElementById("sponsorblock-document-script"),a=null==i?void 0:i.getAttribute("version");!n||i&&!(0,o.versionHigher)(r.version,null!=a?a:"")||(i&&(t.setAttribute("teardown","true"),i.remove()),n.appendChild(t))}},3497:(e,t)=>{function n(e){const t=e.replace(/__MSG_(\w+)__/g,(function(e,t){return t?chrome.i18n.getMessage(t).replace(/</g,"&#60;").replace(/"/g,"&quot;").replace(/\n/g,"<br/>"):""}));return t!=e&&t}Object.defineProperty(t,"__esModule",{value:!0}),t.getLocalizedMessage=t.localizeHtmlPage=t.generateUserID=void 0,t.generateUserID=function(e=36){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let n="";const o="undefined"==typeof window?crypto:window.crypto;if(o&&o.getRandomValues){const r=new Uint32Array(e);o.getRandomValues(r);for(let o=0;o<e;o++)n+=t[r[o]%62];return n}for(let o=0;o<e;o++)n+=t[Math.floor(62*Math.random())];return n},t.localizeHtmlPage=function(){const e=n(document.title);e&&(document.title=e);const t=document.querySelector(".sponsorBlockPageBody"),o=n(t.innerHTML.toString());o&&(t.innerHTML=o)},t.getLocalizedMessage=n},4395:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getThumbnailSelectors=t.getThumbnailBoxSelectors=t.getThumbnailLink=t.getThumbnailImageSelectors=t.getThumbnailElementsToListenFor=t.getThumbnailElements=void 0;const o=n(6705);function r(){return(0,o.onMobile)()?[".media-item-thumbnail-container",".video-thumbnail-container-compact","ytm-thumbnail-cover",".video-thumbnail-container-vertical","ytm-hero-playlist-thumbnail-renderer"]:["ytd-thumbnail","ytd-playlist-thumbnail","ytm-shorts-lockup-view-model","yt-thumbnail-view-model"]}function i(...e){return 0===e.length&&(e=[""]),r().map((t=>e.map((e=>`${t}${e}`)).join(", "))).join(", ")}t.getThumbnailElements=r,t.getThumbnailElementsToListenFor=function(){const e=r();return(0,o.onMobile)()||(e.push("yt-lockup-view-model"),e.push("ytm-shorts-lockup-view-model-v2")),e},t.getThumbnailImageSelectors=function(){return(0,o.onMobile)()?"img.video-thumbnail-img, img.amsterdam-playlist-thumbnail":"ytd-thumbnail:not([hidden]) img, ytd-playlist-thumbnail yt-image:not(.blurred-image) img, yt-img-shadow.ytd-hero-playlist-thumbnail-renderer img, ytm-shorts-lockup-view-model img, .yt-thumbnail-view-model__image img"},t.getThumbnailLink=function(e){return(0,o.onMobile)()?e.querySelector(["a.media-item-thumbnail-container","ytm-channel-featured-video-renderer a","a.compact-media-item-image","a.reel-item-endpoint",".amsterdam-playlist-thumbnail-wrapper a"].join(", ")):e.querySelector(i(" a"))},t.getThumbnailBoxSelectors=function(){return(0,o.onMobile)()?".media-item-thumbnail-container":i(":not([hidden])",".ytd-hero-playlist-thumbnail-renderer")},t.getThumbnailSelectors=i},8343:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.updateAll=t.newThumbnails=t.setThumbnailListener=t.getThumbnailSelector=void 0;const o=n(1108),r=n(2184),i=n(6705),a=n(4395),l=n(3683),s=new Map;let u=0,c=null,d=(0,a.getThumbnailSelectors)(),f="div.thumbnail";function p(){return(0,l.isOnInvidious)()?f:d}t.getThumbnailSelector=p,t.setThumbnailListener=function(e,t,n,a,u){c=e,a&&(d=a),u&&(f=u);const p=()=>{null==t||t(),(0,o.waitFor)((()=>null!==(0,l.isOnInvidious)())).then((()=>{(0,l.isOnInvidious)()&&g()}))};if("complete"===document.readyState?p():window.addEventListener("load",p),(0,o.waitFor)((()=>n()),5e3,10).then((()=>{g()})),(0,i.onMobile)()){const e=()=>b();window.addEventListener("updateui",e),window.addEventListener("state-navigateend",e),(0,r.addCleanupListener)((()=>{window.removeEventListener("updateui",e),window.removeEventListener("state-navigateend",e)}))}(0,r.addCleanupListener)((()=>{for(const e of s)e[1].disconnect();s.clear()}))};let m=0,h=null;function g(){if(performance.now()-m<50||h)return h?void 0:void(h=setTimeout((()=>{h=null,g()}),50));m=performance.now();const e=s.keys(),t=document.querySelectorAll(p()),n=[];for(const e of t)if(!s.has(e)){n.push(e);const t=new MutationObserver((t=>{for(const n of t)if("attributes"===n.type&&"href"===n.attributeName){null==c||c([e]);break}}));s.set(e,t);const o=(0,a.getThumbnailLink)(e);o&&t.observe(o,{attributes:!0});const r=new MutationObserver((t=>{var n,o;for(const r of t)if("childList"===r.type&&(null===(n=r.addedNodes[0])||void 0===n?void 0:n.nodeName.toLowerCase().includes("shorts"))||(null===(o=r.previousSibling)||void 0===o?void 0:o.nodeName.toLowerCase().includes("shorts"))){null==c||c([e]);break}})),i=e.querySelector("#content");i&&r.observe(i,{childList:!0})}if(null==c||c(n),performance.now()-u>5e3){for(const t of e)if(document.body&&!document.body.contains(t)){const e=s.get(t);null==e||e.disconnect(),s.delete(t)}u=performance.now()}}t.newThumbnails=g,t.updateAll=function(){c&&c([...s.keys()])};const v=[100,200,300,400,500,750,1e3,1500,2500,5e3,1e4];let y=null;function b(e=0){if(e>=v.length)return;y&&clearTimeout(y);const t=v[e]-(e>0?v[e-1]:0);y=setTimeout((()=>{g(),b(e+1)}),t),g()}},9291:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.versionHigher=void 0,t.versionHigher=function(e,t){const n=e.split("."),o=t.split(".");if(n.length!==o.length)return!0;for(let e=0;e<n.length;e++){const t=parseInt(n[e]),r=parseInt(o[e]);if(t>r)return!0;if(t<r)return!1}return!1}},3683:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.isOnChannelPage=t.isCurrentTimeWrong=t.getIsInline=t.getLastNonInlineVideoID=t.getIsLivePremiere=t.setIsAdPlaying=t.getIsAdPlaying=t.getChannelIDInfo=t.getWaitingForChannelID=t.isOnYTTV=t.isOnYouTubeMusic=t.isOnMobileYouTube=t.isOnInvidious=t.setCurrentTime=t.verifyCurrentTime=t.getCurrentTime=t.getVideoDuration=t.getVideoID=t.getVideo=t.triggerVideoElementChange=t.waitForVideo=t.whitelistCheck=t.parseYouTubeVideoIDFromURL=t.getYouTubeVideoID=t.triggerVideoIDChange=t.checkVideoIDChange=t.checkIfNewVideoID=t.setupVideoModule=t.ChannelIDStatus=t.PageType=void 0;const r=n(1108),i=n(1740),a=n(4148),l=n(8343),s=n(2907),u=n(2184),c=n(9249),d=n(3184);var f,p;!function(e){e.Unknown="unknown",e.Shorts="shorts",e.Watch="watch",e.Search="search",e.Browse="browse",e.Channel="channel",e.Embed="embed"}(f=t.PageType||(t.PageType={})),function(e){e[e.Fetching=0]="Fetching",e[e.Found=1]="Found",e[e.Failed=2]="Failed"}(p=t.ChannelIDStatus||(t.ChannelIDStatus={}));const m="a.ytp-title-link[data-sessionlink='feature=player-title']:not(.cbCustomTitle)",h="ytd-channel-video-player-renderer a.ytp-title-link[data-sessionlink='feature=player-title']:not(.cbCustomTitle)";let g=null,v=null,y=null,b=null;const w=[];let S,k,C,E=!1,T=!1,x=null,M=null,_=!1,I=!1,L=!1,P=f.Unknown,N=!1,D=null,F=!1,U=0,O=!1,A={videoIDChange:()=>{},channelIDChange:()=>{},videoElementChange:()=>{},playerInit:()=>{},resetValues:()=>{},windowListenerHandler:()=>{},newVideosLoaded:()=>{},onNavigateToChannel:()=>{},documentScript:"",allowClipPage:!1};function R(e,t=!1){var n,i;return o(this,void 0,void 0,(function*(){return!(!e&&x&&(A.allowClipPage||!(null===(n=null===document||void 0===document?void 0:document.URL)||void 0===n?void 0:n.includes("youtube.com/clip/")))||(t&&e&&(setTimeout((()=>{G()}),200),setTimeout((()=>{G()}),1e3)),x!==e||!(0,a.isVisible)(g)&&g?((0,a.isVisible)(g)||G(),A.resetValues(),x=null,P=f.Unknown,k={status:p.Fetching,id:null,author:null},S=!1,F=!1,U=0,O=!1,T=!1,window.postMessage({source:"sb-reset-media-session-link",videoID:null},"/"),x=e,F=t,!e||(yield(0,r.waitFor)((()=>C().isReady()),5e3,1),H(e),A.videoIDChange(e),0)):(ne()&&x&&(null===(i=A.onNavigateToChannel)||void 0===i||i.call(A)),1)))}))}function z(e){return e||(e=null===document||void 0===document?void 0:document.URL),P===f.Channel?V(!0,f.Channel):!A.allowClipPage&&e.includes("youtube.com/clip/")?null:e.includes("/embed/")&&e.includes("youtube.com")?V(!1,f.Embed):!e.includes("youtube.com")||e.match(/\/watch|\/shorts\/|playlist|\/live\//)?j(e):ne()?V(!0,f.Channel):j(e)||V(!1)}function V(e=!0,t=f.Watch){var n,o;const r=t===f.Embed?document.querySelector(m):t===f.Channel?document.querySelector(h):null===(o=null===(n=null==g?void 0:g.parentElement)||void 0===n?void 0:n.parentElement)||void 0===o?void 0:o.querySelector(m),i=null==r?void 0:r.getAttribute("href");return i?(M=e,P=t,j(i)):null}function j(e){const t=B(e);return t.callLater?((0,r.waitFor)((()=>C().isReady())).then((()=>R(j(e)))),null):(M=t.onInvidious,_=t.onMobileYouTube,I=t.onYTTV,L=t.onYouTubeMusic,t.videoID)}function B(e){var t;e.startsWith("https://www.youtube.com/tv#/")&&(e=e.replace("#","")),e.startsWith("https://www.youtube.com/tv?")&&(e=e.replace(/\?[^#]+#/,""));let n=!1,o=!1,r=!1,i=!1,a=null;try{a=new URL(e)}catch(t){return console.error("[SB] Unable to parse URL: "+e),{videoID:null,onInvidious:n,onMobileYouTube:o,onYTTV:r,onYouTubeMusic:i,callLater:!1}}if(s.YT_DOMAINS.includes(a.host))"m.youtube.com"===a.host&&(o=!0),"tv.youtube.com"===a.host&&(r=!0),"music.youtube.com"===a.host&&(i=!0),n=!1;else{if(!C().isReady()||!(null===(t=C().config.invidiousInstances)||void 0===t?void 0:t.includes(a.hostname)))return{videoID:null,onInvidious:n,onMobileYouTube:o,onYTTV:r,onYouTubeMusic:i,callLater:!C().isReady()};n=!0}if(a.searchParams.has("v")&&["/watch","/watch/"].includes(a.pathname)||a.pathname.startsWith("/tv/watch")){const e=a.searchParams.get("v");return{videoID:11==(null==e?void 0:e.length)?e:null,onInvidious:n,onMobileYouTube:o,onYTTV:r,onYouTubeMusic:i,callLater:!1}}if(a.pathname.match(/^\/embed\/|^\/shorts\/|^\/live\//)||"tv.youtube.com"===a.host&&a.pathname.startsWith("/watch/"))try{const e=a.pathname.split("/")[2];if((null==e?void 0:e.length)>=11)return{videoID:e.slice(0,11),onInvidious:n,onMobileYouTube:o,onYTTV:r,onYouTubeMusic:i,callLater:!1}}catch(t){return console.error("[SB] Video ID not valid for "+e),{videoID:null,onInvidious:n,onMobileYouTube:o,onYTTV:r,onYouTubeMusic:i,callLater:!1}}return{videoID:null,onInvidious:n,onMobileYouTube:o,onYTTV:r,onYouTubeMusic:i,callLater:!1}}function H(e){var t,n,i,a,l,s,u,c,f,m,h;return o(this,void 0,void 0,(function*(){try{N=!0;const t=[(0,r.waitFor)((()=>k.status===p.Found),6e3,20),(0,d.getChannelID)(e,!(0,d.isMainMetadataFetcher)())];if(yield Promise.race(t),k.status!==p.Found){const t=(0,d.getChannelIDSync)(e);t&&(k={status:p.Found,id:t.channelID,author:t.author})}}catch(e){const o=null===(t=document.querySelector("#social-links yt-button-shape a"))||void 0===t?void 0:t.getAttribute("href");let r=null;o&&o.includes("/channel/")&&(r=null===(n=o.match(/\/channel\/(UC[a-zA-Z0-9_-]{22})/))||void 0===n?void 0:n[1]),null!=r||(r=null===(m=null===(f=null===(c=null!==(u=null!==(a=null!==(i=document.querySelector("a.ytd-video-owner-renderer"))&&void 0!==i?i:document.querySelector("a.ytp-title-channel-logo"))&&void 0!==a?a:null===(s=null===(l=document.querySelector(".channel-profile #channel-name"))||void 0===l?void 0:l.parentElement)||void 0===s?void 0:s.parentElement)&&void 0!==u?u:document.querySelector("a.slim-owner-icon-and-title"))||void 0===c?void 0:c.getAttribute("href"))||void 0===f?void 0:f.match(/\/(?:(?:channel|c|user|)\/|@)(UC[a-zA-Z0-9_-]{22}|[a-zA-Z0-9_-]+)/))||void 0===m?void 0:m[1]);const d=null===(h=document.querySelector("ytd-channel-name a.yt-formatted-string"))||void 0===h?void 0:h.innerText;k=r?{status:p.Found,id:r,author:d}:{status:p.Failed,id:null,author:null}}N=!1,A.channelIDChange(k)}))}t.setupVideoModule=function(e,t){A=e,C=t,(0,u.setupCleanupListener)(),function(){const e=()=>{(0,a.isVisible)(g)||G()};A.documentScript&&(0,c.injectScript)(A.documentScript),document.addEventListener("yt-navigate-finish",e);const t=()=>{var e;document.querySelector('meta[property="og:title"][content="Piped"]')&&(null===(e=A.playerInit)||void 0===e||e.call(A))};window.addEventListener("playerInit",t),window.addEventListener("message",Z),(0,u.addCleanupListener)((()=>{document.removeEventListener("yt-navigate-finish",e),window.removeEventListener("playerInit",t),window.removeEventListener("message",Z)})),(0,d.setupMetadataOnRecieve)()}(),(0,r.waitFor)((()=>C().isReady()),1e3,1).then((()=>R(z()))),s.YT_DOMAINS.includes(location.host)&&(document.URL.includes("/embed/")||"complete"===document.readyState&&ne())&&(0,a.waitForElement)(ne()?h:m).then((e=>(0,r.waitFor)((()=>e.getAttribute("href"))))).then((()=>R(z()))).catch((()=>{}));const n="navigation"in window;if(n){const e=e=>{R(z(e.destination.url))};window.navigation.addEventListener("navigate",e),(0,u.addCleanupListener)((()=>{window.navigation.removeEventListener("navigate",e)}))}(0,r.waitFor)((()=>null!==t().local)).then((()=>{t().local.navigationApiAvailable!==n&&(t().local.navigationApiAvailable=n,t().forceLocalUpdate("navigationApiAvailable"))})),q(),(0,u.addCleanupListener)((()=>{y&&(y.disconnect(),y=null)}))},t.checkIfNewVideoID=function(){return o(this,void 0,void 0,(function*(){const e=z();return e!==x&&(yield R(e))}))},t.checkVideoIDChange=function(){return o(this,void 0,void 0,(function*(){const e=z();return yield R(e)}))},t.triggerVideoIDChange=function(e){return o(this,void 0,void 0,(function*(){return yield R(e)}))},t.getYouTubeVideoID=z,t.parseYouTubeVideoIDFromURL=B,t.whitelistCheck=H;let W=0,$=null;function q(){if(!(M||null!==y&&(0,a.isVisible)(b.parentElement))){if($&&clearTimeout($),Date.now()-W<2e3)return void($=setTimeout(q,Math.max(1e3,Date.now()-W)));W=Date.now();const e=(0,a.getElement)("#movie_player",!0);if(!e)return;const t=e.querySelector(".html5-video-container");if(!t)return;y&&y.disconnect(),y=new MutationObserver(G),b=t,y.observe(t,{attributes:!0,childList:!0,subtree:!0})}}const Y=[];t.waitForVideo=function(){return g?Promise.resolve(g):new Promise((e=>{Y.push(e)}))};let Q="",K=!1;function G(){var e;return o(this,void 0,void 0,(function*(){if(E)return;(0,a.isVisible)(g)||X()||(g=null),E=!0;let t=(0,i.isSafari)()&&document.querySelector('video[vinegared="true"]')||(yield(0,a.waitForElement)("video",!0)),n=!1;if(document.querySelector(".miniplayer video")&&t){const e=[...document.querySelectorAll("video")].filter((e=>(0,a.isVisible)(e)));if(e.length>1){const o=t.duration,i=e.find((e=>!e.closest(".miniplayer")));i&&(t=i),isNaN(t.duration)&&(yield(0,r.waitFor)((()=>!!t.duration),5e3,50)),n=o!==t.duration}}if(E=!1,g===t&&v===t.style.width&&!n)return;g=t,v=t.style.width;const o=!w.includes(g);if(o&&w.push(g),null===(e=A.videoElementChange)||void 0===e||e.call(A,o,g),Y.forEach((e=>e(t))),Y.length=0,q(),document.URL.includes("/embed/")){if(K)return;K=!0;const e=(0,a.waitForElement)(m).then((e=>(0,r.waitFor)((()=>e),void 0,void 0,(e=>e.getAttribute("href")!==Q&&!!e.getAttribute("href")&&!!e.textContent))));e.catch((()=>K=!1)),e.then((e=>Q=e.getAttribute("href"))).then((()=>K=!1)).then((()=>R(z())))}else R(z())}))}function X(){return(0,i.isSafari)()&&!!document.querySelector('video[vinegared="true"]')}function Z(e){var t,n,o,r;const i=e.data,a=i.type;"sponsorblock"!==i.source||!A.allowClipPage&&(null===(t=null===document||void 0===document?void 0:document.URL)||void 0===t?void 0:t.includes("youtube.com/clip/"))||("navigation"===a&&(0,l.newThumbnails)(),"navigation"===a&&i.videoID?(P=i.pageType,i.channelID&&(k={id:i.channelID,author:i.channelTitle,status:p.Found},N||H(i.videoID)),R(i.videoID)):"ad"===a?T!=i.playing&&(T=i.playing,null===(n=A.updatePlayerBar)||void 0===n||n.call(A)):"data"===a&&i.videoID?(i.isInline||(D=i.videoID),R(i.videoID,i.isInline),S=i.isLive||i.isPremiere):"newElement"===a?(0,l.newThumbnails)():"videoIDsLoaded"===a?null===(o=A.newVideosLoaded)||void 0===o||o.call(A,i.videoIDs):"adDuration"===a?U=i.duration:"currentTimeWrong"===a&&(O=!0,alert(`${chrome.i18n.getMessage("submissionFailedServerSideAds")}\n\nInclude the following:\n${i.playerTime}\n${i.expectedTime}`)),null===(r=A.windowListenerHandler)||void 0===r||r.call(A,e))}t.triggerVideoElementChange=function(e){var t;g=e,v=e.style.width;const n=!w.includes(g);n&&w.push(g),null===(t=A.videoElementChange)||void 0===t||t.call(A,n,g)};let J=0;function ee(){return q(),(!(0,a.isVisible)(g)||_&&g&&isNaN(g.duration))&&Date.now()-J>500&&(J=Date.now(),(0,a.isVisible)(g)||X()||(g=null),G()),g}function te(){var e;const t=null===(e=ee())||void 0===e?void 0:e.currentTime;return t?t-U:t}function ne(){return!!document.URL.match(/@|\/c\/|\/channel\/|\/user\//)}t.getVideo=ee,t.getVideoID=function(){return x},t.getVideoDuration=function(){var e;return Math.max(0,(null!==(e=null==g?void 0:g.duration)&&void 0!==e?e:0)-U)},t.getCurrentTime=te,t.verifyCurrentTime=function(e){ee()&&ee().paused&&window.postMessage({source:"sb-verify-time",time:null!=e?e:te(),rawTime:ee().currentTime},"/")},t.setCurrentTime=function(e){ee()&&(ee().currentTime=e+U)},t.isOnInvidious=function(){return M},t.isOnMobileYouTube=function(){return _},t.isOnYouTubeMusic=function(){return L},t.isOnYTTV=function(){return I},t.getWaitingForChannelID=function(){return N},t.getChannelIDInfo=function(){return k},t.getIsAdPlaying=function(){return T},t.setIsAdPlaying=function(e){T=e},t.getIsLivePremiere=function(){return S},t.getLastNonInlineVideoID=function(){return D},t.getIsInline=function(){return F},t.isCurrentTimeWrong=function(){return O},t.isOnChannelPage=ne},4342:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),r=n(8856),i=n(7152);var a;!function(e){e[e.Timer=0]="Timer",e[e.Paused=1]="Paused",e[e.Stopped=2]="Stopped"}(a||(a={}));const l=[10,100,10,10];class s extends o.Component{constructor(e){var t;super(e),this.handleMouseMoveBinded=this.handleMouseMove.bind(this),this.parentRef=o.createRef();const n=()=>this.props.maxCountdownTime?this.props.maxCountdownTime():r.default.config.skipNoticeDuration;this.countdownInterval=null,this.amountOfPreviousNotices=e.amountOfPreviousNotices||0,this.idSuffix=e.idSuffix||"",this.state={maxCountdownTime:n,countdownTime:n(),countdownMode:a.Timer,mouseHovering:!1,startFaded:null!==(t=this.props.startFaded)&&void 0!==t&&t,mouseDownInfo:null,mouseMoved:!1,right:l[0],bottom:e.showInSecondSlot?290:l[1]}}componentDidMount(){this.startCountdown()}render(){var e;const t=Object.assign({zIndex:this.props.zIndex||1e3+this.amountOfPreviousNotices,right:this.state.right,bottom:this.state.bottom,userSelect:this.state.mouseDownInfo&&this.state.mouseMoved?"none":"auto"},null!==(e=this.props.style)&&void 0!==e?e:{});return o.createElement("div",{id:"sponsorSkipNotice"+this.idSuffix,className:"sponsorSkipObject sponsorSkipNoticeParent"+(this.props.showInSecondSlot?" secondSkipNotice":"")+(this.props.extraClass?` ${this.props.extraClass}`:""),onMouseEnter:e=>this.onMouseEnter(e),onMouseLeave:()=>{this.timerMouseLeave()},onMouseDown:e=>{document.addEventListener("mousemove",this.handleMouseMoveBinded),this.setState({mouseDownInfo:{x:e.clientX,y:e.clientY,right:this.state.right,bottom:this.state.bottom},mouseMoved:!1})},onMouseUp:()=>{document.removeEventListener("mousemove",this.handleMouseMoveBinded),this.setState({mouseDownInfo:null})},ref:this.parentRef,style:t},o.createElement("div",{className:"sponsorSkipNoticeTableContainer"+(this.props.fadeIn?" sponsorSkipNoticeFadeIn":"")+(this.state.startFaded?" sponsorSkipNoticeFaded":"")},o.createElement("table",{className:"sponsorSkipObject sponsorSkipNotice"+(this.props.limitWidth?" sponsorSkipNoticeLimitWidth":"")},o.createElement("tbody",null,o.createElement("tr",{id:"sponsorSkipNoticeFirstRow"+this.idSuffix,className:"sponsorSkipNoticeFirstRow"},o.createElement("td",{className:"noticeLeftIcon"},!this.props.hideLogo&&o.createElement(i.default,{id:"sponsorSkipLogo"+this.idSuffix,fill:this.props.logoFill,className:"sponsorSkipLogo sponsorSkipObject"}),o.createElement("span",{id:"sponsorSkipMessage"+this.idSuffix,style:{float:"left",marginRight:this.props.hideLogo?"0px":null},className:"sponsorSkipMessage sponsorSkipObject"},this.props.noticeTitle),this.props.firstColumn),this.props.firstRow,!this.props.hideRightInfo&&o.createElement("td",{className:"sponsorSkipNoticeRightSection",style:{top:"9.32px"}},this.props.timed?o.createElement("span",{id:"sponsorSkipNoticeTimeLeft"+this.idSuffix,onClick:()=>this.toggleManualPause(),className:"sponsorSkipObject sponsorSkipNoticeTimeLeft"},this.getCountdownElements()):"",o.createElement("img",{src:chrome.runtime.getURL("icons/close.png"),className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"+(this.props.biggerCloseButton?" biggerCloseButton":""),onClick:()=>this.close()}))),this.props.children,!this.props.smaller&&this.props.bottomRow?this.props.bottomRow:null))),this.props.smaller&&this.props.bottomRow?o.createElement("table",{style:{visibility:"hidden",paddingTop:"14px"}},o.createElement("tbody",null,this.props.bottomRow)):null)}getCountdownElements(){return[o.createElement("span",{id:"skipNoticeTimerText"+this.idSuffix,key:"skipNoticeTimerText",className:this.state.countdownMode!==a.Timer?"sbhidden":""},chrome.i18n.getMessage("NoticeTimeAfterSkip").replace("{seconds}",Math.ceil(this.state.countdownTime).toString())),o.createElement("img",{id:"skipNoticeTimerPaused"+this.idSuffix,key:"skipNoticeTimerPaused",className:this.state.countdownMode!==a.Paused?"sbhidden":"",src:chrome.runtime.getURL("icons/pause.svg"),alt:chrome.i18n.getMessage("paused")}),o.createElement("img",{id:"skipNoticeTimerStopped"+this.idSuffix,key:"skipNoticeTimerStopped",className:this.state.countdownMode!==a.Stopped?"sbhidden":"",src:chrome.runtime.getURL("icons/stop.svg"),alt:chrome.i18n.getMessage("manualPaused")})]}onMouseEnter(e){this.props.onMouseEnter&&this.props.onMouseEnter(e),this.fadedMouseEnter(),this.timerMouseEnter()}fadedMouseEnter(){this.state.startFaded&&this.setState({startFaded:!1})}timerMouseEnter(){this.state.countdownMode!==a.Stopped&&(this.pauseCountdown(),this.setState({mouseHovering:!0}))}timerMouseLeave(){this.state.countdownMode!==a.Stopped&&(this.startCountdown(),this.setState({mouseHovering:!1}))}toggleManualPause(){this.setState({countdownMode:this.state.countdownMode===a.Stopped?a.Timer:a.Stopped},(()=>{this.state.countdownMode===a.Stopped||this.state.mouseHovering?this.pauseCountdown():this.startCountdown()}))}countdown(){if(!this.props.timed)return;const e=Math.min(this.state.countdownTime-1,this.state.maxCountdownTime());if(e<=0)return clearInterval(this.countdownInterval),void this.close();if(3==e&&this.props.fadeOut){const e=document.getElementById("sponsorSkipNotice"+this.idSuffix);null==e||e.style.removeProperty("animation"),null==e||e.classList.add("sponsorSkipNoticeFadeOut")}this.setState({countdownTime:e})}removeFadeAnimation(){const e=document.getElementById("sponsorSkipNotice"+this.idSuffix);e.classList.remove("sponsorSkipNoticeFadeOut"),e.style.animation="none"}pauseCountdown(){this.props.timed&&!this.props.dontPauseCountdown&&(this.countdownInterval&&clearInterval(this.countdownInterval),this.countdownInterval=null,this.setState({countdownTime:this.state.maxCountdownTime(),countdownMode:this.state.countdownMode===a.Timer?a.Paused:this.state.countdownMode}),this.removeFadeAnimation())}startCountdown(){this.props.timed&&null===this.countdownInterval&&(this.setState({countdownTime:this.state.maxCountdownTime(),countdownMode:a.Timer}),this.setupInterval())}setupInterval(){this.countdownInterval&&clearInterval(this.countdownInterval),this.countdownInterval=setInterval(this.countdown.bind(this),1e3)}resetCountdown(){this.props.timed&&(this.setupInterval(),this.setState({countdownTime:this.state.maxCountdownTime(),countdownMode:a.Timer}),this.removeFadeAnimation())}close(e){null!==this.countdownInterval&&clearInterval(this.countdownInterval),e||this.props.closeListener()}addNoticeInfoMessage(e,t=""){const n=document.getElementById("sponsorTimesInfoMessage"+this.idSuffix);null!=n&&document.getElementById("sponsorSkipNotice"+this.idSuffix).removeChild(n);const o=document.getElementById("sponsorTimesInfoMessage"+this.idSuffix+"2");null!=o&&document.getElementById("sponsorSkipNotice"+this.idSuffix).removeChild(o);const r=document.createElement("p");if(r.id="sponsorTimesInfoMessage"+this.idSuffix,r.className="sponsorTimesInfoMessage",r.innerText=e,document.querySelector("#sponsorSkipNotice"+this.idSuffix+" > tbody").insertBefore(r,document.getElementById("sponsorSkipNoticeSpacer"+this.idSuffix)),void 0!==t){const e=document.createElement("p");e.id="sponsorTimesInfoMessage"+this.idSuffix+"2",e.className="sponsorTimesInfoMessage",e.innerText=t,document.querySelector("#sponsorSkipNotice"+this.idSuffix+" > tbody").insertBefore(e,document.getElementById("sponsorSkipNoticeSpacer"+this.idSuffix))}}getElement(){return this.parentRef}componentWillUnmount(){document.removeEventListener("mousemove",this.handleMouseMoveBinded)}handleMouseMove(e){if(this.state.mouseDownInfo&&1===e.buttons){const[t,n]=[e.clientX,e.clientY],o=t-this.state.mouseDownInfo.x,r=n-this.state.mouseDownInfo.y;(o>0||r>0)&&this.setState({mouseMoved:!0});const i=this.parentRef.current,a=i.parentElement.parentElement;this.setState({right:Math.min(a.clientWidth-i.clientWidth-l[2],Math.max(l[0],this.state.mouseDownInfo.right-o)),bottom:Math.min(a.clientHeight-i.clientHeight-l[3],Math.max(l[1],this.state.mouseDownInfo.bottom-r))})}else document.removeEventListener("mousemove",this.handleMouseMoveBinded)}}t.default=s},4332:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);class r extends o.Component{constructor(e){super(e)}render(){const e={};return this.props.onClick&&(e.cursor="pointer",e.textDecoration="underline"),o.createElement("tr",{id:"sponsorTimesInfoMessage"+this.props.idSuffix,onClick:this.props.onClick,style:e,className:"sponsorTimesInfoMessage"},o.createElement("td",null,this.props.icon?o.createElement("img",{src:chrome.runtime.getURL(this.props.icon),className:"sponsorTimesInfoIcon"}):null,o.createElement("span",null,this.getTextElements(this.props.text))))}getTextElements(e){const t=[],n=e.split(/(?=\s+)/);for(const e of n)e.match(/^\s*http/)?t.push(o.createElement("a",{href:e,target:"_blank",rel:"noreferrer"},e)):t.push(e);return t}}t.default=r},8856:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.generateDebugDetails=void 0;const o=n(8272),r=n(5339),i=n(9209),a=n(1740);class l extends a.ProtoConfig{resetToDefault(){chrome.storage.sync.set(Object.assign(Object.assign({},this.syncDefaults),{userID:this.config.userID,minutesSaved:this.config.minutesSaved,skipCount:this.config.skipCount,sponsorTimesContributed:this.config.sponsorTimesContributed})),chrome.storage.local.set(Object.assign({},this.localDefaults))}}const s=new l({userID:null,isVip:!1,permissions:{},defaultCategory:"chooseACategory",renderSegmentsAsChapters:!1,whitelistedChannels:[],forceChannelCheck:!1,minutesSaved:0,skipCount:0,sponsorTimesContributed:0,submissionCountSinceCategories:0,showTimeWithSkips:!0,disableSkipping:!1,muteSegments:!0,fullVideoSegments:!0,fullVideoLabelsOnThumbnails:!0,manualSkipOnFullVideo:!1,trackViewCount:!0,trackViewCountInPrivate:!0,trackDownvotes:!0,trackDownvotesInPrivate:!1,dontShowNotice:!1,showUpcomingNotice:!1,noticeVisibilityMode:i.NoticeVisibilityMode.FadedForAutoSkip,hideVideoPlayerControls:!1,hideInfoButtonPlayerControls:!1,hideDeleteButtonPlayerControls:!1,hideUploadButtonPlayerControls:!1,hideSkipButtonPlayerControls:!1,hideDiscordLaunches:0,hideDiscordLink:!1,invidiousInstances:["invidious.snopyta.org"],supportInvidious:!1,serverAddress:o.serverAddress,minDuration:0,skipNoticeDuration:4,audioNotificationOnSkip:!1,checkForUnlistedVideos:!1,testingServer:!1,ytInfoPermissionGranted:!1,allowExpirements:!0,showDonationLink:!0,showPopupDonationCount:0,showUpsells:!0,showNewFeaturePopups:!0,donateClicked:0,autoHideInfoButton:!0,autoSkipOnMusicVideos:!1,skipNonMusicOnlyOnYoutubeMusic:!1,scrollToEditTimeUpdate:!1,categoryPillUpdate:!1,hookUpdate:!1,showChapterInfoMessage:!0,darkMode:!0,showCategoryGuidelines:!0,showCategoryWithoutPermission:!1,showSegmentNameInChapterBar:!0,showAutogeneratedChapters:!0,useVirtualTime:!0,showSegmentFailedToFetchWarning:!0,allowScrollingToEdit:!0,deArrowInstalled:!1,showDeArrowPromotion:!0,showDeArrowInSettings:!0,shownDeArrowPromotion:!1,showZoomToFillError2:!0,cleanPopup:!1,hideSegmentCreationInPopup:!1,categoryPillColors:{},skipKeybind:{key:"Enter"},skipToHighlightKeybind:{key:"Enter",ctrl:!0},startSponsorKeybind:{key:";"},submitKeybind:{key:"'"},actuallySubmitKeybind:{key:"'",ctrl:!0},previewKeybind:{key:";",ctrl:!0},nextChapterKeybind:{key:"ArrowRight",ctrl:!0},previousChapterKeybind:{key:"ArrowLeft",ctrl:!0},closeSkipNoticeKeybind:{key:"Backspace"},downvoteKeybind:{key:"h",shift:!0},upvoteKeybind:{key:"g",shift:!0},categorySelections:[{name:"sponsor",option:i.CategorySkipOption.AutoSkip},{name:"poi_highlight",option:i.CategorySkipOption.ManualSkip},{name:"exclusive_access",option:i.CategorySkipOption.ShowOverlay},{name:"chapter",option:i.CategorySkipOption.ShowOverlay}],payments:{licenseKey:null,lastCheck:0,lastFreeCheck:0,freeAccess:!1,chaptersAllowed:!1},colorPalette:{red:"#780303",white:"#ffffff",locked:"#ffc83d"},barTypes:{"preview-chooseACategory":{color:"#ffffff",opacity:"0.7"},sponsor:{color:"#00d400",opacity:"0.7"},"preview-sponsor":{color:"#007800",opacity:"0.7"},selfpromo:{color:"#ffff00",opacity:"0.7"},"preview-selfpromo":{color:"#bfbf35",opacity:"0.7"},exclusive_access:{color:"#008a5c",opacity:"0.7"},interaction:{color:"#cc00ff",opacity:"0.7"},"preview-interaction":{color:"#6c0087",opacity:"0.7"},intro:{color:"#00ffff",opacity:"0.7"},"preview-intro":{color:"#008080",opacity:"0.7"},outro:{color:"#0202ed",opacity:"0.7"},"preview-outro":{color:"#000070",opacity:"0.7"},preview:{color:"#008fd6",opacity:"0.7"},"preview-preview":{color:"#005799",opacity:"0.7"},hook:{color:"#395699",opacity:"0.8"},"preview-hook":{color:"#273963",opacity:"0.7"},music_offtopic:{color:"#ff9900",opacity:"0.7"},"preview-music_offtopic":{color:"#a6634a",opacity:"0.7"},poi_highlight:{color:"#ff1684",opacity:"0.7"},"preview-poi_highlight":{color:"#9b044c",opacity:"0.7"},filler:{color:"#7300FF",opacity:"0.9"},"preview-filler":{color:"#2E0066",opacity:"0.7"},chapter:{color:"#ffd983",opacity:"0"}}},{downvotedSegments:{},navigationApiAvailable:null,alreadyInstalled:!1,unsubmittedSegments:{},skipRules:[]},(function(e){if(e.changeChapterColor||(e.barTypes.chapter.color="#ffd983",e.changeChapterColor=!0,chrome.storage.sync.set({changeChapterColor:!0,barTypes:e.barTypes})),e.showZoomToFillError&&chrome.storage.sync.remove("showZoomToFillError"),e.unsubmittedSegments&&Object.keys(e.unsubmittedSegments).length>0&&chrome.storage.local.set({unsubmittedSegments:e.unsubmittedSegments},(()=>{chrome.storage.sync.remove("unsubmittedSegments")})),e.chapterCategoryAdded||(e.chapterCategoryAdded=!0,e.categorySelections.some((e=>"chapter"===e.name))||(e.categorySelections.push({name:"chapter",option:i.CategorySkipOption.ShowOverlay}),e.categorySelections=e.categorySelections)),void 0!==e.exclusive_accessCategoryAdded&&chrome.storage.sync.remove("exclusive_accessCategoryAdded"),void 0!==e.fillerUpdate&&chrome.storage.sync.remove("fillerUpdate"),void 0!==e.highlightCategoryAdded&&chrome.storage.sync.remove("highlightCategoryAdded"),void 0!==e.highlightCategoryUpdate&&chrome.storage.sync.remove("highlightCategoryUpdate"),e.askAboutUnlistedVideos&&chrome.storage.sync.remove("askAboutUnlistedVideos"),!e.autoSkipOnMusicVideosUpdate){e.autoSkipOnMusicVideosUpdate=!0;for(const t of e.categorySelections)if("music_offtopic"===t.name&&t.option===i.CategorySkipOption.AutoSkip){e.autoSkipOnMusicVideos=!0;break}}if(e.disableAutoSkip)for(const t of e.categorySelections)"sponsor"===t.name&&(t.option=i.CategorySkipOption.ManualSkip,chrome.storage.sync.remove("disableAutoSkip"));"string"==typeof e.skipKeybind&&(e.skipKeybind={key:e.skipKeybind}),"string"==typeof e.startSponsorKeybind&&(e.startSponsorKeybind={key:e.startSponsorKeybind}),"string"==typeof e.submitKeybind&&(e.submitKeybind={key:e.submitKeybind});const t=["skipKeybind","startSponsorKeybind","submitKeybind"];for(let n=t.length-1;n>=0;n--)for(let o=0;o<t.length;o++)n!=o&&(0,a.keybindEquals)(e[t[n]],e[t[o]])&&(e[t[n]]=null);void 0!==e.sponsorVideoID&&chrome.storage.sync.remove("sponsorVideoID"),void 0!==e.previousVideoID&&chrome.storage.sync.remove("previousVideoID"),!e.supportInvidious&&e.invidiousInstances.length<r.length&&(e.invidiousInstances=[...new Set([...r,...e.invidiousInstances])]),e.lastIsVipUpdate&&chrome.storage.sync.remove("lastIsVipUpdate")}));t.default=s,t.generateDebugDetails=function(){const e={debug:{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,extensionVersion:chrome.runtime.getManifest().version},config:JSON.parse(JSON.stringify(s.cachedSyncConfig))};return delete e.config.userID,e.config.serverAddress=e.config.serverAddress===o.serverAddress?"Default server address":"Custom server address",e.config.invidiousInstances=e.config.invidiousInstances.length,e.config.whitelistedChannels=e.config.whitelistedChannels.length,JSON.stringify(e,null,4)}},3996:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.PopupComponent=t.LoadingStatus=void 0;const r=n(6540),i=n(5760),a=n(1740),l=n(997),s=n(8856),u=n(3225),c=n(703),d=n(9209),f=n(4295),p=n(346);var m;!function(e){e[e.Loading=0]="Loading",e[e.SegmentsFound=1]="SegmentsFound",e[e.NoSegmentsFound=2]="NoSegmentsFound",e[e.ConnectionError=3]="ConnectionError",e[e.StillLoading=4]="StillLoading",e[e.NoVideo=5]="NoVideo"}(m=t.LoadingStatus||(t.LoadingStatus={}));let h=0;function g(e){return o(this,void 0,void 0,(function*(){const t=yield y({message:"isInfoFound",updating:e.updating});t&&t.videoID?v(t,e):(chrome.runtime.lastError,e.setStatus({status:m.NoVideo}),e.updating||(h++,h<6&&setTimeout((()=>g(e)),100*h)))}))}function v(e,t){e.found?t.setStatus({status:m.SegmentsFound}):404===e.status||200===e.status?t.setStatus({status:m.NoSegmentsFound}):e.status?t.setStatus({status:m.ConnectionError,code:e.status}):t.setStatus({status:m.StillLoading}),t.setVideoID(e.videoID),t.setCurrentTime(e.time),t.setChannelWhitelisted(e.channelWhitelisted),t.setSegments((e.sponsorTimes||[]).filter((e=>e.source===d.SponsorSourceType.Server)).sort(((e,t)=>t.segment[1]-e.segment[1])).sort(((e,t)=>e.segment[0]-t.segment[0])).sort(((e,t)=>e.actionType===d.ActionType.Full?-1:t.actionType===d.ActionType.Full?1:0))),t.setLoopedChapter(e.loopedChapter)}function y(e){return new Promise((t=>{chrome.tabs?chrome.tabs.query({active:!0,currentWindow:!0},(n=>chrome.tabs.sendMessage(n[0].id,e,t))):chrome.runtime.sendMessage({message:"tabs",data:e},t)}))}function b(e){const t=chrome.runtime.connect({name:"popup"});t.onDisconnect.addListener((()=>b(e))),t.onMessage.addListener((t=>function(e,t){switch(t.message){case"time":e.setCurrentTime(t.time);break;case"infoUpdated":v(t,e);break;case"videoChanged":e.setStatus({status:m.StillLoading}),e.setVideoID(t.videoID),e.setChannelWhitelisted(t.whitelisted),e.setSegments([])}}(e,t)))}t.PopupComponent=()=>{const[e,t]=r.useState({status:m.Loading}),[n,d]=r.useState(!s.default.config.disableSkipping),[h,v]=r.useState(null),[w,S]=r.useState(!1),[k,C]=r.useState(s.default.config.dontShowNotice),[E,T]=r.useState(0),[x,M]=r.useState([]),[_,I]=r.useState(null),[L,P]=r.useState(null);return r.useEffect((()=>{g({updating:!1,setStatus:t,setChannelWhitelisted:v,setVideoID:P,setCurrentTime:T,setSegments:M,setLoopedChapter:I}),b({setStatus:t,setChannelWhitelisted:v,setVideoID:P,setCurrentTime:T,setSegments:M,setLoopedChapter:I}),function(e){window!==window.top&&document.addEventListener("keydown",(t=>{const n=t.target;"INPUT"!==n.tagName&&"TEXTAREA"!==n.tagName&&"ArrowUp"!==t.key&&"ArrowDown"!==t.key&&(" "===t.key&&t.preventDefault(),e({message:"keydown",key:t.key,keyCode:t.keyCode,code:t.code,which:t.which,shiftKey:t.shiftKey,ctrlKey:t.ctrlKey,altKey:t.altKey,metaKey:t.metaKey}))}))}(y)}),[]),r.createElement("div",{id:"sponsorblockPopup"},window!==window.top&&r.createElement("button",{id:"sbCloseButton",title:"__MSG_closePopup__",className:"sbCloseButton",onClick:()=>{y({message:"closePopup"})}},r.createElement("img",{src:"icons/close.png",width:"15",height:"15",alt:"Close icon"})),s.default.config.testingServer&&r.createElement("div",{id:"sbBetaServerWarning",title:chrome.i18n.getMessage("openOptionsPage"),onClick:()=>{chrome.runtime.sendMessage({message:"openConfig",hash:"advanced"})}},chrome.i18n.getMessage("betaServerWarning")),r.createElement("header",{className:"sbPopupLogo "+(s.default.config.cleanPopup?"hidden":"")},r.createElement("img",{src:"icons/IconSponsorBlocker256px.png",alt:"SponsorBlock Logo",width:"40",height:"40",id:"sponsorBlockPopupLogo"}),r.createElement("p",{className:"u-mZ"},"SponsorBlock")),r.createElement("p",{id:"videoFound",className:"u-mZ grey-text "+(s.default.config.cleanPopup?"cleanPopupMargin":"")},function(e){switch(e.status){case m.Loading:return chrome.i18n.getMessage("Loading");case m.SegmentsFound:return chrome.i18n.getMessage("sponsorFound");case m.NoSegmentsFound:return chrome.i18n.getMessage("sponsor404");case m.ConnectionError:return chrome.i18n.getMessage("connectionError")+e.code;case m.StillLoading:return chrome.i18n.getMessage("segmentsStillLoading");case m.NoVideo:return chrome.i18n.getMessage("noVideoID")}}(e)),r.createElement("button",{id:"refreshSegmentsButton",title:chrome.i18n.getMessage("refreshSegments"),onClick:e=>{const n=u.AnimationUtils.applyLoadingAnimation(e.currentTarget,.3);y({message:"refreshSegments"}).then((()=>{g({updating:!0,setStatus:t,setChannelWhitelisted:v,setVideoID:P,setCurrentTime:T,setSegments:M,setLoopedChapter:I}).then((()=>n()))}))}},r.createElement("img",{src:"/icons/refresh.svg",alt:"Refresh icon",id:"refreshSegments"})),r.createElement(c.SegmentListComponent,{videoID:L,currentTime:E,status:e.status,segments:x,loopedChapter:_,sendMessage:y}),r.createElement("div",{className:"sbControlsMenu"},null!==h&&r.createElement("label",{id:"whitelistButton",htmlFor:"whitelistToggle",className:"toggleSwitchContainer sbControlsMenu-item",role:"button",tabIndex:0},r.createElement("input",{type:"checkbox",style:{display:"none"},id:"whitelistToggle",checked:h,onChange:e=>o(void 0,void 0,void 0,(function*(){var t;const n=yield y({message:"getChannelID"});if(!n.channelID)return void(n.isYTTV?alert(chrome.i18n.getMessage("yttvNoChannelWhitelist")):alert(chrome.i18n.getMessage("channelDataNotFound")+" https://github.com/ajayyy/SponsorBlock/issues/753"));const o=null!==(t=s.default.config.whitelistedChannels)&&void 0!==t?t:[];e.target.checked?o.splice(o.indexOf(n.channelID),1):o.push(n.channelID),s.default.config.whitelistedChannels=o,v(!e.target.checked),s.default.config.forceChannelCheck||S(!0),y({message:"whitelistChange",value:!e.target.checked})}))}),r.createElement("svg",{viewBox:"0 0 24 24",width:"23",height:"23",className:"SBWhitelistIcon sbControlsMenu-itemIcon "+(h?" rotated":"")},r.createElement("path",{d:"M24 10H14V0h-4v10H0v4h10v10h4V14h10z"})),r.createElement("span",{id:"whitelistChannel",className:h?" hidden":""},chrome.i18n.getMessage("whitelistChannel")),r.createElement("span",{id:"unwhitelistChannel",className:h?"":" hidden"},chrome.i18n.getMessage("removeFromWhitelist"))),r.createElement("label",{id:"disableExtension",htmlFor:"toggleSwitch",className:"toggleSwitchContainer sbControlsMenu-item",role:"button",tabIndex:0},r.createElement("span",{className:"toggleSwitchContainer-switch"},r.createElement("input",{type:"checkbox",style:{display:"none"},id:"toggleSwitch",checked:n,onChange:e=>{s.default.config.disableSkipping=!e.target.checked,d(e.target.checked)}}),r.createElement("span",{className:"switchBg shadow"}),r.createElement("span",{className:"switchBg white"}),r.createElement("span",{className:"switchBg green"}),r.createElement("span",{className:"switchDot"})),r.createElement("span",{id:"disableSkipping",className:n?" hidden":""},chrome.i18n.getMessage("enableSkipping")),r.createElement("span",{id:"enableSkipping",className:n?"":" hidden"},chrome.i18n.getMessage("disableSkipping"))),r.createElement("button",{id:"optionsButton",className:"sbControlsMenu-item",title:chrome.i18n.getMessage("Options"),onClick:()=>{chrome.runtime.sendMessage({message:"openConfig"})}},r.createElement("img",{src:"/icons/settings.svg",alt:"Settings icon",width:"23",height:"23",className:"sbControlsMenu-itemIcon",id:"sbPopupIconSettings"}),chrome.i18n.getMessage("Options"))),w&&r.createElement("a",{id:"whitelistForceCheck",onClick:()=>{chrome.runtime.sendMessage({message:"openConfig",hash:"behavior"})}},chrome.i18n.getMessage("forceChannelCheckPopup")),!s.default.config.cleanPopup&&!s.default.config.hideSegmentCreationInPopup&&r.createElement(f.SegmentSubmissionComponent,{videoID:L||"",status:e.status,sendMessage:y}),!s.default.config.cleanPopup&&r.createElement(i.YourWorkComponent,null),!s.default.config.cleanPopup&&r.createElement("footer",{id:"sbFooter"},r.createElement("a",{id:"helpButton",onClick:()=>{chrome.runtime.sendMessage({message:"openHelp"})}},chrome.i18n.getMessage("help")),r.createElement("a",{href:"https://sponsor.ajay.app",target:"_blank",rel:"noreferrer"},chrome.i18n.getMessage("website")),r.createElement("a",{href:"https://sponsor.ajay.app/stats",target:"_blank",rel:"noreferrer",className:(0,a.isSafari)()?" hidden":""},chrome.i18n.getMessage("viewLeaderboard")),r.createElement("a",{href:"https://sponsor.ajay.app/donate",target:"_blank",rel:"noreferrer",className:(0,l.showDonationLink)()?"":" hidden",onClick:()=>{s.default.config.donateClicked=s.default.config.donateClicked+1}},chrome.i18n.getMessage("Donate")),r.createElement("br",null),r.createElement("a",{href:"https://github.com/ajayyy/SponsorBlock",target:"_blank",rel:"noreferrer"},"GitHub"),r.createElement("a",{href:"https://discord.gg/SponsorBlock",target:"_blank",rel:"noreferrer"},"Discord"),r.createElement("a",{href:"https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org",target:"_blank",rel:"noreferrer"},"Matrix"),r.createElement("a",{href:"https://wiki.sponsor.ajay.app/w/Guidelines",target:"_blank",rel:"noreferrer"},chrome.i18n.getMessage("guidelines")),r.createElement("br",null),r.createElement("a",{id:"debugLogs",onClick:()=>o(void 0,void 0,void 0,(function*(){const e=yield y({message:"getLogs"});(0,p.copyToClipboardPopup)(`${(0,s.generateDebugDetails)()}\n\nWarn:\n${e.warn.join("\n")}\n\nDebug:\n${e.debug.join("\n")}`,y)}))},chrome.i18n.getMessage("copyDebugLogs"))),k&&r.createElement("button",{id:"showNoticeAgain",onClick:()=>{s.default.config.dontShowNotice=!1,C(!1)}},chrome.i18n.getMessage("showNotice")))},window.addEventListener("message",(e=>o(void 0,void 0,void 0,(function*(){var t;if(e.source===window.parent&&e.origin.endsWith(".youtube.com")&&e.data&&"style"===(null===(t=e.data)||void 0===t?void 0:t.type)){const t=document.createElement("style");t.textContent=e.data.css,document.head.appendChild(t)}}))))},703:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.SegmentListComponent=void 0;const r=n(6540),i=n(9209),a=n(8856),l=n(1108),s=n(1575),u=n(7913),c=n(3225),d=n(6062),f=n(3996),p=n(3936),m=n(7621),h=n(346);var g;function v({segment:e,videoID:t,currentTime:n,isVip:l,startingLooped:f,tabFilter:p,sendMessage:m}){var g;const[v,S]=r.useState(null),[k,C]=r.useState(e.hidden||i.SponsorHideType.Visible),[E,T]=r.useState(f);let x="";return e.hidden===i.SponsorHideType.Downvoted?x=" ("+chrome.i18n.getMessage("hiddenDueToDownvote")+")":e.hidden===i.SponsorHideType.MinimumDuration?x=" ("+chrome.i18n.getMessage("hiddenDueToDuration")+")":e.hidden===i.SponsorHideType.Hidden&&(x=" ("+chrome.i18n.getMessage("manuallyHidden")+")"),r.createElement("details",{"data-uuid":e.UUID,onDoubleClick:()=>b({segment:e,sendMessage:m}),onMouseEnter:()=>{w({segment:e,sendMessage:m})},className:"votingButtons "+(p(e)?"":"hidden")},r.createElement("summary",{className:"segmentSummary "+(n>=e.segment[0]?n<e.segment[1]?"segmentActive":"segmentPassed":"")},r.createElement("div",null,e.actionType!==i.ActionType.Chapter&&r.createElement("span",{className:"sponsorTimesCategoryColorCircle dot",style:{backgroundColor:null===(g=a.default.config.barTypes[e.category])||void 0===g?void 0:g.color}}),r.createElement("span",{className:"summaryLabel"},(e.description||(0,s.shortCategoryName)(e.category))+x)),r.createElement("div",{style:{margin:"5px"}},e.actionType===i.ActionType.Full?chrome.i18n.getMessage("full"):(0,u.getFormattedTime)(e.segment[0],!0)+(e.actionType!==i.ActionType.Poi?" "+chrome.i18n.getMessage("to")+" "+(0,u.getFormattedTime)(e.segment[1],!0):""))),r.createElement("div",{className:"sbVoteButtonsContainer "+(v?"hidden":"")},r.createElement("img",{className:"voteButton",title:"Upvote",src:chrome.runtime.getURL("icons/thumbs_up.svg"),onClick:()=>{y({type:1,UUID:e.UUID,setVoteMessage:S,sendMessage:m})}}),r.createElement("img",{className:"voteButton",title:"Downvote",src:e.locked&&l?chrome.runtime.getURL("icons/thumbs_down_locked.svg"):chrome.runtime.getURL("icons/thumbs_down.svg"),onClick:()=>{y({type:0,UUID:e.UUID,setVoteMessage:S,sendMessage:m})}}),r.createElement("img",{className:"voteButton",title:"Copy Segment ID",src:chrome.runtime.getURL("icons/clipboard.svg"),onClick:n=>o(this,void 0,void 0,(function*(){const o=c.AnimationUtils.applyLoadingAnimation(n.currentTarget,.3);if(e.UUID.length>60)(0,h.copyToClipboardPopup)(e.UUID,m);else{const n=yield(0,d.asyncRequestToServer)("GET","/api/segmentID",{UUID:e.UUID,videoID:t});n.ok&&n.responseText&&(0,h.copyToClipboardPopup)(n.responseText,m)}o()}))}),e.actionType===i.ActionType.Chapter&&r.createElement("img",{className:"voteButton",title:E?chrome.i18n.getMessage("unloopChapter"):chrome.i18n.getMessage("loopChapter"),src:E?chrome.runtime.getURL("icons/looped.svg"):chrome.runtime.getURL("icons/loop.svg"),onClick:t=>{(function({segment:e,element:t,sendMessage:n}){n({message:"loopChapter",UUID:null==e?void 0:e.UUID}),t&&c.AnimationUtils.applyLoadingAnimation(t,.3)()})(E?{segment:null,element:t.currentTarget,sendMessage:m}:{segment:e,element:t.currentTarget,sendMessage:m}),T(!E)}}),(e.actionType===i.ActionType.Skip||e.actionType===i.ActionType.Mute||e.actionType===i.ActionType.Poi&&[i.SponsorHideType.Visible,i.SponsorHideType.Hidden].includes(e.hidden))&&r.createElement("img",{className:"voteButton",title:chrome.i18n.getMessage("hideSegment"),src:k===i.SponsorHideType.Hidden?chrome.runtime.getURL("icons/not_visible.svg"):chrome.runtime.getURL("icons/visible.svg"),onClick:t=>{c.AnimationUtils.applyLoadingAnimation(t.currentTarget,.4)(),e.hidden===i.SponsorHideType.Hidden?(e.hidden=i.SponsorHideType.Visible,C(i.SponsorHideType.Visible)):(e.hidden=i.SponsorHideType.Hidden,C(i.SponsorHideType.Hidden)),m({message:"hideSegment",type:e.hidden,UUID:e.UUID})}}),e.actionType!==i.ActionType.Full&&r.createElement("img",{className:"voteButton",title:e.actionType===i.ActionType.Chapter?chrome.i18n.getMessage("playChapter"):chrome.i18n.getMessage("skipSegment"),src:chrome.runtime.getURL("icons/skip.svg"),onClick:t=>{b({segment:e,element:t.currentTarget,sendMessage:m})}})),r.createElement("div",{className:"sponsorTimesVoteStatusContainer "+(v?"":"hidden")},r.createElement("div",{className:"sponsorTimesThanksForVotingText"},v)))}function y(e){return o(this,void 0,void 0,(function*(){e.setVoteMessage(chrome.i18n.getMessage("Loading"));const t=yield e.sendMessage({message:"submitVote",type:e.type,UUID:e.UUID});null!=t&&(1==t.successType||-1==t.successType&&429==t.statusCode?e.setVoteMessage(chrome.i18n.getMessage("voted")):-1==t.successType&&e.setVoteMessage((0,u.getErrorMessage)(t.statusCode,t.responseText)),setTimeout((()=>e.setVoteMessage(null)),1500))}))}function b({segment:e,element:t,sendMessage:n}){e.actionType===i.ActionType.Chapter?n({message:"unskip",UUID:e.UUID}):n({message:"reskip",UUID:e.UUID}),t&&c.AnimationUtils.applyLoadingAnimation(t,.3)()}function w({segment:e,sendMessage:t}){t({message:"selectSegment",UUID:null==e?void 0:e.UUID})}function S(e){const[t,n]=r.useState(!1),o=r.useRef(null);return r.createElement("div",{id:"issueReporterImportExport",className:e.status===f.LoadingStatus.Loading?"hidden":""},r.createElement("div",{id:"importExportButtons"},r.createElement("button",{id:"importSegmentsButton",className:e.status===f.LoadingStatus.SegmentsFound||e.status===f.LoadingStatus.NoSegmentsFound?"":"hidden",title:chrome.i18n.getMessage("importSegments"),onClick:()=>{n(!t)}},r.createElement("img",{src:"/icons/import.svg",alt:"Import icon",id:"importSegments"})),r.createElement("button",{id:"exportSegmentsButton",className:0===e.segments.length?"hidden":"",title:chrome.i18n.getMessage("exportSegments"),onClick:t=>{(0,h.copyToClipboardPopup)((0,m.exportTimes)(e.segments),e.sendMessage),c.AnimationUtils.applyLoadingAnimation(t.currentTarget,.3)(),new p.default(null,"exportCopied",{title:chrome.i18n.getMessage("CopiedExclamation"),timed:!0,maxCountdownTime:()=>.6,referenceNode:t.currentTarget.parentElement,dontPauseCountdown:!0,style:{top:0,bottom:0,minWidth:0,right:"30px",margin:"auto",height:"max-content"},hideLogo:!0,hideRightInfo:!0})}},r.createElement("img",{src:"/icons/export.svg",alt:"Export icon",id:"exportSegments"}))),r.createElement("span",{id:"importSegmentsMenu",className:t?"":"hidden"},r.createElement("textarea",{id:"importSegmentsText",rows:5,style:{width:"80%"},ref:o}),r.createElement("button",{id:"importSegmentsSubmit",title:chrome.i18n.getMessage("importSegments"),onClick:()=>{const t=o.current.value;e.sendMessage({message:"importSegments",data:t}),n(!1)}},chrome.i18n.getMessage("Import"))))}!function(e){e[e.Segments=0]="Segments",e[e.Chapter=1]="Chapter"}(g||(g={})),t.SegmentListComponent=e=>{var t,n;const[o,s]=r.useState(g.Segments),[u,c]=r.useState(null!==(n=null===(t=a.default.config)||void 0===t?void 0:t.isVip)&&void 0!==n&&n);r.useEffect((()=>{a.default.isReady()?c(a.default.config.isVip):(0,l.waitFor)((()=>a.default.isReady())).then((()=>{c(a.default.config.isVip)}))}),[]),r.useEffect((()=>{s(g.Segments)}),[e.videoID]);const d=e=>o===g.Chapter?e.actionType===i.ActionType.Chapter:e.actionType!==i.ActionType.Chapter;return r.createElement("div",{id:"issueReporterContainer"},r.createElement("div",{id:"issueReporterTabs",className:e.segments&&e.segments.find((e=>e.actionType===i.ActionType.Chapter))?"":"hidden"},r.createElement("span",{id:"issueReporterTabSegments",className:o===g.Segments?"sbSelected":"",onClick:()=>{s(g.Segments)}},r.createElement("span",null,chrome.i18n.getMessage("SegmentsCap"))),r.createElement("span",{id:"issueReporterTabChapters",className:o===g.Chapter?"sbSelected":"",onClick:()=>{s(g.Chapter)}},r.createElement("span",null,chrome.i18n.getMessage("Chapters")))),r.createElement("div",{id:"issueReporterTimeButtons",onMouseLeave:()=>w({segment:null,sendMessage:e.sendMessage})},e.segments.map((t=>r.createElement(v,{key:t.UUID,videoID:e.videoID,segment:t,currentTime:e.currentTime,isVip:u,startingLooped:e.loopedChapter===t.UUID,tabFilter:d,sendMessage:e.sendMessage})))),r.createElement(S,{status:e.status,segments:e.segments,sendMessage:e.sendMessage}))}},4295:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SegmentSubmissionComponent=void 0;const o=n(6540),r=n(8856),i=n(3996);t.SegmentSubmissionComponent=e=>{const t=r.default.local.unsubmittedSegments[e.videoID],[n,a]=o.useState(t&&t.length>0),[l,s]=o.useState(!t||2===t[t.length-1].segment.length);return o.createElement("div",{id:"mainControls",className:e.status===i.LoadingStatus.Loading?"hidden":""},o.createElement("h1",{className:"sbHeader"},chrome.i18n.getMessage("recordTimesDescription")),o.createElement("sub",{className:"sponsorStartHint grey-text"},chrome.i18n.getMessage("popupHint")),o.createElement("div",{style:{textAlign:"center",margin:"8px 0"}},o.createElement("button",{id:"sponsorStart",className:"sbMediumButton",style:{marginRight:"8px"},onClick:()=>{e.sendMessage({from:"popup",message:"sponsorStart"}),s(!l),a(!0),setTimeout((()=>{const t=r.default.local.unsubmittedSegments[e.videoID];s(!t||2===t[t.length-1].segment.length),a(t&&t.length>0)}),200)}},l?chrome.i18n.getMessage("sponsorStart"):chrome.i18n.getMessage("sponsorEnd")),o.createElement("button",{id:"submitTimes",className:"sbMediumButton "+(n?"":"hidden"),onClick:()=>{e.sendMessage({message:"submitTimes"})}},chrome.i18n.getMessage("OpenSubmissionMenu"))),o.createElement("span",{id:"submissionHint",className:n?"":"hidden"},chrome.i18n.getMessage("submissionEditHint")))}},5760:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.YourWorkComponent=void 0;const r=n(6540),i=n(3262),a=n(7913),l=n(8856),s=n(6062),u=n(4628),c=n(503),d=n(6141),f=n(997);function p(e){return r.createElement(r.Fragment,null,r.createElement("div",{id:"sponsorTimesContributionsContainer",className:e.isSettingUsername?" hidden":""},r.createElement("p",{className:"u-mZ grey-text"},chrome.i18n.getMessage("Submissions"),":"),r.createElement("p",{id:"sponsorTimesContributionsDisplay",className:"u-mZ"},e.submissionCount)))}function m({viewCount:e,minutesSaved:t}){return r.createElement(r.Fragment,null,e>0&&r.createElement("p",{id:"sponsorTimesViewsContainer",className:"u-mZ sbStatsSentence"},chrome.i18n.getMessage("savedPeopleFrom"),r.createElement("b",null,r.createElement("span",{id:"sponsorTimesViewsDisplay"},e.toLocaleString())," "),r.createElement("span",{id:"sponsorTimesViewsDisplayEndWord"},1!==e?chrome.i18n.getMessage("Segments"):chrome.i18n.getMessage("Segment")),r.createElement("br",null),r.createElement("span",{className:"sbExtraInfo"},"("," ",r.createElement("b",null,r.createElement("span",{id:"sponsorTimesOthersTimeSavedDisplay"},g(t))," ",r.createElement("span",{id:"sponsorTimesOthersTimeSavedEndWord"},1!==t?chrome.i18n.getMessage("minsLower"):chrome.i18n.getMessage("minLower"))," "),r.createElement("span",null,chrome.i18n.getMessage("youHaveSavedTimeEnd"))," "," )")),r.createElement("p",{id:"sponsorTimesSkipsDoneContainer",className:"u-mZ sbStatsSentence"},chrome.i18n.getMessage("youHaveSkipped"),r.createElement("b",null,r.createElement("span",{id:"sponsorTimesSkipsDoneDisplay"},l.default.config.skipCount)," "),r.createElement("span",{id:"sponsorTimesSkipsDoneEndWord"},l.default.config.skipCount>1?chrome.i18n.getMessage("Segments"):chrome.i18n.getMessage("Segment"))," ",r.createElement("span",{className:"sbExtraInfo"},"("," ",r.createElement("b",null,r.createElement("span",{id:"sponsorTimeSavedDisplay"},g(l.default.config.minutesSaved))," ",r.createElement("span",{id:"sponsorTimeSavedEndWord"},1!==l.default.config.minutesSaved?chrome.i18n.getMessage("minsLower"):chrome.i18n.getMessage("minLower"))," "),")")))}function h(e){return r.createElement("div",{id:"sponsorTimesDonateContainer",style:{alignItems:"center",justifyContent:"center"}},r.createElement("img",{className:"sbHeart",src:"/icons/heart.svg",alt:"Heart icon"}),r.createElement("a",{id:"sbConsiderDonateLink",href:"https://sponsor.ajay.app/donate",target:"_blank",rel:"noreferrer",onClick:()=>{l.default.config.donateClicked=l.default.config.donateClicked+1}},chrome.i18n.getMessage("considerDonating")),r.createElement("img",{id:"sbCloseDonate",src:"/icons/close.png",alt:chrome.i18n.getMessage("closeIcon"),height:"8",style:{paddingLeft:"5px",cursor:"pointer"},onClick:e.onClose}))}function g(e){e=Math.round(10*e)/10;const t=Math.floor(e/525600),n=Math.floor(e/1440)%365,o=Math.floor(e/60)%24;return(t>0?t+chrome.i18n.getMessage("yearAbbreviation")+" ":"")+(n>0?n+chrome.i18n.getMessage("dayAbbreviation")+" ":"")+(o>0?o+chrome.i18n.getMessage("hourAbbreviation")+" ":"")+(e%60).toFixed(1)}t.YourWorkComponent=()=>{const[e,t]=r.useState(!1),[n,g]=r.useState(""),[v,y]=r.useState(""),[b,w]=r.useState(""),[S,k]=r.useState(""),[C,E]=r.useState(0),[T,x]=r.useState(0),[M,_]=r.useState(!1);return r.useEffect((()=>{o(void 0,void 0,void 0,(function*(){var e;const t=yield(0,s.asyncRequestToServer)("GET","/api/userInfo",{publicUserID:yield(0,i.getHash)(l.default.config.userID),values:["userName","viewCount","minutesSaved","vip","permissions","segmentCount"]});if(t.ok){const n=JSON.parse(t.responseText);g(n.userName),k(Math.max(null!==(e=l.default.config.sponsorTimesContributed)&&void 0!==e?e:0,n.segmentCount).toLocaleString()),E(n.viewCount),x(n.minutesSaved),l.default.config.isVip=n.vip,l.default.config.permissions=n.permissions,_(l.default.config.showDonationLink&&l.default.config.donateClicked<=0&&l.default.config.showPopupDonationCount<5&&C<5e4&&!l.default.config.isVip&&l.default.config.skipCount>10&&(0,f.showDonationLink)())}}))}),[]),r.createElement("div",{className:"sbYourWorkBox"},r.createElement("h2",{className:"sbHeader",style:{padding:"8px 15px"}},chrome.i18n.getMessage("yourWork")),r.createElement("div",{className:"sbYourWorkCols"},r.createElement("div",{id:"usernameElement"},r.createElement("p",{className:"u-mZ grey-text"},chrome.i18n.getMessage("Username"),":",r.createElement("span",{id:"setUsernameStatus",className:"u-mZ white-text"+(b?"":" hidden")},b)),r.createElement("div",{id:"setUsernameContainer",className:e?" hidden":""},r.createElement("p",{id:"usernameValue"},n),r.createElement("button",{id:"setUsernameButton",title:chrome.i18n.getMessage("setUsername"),onClick:()=>{y(n),t(!e)}},r.createElement(u.default,{id:"sbPopupIconEdit",className:"sbPopupButton"})),r.createElement("button",{id:"copyUserID",title:chrome.i18n.getMessage("copyPublicID"),onClick:()=>o(void 0,void 0,void 0,(function*(){window.navigator.clipboard.writeText(yield(0,i.getHash)(l.default.config.userID))}))},r.createElement(c.default,{id:"sbPopupIconCopyUserID",className:"sbPopupButton"}))),r.createElement("div",{id:"setUsername",className:e?" SBExpanded":" hidden"},r.createElement("input",{id:"usernameInput",placeholder:chrome.i18n.getMessage("Username"),value:v,onChange:e=>{y(e.target.value)}}),r.createElement("button",{id:"submitUsername",onClick:()=>{v.length>0&&(w(chrome.i18n.getMessage("Loading")),(0,s.asyncRequestToServer)("POST",`/api/setUsername?userID=${l.default.config.userID}&username=${v}`).then((n=>{n.ok?(w(""),g(v),t(!e)):w((0,a.getErrorMessage)(n.status,n.responseText))})).catch((e=>{w(`${chrome.i18n.getMessage("Error")}: ${e}`)})))}},r.createElement(d.default,{id:"sbPopupIconCheck",className:"sbPopupButton"})))),r.createElement(p,{isSettingUsername:e,submissionCount:S})),r.createElement(m,{viewCount:C,minutesSaved:T}),M&&r.createElement(h,{onClose:()=>{_(!1),l.default.config.showPopupDonationCount=100}}))}},4901:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const r=n(6540),i=n(5338),a=n(3996),l=n(1108),s=n(8856);document.addEventListener("DOMContentLoaded",(()=>o(void 0,void 0,void 0,(function*(){yield(0,l.waitFor)((()=>s.default.isReady())),(0,i.createRoot)(document.body).render(r.createElement(a.PopupComponent,null))}))))},346:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.copyToClipboardPopup=void 0,t.copyToClipboardPopup=function(e,t){window===window.top?window.navigator.clipboard.writeText(e):t({message:"copyToClipboard",text:e})}},3936:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540),r=n(5338),i=n(4342),a=new(n(205).default),l=n(4332),s=n(3683);t.default=class{constructor(e,t,n){var i;this.noticeRef=o.createRef(),this.idSuffix=t,this.contentContainer=e;const l=null!==(i=n.referenceNode)&&void 0!==i?i:a.findReferenceNode();this.noticeElement=document.createElement("div"),this.noticeElement.className="sponsorSkipNoticeContainer",this.noticeElement.id="sponsorSkipNoticeContainer"+t,l.prepend(this.noticeElement),this.root=(0,r.createRoot)(this.noticeElement),this.update(n)}update(e){var t,n,r;this.root.render(o.createElement(i.default,{noticeTitle:e.title,idSuffix:this.idSuffix,fadeIn:null===(t=e.fadeIn)||void 0===t||t,timed:null===(n=e.timed)||void 0===n||n,ref:this.noticeRef,style:e.style,extraClass:e.extraClass,maxCountdownTime:e.maxCountdownTime,dontPauseCountdown:e.dontPauseCountdown,hideLogo:e.hideLogo,hideRightInfo:e.hideRightInfo,closeListener:()=>this.close()},(null===(r=e.textBoxes)||void 0===r?void 0:r.length)>0?o.createElement("tr",{id:"sponsorSkipNoticeMiddleRow"+this.idSuffix,className:"sponsorTimeMessagesRow",style:{maxHeight:(0,s.getVideo)()?(0,s.getVideo)().offsetHeight-200+"px":null}},o.createElement("td",{style:{width:"100%"}},this.getMessageBoxes(this.idSuffix,e.textBoxes))):null,e.hideLogo?null:o.createElement(o.Fragment,null,o.createElement("tr",{id:"sponsorSkipNoticeSpacer"+this.idSuffix,className:"sponsorBlockSpacer"}),o.createElement("tr",{className:"sponsorSkipNoticeRightSection",style:{position:"relative"}},o.createElement("td",null,this.getButtons(e.buttons))))))}getMessageBoxes(e,t){if(t){const n=[];for(let r=0;r<t.length;r++)n.push(o.createElement(l.default,{idSuffix:e,key:r,icon:t[r].icon,text:t[r].text}));return n}return null}getButtons(e){if(e){const t=[];for(const n of e)t.push(o.createElement("button",{className:"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton",key:n.name,onClick:e=>n.listener(e)},n.name));return t}return null}close(){this.root.unmount(),this.noticeElement.remove()}}},6141:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);t.default=({id:e="",className:t="",style:n={},onClick:r})=>o.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",className:t,style:n,id:e,onClick:r},o.createElement("path",{d:"M20.3 2L9 13.6l-5.3-5L0 12.3 9 21 24 5.7z"}))},503:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);t.default=({id:e="",className:t="",style:n={},onClick:r})=>o.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",className:t,style:n,id:e,onClick:r},o.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),o.createElement("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}))},4628:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);t.default=({id:e="",className:t="",style:n={},onClick:r})=>o.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",className:t,style:n,id:e,onClick:r},o.createElement("path",{d:"M14.1 7.1l2.9 2.9L6.1 20.7l-3.6.7.7-3.6L14.1 7.1zm0-2.8L1.4 16.9 0 24l7.1-1.4L19.8 9.9l-5.7-5.7zm7.1 4.3L24 5.7 18.3 0l-2.8 2.8 5.7 5.7z"}))},7152:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});const o=n(6540);t.default=function({id:e="",fill:t="#ff0000",className:n="",onClick:r}){return o.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 565.15 568",id:e,className:n,onClick:()=>null==r?void 0:r()},o.createElement("g",{id:"Layer_2","data-name":"Layer 2"},o.createElement("g",{id:"Layer_1-2","data-name":"Layer 1",style:{fill:t}},o.createElement("path",{d:"M282.58,568a65,65,0,0,1-34.14-9.66C95.41,463.94,2.54,300.46,0,121A64.91,64.91,0,0,1,34,62.91a522.56,522.56,0,0,1,497.16,0,64.91,64.91,0,0,1,34,58.12c-2.53,179.43-95.4,342.91-248.42,437.3A65,65,0,0,1,282.58,568Zm0-548.31A502.24,502.24,0,0,0,43.4,80.22a45.27,45.27,0,0,0-23.7,40.53c2.44,172.67,91.81,330,239.07,420.83a46.19,46.19,0,0,0,47.61,0C453.64,450.73,543,293.42,545.45,120.75a45.26,45.26,0,0,0-23.7-40.54A502.26,502.26,0,0,0,282.58,19.69Z",id:"path8",style:{fill:t}}),o.createElement("path",{style:{fill:t},d:"M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 220.41016 145.74023 L 411.2793 255.93945 L 220.41016 366.14062 L 220.41016 145.74023 z ",id:"path10"}))),o.createElement("polygon",{style:{fill:"#fff"},points:"411.28 255.94 220.41 145.74 220.41 366.14 411.28 255.94"}))}},9209:(e,t)=>{var n,o,r,i,a,l;Object.defineProperty(t,"__esModule",{value:!0}),t.NoticeVisibilityMode=t.ChannelIDStatus=t.SponsorSourceType=t.ActionTypes=t.ActionType=t.SponsorHideType=t.CategorySkipOption=void 0,(l=t.CategorySkipOption||(t.CategorySkipOption={}))[l.Disabled=-1]="Disabled",l[l.ShowOverlay=0]="ShowOverlay",l[l.ManualSkip=1]="ManualSkip",l[l.AutoSkip=2]="AutoSkip",(a=t.SponsorHideType||(t.SponsorHideType={}))[a.Visible=void 0]="Visible",a[a.Downvoted=1]="Downvoted",a[a.MinimumDuration=2]="MinimumDuration",a[a.Hidden=3]="Hidden",function(e){e.Skip="skip",e.Mute="mute",e.Chapter="chapter",e.Full="full",e.Poi="poi"}(n=t.ActionType||(t.ActionType={})),t.ActionTypes=[n.Skip,n.Mute,n.Chapter,n.Full,n.Poi],(i=t.SponsorSourceType||(t.SponsorSourceType={}))[i.Server=void 0]="Server",i[i.Local=1]="Local",i[i.YouTube=2]="YouTube",i[i.Autogenerated=3]="Autogenerated",(r=t.ChannelIDStatus||(t.ChannelIDStatus={}))[r.Fetching=0]="Fetching",r[r.Found=1]="Found",r[r.Failed=2]="Failed",(o=t.NoticeVisibilityMode||(t.NoticeVisibilityMode={}))[o.FullSize=0]="FullSize",o[o.MiniForAutoSkip=1]="MiniForAutoSkip",o[o.MiniForAll=2]="MiniForAll",o[o.FadedForAutoSkip=3]="FadedForAutoSkip",o[o.FadedForAll=4]="FadedForAll"},205:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const r=n(8856),i=n(9209),a=n(3262),l=n(1108),s=n(4148),u=n(1740),c=n(6062);t.default=class{constructor(e=null){this.js=["./js/content.js"],this.css=["content.css","./libs/Source+Sans+Pro.css","popup.css","shared.css"],this.backgroundScriptContainer=e}wait(e,t=5e3,n=100){return o(this,void 0,void 0,(function*(){return(0,l.waitFor)(e,t,n)}))}containsPermission(e){return new Promise((t=>{chrome.permissions.contains(e,t)}))}setupExtraSitePermissions(e){const t=[];(0,u.isSafari)()&&t.push("webNavigation"),chrome.permissions.request({origins:this.getPermissionRegex(),permissions:t},(t=>o(this,void 0,void 0,(function*(){t?this.setupExtraSiteContentScripts():this.removeExtraSiteRegistration(),e(t)}))))}getExtraSiteRegistration(){return{message:"registerContentScript",id:"invidious",allFrames:!0,js:this.js,css:this.css,matches:this.getPermissionRegex()}}setupExtraSiteContentScripts(){const e=this.getExtraSiteRegistration();this.backgroundScriptContainer?this.backgroundScriptContainer.registerFirefoxContentScript(e):chrome.runtime.sendMessage(e)}removeExtraSiteRegistration(){const e="invidious";this.backgroundScriptContainer?this.backgroundScriptContainer.unregisterFirefoxContentScript(e):chrome.runtime.sendMessage({message:"unregisterContentScript",id:e}),chrome.permissions.remove({origins:this.getPermissionRegex()})}applyInvidiousPermissions(e,t="supportInvidious"){return new Promise((n=>{e?this.setupExtraSitePermissions((e=>{e||(r.default.config[t]=!1),n(e)})):(this.removeExtraSiteRegistration(),n(!1))}))}containsInvidiousPermission(){return new Promise((e=>{const t=[];(0,u.isSafari)()&&t.push("webNavigation"),chrome.permissions.contains({origins:this.getPermissionRegex(),permissions:t},(function(t){e(t)}))}))}getMergedTimestamps(e){let t=[];return e.forEach((e=>{const n=t.findIndex((t=>e[0]>=t[0]&&e[0]<=t[1])),o=t.findIndex((t=>e[1]>=t[0]&&e[1]<=t[1]));if(~n&&~o){if(n===o)return;const e=t.splice(Math.max(n,o),1)[0],r=t.splice(Math.min(n,o),1)[0];t.push([Math.min(e[0],r[0]),Math.max(e[1],r[1])])}else~n?t[n][1]=e[1]:~o?t[o][0]=e[0]:t.push(e.slice());t=t.filter((t=>!(t[0]>e[0]&&t[1]<e[1])))})),t}getTimestampsDuration(e){return this.getMergedTimestamps(e).reduce(((e,t)=>e+t[1]-t[0]),0)}getSponsorIndexFromUUID(e,t){for(let n=0;n<e.length;n++)if(e[n].UUID&&(e[n].UUID.startsWith(t)||t.startsWith(e[n].UUID)))return n;return-1}getSponsorTimeFromUUID(e,t){return e[this.getSponsorIndexFromUUID(e,t)]}getPermissionRegex(e=[]){const t=[];0===e.length&&(e=[...r.default.config.invidiousInstances]);for(const n of e)t.push("https://*."+n+"/*"),t.push("http://*."+n+"/*");return t}findReferenceNode(){var e,t;let n=(0,s.findValidElementFromSelector)(["#player-container-id","#movie_player",".html5-video-player","#c4-player","#player-container","#main-panel.ytmusic-player-page","#player-container .video-js",".main-video-section > .video-container",".shaka-video-container","#player-container.ytk-player","#id-tv-container"]);if(null==n){const o=document.getElementById("player");if(n=null==o?void 0:o.firstChild,n){let r=1;for(;r<o.children.length&&(!(null===(e=n.classList)||void 0===e?void 0:e.contains("html5-video-player"))||!(null===(t=n.classList)||void 0===t?void 0:t.contains("ytp-embed")));)n=o.children[r],r++}}return n}isContentScript(){return"http:"===window.location.protocol||"https:"===window.location.protocol}isHex(e){return Boolean(e.match(/^[0-9a-f]+$/i))}addHiddenSegment(e,t,n){return o(this,void 0,void 0,(function*(){if(chrome.extension.inIncognitoContext&&!r.default.config.trackDownvotesInPrivate||!r.default.config.trackDownvotes)return;if(t.length<60){const n=yield(0,c.asyncRequestToServer)("GET","/api/segmentID",{UUID:t,videoID:e});n.ok&&n.responseText&&(t=n.responseText)}const o=(yield(0,a.getHash)(e,1)).slice(0,4),l=yield(0,a.getHash)(t,1),s=r.default.local.downvotedSegments,u=s[o]||{segments:[],lastAccess:0};u.lastAccess=Date.now();const d=u.segments.find((e=>e.uuid===l));n===i.SponsorHideType.Visible?(u.segments.splice(u.segments.indexOf(d),1),0===u.segments.length&&delete s[o]):(d?d.hidden=n:u.segments.push({uuid:l,hidden:n}),s[o]=u);const f=Object.entries(s);if(f.length>1e4){let e=null;for(let t=0;t<f[0].length;t++)(null===e||f[t][1].lastAccess<e[1].lastAccess)&&(e=f[t]);delete s[e[0]]}r.default.forceLocalUpdate("downvotedSegments")}))}}},1575:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CATEGORY=t.shortCategoryName=t.getCategorySuffix=t.getVoteText=t.getUpcomingText=t.getSkippingText=void 0;const o=n(9209);t.getSkippingText=function(e,t){const n=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);if(t){let t="";switch(e[0].actionType){case o.ActionType.Chapter:case o.ActionType.Skip:t="skipped";break;case o.ActionType.Mute:t="muted";break;case o.ActionType.Poi:t="skipped_to_category"}return chrome.i18n.getMessage(t).replace("{0}",n)}{let t="";switch(e[0].actionType){case o.ActionType.Chapter:case o.ActionType.Skip:t="skip_category";break;case o.ActionType.Mute:t="mute_category";break;case o.ActionType.Poi:t="skip_to_category"}return chrome.i18n.getMessage(t).replace("{0}",n)}},t.getUpcomingText=function(e){const t=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);return chrome.i18n.getMessage("upcoming").replace("{0}",t)},t.getVoteText=function(e){const t=chrome.i18n.getMessage(e.length>1?"multipleSegments":"category_"+e[0].category+"_short")||chrome.i18n.getMessage("category_"+e[0].category);return chrome.i18n.getMessage("voted_on").replace("{0}",t)},t.getCategorySuffix=function(e){return e.startsWith("poi_")?"_POI":"exclusive_access"===e?"_full":"chapter"===e?"_chapter":""},t.shortCategoryName=function(e){return chrome.i18n.getMessage("category_"+e+"_short")||chrome.i18n.getMessage("category_"+e)},t.DEFAULT_CATEGORY="chooseACategory"},997:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.showDonationLink=void 0;const o=n(8856);t.showDonationLink=function(){return"Apple Computer, Inc."!==navigator.vendor&&o.default.config.showDonationLink}},7621:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.normalizeChapterName=t.exportTimesAsHashParam=t.importTimes=t.exportTimes=void 0;const o=n(9209),r=n(1575),i=n(8272),a=n(7913),l=n(3497),s="undefined"==typeof chrome,u=i.categoryList.filter((e=>"chapter"!==e)).map((e=>({code:e,names:s?[e]:[chrome.i18n.getMessage("category_"+e),(0,r.shortCategoryName)(e)]})));function c(e){const t=e.description||(0,r.shortCategoryName)(e.category);return`${(0,a.getFormattedTime)(e.segment[0],!0)}${e.segment[1]&&e.segment[0]!==e.segment[1]?` - ${(0,a.getFormattedTime)(e.segment[1],!0)}`:""} ${t}`}function d(e,t){let n=e;for(const o of t)o.condition&&!o.condition(e)||(n=n.replace(o.matcher,""));return n}t.exportTimes=function(e){let t="";for(const n of e)[o.ActionType.Full,o.ActionType.Mute].includes(n.actionType)||[o.SponsorSourceType.YouTube,o.SponsorSourceType.Autogenerated].includes(n.source)||(t+=c(n)+"\n");return t.replace(/\n$/,"")},t.importTimes=function(e,t){var n;const r=e.split("\n"),i=/(?:((?:\d+:)?\d+:\d+)+(?:\.\d+)?)|(?:\d+(?=s| second))/g,s=r.some((e=>i.test(e))),c=[];for(const e of r){const t=e.match(i);if(t){const r=(0,a.getFormattedTimeToSeconds)(t[0]);if(null!==r){const i=[{matcher:/^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:(\s]+$/g},{matcher:/[-:()\s]*$/g,condition:e=>!!e.match(/^\s*\(/)}],s=d(e.split(t[0])[0],i);let f=null;const p=e.split(t[1]||t[0]);f=d(p[p.length-1],i);const m=(null==s?void 0:s.length)>(null==f?void 0:f.length)?s:f,h=null===(n=u.find((e=>e.names.includes(m))))||void 0===n?void 0:n.code,g=m?null!=h?h:"chapter":"chooseACategory",v={segment:[r,(0,a.getFormattedTimeToSeconds)(t[1])],category:g,actionType:"chapter"===g?o.ActionType.Chapter:o.ActionType.Skip,description:"chapter"===g?m:null,source:o.SponsorSourceType.Local,UUID:(0,l.generateUserID)()};c.length>0&&null===c[c.length-1].segment[1]&&(c[c.length-1].segment[1]=v.segment[0]),c.push(v)}}else if(!s){const t={segment:[0,0],category:"chapter",actionType:o.ActionType.Chapter,description:e,source:o.SponsorSourceType.Local,UUID:(0,l.generateUserID)()};c.push(t)}}return c.length>0&&null===c[c.length-1].segment[1]&&(c[c.length-1].segment[1]=t),c},t.exportTimesAsHashParam=function(e){const t=e.map((e=>Object.assign({actionType:e.actionType,category:e.category,segment:e.segment},e.description?{description:e.description}:{})));return`#segments=${JSON.stringify(t)}`},t.normalizeChapterName=function(e){return e.toLowerCase().replace(/[.:'’`‛‘"‟”-]/gu,"").replace(/\s+/g," ")}},6062:function(e,t,n){var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function l(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((o=o.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.sendRequestToServer=t.asyncRequestToServer=t.asyncRequestToCustomServer=void 0;const r=n(8856),i=n(8272),a=n(3531);function l(e,t,n={},o={}){return(0,a.sendRequestToCustomServer)(e,t,n,o)}t.asyncRequestToCustomServer=l,t.asyncRequestToServer=function(e,t,n={},a={}){return o(this,void 0,void 0,(function*(){const o=r.default.config.testingServer?i.testingServerAddress:r.default.config.serverAddress;return yield l(e,o+t,n,a)}))},t.sendRequestToServer=function(e,t,n){const o=r.default.config.testingServer?i.testingServerAddress:r.default.config.serverAddress;chrome.runtime.sendMessage({message:"sendRequest",type:e,url:o+t},(e=>{n(e)}))}},5339:e=>{e.exports=JSON.parse('["www.youtubekids.com","inv.nadeko.net","inv.tux.pizza","invidious.adminforge.de","invidious.jing.rocks","invidious.nerdvpn.de","invidious.perennialte.ch","invidious.privacyredirect.com","invidious.reallyaweso.me","invidious.yourdevice.ch","iv.ggtyler.dev","iv.nboeck.de","yewtu.be"]')},8272:e=>{e.exports=JSON.parse('{"serverAddress":"https://sponsor.ajay.app","testingServerAddress":"https://sponsor.ajay.app/test","serverAddressComment":"This specifies the default SponsorBlock server to connect to","categoryList":["sponsor","selfpromo","exclusive_access","interaction","poi_highlight","intro","outro","preview","hook","filler","chapter","music_offtopic"],"categorySupport":{"sponsor":["skip","mute","full"],"selfpromo":["skip","mute","full"],"exclusive_access":["full"],"interaction":["skip","mute"],"intro":["skip","mute"],"outro":["skip","mute"],"preview":["skip","mute"],"hook":["skip","mute"],"filler":["skip","mute"],"music_offtopic":["skip"],"poi_highlight":["poi"],"chapter":["chapter"]},"wikiLinks":{"sponsor":"https://wiki.sponsor.ajay.app/w/Sponsor","selfpromo":"https://wiki.sponsor.ajay.app/w/Unpaid/Self_Promotion","exclusive_access":"https://wiki.sponsor.ajay.app/w/Exclusive_Access","interaction":"https://wiki.sponsor.ajay.app/w/Interaction_Reminder_(Subscribe)","intro":"https://wiki.sponsor.ajay.app/w/Intermission/Intro_Animation","outro":"https://wiki.sponsor.ajay.app/w/Endcards/Credits","preview":"https://wiki.sponsor.ajay.app/w/Preview/Recap","hook":"https://wiki.sponsor.ajay.app/w/Hook/Greetings","filler":"https://wiki.sponsor.ajay.app/w/Tangents/Jokes","music_offtopic":"https://wiki.sponsor.ajay.app/w/Music:_Non-Music_Section","poi_highlight":"https://wiki.sponsor.ajay.app/w/Highlight","guidelines":"https://wiki.sponsor.ajay.app/w/Guidelines","mute":"https://wiki.sponsor.ajay.app/w/Mute_Segment","chapter":"https://wiki.sponsor.ajay.app/w/Chapter"},"extensionImportList":{"chromium":["enamippconapkdmgfgjchkhakpfinmaj"],"firefox":["deArrow@ajay.app","deArrowBETA@ajay.app"],"safari":["app.ajay.dearrow.extension"]}}')},2303:e=>{e.exports={version:"1.1.48"}}},t={};!function n(o){var r=t[o];if(void 0!==r)return r.exports;var i=t[o]={exports:{}};return e[o].call(i.exports,i,i.exports,n),i.exports}(4901)})(); +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/js/popup.js.LICENSE.txt b/data/extensions/sponsorBlocker@ajay.app/js/popup.js.LICENSE.txt @@ -0,0 +1,29 @@ +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/data/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 b/data/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 b/data/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 b/data/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 b/data/extensions/sponsorBlocker@ajay.app/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 Binary files differ. diff --git a/data/extensions/sponsorBlocker@ajay.app/libs/Source+Sans+Pro.css b/data/extensions/sponsorBlocker@ajay.app/libs/Source+Sans+Pro.css @@ -0,0 +1,112 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/data/extensions/sponsorBlocker@ajay.app/manifest.json b/data/extensions/sponsorBlocker@ajay.app/manifest.json @@ -0,0 +1,170 @@ +{ + "name": "__MSG_fullName__", + "short_name": "SponsorBlock", + "version": "5.14", + "default_locale": "en", + "description": "__MSG_Description__", + "homepage_url": "https://sponsor.ajay.app", + "icons": { + "16": "icons/IconSponsorBlocker16px.png", + "32": "icons/IconSponsorBlocker32px.png", + "64": "icons/IconSponsorBlocker64px.png", + "128": "icons/IconSponsorBlocker128px.png", + "256": "icons/IconSponsorBlocker256px.png", + "512": "icons/IconSponsorBlocker512px.png", + "1024": "icons/IconSponsorBlocker1024px.png" + }, + "permissions": [ + "storage", + "scripting", + "https://sponsor.ajay.app/*" + ], + "options_ui": { + "page": "options/options.html", + "open_in_tab": true + }, + "web_accessible_resources": [ + "icons/LogoSponsorBlocker256px.png", + "icons/IconSponsorBlocker256px.png", + "icons/PlayerStartIconSponsorBlocker.svg", + "icons/PlayerStopIconSponsorBlocker.svg", + "icons/PlayerUploadIconSponsorBlocker.svg", + "icons/PlayerUploadFailedIconSponsorBlocker.svg", + "icons/PlayerCancelSegmentIconSponsorBlocker.svg", + "icons/clipboard.svg", + "icons/settings.svg", + "icons/pencil.svg", + "icons/check.svg", + "icons/check-smaller.svg", + "icons/upvote.png", + "icons/downvote.png", + "icons/thumbs_down.svg", + "icons/thumbs_down_locked.svg", + "icons/thumbs_up.svg", + "icons/help.svg", + "icons/report.png", + "icons/close.png", + "icons/skipIcon.svg", + "icons/refresh.svg", + "icons/beep.oga", + "icons/pause.svg", + "icons/stop.svg", + "icons/skip.svg", + "icons/heart.svg", + "icons/visible.svg", + "icons/not_visible.svg", + "icons/sort.svg", + "icons/money.svg", + "icons/segway.png", + "icons/close-smaller.svg", + "icons/right-arrow.svg", + "icons/campaign.svg", + "icons/star.svg", + "icons/lightbulb.svg", + "icons/bolt.svg", + "icons/stopwatch.svg", + "icons/music-note.svg", + "icons/import.svg", + "icons/export.svg", + "icons/PlayerInfoIconSponsorBlocker.svg", + "icons/PlayerDeleteIconSponsorBlocker.svg", + "icons/dearrow.svg", + "popup.html", + "popup.css", + "content.css", + "shared.css", + "js/document.js", + "libs/Source+Sans+Pro.css", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2" + ], + "optional_permissions": [ + "*://*/*" + ], + "browser_action": { + "default_title": "SponsorBlock", + "default_popup": "popup.html", + "default_icon": { + "16": "icons/IconSponsorBlocker16px.png", + "32": "icons/IconSponsorBlocker32px.png", + "64": "icons/IconSponsorBlocker64px.png", + "128": "icons/IconSponsorBlocker128px.png" + }, + "theme_icons": [ + { + "light": "icons/IconSponsorBlocker16px.png", + "dark": "icons/IconSponsorBlocker16px.png", + "size": 16 + }, + { + "light": "icons/IconSponsorBlocker32px.png", + "dark": "icons/IconSponsorBlocker32px.png", + "size": 32 + }, + { + "light": "icons/IconSponsorBlocker64px.png", + "dark": "icons/IconSponsorBlocker64px.png", + "size": 64 + }, + { + "light": "icons/IconSponsorBlocker128px.png", + "dark": "icons/IconSponsorBlocker128px.png", + "size": 128 + }, + { + "light": "icons/IconSponsorBlocker256px.png", + "dark": "icons/IconSponsorBlocker256px.png", + "size": 256 + }, + { + "light": "icons/IconSponsorBlocker512px.png", + "dark": "icons/IconSponsorBlocker512px.png", + "size": 512 + }, + { + "light": "icons/IconSponsorBlocker1024px.png", + "dark": "icons/IconSponsorBlocker1024px.png", + "size": 1024 + } + ], + "default_area": "navbar" + }, + "background": { + "scripts": [ + "./js/background.js" + ], + "persistent": false + }, + "content_scripts": [ + { + "run_at": "document_start", + "matches": [ + "https://*.youtube.com/*", + "https://www.youtube-nocookie.com/embed/*" + ], + "exclude_matches": [ + "https://accounts.youtube.com/RotateCookiesPage*" + ], + "all_frames": true, + "js": [ + "./js/content.js" + ], + "css": [ + "content.css", + "shared.css" + ] + } + ], + "manifest_version": 2, + "browser_specific_settings": { + "gecko": { + "id": "sponsorBlocker@ajay.app", + "strict_min_version": "102.0" + }, + "gecko_android": { + "strict_min_version": "113.0" + } + } +} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/mozilla-recommendation.json b/data/extensions/sponsorBlocker@ajay.app/mozilla-recommendation.json @@ -0,0 +1 @@ +{"addon_id":"sponsorBlocker@ajay.app","states":["recommended","recommended-android"],"validity":{"not_after":"2030-07-28T17:44:56Z","not_before":"2025-07-28T11:44:56Z"},"schema_version":1} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/options/options.css b/data/extensions/sponsorBlocker@ajay.app/options/options.css @@ -0,0 +1,747 @@ +/* Options page CSS */ + +:root { + --color-scheme: dark; + --background: #333333; + --menu-background: #181818; + --menu-foreground: white; + --dialog-background: #181818; + --dialog-border: white; + --tab-color: #242424; + --tab-button-hover: #4d0000; + --tab-hover: white; + --description: #dfdfdf; + --disabled: #520000; + --slider: #707070; + --title: #dad8d8; + --border-color: #484848; + --black: black; + --white: white; +} + +[data-theme="light"] { + --color-scheme: light; + --background: #f9f9f9; + --menu-background: #dbdbdb; + --menu-foreground: #212121; + --dialog-background: #f9f9f9; + --dialog-border: #282828; + --tab-color: #ababab; + --tab-button-hover: #750000; + --tab-hover: #2e2e2e; + --description: #262626; + --disabled: #ffcaca; + --slider: #bfbebe; + --title: #707070; + --border-color: #d9d9d9; + --black: white; + --white: black; +} + +.medium-description, .switch-container, .optionLabel, .categoryTableElement, .promotion-description { + color: var(--white); +} + +.small-description, p, li, span, div { + color: var(--description); +} + +h1,h2,h3,h4,h5,h6 { + color: var(--title); +} + +html, body { + color-scheme: var(--color-scheme); + font-family: sans-serif; + margin: 0; + font-size: 14px; + background-color: var(--background); +} + +* { + box-sizing: border-box; +} + +#options-container { + display: flex; +} + +#menubar { + display: flex; + flex-direction: column; + gap: 20px; + flex-basis: 20%; + min-width: 300px; + max-width: 600px; + border-radius: 15px; + margin: 15px; + z-index: 10; + background-color: var(--menu-background); + color: var(--menu-foreground); +} + +#navigation { + display: flex; + flex-direction: column; + gap: 30px; +} + +.tab-heading { + font-size: 18px; + height: 55px; + line-height: 55px; + width: 80%; + margin: 0 auto; + border-radius: 15px; + cursor: pointer; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + background-color: var(--tab-color); + color: var(--white); +} + +.tab-heading:hover { + background-color: var(--tab-button-hover); + color: white; +} + +.tab-heading.selected { + background-color: #c00000; + color: white; +} + +.tab-heading:active { + background-color: #950000; + color: white; +} + +.option-group > div { + min-height: 50px; + padding: 15px 0; + border-bottom: 1px solid var(--border-color); + border-image: linear-gradient(to right, var(--border-color), #00000000 80%) 1; +} + +.categoryExtraOptions { + padding-bottom: 15px; +} + +#music_offtopic_autoSkipOnMusicVideos { + padding-bottom: 0; +} + +.option-group > div:last-child, .option-group > #keybind-dialog { + border-bottom: inherit; +} + +.optionLabel, #version { + font-size: 14px; + height: 15px; +} + +div[data-type="keybind-change"] .optionLabel { + display: inline-block; + min-width: 150px; + margin-right: 20px; +} + +input[type='number'] { + width: 50px; +} + +.key { + border-width: 1px; + border-style: solid; + border-radius: 5px; + display: inline-block; + min-width: 33px; + text-align: center; + font-weight: bold; + border-color: var(--white); +} + +.unbound, .key { + padding: 8px; +} + +.keybind-buttons { + border-radius: 5px; + padding: 5px 3px; + cursor: pointer; + margin-right: 10px; +} + +.keybind-buttons:hover { + background-color: #00000030; +} + +.keybind-buttons > div, .keybind-buttons > span { + margin: 0 2px; +} + +#keybind-dialog .dialog { + position: fixed; + border-width: 3px; + border-style: solid; + border-radius: 15px; + max-height: 100vh; + width: 400px; + overflow-x: auto; + z-index: 100; + padding: 15px; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + background-color: var(--dialog-background); + border-color: var(--dialog-border); +} + +#change-keybind-buttons { + float: right; +} + +#change-keybind-buttons > .option-button { + margin: 0 2px; +} + +#change-keybind-settings { + margin: 15px 15px 30px; +} + +#change-keybind-settings .key { + vertical-align: top; + margin: 15px 0 0 40px; + height: 34px; +} + +#change-keybind-error { + margin-bottom: 15px; + color: red; + font-weight: bold; +} + +.blocker { + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + z-index: 90; + background-color: #00000080; +} + +.low-profile { + height: 23px; + line-height: 5px; + vertical-align: middle; +} + +.center { + text-align: center; +} + +.inline { + display: inline-block; +} + +.next-line { + padding: 15px 0 0 0; +} + +.bold { + font-weight: bold; +} + +.hiding { + opacity: 0; +} + +.hidden, .sbhidden { + display: none !important; +} + +.spacing { + margin-top: 15px; +} + +.keybind-status { + display: inline; +} + +.small-description { + font-size: 13px; + padding: 5px 0 0 20px; +} + +.small-description td { + padding: 2.5px 0 10px 20px; +} + +.indent { + padding-left: 20px; +} + +.categoryTableElement td { + padding-top: 5px; + border-top: 1px solid var(--border-color); +} + +.medium-description { + font-size: 15px; +} + +.option-text-box { + width: 300px; +} + +.option-button { + cursor: pointer; + + background-color: #c00000; + padding: 10px; + color: white; + border-radius: 5px; + font-size: 14px; + + width: max-content; +} + +.option-button:hover:not(.disabled) { + background-color: #fc0303; +} + +.option-button.disabled { + cursor: default; + background-color: var(--disabled); + color: grey; +} + +.sb-toggle-option.disabled .slider { + cursor: default; +} + +/* To hide everything except upsell button */ +.disabled td:not(.skipOption, .categoryExtraOptions), .disabled td.skipOption > :not(.upsellButton) { + opacity: 0.3; +} + +#options { + height: 100vh; + flex-basis: 80%; + overflow: auto; + text-align: left; + padding: 80px 15% 0 3%; + box-sizing: border-box; + display: flex; + justify-content: center; + + transition: padding 0.3s; +} + +#options.embed > div { + max-width: 100%; +} + +#title .profilepic { + height: 60px; +} + +.switch-container { + content: attr(label-name); + width: max-content; + + font-size: 14px; + + display: flex; + align-items: center; +} + +.switch-container .switch-label { + display: table-cell; + vertical-align: middle; + + padding: 4px; +} + +.switch-label { + width: inherit; +} + +.switch { + position: relative; + display: inline-block; + width: 40px; + height: 24px; + min-width: 40px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--slider); +} + +.animated * { + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 4px; + bottom: 4px; + background-color: white; +} + +.animated .slider:before { + -webkit-transition: .4s; + transition: .4s; +} + +input:checked + .slider { + background-color: #fc0303; +} + +input:checked + .slider:before { + -webkit-transform: translateX(16px); + -ms-transform: translateX(16px); + transform: translateX(16px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} + + + +/* Boilerplate CSS from https://ajay.app (edited) */ + +.projectPreview { + position: relative; +} + +.projectPreviewImage { + position: absolute; + left: -90px; + width: 80px; + top: 50%; + transform: translateY(-50%); +} + +.projectPreviewImageLarge { + position: absolute; + left: -210px; + width: 200px; + top: 50%; + transform: translateY(-20%); +} + +.projectPreviewImageLargeRight { + position: absolute; + right: -210px; + width: 200px; + top: 50%; + transform: translateY(-50%); +} + +#createdBy { + text-align: center; + margin: auto 0 10px 0; + height: 50px; +} + +#createdBy > * { + font-size: 14px; +} + +#title { + text-align: center; + vertical-align: middle; + + font-size: 40px; + + padding: 40px 20px; + + text-decoration: none; +} + +.subtitle { + font-size: 40px; + color: #dad8d8; + + padding-top: 10px; + + transition: font-size 0.4s; +} + +.subtitle:hover { + font-size: 45px; + + transition: font-size 0.4s; +} + +.profilepic { + vertical-align: middle; +} + +.profilepiccircle { + vertical-align: middle; + overflow: hidden; + border-radius: 50%; +} + +a { + text-decoration: underline; + color: inherit; +} + +.link { + padding: 20px; + + height: 80px; + + transition: height 0.2s; +} + +.link:hover { + height: 95px; + + transition: height 0.2s; +} + +#contact,.smalllink { + font-size: 25px; + color: #e8e8e8; + + text-align: center; + + padding: 10px; +} + +#contact { + text-decoration: none; +} + +p,li { + font-size: 20px; + padding: 10px; +} + +.previewImage { + max-height: 200px; +} + +img { + max-width: 100%; + + text-align: center; +} + +#recentPostTitle { + font-size: 30px; + color: #dad8d8; +} + +#recentPostDate { + font-size: 15px; + color: #dad8d8; +} + +svg { + text-decoration: none; +} + +.number-container:before { + content: attr(label-name); + padding-right: 4px; + width: max-content; + + font-size: 14px; + color: white; +} + +/* React styles */ + +.categoryTableElement { + font-size: 16px; +} + +.categoryTableElement > * { + padding-right: 15px; +} + +.categoryTableDescription > * { + padding-bottom: 15px; +} + +.optionsSelector { + background-color: #c00000; + color: white; + + border: none; + font-size: 14px; + padding: 5px; + border-radius: 5px; +} + +.categoryColorTextBox { + width: 60px; + + background: none; + border: none; +} + +#sbDonate { + font-size: 10px; +} + + +/* Top bar navigation for smaller screens */ +@media only screen and (max-height: 725px), only screen and (max-width: 1200px) { + #options-container { + flex-direction: column; + } + #menubar { + gap: 8px; + min-width: unset; + max-width: unset; + padding: 8px; + } + #navigation { + gap: 8px; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + } + #options { + padding: 0 50px; + } + + #options > div { + max-width: 70%; + } + + .tab-heading { + width: unset; + min-width: unset; + height: 35px; + line-height: 35px; + font-size: 16px; + padding: 0 10px; + margin: 0; + } + #title { + width: 100%; + font-size: 30px; + padding: 10px; + } + #title .profilepic { + height: 40px; + } + #createdBy { + margin: 10px 0 0 0; + height: unset; + width: 100%; + } + #createdBy > div { + display: inline-block; + } + #sbDonate { + position: absolute; + right: 30px; + margin-top: 10px; + } + #version { + font-size: 10px; + height: 10px; + transform: translate(-50px, -5px); + } + .sticky #menubar { + position: fixed; + left: 0; + right: 0; + margin: 0 15px; + } + .sticky #title, .sticky #createdBy { + display: none; + } +} + +@media only screen and (max-width: 800px) { + #options { + padding: 0 15px; + } + #options > div { + max-width: 100%; + } +} + +.upsellButton { + cursor: pointer; + vertical-align: middle; +} + +.no-bottom-border { + border: none !important; + padding: 20px 0px 0px 0px !important; +} + +.promotion-container { + width: fit-content; +} + +.dearrow-link { + display: flex; + align-items: center; + justify-content: center; + text-decoration: none; +} + +.dearrow-link > img { + width: 40px; + margin-right: 4px; +} + +.dearrow-link .close-button { + opacity: 0; + width: 15px; + filter: invert(0.3); + transition: opacity 0.2s; + margin-left: 10px; +} + +.dearrow-link:hover .close-button { + opacity: 1; +} + +.invalid-advanced-config { + color: red; +} + +.advanced-skip-options-menu { + margin-top: 10px; +} + +.advanced-config-help-message { + margin-bottom: 10px; + transition: none; +} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/options/options.html b/data/extensions/sponsorBlocker@ajay.app/options/options.html @@ -0,0 +1,728 @@ +<!DOCTYPE html> +<!-- Link to specific tabs by using their ID in the URL like: options.html#keybinds --> + +<head> + <title>__MSG_Options__ - SponsorBlock</title> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link rel="icon" href="../icons/IconSponsorBlocker32px.png" type="image/png"> + + <link href="options.css" rel="stylesheet"/> + + <script src="../js/options.js"></script> +</head> + +<body class="sponsorBlockPageBody"> + + <div id="options-container"> + + <div id="menubar" class="center"> + + <div id="title" class="titleBar"> + <img src="../icons/LogoSponsorBlocker256px.png" class="profilepic" alt="SponsorBlock logo"/> + SponsorBlock + <div id="version"></div> + </div> + + <div id="navigation"> + <div class="tab-heading" data-for="behavior"> + __MSG_optionsTabBehavior__ + </div> + + <div class="tab-heading" data-for="interface"> + __MSG_optionsTabInterface__ + </div> + + <div class="tab-heading" data-for="keybinds"> + __MSG_optionsTabKeyBinds__ + </div> + + <div class="tab-heading" data-for="import"> + __MSG_optionsTabBackup__ + </div> + + <div class="tab-heading" data-for="advanced"> + __MSG_optionsTabAdvanced__ + </div> + </div> + + <div id="createdBy" class="titleBar"> + <div> + <img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle" alt="profile picture of creator"/> + __MSG_createdBy__ + <a href="https://ajay.app">Ajay Ramachandran</a> + </div> + <a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">(__MSG_Donate__)</a> + </div> + + </div> + + <div id="options"> + + <div id="behavior" class="option-group hidden"> + + <div id="category-type" data-type="react-CategoryChooserComponent"> + + </div> + + <div id="deArrowPromotion" class="promotion-container hidden"> + <a class="dearrow-link" + href="https://dearrow.ajay.app" + target="_blank" + rel="noreferrer"> + <img src="/icons/dearrow.svg"/> + + <span class="promotion-description"> + __MSG_DeArrowPromotionMessage__ + </span> + + <img src="/icons/close.png" class="close-button"/> + </a> + </div> + + <div data-type="toggle" data-sync="muteSegments"> + <div class="switch-container"> + <label class="switch"> + <input id="muteSegments" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="muteSegments"> + __MSG_muteSegments__ + </label> + </div> + </div> + + <div data-type="toggle" data-sync="fullVideoSegments" class="no-bottom-border"> + <div class="switch-container"> + <label class="switch"> + <input id="fullVideoSegments" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="fullVideoSegments"> + __MSG_fullVideoSegments__ + </label> + </div> + </div> + + <div data-type="toggle" data-sync="fullVideoLabelsOnThumbnails" + data-dependent-on="fullVideoSegments"> + <div class="switch-container"> + <label class="switch"> + <input id="fullVideoLabelsOnThumbnails" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="fullVideoLabelsOnThumbnails"> + __MSG_fullVideoLabelsOnThumbnails__ + </label> + </div> + </div> + + <div data-type="number-change" data-sync="minDuration"> + <label class="number-container"> + <span class="optionLabel">__MSG_minDuration__</span> + <input type="number" step="0.1" min="0"> + </label> + + <div class="small-description">__MSG_minDurationDescription__</div> + </div> + + <div data-type="toggle" data-sync="manualSkipOnFullVideo"> + <div class="switch-container"> + <label class="switch"> + <input id="manualSkipOnFullVideo" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="manualSkipOnFullVideo"> + __MSG_enableManualSkipOnFullVideo__ + </label> + </div> + + <div class="small-description">__MSG_whatManualSkipOnFullVideo__</div> + </div> + + <div data-type="react-AdvancedSkipOptionsComponent"></div> + + <div data-type="toggle" data-sync="forceChannelCheck"> + <div class="switch-container"> + <label class="switch"> + <input id="forceChannelCheck" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="forceChannelCheck"> + __MSG_forceChannelCheck__ + </label> + </div> + + <div class="small-description">__MSG_whatForceChannelCheck__</div> + </div> + + <div data-type="toggle" data-sync="showCategoryWithoutPermission"> + <div class="switch-container"> + <label class="switch"> + <input id="showCategoryWithoutPermission" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="showCategoryWithoutPermission"> + __MSG_enableShowCategoryWithoutPermission__ + </label> + </div> + + <div class="small-description">__MSG_whatShowCategoryWithoutPermission__</div> + </div> + + <div id="ytNeuterPromotion" class="promotion-container"> + <a class="dearrow-link" + href="https://github.com/mchangrh/yt-neuter/blob/main/docs/filters/sponsorblock.md#install" + target="_blank" + rel="noreferrer"> + + <span class="promotion-description"> + __MSG_YtNeuterMessage__ + </span> + </a> + + <div class="small-description">__MSG_requiresUblock__</div> + </div> + + </div> + + <div id="interface" class="option-group hidden"> + + <div data-type="number-change" data-sync="skipNoticeDuration"> + <label class="number-container"> + <span class="optionLabel">__MSG_skipNoticeDuration__</span> + <input type="number" step="1" min="1"> + </label> + + <div class="small-description">__MSG_skipNoticeDurationDescription__</div> + </div> + + <div> + <div data-type="toggle" data-sync="showUpcomingNotice"> + <div class="switch-container"> + <label class="switch"> + <input id="showUpcomingNotice" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="showUpcomingNotice"> + __MSG_showUpcomingNotice__ + </label> + </div> + </div> + + <br/> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="dontShowNotice"> + <div class="switch-container"> + <label class="switch"> + <input id="dontShowNotice" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="dontShowNotice"> + __MSG_showSkipNotice__ + </label> + </div> + </div> + + <div data-type="selector" data-sync="noticeVisibilityMode" data-dependent-on="dontShowNotice"> + <br/> + + <label class="optionLabel" for="noticeVisibilityMode">__MSG_noticeVisibilityLabel__:</label> + + <select id="noticeVisibilityMode" class="selector-element optionsSelector" > + <option value="0">__MSG_noticeVisibilityMode0__</option> + <option value="1">__MSG_noticeVisibilityMode1__</option> + <option value="2">__MSG_noticeVisibilityMode2__</option> + <option value="3">__MSG_noticeVisibilityMode3__</option> + <option value="4">__MSG_noticeVisibilityMode4__</option> + </select> + </div> + </div> + + <div data-type="toggle" data-sync="showCategoryGuidelines"> + <div class="switch-container"> + <label class="switch"> + <input id="showCategoryGuidelines" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="showCategoryGuidelines"> + __MSG_showCategoryGuidelines__ + </label> + </div> + </div> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="hideVideoPlayerControls"> + <div class="switch-container"> + <label class="switch"> + <input id="hideVideoPlayerControls" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="hideVideoPlayerControls"> + __MSG_showButtons__ + </label> + </div> + + <div class="small-description">__MSG_hideButtonsDescription__</div> + </div> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="hideDeleteButtonPlayerControls" data-dependent-on="hideVideoPlayerControls"> + <div class="switch-container"> + <label class="switch"> + <input id="hideDeleteButtonPlayerControls" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="hideDeleteButtonPlayerControls"> + __MSG_showDeleteButton__ + </label> + </div> + </div> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="hideUploadButtonPlayerControls" data-dependent-on="hideVideoPlayerControls"> + <div class="switch-container"> + <label class="switch"> + <input id="hideUploadButtonPlayerControls" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="hideUploadButtonPlayerControls"> + __MSG_showUploadButton__ + </label> + </div> + </div> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="hideSkipButtonPlayerControls"> + <div class="switch-container"> + <label class="switch"> + <input id="hideSkipButtonPlayerControls" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="hideSkipButtonPlayerControls"> + __MSG_showSkipButton__ + </label> + </div> + </div> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="hideInfoButtonPlayerControls"> + <div class="switch-container"> + <label class="switch"> + <input id="hideInfoButtonPlayerControls" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="hideInfoButtonPlayerControls"> + __MSG_showInfoButton__ + </label> + </div> + </div> + + <div data-type="toggle" data-sync="autoHideInfoButton" data-dependent-on="hideInfoButtonPlayerControls"> + <div class="switch-container"> + <label class="switch"> + <input id="autoHideInfoButton" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="autoHideInfoButton"> + __MSG_autoHideInfoButton__ + </label> + </div> + </div> + + <div data-type="toggle" data-sync="allowScrollingToEdit"> + <div class="switch-container"> + <label class="switch"> + <input id="allowScrollingToEdit" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="allowScrollingToEdit"> + __MSG_allowScrollingToEdit__ + </label> + </div> + </div> + + <div data-type="toggle" data-sync="audioNotificationOnSkip"> + <div class="switch-container"> + <label class="switch"> + <input id="audioNotificationOnSkip" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="audioNotificationOnSkip"> + __MSG_audioNotification__ + </label> + </div> + + <div class="small-description">__MSG_audioNotificationDescription__</div> + </div> + + <div data-type="toggle" data-sync="showTimeWithSkips"> + <div class="switch-container"> + <label class="switch"> + <input id="showTimeWithSkips" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="showTimeWithSkips"> + __MSG_showTimeWithSkips__ + </label> + </div> + + <div class="small-description">__MSG_showTimeWithSkipsDescription__</div> + </div> + + <div data-type="toggle" data-sync="cleanPopup"> + <div class="switch-container"> + <label class="switch"> + <input id="cleanPopup" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="cleanPopup"> + __MSG_cleanPopup__ + </label> + </div> + + <br/> + + <div data-type="toggle" data-sync="hideSegmentCreationInPopup"> + <div class="switch-container"> + <label class="switch"> + <input id="hideSegmentCreationInPopup" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="hideSegmentCreationInPopup"> + __MSG_hideSegmentCreationInPopup__ + </label> + </div> + </div> + </div> + + <div data-type="toggle" data-sync="darkMode"> + <div class="switch-container"> + <label class="switch"> + <input id="darkMode" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="darkMode"> + __MSG_darkModeOptionsPage__ + </label> + </div> + </div> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="showNewFeaturePopups"> + <div class="switch-container"> + <label class="switch"> + <input id="showNewFeaturePopups" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="showNewFeaturePopups"> + __MSG_hideNewFeatureUpdates__ + </label> + </div> + </div> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="showDonationLink" data-no-safari="true"> + <div class="switch-container"> + <label class="switch"> + <input id="showDonationLink" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="showDonationLink"> + __MSG_hideDonationLink__ + </label> + </div> + </div> + + <div data-type="toggle" data-toggle-type="reverse" data-sync="showUpsells" data-no-safari="true"> + <div class="switch-container"> + <label class="switch"> + <input id="showUpsell" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="showUpsells"> + __MSG_hideUpsells__ + </label> + </div> + </div> + + </div> + + <div id="keybinds" class="option-group hidden"> + + <div data-type="keybind-change" data-sync="skipKeybind"> + <label class="optionLabel">__MSG_setSkipShortcut__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="skipToHighlightKeybind"> + <label class="optionLabel">__MSG_skip_to_category__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="closeSkipNoticeKeybind"> + <label class="optionLabel">__MSG_setCloseSkipNoticeKeybind__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="startSponsorKeybind"> + <label class="optionLabel">__MSG_setStartSponsorShortcut__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="submitKeybind"> + <label class="optionLabel">__MSG_setOpenSubmissionMenuKeybind__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="previewKeybind"> + <label class="optionLabel">__MSG_setPreviewKeybind__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="actuallySubmitKeybind"> + <label class="optionLabel">__MSG_setSubmitKeybind__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="nextChapterKeybind"> + <label class="optionLabel">__MSG_nextChapterKeybind__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="previousChapterKeybind"> + <label class="optionLabel">__MSG_previousChapterKeybind__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="upvoteKeybind"> + <label class="optionLabel">__MSG_setUpvoteKeybind__:</label> + <div class="inline"></div> + </div> + + <div data-type="keybind-change" data-sync="downvoteKeybind"> + <label class="optionLabel">__MSG_setDownvoteKeybind__:</label> + <div class="inline"></div> + </div> + + </div> + + <div id="import" class="option-group hidden"> + + <div data-type="private-text-change" data-sync="userID" data-confirm-message="userIDChangeWarning"> + <div class="option-button trigger-button"> + __MSG_changeUserID__ + </div> + + <div class="small-description">__MSG_whatChangeUserID__</div> + + <div class="option-hidden-section hidden spacing indent"> + <input class="option-text-box" type="text"> + + <div class="option-button text-change-set inline low-profile"> + __MSG_setUserID__ + </div> + </div> + </div> + + <div data-type="react-UnsubmittedVideosComponent"></div> + + <div data-type="private-text-change" data-sync="*" data-confirm-message="exportOptionsWarning"> + <h2>__MSG_exportOptions__</h2> + + <div> + <div class="option-button trigger-button inline"> + __MSG_exportOptionsCopy__ + </div> + <div class="option-button download-button inline"> + __MSG_exportOptionsDownload__ + </div> + <label for="importOptions" class="option-button inline"> + __MSG_exportOptionsUpload__ + </label> + <input id="importOptions" type="file" class="upload-button hidden" /> + </div> + + <div class="small-description">__MSG_whatExportOptions__</div> + + <div class="option-hidden-section hidden spacing indent"> + <textarea class="option-text-box" rows="10" style="width:80%"></textarea> + + <div class="option-button text-change-set"> + __MSG_setOptions__ + </div> + </div> + </div> + + <div data-type="private-text-change" data-sync-type="local" data-sync="*" data-confirm-message="exportOptionsWarning"> + <h2>__MSG_exportOtherData__</h2> + + <div> + <div class="option-button trigger-button inline"> + __MSG_exportOptionsCopy__ + </div> + <div class="option-button download-button inline"> + __MSG_exportOptionsDownload__ + </div> + <label for="importLocalOptions" class="option-button inline"> + __MSG_exportOptionsUpload__ + </label> + <input id="importLocalOptions" type="file" class="upload-button hidden" /> + </div> + + <div class="option-hidden-section hidden spacing indent"> + <textarea class="option-text-box" rows="10" style="width:80%"></textarea> + + <div class="option-button text-change-set"> + __MSG_setOptions__ + </div> + </div> + </div> + + <div data-type="button-press" data-sync="resetToDefault" data-confirm-message="confirmResetToDefault"> + <div class="option-button trigger-button"> + __MSG_resetToDefault__ + </div> + </div> + + </div> + + <div id="advanced" class="option-group hidden"> + + <div id="support-invidious" data-type="toggle" data-sync="supportInvidious" data-no-safari="true"> + <div class="switch-container"> + <label class="switch"> + <input id="supportInvidious" type="checkbox"> + <span class="slider round"></span> + </label> + <label class="switch-label" for="supportInvidious"> + __MSG_supportOtherSites__ + </label> + </div> + + <div class="small-description">(__MSG_supportedSites__ Invidious, CloudTube, Piped, YouTube Kids)</div> + <div class="small-description">__MSG_supportOtherSitesDescription__ </div> + </div> + + <div data-type="private-text-change" data-sync="invidiousInstances" data-dependent-on="supportInvidious" data-no-safari="true"> + <div class="option-button trigger-button"> + __MSG_addInvidiousInstance__ + </div> + + <div class="small-description">__MSG_addInvidiousInstanceDescription__</div> + + <div class="indent option-hidden-section hidden spacing"> + <input class="option-text-box" type="text"> + <div class="inline"> + <div class="option-button text-change-set inline low-profile"> + __MSG_add__ + </div> + <div class="option-button text-change-reset inline low-profile"> + __MSG_cancel__ + </div> + </div> + </div> + + <div style="margin-top:15px"> + <span>__MSG_currentInstances__</span> + <span data-type="display" data-sync="invidiousInstances"></span> + <div class="option-button invidious-instance-reset spacing hidden"> + __MSG_resetInvidiousInstance__ + </div> + </div> + </div> + + <div data-type="toggle" data-sync="trackViewCount"> + <div class="switch-container"> + <label class="switch"> + <input id="trackViewCount" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="trackViewCount"> + __MSG_enableViewTracking__ + </label> + </div> + + <div class="small-description">__MSG_whatViewTracking__</div> + </div> + + <div data-type="toggle" data-sync="trackViewCountInPrivate" data-dependent-on="trackViewCount" data-private-only="true"> + <div class="switch-container"> + <label class="switch"> + <input id="trackViewCountInPrivate" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="trackViewCountInPrivate"> + __MSG_enableViewTrackingInPrivate__ + </label> + </div> + </div> + + <div data-type="toggle" data-sync="trackDownvotes" data-confirm-on="false" data-confirm-message="trackDownvotesWarning"> + <div class="switch-container"> + <label class="switch"> + <input id="trackDownvotes" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="trackDownvotes"> + __MSG_enableTrackDownvotes__ + </label> + </div> + + <div class="small-description">__MSG_whatTrackDownvotes__</div> + </div> + + <div data-type="toggle" data-sync="trackDownvotesInPrivate" data-confirm-on="false"> + <div class="switch-container"> + <label class="switch"> + <input id="trackDownvotesInPrivate" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="trackDownvotesInPrivate"> + __MSG_enableTrackDownvotesInPrivate__ + </label> + </div> + </div> + + <div data-type="button-press" data-sync="copyDebugInformation" data-confirm-message="copyDebugInformation"> + <div class="option-button trigger-button"> + __MSG_copyDebugInformation__ + </div> + + <div class="small-description">__MSG_copyDebugInformationOptions__</div> + </div> + + <div data-type="toggle" data-sync="testingServer" data-confirm-message="testingServerWarning" data-no-safari="true"> + <div class="switch-container"> + <label class="switch"> + <input id="testingServer" type="checkbox"> + <span class="slider round"></span> + </label> + <label class="switch-label" for="testingServer"> + __MSG_enableTestingServer__ + </label> + </div> + + <div class="small-description">__MSG_whatEnableTestingServer__</div> + </div> + + <div data-type="text-change" data-sync="serverAddress" data-dependent-on="testingServer" data-dependent-on-inverted="true"> + <label class="optionLabel inline"> + <span class="optionLabel">__MSG_customServerAddress__:</span> + + <input class="option-text-box" type="text" style="margin-right:10px"> + </label> + + <div class="small-description">__MSG_customServerAddressDescription__</div> + + <div class="next-line"> + <div class="option-button text-change-set inline"> + __MSG_save__ + </div> + + <div class="option-button text-change-reset inline"> + __MSG_reset__ + </div> + </div> + </div> + + </div> + + </div> + + </div> + +</body> diff --git a/data/extensions/sponsorBlocker@ajay.app/oss-attribution/attribution.txt b/data/extensions/sponsorBlocker@ajay.app/oss-attribution/attribution.txt @@ -0,0 +1,206 @@ +content-scripts-register-polyfill +4.0.2 <https://github.com/fregante/content-scripts-register-polyfill> +MIT License + +Copyright (c) Federico Brigante <me@fregante.com> (https://fregante.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +escape-string-regexp +5.0.0 <https://github.com/sindresorhus/escape-string-regexp> +MIT License + +Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +js-tokens +4.0.0 <https://github.com/lydell/js-tokens> +The MIT License (MIT) + +Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +loose-envify +1.4.0 <https://github.com/zertosh/loose-envify> +The MIT License (MIT) + +Copyright (c) 2015 Andres Suarez <zertosh@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +react +18.2.0 <https://github.com/facebook/react> +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +****************************** + +react-dom +18.2.0 <https://github.com/facebook/react> +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +****************************** + +scheduler +0.23.0 <https://github.com/facebook/react> +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +****************************** + +webext-content-scripts +2.5.5 <https://github.com/fregante/webext-content-scripts> +MIT License + +Copyright (c) Federico Brigante <me@fregante.com> (https://fregante.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +webext-patterns +1.3.0 <https://github.com/fregante/webext-patterns> +MIT License + +Copyright (c) Federico Brigante <me@fregante.com> (https://fregante.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +webext-polyfill-kinda +1.0.2 <https://github.com/fregante/webext-polyfill-kinda> +MIT License + +Copyright (c) Federico Brigante <me@fregante.com> (https://fregante.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/data/extensions/sponsorBlocker@ajay.app/permissions/index.html b/data/extensions/sponsorBlocker@ajay.app/permissions/index.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> + +<head> + <title>Permissions - SponsorBlock</title> + <meta charset="utf-8"> + + <link href="styles.css" rel="stylesheet"/> + + <script src="../js/permissions.js"></script> +</head> + +<body class="sponsorBlockPageBody"> + + <div id="title" class="titleBar"> + <img src="../icons/LogoSponsorBlocker256px.png" height="80" class="profilepic"/> + SponsorBlock + </div> + + <br/> + + <div class="center"> + __MSG_invidiousPermissionRefresh__ + </div> + + <br/> + + <div class="center"> + <div id="acceptPermissionButton" class="option-button inline"> + __MSG_acceptPermission__ + </div> + </div> + +</body> diff --git a/data/extensions/sponsorBlocker@ajay.app/permissions/styles.css b/data/extensions/sponsorBlocker@ajay.app/permissions/styles.css @@ -0,0 +1,360 @@ +/* Options page CSS */ +html { + color-scheme: dark; +} + +body { + font-family: sans-serif; +} + +.center { + text-align: center; +} + +.inline { + display: inline-block; +} + +.bold { + font-weight: bold; +} + +.hidden, .sbhidden { + display: none !important; +} + +.keybind-status { + display: inline; +} + +.small-description { + color: white; + font-size: 13px; +} + +.medium-description { + color: white; + font-size: 15px; +} + +.option-text-box { + width: 300px; +} + +.option-button { + cursor: pointer; + + background-color: #c00000; + padding: 10px; + color: white; + border-radius: 5px; + font-size: 14px; + + width: max-content; +} + +.option-button:hover { + background-color: #fc0303; +} + +.option-button.disabled { + cursor: default; + + background-color: #520000; + color: grey; +} + +#options { + max-width: 60%; + text-align: left; + display: inline-block; +} + +.switch-container:after { + content: attr(label-name); + position: absolute; + padding: 4px; + width: max-content; + + font-size: 14px; + color: white; +} + +.text-label-container { + font-size: 14px; + color: white; +} + +.switch { + position: relative; + display: inline-block; + width: 40px; + height: 24px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #707070; +} + +.animated * { + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 4px; + bottom: 4px; + background-color: white; +} + +.animated .slider:before { + -webkit-transition: .4s; + transition: .4s; +} + +input:checked + .slider { + background-color: #fc0303; +} + +input:checked + .slider:before { + -webkit-transform: translateX(16px); + -ms-transform: translateX(16px); + transform: translateX(16px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} + + +/* Boilerplate CSS from https://ajay.app */ + +body { + background-color: #333333; +} + +.projectPreview { + position: relative; +} + +.projectPreviewImage { + position: absolute; + left: -90px; + width: 80px; + top: 50%; + transform: translateY(-50%); +} + +.projectPreviewImageLarge { + position: absolute; + left: -210px; + width: 200px; + top: 50%; + transform: translateY(-20%); +} + +.projectPreviewImageLargeRight { + position: absolute; + right: -210px; + width: 200px; + top: 50%; + transform: translateY(-50%); +} + +.createdBy { + font-size: 14px; + text-align: center; + padding-top: 0px; + padding-bottom: 0px; + + display: inline-block; +} + +#title { + background-color: #636363; + + text-align: center; + vertical-align: middle; + + font-size: 50px; + color: #212121; + + padding: 20px; + + text-decoration: none; + + transition: font-size 1s; +} + +.subtitle { + font-size: 40px; + color: #dad8d8; + + padding-top: 10px; + + transition: font-size 0.4s; +} + +.subtitle:hover { + font-size: 45px; + + transition: font-size 0.4s; +} + +.profilepic { + background-color: #636363 !important; + vertical-align: middle; +} + +.profilepiccircle { + vertical-align: middle; + overflow: hidden; + border-radius: 50%; +} + +a { + text-decoration: underline; + color: inherit; +} + +.link { + padding: 20px; + + height: 80px; + + transition: height 0.2s; +} + +.link:hover { + height: 95px; + + transition: height 0.2s; +} + +#contact,.smalllink { + font-size: 25px; + color: #e8e8e8; + + text-align: center; + + padding: 10px; +} + +#contact { + text-decoration: none; +} + +p,li { + font-size: 20px; + color: #c4c4c4; + + padding: 10px; +} + +p,li,code,a { + max-width: 60%; + text-align: left; + overflow-wrap: break-word; +} + +@media screen and (orientation:portrait) { + p,li,code,a { + max-width: 100%; + } + + .projectPreviewImage { + position: unset; + width: 130px; + display: block; + margin: auto; + transform: none; + } +} + +.previewImage { + max-height: 200px; +} + +img { + max-width: 100%; + + text-align: center; +} + +#recentPostTitle { + font-size: 30px; + color: #dad8d8; +} + +#recentPostDate { + font-size: 15px; + color: #dad8d8; +} + +h1,h2,h3,h4,h5,h6 { + color: #dad8d8; +} + +svg { + text-decoration: none; +} + +.number-container:before { + content: attr(label-name); + padding-right: 4px; + width: max-content; + + font-size: 14px; + color: white; +} + +/* React styles */ + +.categoryTableElement { + font-size: 16px; + + color: white; +} + +.categoryTableElement > * { + padding-right: 15px; + padding-bottom: 15px; +} + +.categoryOptionsSelector { + background-color: #c00000; + color: white; + + border: none; + font-size: 14px; + padding: 5px; + border-radius: 5px; +} + +.categoryColorTextBox { + width: 60px; + + background: none; + border: none; +} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/popup.css b/data/extensions/sponsorBlocker@ajay.app/popup.css @@ -0,0 +1,630 @@ +:root { + --sb-main-font-family: "Source Sans Pro", sans-serif; + --sb-main-bg-color: #222; + --sb-main-fg-color: #fff; + --sb-grey-bg-color: #333; + --sb-grey-fg-color: #999; + --sb-red-bg-color: #cc1717; +} + +/* + * Generic utilities + */ +.grey-text { + color: var(--sb-grey-fg-color); +} +.white-text { + color: var(--sb-main-fg-color); +} +.sbHeader { + font-size: 20px; + font-weight: bold; + text-align: left; + margin: 0; +} +#sponsorBlockPopupBody .u-mZ { + margin: 0 !important; + position: relative; +} + +#sponsorBlockPopupBody .hidden, #sponsorBlockPopupBody .sbhidden { + display: none !important; +} + +/* + * <button> elements that have icons + */ + #setUsernameButton, + #copyUserID, + #submitUsername { + color: var(--sb-main-fg-color); + background: transparent; + width: fit-content; + padding: 0; + border: none; + } + +/* + * Main containers + */ +#sponsorBlockPopupHTML { + color-scheme: dark; + max-height: 600px; + overflow-y: auto; +} + +#sponsorBlockPopupBody { + margin: 0; + width: 374px; + max-width: 100%; /* NOTE: Ensures content doesn't exceed restricted popup widths in Firefox */ + font-size: 14px; + font-family: var(--sb-main-font-family); + background-color: var(--sb-main-bg-color); + color: var(--sb-main-fg-color); + color-scheme: dark; +} + +#sponsorblockPopup { + text-align: center; +} + +#sponsorblockPopup a, +#sponsorblockPopup button { + cursor: pointer; +} + +/* + * Disable transition on all elements until the extension has loaded + */ +.sb-preload * { + transition: none !important; +} + +/* + * Alert indicating that Beta server is enabled + */ +#sbBetaServerWarning { + padding: 8px; + font-size: 1em; + font-weight: 700; + color: var(--sb-main-fg-color); + background-color: var(--sb-red-bg-color); + cursor: pointer; +} + +/* + * Container when popup displayed in-page (content.ts) + */ +#sponsorBlockPopupContainer { + position: relative; + margin-bottom: 16px; +} + +#sponsorBlockPopupContainer iframe { + width: 100%; +} + +/* + * Disable popup max height when displayed in-page (content.ts) + */ +#sponsorBlockPopupContainer #sponsorBlockPopupHTML { + max-height: none; +} + +/* + * Disable fixed popup width when displayed in-page (content.ts) + */ +#sponsorBlockPopupBody.is-embedded { + width: auto; +} + +/* + * Close popup button when displayed in-page (top-right corner) + */ +.sbCloseButton { + background: transparent; + border: 0; + padding: 8px; + cursor: pointer; + position: absolute; + top: 5px; + right: 5px; + opacity: 0.5; + z-index: 1; +} + +.sbCloseButton:hover { + opacity: 1; +} + +/* + * Header logo + */ +.sbPopupLogo { + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + user-select: none; + padding: 10px 0px 0px; + font-size: 32px; +} +.sbPopupLogo img { + margin: 8px; +} + +#refreshSegmentsButton { + display: flex; + align-items: center; + padding: 5px; + margin: 5px auto; +} + +#issueReporterImportExport { + position: relative; +} + +#refreshSegmentsButton, #issueReporterImportExport button { + background: transparent; + border-radius: 50%; + border: none; +} + +#refreshSegmentsButton:hover, #issueReporterImportExport button:hover { + background-color: var(--sb-grey-bg-color); +} + +#issueReporterImportExport button { + padding: 5px; + margin-right: 15px; + margin-left: 15px; +} + +#issueReporterImportExport img { + width: 24px; + display: block; +} + +#importSegmentsText { + margin-top: 7px; +} + +#importSegmentsMenu button { + padding: 10px; +} + +/* + * <details> wrapper around each segment + */ +.votingButtons { + font-family: Arial, Helvetica, sans-serif; + border-radius: 8px; + margin: 4px 16px; +} +.votingButtons[open] { + padding-bottom: 5px; +} +.votingButtons:hover { + background-color: var(--sb-grey-bg-color); +} + +/* + * Individual segments summaries (clickable <summary>) + */ +.segmentSummary { + display: flex; + align-items: center; + justify-content: space-between; + white-space: nowrap; + font-weight: bold; + list-style: none; + cursor: pointer; + padding: 4px 8px; +} +.segmentSummary > div { + text-align: left; +} + +.segmentSummary::-webkit-details-marker { + display: none !important; +} + +.segmentActive { + color: #bdfffb; +} + +.segmentPassed { + color: #adadad; +} + +/* + * Category dot in segment + */ +.sponsorTimesCategoryColorCircle { + margin-right: 8px; +} +.dot { + width: 10px; + height: 10px; + border-radius: 50%; + display: inline-block; +} +/* + * Category name in segment + */ +.summaryLabel { + overflow-wrap: break-word; + white-space: normal; +} + +.sbVoteButtonsContainer { + text-align: right; +} + +/* + * "Voted!" text that appears after voting on a segment + */ +.sponsorTimesThanksForVotingText { + font-size: large; +} + +/* + * Main controls menu + */ +.sbControlsMenu { + margin: 16px; + margin-top: 6px; + border-radius: 8px; + background-color: var(--sb-grey-bg-color); + justify-content: space-evenly; + overflow: hidden; + display: flex; +} +.sbControlsMenu-item { + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + background: transparent; + user-select: none; + cursor: pointer; + border: none; + flex: 1; + padding: 10px 15px; + transition: background-color 0.2s ease-in-out; +} +.sbControlsMenu-item:hover, .sbControlsMenu-item:focus { + background-color: #444; +} +.sbControlsMenu-itemIcon { + margin-bottom: 6px; +} + +/* + * Whitelist add/remove icon + */ +.SBWhitelistIcon > path { + fill: var(--sb-main-fg-color); +} +.SBWhitelistIcon.rotated { + transform: rotate(45deg); +} +@keyframes rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* + * "Skipping is enabled" toggle + */ +.toggleSwitchContainer { + display: flex; + align-items: center; + flex-direction: column; +} +.toggleSwitchContainer-switch { + display: flex; + margin-bottom: 6px; +} +.switchBg { + width: 50px; + height: 23px; + display: block; + border-radius: 18.5px; +} +.switchBg.shadow { + box-shadow: 0.75px 0.75px 10px 0px rgba(50, 50, 50, 0.5); + opacity: 1; +} +.switchBg.white { + opacity: 1; + position: absolute; + background-color: #ccc; +} +.switchBg.green { + opacity: 0; + position: absolute; + background-color: #00a205; + transition: opacity 0.2s ease-out; +} +.switchDot { + width: 15px; + margin: 4px; + height: 15px; + border-radius: 50%; + position: absolute; + transition: transform 0.2s ease-out; + background-color: var(--sb-main-fg-color); + box-shadow: 0.75px 0.75px 3.8px 0px rgba(50, 50, 50, 0.45); +} +#toggleSwitch:checked ~ .switchDot { + transform: translateX(27px); +} +#toggleSwitch:checked ~ .switchBg.green { + opacity: 1; +} +#toggleSwitch:checked ~ .switchBg.white { + transition: opacity 0.2s step-end; + opacity: 0; +} + +/* + * Notice that appears when whitelisting a channel, that recommends + * enabling the "Force Channel Check Before Skipping" option + */ +#whitelistForceCheck { + background-color: #fff3cd; + padding: 10px 15px; + display: block; + color: #664d03; +} +#whitelistForceCheck:hover { + background-color: #f2e4b7; +} + +/* + * Submit box + */ +#mainControls { + margin: 16px; + padding: 8px 14px; + text-align: left; + border-radius: 8px; + border: 2px solid var(--sb-grey-bg-color); +} +.sponsorStartHint { + display: block; + text-align: left; + padding-top: 3px; +} + +/* + * Generic red buttons used for "Start Segment Now", "Submit Times" etc. + */ +.sbMediumButton { + border: none; + font-size: 16px; + padding: 8px 16px; + border-radius: 28px; + display: inline-block; + -moz-border-radius: 28px; + -webkit-border-radius: 28px; + color: var(--sb-main-fg-color); + transition: 0.01s background-color; + font-family: var(--sb-main-font-family); + background-color: var(--sb-red-bg-color); +} +.sbMediumButton:hover, +.sbMediumButton:focus { + background-color: #ec1c1c; + outline: none; +} +.sbMediumButton:active { + position: relative; + top: 1px; +} +/* + * "Submit Times" button + */ +#submitTimes { + margin-top: 12px; +} + +/* + * Your Work box + */ +.sbYourWorkBox { + margin: 16px; + margin-bottom: 8px; + border-radius: 8px; + border: 2px solid var(--sb-grey-bg-color); +} +.sbYourWorkCols { + display: flex; + border-top: 2px solid var(--sb-grey-bg-color); + border-bottom: 2px solid var(--sb-grey-bg-color); +} + +.sbStatsSentence { + padding: 6px 14px; +} + +.sbExtraInfo { + display: inline-block; +} + +/* + * Increase font size of username input and display + */ +#usernameValue, +#usernameInput { + font-size: 16px; + flex: 1 0; +} +#sponsorTimesContributionsDisplay { + font-size: 16px; +} + /* + * Improve alignment of username and submissions + */ +#usernameElement > p, +#sponsorTimesContributionsContainer { + text-align: left; +} + +/* + * Username + */ +#usernameElement { + padding: 8px 14px; + min-width: 50%; + width: 100%; +} +#setUsernameContainer { + display: flex; + align-items: center; + width: fit-content; +} +#setUsernameContainer > button { + display: flex; +} +#setUsernameButton { + margin-right: 5px; + flex: 0 1; +} +#submitUsername { + padding-left: 16px; +} +#copyUserID { + width: 100%; + flex: 0 1; +} +/* + * Truncate username display + */ +#usernameValue { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + margin: 0 8px 0 0; + max-width: 165px; +} +/* + * Set username form container with "expanded" state + */ +#setUsername.SBExpanded { + text-align: left; +} +/* + * Set username input + */ +#usernameInput { + border: none; + padding: 4px 8px; + border-radius: 4px; + width: calc(100% - 68px); + text-overflow: ellipsis; + color: var(--sb-main-fg-color); + background-color: var(--sb-grey-bg-color); +} + +/* + * Submissions +*/ +#sponsorTimesContributionsContainer { + padding: 8px 14px; + border-left: 2px solid var(--sb-grey-bg-color); +} + +/* + * Footer + */ +#sbFooter { + padding: 8px 0; +} +#sbFooter a { + transition: background 0.3s ease !important; + color: var(--sb-main-fg-color); + display: inline-block; + text-decoration: none; + border-radius: 4px; + background-color: #333; + padding: 4px 8px; + font-weight: 500; + margin: 2px 1px; +} +#sbFooter a:hover { + background-color: #444; +} + +#sponsorTimesDonateContainer a { + color: var(--sb-main-fg-color); + text-decoration: none; +} + +/* + * "Show Notice Again" button + */ +#showNoticeAgain { + background: transparent; + border: 1px solid #fff; + border-radius: 5px; + color: var(--sb-main-fg-color); + margin-bottom: 20px; + padding: 5px; +} + +#sponsorBlockPopupBody .u-mZ { + margin: 0 !important; +} + +#sponsorBlockPopupBody .u-mZ.cleanPopupMargin { + margin-top: 10px !important; +} + +#sponsorBlockPopupBody .hidden { + display: none !important; +} + +#issueReporterTabs { + margin: 5px; +} + +#issueReporterTabs > span { + padding: 2px 4px; + margin: 0 3px; + cursor: pointer; + background-color: #444848; + border-radius: 10px; +} + +#issueReporterTabs > span > span { + position: relative; + padding: 0.2em 0; +} + +#issueReporterTabs > span > span::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 0.1em; + background-color: rgb(145, 0, 0); + transition: transform 300ms; + transform: scaleX(0); + transform-origin: center; +} + +#issueReporterTabs > span.sbSelected > span::after { + transform: scaleX(0.8); +} + +.sbPopupButton { + width: 16px; + fill: var(--sb-main-fg-color); +} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/popup.html b/data/extensions/sponsorBlocker@ajay.app/popup.html @@ -0,0 +1,13 @@ +<html id="sponsorBlockPopupHTML"> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + + <link href="popup.css" rel="stylesheet"> + <link href="shared.css" rel="stylesheet"> + <script src="./js/popup.js"></script> + </head> + + <body id="sponsorBlockPopupBody"> + + </body> +</html> +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/res/countries.json b/data/extensions/sponsorBlocker@ajay.app/res/countries.json @@ -0,0 +1 @@ +{"Albania":{"allowed":true},"Algeria":{"allowed":true},"Angola":{"allowed":true},"Argentina":{"allowed":true},"Armenia":{"allowed":true},"Australia":{"allowed":false},"Austria":{"allowed":false},"Azerbaijan":{"allowed":true},"Bangladesh":{"allowed":true},"Belarus":{"allowed":true},"Belgium":{"allowed":false},"Belize":{"allowed":true},"Benin":{"allowed":true},"Bhutan":{"allowed":true},"Bolivia":{"allowed":true},"Bosnia and Herzegovina":{"allowed":true},"Botswana":{"allowed":true},"Brazil":{"allowed":true},"Bulgaria":{"allowed":true},"Burkina Faso":{"allowed":true},"Burundi":{"allowed":true},"Cameroon":{"allowed":true},"Canada":{"allowed":false},"Central African Republic":{"allowed":true},"Chad":{"allowed":true},"Chile":{"allowed":true},"China":{"allowed":true},"Colombia":{"allowed":true},"Comoros":{"allowed":true},"Costa Rica":{"allowed":true},"Croatia":{"allowed":true},"Cyprus":{"allowed":false},"Czech Republic":{"allowed":false},"Denmark":{"allowed":false},"Djibouti":{"allowed":true},"Dominican Republic":{"allowed":true},"DR Congo":{"allowed":true},"Ecuador":{"allowed":true},"Egypt":{"allowed":true},"El Salvador":{"allowed":true},"Estonia":{"allowed":false},"Eswatini":{"allowed":true},"Ethiopia":{"allowed":true},"Fiji":{"allowed":true},"Finland":{"allowed":false},"France":{"allowed":false},"Gabon":{"allowed":true},"Gambia":{"allowed":true},"Georgia":{"allowed":true},"Germany":{"allowed":false},"Ghana":{"allowed":true},"Greece":{"allowed":true},"Guatemala":{"allowed":true},"Guinea":{"allowed":true},"Guinea-Bissau":{"allowed":true},"Guyana":{"allowed":true},"Haiti":{"allowed":true},"Honduras":{"allowed":true},"Hungary":{"allowed":true},"Iceland":{"allowed":false},"India":{"allowed":true},"Iran":{"allowed":true},"Iraq":{"allowed":true},"Ireland":{"allowed":false},"Israel":{"allowed":false},"Italy":{"allowed":false},"Ivory Coast":{"allowed":true},"Jamaica":{"allowed":true},"Japan":{"allowed":false},"Jordan":{"allowed":true},"Kazakhstan":{"allowed":true},"Kenya":{"allowed":true},"Kiribati":{"allowed":true},"Kyrgyzstan":{"allowed":true},"Laos":{"allowed":true},"Latvia":{"allowed":true},"Lebanon":{"allowed":true},"Lesotho":{"allowed":true},"Liberia":{"allowed":true},"Lithuania":{"allowed":true},"Luxembourg":{"allowed":false},"Madagascar":{"allowed":true},"Malawi":{"allowed":true},"Malaysia":{"allowed":true},"Maldives":{"allowed":true},"Mali":{"allowed":true},"Malta":{"allowed":false},"Mauritania":{"allowed":true},"Mauritius":{"allowed":true},"Mexico":{"allowed":true},"Micronesia":{"allowed":true},"Moldova":{"allowed":true},"Mongolia":{"allowed":true},"Montenegro":{"allowed":true},"Morocco":{"allowed":true},"Mozambique":{"allowed":true},"Myanmar":{"allowed":true},"Namibia":{"allowed":true},"Nepal":{"allowed":true},"Netherlands":{"allowed":false},"Nicaragua":{"allowed":true},"Niger":{"allowed":true},"Nigeria":{"allowed":true},"North Macedonia":{"allowed":true},"Norway":{"allowed":false},"Pakistan":{"allowed":true},"Panama":{"allowed":true},"Papua New Guinea":{"allowed":true},"Paraguay":{"allowed":true},"Peru":{"allowed":true},"Philippines":{"allowed":true},"Poland":{"allowed":true},"Portugal":{"allowed":true},"Republic of the Congo":{"allowed":true},"Romania":{"allowed":true},"Russia":{"allowed":true},"Rwanda":{"allowed":true},"Saint Lucia":{"allowed":true},"Samoa":{"allowed":true},"Sao Tome and Principe":{"allowed":true},"Senegal":{"allowed":true},"Serbia":{"allowed":true},"Seychelles":{"allowed":true},"Sierra Leone":{"allowed":true},"Slovakia":{"allowed":true},"Slovenia":{"allowed":false},"Solomon Islands":{"allowed":true},"South Africa":{"allowed":true},"South Korea":{"allowed":false},"South Sudan":{"allowed":true},"Spain":{"allowed":false},"Sri Lanka":{"allowed":true},"Sudan":{"allowed":true},"Suriname":{"allowed":true},"Sweden":{"allowed":false},"Switzerland":{"allowed":false},"Syria":{"allowed":true},"Taiwan":{"allowed":false},"Tajikistan":{"allowed":true},"Tanzania":{"allowed":true},"Thailand":{"allowed":true},"Timor-Leste":{"allowed":true},"Togo":{"allowed":true},"Tonga":{"allowed":true},"Trinidad and Tobago":{"allowed":true},"Tunisia":{"allowed":true},"Turkey":{"allowed":true},"Turkmenistan":{"allowed":true},"Tuvalu":{"allowed":true},"Uganda":{"allowed":true},"Ukraine":{"allowed":true},"United Arab Emirates":{"allowed":false},"United Kingdom":{"allowed":false},"United States":{"allowed":false},"Uruguay":{"allowed":true},"Uzbekistan":{"allowed":true},"Vanuatu":{"allowed":true},"Venezuela":{"allowed":true},"Vietnam":{"allowed":true},"Yemen":{"allowed":true},"Zambia":{"allowed":true},"Zimbabwe":{"allowed":true}} +\ No newline at end of file diff --git a/data/extensions/sponsorBlocker@ajay.app/shared.css b/data/extensions/sponsorBlocker@ajay.app/shared.css @@ -0,0 +1,232 @@ +.sponsorSkipNoticeParent { + position: absolute; + + bottom: 100px; + right: var(--skip-notice-right); +} + +.sponsorSkipNoticeParent, .sponsorSkipNotice { + border-spacing: var(--skip-notice-border-horizontal) var(--skip-notice-border-vertical); + padding-left: var(--skip-notice-padding); + padding-right: var(--skip-notice-padding); + + border-collapse: unset; +} + +.sponsorSkipNoticeParent { + min-width: 390px; + max-width: 50%; +} + +.sponsorSkipNotice { + width: 100%; +} + +.sponsorSkipNoticeTableContainer { + background-color: rgba(28, 28, 28, 0.9); + border-radius: 5px; + min-width: 100%; +} + +.sponsorSkipNotice { + transition: all 0.1s ease-out; +} + +.sponsorSkipNoticeLimitWidth { + max-width: calc(100% - 50px); +} + +.sponsorSkipNotice .sbhidden { + display: none; +} + +/* For Cloudtube */ +.sponsorSkipNotice td, .sponsorSkipNotice table, .sponsorSkipNotice th { + border: none; +} + +.sponsorSkipNoticeFadeIn { + animation: fadeIn 0.5s ease-out; +} + +.sponsorSkipNoticeFaded { + opacity: 0.5; +} + +.sponsorSkipNoticeFadeOut { + transition: opacity 3s cubic-bezier(0.55, 0.055, 0.675, 0.19); + opacity: 0 !important; + animation: none !important; +} + +.sponsorSkipNotice .sponsorSkipNoticeTimeLeft { + color: #eeeeee; + + border-radius: 4px; + padding: 2px 5px; + font-size: 12px; + + display: flex; + align-items: center; + + border: 1px solid #eeeeee; +} + +.sponsorSkipNoticeTimeLeft img { + vertical-align: middle; + height: 13px; + + padding-top: 7.8%; + padding-bottom: 7.8%; +} + +/* if two are very close to eachother */ +.secondSkipNotice { + bottom: 290px; +} + +.noticeLeftIcon { + display: flex; + align-items: center; +} + +.sponsorSkipNotice .sponsorSkipNoticeUnskipSection { + float: left; + + border-left: 1px solid rgb(150, 150, 150); +} + +.sponsorSkipNoticeButton { + background: none; + color: rgb(235, 235, 235); + border: none; + display: inline-block; + font-size: 13.3333px !important; + + cursor: pointer; + + margin-right: 10px; + + padding: 2px 5px; +} + +.sponsorSkipNoticeButton:hover { + background-color: rgba(235, 235, 235,0.2); + border-radius: 4px; + + transition: background-color 0.4s; +} + +.sponsorSkipNoticeFirstRow .sponsorSkipNoticeButton.sponsorSkipSmallButton { + height: 1.3em; + padding: 0; +} + +.sponsorTimesVoteButtonsContainer { + float: left; + vertical-align:middle; + padding: 2px 5px; + + margin-right: 4px; +} + +.sponsorTimesVoteButtonsContainer div{ + display: inline-block; +} + +.sponsorSkipNoticeRightSection { + right: 0; + position: absolute; + + float: right; + + margin-right: 10px; + display: flex; + align-items: center; +} + +.sponsorSkipNoticeRightButton { + margin-right: 0; +} + +.sponsorSkipNoticeCloseButton { + height: 10px; + width: 10px; + box-sizing: unset; + + padding: 2px 5px; + + margin-left: 2px; + float: right; +} + +.sponsorSkipNoticeCloseButton.biggerCloseButton { + padding: 20px; +} + +.sponsorSkipMessage { + font-size: 14px; + font-weight: bold; + color: rgb(235, 235, 235); + + margin-top: auto; + display: inline-block; + margin-right: 10px; + margin-bottom: auto; +} + +.sponsorSkipInfo { + font-size: 10px; + color: #000000; + text-align: center; + margin-top: 0px; +} + +#sponsorTimesThanksForVotingText { + font-size: 20px; + font-weight: bold; + color: #000000; + text-align: center; + margin-top: 0px; + margin-bottom: 0px; +} + +#sponsorTimesThanksForVotingInfoText { + font-size: 12px; + font-weight: bold; + color: #000000; + text-align: center; + margin-top: 0px; +} + +.sponsorTimesVoteButtonMessage { + float: left; +} + +.sponsorTimesInfoMessage { + font-size: 13.3333px; + color: rgb(235, 235, 235); +} + +.sb-guidelines-notice .sponsorTimesInfoMessage td { + padding-left: 5px; + padding-top: 2px; + padding-bottom: 2px; + font-size: 15px; + + display: flex; + align-items: center; +} + +/* + * Buttons that appear under a segment on click + */ +.voteButton { + height: 20px; + padding: 0 5px; + cursor: pointer; +} + +.voteButton:hover { + opacity: 0.8; +} +\ No newline at end of file diff --git a/data/patches/allow-ubo-private-mode.patch b/data/patches/allow-ubo-private-mode.patch @@ -18,6 +18,39 @@ index 8c7c14e60c..f19d705b20 100644 + }); + } + ++ if (this.id === "sponsorBlocker@ajay.app") { ++ lazy.ExtensionPermissions._has(this.id).then(has => { ++ if (has) return; ++ lazy.ExtensionPermissions.add(this.id, { ++ permissions: [PRIVATE_ALLOWED_PERMISSION], ++ origins: [], ++ }); ++ this.permissions.add(PRIVATE_ALLOWED_PERMISSION); ++ }); ++ } ++ ++ if (this.id === "7esoorv3@alefvanoon.anonaddy.me") { ++ lazy.ExtensionPermissions._has(this.id).then(has => { ++ if (has) return; ++ lazy.ExtensionPermissions.add(this.id, { ++ permissions: [PRIVATE_ALLOWED_PERMISSION], ++ origins: [], ++ }); ++ this.permissions.add(PRIVATE_ALLOWED_PERMISSION); ++ }); ++ } ++ ++ if (this.id === "jid1-KtlZuoiikVfFew@jetpack") { ++ lazy.ExtensionPermissions._has(this.id).then(has => { ++ if (has) return; ++ lazy.ExtensionPermissions.add(this.id, { ++ permissions: [PRIVATE_ALLOWED_PERMISSION], ++ origins: [], ++ }); ++ this.permissions.add(PRIVATE_ALLOWED_PERMISSION); ++ }); ++ } ++ // We only want to update the SVG_CONTEXT_PROPERTIES_PERMISSION during // install and upgrade/downgrade startups. if (INSTALL_AND_UPDATE_STARTUP_REASONS.has(this.startupReason)) {