From adb8c4c5f96c985f23b9250394170f8ef354435f Mon Sep 17 00:00:00 2001 From: Michael C Date: Fri, 7 Oct 2022 16:37:10 -0400 Subject: [PATCH 001/318] only allow full video labels on livestreams --- src/content.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index afe19ccf..9abeee28 100644 --- a/src/content.ts +++ b/src/content.ts @@ -2143,8 +2143,10 @@ function submitSponsorTimes() { //send the message to the background js //called after all the checks have been made that it's okay to do so async function sendSubmitMessage() { + // check if all segments are full video + const onlyFullVideo = sponsorTimesSubmitting.every((segment) => segment.actionType === ActionType.Full); // Block if submitting on a running livestream or premiere - if (isLivePremiere || isVisible(document.querySelector(".ytp-live-badge"))) { + if (!onlyFullVideo && (isLivePremiere || isVisible(document.querySelector(".ytp-live-badge")))) { alert(chrome.i18n.getMessage("liveOrPremiere")); return; } From bf8003891c404365a34108e22004cea3be54268e Mon Sep 17 00:00:00 2001 From: Michael C Date: Fri, 7 Oct 2022 17:12:16 -0400 Subject: [PATCH 002/318] add configDiffPlugin --- webpack/configDiffPlugin.js | 66 +++++++++++++++++++++++++++++++++++++ webpack/webpack.common.js | 4 ++- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 webpack/configDiffPlugin.js diff --git a/webpack/configDiffPlugin.js b/webpack/configDiffPlugin.js new file mode 100644 index 00000000..43456e87 --- /dev/null +++ b/webpack/configDiffPlugin.js @@ -0,0 +1,66 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const { readFile } = require("fs/promises") +let logger; + +const readFileContents = (name) => readFile(name) + .then(data => JSON.parse(data)) + +// partialDeepEquals from ajayyy/SponsorBlockServer +function partialDeepEquals (actual, expected, logger) { + // loop over key, value of expected + let failed = false; + for (const [ key, value ] of Object.entries(expected)) { + if (key === "serverAddress" || key === "testingServerAddress" || key === "serverAddressComment") continue + // if value is object, recurse + const actualValue = actual?.[key] + if (typeof value !== "string" && Array.isArray(value)) { + if (!arrayPartialDeepEquals(actualValue, value)) { + printActualExpected(key, actualValue, value, logger) + failed = true + } + } else if (typeof value === "object") { + if (partialDeepEquals(actualValue, value, logger)) { + console.log("obj failed") + printActualExpected(key, actualValue, value, logger) + failed = true + } + } else if (actualValue !== value) { + printActualExpected(key, actualValue, value, logger) + failed = true + } + } + return failed +} + +const arrayPartialDeepEquals = (actual, expected) => + expected.every(a => actual?.includes(a)) + +function printActualExpected(key, actual, expected, logger) { + logger.error(`Differing value for: ${key}`) + logger.error(`Actual: ${JSON.stringify(actual)}`) + logger.error(`Expected: ${JSON.stringify(expected)}`) +} + +class configDiffPlugin { + apply(compiler) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + compiler.hooks.done.tapAsync("configDiffPlugin", async (stats, callback) => { + logger = compiler.getInfrastructureLogger('configDiffPlugin') + logger.log('Checking for config.json diff...') + + // check example + const exampleConfig = await readFileContents("./config.json.example") + const currentConfig = await readFileContents("./config.json") + + const difference = partialDeepEquals(currentConfig, exampleConfig, logger) + if (difference) { + logger.warn("config.json is missing values from config.json.example") + } else { + logger.info("config.json is not missing any values from config.json.example") + } + callback() + }) + } +} + +module.exports = configDiffPlugin; \ No newline at end of file diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js index d05dea03..0be6c63c 100644 --- a/webpack/webpack.common.js +++ b/webpack/webpack.common.js @@ -7,6 +7,7 @@ const BuildManifest = require('./webpack.manifest'); const srcDir = '../src/'; const fs = require("fs"); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); +const configDiffPlugin = require('./configDiffPlugin'); const edgeLanguages = [ "de", @@ -116,6 +117,7 @@ module.exports = env => ({ browser: env.browser, pretty: env.mode === "production", stream: env.stream - }) + }), + new configDiffPlugin() ] }); From 784c1db0c101a7b21b21db82c5edaa338d492066 Mon Sep 17 00:00:00 2001 From: Michael C Date: Thu, 13 Oct 2022 00:55:55 -0400 Subject: [PATCH 003/318] add YT Music progress bar selector --- src/content.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/content.ts b/src/content.ts index 8f75954f..761307a1 100644 --- a/src/content.ts +++ b/src/content.ts @@ -499,6 +499,11 @@ function createPreviewBar(): void { // For Invidious/VideoJS selector: ".vjs-progress-holder", isVisibleCheck: false + }, { + // For Youtube Music + // there are two sliders, one for volume and one for progress - both called #progressContainer + selector: "#progress-bar>#sliderContainer>div>#sliderBar>#progressContainer", + isVisibleCheck: false } ]; From 4bd7e9ab3433426364c5102949d3fed6659aef93 Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 14 Oct 2022 18:23:40 -0400 Subject: [PATCH 004/318] Fix progress bar with 0px chapters --- src/js-components/previewBar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 84ebb155..34c9a820 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -676,7 +676,7 @@ class PreviewBar { for (let i = 0; i < sections.length; i++) { const section = sections[i] as HTMLElement; const checkElement = section.querySelector(selector) as HTMLElement; - const currentSectionWidthNoMargin = this.getPartialChapterSectionStyle(section, "width") || progressBar.clientWidth; + const currentSectionWidthNoMargin = this.getPartialChapterSectionStyle(section, "width") ?? progressBar.clientWidth; const currentSectionWidth = currentSectionWidthNoMargin + this.getPartialChapterSectionStyle(section, "marginRight"); From 851ceb553dc7b2f6774fce5eaf24973cfd9b9b9a Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sun, 16 Oct 2022 22:41:31 -0400 Subject: [PATCH 005/318] New translations messages.json (Korean) (#1529) --- public/_locales/ko/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/_locales/ko/messages.json b/public/_locales/ko/messages.json index e3c04ece..c5178ac3 100644 --- a/public/_locales/ko/messages.json +++ b/public/_locales/ko/messages.json @@ -392,7 +392,7 @@ "message": "건너뛰기로 제외된 시간 표시" }, "showTimeWithSkipsDescription": { - "message": "탐색 바 아래에 있는 동영상 시간 옆 괄호에 시간이 표시돼요. 건너뛸 구간을 제외할 실제로 재생하게 될 동영상의 길이를 보여줘요. \"탐색 바에 표시\"로만 지정된 구간도 포함해요." + "message": "이 시간은 탐색 바 아래에 있고 현재 시간 옆에 있는 대괄호로 표시돼요. 건너뛸 구간을 제외할 실제로 재생하게 될 동영상의 길이를 보여줘요. \"탐색 바에 표시\"로만 지정된 구간도 포함해요." }, "youHaveSkipped": { "message": "건너뛴 구간: " @@ -424,7 +424,7 @@ "message": "비공개 사용자 ID 가져오기/내보내기" }, "whatChangeUserID": { - "message": "이 정보를 다른 분께 공개하지 마세요. 비밀번호처럼 알려주면 위험한 정보랍니다. 다른 분이 이 정보를 가지고 나를 사칭할 수도 있어요. 공개 사용자 ID를 찾고 있다면, 팝업 내 클립보드 아이콘을 눌러주세요." + "message": "이 정보를 다른 분께 공개하지 마세요. 이건 비밀번호와 같으며 누구와도 공유해서는 안 되는 정보랍니다. 다른 분이 이 정보를 습득한다면, 나를 사칭할 수도 있어요. 공개 사용자 ID를 찾고 있다면, 팝업 내 클립보드 아이콘을 눌러주세요." }, "setUserID": { "message": "비공개 사용자 ID 설정" From 562adb9d5553332c5693ed85084eb8ca392698be Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sun, 16 Oct 2022 22:41:46 -0400 Subject: [PATCH 006/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 2292923c..9c6fdf34 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.0", + "version": "5.1.1", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From a48269f254d1443752615f7139ddc405570b1dbb Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 17 Oct 2022 08:50:55 -0400 Subject: [PATCH 007/318] Import short category names too --- src/utils/exporter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/exporter.ts b/src/utils/exporter.ts index 16b970f3..8c765a34 100644 --- a/src/utils/exporter.ts +++ b/src/utils/exporter.ts @@ -8,7 +8,7 @@ const inTest = typeof chrome === "undefined"; const chapterNames = CompileConfig.categoryList.filter((code) => code !== "chapter") .map((code) => ({ code, - name: !inTest ? chrome.i18n.getMessage("category_" + code) : code + names: !inTest ? [chrome.i18n.getMessage("category_" + code), shortCategoryName(code)] : [code] })); export function exportTimes(segments: SponsorTime[]): string { @@ -47,7 +47,7 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] const title = titleLeft?.length > titleRight?.length ? titleLeft : titleRight; if (title) { - const determinedCategory = chapterNames.find(c => c.name === title)?.code as Category; + const determinedCategory = chapterNames.find(c => c.names.includes(title))?.code as Category; const segment: SponsorTime = { segment: [startTime, GenericUtils.getFormattedTimeToSeconds(match[1])], From b52132e3112d5ec374673e4748d08b4fb55dc550 Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 17 Oct 2022 08:52:55 -0400 Subject: [PATCH 008/318] Open submission men after importing --- src/content.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content.ts b/src/content.ts index 8f75954f..28817872 100644 --- a/src/content.ts +++ b/src/content.ts @@ -284,6 +284,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo updateEditButtonsOnPlayer(); updateSponsorTimesSubmitting(false); + submitSponsorTimes(); } sendResponse({ From 5209c0ea04b6930a33683326788f1327829f0b02 Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 17 Oct 2022 09:23:59 -0400 Subject: [PATCH 009/318] Import chapters as chooseACategory if chapters is disabled --- src/content.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/content.ts b/src/content.ts index 28817872..e9324ece 100644 --- a/src/content.ts +++ b/src/content.ts @@ -271,8 +271,13 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo for (const segment of importedSegments) { if (!sponsorTimesSubmitting.some( (s) => Math.abs(s.segment[0] - segment.segment[0]) < 1 - && Math.abs(s.segment[1] - segment.segment[1]) < 1) - && (segment.category !== "chapter" || utils.getCategorySelection("chapter"))) { + && Math.abs(s.segment[1] - segment.segment[1]) < 1)) { + if (segment.category === "chapter" && !utils.getCategorySelection("chapter")) { + segment.category = "chooseACategory" as Category; + segment.actionType = ActionType.Skip; + segment.description = ""; + } + sponsorTimesSubmitting.push(segment); addedSegments = true; } From aec5845bced2443dea0bf36affd1aa64df18f36e Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 17 Oct 2022 09:25:11 -0400 Subject: [PATCH 010/318] Show import button for errors --- src/popup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/popup.ts b/src/popup.ts index ede826e2..400906a0 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -457,7 +457,7 @@ async function runThePopup(messageListener?: MessageListener): Promise { PageElements.issueReporterImportExport.classList.remove("hidden"); } else { PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status; - PageElements.issueReporterImportExport.classList.add("hidden"); + PageElements.issueReporterImportExport.classList.remove("hidden"); } } From 1fcfea9fd533bbc7d91811c417d9646666f07dd6 Mon Sep 17 00:00:00 2001 From: Michael C Date: Thu, 20 Oct 2022 22:13:51 -0400 Subject: [PATCH 011/318] add noFallThrough, inplicitReturn, update packages --- package-lock.json | 2976 ++++++++++-------------- package.json | 20 +- src/background.ts | 10 +- src/components/SkipNoticeComponent.tsx | 1 + src/content.ts | 2 +- src/js-components/previewBar.ts | 2 +- src/popup.ts | 8 +- src/utils.ts | 1 + src/utils/constants.ts | 8 + src/utils/urlParser.ts | 2 + tsconfig-production.json | 2 + tsconfig.json | 2 + 12 files changed, 1301 insertions(+), 1733 deletions(-) diff --git a/package-lock.json b/package-lock.json index c92982f0..9eff316a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,23 +31,23 @@ "react-dom": "^18.2.0" }, "devDependencies": { - "@types/chrome": "^0.0.197", + "@types/chrome": "^0.0.199", "@types/firefox-webext-browser": "^94.0.1", - "@types/jest": "^29.1.2", + "@types/jest": "^29.2.0", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", - "@types/selenium-webdriver": "^4.1.5", + "@types/selenium-webdriver": "^4.1.6", "@types/wicg-mediasession": "^1.1.4", - "@typescript-eslint/eslint-plugin": "^5.39.0", - "@typescript-eslint/parser": "^5.39.0", + "@typescript-eslint/eslint-plugin": "^5.40.1", + "@typescript-eslint/parser": "^5.40.1", "chromedriver": "^106.0.1", "concurrently": "^7.4.0", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.24.0", - "eslint-plugin-react": "^7.31.8", + "eslint": "^8.25.0", + "eslint-plugin-react": "^7.31.10", "fork-ts-checker-webpack-plugin": "^7.2.13", - "jest": "^29.1.2", - "jest-environment-jsdom": "^29.1.2", + "jest": "^29.2.1", + "jest-environment-jsdom": "^29.2.1", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selenium-webdriver": "^4.5.0", @@ -56,7 +56,7 @@ "ts-loader": "^9.4.1", "ts-node": "^10.9.1", "typescript": "4.8", - "web-ext": "^7.2.0", + "web-ext": "^7.3.1", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "webpack-merge": "^5.8.0" @@ -518,9 +518,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", + "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" @@ -664,9 +664,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -709,23 +709,6 @@ } } }, - "node_modules/@eslint/eslintrc/node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -779,16 +762,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -834,16 +807,16 @@ } }, "node_modules/@jest/console": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.1.2.tgz", - "integrity": "sha512-ujEBCcYs82BTmRxqfHMQggSlkUZP63AE5YEaTPj7eFyJOzukkTorstOUC7L6nE3w5SYadGVAnTsQ/ZjTGL0qYQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.2.1.tgz", + "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", "slash": "^3.0.0" }, "engines": { @@ -921,37 +894,37 @@ } }, "node_modules/@jest/core": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.1.2.tgz", - "integrity": "sha512-sCO2Va1gikvQU2ynDN8V4+6wB7iVrD2CvT0zaRst4rglf56yLly0NQ9nuRRAWFeimRf+tCdFsb1Vk1N9LrrMPA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.2.1.tgz", + "integrity": "sha512-kuLKYqnqgerXkBUwlHVxeSuhSnd+JMnMCLfU98bpacBSfWEJPegytDh3P2m15/JHzet32hGGld4KR4OzMb6/Tg==", "dev": true, "dependencies": { - "@jest/console": "^29.1.2", - "@jest/reporters": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.2.1", + "@jest/reporters": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.0.0", - "jest-config": "^29.1.2", - "jest-haste-map": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-resolve-dependencies": "^29.1.2", - "jest-runner": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", - "jest-watcher": "^29.1.2", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.2.1", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.1", + "jest-resolve-dependencies": "^29.2.1", + "jest-runner": "^29.2.1", + "jest-runtime": "^29.2.1", + "jest-snapshot": "^29.2.1", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.1", + "jest-watcher": "^29.2.1", "micromatch": "^4.0.4", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1038,88 +1011,88 @@ } }, "node_modules/@jest/environment": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.1.2.tgz", - "integrity": "sha512-rG7xZ2UeOfvOVzoLIJ0ZmvPl4tBEQ2n73CZJSlzUjPw4or1oSWC0s0Rk0ZX+pIBJ04aVr6hLWFn1DFtrnf8MhQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.2.1.tgz", + "integrity": "sha512-EutqA7T/X6zFjw6mAWRHND+ZkTPklmIEWCNbmwX6uCmOrFrWaLbDZjA+gePHJx6fFMMRvNfjXcvzXEtz54KPlg==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/fake-timers": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", - "jest-mock": "^29.1.2" + "jest-mock": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.1.2.tgz", - "integrity": "sha512-FXw/UmaZsyfRyvZw3M6POgSNqwmuOXJuzdNiMWW9LCYo0GRoRDhg+R5iq5higmRTHQY7hx32+j7WHwinRmoILQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.2.1.tgz", + "integrity": "sha512-o14R2t2tHHHudwji43UKkzmmH49xfF5T++FQBK2tl88qwuBWQOcx7fNUYl+mA/9TPNAN0FkQ3usnpyS8FUwsvQ==", "dev": true, "dependencies": { - "expect": "^29.1.2", - "jest-snapshot": "^29.1.2" + "expect": "^29.2.1", + "jest-snapshot": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.1.2.tgz", - "integrity": "sha512-4a48bhKfGj/KAH39u0ppzNTABXQ8QPccWAFUFobWBaEMSMp+sB31Z2fK/l47c4a/Mu1po2ffmfAIPxXbVTXdtg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.2.1.tgz", + "integrity": "sha512-yr4aHNg5Z1CjKby5ozm7sKjgBlCOorlAoFcvrOQ/4rbZRfgZQdnmh7cth192PYIgiPZo2bBXvqdOApnAMWFJZg==", "dev": true, "dependencies": { - "jest-get-type": "^29.0.0" + "jest-get-type": "^29.2.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.1.2.tgz", - "integrity": "sha512-GppaEqS+QQYegedxVMpCe2xCXxxeYwQ7RsNx55zc8f+1q1qevkZGKequfTASI7ejmg9WwI+SJCrHe9X11bLL9Q==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.2.1.tgz", + "integrity": "sha512-KWil+8fef7Uj/P/PTZlPKk1Pw117wAmr71VWFV8ZDtRtkwmTG8oY4IRf0Ss44J2y5CYRy8d/zLOhxyoGRENjvA==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@sinonjs/fake-timers": "^9.1.2", "@types/node": "*", - "jest-message-util": "^29.1.2", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2" + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.1", + "jest-util": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.1.2.tgz", - "integrity": "sha512-uMgfERpJYoQmykAd0ffyMq8wignN4SvLUG6orJQRe9WAlTRc9cdpCaE/29qurXixYJVZWUqIBXhSk8v5xN1V9g==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.2.1.tgz", + "integrity": "sha512-Z4EejYPP1OPVq2abk1+9urAwJqkgw5jB2UJGlPjb5ZwzPQF8WLMcigKEfFzZb2OHhEVPP0RZD0/DbVTY1R6iQA==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/expect": "^29.1.2", - "@jest/types": "^29.1.2", - "jest-mock": "^29.1.2" + "@jest/environment": "^29.2.1", + "@jest/expect": "^29.2.1", + "@jest/types": "^29.2.1", + "jest-mock": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.1.2.tgz", - "integrity": "sha512-X4fiwwyxy9mnfpxL0g9DD0KcTmEIqP0jUdnc2cfa9riHy+I6Gwwp5vOZiwyg0vZxfSDxrOlK9S4+340W4d+DAA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.2.1.tgz", + "integrity": "sha512-sCsfUKM/yIF4nNed3e/rIgVIS58EiASGMDEPWqItfLZ9UO1ALW2ASDNJzdWkxEt0T8o2Ztj619G0KKrvK+McAw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", @@ -1132,13 +1105,12 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { @@ -1212,13 +1184,13 @@ } }, "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -1266,9 +1238,9 @@ } }, "node_modules/@jest/source-map": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.0.0.tgz", - "integrity": "sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.15", @@ -1280,13 +1252,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.1.2.tgz", - "integrity": "sha512-jjYYjjumCJjH9hHCoMhA8PCl1OxNeGgAoZ7yuGYILRJX9NjgzTN0pCT5qAoYR4jfOP8htIByvAlz9vfNSSBoVg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.2.1.tgz", + "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==", "dev": true, "dependencies": { - "@jest/console": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.2.1", + "@jest/types": "^29.2.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1295,14 +1267,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.1.2.tgz", - "integrity": "sha512-fU6dsUqqm8sA+cd85BmeF7Gu9DsXVWFdGn9taxM6xN1cKdcP/ivSgXh5QucFRFz1oZxKv3/9DYYbq0ULly3P/Q==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.2.1.tgz", + "integrity": "sha512-O/pnk0/xGj3lxPVNwB6HREJ7AYvUdyP2xo/s14/9Dtf091HoOeyIhWLKQE/4HzB8lNQBMo6J5mg0bHz/uCWK7w==", "dev": true, "dependencies": { - "@jest/test-result": "^29.1.2", + "@jest/test-result": "^29.2.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", + "jest-haste-map": "^29.2.1", "slash": "^3.0.0" }, "engines": { @@ -1310,22 +1282,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.1.2.tgz", - "integrity": "sha512-2uaUuVHTitmkx1tHF+eBjb4p7UuzBG7SXIaA/hNIkaMP6K+gXYGxP38ZcrofzqN0HeZ7A90oqsOa97WU7WZkSw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.2.1.tgz", + "integrity": "sha512-xup+iEuaIRSQabQaeqxaQyN0vg1Dctrp9oTObQsNf3sZEowTIa5cANYuoyi8Tqhg4GCqEVLTf18KW7ii0UeFVA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-util": "^29.1.2", + "jest-haste-map": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1419,9 +1391,9 @@ } }, "node_modules/@jest/types": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.1.2.tgz", - "integrity": "sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", "dev": true, "dependencies": { "@jest/schemas": "^29.0.0", @@ -1575,9 +1547,9 @@ } }, "node_modules/@mdn/browser-compat-data": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.1.8.tgz", - "integrity": "sha512-gHZvccExN0upm9gjJZnmavwQWeFHwxBOxiwiHzYYtsRSlu0xBafz0WFCgRqWmzJh/ABNz87/4nhB7FTaop3r6Q==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.6.tgz", + "integrity": "sha512-KJfP6iTcVX+R5OSC4NOIF4V9fTyifcjwmdkOk7UzsaWxkF21rc6KhGlohqiSRVEynidGO1EEyyYf/PD3jsM1gA==", "dev": true }, "node_modules/@nodelib/fs.scandir": { @@ -1774,9 +1746,9 @@ } }, "node_modules/@types/chrome": { - "version": "0.0.197", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.197.tgz", - "integrity": "sha512-m1NfS5bOjaypyqQfaX6CxmJodZVcvj5+Mt/K94EBHkflYjPNmXHAzbxfifdLMa0YM3PDyOxohoTS5ug/e6p5jA==", + "version": "0.0.199", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.199.tgz", + "integrity": "sha512-BDuKiS8iZONsvTFSjbJlmHAwkYpkcWtG7Z7ESDJ/vf0QlcaXX6q4Xzi7euDNjIS4ZMA4kSODPGBHGVdC2lAHzw==", "dev": true, "dependencies": { "@types/filesystem": "*", @@ -1873,9 +1845,9 @@ } }, "node_modules/@types/jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.1.2.tgz", - "integrity": "sha512-y+nlX0h87U0R+wsGn6EBuoRWYyv3KFtwRNP3QWp9+k2tJ2/bqcGS3UxD7jgT+tiwJWWq3UsyV4Y+T6rsMT4XMg==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.0.tgz", + "integrity": "sha512-KO7bPV21d65PKwv3LLsD8Jn3E05pjNjRZvkm+YTacWhVmykAb07wW6IkZUmQAltwQafNcDUEUrMO2h3jeBSisg==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1976,14 +1948,20 @@ "dev": true }, "node_modules/@types/selenium-webdriver": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.5.tgz", - "integrity": "sha512-Lfu97JK5b2jAxCUHH8uMjmhUiQZCGDyVzSAskFFZuWcprtcwjMkEPZE/SiIM5hOGQJVs982BAF26a3kmw8iiJw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.6.tgz", + "integrity": "sha512-qK1UbVws7APzKmL2pP1ypVXCdMrJko32anuz5Fl6qrU/1AWM/mVVY7cOM7FhsOVrIqLXo+YoKJf6+LLNtXgbSw==", "dev": true, "dependencies": { "@types/ws": "*" } }, + "node_modules/@types/semver": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", + "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -2036,14 +2014,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", - "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz", + "integrity": "sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/type-utils": "5.39.0", - "@typescript-eslint/utils": "5.39.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/type-utils": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -2100,14 +2078,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", - "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.1.tgz", + "integrity": "sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "debug": "^4.3.4" }, "engines": { @@ -2144,13 +2122,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", - "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz", + "integrity": "sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/visitor-keys": "5.39.0" + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2161,13 +2139,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", - "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz", + "integrity": "sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.39.0", - "@typescript-eslint/utils": "5.39.0", + "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2205,9 +2183,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", - "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.1.tgz", + "integrity": "sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2218,13 +2196,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", - "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz", + "integrity": "sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/visitor-keys": "5.39.0", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2277,17 +2255,19 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", - "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.1.tgz", + "integrity": "sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/typescript-estree": "5.39.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2300,13 +2280,28 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", - "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.39.0", + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz", + "integrity": "sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.40.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2570,14 +2565,14 @@ } }, "node_modules/addons-linter": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.14.0.tgz", - "integrity": "sha512-50thc5vltnIeRkLCH/PxmnKhWXiguDs7SoPVNDF7YkMp9X58zHBJKKBgroJZaDFwzWOPLdxOM9ClU0JFkLR8WQ==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.18.0.tgz", + "integrity": "sha512-pce7nSuf/fNesDTmiD077auB15gcWZVHSVFmmAU/mm4BpzDPJBYp5rBYVMDaLjTAsYxR6Qq1ICBN8zryso2UxQ==", "dev": true, "dependencies": { - "@mdn/browser-compat-data": "5.1.8", + "@mdn/browser-compat-data": "5.2.6", "addons-moz-compare": "1.2.0", - "addons-scanner-utils": "7.1.0", + "addons-scanner-utils": "8.1.0", "ajv": "8.11.0", "ajv-merge-patch": "5.0.1", "chalk": "4.1.2", @@ -2585,10 +2580,10 @@ "columnify": "1.6.0", "common-tags": "1.8.2", "deepmerge": "4.2.2", - "eslint": "8.21.0", + "eslint": "8.25.0", "eslint-plugin-no-unsanitized": "4.0.1", "eslint-visitor-keys": "3.3.0", - "espree": "9.3.3", + "espree": "9.4.0", "esprima": "4.0.1", "fluent-syntax": "0.13.0", "glob": "8.0.3", @@ -2596,15 +2591,15 @@ "is-mergeable-object": "1.1.1", "jed": "1.1.1", "os-locale": "5.0.0", - "pino": "8.4.0", - "postcss": "8.4.16", + "pino": "8.6.1", + "postcss": "8.4.18", "relaxed-json": "1.0.3", - "semver": "7.3.7", + "semver": "7.3.8", "sha.js": "2.4.11", "source-map-support": "0.5.21", "tosource": "1.0.0", "upath": "2.0.1", - "yargs": "17.5.1", + "yargs": "17.6.0", "yauzl": "2.10.0" }, "bin": { @@ -2614,6 +2609,40 @@ "node": ">=12.21.0" } }, + "node_modules/addons-linter/node_modules/addons-scanner-utils": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-8.1.0.tgz", + "integrity": "sha512-wxqnmmrzZXjz4B4GZbFcR4HJxTP+pGu+C6iOjMJdmL6mgZZey/UEVJlU6XTxu8GdGv0bUoJxyIioH8XEDxy91Q==", + "dev": true, + "dependencies": { + "@types/yauzl": "2.10.0", + "common-tags": "1.8.2", + "first-chunk-stream": "3.0.0", + "strip-bom-stream": "4.0.0", + "upath": "2.0.1", + "yauzl": "2.10.0" + }, + "peerDependencies": { + "body-parser": "1.20.1", + "express": "4.18.2", + "node-fetch": "2.6.7", + "safe-compare": "1.1.4" + }, + "peerDependenciesMeta": { + "body-parser": { + "optional": true + }, + "express": { + "optional": true + }, + "node-fetch": { + "optional": true + }, + "safe-compare": { + "optional": true + } + } + }, "node_modules/addons-linter/node_modules/ajv": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", @@ -2658,12 +2687,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/addons-linter/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/addons-linter/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -2707,173 +2730,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/addons-linter/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/addons-linter/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/addons-linter/node_modules/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/addons-linter/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/addons-linter/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/addons-linter/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/addons-linter/node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -2893,33 +2749,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/addons-linter/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/addons-linter/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/addons-linter/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2929,52 +2758,12 @@ "node": ">=8" } }, - "node_modules/addons-linter/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/addons-linter/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/addons-linter/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/addons-linter/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/addons-linter/node_modules/minimatch": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", @@ -2987,66 +2776,32 @@ "node": ">=10" } }, - "node_modules/addons-linter/node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/addons-linter/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/addons-linter/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" + "node": "4.x || >=6.0.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "encoding": "^0.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/addons-linter/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/addons-linter/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/addons-linter/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3070,28 +2825,32 @@ "node": ">=8" } }, - "node_modules/addons-linter/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/addons-linter/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } + "optional": true, + "peer": true }, - "node_modules/addons-linter/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/addons-linter/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optional": true, + "peer": true + }, + "node_modules/addons-linter/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/addons-moz-compare": { @@ -3100,44 +2859,6 @@ "integrity": "sha512-COG8qk2/dubPqabfcoJW4E7pm2EQDI43iMrHnhlobvq/uRMEzx/PYJ1KaUZ97Vgg44R3QdRG5CvDsTRbMUHcDw==", "dev": true }, - "node_modules/addons-scanner-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-7.1.0.tgz", - "integrity": "sha512-I6uQtJg3sbNtbGOsR2GmTtegCegYTXFRTnnvukEcX0jWidI4enyENyCV1MNkoLSw5xbgKIM/bFuSm4IPFlDYrg==", - "dev": true, - "dependencies": { - "@types/yauzl": "2.10.0", - "common-tags": "1.8.2", - "first-chunk-stream": "3.0.0", - "strip-bom-stream": "4.0.0", - "upath": "2.0.1", - "yauzl": "2.10.0" - }, - "peerDependencies": { - "@types/download": "8.0.1", - "body-parser": "1.20.0", - "download": "8.0.0", - "express": "4.18.1", - "safe-compare": "1.1.4" - }, - "peerDependenciesMeta": { - "@types/download": { - "optional": true - }, - "body-parser": { - "optional": true - }, - "download": { - "optional": true - }, - "express": { - "optional": true - }, - "safe-compare": { - "optional": true - } - } - }, "node_modules/adm-zip": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", @@ -3448,15 +3169,15 @@ } }, "node_modules/babel-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.1.2.tgz", - "integrity": "sha512-IuG+F3HTHryJb7gacC7SQ59A9kO56BctUsT67uJHp1mMCHUOMXpDwOHWGifWqdWVknN2WNkCVQELPjXx0aLJ9Q==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.2.1.tgz", + "integrity": "sha512-gQJwArok0mqoREiCYhXKWOgUhElJj9DpnssW6GL8dG7ARYqHEhrM9fmPHTjdqEGRVXZAd6+imo3/Vwa8TjLcsw==", "dev": true, "dependencies": { - "@jest/transform": "^29.1.2", + "@jest/transform": "^29.2.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.0.2", + "babel-preset-jest": "^29.2.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -3555,9 +3276,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz", - "integrity": "sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -3593,12 +3314,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz", - "integrity": "sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.0.2", + "babel-plugin-jest-hoist": "^29.2.0", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -4241,13 +3962,17 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { @@ -4617,10 +4342,9 @@ } }, "node_modules/core-js": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", - "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.3.tgz", + "integrity": "sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -4764,6 +4488,15 @@ "node": ">=0.10" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4896,12 +4629,15 @@ } }, "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defer-to-connect": { @@ -4986,9 +4722,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz", - "integrity": "sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.2.0.tgz", + "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5357,14 +5093,13 @@ } }, "node_modules/eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", + "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.2", + "@eslint/eslintrc": "^1.3.3", "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -5422,9 +5157,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", - "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", "dev": true, "dependencies": { "array-includes": "^3.1.5", @@ -5617,23 +5352,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -5824,9 +5542,9 @@ } }, "node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -5947,15 +5665,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -5966,16 +5675,16 @@ } }, "node_modules/expect": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.1.2.tgz", - "integrity": "sha512-AuAGn1uxva5YBbBlXb+2JPxJRuemZsmlGcapPXWNSBNsQtAULfjioREGBWuI0EOvYUKjDnrCy8PW5Zlr1md5mw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.2.1.tgz", + "integrity": "sha512-BJtA754Fba0YWRWHgjKUMTA3ltWarKgITXHQnbZ2mTxTXC4yMQlR0FI7HkB3fJYkhWBf4qjNiqvg3LDtXCcVRQ==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2" + "@jest/expect-utils": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6117,6 +5826,29 @@ "pend": "~1.2.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", @@ -6414,6 +6146,18 @@ "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", "dev": true }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -6476,12 +6220,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -6943,12 +6681,12 @@ } }, "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">=8.12.0" + "node": ">=10.17.0" } }, "node_modules/iconv-lite": { @@ -7666,15 +7404,15 @@ "dev": true }, "node_modules/jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.1.2.tgz", - "integrity": "sha512-5wEIPpCezgORnqf+rCaYD1SK+mNN7NsstWzIsuvsnrhR/hSxXWd82oI7DkrbJ+XTD28/eG8SmxdGvukrGGK6Tw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.2.1.tgz", + "integrity": "sha512-K0N+7rx+fv3Us3KhuwRSJt55MMpZPs9Q3WSO/spRZSnsalX8yEYOTQ1PiSN7OvqzoRX4JEUXCbOJRlP4n8m5LA==", "dev": true, "dependencies": { - "@jest/core": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/core": "^29.2.1", + "@jest/types": "^29.2.1", "import-local": "^3.0.2", - "jest-cli": "^29.1.2" + "jest-cli": "^29.2.1" }, "bin": { "jest": "bin/jest.js" @@ -7692,9 +7430,9 @@ } }, "node_modules/jest-changed-files": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.0.0.tgz", - "integrity": "sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", "dev": true, "dependencies": { "execa": "^5.0.0", @@ -7720,28 +7458,28 @@ } }, "node_modules/jest-circus": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.1.2.tgz", - "integrity": "sha512-ajQOdxY6mT9GtnfJRZBRYS7toNIJayiiyjDyoZcnvPRUPwJ58JX0ci0PKAKUo2C1RyzlHw0jabjLGKksO42JGA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.2.1.tgz", + "integrity": "sha512-W+ZQQ5ln4Db2UZNM4NJIeasnhCdDhSuYW4eLgNAUi0XiSSpF634Kc5wiPvGiHvTgXMFVn1ZgWIijqhi9+kLNLg==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/expect": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.2.1", + "@jest/expect": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.1.2", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", + "jest-each": "^29.2.1", + "jest-matcher-utils": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-runtime": "^29.2.1", + "jest-snapshot": "^29.2.1", + "jest-util": "^29.2.1", "p-limit": "^3.1.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -7835,21 +7573,21 @@ } }, "node_modules/jest-cli": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.1.2.tgz", - "integrity": "sha512-vsvBfQ7oS2o4MJdAH+4u9z76Vw5Q8WBQF5MchDbkylNknZdrPTX1Ix7YRJyTlOWqRaS7ue/cEAn+E4V1MWyMzw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.2.1.tgz", + "integrity": "sha512-UIMD5aNqvPKpdlJSaeUAoLfxsh9TZvOkaMETx5qXnkboc317bcbb0eLHbIj8sFBHdcJAIAM+IRKnIU7Wi61MBw==", "dev": true, "dependencies": { - "@jest/core": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/core": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-config": "^29.2.1", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.1", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -7939,31 +7677,31 @@ } }, "node_modules/jest-config": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.1.2.tgz", - "integrity": "sha512-EC3Zi86HJUOz+2YWQcJYQXlf0zuBhJoeyxLM6vb6qJsVmpP7KcCP1JnyF0iaqTaXdBP8Rlwsvs7hnKWQWWLwwA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.2.1.tgz", + "integrity": "sha512-EV5F1tQYW/quZV2br2o88hnYEeRzG53Dfi6rSG3TZBuzGQ6luhQBux/RLlU5QrJjCdq3LXxRRM8F1LP6DN1ycA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.1.2", - "@jest/types": "^29.1.2", - "babel-jest": "^29.1.2", + "@jest/test-sequencer": "^29.2.1", + "@jest/types": "^29.2.1", + "babel-jest": "^29.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.1.2", - "jest-environment-node": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-runner": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-circus": "^29.2.1", + "jest-environment-node": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.1", + "jest-runner": "^29.2.1", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -8054,15 +7792,15 @@ } }, "node_modules/jest-diff": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.1.2.tgz", - "integrity": "sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.2.1.tgz", + "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.0.0", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "diff-sequences": "^29.2.0", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8139,9 +7877,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.0.0.tgz", - "integrity": "sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -8151,16 +7889,16 @@ } }, "node_modules/jest-each": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.1.2.tgz", - "integrity": "sha512-AmTQp9b2etNeEwMyr4jc0Ql/LIX/dhbgP21gHAizya2X6rUspHn2gysMXaj6iwWuOJ2sYRgP8c1P4cXswgvS1A==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.2.1.tgz", + "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "chalk": "^4.0.0", - "jest-get-type": "^29.0.0", - "jest-util": "^29.1.2", - "pretty-format": "^29.1.2" + "jest-get-type": "^29.2.0", + "jest-util": "^29.2.1", + "pretty-format": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8237,65 +7975,73 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.1.2.tgz", - "integrity": "sha512-D+XNIKia5+uDjSMwL/G1l6N9MCb7LymKI8FpcLo7kkISjc/Sa9w+dXXEa7u1Wijo3f8sVLqfxdGqYtRhmca+Xw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.2.1.tgz", + "integrity": "sha512-MipBdmrjgzEdQMkK7b7wBShOfv1VqO6FVwa9S43bZwKYLC4dlWnPiCgNpZX3ypNEpJO8EMpMhg4HrUkWUZXGiw==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.2.1", + "@jest/fake-timers": "^29.2.1", + "@jest/types": "^29.2.1", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2", + "jest-mock": "^29.2.1", + "jest-util": "^29.2.1", "jsdom": "^20.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, "node_modules/jest-environment-node": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.1.2.tgz", - "integrity": "sha512-C59yVbdpY8682u6k/lh8SUMDJPbOyCHOTgLVVi1USWFxtNV+J8fyIwzkg+RJIVI30EKhKiAGNxYaFr3z6eyNhQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.2.1.tgz", + "integrity": "sha512-PulFKwEMz6nTAdLUwglFKei3b/LixwlRiqTN6nvPE1JtrLtlnpd6LXnFI1NFHYJGlTmIWilMP2n9jEtPPKX50g==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.2.1", + "@jest/fake-timers": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2" + "jest-mock": "^29.2.1", + "jest-util": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", - "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.1.2.tgz", - "integrity": "sha512-xSjbY8/BF11Jh3hGSPfYTa/qBFrm3TPM7WU8pU93m2gqzORVLkHFWvuZmFsTEBPRKndfewXhMOuzJNHyJIZGsw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.2.1.tgz", + "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.0.0", - "jest-util": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -8316,13 +8062,13 @@ } }, "node_modules/jest-haste-map/node_modules/jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -8346,28 +8092,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.1.2.tgz", - "integrity": "sha512-TG5gAZJpgmZtjb6oWxBLf2N6CfQ73iwCe6cofu/Uqv9iiAm6g502CAnGtxQaTfpHECBdVEMRBhomSXeLnoKjiQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz", + "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==", "dev": true, "dependencies": { - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz", - "integrity": "sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.2.1.tgz", + "integrity": "sha512-hUTBh7H/Mnb6GTpihbLh8uF5rjAMdekfW/oZNXUMAXi7bbmym2HiRpzgqf/zzkjgejMrVAkPdVSQj+32enlUww==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.1.2", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8444,18 +8190,18 @@ } }, "node_modules/jest-message-util": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.1.2.tgz", - "integrity": "sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.2.1.tgz", + "integrity": "sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8534,14 +8280,14 @@ } }, "node_modules/jest-mock": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.1.2.tgz", - "integrity": "sha512-PFDAdjjWbjPUtQPkQufvniXIS3N9Tv7tbibePEjIIprzjgo0qQlyUiVMrT4vL8FaSJo1QXifQUOuPH3HQC/aMA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.2.1.tgz", + "integrity": "sha512-NDphaY/GqyQpTfnTZiTqqpMaw4Z0I7XnB7yBgrT6IwYrLGxpOhrejYr4ANY4YvO2sEGdd8Tx/6D0+WLQy7/qDA==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/node": "*", - "jest-util": "^29.1.2" + "jest-util": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8565,26 +8311,26 @@ } }, "node_modules/jest-regex-util": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.0.0.tgz", - "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.1.2.tgz", - "integrity": "sha512-7fcOr+k7UYSVRJYhSmJHIid3AnDBcLQX3VmT9OSbPWsWz1MfT7bcoerMhADKGvKCoMpOHUQaDHtQoNp/P9JMGg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.2.1.tgz", + "integrity": "sha512-1dJTW76Z9622Viq4yRcwBuEXuzGtE9B2kdl05RC8Om/lAzac9uEgC+M8Q5osVidbuBPmxm8wSrcItYhca2ZAtQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", + "jest-haste-map": "^29.2.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" @@ -8594,13 +8340,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.1.2.tgz", - "integrity": "sha512-44yYi+yHqNmH3OoWZvPgmeeiwKxhKV/0CfrzaKLSkZG9gT973PX8i+m8j6pDrTYhhHoiKfF3YUFg/6AeuHw4HQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.1.tgz", + "integrity": "sha512-o3mUGX2j08usj1jIAIE8KmUVpqVAn54k80kI27ldbZf2oJn6eghhB6DvJxjrcH40va9CQgWTfU5f2Ag/MoUqgQ==", "dev": true, "dependencies": { - "jest-regex-util": "^29.0.0", - "jest-snapshot": "^29.1.2" + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8677,30 +8423,30 @@ } }, "node_modules/jest-runner": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.1.2.tgz", - "integrity": "sha512-yy3LEWw8KuBCmg7sCGDIqKwJlULBuNIQa2eFSVgVASWdXbMYZ9H/X0tnXt70XFoGf92W2sOQDOIFAA6f2BG04Q==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.2.1.tgz", + "integrity": "sha512-PojFI+uVhQ4u4YZKCN/a3yU0/l/pJJXhq1sW3JpCp8CyvGBYGddRFPKZ1WihApusxqWRTHjBJmGyPWv6Av2lWA==", "dev": true, "dependencies": { - "@jest/console": "^29.1.2", - "@jest/environment": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.2.1", + "@jest/environment": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.10.2", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.0.0", - "jest-environment-node": "^29.1.2", - "jest-haste-map": "^29.1.2", - "jest-leak-detector": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-resolve": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-util": "^29.1.2", - "jest-watcher": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.2.1", + "jest-haste-map": "^29.2.1", + "jest-leak-detector": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-resolve": "^29.2.1", + "jest-runtime": "^29.2.1", + "jest-util": "^29.2.1", + "jest-watcher": "^29.2.1", + "jest-worker": "^29.2.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8767,13 +8513,13 @@ } }, "node_modules/jest-runner/node_modules/jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -8834,31 +8580,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.1.2.tgz", - "integrity": "sha512-jr8VJLIf+cYc+8hbrpt412n5jX3tiXmpPSYTGnwcvNemY+EOuLNiYnHJ3Kp25rkaAcTWOEI4ZdOIQcwYcXIAZw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.2.1.tgz", + "integrity": "sha512-PSQ880OoIW9y8E6/jjhGn3eQNgNc6ndMzCZaKqy357bv7FqCfSyYepu3yDC6Sp1Vkt+GhP2M/PVgldS2uZSFZg==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/globals": "^29.1.2", - "@jest/source-map": "^29.0.0", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.2.1", + "@jest/fake-timers": "^29.2.1", + "@jest/globals": "^29.2.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-mock": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.1", + "jest-snapshot": "^29.2.1", + "jest-util": "^29.2.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8937,9 +8683,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.1.2.tgz", - "integrity": "sha512-rYFomGpVMdBlfwTYxkUp3sjD6usptvZcONFYNqVlaz4EpHPnDvlWjvmOQ9OCSNKqYZqLM2aS3wq01tWujLg7gg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.2.1.tgz", + "integrity": "sha512-KZdLD7iEz5M4ZYd+ezZ/kk73z+DtNbk/yJ4Qx7408Vb0CCuclJIZPa/HmIwSsCfIlOBNcYTKufr7x/Yv47oYlg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8948,23 +8694,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/expect-utils": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.1.2", + "expect": "^29.2.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-haste-map": "^29.1.2", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.2.1", + "jest-matcher-utils": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "semver": "^7.3.5" }, "engines": { @@ -9057,12 +8803,12 @@ } }, "node_modules/jest-util": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.1.2.tgz", - "integrity": "sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -9144,17 +8890,17 @@ } }, "node_modules/jest-validate": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.1.2.tgz", - "integrity": "sha512-k71pOslNlV8fVyI+mEySy2pq9KdXdgZtm7NHrBX8LghJayc3wWZH0Yr0mtYNGaCU4F1OLPXRkwZR0dBm/ClshA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.2.1.tgz", + "integrity": "sha512-DZVX5msG6J6DL5vUUw+++6LEkXUsPwB5R7fsfM7BXdz2Ipr0Ib046ak+8egrwAR++pvSM/5laxLK977ieIGxkQ==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.0.0", + "jest-get-type": "^29.2.0", "leven": "^3.1.0", - "pretty-format": "^29.1.2" + "pretty-format": "^29.2.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -9243,18 +8989,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.1.2.tgz", - "integrity": "sha512-6JUIUKVdAvcxC6bM8/dMgqY2N4lbT+jZVsxh0hCJRbwkIEnbr/aPjMQ28fNDI5lB51Klh00MWZZeVf27KBUj5w==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.2.1.tgz", + "integrity": "sha512-7jFaHUaRq50l4w/f6RuY713bvI5XskMmjWCE54NGYcY74fLkShS8LucXJke1QfGnwDSCoIqGnGGGKPwdaBYz2Q==", "dev": true, "dependencies": { - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.10.2", - "jest-util": "^29.1.2", + "jest-util": "^29.2.1", "string-length": "^4.0.1" }, "engines": { @@ -9367,6 +9113,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jose": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.10.0.tgz", + "integrity": "sha512-KEhB/eLGLomWGPTb+/RNbYsTjIyx03JmbqAyIyiXBuNSa7CmNrJd5ysFhblayzs/e/vbOPMUaLnjHUMhGp4yLw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -9455,27 +9210,6 @@ "node": ">= 6" } }, - "node_modules/jsdom/node_modules/ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9993,6 +9727,7 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { @@ -10186,6 +9921,43 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", + "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -10411,6 +10183,7 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { @@ -10512,6 +10285,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/os-locale/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, "node_modules/os-shim": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", @@ -10760,9 +10542,9 @@ } }, "node_modules/pino": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.4.0.tgz", - "integrity": "sha512-R95U66WOb4Ggtb1RPGnC2uvtc8T0i1FSbrKHrAudRtiLDrlNxKjM1MyCJu+V4gL0qdE/7/LoXAmkEY/TlX6ELA==", + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.6.1.tgz", + "integrity": "sha512-fi+V2K98eMZjQ/uEHHSiMALNrz7HaFdKNYuyA3ZUrbH0f1e8sPFDmeRGzg7ZH2q4QDxGnJPOswmqlEaTAZeDPA==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0", @@ -10822,9 +10604,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "dev": true, "funding": [ { @@ -10855,9 +10637,9 @@ } }, "node_modules/pretty-format": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.1.2.tgz", - "integrity": "sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.2.1.tgz", + "integrity": "sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==", "dev": true, "dependencies": { "@jest/schemas": "^29.0.0", @@ -11149,9 +10931,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", "dev": true }, "node_modules/regexp.prototype.flags": { @@ -11439,9 +11221,9 @@ "optional": true }, "node_modules/safe-stable-stringify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", - "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==", "dev": true, "engines": { "node": ">=10" @@ -11671,13 +11453,13 @@ } }, "node_modules/sign-addon": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.0.0.tgz", - "integrity": "sha512-qO3YYs8/kV7SyY8Kqmk1TW30FAVnvxTxUvncnK82H1+k4AkhVw33owReKyzoiHfNpgv1ugmgxA9jEsAIWqVCCg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.1.0.tgz", + "integrity": "sha512-fag/csbsw25WpW+G+uWE6rRImSjlfwQNjuP28fFhvXpfW+kXccxl/o1QEW+hXtTidwpysksb7Y0B8UCeMkYkSA==", "dev": true, "dependencies": { "common-tags": "1.8.2", - "core-js": "3.22.8", + "core-js": "3.25.3", "deepcopy": "2.1.0", "es6-error": "4.1.1", "es6-promisify": "7.0.0", @@ -12064,6 +11846,7 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { @@ -12092,40 +11875,6 @@ "node": ">=4" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -12150,22 +11899,6 @@ "is2": "^2.0.6" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { "version": "5.14.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", @@ -12635,6 +12368,7 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "engines": { @@ -12843,12 +12577,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -12927,14 +12655,14 @@ } }, "node_modules/web-ext": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.2.0.tgz", - "integrity": "sha512-EIrTUpweU1hu+gG2UcwkVKU2BGV6jsZ0+uoUcSdHB/aZPWzQr4dkcH3QHsDGIH/r2J9ESTvsWUHWHLRPeklqBg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.3.1.tgz", + "integrity": "sha512-ZTfktd1zcQpWaFAM3U+IQW674G89d1IW/Oh0Ncw9LwFvKvAcW/nA5EB4pwqB8LiW/6OSYQhHBP4x2XUTBu1SKg==", "dev": true, "dependencies": { - "@babel/runtime": "7.18.9", + "@babel/runtime": "7.19.4", "@devicefarmer/adbkit": "3.2.3", - "addons-linter": "5.14.0", + "addons-linter": "5.18.0", "bunyan": "1.8.15", "camelcase": "7.0.0", "chrome-launcher": "0.15.1", @@ -12945,22 +12673,24 @@ "fs-extra": "10.1.0", "fx-runner": "1.3.0", "import-fresh": "3.3.0", + "jose": "4.10.0", "mkdirp": "1.0.4", "multimatch": "6.0.0", "mz": "2.7.0", + "node-fetch": "3.2.10", "node-notifier": "10.0.1", "open": "8.4.0", "parse-json": "6.0.2", "promise-toolbox": "0.21.0", - "sign-addon": "5.0.0", + "sign-addon": "5.1.0", "source-map-support": "0.5.21", "strip-bom": "5.0.0", "strip-json-comments": "5.0.0", "tmp": "0.2.1", "update-notifier": "6.0.2", "watchpack": "2.4.0", - "ws": "8.8.1", - "yargs": "17.5.1", + "ws": "8.9.0", + "yargs": "17.6.0", "zip-dir": "2.0.0" }, "bin": { @@ -13045,6 +12775,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -13364,6 +13103,7 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { @@ -13380,6 +13120,7 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { @@ -13394,6 +13135,7 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { @@ -13405,6 +13147,7 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, @@ -13426,9 +13169,9 @@ } }, "node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", + "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -13520,12 +13263,12 @@ } }, "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", @@ -13924,9 +13667,9 @@ } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", + "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -14041,9 +13784,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -14072,17 +13815,6 @@ "ms": "2.1.2" } }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, "globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -14120,12 +13852,6 @@ "minimatch": "^3.0.4" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -14158,16 +13884,16 @@ "dev": true }, "@jest/console": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.1.2.tgz", - "integrity": "sha512-ujEBCcYs82BTmRxqfHMQggSlkUZP63AE5YEaTPj7eFyJOzukkTorstOUC7L6nE3w5SYadGVAnTsQ/ZjTGL0qYQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.2.1.tgz", + "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", "slash": "^3.0.0" }, "dependencies": { @@ -14223,37 +13949,37 @@ } }, "@jest/core": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.1.2.tgz", - "integrity": "sha512-sCO2Va1gikvQU2ynDN8V4+6wB7iVrD2CvT0zaRst4rglf56yLly0NQ9nuRRAWFeimRf+tCdFsb1Vk1N9LrrMPA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.2.1.tgz", + "integrity": "sha512-kuLKYqnqgerXkBUwlHVxeSuhSnd+JMnMCLfU98bpacBSfWEJPegytDh3P2m15/JHzet32hGGld4KR4OzMb6/Tg==", "dev": true, "requires": { - "@jest/console": "^29.1.2", - "@jest/reporters": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.2.1", + "@jest/reporters": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.0.0", - "jest-config": "^29.1.2", - "jest-haste-map": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-resolve-dependencies": "^29.1.2", - "jest-runner": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", - "jest-watcher": "^29.1.2", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.2.1", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.1", + "jest-resolve-dependencies": "^29.2.1", + "jest-runner": "^29.2.1", + "jest-runtime": "^29.2.1", + "jest-snapshot": "^29.2.1", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.1", + "jest-watcher": "^29.2.1", "micromatch": "^4.0.4", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -14310,73 +14036,73 @@ } }, "@jest/environment": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.1.2.tgz", - "integrity": "sha512-rG7xZ2UeOfvOVzoLIJ0ZmvPl4tBEQ2n73CZJSlzUjPw4or1oSWC0s0Rk0ZX+pIBJ04aVr6hLWFn1DFtrnf8MhQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.2.1.tgz", + "integrity": "sha512-EutqA7T/X6zFjw6mAWRHND+ZkTPklmIEWCNbmwX6uCmOrFrWaLbDZjA+gePHJx6fFMMRvNfjXcvzXEtz54KPlg==", "dev": true, "requires": { - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/fake-timers": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", - "jest-mock": "^29.1.2" + "jest-mock": "^29.2.1" } }, "@jest/expect": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.1.2.tgz", - "integrity": "sha512-FXw/UmaZsyfRyvZw3M6POgSNqwmuOXJuzdNiMWW9LCYo0GRoRDhg+R5iq5higmRTHQY7hx32+j7WHwinRmoILQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.2.1.tgz", + "integrity": "sha512-o14R2t2tHHHudwji43UKkzmmH49xfF5T++FQBK2tl88qwuBWQOcx7fNUYl+mA/9TPNAN0FkQ3usnpyS8FUwsvQ==", "dev": true, "requires": { - "expect": "^29.1.2", - "jest-snapshot": "^29.1.2" + "expect": "^29.2.1", + "jest-snapshot": "^29.2.1" } }, "@jest/expect-utils": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.1.2.tgz", - "integrity": "sha512-4a48bhKfGj/KAH39u0ppzNTABXQ8QPccWAFUFobWBaEMSMp+sB31Z2fK/l47c4a/Mu1po2ffmfAIPxXbVTXdtg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.2.1.tgz", + "integrity": "sha512-yr4aHNg5Z1CjKby5ozm7sKjgBlCOorlAoFcvrOQ/4rbZRfgZQdnmh7cth192PYIgiPZo2bBXvqdOApnAMWFJZg==", "dev": true, "requires": { - "jest-get-type": "^29.0.0" + "jest-get-type": "^29.2.0" } }, "@jest/fake-timers": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.1.2.tgz", - "integrity": "sha512-GppaEqS+QQYegedxVMpCe2xCXxxeYwQ7RsNx55zc8f+1q1qevkZGKequfTASI7ejmg9WwI+SJCrHe9X11bLL9Q==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.2.1.tgz", + "integrity": "sha512-KWil+8fef7Uj/P/PTZlPKk1Pw117wAmr71VWFV8ZDtRtkwmTG8oY4IRf0Ss44J2y5CYRy8d/zLOhxyoGRENjvA==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@sinonjs/fake-timers": "^9.1.2", "@types/node": "*", - "jest-message-util": "^29.1.2", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2" + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.1", + "jest-util": "^29.2.1" } }, "@jest/globals": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.1.2.tgz", - "integrity": "sha512-uMgfERpJYoQmykAd0ffyMq8wignN4SvLUG6orJQRe9WAlTRc9cdpCaE/29qurXixYJVZWUqIBXhSk8v5xN1V9g==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.2.1.tgz", + "integrity": "sha512-Z4EejYPP1OPVq2abk1+9urAwJqkgw5jB2UJGlPjb5ZwzPQF8WLMcigKEfFzZb2OHhEVPP0RZD0/DbVTY1R6iQA==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/expect": "^29.1.2", - "@jest/types": "^29.1.2", - "jest-mock": "^29.1.2" + "@jest/environment": "^29.2.1", + "@jest/expect": "^29.2.1", + "@jest/types": "^29.2.1", + "jest-mock": "^29.2.1" } }, "@jest/reporters": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.1.2.tgz", - "integrity": "sha512-X4fiwwyxy9mnfpxL0g9DD0KcTmEIqP0jUdnc2cfa9riHy+I6Gwwp5vOZiwyg0vZxfSDxrOlK9S4+340W4d+DAA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.2.1.tgz", + "integrity": "sha512-sCsfUKM/yIF4nNed3e/rIgVIS58EiASGMDEPWqItfLZ9UO1ALW2ASDNJzdWkxEt0T8o2Ztj619G0KKrvK+McAw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", @@ -14389,13 +14115,12 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "dependencies": { @@ -14440,13 +14165,13 @@ "dev": true }, "jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -14483,9 +14208,9 @@ } }, "@jest/source-map": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.0.0.tgz", - "integrity": "sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.15", @@ -14494,46 +14219,46 @@ } }, "@jest/test-result": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.1.2.tgz", - "integrity": "sha512-jjYYjjumCJjH9hHCoMhA8PCl1OxNeGgAoZ7yuGYILRJX9NjgzTN0pCT5qAoYR4jfOP8htIByvAlz9vfNSSBoVg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.2.1.tgz", + "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==", "dev": true, "requires": { - "@jest/console": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.2.1", + "@jest/types": "^29.2.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.1.2.tgz", - "integrity": "sha512-fU6dsUqqm8sA+cd85BmeF7Gu9DsXVWFdGn9taxM6xN1cKdcP/ivSgXh5QucFRFz1oZxKv3/9DYYbq0ULly3P/Q==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.2.1.tgz", + "integrity": "sha512-O/pnk0/xGj3lxPVNwB6HREJ7AYvUdyP2xo/s14/9Dtf091HoOeyIhWLKQE/4HzB8lNQBMo6J5mg0bHz/uCWK7w==", "dev": true, "requires": { - "@jest/test-result": "^29.1.2", + "@jest/test-result": "^29.2.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", + "jest-haste-map": "^29.2.1", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.1.2.tgz", - "integrity": "sha512-2uaUuVHTitmkx1tHF+eBjb4p7UuzBG7SXIaA/hNIkaMP6K+gXYGxP38ZcrofzqN0HeZ7A90oqsOa97WU7WZkSw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.2.1.tgz", + "integrity": "sha512-xup+iEuaIRSQabQaeqxaQyN0vg1Dctrp9oTObQsNf3sZEowTIa5cANYuoyi8Tqhg4GCqEVLTf18KW7ii0UeFVA==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-util": "^29.1.2", + "jest-haste-map": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -14602,9 +14327,9 @@ } }, "@jest/types": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.1.2.tgz", - "integrity": "sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", "dev": true, "requires": { "@jest/schemas": "^29.0.0", @@ -14726,9 +14451,9 @@ } }, "@mdn/browser-compat-data": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.1.8.tgz", - "integrity": "sha512-gHZvccExN0upm9gjJZnmavwQWeFHwxBOxiwiHzYYtsRSlu0xBafz0WFCgRqWmzJh/ABNz87/4nhB7FTaop3r6Q==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.6.tgz", + "integrity": "sha512-KJfP6iTcVX+R5OSC4NOIF4V9fTyifcjwmdkOk7UzsaWxkF21rc6KhGlohqiSRVEynidGO1EEyyYf/PD3jsM1gA==", "dev": true }, "@nodelib/fs.scandir": { @@ -14898,9 +14623,9 @@ } }, "@types/chrome": { - "version": "0.0.197", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.197.tgz", - "integrity": "sha512-m1NfS5bOjaypyqQfaX6CxmJodZVcvj5+Mt/K94EBHkflYjPNmXHAzbxfifdLMa0YM3PDyOxohoTS5ug/e6p5jA==", + "version": "0.0.199", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.199.tgz", + "integrity": "sha512-BDuKiS8iZONsvTFSjbJlmHAwkYpkcWtG7Z7ESDJ/vf0QlcaXX6q4Xzi7euDNjIS4ZMA4kSODPGBHGVdC2lAHzw==", "dev": true, "requires": { "@types/filesystem": "*", @@ -14997,9 +14722,9 @@ } }, "@types/jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.1.2.tgz", - "integrity": "sha512-y+nlX0h87U0R+wsGn6EBuoRWYyv3KFtwRNP3QWp9+k2tJ2/bqcGS3UxD7jgT+tiwJWWq3UsyV4Y+T6rsMT4XMg==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.0.tgz", + "integrity": "sha512-KO7bPV21d65PKwv3LLsD8Jn3E05pjNjRZvkm+YTacWhVmykAb07wW6IkZUmQAltwQafNcDUEUrMO2h3jeBSisg==", "dev": true, "requires": { "expect": "^29.0.0", @@ -15100,14 +14825,20 @@ "dev": true }, "@types/selenium-webdriver": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.5.tgz", - "integrity": "sha512-Lfu97JK5b2jAxCUHH8uMjmhUiQZCGDyVzSAskFFZuWcprtcwjMkEPZE/SiIM5hOGQJVs982BAF26a3kmw8iiJw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.6.tgz", + "integrity": "sha512-qK1UbVws7APzKmL2pP1ypVXCdMrJko32anuz5Fl6qrU/1AWM/mVVY7cOM7FhsOVrIqLXo+YoKJf6+LLNtXgbSw==", "dev": true, "requires": { "@types/ws": "*" } }, + "@types/semver": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", + "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "dev": true + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -15160,14 +14891,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", - "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz", + "integrity": "sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/type-utils": "5.39.0", - "@typescript-eslint/utils": "5.39.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/type-utils": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -15196,14 +14927,14 @@ } }, "@typescript-eslint/parser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", - "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.1.tgz", + "integrity": "sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "debug": "^4.3.4" }, "dependencies": { @@ -15219,23 +14950,23 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", - "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz", + "integrity": "sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/visitor-keys": "5.39.0" + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1" } }, "@typescript-eslint/type-utils": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", - "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz", + "integrity": "sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.39.0", - "@typescript-eslint/utils": "5.39.0", + "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -15252,19 +14983,19 @@ } }, "@typescript-eslint/types": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", - "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.1.tgz", + "integrity": "sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", - "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz", + "integrity": "sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/visitor-keys": "5.39.0", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15293,26 +15024,39 @@ } }, "@typescript-eslint/utils": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", - "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.1.tgz", + "integrity": "sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/typescript-estree": "5.39.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/visitor-keys": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", - "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz", + "integrity": "sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/types": "5.40.1", "eslint-visitor-keys": "^3.3.0" } }, @@ -15542,14 +15286,14 @@ "dev": true }, "addons-linter": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.14.0.tgz", - "integrity": "sha512-50thc5vltnIeRkLCH/PxmnKhWXiguDs7SoPVNDF7YkMp9X58zHBJKKBgroJZaDFwzWOPLdxOM9ClU0JFkLR8WQ==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.18.0.tgz", + "integrity": "sha512-pce7nSuf/fNesDTmiD077auB15gcWZVHSVFmmAU/mm4BpzDPJBYp5rBYVMDaLjTAsYxR6Qq1ICBN8zryso2UxQ==", "dev": true, "requires": { - "@mdn/browser-compat-data": "5.1.8", + "@mdn/browser-compat-data": "5.2.6", "addons-moz-compare": "1.2.0", - "addons-scanner-utils": "7.1.0", + "addons-scanner-utils": "8.1.0", "ajv": "8.11.0", "ajv-merge-patch": "5.0.1", "chalk": "4.1.2", @@ -15557,10 +15301,10 @@ "columnify": "1.6.0", "common-tags": "1.8.2", "deepmerge": "4.2.2", - "eslint": "8.21.0", + "eslint": "8.25.0", "eslint-plugin-no-unsanitized": "4.0.1", "eslint-visitor-keys": "3.3.0", - "espree": "9.3.3", + "espree": "9.4.0", "esprima": "4.0.1", "fluent-syntax": "0.13.0", "glob": "8.0.3", @@ -15568,18 +15312,32 @@ "is-mergeable-object": "1.1.1", "jed": "1.1.1", "os-locale": "5.0.0", - "pino": "8.4.0", - "postcss": "8.4.16", + "pino": "8.6.1", + "postcss": "8.4.18", "relaxed-json": "1.0.3", - "semver": "7.3.7", + "semver": "7.3.8", "sha.js": "2.4.11", "source-map-support": "0.5.21", "tosource": "1.0.0", "upath": "2.0.1", - "yargs": "17.5.1", + "yargs": "17.6.0", "yauzl": "2.10.0" }, "dependencies": { + "addons-scanner-utils": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-8.1.0.tgz", + "integrity": "sha512-wxqnmmrzZXjz4B4GZbFcR4HJxTP+pGu+C6iOjMJdmL6mgZZey/UEVJlU6XTxu8GdGv0bUoJxyIioH8XEDxy91Q==", + "dev": true, + "requires": { + "@types/yauzl": "2.10.0", + "common-tags": "1.8.2", + "first-chunk-stream": "3.0.0", + "strip-bom-stream": "4.0.0", + "upath": "2.0.1", + "yauzl": "2.10.0" + } + }, "ajv": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", @@ -15611,12 +15369,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -15651,133 +15403,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -15791,64 +15416,18 @@ "once": "^1.3.0" } }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, "minimatch": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", @@ -15858,48 +15437,21 @@ "brace-expansion": "^2.0.1" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, + "optional": true, + "peer": true, "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "whatwg-url": "^5.0.0" } }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15914,20 +15466,33 @@ "has-flag": "^4.0.0" } }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } + "optional": true, + "peer": true }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "optional": true, + "peer": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } } } }, @@ -15937,20 +15502,6 @@ "integrity": "sha512-COG8qk2/dubPqabfcoJW4E7pm2EQDI43iMrHnhlobvq/uRMEzx/PYJ1KaUZ97Vgg44R3QdRG5CvDsTRbMUHcDw==", "dev": true }, - "addons-scanner-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-7.1.0.tgz", - "integrity": "sha512-I6uQtJg3sbNtbGOsR2GmTtegCegYTXFRTnnvukEcX0jWidI4enyENyCV1MNkoLSw5xbgKIM/bFuSm4IPFlDYrg==", - "dev": true, - "requires": { - "@types/yauzl": "2.10.0", - "common-tags": "1.8.2", - "first-chunk-stream": "3.0.0", - "strip-bom-stream": "4.0.0", - "upath": "2.0.1", - "yauzl": "2.10.0" - } - }, "adm-zip": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", @@ -16187,15 +15738,15 @@ } }, "babel-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.1.2.tgz", - "integrity": "sha512-IuG+F3HTHryJb7gacC7SQ59A9kO56BctUsT67uJHp1mMCHUOMXpDwOHWGifWqdWVknN2WNkCVQELPjXx0aLJ9Q==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.2.1.tgz", + "integrity": "sha512-gQJwArok0mqoREiCYhXKWOgUhElJj9DpnssW6GL8dG7ARYqHEhrM9fmPHTjdqEGRVXZAd6+imo3/Vwa8TjLcsw==", "dev": true, "requires": { - "@jest/transform": "^29.1.2", + "@jest/transform": "^29.2.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.0.2", + "babel-preset-jest": "^29.2.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -16266,9 +15817,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz", - "integrity": "sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -16298,12 +15849,12 @@ } }, "babel-preset-jest": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz", - "integrity": "sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^29.0.2", + "babel-plugin-jest-hoist": "^29.2.0", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -16735,12 +16286,13 @@ "dev": true }, "cliui": { - "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -17028,9 +16580,9 @@ } }, "core-js": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", - "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.3.tgz", + "integrity": "sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ==", "dev": true }, "core-util-is": { @@ -17140,6 +16692,12 @@ "assert-plus": "^1.0.0" } }, + "data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "dev": true + }, "data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -17232,9 +16790,9 @@ "dev": true }, "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" @@ -17295,9 +16853,9 @@ "dev": true }, "diff-sequences": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz", - "integrity": "sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.2.0.tgz", + "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==", "dev": true }, "dir-glob": { @@ -17568,14 +17126,13 @@ } }, "eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", + "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.2", + "@eslint/eslintrc": "^1.3.3", "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -17672,17 +17229,6 @@ "estraverse": "^5.2.0" } }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -17819,9 +17365,9 @@ "requires": {} }, "eslint-plugin-react": { - "version": "7.31.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", - "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", "dev": true, "requires": { "array-includes": "^3.1.5", @@ -17896,9 +17442,9 @@ "dev": true }, "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -17978,14 +17524,6 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - } } }, "exit": { @@ -17995,16 +17533,16 @@ "dev": true }, "expect": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.1.2.tgz", - "integrity": "sha512-AuAGn1uxva5YBbBlXb+2JPxJRuemZsmlGcapPXWNSBNsQtAULfjioREGBWuI0EOvYUKjDnrCy8PW5Zlr1md5mw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.2.1.tgz", + "integrity": "sha512-BJtA754Fba0YWRWHgjKUMTA3ltWarKgITXHQnbZ2mTxTXC4yMQlR0FI7HkB3fJYkhWBf4qjNiqvg3LDtXCcVRQ==", "dev": true, "requires": { - "@jest/expect-utils": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2" + "@jest/expect-utils": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1" } }, "extend": { @@ -18121,6 +17659,16 @@ "pend": "~1.2.0" } }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, "file-entry-cache": { "version": "6.0.1", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", @@ -18327,6 +17875,15 @@ "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", "dev": true }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "requires": { + "fetch-blob": "^3.1.2" + } + }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -18373,12 +17930,6 @@ "functions-have-names": "^1.2.2" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -18716,9 +18267,9 @@ } }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "iconv-lite": { @@ -19212,21 +18763,21 @@ "dev": true }, "jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.1.2.tgz", - "integrity": "sha512-5wEIPpCezgORnqf+rCaYD1SK+mNN7NsstWzIsuvsnrhR/hSxXWd82oI7DkrbJ+XTD28/eG8SmxdGvukrGGK6Tw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.2.1.tgz", + "integrity": "sha512-K0N+7rx+fv3Us3KhuwRSJt55MMpZPs9Q3WSO/spRZSnsalX8yEYOTQ1PiSN7OvqzoRX4JEUXCbOJRlP4n8m5LA==", "dev": true, "requires": { - "@jest/core": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/core": "^29.2.1", + "@jest/types": "^29.2.1", "import-local": "^3.0.2", - "jest-cli": "^29.1.2" + "jest-cli": "^29.2.1" } }, "jest-changed-files": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.0.0.tgz", - "integrity": "sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", "dev": true, "requires": { "execa": "^5.0.0", @@ -19245,28 +18796,28 @@ } }, "jest-circus": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.1.2.tgz", - "integrity": "sha512-ajQOdxY6mT9GtnfJRZBRYS7toNIJayiiyjDyoZcnvPRUPwJ58JX0ci0PKAKUo2C1RyzlHw0jabjLGKksO42JGA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.2.1.tgz", + "integrity": "sha512-W+ZQQ5ln4Db2UZNM4NJIeasnhCdDhSuYW4eLgNAUi0XiSSpF634Kc5wiPvGiHvTgXMFVn1ZgWIijqhi9+kLNLg==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/expect": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.2.1", + "@jest/expect": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.1.2", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", + "jest-each": "^29.2.1", + "jest-matcher-utils": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-runtime": "^29.2.1", + "jest-snapshot": "^29.2.1", + "jest-util": "^29.2.1", "p-limit": "^3.1.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -19332,21 +18883,21 @@ } }, "jest-cli": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.1.2.tgz", - "integrity": "sha512-vsvBfQ7oS2o4MJdAH+4u9z76Vw5Q8WBQF5MchDbkylNknZdrPTX1Ix7YRJyTlOWqRaS7ue/cEAn+E4V1MWyMzw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.2.1.tgz", + "integrity": "sha512-UIMD5aNqvPKpdlJSaeUAoLfxsh9TZvOkaMETx5qXnkboc317bcbb0eLHbIj8sFBHdcJAIAM+IRKnIU7Wi61MBw==", "dev": true, "requires": { - "@jest/core": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/core": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-config": "^29.2.1", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.1", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -19403,31 +18954,31 @@ } }, "jest-config": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.1.2.tgz", - "integrity": "sha512-EC3Zi86HJUOz+2YWQcJYQXlf0zuBhJoeyxLM6vb6qJsVmpP7KcCP1JnyF0iaqTaXdBP8Rlwsvs7hnKWQWWLwwA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.2.1.tgz", + "integrity": "sha512-EV5F1tQYW/quZV2br2o88hnYEeRzG53Dfi6rSG3TZBuzGQ6luhQBux/RLlU5QrJjCdq3LXxRRM8F1LP6DN1ycA==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.1.2", - "@jest/types": "^29.1.2", - "babel-jest": "^29.1.2", + "@jest/test-sequencer": "^29.2.1", + "@jest/types": "^29.2.1", + "babel-jest": "^29.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.1.2", - "jest-environment-node": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-runner": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-circus": "^29.2.1", + "jest-environment-node": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.1", + "jest-runner": "^29.2.1", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -19484,15 +19035,15 @@ } }, "jest-diff": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.1.2.tgz", - "integrity": "sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.2.1.tgz", + "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^29.0.0", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "diff-sequences": "^29.2.0", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" }, "dependencies": { "ansi-styles": { @@ -19547,25 +19098,25 @@ } }, "jest-docblock": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.0.0.tgz", - "integrity": "sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.1.2.tgz", - "integrity": "sha512-AmTQp9b2etNeEwMyr4jc0Ql/LIX/dhbgP21gHAizya2X6rUspHn2gysMXaj6iwWuOJ2sYRgP8c1P4cXswgvS1A==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.2.1.tgz", + "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "chalk": "^4.0.0", - "jest-get-type": "^29.0.0", - "jest-util": "^29.1.2", - "pretty-format": "^29.1.2" + "jest-get-type": "^29.2.0", + "jest-util": "^29.2.1", + "pretty-format": "^29.2.1" }, "dependencies": { "ansi-styles": { @@ -19620,57 +19171,57 @@ } }, "jest-environment-jsdom": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.1.2.tgz", - "integrity": "sha512-D+XNIKia5+uDjSMwL/G1l6N9MCb7LymKI8FpcLo7kkISjc/Sa9w+dXXEa7u1Wijo3f8sVLqfxdGqYtRhmca+Xw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.2.1.tgz", + "integrity": "sha512-MipBdmrjgzEdQMkK7b7wBShOfv1VqO6FVwa9S43bZwKYLC4dlWnPiCgNpZX3ypNEpJO8EMpMhg4HrUkWUZXGiw==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.2.1", + "@jest/fake-timers": "^29.2.1", + "@jest/types": "^29.2.1", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2", + "jest-mock": "^29.2.1", + "jest-util": "^29.2.1", "jsdom": "^20.0.0" } }, "jest-environment-node": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.1.2.tgz", - "integrity": "sha512-C59yVbdpY8682u6k/lh8SUMDJPbOyCHOTgLVVi1USWFxtNV+J8fyIwzkg+RJIVI30EKhKiAGNxYaFr3z6eyNhQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.2.1.tgz", + "integrity": "sha512-PulFKwEMz6nTAdLUwglFKei3b/LixwlRiqTN6nvPE1JtrLtlnpd6LXnFI1NFHYJGlTmIWilMP2n9jEtPPKX50g==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.2.1", + "@jest/fake-timers": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2" + "jest-mock": "^29.2.1", + "jest-util": "^29.2.1" } }, "jest-get-type": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", - "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", "dev": true }, "jest-haste-map": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.1.2.tgz", - "integrity": "sha512-xSjbY8/BF11Jh3hGSPfYTa/qBFrm3TPM7WU8pU93m2gqzORVLkHFWvuZmFsTEBPRKndfewXhMOuzJNHyJIZGsw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.2.1.tgz", + "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.0.0", - "jest-util": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -19682,13 +19233,13 @@ "dev": true }, "jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } @@ -19705,25 +19256,25 @@ } }, "jest-leak-detector": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.1.2.tgz", - "integrity": "sha512-TG5gAZJpgmZtjb6oWxBLf2N6CfQ73iwCe6cofu/Uqv9iiAm6g502CAnGtxQaTfpHECBdVEMRBhomSXeLnoKjiQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz", + "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==", "dev": true, "requires": { - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" } }, "jest-matcher-utils": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz", - "integrity": "sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.2.1.tgz", + "integrity": "sha512-hUTBh7H/Mnb6GTpihbLh8uF5rjAMdekfW/oZNXUMAXi7bbmym2HiRpzgqf/zzkjgejMrVAkPdVSQj+32enlUww==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.1.2", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" }, "dependencies": { "ansi-styles": { @@ -19778,18 +19329,18 @@ } }, "jest-message-util": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.1.2.tgz", - "integrity": "sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.2.1.tgz", + "integrity": "sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -19846,14 +19397,14 @@ } }, "jest-mock": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.1.2.tgz", - "integrity": "sha512-PFDAdjjWbjPUtQPkQufvniXIS3N9Tv7tbibePEjIIprzjgo0qQlyUiVMrT4vL8FaSJo1QXifQUOuPH3HQC/aMA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.2.1.tgz", + "integrity": "sha512-NDphaY/GqyQpTfnTZiTqqpMaw4Z0I7XnB7yBgrT6IwYrLGxpOhrejYr4ANY4YvO2sEGdd8Tx/6D0+WLQy7/qDA==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/node": "*", - "jest-util": "^29.1.2" + "jest-util": "^29.2.1" } }, "jest-pnp-resolver": { @@ -19864,23 +19415,23 @@ "requires": {} }, "jest-regex-util": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.0.0.tgz", - "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", "dev": true }, "jest-resolve": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.1.2.tgz", - "integrity": "sha512-7fcOr+k7UYSVRJYhSmJHIid3AnDBcLQX3VmT9OSbPWsWz1MfT7bcoerMhADKGvKCoMpOHUQaDHtQoNp/P9JMGg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.2.1.tgz", + "integrity": "sha512-1dJTW76Z9622Viq4yRcwBuEXuzGtE9B2kdl05RC8Om/lAzac9uEgC+M8Q5osVidbuBPmxm8wSrcItYhca2ZAtQ==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", + "jest-haste-map": "^29.2.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" @@ -19938,40 +19489,40 @@ } }, "jest-resolve-dependencies": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.1.2.tgz", - "integrity": "sha512-44yYi+yHqNmH3OoWZvPgmeeiwKxhKV/0CfrzaKLSkZG9gT973PX8i+m8j6pDrTYhhHoiKfF3YUFg/6AeuHw4HQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.1.tgz", + "integrity": "sha512-o3mUGX2j08usj1jIAIE8KmUVpqVAn54k80kI27ldbZf2oJn6eghhB6DvJxjrcH40va9CQgWTfU5f2Ag/MoUqgQ==", "dev": true, "requires": { - "jest-regex-util": "^29.0.0", - "jest-snapshot": "^29.1.2" + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.2.1" } }, "jest-runner": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.1.2.tgz", - "integrity": "sha512-yy3LEWw8KuBCmg7sCGDIqKwJlULBuNIQa2eFSVgVASWdXbMYZ9H/X0tnXt70XFoGf92W2sOQDOIFAA6f2BG04Q==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.2.1.tgz", + "integrity": "sha512-PojFI+uVhQ4u4YZKCN/a3yU0/l/pJJXhq1sW3JpCp8CyvGBYGddRFPKZ1WihApusxqWRTHjBJmGyPWv6Av2lWA==", "dev": true, "requires": { - "@jest/console": "^29.1.2", - "@jest/environment": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.2.1", + "@jest/environment": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.10.2", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.0.0", - "jest-environment-node": "^29.1.2", - "jest-haste-map": "^29.1.2", - "jest-leak-detector": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-resolve": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-util": "^29.1.2", - "jest-watcher": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.2.1", + "jest-haste-map": "^29.2.1", + "jest-leak-detector": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-resolve": "^29.2.1", + "jest-runtime": "^29.2.1", + "jest-util": "^29.2.1", + "jest-watcher": "^29.2.1", + "jest-worker": "^29.2.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -20017,13 +19568,13 @@ "dev": true }, "jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -20070,31 +19621,31 @@ } }, "jest-runtime": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.1.2.tgz", - "integrity": "sha512-jr8VJLIf+cYc+8hbrpt412n5jX3tiXmpPSYTGnwcvNemY+EOuLNiYnHJ3Kp25rkaAcTWOEI4ZdOIQcwYcXIAZw==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.2.1.tgz", + "integrity": "sha512-PSQ880OoIW9y8E6/jjhGn3eQNgNc6ndMzCZaKqy357bv7FqCfSyYepu3yDC6Sp1Vkt+GhP2M/PVgldS2uZSFZg==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/globals": "^29.1.2", - "@jest/source-map": "^29.0.0", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.2.1", + "@jest/fake-timers": "^29.2.1", + "@jest/globals": "^29.2.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-mock": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.1", + "jest-snapshot": "^29.2.1", + "jest-util": "^29.2.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -20151,9 +19702,9 @@ } }, "jest-snapshot": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.1.2.tgz", - "integrity": "sha512-rYFomGpVMdBlfwTYxkUp3sjD6usptvZcONFYNqVlaz4EpHPnDvlWjvmOQ9OCSNKqYZqLM2aS3wq01tWujLg7gg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.2.1.tgz", + "integrity": "sha512-KZdLD7iEz5M4ZYd+ezZ/kk73z+DtNbk/yJ4Qx7408Vb0CCuclJIZPa/HmIwSsCfIlOBNcYTKufr7x/Yv47oYlg==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -20162,23 +19713,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/expect-utils": "^29.2.1", + "@jest/transform": "^29.2.1", + "@jest/types": "^29.2.1", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.1.2", + "expect": "^29.2.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-haste-map": "^29.1.2", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.2.1", + "jest-matcher-utils": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.2.1", "semver": "^7.3.5" }, "dependencies": { @@ -20243,12 +19794,12 @@ } }, "jest-util": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.1.2.tgz", - "integrity": "sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -20308,17 +19859,17 @@ } }, "jest-validate": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.1.2.tgz", - "integrity": "sha512-k71pOslNlV8fVyI+mEySy2pq9KdXdgZtm7NHrBX8LghJayc3wWZH0Yr0mtYNGaCU4F1OLPXRkwZR0dBm/ClshA==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.2.1.tgz", + "integrity": "sha512-DZVX5msG6J6DL5vUUw+++6LEkXUsPwB5R7fsfM7BXdz2Ipr0Ib046ak+8egrwAR++pvSM/5laxLK977ieIGxkQ==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.2.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.0.0", + "jest-get-type": "^29.2.0", "leven": "^3.1.0", - "pretty-format": "^29.1.2" + "pretty-format": "^29.2.1" }, "dependencies": { "ansi-styles": { @@ -20379,18 +19930,18 @@ } }, "jest-watcher": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.1.2.tgz", - "integrity": "sha512-6JUIUKVdAvcxC6bM8/dMgqY2N4lbT+jZVsxh0hCJRbwkIEnbr/aPjMQ28fNDI5lB51Klh00MWZZeVf27KBUj5w==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.2.1.tgz", + "integrity": "sha512-7jFaHUaRq50l4w/f6RuY713bvI5XskMmjWCE54NGYcY74fLkShS8LucXJke1QfGnwDSCoIqGnGGGKPwdaBYz2Q==", "dev": true, "requires": { - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.10.2", - "jest-util": "^29.1.2", + "jest-util": "^29.2.1", "string-length": "^4.0.1" }, "dependencies": { @@ -20471,6 +20022,12 @@ } } }, + "jose": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.10.0.tgz", + "integrity": "sha512-KEhB/eLGLomWGPTb+/RNbYsTjIyx03JmbqAyIyiXBuNSa7CmNrJd5ysFhblayzs/e/vbOPMUaLnjHUMhGp4yLw==", + "dev": true + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -20541,13 +20098,6 @@ "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } - }, - "ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "requires": {} } } }, @@ -20979,6 +20529,7 @@ }, "mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, @@ -21131,6 +20682,23 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", "dev": true }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true + }, + "node-fetch": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", + "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "dev": true, + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -21298,6 +20866,7 @@ }, "onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { @@ -21365,6 +20934,12 @@ "requires": { "pump": "^3.0.0" } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true } } }, @@ -21543,9 +21118,9 @@ "dev": true }, "pino": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.4.0.tgz", - "integrity": "sha512-R95U66WOb4Ggtb1RPGnC2uvtc8T0i1FSbrKHrAudRtiLDrlNxKjM1MyCJu+V4gL0qdE/7/LoXAmkEY/TlX6ELA==", + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.6.1.tgz", + "integrity": "sha512-fi+V2K98eMZjQ/uEHHSiMALNrz7HaFdKNYuyA3ZUrbH0f1e8sPFDmeRGzg7ZH2q4QDxGnJPOswmqlEaTAZeDPA==", "dev": true, "requires": { "atomic-sleep": "^1.0.0", @@ -21598,9 +21173,9 @@ "dev": true }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -21615,9 +21190,9 @@ "dev": true }, "pretty-format": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.1.2.tgz", - "integrity": "sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.2.1.tgz", + "integrity": "sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==", "dev": true, "requires": { "@jest/schemas": "^29.0.0", @@ -21861,9 +21436,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", "dev": true }, "regexp.prototype.flags": { @@ -22074,9 +21649,9 @@ "optional": true }, "safe-stable-stringify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", - "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==", "dev": true }, "safer-buffer": { @@ -22257,13 +21832,13 @@ } }, "sign-addon": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.0.0.tgz", - "integrity": "sha512-qO3YYs8/kV7SyY8Kqmk1TW30FAVnvxTxUvncnK82H1+k4AkhVw33owReKyzoiHfNpgv1ugmgxA9jEsAIWqVCCg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.1.0.tgz", + "integrity": "sha512-fag/csbsw25WpW+G+uWE6rRImSjlfwQNjuP28fFhvXpfW+kXccxl/o1QEW+hXtTidwpysksb7Y0B8UCeMkYkSA==", "dev": true, "requires": { "common-tags": "1.8.2", - "core-js": "3.22.8", + "core-js": "3.25.3", "deepcopy": "2.1.0", "es6-error": "4.1.1", "es6-promisify": "7.0.0", @@ -22567,6 +22142,7 @@ }, "strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, @@ -22583,33 +22159,6 @@ "has-flag": "^3.0.0" } }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -22631,16 +22180,6 @@ "is2": "^2.0.6" } }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, "terser": { "version": "5.14.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", @@ -22953,6 +22492,7 @@ }, "type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, @@ -23094,12 +22634,6 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -23166,14 +22700,14 @@ } }, "web-ext": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.2.0.tgz", - "integrity": "sha512-EIrTUpweU1hu+gG2UcwkVKU2BGV6jsZ0+uoUcSdHB/aZPWzQr4dkcH3QHsDGIH/r2J9ESTvsWUHWHLRPeklqBg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.3.1.tgz", + "integrity": "sha512-ZTfktd1zcQpWaFAM3U+IQW674G89d1IW/Oh0Ncw9LwFvKvAcW/nA5EB4pwqB8LiW/6OSYQhHBP4x2XUTBu1SKg==", "dev": true, "requires": { - "@babel/runtime": "7.18.9", + "@babel/runtime": "7.19.4", "@devicefarmer/adbkit": "3.2.3", - "addons-linter": "5.14.0", + "addons-linter": "5.18.0", "bunyan": "1.8.15", "camelcase": "7.0.0", "chrome-launcher": "0.15.1", @@ -23184,22 +22718,24 @@ "fs-extra": "10.1.0", "fx-runner": "1.3.0", "import-fresh": "3.3.0", + "jose": "4.10.0", "mkdirp": "1.0.4", "multimatch": "6.0.0", "mz": "2.7.0", + "node-fetch": "3.2.10", "node-notifier": "10.0.1", "open": "8.4.0", "parse-json": "6.0.2", "promise-toolbox": "0.21.0", - "sign-addon": "5.0.0", + "sign-addon": "5.1.0", "source-map-support": "0.5.21", "strip-bom": "5.0.0", "strip-json-comments": "5.0.0", "tmp": "0.2.1", "update-notifier": "6.0.2", "watchpack": "2.4.0", - "ws": "8.8.1", - "yargs": "17.5.1", + "ws": "8.9.0", + "yargs": "17.6.0", "zip-dir": "2.0.0" }, "dependencies": { @@ -23246,6 +22782,12 @@ } } }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -23463,6 +23005,7 @@ }, "wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { @@ -23473,6 +23016,7 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { @@ -23481,6 +23025,7 @@ }, "color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { @@ -23489,6 +23034,7 @@ }, "color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } @@ -23512,9 +23058,9 @@ } }, "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", + "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", "dev": true, "requires": {} }, @@ -23571,12 +23117,12 @@ "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", diff --git a/package.json b/package.json index fc1a14f9..824abd6a 100644 --- a/package.json +++ b/package.json @@ -8,23 +8,23 @@ "react-dom": "^18.2.0" }, "devDependencies": { - "@types/chrome": "^0.0.197", + "@types/chrome": "^0.0.199", "@types/firefox-webext-browser": "^94.0.1", - "@types/jest": "^29.1.2", + "@types/jest": "^29.2.0", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", - "@types/selenium-webdriver": "^4.1.5", + "@types/selenium-webdriver": "^4.1.6", "@types/wicg-mediasession": "^1.1.4", - "@typescript-eslint/eslint-plugin": "^5.39.0", - "@typescript-eslint/parser": "^5.39.0", + "@typescript-eslint/eslint-plugin": "^5.40.1", + "@typescript-eslint/parser": "^5.40.1", "chromedriver": "^106.0.1", "concurrently": "^7.4.0", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.24.0", - "eslint-plugin-react": "^7.31.8", + "eslint": "^8.25.0", + "eslint-plugin-react": "^7.31.10", "fork-ts-checker-webpack-plugin": "^7.2.13", - "jest": "^29.1.2", - "jest-environment-jsdom": "^29.1.2", + "jest": "^29.2.1", + "jest-environment-jsdom": "^29.2.1", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selenium-webdriver": "^4.5.0", @@ -33,7 +33,7 @@ "ts-loader": "^9.4.1", "ts-node": "^10.9.1", "typescript": "4.8", - "web-ext": "^7.2.0", + "web-ext": "^7.3.1", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "webpack-merge": "^5.8.0" diff --git a/src/background.ts b/src/background.ts index 9391d610..126b660e 100644 --- a/src/background.ts +++ b/src/background.ts @@ -59,16 +59,16 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) { switch(request.message) { case "openConfig": chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))}); - return; + return true; case "openHelp": chrome.tabs.create({url: chrome.runtime.getURL('help/index.html')}); - return; + return true; case "openUpsell": chrome.tabs.create({url: chrome.runtime.getURL('upsell/index.html')}); - return; + return true; case "openPage": chrome.tabs.create({url: chrome.runtime.getURL(request.url)}); - return; + return true; case "sendRequest": sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => { callback({ @@ -112,6 +112,8 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) { popupPort[sender.tab.id]?.postMessage(request); } return false; + default: + return false; } }); diff --git a/src/components/SkipNoticeComponent.tsx b/src/components/SkipNoticeComponent.tsx index f42c0396..c7a8899b 100644 --- a/src/components/SkipNoticeComponent.tsx +++ b/src/components/SkipNoticeComponent.tsx @@ -373,6 +373,7 @@ class SkipNoticeComponent extends React.Component ); } + return null; } getSubmissionChooser(): JSX.Element[] { diff --git a/src/content.ts b/src/content.ts index e9324ece..7df4dd93 100644 --- a/src/content.ts +++ b/src/content.ts @@ -2093,7 +2093,7 @@ async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): const sponsorIndex = utils.getSponsorIndexFromUUID(sponsorTimes, UUID); // Don't vote for preview sponsors - if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source !== SponsorSourceType.Server) return; + if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source !== SponsorSourceType.Server) Promise.resolve(); // See if the local time saved count and skip count should be saved if (type === 0 && sponsorSkipped[sponsorIndex] || type === 1 && !sponsorSkipped[sponsorIndex]) { diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 34c9a820..3a19d382 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -744,7 +744,7 @@ class PreviewBar { chaptersContainer.style.display = "none"; } - return; + return []; } segments ??= []; diff --git a/src/popup.ts b/src/popup.ts index 400906a0..847a8e81 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -67,9 +67,13 @@ class MessageHandler { // To prevent clickjacking let allowPopup = window === window.top; -window.addEventListener("message", async (e) => { +window.addEventListener("message", async (e): Promise => { if (e.source !== window.parent) return; - if (e.origin.endsWith('.youtube.com')) return allowPopup = true; + if (e.origin.endsWith('.youtube.com')) { + allowPopup = true; + return + } + else return; }); //make this a function to allow this to run on the content page diff --git a/src/utils.ts b/src/utils.ts index 15cfd001..1ee5781d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -319,6 +319,7 @@ export default class Utils { return selection; } } + return { name: "None", option: 0} as CategorySelection; } /** diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 74f0da71..dd44676a 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -148,5 +148,13 @@ export function getGuidelineInfo(category: Category): TextBox[] { icon: "icons/check-smaller.svg", text: chrome.i18n.getMessage(`category_${category}_guideline3`) }]; + default: + return [{ + icon: "icons/segway.png", + text: chrome.i18n.getMessage(`generic_guideline1`) + }, { + icon: "icons/right-arrow.svg", + text: chrome.i18n.getMessage(`generic_guideline2`) + }]; } } \ No newline at end of file diff --git a/src/utils/urlParser.ts b/src/utils/urlParser.ts index 209c7c51..24f444ba 100644 --- a/src/utils/urlParser.ts +++ b/src/utils/urlParser.ts @@ -22,5 +22,7 @@ export function urlTimeToSeconds(time: string): number { return hours * 3600 + minutes * 60 + seconds; } else if (/\d+/.test(time)) { return parseInt(time, 10); + } else { + return 0; } } \ No newline at end of file diff --git a/tsconfig-production.json b/tsconfig-production.json index a2cc4b4b..98b7cbe2 100644 --- a/tsconfig-production.json +++ b/tsconfig-production.json @@ -3,6 +3,8 @@ "module": "commonjs", "target": "es6", "noImplicitAny": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, "sourceMap": false, "outDir": "dist/js", "noEmitOnError": false, diff --git a/tsconfig.json b/tsconfig.json index a2c61955..7f2ac9cf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,8 @@ "module": "commonjs", "target": "es6", "noImplicitAny": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, "sourceMap": true, "outDir": "dist/js", "noEmitOnError": false, From 0610eea53de767c1e719846aa92c3c0898f66717 Mon Sep 17 00:00:00 2001 From: "Michael M. Chang" Date: Fri, 21 Oct 2022 01:01:25 -0400 Subject: [PATCH 012/318] Update src/popup.ts Co-authored-by: Ajay Ramachandran --- src/popup.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/popup.ts b/src/popup.ts index 847a8e81..085c3f82 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -71,9 +71,7 @@ window.addEventListener("message", async (e): Promise => { if (e.source !== window.parent) return; if (e.origin.endsWith('.youtube.com')) { allowPopup = true; - return } - else return; }); //make this a function to allow this to run on the content page From 27bb6045bcbe0ef831d42afdd4d1675de43e5918 Mon Sep 17 00:00:00 2001 From: Michael C Date: Fri, 21 Oct 2022 02:37:48 -0400 Subject: [PATCH 013/318] make tab open listeners non-async --- src/background.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/background.ts b/src/background.ts index 126b660e..975f4482 100644 --- a/src/background.ts +++ b/src/background.ts @@ -59,16 +59,16 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) { switch(request.message) { case "openConfig": chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))}); - return true; + return false; case "openHelp": chrome.tabs.create({url: chrome.runtime.getURL('help/index.html')}); - return true; + return false; case "openUpsell": chrome.tabs.create({url: chrome.runtime.getURL('upsell/index.html')}); - return true; + return false; case "openPage": chrome.tabs.create({url: chrome.runtime.getURL(request.url)}); - return true; + return false; case "sendRequest": sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => { callback({ From 44d4dd54aaeecff1ae31874898b4839cf53735a4 Mon Sep 17 00:00:00 2001 From: Michael C Date: Fri, 21 Oct 2022 02:41:01 -0400 Subject: [PATCH 014/318] return undefined instead of resolving void --- src/content.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content.ts b/src/content.ts index 7df4dd93..7c68fe02 100644 --- a/src/content.ts +++ b/src/content.ts @@ -2089,11 +2089,11 @@ async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNo return response; } -async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): Promise { +async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): Promise { const sponsorIndex = utils.getSponsorIndexFromUUID(sponsorTimes, UUID); // Don't vote for preview sponsors - if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source !== SponsorSourceType.Server) Promise.resolve(); + if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source !== SponsorSourceType.Server) return Promise.resolve(undefined); // See if the local time saved count and skip count should be saved if (type === 0 && sponsorSkipped[sponsorIndex] || type === 1 && !sponsorSkipped[sponsorIndex]) { From 01eeb28b60db9228adda4478ffd2cda2e7a6489a Mon Sep 17 00:00:00 2001 From: Michael C Date: Thu, 27 Oct 2022 03:26:08 -0400 Subject: [PATCH 015/318] bump actions to node 16 --- .github/workflows/ci.yml | 12 ++++---- .github/workflows/release.yml | 30 ++++++++++---------- .github/workflows/tests.yml | 4 +-- .github/workflows/update-oss-attribution.yml | 8 +++--- .github/workflows/updateInvidous.yml | 6 ++-- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bb5b9d0e..f4e5b6a2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,8 +10,8 @@ jobs: steps: # Initialization - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '18' - run: npm ci @@ -25,7 +25,7 @@ jobs: # Create Chrome artifacts - name: Create Chrome artifacts run: npm run build:chrome - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: ChromeExtension path: dist @@ -37,7 +37,7 @@ jobs: # Create Firefox artifacts - name: Create Firefox artifacts run: npm run build:firefox - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtension path: dist @@ -48,7 +48,7 @@ jobs: # Create Beta artifacts (Builds with the name changed to beta) - name: Create Chrome Beta artifacts run: npm run build:chrome -- --env stream=beta - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: ChromeExtensionBeta path: dist @@ -58,7 +58,7 @@ jobs: - name: Create Firefox Beta artifacts run: npm run build:firefox -- --env stream=beta - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtensionBeta path: dist diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 943d54f5..9c8c0953 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,8 +12,8 @@ jobs: steps: # Initialization - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '18' - run: npm ci @@ -23,7 +23,7 @@ jobs: # Create Chrome artifacts - name: Create Chrome artifacts run: npm run build:chrome - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: ChromeExtension path: dist @@ -34,7 +34,7 @@ jobs: # Create Firefox artifacts - name: Create Firefox artifacts run: npm run build:firefox - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtension path: dist @@ -44,7 +44,7 @@ jobs: # Create Beta artifacts (Builds with the name changed to beta) - name: Create Chrome Beta artifacts run: npm run build:chrome -- --env stream=beta - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: ChromeExtensionBeta path: dist @@ -55,7 +55,7 @@ jobs: # Create Safari artifacts - name: Create Safari artifacts run: npm run build:safari - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: SafariExtension path: dist @@ -66,7 +66,7 @@ jobs: run: rm -rf ./dist - name: Create Edge artifacts run: npm run build:edge - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: EdgeExtension path: dist @@ -75,35 +75,35 @@ jobs: # Upload each release asset - name: Upload ChromeExtension to release - uses: Shopify/upload-to-release@master + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 with: args: builds/ChromeExtension.zip name: ChromeExtension.zip path: ./builds/ChromeExtension.zip repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Upload ChromeExtensionBeta to release - uses: Shopify/upload-to-release@master + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 with: args: builds/ChromeExtensionBeta.zip name: ChromeExtensionBeta.zip path: ./builds/ChromeExtensionBeta.zip repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Upload FirefoxExtension to release - uses: Shopify/upload-to-release@master + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 with: args: builds/FirefoxExtension.zip name: FirefoxExtension.zip path: ./builds/FirefoxExtension.zip repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Upload SafariExtension to release - uses: Shopify/upload-to-release@master + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 with: args: builds/SafariExtension.zip name: SafariExtension.zip path: ./builds/SafariExtension.zip repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Upload EdgeExtension to release - uses: Shopify/upload-to-release@master + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 with: args: builds/EdgeExtension.zip name: EdgeExtension.zip @@ -113,7 +113,7 @@ jobs: # Firefox Beta - name: Create Firefox Beta artifacts run: npm run build:firefox -- --env stream=beta - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtensionBeta path: dist @@ -130,13 +130,13 @@ jobs: run: sudo apt-get install rename - name: Rename signed file run: cd ./web-ext-artifacts ; rename 's/.*/FirefoxSignedInstaller.xpi/' * - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtensionSigned.xpi path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi - name: Upload FirefoxSignedInstaller.xpi to release - uses: Shopify/upload-to-release@master + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 with: args: web-ext-artifacts/FirefoxSignedInstaller.xpi name: FirefoxSignedInstaller.xpi diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b14925ec..48c05848 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,8 +9,8 @@ jobs: steps: # Initialization - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '18' - run: npm ci diff --git a/.github/workflows/update-oss-attribution.yml b/.github/workflows/update-oss-attribution.yml index f8f684ba..6e64b859 100644 --- a/.github/workflows/update-oss-attribution.yml +++ b/.github/workflows/update-oss-attribution.yml @@ -12,9 +12,8 @@ jobs: update-oss: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '18' - name: Install and generate attribution @@ -25,7 +24,8 @@ jobs: mv ./oss-attribution/attribution.txt ./public/oss-attribution/attribution.txt - name: Create pull request to update list - uses: peter-evans/create-pull-request@923ad837f191474af6b1721408744feb989a4c27 + uses: peter-evans/create-pull-request@b4d51739f96fca8047ad065eccef63442d8e99f7 + # v4.2.0 with: commit-message: Update OSS Attribution author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> diff --git a/.github/workflows/updateInvidous.yml b/.github/workflows/updateInvidous.yml index ede1b9b0..5c4baa89 100644 --- a/.github/workflows/updateInvidous.yml +++ b/.github/workflows/updateInvidous.yml @@ -8,8 +8,7 @@ jobs: check-list: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Download instance list run: | wget https://api.invidious.io/instances.json -O ci/data.json @@ -19,7 +18,8 @@ jobs: run: npm run ci:invidious - name: Create pull request to update list - uses: peter-evans/create-pull-request@923ad837f191474af6b1721408744feb989a4c27 + uses: peter-evans/create-pull-request@b4d51739f96fca8047ad065eccef63442d8e99f7 + # v4.2.0 with: commit-message: Update Invidious List author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> From fea8a9a37edc67fb770e3533adcbf50155025db3 Mon Sep 17 00:00:00 2001 From: Ajay Date: Thu, 27 Oct 2022 21:39:06 -0400 Subject: [PATCH 016/318] Disable virtual time in firefox again --- src/content.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index e9324ece..d9eb9a8c 100644 --- a/src/content.ts +++ b/src/content.ts @@ -717,7 +717,7 @@ function getVirtualTime(): number { const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime ? (performance.now() - lastKnownVideoTime.preciseTime) * video.playbackRate / 1000 + lastKnownVideoTime.videoTime : null); - if (Config.config.useVirtualTime && !isSafari() && virtualTime + if (Config.config.useVirtualTime && !utils.isFirefox() && !isSafari() && virtualTime && Math.abs(virtualTime - video.currentTime) < 0.6 && video.currentTime !== 0) { return virtualTime; } else { From 715bcb6bd3200dd6dc15fb4763b4e8b4a2b6383f Mon Sep 17 00:00:00 2001 From: Ajay Date: Thu, 27 Oct 2022 21:46:47 -0400 Subject: [PATCH 017/318] Added error when segments haven't loaded and improved popup message Resolves #1553 --- public/_locales/en/messages.json | 6 ++++++ src/content.ts | 9 +++++++++ src/popup.ts | 7 ++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index b3b9e152..7a5dd69b 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "A connection error has occurred. Error code: " }, + "segmentsStillLoading": { + "message": "Segments still loading..." + }, "clearTimes": { "message": "Clear Segments" }, @@ -1243,5 +1246,8 @@ }, "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 recieved them due to issues with the server." } } diff --git a/src/content.ts b/src/content.ts index d9eb9a8c..3bfb66a5 100644 --- a/src/content.ts +++ b/src/content.ts @@ -56,6 +56,7 @@ let sponsorVideoID: VideoID = null; const skipNotices: SkipNotice[] = []; let activeSkipKeybindElement: ToggleSkippable = null; let retryFetchTimeout: NodeJS.Timeout = null; +let shownSegmentFailedToFetchWarning = false; // JSON video info let videoInfo: VideoInfo = null; @@ -344,6 +345,8 @@ function resetValues() { sponsorTimes = []; existingChaptersImported = false; sponsorSkipped = []; + lastResponseStatus = 0; + shownSegmentFailedToFetchWarning = false; sponsorVideoID = null; videoInfo = null; @@ -1922,6 +1925,12 @@ function startOrEndTimingNewSegment() { updateSponsorTimesSubmitting(false); importExistingChapters(false); + + if (lastResponseStatus !== 200 && !shownSegmentFailedToFetchWarning) { + alert(chrome.i18n.getMessage("segmentFetchFailureWarning")); + + shownSegmentFailedToFetchWarning = true; + } } function getIncompleteSegment(): SponsorTime { diff --git a/src/popup.ts b/src/popup.ts index 400906a0..d2e763f4 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -456,7 +456,12 @@ async function runThePopup(messageListener?: MessageListener): Promise { PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404"); PageElements.issueReporterImportExport.classList.remove("hidden"); } else { - PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status; + if (request.status) { + PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status; + } else { + PageElements.videoFound.innerHTML = chrome.i18n.getMessage("segmentsStillLoading"); + } + PageElements.issueReporterImportExport.classList.remove("hidden"); } } From d68c3659be89e40ed116c868317d05eee819828b Mon Sep 17 00:00:00 2001 From: Ajay Date: Thu, 27 Oct 2022 21:47:00 -0400 Subject: [PATCH 018/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 9c6fdf34..a6c2b89a 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.1", + "version": "5.1.2", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From ea73a92fb72973be0a6d4101f229fd75ba6dca34 Mon Sep 17 00:00:00 2001 From: mini-bomba <55105495+mini-bomba@users.noreply.github.com> Date: Sat, 29 Oct 2022 13:18:41 +0200 Subject: [PATCH 019/318] Use publicID instead of privateID for /userInfo calls This should reduce the load on the server a bit, as it will no longer have to compute the publicID for each sponsorblock user. This also reduces the list of actions that leak the privateID to the server. --- src/options.ts | 4 ++-- src/popup.ts | 4 ++-- src/utils/licenseKey.ts | 10 +++++----- src/utils/warnings.ts | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/options.ts b/src/options.ts index 888e7aaf..e963a683 100644 --- a/src/options.ts +++ b/src/options.ts @@ -532,7 +532,7 @@ function activatePrivateTextChange(element: HTMLElement) { case "userID": if (Config.config[option]) { utils.asyncRequestToServer("GET", "/api/userInfo", { - userID: Config.config[option], + publicUserID: utils.getHash(Config.config[option]), values: ["warnings", "banned"] }).then((result) => { const userInfo = JSON.parse(result.responseText); @@ -672,4 +672,4 @@ function copyDebugOutputToClipboard() { function isIncognitoAllowed(): Promise { return new Promise((resolve) => chrome.extension.isAllowedIncognitoAccess(resolve)); -} \ No newline at end of file +} diff --git a/src/popup.ts b/src/popup.ts index d2e763f4..d24721b0 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -281,7 +281,7 @@ async function runThePopup(messageListener?: MessageListener): Promise { if (!Config.config.payments.freeAccess && !noRefreshFetchingChaptersAllowed()) values.push("freeChaptersAccess"); utils.asyncRequestToServer("GET", "/api/userInfo", { - userID: Config.config.userID, + publicUserID: await utils.getHash(Config.config.userID), values }).then((res) => { if (res.status === 200) { @@ -461,7 +461,7 @@ async function runThePopup(messageListener?: MessageListener): Promise { } else { PageElements.videoFound.innerHTML = chrome.i18n.getMessage("segmentsStillLoading"); } - + PageElements.issueReporterImportExport.classList.remove("hidden"); } } diff --git a/src/utils/licenseKey.ts b/src/utils/licenseKey.ts index 7ce41a8a..77eca21d 100644 --- a/src/utils/licenseKey.ts +++ b/src/utils/licenseKey.ts @@ -15,7 +15,7 @@ export async function checkLicenseKey(licenseKey: string): Promise { Config.config.showChapterInfoMessage = false; Config.config.payments.lastCheck = Date.now(); Config.forceSyncUpdate("payments"); - + return true; } } catch (e) { } //eslint-disable-line no-empty @@ -43,7 +43,7 @@ export async function fetchingChaptersAllowed(): Promise { return licensePromise; } } - + if (Config.config.payments.chaptersAllowed) return true; if (Config.config.payments.lastCheck === 0 && Date.now() - Config.config.payments.lastFreeCheck > 2 * 24 * 60 * 60 * 1000) { @@ -53,7 +53,7 @@ export async function fetchingChaptersAllowed(): Promise { // Check for free access if no license key, and it is the first time const result = await utils.asyncRequestToServer("GET", "/api/userInfo", { value: "freeChaptersAccess", - userID: Config.config.userID + publicUserID: await utils.getHash(Config.config.userID) }); try { @@ -66,7 +66,7 @@ export async function fetchingChaptersAllowed(): Promise { Config.config.payments.chaptersAllowed = true; Config.config.showChapterInfoMessage = false; Config.forceSyncUpdate("payments"); - + return true; } } @@ -74,4 +74,4 @@ export async function fetchingChaptersAllowed(): Promise { } return false; -} \ No newline at end of file +} diff --git a/src/utils/warnings.ts b/src/utils/warnings.ts index f2f2657e..17e919ba 100644 --- a/src/utils/warnings.ts +++ b/src/utils/warnings.ts @@ -13,7 +13,7 @@ export interface ChatConfig { export async function openWarningDialog(contentContainer: ContentContainer): Promise { const userInfo = await utils.asyncRequestToServer("GET", "/api/userInfo", { - userID: Config.config.userID, + publicUserID: await utils.getHash(Config.config.userID), values: ["warningReason"] }); @@ -63,4 +63,4 @@ export async function openWarningDialog(contentContainer: ContentContainer): Pro export function openChat(config: ChatConfig): void { window.open("https://chat.sponsor.ajay.app/#" + GenericUtils.objectToURI("", config, false)); -} \ No newline at end of file +} From 8f19d3e83c6eead5179eee699c32f3f57db46324 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 30 Oct 2022 13:23:02 -0400 Subject: [PATCH 020/318] Fix segment failed to fetch warning appearing for 404 --- src/content.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index 3bfb66a5..a1afa590 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1926,7 +1926,7 @@ function startOrEndTimingNewSegment() { importExistingChapters(false); - if (lastResponseStatus !== 200 && !shownSegmentFailedToFetchWarning) { + if (lastResponseStatus !== 200 && lastResponseStatus !== 404 && !shownSegmentFailedToFetchWarning) { alert(chrome.i18n.getMessage("segmentFetchFailureWarning")); shownSegmentFailedToFetchWarning = true; From 71998831eee3eb533834037f824cbcfd79481aa1 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 30 Oct 2022 13:23:12 -0400 Subject: [PATCH 021/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index a6c2b89a..341fdc14 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.2", + "version": "5.1.3", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From ef8c5f58c55ca25f2966cfbe5c73014d4db89964 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 30 Oct 2022 14:49:19 -0400 Subject: [PATCH 022/318] Fix scrubbing bar missing when chapter bar using % widths --- src/js-components/previewBar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 34c9a820..c9ece9e7 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -728,8 +728,8 @@ class PreviewBar { private getPartialChapterSectionStyle(element: HTMLElement, param: string): number { const data = element.style[param]; - if (data?.includes("100%")) { - return 0; + if (data?.includes("%")) { + return this.customChaptersBar.clientWidth * (parseFloat(data.replace("%", "")) / 100); } else { return parseInt(element.style[param].match(/\d+/g)?.[0]) || 0; } From 6db498ccb1a60db0a16c8cf26b92b682bd047755 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 30 Oct 2022 20:36:05 -0400 Subject: [PATCH 023/318] Fix key moments check not working when multiple videos present --- src/utils/pageUtils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index db18aae7..94c58bfc 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -71,7 +71,8 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number): const chapters: SponsorTime[] = []; // .ytp-timed-markers-container indicates that key-moments are present, which should not be divided - if (chaptersBox && !(document.querySelector(".ytp-timed-markers-container")?.childElementCount > 0)) { + if (chaptersBox && !(getControls()?.parentElement?.parentElement + ?.querySelector(".ytp-timed-markers-container")?.childElementCount > 0)) { let lastSegment: SponsorTime = null; const links = chaptersBox.querySelectorAll("ytd-macro-markers-list-item-renderer > a"); for (const link of links) { From b3afd0403e3f3ab83aa6fc01ad71c9d6bfda1161 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 30 Oct 2022 20:38:48 -0400 Subject: [PATCH 024/318] Add configuration for segment failed to fetch warning --- src/config.ts | 2 ++ src/content.ts | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/config.ts b/src/config.ts index 8d5ad5a0..ba3caf85 100644 --- a/src/config.ts +++ b/src/config.ts @@ -68,6 +68,7 @@ interface SBConfig { showCategoryWithoutPermission: boolean; showSegmentNameInChapterBar: boolean; useVirtualTime: boolean; + showSegmentFailedToFetchWarning: boolean; // Used to cache calculated text color info categoryPillColors: { @@ -202,6 +203,7 @@ const Config: SBObject = { showCategoryWithoutPermission: false, showSegmentNameInChapterBar: true, useVirtualTime: true, + showSegmentFailedToFetchWarning: true, categoryPillColors: {}, diff --git a/src/content.ts b/src/content.ts index a1afa590..b74c9d11 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1926,7 +1926,8 @@ function startOrEndTimingNewSegment() { importExistingChapters(false); - if (lastResponseStatus !== 200 && lastResponseStatus !== 404 && !shownSegmentFailedToFetchWarning) { + if (lastResponseStatus !== 200 && lastResponseStatus !== 404 + && !shownSegmentFailedToFetchWarning && Config.config.showSegmentFailedToFetchWarning) { alert(chrome.i18n.getMessage("segmentFetchFailureWarning")); shownSegmentFailedToFetchWarning = true; From 8653059b1395001118fb21b41ef77dea6718f6d6 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sun, 30 Oct 2022 22:00:35 -0400 Subject: [PATCH 025/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 341fdc14..c7a0e5d2 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.3", + "version": "5.1.4", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 95551de09ad95bdfe97c62e3686472b34524c03c Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 1 Nov 2022 14:41:43 -0400 Subject: [PATCH 026/318] Fix precise seeking notice offset with hover preview --- public/content.css | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/public/content.css b/public/content.css index 9f37ab7c..eb72e5cf 100644 --- a/public/content.css +++ b/public/content.css @@ -66,6 +66,11 @@ div:hover > #previewbar.sbNotInvidious { transform: translateY(-1em) !important; } +/* Pull up for precise seeking */ +.ytp-tooltip.sponsorCategoryTooltipVisible .ytp-tooltip-edu { + transform: translateY(-1em) !important; +} + .ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips { transform: translateY(-2em) !important; } @@ -86,6 +91,11 @@ div:hover > #previewbar.sbNotInvidious { 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; } From 2c5db670a4b64a46a50ed065b06bde67b46174cc Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 4 Nov 2022 15:44:14 -0400 Subject: [PATCH 027/318] Safety on getChapterButton Fix #1573 --- src/js-components/previewBar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index c9ece9e7..3eda3b3d 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -740,7 +740,7 @@ class PreviewBar { || ((!segments || segments.length <= 0) && submittingSegments?.length <= 0)) { const chaptersContainer = this.getChaptersContainer(); const chapterButton = this.getChapterButton(chaptersContainer); - if (chapterButton.classList.contains("ytp-chapter-container-disabled")) { + if (chapterButton && chapterButton.classList.contains("ytp-chapter-container-disabled")) { chaptersContainer.style.display = "none"; } @@ -820,7 +820,7 @@ class PreviewBar { private getChapterButton(chaptersContainer: HTMLElement): HTMLButtonElement { return (chaptersContainer ?? this.getChaptersContainer()) - .querySelector("button.ytp-chapter-title") as HTMLButtonElement; + ?.querySelector("button.ytp-chapter-title") as HTMLButtonElement; } remove(): void { From 177583539269ffdc3e4798eb3ba78e61c04dedfb Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 4 Nov 2022 16:05:09 -0400 Subject: [PATCH 028/318] Add hiding skip to highlight Fix #1530 --- src/content.ts | 8 +++++++- src/js-components/skipButtonControlBar.ts | 4 ++++ src/popup.ts | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index 6b87ddd9..8bc1cd2f 100644 --- a/src/content.ts +++ b/src/content.ts @@ -259,6 +259,11 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo utils.getSponsorTimeFromUUID(sponsorTimes, request.UUID).hidden = request.type; utils.addHiddenSegment(sponsorVideoID, request.UUID, request.type); updatePreviewBar(); + + if (skipButtonControlBar?.isEnabled() + && sponsorTimesSubmitting.every((s) => s.hidden !== SponsorHideType.Visible || s.actionType !== ActionType.Poi)) { + skipButtonControlBar.disable(); + } break; case "closePopup": closeInfoMenu(); @@ -1229,7 +1234,8 @@ function startSkipScheduleCheckingForStartSponsors() { // For highlight category const poiSegments = sponsorTimes - .filter((time) => time.segment[1] > video.currentTime && time.actionType === ActionType.Poi) + .filter((time) => time.segment[1] > video.currentTime + && time.actionType === ActionType.Poi && time.hidden === SponsorHideType.Visible) .sort((a, b) => b.segment[0] - a.segment[0]); for (const time of poiSegments) { const skipOption = utils.getCategorySelection(time.category)?.option; diff --git a/src/js-components/skipButtonControlBar.ts b/src/js-components/skipButtonControlBar.ts index 11bbf1ac..7ab86bc9 100644 --- a/src/js-components/skipButtonControlBar.ts +++ b/src/js-components/skipButtonControlBar.ts @@ -142,6 +142,10 @@ export class SkipButtonControlBar { this.enabled = false; } + isEnabled(): boolean { + return this.enabled; + } + toggleSkip(): void { this.skip(this.segment); this.disableText(); diff --git a/src/popup.ts b/src/popup.ts index d24721b0..526b6381 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -698,6 +698,7 @@ async function runThePopup(messageListener?: MessageListener): Promise { voteButtonsContainer.appendChild(downvoteButton); voteButtonsContainer.appendChild(uuidButton); if (downloadedTimes[i].actionType === ActionType.Skip || downloadedTimes[i].actionType === ActionType.Mute + || downloadedTimes[i].actionType === ActionType.Poi && [SponsorHideType.Visible, SponsorHideType.Hidden].includes(downloadedTimes[i].hidden)) { voteButtonsContainer.appendChild(hideButton); } From ff2cec699f82a8a4645eb8522f6b4d0c88649feb Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 4 Nov 2022 16:18:15 -0400 Subject: [PATCH 029/318] adjust skip to highlight button behavior to attempt to fix issues --- src/content.ts | 6 +++--- src/js-components/skipButtonControlBar.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content.ts b/src/content.ts index 8bc1cd2f..35d282c2 100644 --- a/src/content.ts +++ b/src/content.ts @@ -383,12 +383,12 @@ function resetValues() { // Reset advert playing flag isAdPlaying = false; + skipButtonControlBar?.disable(); + categoryPill?.setVisibility(false); + for (let i = 0; i < skipNotices.length; i++) { skipNotices.pop()?.close(); } - - skipButtonControlBar?.disable(); - categoryPill?.setVisibility(false); } async function videoIDChange(id: string): Promise { diff --git a/src/js-components/skipButtonControlBar.ts b/src/js-components/skipButtonControlBar.ts index 7ab86bc9..d78f8a74 100644 --- a/src/js-components/skipButtonControlBar.ts +++ b/src/js-components/skipButtonControlBar.ts @@ -102,6 +102,7 @@ export class SkipButtonControlBar { this.enabled = true; this.refreshText(); + this.container?.classList?.remove("textDisabled"); this.textContainer?.classList?.remove("hidden"); AnimationUtils.disableAutoHideAnimation(this.skipIcon); @@ -134,7 +135,6 @@ export class SkipButtonControlBar { disable(): void { this.container.classList.add("hidden"); - this.textContainer?.classList?.remove("hidden"); this.chapterText?.classList?.remove("hidden"); this.getChapterPrefix()?.classList?.remove("hidden"); From 0e0ae9165e7c825b1b5040895ff2be5b5cec60b2 Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 4 Nov 2022 17:01:23 -0400 Subject: [PATCH 030/318] Fix segments really close to eachother not skipping Also combine segments that are closer than skip buffer Fix #1510 --- src/content.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/content.ts b/src/content.ts index 35d282c2..5fb34c3b 100644 --- a/src/content.ts +++ b/src/content.ts @@ -45,6 +45,8 @@ const utils = new Utils(); // Hack to get the CSS loaded on permission-based sites (Invidious) utils.wait(() => Config.config !== null, 5000, 10).then(addCSS); +const skipBuffer = 0.003; + //was sponsor data found when doing SponsorsLookup let sponsorDataFound = false; //the actual sponsorTimes if loaded and UUIDs associated with them @@ -608,7 +610,6 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: const skipTime: number[] = [currentSkip?.scheduledTime, skipInfo.array[skipInfo.endIndex]?.segment[1]]; const timeUntilSponsor = skipTime?.[0] - currentTime; const videoID = sponsorVideoID; - const skipBuffer = 0.003; if (videoMuted && !inMuteSegment(currentTime, skipInfo.index !== -1 && timeUntilSponsor < skipBuffer && shouldAutoSkip(currentSkip))) { @@ -1532,7 +1533,7 @@ function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideH const currentSegment = sponsorTimes[i].segment; const latestEndTime = sponsorTimes[latestEndTimeIndex].segment[1]; - if (currentSegment[0] <= latestEndTime && currentSegment[1] > latestEndTime + if (currentSegment[0] - skipBuffer <= latestEndTime && currentSegment[1] > latestEndTime && (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible) && shouldAutoSkip(sponsorTimes[i]) && sponsorTimes[i].actionType === ActionType.Skip) { @@ -1573,7 +1574,8 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: // Schedule at the end time to know when to unmute and remove title from seek bar sponsorTimes.forEach(sponsorTime => { - if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime)) { + if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime) + && (minimum === undefined || sponsorTime.segment[1] > minimum)) { possibleTimes.push({ ...sponsorTime, scheduledTime: sponsorTime.segment[1] From 311c4caf2be26f6bd1e92efc89839f8f6f058810 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Fri, 4 Nov 2022 17:02:16 -0400 Subject: [PATCH 031/318] New Crowdin updates (#1544) --- public/_locales/bg/messages.json | 6 + public/_locales/bn/messages.json | 45 ++ public/_locales/cs/messages.json | 6 + public/_locales/da/messages.json | 6 + public/_locales/de/messages.json | 4 +- public/_locales/es/messages.json | 14 +- public/_locales/et/messages.json | 12 + public/_locales/fi/messages.json | 6 + public/_locales/fr/messages.json | 46 ++ public/_locales/hi/messages.json | 119 ++++++ public/_locales/hu/messages.json | 6 + public/_locales/it/messages.json | 98 +++-- public/_locales/ja/messages.json | 3 + public/_locales/ms/messages.json | 714 +++++++++++++++++++++++++++++++ public/_locales/nl/messages.json | 18 + public/_locales/pl/messages.json | 9 + public/_locales/ro/messages.json | 499 ++++++++++++++++++++- public/_locales/ru/messages.json | 6 + public/_locales/sk/messages.json | 6 + public/_locales/sv/messages.json | 6 + public/_locales/uk/messages.json | 157 +++++++ 21 files changed, 1733 insertions(+), 53 deletions(-) diff --git a/public/_locales/bg/messages.json b/public/_locales/bg/messages.json index 00deb453..65bbcec1 100644 --- a/public/_locales/bg/messages.json +++ b/public/_locales/bg/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Възникна грешка с връзката. Код на грешката: " }, + "segmentsStillLoading": { + "message": "Сегментите все още се зареждат..." + }, "clearTimes": { "message": "Изчистване на сегментите" }, @@ -1243,5 +1246,8 @@ }, "exportSegmentsAsURL": { "message": "Споделяне като URL" + }, + "segmentFetchFailureWarning": { + "message": "Внимание: сървърът все още не е отговорил със сегменти. В действителност може да има вече изпратени сегменти в този видеоклип, но просто не сте ги получили поради проблеми със сървъра." } } diff --git a/public/_locales/bn/messages.json b/public/_locales/bn/messages.json index e01ab7e6..ae020f46 100644 --- a/public/_locales/bn/messages.json +++ b/public/_locales/bn/messages.json @@ -35,6 +35,9 @@ "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": "এই জমাটিকে সমর্থন করুন" }, @@ -122,6 +125,9 @@ "closePopup": { "message": "পপআপ বন্ধ করুন" }, + "closeIcon": { + "message": "বন্ধ করার চিহ্ন" + }, "SubmitTimes": { "message": "সেগমেন্ট জমা দিন" }, @@ -414,9 +420,18 @@ "statusReminder": { "message": "সার্ভারের স্ট্যাটাস এর জন্য status.sponsor.ajay.app দেখুন করুন।" }, + "changeUserID": { + "message": "‌আপনার ব্যক্তিগত ব্যবহারকারী আইডি ইম্পোর্ট/এক্সপোর্ট করুন" + }, "whatChangeUserID": { "message": "এটি ব্যক্তিগত রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে ভাগ করা উচিত নয়। কারও যদি এটি থাকে তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে। আপনি যদি আপনার পাবলিক ইউজারআইডি খুঁজছেন তবে পপআপে ক্লিপবোর্ড আইকনটি ক্লিক করুন।" }, + "setUserID": { + "message": "ব্যক্তিগত ব্যবহারকারী আইডি সেট করুন" + }, + "userIDChangeWarning": { + "message": "সতর্কতা: ব্যক্তিগত ব্যবহারকারী আইডি পরিবর্তন চিরস্থায়ী। আপনি কি নিশ্চিত যে আপনি এটি করত এ চান? এক্ষেত্রে আপনার পুরাতন আইডির ব্যাকআপ নিশ্চিত করুন। " + }, "createdBy": { "message": "সৃষ্টি করেছেন" }, @@ -563,12 +578,19 @@ "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": "পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়।" }, + "category_sponsor_guideline1": { + "message": "পেইড প্রচারণা" + }, "category_selfpromo": { "message": "বিনা অর্থপ্রাপ্ত/স্ব-প্রচার" }, @@ -603,6 +625,9 @@ "category_intro_short": { "message": "ইন্টারমিশন" }, + "category_intro_guideline1": { + "message": "মূল কনটেন্ট ব্যতীত ব্যবধান" + }, "category_outro": { "message": "এন্ডকার্ডস/ক্রেডিট" }, @@ -612,6 +637,9 @@ "category_preview": { "message": "প্রিভিউ/রিক্যাপ" }, + "category_preview_guideline2": { + "message": "আগের ভিডিওর রিক্যাপ" + }, "category_filler": { "message": "ফিলার ট্যানজেন্ট/জোকস" }, @@ -633,6 +661,9 @@ "category_poi_highlight_description": { "message": "ভিডিওর অংশটি যা বেশিরভাগ লোকেরা খুঁজছেন। \"ভিডিওটি x এ শুরু হয়\" মন্তব্যের মতো।" }, + "category_chapter": { + "message": "অধ্যায়" + }, "category_livestream_messages": { "message": "লাইভস্ট্রিম: অনুদান/বার্তা পাঠ" }, @@ -663,6 +694,9 @@ "showOverlay_full": { "message": "লেবেল দেখান" }, + "showOverlay_chapter": { + "message": "অধ্যায়গুলো দেখান" + }, "autoSkipOnMusicVideos": { "message": "যখন অ-সংগীত বিভাগ থাকে তখন স্বয়ংক্রিয়ভাবে সমস্ত বিভাগগুলি এড়িয়ে যান" }, @@ -718,6 +752,10 @@ "bracketEnd": { "message": "(শেষ)" }, + "End": { + "message": "সমাপ্ত", + "description": "Button that skips to the end of a segment" + }, "hiddenDueToDownvote": { "message": "লুক্কায়িতঃ ডাউনভোট" }, @@ -755,6 +793,13 @@ "downvoteDescription": { "message": "সময় ভুল দেওয়া হয়েছে" }, + "incorrectVote": { + "message": "সঠিক নয়" + }, + "harmfulVote": { + "message": "ক্ষতিকর", + "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" + }, "incorrectCategory": { "message": "বিভাগ পরিবর্তন করুন" }, diff --git a/public/_locales/cs/messages.json b/public/_locales/cs/messages.json index 94430f0f..c4acb7cc 100644 --- a/public/_locales/cs/messages.json +++ b/public/_locales/cs/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Došlo k chybě připojení. Kód chyby: " }, + "segmentsStillLoading": { + "message": "Segmenty se stále načítají..." + }, "clearTimes": { "message": "Vymazat segmenty" }, @@ -1243,5 +1246,8 @@ }, "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." } } diff --git a/public/_locales/da/messages.json b/public/_locales/da/messages.json index 3a0ef136..5df4d4e4 100644 --- a/public/_locales/da/messages.json +++ b/public/_locales/da/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Der opstod en forbindelsesfejl. Fejlkode: " }, + "segmentsStillLoading": { + "message": "Segmenter indlæses stadig..." + }, "clearTimes": { "message": "Ryd Segmenter" }, @@ -1243,5 +1246,8 @@ }, "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 du har bare ikke modtaget dem på grund af problemer med serveren." } } diff --git a/public/_locales/de/messages.json b/public/_locales/de/messages.json index 304c87a6..7989a78d 100644 --- a/public/_locales/de/messages.json +++ b/public/_locales/de/messages.json @@ -369,7 +369,7 @@ "description": "Example: Sponsor Skipped" }, "muted": { - "message": "{0} stumm geschaltet", + "message": "{0} stummgeschalten", "description": "Example: Sponsor Muted" }, "skipped_to_category": { @@ -1214,7 +1214,7 @@ "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" }, "clearUnsubmittedSegments": { - "message": "Alle Segmente löschen", + "message": "Lösche alle Segmente", "description": "Label for a button in settings" }, "clearUnsubmittedSegmentsConfirm": { diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json index 2bce7601..c19e3f58 100644 --- a/public/_locales/es/messages.json +++ b/public/_locales/es/messages.json @@ -116,6 +116,9 @@ "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" }, @@ -1135,7 +1138,7 @@ "message": "¡Canje exitoso!" }, "redeemFailed": { - "message": "La clave de la licencia no es válida" + "message": "La clave de la licencia es inválida" }, "hideUpsells": { "message": "Ocultar opciones no disponibles sin pago extra" @@ -1153,18 +1156,18 @@ "message": "Seleccione su país" }, "alreadyDonated": { - "message": "Si has donado cualquier cantidad antes del presente, puedes canjear el acceso gratuito vía correo electrónico:", + "message": "Si has donado cualquier cantidad antes de ahora, puedes canjear el acceso gratuito vía correo electrónico:", "description": "After the colon is an email address" }, "cantAfford": { - "message": "Si no puedes permitirte comprar una licencia, haz clic en {here} para ver si eres elegible para un descuento", + "message": "Si no puedes permitirte comprar una licencia, haz clic {aquí} para ver si eres elegible para un descuento", "description": "Keep the curly braces. The word 'here' should be translated as well." }, "patreonSignIn": { "message": "Iniciar sesión con Patreon" }, "redeem": { - "message": "Canje" + "message": "Canjear" }, "joinOnPatreon": { "message": "Danos tu apoyo en Patreon" @@ -1243,5 +1246,8 @@ }, "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." } } diff --git a/public/_locales/et/messages.json b/public/_locales/et/messages.json index ecb8daeb..85087478 100644 --- a/public/_locales/et/messages.json +++ b/public/_locales/et/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Ühendusega esines tõrge. Veakood: " }, + "segmentsStillLoading": { + "message": "Segmendid on veel laadimas..." + }, "clearTimes": { "message": "Tühjenda segmendid" }, @@ -706,6 +709,9 @@ "category_chapter": { "message": "Peatükk" }, + "category_chapter_guideline1": { + "message": "Ära maini sponsorite brändi nimesid" + }, "category_livestream_messages": { "message": "Otseülekanne: annetuste ja sõnumite lugemine" }, @@ -914,6 +920,9 @@ "helpPageReviewOptions": { "message": "Palun vaata allolevad valikud üle" }, + "helpPageFeatureDisclaimer": { + "message": "Paljud funktsioonid on vaikimisi välja lülitatud. Kui sa soovid jätta vahele vaheaejad, kasutada Invidioust jms, lülita need allpool sisse. Sa saad ka peita/kuvada kasutajaliidese elemente." + }, "helpPageHowSkippingWorks": { "message": "Kuidas vahelejätmine töötab" }, @@ -1140,5 +1149,8 @@ }, "exportSegmentsAsURL": { "message": "Jaga URLina" + }, + "segmentFetchFailureWarning": { + "message": "Hoiatus: Server ei ole veel segmentidega vastanud. Sellel videol võivad juba olla saadetud segmendid, aga sa ei ole veel neid serveri vea tõttu saanud." } } diff --git a/public/_locales/fi/messages.json b/public/_locales/fi/messages.json index 2fedec6f..e78b1c8f 100644 --- a/public/_locales/fi/messages.json +++ b/public/_locales/fi/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Yhteysvirhe on tapahtunut. Virhekoodi: " }, + "segmentsStillLoading": { + "message": "Osioita ladataan yhä..." + }, "clearTimes": { "message": "Tyhjennä osiot" }, @@ -1243,5 +1246,8 @@ }, "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." } } diff --git a/public/_locales/fr/messages.json b/public/_locales/fr/messages.json index 67bd3b14..597ec2ac 100644 --- a/public/_locales/fr/messages.json +++ b/public/_locales/fr/messages.json @@ -35,6 +35,9 @@ "message": "Affiche les segments en tant que chapitre", "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 du temps de la vidéo" + }, "upvoteButtonInfo": { "message": "Voter pour cette entrée" }, @@ -113,6 +116,9 @@ "connectionError": { "message": "Erreur de connexion. Code d'erreur : " }, + "segmentsStillLoading": { + "message": "Segments toujours en cours de chargement..." + }, "clearTimes": { "message": "Effacer les segments" }, @@ -122,6 +128,9 @@ "closePopup": { "message": "Fermer le Popup" }, + "closeIcon": { + "message": "Icône \"Fermer\"" + }, "SubmitTimes": { "message": "Soumettre des segments" }, @@ -246,6 +255,12 @@ "whatRefetchWhenNotFound": { "message": "Si la vidéo vient de sortir et qu'aucun segment n'a été encore trouvé, SponsorBlock en cherchera durant la lecture de la vidéo." }, + "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 la notification" }, @@ -408,9 +423,18 @@ "statusReminder": { "message": "Vérifiez status.sponsor.ajay.app pour le status du serveur." }, + "changeUserID": { + "message": "Importer/Exporter Votre ID privé d'utilisateur" + }, "whatChangeUserID": { "message": "Il doit rester privé. 0 l'instar d'un mot de passe, il ne doit être partagé avec personne. Si une autre personne est en possession de cette information, elle peut usurper votre identité SponsorBlock. Si vous cherchez votre UserID public, cliquez sur l'icône du 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" }, @@ -508,6 +532,9 @@ "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" }, @@ -670,6 +697,9 @@ "category_filler": { "message": "Digressions/Blagues" }, + "category_filler_description": { + "message": "Digressions ajoutées uniquement dans un but de remplissage ou de l'humour non requis pour comprendre le sujet principal de la vidéo. Ne dois pas inclure des segments fournissant du contexte ou des détails de fond. Il s'agit d'une catégorie très agressive destinée aux moments qui ne sont pas \"pour le fun\"." + }, "category_filler_short": { "message": "Remplissage" }, @@ -1025,6 +1055,12 @@ "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." }, @@ -1145,10 +1181,17 @@ "chaptersPage1": { "message": "La fonctionnalité participative des chapitres de SponsorBlock n'est disponible que pour les personnes qui achètent une licence, ou pour les personnes qui en ont l'accès gratuitement grâce à leurs contributions passées" }, + "chaptersPage2": { + "message": "Remarque : l'autorisation d'envoyer des chapitres est toujours basée sur la réputation calculée. L'achat d'une licence vous permet uniquement de voir les chapitres envoyés par d'autres", + "description": "On the chapters page for getting access to the paid chapters feature" + }, "chapterNewFeature": { "message": "Nouvelle fonctionnalité : Chapitres personnalisés crowd-sourcés. Ce sont des sections dans les vidéos avec un nom personnalisé qui s'améliore au fur et à mesure. Achetez une licence pour voir les chapitres soumis sur cette vidéo tels que: ", "description": "After the comma, a list of chapters for this video will appear" }, + "chapterNewFeature2": { + "message": "Nouvelle fonctionnalité : Chapitres personnalisés crowd-sourcés. Ce sont des sections dans les vidéos avec un nom personnalisé qui peuvent s'additionner pour être de plus en plus précis. Vous y avez accès gratuitement, activez la dans les options." + }, "unsubmittedSegmentCounts": { "message": "Vous avez actuellement {0} sur {1}", "description": "Example: You currently have 12 unsubmitted segments on 5 videos" @@ -1203,5 +1246,8 @@ }, "exportSegmentsAsURL": { "message": "Partager un URL" + }, + "segmentFetchFailureWarning": { + "message": "Attention : Le serveur n'a pas encore répondu avec les segments. Il se peut qu'il y ait des segments sur cette vidéo déjà soumise, mais vous ne les avez tout simplement pas reçus en raison de problèmes avec le serveur." } } diff --git a/public/_locales/hi/messages.json b/public/_locales/hi/messages.json index e20c3da1..5cc21b72 100644 --- a/public/_locales/hi/messages.json +++ b/public/_locales/hi/messages.json @@ -25,24 +25,143 @@ "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": "आइकॉन बंद करें" + }, + "SubmitTimes": { + "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": "विकल्प" } diff --git a/public/_locales/hu/messages.json b/public/_locales/hu/messages.json index b0500d2d..f3f75c5a 100644 --- a/public/_locales/hu/messages.json +++ b/public/_locales/hu/messages.json @@ -116,6 +116,9 @@ "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" }, @@ -1243,5 +1246,8 @@ }, "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." } } diff --git a/public/_locales/it/messages.json b/public/_locales/it/messages.json index f9327a76..4f5bab4a 100644 --- a/public/_locales/it/messages.json +++ b/public/_locales/it/messages.json @@ -36,7 +36,7 @@ "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 Affianco al Tempo del Video" + "message": "Mostra il Segmento Corrente Affianco alla Durata del Video" }, "upvoteButtonInfo": { "message": "Vota questo contributo" @@ -116,6 +116,9 @@ "connectionError": { "message": "Si è verificato un errore durante la connessione. Codice errore: " }, + "segmentsStillLoading": { + "message": "Segmenti in caricamento..." + }, "clearTimes": { "message": "Rimuovi i segmenti" }, @@ -132,7 +135,7 @@ "message": "Invia i segmenti" }, "sortSegments": { - "message": "Ordina segmenti" + "message": "Ordina Segmenti" }, "submitCheck": { "message": "Sei sicuro di volerlo inviare?" @@ -235,7 +238,7 @@ "message": "Memorizza i voti negativi del segmento" }, "whatTrackDownvotes": { - "message": "Segmenti votati negativamente rimarranno nascosti anche dopo aver ricaricato la pagina" + "message": "I segmenti votati negativamente rimarranno nascosti anche dopo aver ricaricato la pagina" }, "trackDownvotesWarning": { "message": "Attenzione: Disabilitarlo eliminerà tutti i voti negativi precedentemente memorizzati" @@ -256,7 +259,7 @@ "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 di reputazione minimi" + "message": "Alcune categorie richiedono l'autorizzazione all'invio a causa dei requisiti sulla reputazione minima" }, "showNotice": { "message": "Mostra di nuovo l'avviso" @@ -307,11 +310,11 @@ "description": "Keybind label" }, "setStartSponsorShortcut": { - "message": "Inizia/Finisci segmento", + "message": "Inizio/Fine segmento", "description": "Keybind label" }, "setSubmitKeybind": { - "message": "Invia i segmenti", + "message": "Invia segmenti", "description": "Keybind label" }, "nextChapterKeybind": { @@ -323,7 +326,7 @@ "description": "Keybind label" }, "keybindDescription": { - "message": "Seleziona un tasto digitandolo e scegli qualsiasi tasto modificatore che desideri utilizzare." + "message": "Seleziona un tasto digitandolo e spunta qualsiasi tasto modificatore che desideri utilizzare." }, "0": { "message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù." @@ -479,7 +482,7 @@ "message": "Usa il salto manuale quando esiste un'etichetta del video completo" }, "whatManualSkipOnFullVideo": { - "message": "Per le persone che vogliono guardare il video senza interruzioni se contiene sponsorizzazioni o auto-promozioni." + "message": "Per le persone che vogliono guardare il video senza interruzioni se contiene sponsorizzazioni o autopromozioni." }, "skipNoticeDuration": { "message": "Salta durata avviso (secondi):" @@ -578,7 +581,7 @@ "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 ad un'altra azione. Selezionane una diversa." + "message": "Questa scorciatoia è associata a un'altra azione. Selezionane una diversa." }, "to": { "message": "a", @@ -592,7 +595,7 @@ "message": "Includi transizioni" }, "generic_guideline2": { - "message": "Riproduci come se nulla fosse stato saltato" + "message": "Riprodotto come se non ci fossero salti" }, "category_sponsor": { "message": "Sponsorizzazione" @@ -613,22 +616,22 @@ "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 merce personalizzata" + "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 progettati da aziende e merce" + "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 posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato." + "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 posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato", + "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": { @@ -641,13 +644,13 @@ "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 promemoria per mi piace, iscrizioni o follow" + "message": "Brevi inviti a mettere mi piace, follow o iscriversi" }, "category_interaction_guideline2": { - "message": "Include promemoria indiretti al commento" + "message": "Include inviti indiretti a commentare" }, "category_interaction_guideline3": { - "message": "Non per promozione generale, solo chiamata all'azione" + "message": "Non per promozione generale, solo inviti all'interazione" }, "category_interaction_short": { "message": "Promemoria d'Interazione" @@ -662,7 +665,7 @@ "message": "Intermezzo" }, "category_intro_guideline1": { - "message": "Intervallo senza contenuto effettivo" + "message": "Sezione senza contenuto effettivo" }, "category_intro_guideline2": { "message": "Non per transizioni con informazioni" @@ -680,13 +683,13 @@ "message": "Anteprima/Riepilogo" }, "category_preview_description": { - "message": "Raccolta di clip che mostra cosa succederà in questo video o altri video in una serie, in cui tutte le informazioni sono ripetute in seguito nel video." + "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 più tardi in questo video, oppure in un video futuro" + "message": "Clip che appaiono in seguito in questo video, oppure in un video futuro" }, "category_preview_guideline2": { - "message": "Riepilogo o riassunto di un video precedente" + "message": "Riepilogo di un video precedente" }, "category_preview_guideline3": { "message": "Non per sezioni che aggiungono contenuti in più" @@ -695,16 +698,16 @@ "message": "Riempitivi irrilevanti/Battute" }, "category_filler_description": { - "message": "Scene tangenziali aggiunte solo come riempimento o per umorismo, non necessarie alla comprensione del contenuto principale del video. Questo non dovrebbe includere i segmenti che forniscono contesto o dettagli di background. Questa è una categoria molto aggressiva, pensata per quanto non hai voglia di \"divertirti\"." + "message": "Scene tangenziali aggiunte solo come riempimento o per umorismo, non necessarie alla comprensione del contenuto principale del video. Non dovrebbe includere i segmenti che forniscono contesto o dettagli di background. Questa è una categoria molto aggressiva, pensata per quanto non si è in un mood \"divertente\"." }, "category_filler_short": { "message": "Filler" }, "category_filler_guideline1": { - "message": "Scene non correlate usate solo per filler o umorismo" + "message": "Scene non correlate usate solo come filler o umorismo" }, "category_filler_guideline2": { - "message": "Distrazioni, blooper, replay" + "message": "Distrazioni, bloopers, replay" }, "category_filler_guideline3": { "message": "Non per scene necessarie a capire l'argomento" @@ -737,7 +740,7 @@ "message": "Può ignorare il contesto" }, "category_poi_highlight_guideline3": { - "message": "Può portare al titolo o alla miniatura del video" + "message": "Può saltare al contenuto del titolo o dell'anteprima" }, "category_chapter": { "message": "Capitolo" @@ -752,7 +755,7 @@ "message": "Usa capitoli più grandi per le sezioni generali" }, "category_chapter_guideline3": { - "message": "I capitoli più piccoli possono essere collocati all'interno di quelli più grandi" + "message": "Dei capitoli più piccoli possono essere collocati all'interno di quelli più grandi" }, "category_livestream_messages": { "message": "Livestream: Donazione/Letture dei Messaggi" @@ -794,7 +797,7 @@ "message": "Silenzia i segmenti invece di saltarli, quando possibile" }, "fullVideoSegments": { - "message": "Mostra un'icona quando un video è interamente una pubblicità", + "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" }, "previewColor": { @@ -853,7 +856,7 @@ "message": "nascosto: troppo corto" }, "manuallyHidden": { - "message": "nascosta manualmente" + "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.", @@ -878,7 +881,7 @@ "message": "Forza controllo canale prima di andare avanti" }, "whatForceChannelCheck": { - "message": "Di default, verranno saltati i segmenti subito, anche prima che si sappia il canale. Di default, alcuni segmenti all'inizio del video potrebbero essere saltati sui canali nella 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 se si dispone di una connessione internet veloce." + "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\"" @@ -887,10 +890,10 @@ "message": "Tempo Non Corretto/Errato" }, "incorrectVote": { - "message": "Non corretto" + "message": "Errato" }, "harmfulVote": { - "message": "Dannoso", + "message": "Offensivo", "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" }, "incorrectCategory": { @@ -923,10 +926,10 @@ "description": "Used as the button to dismiss a tooltip" }, "fullVideoTooltipWarning": { - "message": "Questo segmento è grande. Se l'intero video è su un argomento, passa da \"Salta\" a \"Video Completo\". Vedi le linee guida per ulteriori informazioni." + "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 come questa categoria ed è troppo integrato per poterlo separarare" + "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." @@ -939,10 +942,10 @@ "message": "Nascondi per sempre" }, "warningChatInfo": { - "message": "Abbiamo notato che stavi facendo alcuni errori comuni che non sono dannosi" + "message": "Abbiamo notato che stavi facendo alcuni errori comuni che non sono intenzionali" }, "warningTitle": { - "message": "Hai ricevuto un avviso" + "message": "Hai ricevuto un avvertimento" }, "questionButton": { "message": "Ho una domanda" @@ -957,7 +960,7 @@ "message": "Dona" }, "considerDonating": { - "message": "Contribuisci allo sviluppo del fondo" + "message": "Aiuta a finanziare lo sviluppo" }, "hideDonationLink": { "message": "Nascondi Link di Donazione" @@ -1093,7 +1096,7 @@ "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": "Salta l'aspetto del preavviso", + "message": "Aspetto dell'avviso di skip", "description": "Option label" }, "unbind": { @@ -1119,13 +1122,13 @@ "message": "Ripristina le impostazioni predefinite" }, "confirmResetToDefault": { - "message": "Sei sicuro di voler reimpostare tutte le impostazioni ai valori predefiniti? Questo non può essere annullato." + "message": "Sei sicuro di voler reimpostare tutte le impostazioni ai valori predefiniti? Questa azione è irreversibile." }, "exportSegments": { "message": "Esporta segmenti" }, "importSegments": { - "message": "Importa i segmenti" + "message": "Importa segmenti" }, "Import": { "message": "Importa", @@ -1144,7 +1147,7 @@ "message": "Scegli un paese" }, "noDiscount": { - "message": "Non ti qualifichi per uno sconto" + "message": "Non hai diritto a uno sconto" }, "discountLink": { "message": "Link Sconto (Vedi il prezzo rosa)" @@ -1153,11 +1156,11 @@ "message": "Seleziona il tuo paese" }, "alreadyDonated": { - "message": "Se hai donato qualsiasi importo prima di ora, puoi riscattare l'accesso gratuito contattando:", + "message": "Se hai donato qualsiasi importo in passato, puoi riscattare l'accesso gratuito mandando una mail a:", "description": "After the colon is an email address" }, "cantAfford": { - "message": "Se non puoi permetterti di acquistare una licenza, premi {here} per vedere se hai diritto a uno sconto", + "message": "Se non puoi permetterti di acquistare una licenza, premi {here} per verificare se hai diritto a uno sconto", "description": "Keep the curly braces. The word 'here' should be translated as well." }, "patreonSignIn": { @@ -1176,18 +1179,18 @@ "message": "Inserisci chiave di licenza" }, "chaptersPage1": { - "message": "La funzionalità dei capitoli in crowd-sourcing di SponsorBlock è disponibile soltanto a coloro che acquistano una licenza o a coloro aventi l'accesso garantito gratuitamente grazie ai loro contributi passati" + "message": "La funzionalità dei capitoli in crowd-sourcing di SponsorBlock è disponibile soltanto a chi acquista una licenza o a chi viene premiato con l'accesso gratuito grazie ai contributi passati" }, "chaptersPage2": { "message": "Nota: L'autorizzazione a inviare i capitoli si basa ancora sulla reputazione calcolata. Acquistare una licenza ti consente di visualizzare soltanto i capitoli inviati dagli altri", "description": "On the chapters page for getting access to the paid chapters feature" }, "chapterNewFeature": { - "message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato nei video, che possono esser impilate per essere sempre più precise. Acquista una licenza per visualizzare i capitoli inviati in questo video come: ", + "message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato che possono esser sovrapposte per essere sempre più precise. Acquista una licenza per visualizzare i capitoli inviati in questo video come ad esempio: ", "description": "After the comma, a list of chapters for this video will appear" }, "chapterNewFeature2": { - "message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato nei video, che possono esser impilate per essere sempre più precise. Hai accesso gratuitamente, abilitalo nelle opzioni." + "message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato, che possono esser sovrapposte per essere sempre più precise. Hai accesso gratuitamente, abilitalo nelle opzioni." }, "unsubmittedSegmentCounts": { "message": "Al momento hai {0} su {1}", @@ -1214,7 +1217,7 @@ "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" }, "clearUnsubmittedSegments": { - "message": "Elimina tutti i segmenti", + "message": "Cancella tutti i segmenti", "description": "Label for a button in settings" }, "clearUnsubmittedSegmentsConfirm": { @@ -1243,5 +1246,8 @@ }, "exportSegmentsAsURL": { "message": "Condividi URL" + }, + "segmentFetchFailureWarning": { + "message": "Attenzione: il server non ha ancora fornito i segmenti. Questo video potrebbe avere dei segmenti inviati, ma forse non sono stati ricevuti a causa di problemi del server." } } diff --git a/public/_locales/ja/messages.json b/public/_locales/ja/messages.json index e77ae3e2..b05cc435 100644 --- a/public/_locales/ja/messages.json +++ b/public/_locales/ja/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "接続エラーが発生しました。 エラーコード: " }, + "segmentsStillLoading": { + "message": "セグメントがまだ読み込み中です..." + }, "clearTimes": { "message": "セグメントを消去" }, diff --git a/public/_locales/ms/messages.json b/public/_locales/ms/messages.json index 2eec3b1f..0416c0f6 100644 --- a/public/_locales/ms/messages.json +++ b/public/_locales/ms/messages.json @@ -25,6 +25,19 @@ "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" }, @@ -52,6 +65,9 @@ "reskip": { "message": "Reskip" }, + "unmute": { + "message": "Nyahredam" + }, "paused": { "message": "Dijeda" }, @@ -79,9 +95,15 @@ "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!" }, @@ -94,6 +116,9 @@ "connectionError": { "message": "Ralat sambungan telah berlaku. Kod salah: " }, + "segmentsStillLoading": { + "message": "Segmen masih dimuatkan..." + }, "clearTimes": { "message": "Kosongkan Segmen" }, @@ -103,9 +128,15 @@ "closePopup": { "message": "Tutup Pop timbul" }, + "closeIcon": { + "message": "Tutup Ikon" + }, "SubmitTimes": { "message": "Hantar Segmen" }, + "sortSegments": { + "message": "Susun Segmen" + }, "submitCheck": { "message": "Adakah anda pasti mahu menghantarnya?" }, @@ -152,6 +183,12 @@ "setUsername": { "message": "Tetapkan Nama Pengguna" }, + "copyPublicID": { + "message": "Salin PenggunaID Awam" + }, + "copySegmentID": { + "message": "Salin ID Segmen" + }, "discordAdvert": { "message": "Mari sertai pelayan perselisihan rasmi untuk memberi cadangan dan maklum balas!" }, @@ -170,12 +207,18 @@ "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" }, "hideInfoButton": { "message": "Sembunyikan Butang Maklumat Pada Pemain YouTube" }, + "autoHideInfoButton": { + "message": "Auto-sembunyikan Butang Maklumat" + }, "hideDeleteButton": { "message": "Sembunyikan Butang Padam Pada Pemain YouTube" }, @@ -188,6 +231,18 @@ "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" }, @@ -200,12 +255,36 @@ "whatRefetchWhenNotFound": { "message": "Sekiranya videonya baru, dan tidak ada segmen yang dijumpai, video akan terus diambil setiap beberapa minit semasa anda menonton." }, + "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." @@ -226,6 +305,29 @@ "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." + }, "0": { "message": "Masa sambungan telah tamat. Periksa sambungan internet anda. Sekiranya internet anda berfungsi, pelayan mungkin berlebihan atau tidak berfungsi." }, @@ -248,9 +350,35 @@ "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" }, @@ -295,12 +423,40 @@ "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" + }, + "supportOtherSitesDescription": { + "message": "Sokong klien pihak ketiga YouTube. Untuk membolehkan sokong, anda perlu menerima kebenaran tambahan. Ini TIDAK berfungsi dalam inkognito pada Chrome dan varian Chromium lain.", + "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" + }, + "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" }, @@ -322,9 +478,24 @@ "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" }, @@ -352,6 +523,18 @@ "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" }, @@ -376,6 +559,9 @@ "preview": { "message": "Pratonton" }, + "unsubmitted": { + "message": "Belum Diserahkan" + }, "inspect": { "message": "Periksa" }, @@ -394,28 +580,78 @@ "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" }, @@ -428,12 +664,54 @@ "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": { + "message": "Pratonton/Imbas Kembali" + }, + "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": { + "message": "Tangen Pengisi/Lawak" + }, + "category_filler_description": { + "message": "Adegan tangensial ditambah hanya untuk pengisi atau jenaka yang tidak diperlukan untuk memahami kandungan utama daripada video tersebut. Ini tidak patutnya termasuk segmen yang menyediakan konteks atau butiran latar belakang. Ini kategori yang sangat aggresif dimaksudkan apabila kamu tiada mood untuk \"seronok\"." + }, + "category_filler_short": { + "message": "Pengisi" + }, + "category_filler_guideline1": { + "message": "Adegan tangensial hanya untuk pengisi atau humor" + }, + "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" }, @@ -443,6 +721,42 @@ "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" }, @@ -461,6 +775,35 @@ "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" }, @@ -493,18 +836,47 @@ "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" }, @@ -517,6 +889,16 @@ "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." }, @@ -535,5 +917,337 @@ }, "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" + }, + "warningChatInfo": { + "message": "Kami perasaan yang anda telah membuat beberapa kesilapan biasa yang tidak berniat jahat" + }, + "warningTitle": { + "message": "Anda mendapat amaran" + }, + "questionButton": { + "message": "Saya ada 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." + }, + "helpPageHowSkippingWorks": { + "message": "Bagaimana melangkau berfungsi" + }, + "helpPageHowSkippingWorks1": { + "message": "Segmen video akan dilangkau secara automatik jika mereka dijumpa di dalam pangkalan data. Anda boleh membuka pop timbul dengan menekan ikon sambungan untuk mendapat pratonton daripada apa yang mereka ada." + }, + "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" + }, + "helpPageSubmitting1": { + "message": "Menghantar boleh dilakukan sama ada di dalam pop timbul dengan menekan butang \"Segmen Bermula Sekarang\" atau di dalam pemain video dengan menggunakan butang di pemain." + }, + "helpPageSubmitting2": { + "message": "Menekan butang main menunjukkan permulaan segmen dan menekan ikon berhenti menunjukkan tamat. Anda boleh sediakan berbilang sponsor sebelum menekan hantar. Menekan butang muat turun akan hantar. Menekan tong sampah akan padam." + }, + "Editing": { + "message": "Menyunting" + }, + "helpPageEditing1": { + "message": "Jika anda tersilap, anda boleh sunting atau padam segmen anda selepas menekan butang anak panah atas." + }, + "helpPageTooSlow": { + "message": "Ini terlalu lambat" + }, + "helpPageTooSlow1": { + "message": "Terdapat kekunci panas jika anda ingin menggunakannya. Tekan kekunci koma bertitik untuk menunjukkan mula/akhir daripada sesuatu segmen penaja. Ini boleh diubah di dalam pilihan. Jika anda tidak menggunakan QWERTY, anda mungkin patut ubah ikatan kekunci." + }, + "helpPageCopyOfDatabase": { + "message": "Bolehkah saya mendapat salinan pangkalan data? Apakah akan terjadi jika anda hilang?" + }, + "helpPageCopyOfDatabase1": { + "message": "Pangkalan data ialah awam dan boleh didapati di" + }, + "helpPageCopyOfDatabase2": { + "message": "Kod sumber tersedia secara percuma. Jadi, walaupun sesuatu berlaku pada saya, penghantaran anda tidak hilang." + }, + "helpPageNews": { + "message": "Berita dan bagaimana ia dibuat" + }, + "helpPageSourceCode": { + "message": "Dimana saya boleh mendapat kod sumber?" + }, + "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" + }, + "chooseACountry": { + "message": "Pilih negara" + }, + "noDiscount": { + "message": "Anda tidak layak untuk diskaun" + }, + "discountLink": { + "message": "Pautan Diskaun (Lihat harga pink)" + }, + "selectYourCountry": { + "message": "Pilih negara anda" + }, + "alreadyDonated": { + "message": "Jika anda telah menderma apa-apa jumlah sebelum ini, anda boleh tebus akses percuma dengan menghantar emel:", + "description": "After the colon is an email address" + }, + "cantAfford": { + "message": "Jika anda tidak mampu untuk membeli lesen, tekan {sini} untuk melihat sama ada anda layak untuk diskaun", + "description": "Keep the curly braces. The word 'here' should be translated as well." + }, + "patreonSignIn": { + "message": "Daftar masuk dengan Patreon" + }, + "redeem": { + "message": "Tebus" + }, + "joinOnPatreon": { + "message": "Langgan di Patreon" + }, + "oneTimePurchase": { + "message": "Pembelian Sekali" + }, + "enterLicenseKey": { + "message": "Masukkan Kunci Lesen" + }, + "chaptersPage1": { + "message": "Fitur kandungan sumber awam SponsorBlock hanya tersedia untuk orang yang membeli lesen atau untuk orang yang diberikan akses secara percuma kerana sumbangan lepas" + }, + "chaptersPage2": { + "message": "Nota: Kebenaran untuk hantar kandungan masih berdasarkan oleh reputasi yang dikira. Membeli lesen hanya membenarkan anda untuk melihat kandungan yang dihantar oleh orang lain", + "description": "On the chapters page for getting access to the paid chapters feature" + }, + "chapterNewFeature": { + "message": "Fitur Baharu: Kandungan sumber awam tersuai. Ini adalah bahagian dinamakan tersuai dalam video yang boleh bertindan untuk mendapatkan lebih dan lebih tepat. Beli lesen untuk melihat kandungan dihantar pada video seperti ini: ", + "description": "After the comma, a list of chapters for this video will appear" + }, + "chapterNewFeature2": { + "message": "Fitur Baharu: Kandungan sumber awam tersuai. Ini adalah bahagian dinamakan tersuai dalam video yang boleh bertindan untuk mendapatkan lebih dan lebih tepat. Anda mempunyai akses secara percuma, membolehkannya di pilihan." + }, + "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" + }, + "segmentFetchFailureWarning": { + "message": "Amaran: Pelayan belum membalas dengan segmen lagi. Mungkin sebenarnya ada segmen di video ini sudah dihantar tetapi anda hanya belum menerimanya kerana isu dengan pelayan." } } diff --git a/public/_locales/nl/messages.json b/public/_locales/nl/messages.json index 79723454..5321e208 100644 --- a/public/_locales/nl/messages.json +++ b/public/_locales/nl/messages.json @@ -35,6 +35,9 @@ "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" + }, "upvoteButtonInfo": { "message": "Stemmen op deze inzending" }, @@ -113,6 +116,9 @@ "connectionError": { "message": "Er is een verbindingsfout opgetreden. Foutcode: " }, + "segmentsStillLoading": { + "message": "Segmenten worden nog steeds geladen..." + }, "clearTimes": { "message": "Segmenten verwijderen" }, @@ -122,6 +128,9 @@ "closePopup": { "message": "Pop-up sluiten" }, + "closeIcon": { + "message": "Pictogram voor sluiten" + }, "SubmitTimes": { "message": "Segmenten indienen" }, @@ -1046,6 +1055,12 @@ "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." }, @@ -1231,5 +1246,8 @@ }, "exportSegmentsAsURL": { "message": "Delen als URL" + }, + "segmentFetchFailureWarning": { + "message": "Waarschuwing: de server heeft nog niet gereageerd met segmenten. Misschien zijn er al segmenten van deze video ingediend, maar heeft u ze nog niet ontvangen door problemen met de server." } } diff --git a/public/_locales/pl/messages.json b/public/_locales/pl/messages.json index 6cdddc31..0300e2ac 100644 --- a/public/_locales/pl/messages.json +++ b/public/_locales/pl/messages.json @@ -255,6 +255,9 @@ "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" }, @@ -475,6 +478,9 @@ "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):" }, @@ -688,6 +694,9 @@ "category_filler": { "message": "Wypełniacz nietematyczny/żart" }, + "category_filler_description": { + "message": "To jest bardzo agresywna kategoria, której możesz użyć, jeżeli nie masz ochoty, by widzieć scenki humorystyczne/wypełniacze." + }, "category_filler_short": { "message": "Wypełniacz" }, diff --git a/public/_locales/ro/messages.json b/public/_locales/ro/messages.json index f938d7c1..270703bc 100644 --- a/public/_locales/ro/messages.json +++ b/public/_locales/ro/messages.json @@ -25,6 +25,19 @@ "Segments": { "message": "segmente" }, + "SegmentsCap": { + "message": "Segmente" + }, + "Chapters": { + "message": "Capitolele" + }, + "renderAsChapters": { + "message": "Randarea segmentelor ca, capitole", + "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" + }, + "showSegmentNameInChapterBar": { + "message": "Arată ora video din segmentul curent" + }, "upvoteButtonInfo": { "message": "Votează această înregistrare" }, @@ -112,9 +125,15 @@ "closePopup": { "message": "Închide pop-up" }, + "closeIcon": { + "message": "Închide pictograma" + }, "SubmitTimes": { "message": "Trimite segmente" }, + "sortSegments": { + "message": "Sortare Segmente" + }, "submitCheck": { "message": "Sunteți sigur că doriți să trimiteți asta?" }, @@ -233,6 +252,12 @@ "whatRefetchWhenNotFound": { "message": "Dacă videoclipul este nou și nu sunt segmente găsite, va continua să se refeteze la fiecare câteva minute în timp ce vizionați." }, + "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" }, @@ -289,6 +314,14 @@ "message": "Predă segmentele", "description": "Keybind label" }, + "nextChapterKeybind": { + "message": "Capitolul următor", + "description": "Keybind label" + }, + "previousChapterKeybind": { + "message": "Capitolul anterior", + "description": "Keybind label" + }, "keybindDescription": { "message": "Selectează o tastă prin a o tasta, și alege orice taste modificatoare pe care dorești să o folosești." }, @@ -318,7 +351,7 @@ "message": "Mut" }, "full": { - "message": "Întregul Videoclip", + "message": "Video complet", "description": "Used for the name of the option to label an entire video as sponsor or self promotion." }, "skip_category": { @@ -387,9 +420,18 @@ "statusReminder": { "message": "Verificați status.sponsor.ajay.app pentru starea serverului." }, + "changeUserID": { + "message": "Importă/Exportă UserID-ul tău Privat" + }, "whatChangeUserID": { "message": "Aceste informații sunt private și nu ar trebui să fie dezvăluite nimănui. Dacă cineva are aceste informații, pot fi folosite pentru a vă imita. În cazul în care vă căutați ID-ul public de utilizator, dați click pe icoana de clipboard din popup." }, + "setUserID": { + "message": "Setare UserID 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" }, @@ -409,6 +451,9 @@ "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ă" }, @@ -430,12 +475,24 @@ "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": "Notificarea sări peste va rămâne pe ecran cel puțin atâtea secunde. Pentru omiterea manuală, este posibil să fie vizibilă pentru 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" }, @@ -472,6 +529,9 @@ "exportOptionsUpload": { "message": "Încarcă din fișier" }, + "whatExportOptions": { + "message": "Aceasta este întreaga configurație în format JSON. Asta include si ID-ul tău privat de utilizator, așa că fi sigur să împărtășești asta cu înțelepciune." + }, "setOptions": { "message": "Setează Opțiuni" }, @@ -517,10 +577,23 @@ "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 tranzițiile segmentului" + }, + "generic_guideline2": { + "message": "Reda ca și cum nimic nu a fost omis" + }, "category_sponsor": { "message": "Sponsor" }, @@ -545,15 +618,37 @@ "category_selfpromo_guideline2": { "message": "Mențiuni neplătite care nu ajută videoclipul" }, + "category_selfpromo_guideline3": { + "message": "Nu pentru produsele proiectate și merch" + }, "category_exclusive_access": { "message": "Acces Exclusiv" }, + "category_exclusive_access_description": { + "message": "Doar pentru etichetarea videoclipurilor întregi. Folosit atunci când un video prezintă un produs, serviciu sau o locație la care au primit acces gratuit sau subvenționat." + }, + "category_exclusive_access_pill": { + "message": "Acest videoclip prezintă un produs, serviciu sau o locație la care au 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": "Reamintire de Interactiune (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 memento-uri pentru a vă abona sau urmări" + }, + "category_interaction_guideline2": { + "message": "Include memento-uri indirecte de comentat" + }, + "category_interaction_guideline3": { + "message": "Nu pentru promovare generală, se face apel doar la acțiune" + }, "category_interaction_short": { "message": "Reamintire de Interacțiune" }, @@ -566,21 +661,99 @@ "category_intro_short": { "message": "Pauză" }, + "category_intro_guideline1": { + "message": "Interval fără conținut real" + }, + "category_intro_guideline2": { + "message": "Nu se efectuează tranziții 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 include conținutul, chiar dacă end card-urile sunt pe ecran" + }, + "category_preview": { + "message": "Previzualizare/Recapitulare" + }, + "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": "Clipuri care apar mai târziu sau într-un video viitor" + }, + "category_preview_guideline2": { + "message": "Recapitularea unui videoclip anterior" + }, + "category_preview_guideline3": { + "message": "Nu pentru secțiunile care adaugă conținut suplimentar" + }, + "category_filler": { + "message": "Glume de Umplutură/Tangențiale" + }, + "category_filler_description": { + "message": "Scenele tactil adăugate numai pentru umplutură sau umor care nu sunt necesare pentru a înțelege conținutul principal al videoclipului. Aceasta nu ar trebui să includă segmente care să ofere detalii de context sau de fundal. Aceasta este o categorie foarte agresivă, pentru care nu ești în starea de spirit pentru \"distracție\"." + }, "category_filler_short": { "message": "Materiale de umplutură" }, + "category_filler_guideline1": { + "message": "Scenele tactil numai pentru umplere sau umor" + }, + "category_filler_guideline2": { + "message": "Distracții, blooper, reluări" + }, + "category_filler_guideline3": { + "message": "Nu sunt necesare scene pentru a înțelege subiectul" + }, "category_music_offtopic": { "message": "Muzică: Secţiune Non-Muzicală" }, + "category_music_offtopic_description": { + "message": "Doar pentru a fi folosit în videoclipuri muzicale. Acesta ar trebui să fie folosit doar pentru secțiunile de videoclipuri muzicale care 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": "Fără muzica într-un spectacol in direct" + }, + "category_poi_highlight": { + "message": "Momente importante" + }, + "category_poi_highlight_description": { + "message": "Partea din videoclip pe care majoritatea oamenilor o caută. Similar cu \"Videoclipul începe de la x\"." + }, + "category_poi_highlight_guideline1": { + "message": "Secțiunea pe care majoritatea persoanelor o caută" + }, + "category_poi_highlight_guideline2": { + "message": "Poate sări peste context" + }, + "category_poi_highlight_guideline3": { + "message": "Poți sări la titlu sau 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" }, @@ -599,6 +772,27 @@ "disable": { "message": "Dezactivare" }, + "autoSkip_POI": { + "message": "Omitere automată la început" + }, + "manualSkip_POI": { + "message": "Întreabă când se încarcă videoclipul" + }, + "showOverlay_POI": { + "message": "Arată În Bara de Derulare" + }, + "showOverlay_full": { + "message": "Arată eticheta" + }, + "showOverlay_chapter": { + "message": "Afișează Capitolele" + }, + "autoSkipOnMusicVideos": { + "message": "Omiteți automat toate segmentele atunci când există un segment non-muzical" + }, + "muteSegments": { + "message": "Permite segmente care blochează sunetul în loc de a sări peste" + }, "fullVideoSegments": { "message": "Arată o icoană atunci când un videoclip este în întregime o reclamă", "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" @@ -648,6 +842,10 @@ "bracketEnd": { "message": "(Sfârșit)" }, + "End": { + "message": "Sfârșit", + "description": "Button that skips to the end of a segment" + }, "hiddenDueToDownvote": { "message": "ascuns: downvote" }, @@ -657,9 +855,25 @@ "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" }, @@ -672,6 +886,16 @@ "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." }, @@ -691,6 +915,110 @@ "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 este aproximativ un subiect, atunci schimbați de la \"Săriți\" la \"Videoclip întreg\". Vedeți instrucțiunile pentru mai multe informații." + }, + "categoryPillTitleText": { + "message": "Acest întreg videoclip este etichetat ca această categorie și este prea strâns integrat pentru a putea separa" + }, + "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ă făceați niște greșeli comune care nu sunt răuvoitoare" + }, + "warningTitle": { + "message": "Ai primit o avertizare" + }, + "questionButton": { + "message": "Am o întrebare" + }, + "warningConfirmButton": { + "message": "Înțeleg motivul" + }, + "warningError": { + "message": "Eroare la încercarea de a confirma avertismentul:" + }, + "Donate": { + "message": "Donează" + }, + "considerDonating": { + "message": "Ajută la dezvoltarea fondului" + }, + "hideDonationLink": { + "message": "Ascunde linkul de donare" + }, + "darkModeOptionsPage": { + "message": "Modul întunecat pe 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." + }, + "helpPageHowSkippingWorks": { + "message": "Cum funcționează omiterea" + }, + "helpPageHowSkippingWorks1": { + "message": "Segmentele video vor fi omise automat dacă sunt găsite în baza de date. Poți deschide fereastra pop-up făcând clic pe pictograma extensiei pentru a obține o previzualizare a ceea ce sunt." + }, + "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" + }, + "helpPageSubmitting1": { + "message": "Trimiterea poate fi făcută fie în fereastra pop-up prin apăsarea butonului \"Segmentul Incepe Acum\", fie în video player-ul cu butoanele playerului." + }, + "helpPageSubmitting2": { + "message": "Făcând clic pe butonul de redare indică începutul unui segment și apăsând pe pictograma de stop indică sfârșitul. Poți pregăti mai mulți sponsori înainte de a apasă pe butonul de încărcare va fi trimis. Click-ul pe gunoi se va șterge." + }, + "Editing": { + "message": "Editează" + }, + "helpPageEditing1": { + "message": "Dacă ai greșit, poți edita sau șterge segmentele după ce dai click pe butonul săgeată în sus." + }, + "helpPageTooSlow": { + "message": "Acest lucru este prea lent" + }, + "helpPageTooSlow1": { + "message": "Exista scurtături daca dorești sa le folosești. Apăsați tasta cu punct și virgulă pentru a indica începutul/sfârșitul unui segment de sponsor și faceți clic pe apostrof pentru a trimite. Acestea pot fi schimbate în opțiuni. Dacă nu utilizați QWERTY, probabil ar trebui să schimbați scurtăturile." + }, + "helpPageCopyOfDatabase": { + "message": "Pot obține o copie a bazei de date? Ce se întâmplă dacă dispari?" + }, + "helpPageCopyOfDatabase1": { + "message": "Baza de date este publică și disponibilă la adresa" + }, + "helpPageCopyOfDatabase2": { + "message": "Codul sursă este disponibil gratuit. Deci, chiar dacă ceva mi se întâmplă mie, trimiterile tale nu sunt pierdute." + }, + "helpPageNews": { + "message": "Știri și modul în care este făcut" + }, + "helpPageSourceCode": { + "message": "Unde pot obține codul sursă?" + }, "Credits": { "message": "Contribuții" }, @@ -700,15 +1028,42 @@ "FullDetails": { "message": "Detalii Complete" }, + "CopyDownvoteButtonInfo": { + "message": "Voturi negative și creați o copie locală pentru a retrimite" + }, + "OpenCategoryWikiPage": { + "message": "Deschide pagina wiki a acestei categorii." + }, "CopyAndDownvote": { "message": "Copiază și dă downvote" }, + "ContinueVoting": { + "message": "Continuă votarea" + }, + "ChangeCategoryTooltip": { + "message": "Acest lucru se va aplica instantaneu segmentelor dvs" + }, "downvote": { "message": "Downvote" }, "upvote": { "message": "Upvote" }, + "hideSegment": { + "message": "Ascunde segmentul" + }, + "skipSegment": { + "message": "Sari peste segment" + }, + "playChapter": { + "message": "Reda capitolul" + }, + "SponsorTimeEditScrollNewFeature": { + "message": "Folosește rotița mouse-ului în timp ce ești deasupra casetei de editare pentru a ajusta rapid timpul. Combinațiile dintre ctrl sau Shift pot fi folosite pentru a ajusta modificările." + }, + "categoryPillNewFeature": { + "message": "Nou! Vezi când un videoclip este sponsorizat în întregime sau auto-promovat" + }, "dayAbbreviation": { "message": "zile", "description": "100d" @@ -741,10 +1096,152 @@ "message": "Aspectul notificării de omiteri", "description": "Option label" }, + "unbind": { + "message": "Unbind", + "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": "Resetați setările la valori 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": "Exportare segmente" + }, + "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": "Ascunde opțiunile indisponibile fără o plată suplimentara" + }, + "chooseACountry": { + "message": "Selectați țara" + }, + "noDiscount": { + "message": "Nu te califici pentru o reducere" + }, + "discountLink": { + "message": "Link de reducere (Vezi prețul roz)" + }, + "selectYourCountry": { + "message": "Selectaţi ţara" + }, + "alreadyDonated": { + "message": "Dacă ai donat orice sumă înainte, poți revendica acces gratuit prin e-mail:", + "description": "After the colon is an email address" + }, + "cantAfford": { + "message": "Dacă nu vă puteți permite să achiziționați o licență, faceți clic pe {aici} pentru a vedea dacă sunteți eligibil pentru o reducere", + "description": "Keep the curly braces. The word 'here' should be translated as well." + }, + "patreonSignIn": { + "message": "Conectează-te cu Patreon" + }, + "redeem": { + "message": "Folosește" + }, + "joinOnPatreon": { + "message": "Abonează-te pe Patreon" + }, + "oneTimePurchase": { + "message": "Achiziție unică" + }, + "enterLicenseKey": { + "message": "Introdu cheia de licență" + }, + "chaptersPage1": { + "message": "Funcția SponsorBlock crowd-sourted capitol este disponibilă doar pentru persoanele care achiziționează o licență, fie persoanelor cărora li se acordă acces gratuit la contribuţiile lor anterioare" + }, + "chaptersPage2": { + "message": "Notă: Permisiunea de a trimite capitole este încă bazată pe reputația calculată. Achiziționarea unei licențe vă permite doar să vizualizați capitolele prezentate de alții", + "description": "On the chapters page for getting access to the paid chapters feature" + }, + "chapterNewFeature": { + "message": "Funcție nouă: Capitole personalizate din surse colective. Acestea sunt secțiuni personalizate în videoclipuri care pot fi stivuite pentru a deveni din ce în ce mai precise. Cumpără o licență pentru a vizualiza capitolele trimise pe acest videoclip, cum ar fi: ", + "description": "After the comma, a list of chapters for this video will appear" + }, + "chapterNewFeature2": { + "message": "Funcție nouă: Capitole personalizate din surse colective. Acestea sunt secțiuni personalizate în videoclipuri care pot fi stivuite pentru a deveni din ce în ce mai precise. Ai acces gratuit, activeaz-o in opțiuni." + }, + "unsubmittedSegmentCounts": { + "message": "Ai în prezent {0} pe {1}", + "description": "Example: You currently have 12 unsubmitted segments on 5 videos" + }, + "unsubmittedSegmentCountsZero": { + "message": "În prezent nu aveți segmente netrimise", + "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": "Curăță toate segmentele", + "description": "Label for a button in settings" + }, + "clearUnsubmittedSegmentsConfirm": { + "message": "Sigur doriți ștergerea tuturor segmentelor netransmise?", + "description": "Confirmation message for the Clear unsubmitted segments button" + }, + "showUnsubmittedSegments": { + "message": "Arată segmentele", + "description": "Show/hide button for the unsubmitted segments list" + }, + "hideUnsubmittedSegments": { + "message": "Ascunde segmentele", + "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": "Distribuie ca URL" } } diff --git a/public/_locales/ru/messages.json b/public/_locales/ru/messages.json index d1b11918..0549d3bc 100644 --- a/public/_locales/ru/messages.json +++ b/public/_locales/ru/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Ошибка соединения. Код ошибки: " }, + "segmentsStillLoading": { + "message": "Сегменты все еще загружаются..." + }, "clearTimes": { "message": "Очистить сегменты" }, @@ -1243,5 +1246,8 @@ }, "exportSegmentsAsURL": { "message": "Поделиться ссылкой" + }, + "segmentFetchFailureWarning": { + "message": "Внимание: Сервер еще не прислал существующие сегменты. В этом видео уже могут быть отправленные сегменты, но вы их ещё не получили из-за проблем с сервером." } } diff --git a/public/_locales/sk/messages.json b/public/_locales/sk/messages.json index 5d05d12f..5f4b3a03 100644 --- a/public/_locales/sk/messages.json +++ b/public/_locales/sk/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Nastala chyba pripojenia. Kód chyby: " }, + "segmentsStillLoading": { + "message": "Segmenty sa ešte nahrávajú..." + }, "clearTimes": { "message": "Zmazať segmenty" }, @@ -1060,5 +1063,8 @@ "chapterNewFeature": { "message": "Nová funkcia: Crowd-sourcované vlastné kapitoly. Toto sú sekcie videa s vlastnými názvami, ktoré môžu byť pre väčšiu presnosť vyskladané. Ak si kúpite licenciu, uvidíte kapitoly v tomto videu, ako napr.: ", "description": "After the comma, a list of chapters for this video will appear" + }, + "segmentFetchFailureWarning": { + "message": "Varovanie: Zo servera sa ešte nenahrali segmenty. V tomto videu už môžu byť vytvorené segmenty, ale vzhľadom na problémy so serverom ešte nemuseli byť nahraté." } } diff --git a/public/_locales/sv/messages.json b/public/_locales/sv/messages.json index ded1a4b5..03b498e3 100644 --- a/public/_locales/sv/messages.json +++ b/public/_locales/sv/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Anslutningsfel. Felkod: " }, + "segmentsStillLoading": { + "message": "Segmenten laddas fortfarande..." + }, "clearTimes": { "message": "Rensa segmenten" }, @@ -1243,5 +1246,8 @@ }, "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." } } diff --git a/public/_locales/uk/messages.json b/public/_locales/uk/messages.json index 78f01afc..0e6b389f 100644 --- a/public/_locales/uk/messages.json +++ b/public/_locales/uk/messages.json @@ -35,6 +35,9 @@ "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": "Проголосувати за цей сегмент" }, @@ -113,6 +116,9 @@ "connectionError": { "message": "Помилка з'єднання. Код помилки: " }, + "segmentsStillLoading": { + "message": "Сегмент все ще завантажується..." + }, "clearTimes": { "message": "Очистити сегменти" }, @@ -122,6 +128,9 @@ "closePopup": { "message": "Закрити вікно" }, + "closeIcon": { + "message": "Закрити іконку" + }, "SubmitTimes": { "message": "Надіслати сегменти" }, @@ -246,6 +255,12 @@ "whatRefetchWhenNotFound": { "message": "Якщо відео нове і для нього не знайдено сегментів, то інформація про них буде оновлюватися кожні пару хвилин, поки ви дивитеся відео." }, + "enableShowCategoryWithoutPermission": { + "message": "Показувати категорії в меню подання навіть без дозволу на подання" + }, + "whatShowCategoryWithoutPermission": { + "message": "Деякі категорії потребують дозволу на подання через мінімальні вимоги до репутації" + }, "showNotice": { "message": "Показувати сповіщення знову" }, @@ -408,9 +423,18 @@ "statusReminder": { "message": "Дивіться стан сервера на status.sponsor.ajay.app." }, + "changeUserID": { + "message": "Імпорт/експорт вашого приватного UserID" + }, "whatChangeUserID": { "message": "Тримайте його в таємниці. Ставтеся до нього як до паролю і не передавайте нікому. Якщо хтось їм заволодіє, то зможе видати себе за вас. Якщо ви шукаєте публічний ID користувача, натисніть значок буфера обміну у спливаючому вікні." }, + "setUserID": { + "message": "Встан. приватний UserID" + }, + "userIDChangeWarning": { + "message": "Попередження: зміна приватного UserID є постійною. Ви впевнені, що хочете це зробити? Про всяк випадок обов’язково зробіть резервну копію свого старого." + }, "createdBy": { "message": "Створено" }, @@ -454,6 +478,12 @@ "minDurationDescription": { "message": "Сегменти коротше цього значення не будуть пропускатися і не будуть показані в плеєрі." }, + "enableManualSkipOnFullVideo": { + "message": "Використовуйте ручний пропуск, якщо існує повна мітка відео" + }, + "whatManualSkipOnFullVideo": { + "message": "Для людей, які хочуть дивитися відео без перерв, якщо воно повністю спонсороване або самореклама." + }, "skipNoticeDuration": { "message": "Тривалість повідомлення пропуску (в секундах):" }, @@ -502,6 +532,9 @@ "exportOptionsUpload": { "message": "Завантажити з файлу" }, + "whatExportOptions": { + "message": "Вся ваша конфігурація в JSON. Це включає ваш приватний UserID, тому використовуйте з розумом." + }, "setOptions": { "message": "Встановити параметри" }, @@ -573,12 +606,24 @@ "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": "Ексклюзивний доступ" }, @@ -589,12 +634,24 @@ "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": "Нагадування про взаємодію" }, @@ -607,24 +664,54 @@ "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_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": "Музика: Сегмент без музики" }, @@ -634,6 +721,9 @@ "category_music_offtopic_short": { "message": "Без музики" }, + "category_music_offtopic_guideline1": { + "message": "Розділів немає в офіційних випусках" + }, "category_music_offtopic_guideline2": { "message": "Не музика під час виступу наживо" }, @@ -643,6 +733,9 @@ "category_poi_highlight_description": { "message": "Частина відео яку шукає більшість людей (Аналогічно коментарю \"Відео починається з Х:ХХ\")." }, + "category_poi_highlight_guideline1": { + "message": "Розділ, який шукають більшість людей" + }, "category_poi_highlight_guideline2": { "message": "Може пропустити контекст" }, @@ -652,6 +745,18 @@ "category_chapter": { "message": "Розділ" }, + "category_chapter_description": { + "message": "Розділи з іменами користувача, що описують основні розділи відео." + }, + "category_chapter_guideline1": { + "message": "Не згадуйте про торгові марки спонсорів" + }, + "category_chapter_guideline2": { + "message": "Використовуйте більші розділи для загальних розділів" + }, + "category_chapter_guideline3": { + "message": "Менші розділи можна розмістити всередині великих" + }, "category_livestream_messages": { "message": "Прямі трансляції: пожертвування/читання повідомлення" }, @@ -826,6 +931,9 @@ "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." @@ -947,6 +1055,12 @@ "hideSegment": { "message": "Приховати сегмент" }, + "skipSegment": { + "message": "Пропустити сегмент" + }, + "playChapter": { + "message": "Відтворити розділ" + }, "SponsorTimeEditScrollNewFeature": { "message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін." }, @@ -1013,22 +1127,48 @@ "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": "Опції приховування недоступні без додаткової оплати" + }, "chooseACountry": { "message": "Виберіть країну" }, + "noDiscount": { + "message": "Ви не відповідаєте вимогам на знижку" + }, + "discountLink": { + "message": "Посилання на знижку (див. рожеву ціну)" + }, "selectYourCountry": { "message": "Виберіть вашу країну" }, + "alreadyDonated": { + "message": "Якщо ви вже пожертвували будь-яку суму, ви можете отримати безкоштовний доступ, надіславши електронний лист:\nВажливо:Після двокрапки вказується адреса електронної пошти", + "description": "After the colon is an email address" + }, + "cantAfford": { + "message": "Якщо ви не можете дозволити собі придбати ліцензію, натисніть {тут}, щоб дізнатися, чи маєте ви право на знижку", + "description": "Keep the curly braces. The word 'here' should be translated as well." + }, "patreonSignIn": { "message": "Вхід через Patreon" }, + "redeem": { + "message": "Купон" + }, "joinOnPatreon": { "message": "Підписатися на Patreon" }, @@ -1038,6 +1178,20 @@ "enterLicenseKey": { "message": "Введіть ліцензійний ключ" }, + "chaptersPage1": { + "message": "SponsorBlock функція краудсорсингу розділів доступна лише для людей, які придбали ліцензію, або для людей, яким надано безкоштовний доступ через їхні попередні внески" + }, + "chaptersPage2": { + "message": "Примітка: Дозвіл надсилати глави все ще базується на обчисленій репутації. Придбання ліцензії дозволяє лише переглядати розділи, надіслані іншими", + "description": "On the chapters page for getting access to the paid chapters feature" + }, + "chapterNewFeature": { + "message": "Нова функція: краудсорсингові користувацькі розділи. Це розділи у відео зі спеціальними назвами, які можна складати, щоб отримати точніші результати. Придбайте ліцензію, щоб переглядати розділи цього відео, наприклад: ", + "description": "After the comma, a list of chapters for this video will appear" + }, + "chapterNewFeature2": { + "message": "Нова функція: краудсорсингові користувацькі розділи. Це розділи у відео зі спеціальними назвами, які можна складати, щоб отримати точніші результати. Ви маєте безкоштовний доступ, увімкніть параметр." + }, "unsubmittedSegmentCounts": { "message": "Наразі у вас є {0} на {1}", "description": "Example: You currently have 12 unsubmitted segments on 5 videos" @@ -1092,5 +1246,8 @@ }, "exportSegmentsAsURL": { "message": "Поділитися посиланням" + }, + "segmentFetchFailureWarning": { + "message": "Попередження: сервер ще не завантажив сегменти. Можливо, у цьому відео вже є сегменти, але ви просто не отримали їх через проблеми з сервером." } } From 89e87cd74de4583ead073fae9f7ed2cb9747380e Mon Sep 17 00:00:00 2001 From: mini-bomba <55105495+mini-bomba@users.noreply.github.com> Date: Fri, 4 Nov 2022 22:02:54 +0100 Subject: [PATCH 032/318] Don't update the whole segment list on time update (#1569) Update segment element classes instead. This probably is more efficient than what we're doing currently. Also, this seems to fix a bug where the vote confirmation/error msg is removed immediately --- src/popup.ts | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/popup.ts b/src/popup.ts index 526b6381..ddfff407 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -614,6 +614,7 @@ async function runThePopup(messageListener?: MessageListener): Promise { const votingButtons = document.createElement("details"); votingButtons.classList.add("votingButtons"); votingButtons.id = "votingButtons" + UUID; + votingButtons.setAttribute("data-uuid", UUID); votingButtons.addEventListener("toggle", () => { if (votingButtons.open) { openedUUIDs.push(UUID); @@ -1068,10 +1069,37 @@ async function runThePopup(messageListener?: MessageListener): Promise { port.onMessage.addListener((msg) => onMessage(msg)); } + function updateCurrentTime(currentTime: number) { + // Create a map of segment UUID -> segment object for easy access + const segmentMap: Record = {}; + for (const segment of downloadedTimes) + segmentMap[segment.UUID] = segment + + // Iterate over segment elements and update their classes + const segmentList = document.getElementById("issueReporterTimeButtons"); + for (const segmentElement of segmentList.children) { + const UUID = segmentElement.getAttribute("data-uuid"); + if (UUID == null || segmentMap[UUID] == undefined) continue; + + const summaryElement = segmentElement.querySelector("summary") + if (summaryElement == null) continue; + + const segment = segmentMap[UUID] + summaryElement.classList.remove("segmentActive", "segmentPassed") + if (currentTime >= segment.segment[0]) { + if (currentTime < segment.segment[1]) { + summaryElement.classList.add("segmentActive"); + } else { + summaryElement.classList.add("segmentPassed"); + } + } + } + } + function onMessage(msg: PopupMessage) { switch (msg.message) { case "time": - displayDownloadedSponsorTimes(downloadedTimes, msg.time); + updateCurrentTime(msg.time); break; case "infoUpdated": infoFound(msg); From 4596f3ab0d109813cf584bf5917bba708808f3d6 Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 4 Nov 2022 17:04:35 -0400 Subject: [PATCH 033/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index c7a0e5d2..8045817c 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.4", + "version": "5.1.5", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From a1e00b44d52f042bada2e3fb4f2a50a321e126a8 Mon Sep 17 00:00:00 2001 From: caneleex Date: Sun, 6 Nov 2022 18:48:42 +0100 Subject: [PATCH 034/318] Add option to disable scrolling to edit --- public/_locales/en/messages.json | 3 +++ public/options/options.html | 12 ++++++++++++ src/components/SponsorTimeEditComponent.tsx | 1 + src/config.ts | 2 ++ 4 files changed, 18 insertions(+) diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index 7a5dd69b..21b7a048 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -1249,5 +1249,8 @@ }, "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 recieved them due to issues with the server." + }, + "allowScrollingToEdit": { + "message": "Allow Scrolling To Edit Times" } } diff --git a/public/options/options.html b/public/options/options.html index 91112941..8128e284 100644 --- a/public/options/options.html +++ b/public/options/options.html @@ -277,6 +277,18 @@ + +
+
+ + +
+
diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index d05c34fa..0a1a7a5c 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -320,6 +320,7 @@ class SponsorTimeEditComponent extends React.Component Date: Sun, 6 Nov 2022 19:15:59 +0100 Subject: [PATCH 035/318] Don't overwrite endcards time upon submitting --- src/components/SponsorTimeEditComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index d05c34fa..84b69cbf 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -595,7 +595,7 @@ class SponsorTimeEditComponent extends React.Component Date: Sun, 6 Nov 2022 13:19:35 -0500 Subject: [PATCH 036/318] New Crowdin updates (#1574) --- public/_locales/bn/messages.json | 46 ++++++++++++++++++++++++++++++++ public/_locales/de/messages.json | 6 +++++ public/_locales/es/messages.json | 2 +- public/_locales/ja/messages.json | 5 +++- 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/public/_locales/bn/messages.json b/public/_locales/bn/messages.json index ae020f46..e04bebd6 100644 --- a/public/_locales/bn/messages.json +++ b/public/_locales/bn/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "একটি সংযোগ ত্রুটি ঘটেছে. ভুল সংকেত: " }, + "segmentsStillLoading": { + "message": "সেগমেন্ট এখনো লোড হচ্ছে..." + }, "clearTimes": { "message": "বিভাগগুলি পরিষ্কার করুন" }, @@ -842,6 +845,12 @@ "hideForever": { "message": "চিরকালের জন্য এই বিষয়বস্তু লুকান" }, + "questionButton": { + "message": "আমার একটি প্রশ্ন আছে" + }, + "warningConfirmButton": { + "message": "আমি কারণ বুঝেছি" + }, "Donate": { "message": "অনুদান" }, @@ -914,6 +923,9 @@ "LearnMore": { "message": "আরও জানুন" }, + "FullDetails": { + "message": "সম্পূর্ণ বিস্তারিত" + }, "CopyDownvoteButtonInfo": { "message": "ডাউনভোট করে আপনার জন্য পুনরায় জমা দেওয়ার জন্য একটি স্থানীয় অনুলিপি তৈরি করে" }, @@ -938,6 +950,12 @@ "hideSegment": { "message": "অংশ আড়াল করুন" }, + "skipSegment": { + "message": "সেগমেন্ট এড়িয়ে যান" + }, + "playChapter": { + "message": "অধ্যায় চালু করুন" + }, "SponsorTimeEditScrollNewFeature": { "message": "দ্রুত সময়টি পরিবর্কতন করতে সম্পাদনা বাক্সে ঘুরে দেখার সময় আপনার মাউস এর হুইয়িলটি ব্যবহার করুন। কন্ট্রল বা শিফট কী এর সংমিশ্রণগুলি পরিবর্তনগুলি আরো নিখুতভাবে টিউন করতে ব্যবহার করা যেতে পারে।" }, @@ -994,5 +1012,33 @@ }, "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" + }, + "chooseACountry": { + "message": "দেশ নির্বাচন করুন" + }, + "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" } } diff --git a/public/_locales/de/messages.json b/public/_locales/de/messages.json index 7989a78d..038c354a 100644 --- a/public/_locales/de/messages.json +++ b/public/_locales/de/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: " }, + "segmentsStillLoading": { + "message": "Segmente werden noch geladen..." + }, "clearTimes": { "message": "Alle Segmente löschen" }, @@ -1243,5 +1246,8 @@ }, "exportSegmentsAsURL": { "message": "Als URL teilen" + }, + "segmentFetchFailureWarning": { + "message": "Warnung: Der Server hat noch nicht mit Segmenten geantwortet. Möglicherweise gibt es bereits Segmente zu diesem Video, aber du hast sie aufgrund von Problemen mit dem Server noch nicht erhalten." } } diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json index c19e3f58..5ab39222 100644 --- a/public/_locales/es/messages.json +++ b/public/_locales/es/messages.json @@ -1197,7 +1197,7 @@ "description": "Example: You currently have 12 unsubmitted segments on 5 videos" }, "unsubmittedSegmentCountsZero": { - "message": "Actualmente no tiene segmentos no enviados", + "message": "Actualmente no tiene segmentos sin enviar", "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" }, "unsubmittedSegmentsSingular": { diff --git a/public/_locales/ja/messages.json b/public/_locales/ja/messages.json index b05cc435..fa32f2de 100644 --- a/public/_locales/ja/messages.json +++ b/public/_locales/ja/messages.json @@ -153,7 +153,7 @@ "message": "提案数" }, "savedPeopleFrom": { - "message": "みんなの時間をこれだけ節約しました: " + "message": "あなたが節約したみんなの時間: " }, "viewLeaderboard": { "message": "リーダーボード" @@ -1246,5 +1246,8 @@ }, "exportSegmentsAsURL": { "message": "URLとして共有" + }, + "segmentFetchFailureWarning": { + "message": "警告: サーバーがまだセグメントで応答していません。この動画に対するセグメントはすでに提出されているものの、サーバーの問題によりそれが受信できていないだけという可能性があります。" } } From d347f4e5750c59f59d766900e7536e71222e2b17 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sun, 6 Nov 2022 13:19:56 -0500 Subject: [PATCH 037/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 8045817c..a7acaf86 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.5", + "version": "5.1.6", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From ce3f77ed20a3fd12ca5fa2ff0d26e0a75b30928f Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 7 Nov 2022 21:15:04 -0500 Subject: [PATCH 038/318] Better key moments check by not importing when no 0 second chapter --- src/utils/pageUtils.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index 94c58bfc..6b262236 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -71,8 +71,7 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number): const chapters: SponsorTime[] = []; // .ytp-timed-markers-container indicates that key-moments are present, which should not be divided - if (chaptersBox && !(getControls()?.parentElement?.parentElement - ?.querySelector(".ytp-timed-markers-container")?.childElementCount > 0)) { + if (chaptersBox) { let lastSegment: SponsorTime = null; const links = chaptersBox.querySelectorAll("ytd-macro-markers-list-item-renderer > a"); for (const link of links) { @@ -104,6 +103,11 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number): } } + if (chapters[0] && chapters[0].segment[0] !== 0) { + // This is key moments instead of chapters, don't import as they are not full sections + return []; + } + return chapters; } From cd7d74fb33832c8efc7e6bae1aeecb5e3b1a0b1c Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 8 Nov 2022 13:38:19 -0500 Subject: [PATCH 039/318] Fix category pill text on new YouTube layout --- src/components/CategoryPillComponent.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/CategoryPillComponent.tsx b/src/components/CategoryPillComponent.tsx index 7d46d0aa..a008e396 100644 --- a/src/components/CategoryPillComponent.tsx +++ b/src/components/CategoryPillComponent.tsx @@ -140,16 +140,17 @@ class CategoryPillComponent extends React.Component #container") as HTMLElement; + const tooltipMount = document.querySelector("#above-the-fold") as HTMLElement; if (tooltipMount) { this.tooltip = new Tooltip({ text: this.getTitleText(), referenceNode: tooltipMount, - bottomOffset: "70px", + bottomOffset: "0px", opacity: 0.95, displayTriangle: false, showLogo: false, - showGotIt: false + showGotIt: false, + prependElement: tooltipMount.firstElementChild as HTMLElement }); } } From 00ef3856ca0d147ef0e50a261d90d0fc7d41db69 Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 8 Nov 2022 13:50:56 -0500 Subject: [PATCH 040/318] Fix race condition causing full video label not to display --- src/render/CategoryPill.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/render/CategoryPill.tsx b/src/render/CategoryPill.tsx index e5d8f96e..f8ec1791 100644 --- a/src/render/CategoryPill.tsx +++ b/src/render/CategoryPill.tsx @@ -43,8 +43,10 @@ export class CategoryPill { this.root.render(); if (this.unsavedState) { - this.ref.current?.setState(this.unsavedState); - this.unsavedState = null; + GenericUtils.wait(() => this.ref.current).then(() => { + this.ref.current?.setState(this.unsavedState); + this.unsavedState = null; + }); } if (onMobileYouTube) { From 4447ff314239b37778511bdeba9df3dce77b2116 Mon Sep 17 00:00:00 2001 From: Ajay Date: Wed, 9 Nov 2022 12:45:11 -0500 Subject: [PATCH 041/318] Fix issues with mutes ending when highlights start --- src/content.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/content.ts b/src/content.ts index eb7422a8..3927901f 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1567,6 +1567,13 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: const includedTimes: ScheduledTime[] = []; const scheduledTimes: number[] = []; + const shouldIncludeTime = (segment: ScheduledTime ) => (minimum === undefined + || ((includeNonIntersectingSegments && segment.scheduledTime >= minimum) + || (includeIntersectingSegments && segment.scheduledTime < minimum && segment.segment[1] > minimum))) + && (!hideHiddenSponsors || segment.hidden === SponsorHideType.Visible) + && segment.segment.length === 2 + && segment.actionType !== ActionType.Poi; + const possibleTimes = sponsorTimes.map((sponsorTime) => ({ ...sponsorTime, scheduledTime: sponsorTime.segment[0] @@ -1574,7 +1581,7 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: // Schedule at the end time to know when to unmute and remove title from seek bar sponsorTimes.forEach(sponsorTime => { - if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime) + if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime && shouldIncludeTime(time)) && (minimum === undefined || sponsorTime.segment[1] > minimum)) { possibleTimes.push({ ...sponsorTime, @@ -1584,13 +1591,7 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: }); for (let i = 0; i < possibleTimes.length; i++) { - if ((minimum === undefined - || ((includeNonIntersectingSegments && possibleTimes[i].scheduledTime >= minimum) - || (includeIntersectingSegments && possibleTimes[i].scheduledTime < minimum && possibleTimes[i].segment[1] > minimum))) - && (!hideHiddenSponsors || possibleTimes[i].hidden === SponsorHideType.Visible) - && possibleTimes[i].segment.length === 2 - && possibleTimes[i].actionType !== ActionType.Poi) { - + if (shouldIncludeTime(possibleTimes[i])) { scheduledTimes.push(possibleTimes[i].scheduledTime); includedTimes.push(possibleTimes[i]); } From 87d1522c41580bb902447f762527df5e71ea3a2f Mon Sep 17 00:00:00 2001 From: caneleex Date: Fri, 18 Nov 2022 20:50:05 +0100 Subject: [PATCH 042/318] Don't include mutes in time without skips --- src/content.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content.ts b/src/content.ts index eb7422a8..e6f758b5 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1396,12 +1396,12 @@ function updatePreviewBar(): void { if (Config.config.showTimeWithSkips) { const skippedDuration = utils.getTimestampsDuration(previewBarSegments - .filter(({actionType}) => actionType !== ActionType.Chapter) + .filter(({actionType}) => ![ActionType.Mute, ActionType.Chapter].includes(actionType)) .map(({segment}) => segment)); showTimeWithoutSkips(skippedDuration); } - + // Update last video id lastPreviewBarUpdate = sponsorVideoID; } From b696902124ab3202fb9adf7b7480753b44a55c7d Mon Sep 17 00:00:00 2001 From: caneleex Date: Fri, 18 Nov 2022 20:51:11 +0100 Subject: [PATCH 043/318] why --- src/content.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index e6f758b5..8b10858d 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1401,7 +1401,7 @@ function updatePreviewBar(): void { showTimeWithoutSkips(skippedDuration); } - + // Update last video id lastPreviewBarUpdate = sponsorVideoID; } From ec12c1d324408e39db602ffce46c20999a2590fc Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 22 Nov 2022 17:29:46 -0500 Subject: [PATCH 044/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index a7acaf86..b963f0bd 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.6", + "version": "5.1.7", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 8f13c5b8a56e1a5e02d3040934dc4048b0e51a4a Mon Sep 17 00:00:00 2001 From: Ajay Date: Wed, 23 Nov 2022 23:24:57 -0500 Subject: [PATCH 045/318] Disable refetch --- src/content.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index 3927901f..a137433d 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1198,7 +1198,7 @@ function retryFetch(errorCode: number): void { retryFetchTimeout = setTimeout(() => { if (sponsorVideoID && sponsorTimes?.length === 0 || sponsorTimes.every((segment) => segment.source !== SponsorSourceType.Server)) { - sponsorsLookup(); + // sponsorsLookup(); } }, delay); } From 8d0a4ec2e6a76066e5ceadd0cb023f01f21b9750 Mon Sep 17 00:00:00 2001 From: Ajay Date: Wed, 23 Nov 2022 23:37:52 -0500 Subject: [PATCH 046/318] Fix race condition causing double fetch --- src/content.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index a137433d..36907ab4 100644 --- a/src/content.ts +++ b/src/content.ts @@ -154,6 +154,7 @@ let isAdPlaying = false; let lastResponseStatus: number; let retryCount = 0; +let lookupWaiting = false; // Contains all of the functions and variables needed by the skip notice const skipNoticeContentContainer: ContentContainer = () => ({ @@ -965,10 +966,15 @@ function setupCategoryPill() { } async function sponsorsLookup(keepOldSubmissions = true) { + if (lookupWaiting) return; if (!video || !isVisible(video)) refreshVideoAttachments(); //there is still no video here if (!video) { - setTimeout(() => sponsorsLookup(), 100); + lookupWaiting = true; + setTimeout(() => { + lookupWaiting = false; + sponsorsLookup() + }, 100); return; } From eac2caadce080c0a4970de318cd3662bc563aba7 Mon Sep 17 00:00:00 2001 From: Ajay Date: Wed, 23 Nov 2022 23:42:06 -0500 Subject: [PATCH 047/318] Fix document script sending events when video id not changed --- src/document.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/document.ts b/src/document.ts index 595595b7..2b53b462 100644 --- a/src/document.ts +++ b/src/document.ts @@ -33,6 +33,7 @@ type WindowMessage = StartMessage | FinishMessage | AdMessage | VideoData; // global playerClient - too difficult to type // eslint-disable-next-line @typescript-eslint/no-explicit-any let playerClient: any; +let lastVideo = ""; const sendMessage = (message: WindowMessage): void => { window.postMessage({ source: "sponsorblock", ...message }, "/"); @@ -87,7 +88,8 @@ function navigateFinishSend(event: CustomEvent): void { function sendVideoData(): void { if (!playerClient) return; const videoData = playerClient.getVideoData(); - if (videoData) { + if (videoData && videoData.video_id !== lastVideo) { + lastVideo = videoData.video_id; sendMessage({ type: "data", videoID: videoData.video_id, isLive: videoData.isLive, isPremiere: videoData.isPremiere } as VideoData); } } \ No newline at end of file From 43c30bb03dc1cebd3257275c0ca82b283fa944b2 Mon Sep 17 00:00:00 2001 From: Ajay Date: Wed, 23 Nov 2022 23:42:17 -0500 Subject: [PATCH 048/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index b963f0bd..ee6aa22f 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.7", + "version": "5.1.8", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 5925d45f74e1eedac4cb68ac7f111f16112116c4 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 26 Nov 2022 03:38:48 -0500 Subject: [PATCH 049/318] Add new workaround for improving skipping precision on Firefox --- src/content.ts | 99 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/src/content.ts b/src/content.ts index 36907ab4..172c2468 100644 --- a/src/content.ts +++ b/src/content.ts @@ -71,12 +71,14 @@ let channelIDInfo: ChannelIDInfo; // Locked Categories in this tab, like: ["sponsor","intro","outro"] let lockedCategories: Category[] = []; // Used to calculate a more precise "virtual" video time -let lastKnownVideoTime: { videoTime: number; preciseTime: number } = { +const lastKnownVideoTime: { videoTime: number; preciseTime: number; fromPause: boolean; approximateDelay: number } = { videoTime: null, - preciseTime: null + preciseTime: null, + fromPause: false, + approximateDelay: null, }; // It resumes with a slightly later time on chromium -let lastTimeFromWaitingEvent = null; +let lastTimeFromWaitingEvent: number = null; const lastNextChapterKeybind = { time: 0, date: 0 @@ -87,6 +89,7 @@ const lastNextChapterKeybind = { // Skips are canceled every seeking event let currentSkipSchedule: NodeJS.Timeout = null; let currentSkipInterval: NodeJS.Timeout = null; +let currentVirtualTimeInterval: NodeJS.Timeout = null; /** Has the sponsor been skipped */ let sponsorSkipped: boolean[] = []; @@ -600,6 +603,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: if (currentTime === undefined || currentTime === null) { currentTime = getVirtualTime(); } + clearWaitingTime(); lastTimeFromWaitingEvent = null; updateActiveSegment(currentTime); @@ -704,11 +708,23 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: // Use interval instead of timeout near the end to combat imprecise video time const startIntervalTime = performance.now(); const startVideoTime = Math.max(currentTime, video.currentTime); + + let startWaitingForReportedTimeToChange = true; + const reportedVideoTimeAtStart = video.currentTime; logDebug(`Starting setInterval skipping ${video.currentTime} to skip at ${skipTime[0]}`); currentSkipInterval = setInterval(() => { + // Estimate delay, but only take the current time right after a change + // Current time remains the same for many "frames" on Firefox + if (utils.isFirefox() && !lastKnownVideoTime.fromPause && startWaitingForReportedTimeToChange + && reportedVideoTimeAtStart !== video.currentTime) { + startWaitingForReportedTimeToChange = false; + const delay = getVirtualTime() - video.currentTime; + if (delay > 0) lastKnownVideoTime.approximateDelay = delay; + } + const intervalDuration = performance.now() - startIntervalTime; - if (intervalDuration >= delayTime || video.currentTime >= skipTime[0]) { + if (intervalDuration + skipBuffer * 1000 >= delayTime || video.currentTime >= skipTime[0]) { clearInterval(currentSkipInterval); if (!utils.isFirefox() && !video.muted) { // Workaround for more accurate skipping on Chromium @@ -716,7 +732,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: video.muted = false; } - skippingFunction(Math.max(video.currentTime, startVideoTime + video.playbackRate * intervalDuration / 1000)); + skippingFunction(Math.max(video.currentTime, startVideoTime + video.playbackRate * Math.max(delayTime, intervalDuration) / 1000)); } }, 1); } else { @@ -729,11 +745,11 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: } function getVirtualTime(): number { - const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime ? + const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime !== null ? (performance.now() - lastKnownVideoTime.preciseTime) * video.playbackRate / 1000 + lastKnownVideoTime.videoTime : null); - if (Config.config.useVirtualTime && !utils.isFirefox() && !isSafari() && virtualTime - && Math.abs(virtualTime - video.currentTime) < 0.6 && video.currentTime !== 0) { + if (Config.config.useVirtualTime && !isSafari() && virtualTime + && Math.abs(virtualTime - video.currentTime) < 0.2 && video.currentTime !== 0) { return virtualTime; } else { return video.currentTime; @@ -878,13 +894,15 @@ function setupVideoListeners() { } }); video.addEventListener('seeking', () => { + lastKnownVideoTime.fromPause = false; + if (!video.paused){ // Reset lastCheckVideoTime lastCheckTime = Date.now(); lastCheckVideoTime = video.currentTime; updateVirtualTime(); - lastTimeFromWaitingEvent = null; + clearWaitingTime(); startSponsorSchedule(); } else { @@ -897,36 +915,38 @@ function setupVideoListeners() { }); video.addEventListener('ratechange', () => { updateVirtualTime(); - lastTimeFromWaitingEvent = null; + clearWaitingTime(); startSponsorSchedule(); }); // Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740) video.addEventListener('videoSpeed_ratechange', () => { updateVirtualTime(); - lastTimeFromWaitingEvent = null; + clearWaitingTime(); startSponsorSchedule(); }); - const paused = () => { + const stoppedPlayback = () => { // Reset lastCheckVideoTime lastCheckVideoTime = -1; lastCheckTime = 0; - lastKnownVideoTime = { - videoTime: null, - preciseTime: null - } - lastTimeFromWaitingEvent = video.currentTime; + lastKnownVideoTime.videoTime = null; + lastKnownVideoTime.preciseTime = null; + updateWaitingTime(); cancelSponsorSchedule(); }; - video.addEventListener('pause', () => paused()); + video.addEventListener('pause', () => { + lastKnownVideoTime.fromPause = true; + + stoppedPlayback(); + }); video.addEventListener('waiting', () => { logDebug("[SB] Not skipping due to buffering"); startedWaiting = true; - paused(); + stoppedPlayback(); }); startSponsorSchedule(); @@ -934,10 +954,43 @@ function setupVideoListeners() { } function updateVirtualTime() { - lastKnownVideoTime = { - videoTime: video.currentTime, - preciseTime: performance.now() - }; + if (currentVirtualTimeInterval) clearInterval(currentVirtualTimeInterval); + + lastKnownVideoTime.videoTime = video.currentTime; + lastKnownVideoTime.preciseTime = performance.now(); + + // If on Firefox, wait for the second time change (time remains fixed for many "frames" for privacy reasons) + if (utils.isFirefox()) { + let count = 0; + let lastTime = lastKnownVideoTime.videoTime; + if (lastKnownVideoTime.fromPause) { + currentVirtualTimeInterval = setInterval(() => { + if (lastTime !== video.currentTime) { + count++; + lastTime = video.currentTime; + } + + if (count > 1) { + const delay = lastKnownVideoTime.fromPause && lastKnownVideoTime.approximateDelay ? + lastKnownVideoTime.approximateDelay : 0; + + lastKnownVideoTime.videoTime = video.currentTime + delay; + lastKnownVideoTime.preciseTime = performance.now(); + + clearInterval(currentVirtualTimeInterval); + currentVirtualTimeInterval = null; + } + }, 1); + } + } +} + +function updateWaitingTime(): void { + lastTimeFromWaitingEvent = video.currentTime; +} + +function clearWaitingTime(): void { + lastTimeFromWaitingEvent = null; } function setupSkipButtonControlBar() { From ffc566c3bc11b2464fde167683db34207ce8713b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 00:24:23 +0000 Subject: [PATCH 050/318] Update Invidious List --- ci/invidiouslist.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/invidiouslist.json b/ci/invidiouslist.json index 69b6a845..13560edb 100644 --- a/ci/invidiouslist.json +++ b/ci/invidiouslist.json @@ -1 +1 @@ -["inv.cthd.icu","inv.riverside.rocks","invidio.xamh.de","invidious.kavin.rocks","invidious.namazso.eu","invidious.osi.kr","invidious.snopyta.org","vid.puffyan.us","yewtu.be","youtube.076.ne.jp","yt.artemislena.eu"] \ No newline at end of file +["inv.bp.projectsegfau.lt","inv.odyssey346.dev","inv.riverside.rocks","inv.vern.cc","invidio.xamh.de","invidious.baczek.me","invidious.esmailelbob.xyz","invidious.flokinet.to","invidious.namazso.eu","invidious.nerdvpn.de","invidious.rhyshl.live","invidious.sethforprivacy.com","invidious.slipfox.xyz","invidious.snopyta.org","invidious.tiekoetter.com","invidious.weblibre.org","vid.puffyan.us","y.com.sb","yewtu.be","yt.artemislena.eu"] \ No newline at end of file From 8c185d4b5e90add76abab31473e068bd35d66c76 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sun, 4 Dec 2022 15:06:16 -0500 Subject: [PATCH 051/318] Add another key to config diff whitelist --- webpack/configDiffPlugin.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webpack/configDiffPlugin.js b/webpack/configDiffPlugin.js index 43456e87..ce5e5c5a 100644 --- a/webpack/configDiffPlugin.js +++ b/webpack/configDiffPlugin.js @@ -10,7 +10,7 @@ function partialDeepEquals (actual, expected, logger) { // loop over key, value of expected let failed = false; for (const [ key, value ] of Object.entries(expected)) { - if (key === "serverAddress" || key === "testingServerAddress" || key === "serverAddressComment") continue + if (key === "serverAddress" || key === "testingServerAddress" || key === "serverAddressComment" || key === "freeChapterAccess") continue // if value is object, recurse const actualValue = actual?.[key] if (typeof value !== "string" && Array.isArray(value)) { @@ -63,4 +63,4 @@ class configDiffPlugin { } } -module.exports = configDiffPlugin; \ No newline at end of file +module.exports = configDiffPlugin; From 7be7b12d52b872db80bb952dbed0ddcabcf329d1 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 4 Dec 2022 21:55:46 -0500 Subject: [PATCH 052/318] Generated chapters can now start after 0 seconds, so allow importing them --- src/utils/pageUtils.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index 6b262236..42766fef 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -68,6 +68,8 @@ export function getHashParams(): Record { export function getExistingChapters(currentVideoID: VideoID, duration: number): SponsorTime[] { const chaptersBox = document.querySelector("ytd-macro-markers-list-renderer"); + const title = document.querySelector("[target-id=engagement-panel-macro-markers-auto-chapters] #title-text"); + if (title?.textContent?.includes("Key moment")) return []; const chapters: SponsorTime[] = []; // .ytp-timed-markers-container indicates that key-moments are present, which should not be divided @@ -103,11 +105,6 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number): } } - if (chapters[0] && chapters[0].segment[0] !== 0) { - // This is key moments instead of chapters, don't import as they are not full sections - return []; - } - return chapters; } From f66d7a9547ce99ce89a51890d441cb593a97a33a Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 9 Dec 2022 22:11:57 -0500 Subject: [PATCH 053/318] Call whitelist check if not still waiting for channel id in window listener --- src/content.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/content.ts b/src/content.ts index f1495e7a..98bf142d 100644 --- a/src/content.ts +++ b/src/content.ts @@ -120,6 +120,7 @@ let lastCheckVideoTime = -1; //is this channel whitelised from getting sponsors skipped let channelWhitelisted = false; +let waitingForChannelID = false; let previewBar: PreviewBar = null; // Skip to highlight button @@ -1470,6 +1471,7 @@ async function whitelistCheck() { const whitelistedChannels = Config.config.whitelistedChannels; try { + waitingForChannelID = true; await utils.wait(() => channelIDInfo.status === ChannelIDStatus.Found, 6000, 20); // If found, continue on, it was set by the listener @@ -1494,6 +1496,8 @@ async function whitelistCheck() { } } + waitingForChannelID = false; + //see if this is a whitelisted channel if (whitelistedChannels != undefined && channelIDInfo.status === ChannelIDStatus.Found && whitelistedChannels.includes(channelIDInfo.id)) { @@ -2392,6 +2396,10 @@ function windowListenerHandler(event: MessageEvent): void { id: data.channelID, status: ChannelIDStatus.Found }; + + if (!waitingForChannelID) { + whitelistCheck(); + } } videoIDChange(data.videoID); From bd3cdb98acbfcb17463dbe0e4ca5891f5749af8e Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 11:58:10 -0500 Subject: [PATCH 054/318] Fix lots of chapters freezing the browser --- src/js-components/previewBar.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 677b998f..7b93f67e 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -581,6 +581,7 @@ class PreviewBar { for (const mutation of mutations) { if (mutation.type === "childList") { this.update(); + break; } } From e5794e6685f2bf72f20bcd980cd422e6ec4a4c1f Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 12:04:31 -0500 Subject: [PATCH 055/318] Fix hover text alignment issue --- src/js-components/previewBar.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 7b93f67e..9d4d634b 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -171,6 +171,8 @@ class PreviewBar { // To prevent offset issue this.categoryTooltip.style.right = titleTooltip.style.right; this.chapterTooltip.style.right = titleTooltip.style.right; + this.categoryTooltip.style.textAlign = titleTooltip.style.textAlign; + this.chapterTooltip.style.textAlign = titleTooltip.style.textAlign; } }); From 283ec503880a07f3e2636e41e489392f5e428bda Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 12:51:36 -0500 Subject: [PATCH 056/318] Hide original chapter if similar in name --- src/js-components/previewBar.ts | 23 ++++++++++++++++++++--- src/utils/exporter.ts | 5 +++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 9d4d634b..b3eab7a2 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -10,6 +10,7 @@ import { ChapterVote } from "../render/ChapterVote"; import { ActionType, Category, SegmentContainer, SponsorHideType, SponsorSourceType, SponsorTime } from "../types"; import { partition } from "../utils/arrayUtils"; import { DEFAULT_CATEGORY, shortCategoryName } from "../utils/categoryUtils"; +import { normalizeChapterName } from "../utils/exporter"; import { GenericUtils } from "../utils/genericUtils"; import { findValidElement } from "../utils/pageUtils"; @@ -92,6 +93,7 @@ class PreviewBar { this.chapterTooltip.className = "ytp-tooltip-title sponsorCategoryTooltip"; const tooltipTextWrapper = document.querySelector(".ytp-tooltip-text-wrapper"); + const originalTooltip = tooltipTextWrapper.querySelector(".ytp-tooltip-title:not(.sponsorCategoryTooltip)") as HTMLElement; if (!tooltipTextWrapper || !tooltipTextWrapper.parentElement) return; // Grab the tooltip from the text wrapper as the tooltip doesn't have its classes on init @@ -118,8 +120,9 @@ class PreviewBar { const observer = new MutationObserver((mutations) => { if (!mouseOnSeekBar || !this.categoryTooltip || !this.categoryTooltipContainer) return; - // If the mutation observed is only for our tooltip text, ignore - if (mutations.some((mutation) => (mutation.target as HTMLElement).classList.contains("sponsorCategoryTooltip"))) { + // Only care about mutations to time tooltip + console.log(mutations) + if (!mutations.some((mutation) => (mutation.target as HTMLElement).classList.contains("ytp-tooltip-text"))) { return; } @@ -138,7 +141,11 @@ class PreviewBar { if (timeInSeconds !== null) break; } - if (timeInSeconds === null) return; + if (timeInSeconds === null) { + originalTooltip.style.removeProperty("display"); + + return; + } // Find the segment at that location, using the shortest if multiple found const [normalSegments, chapterSegments] = @@ -153,6 +160,7 @@ class PreviewBar { if (mainSegment === null && secondarySegment === null) { this.categoryTooltipContainer.classList.remove(TOOLTIP_VISIBLE_CLASS); + originalTooltip.style.removeProperty("display"); } else { this.categoryTooltipContainer.classList.add(TOOLTIP_VISIBLE_CLASS); if (mainSegment !== null && secondarySegment !== null) { @@ -164,6 +172,15 @@ class PreviewBar { this.setTooltipTitle(mainSegment, this.categoryTooltip); this.setTooltipTitle(secondarySegment, this.chapterTooltip); + if (normalizeChapterName(originalTooltip.textContent) === normalizeChapterName(this.categoryTooltip.textContent) + || normalizeChapterName(originalTooltip.textContent) === normalizeChapterName(this.chapterTooltip.textContent)) { + console.log("Hiding original tooltip") + if (originalTooltip.style.display !== "none") originalTooltip.style.display = "none"; + noYoutubeChapters = true; + } else if (originalTooltip.style.display === "none") { + originalTooltip.style.removeProperty("display"); + } + // Used to prevent overlapping this.categoryTooltip.classList.toggle("ytp-tooltip-text-no-title", noYoutubeChapters); this.chapterTooltip.classList.toggle("ytp-tooltip-text-no-title", noYoutubeChapters); diff --git a/src/utils/exporter.ts b/src/utils/exporter.ts index 8c765a34..7d3f5ee2 100644 --- a/src/utils/exporter.ts +++ b/src/utils/exporter.ts @@ -85,3 +85,8 @@ export function exportTimesAsHashParam(segments: SponsorTime[]): string { return `#segments=${JSON.stringify(hashparamSegments)}`; } + + +export function normalizeChapterName(description: string): string { + return description.toLowerCase().replace(/\.|:|-/g, "").replace(/\s+/g, " "); +} \ No newline at end of file From 41a25720d0db6cfd304a89f74d5fb9809063475c Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 13:19:37 -0500 Subject: [PATCH 057/318] Caching for get smallest segment Hover previews --- src/js-components/previewBar.ts | 38 ++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index b3eab7a2..f13a93cf 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -38,6 +38,10 @@ class PreviewBar { categoryTooltip?: HTMLDivElement; categoryTooltipContainer?: HTMLElement; chapterTooltip?: HTMLDivElement; + lastSmallestSegment: Record = {}; parent: HTMLElement; onMobileYouTube: boolean; @@ -121,7 +125,6 @@ class PreviewBar { if (!mouseOnSeekBar || !this.categoryTooltip || !this.categoryTooltipContainer) return; // Only care about mutations to time tooltip - console.log(mutations) if (!mutations.some((mutation) => (mutation.target as HTMLElement).classList.contains("ytp-tooltip-text"))) { return; } @@ -151,8 +154,8 @@ class PreviewBar { const [normalSegments, chapterSegments] = partition(this.segments.filter((s) => s.source !== SponsorSourceType.YouTube), (segment) => segment.actionType !== ActionType.Chapter); - let mainSegment = this.getSmallestSegment(timeInSeconds, normalSegments); - let secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments); + let mainSegment = this.getSmallestSegment(timeInSeconds, normalSegments, "normal"); + let secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments, "chapter"); if (mainSegment === null && secondarySegment !== null) { mainSegment = secondarySegment; secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments.filter((s) => s !== secondarySegment)); @@ -174,7 +177,6 @@ class PreviewBar { if (normalizeChapterName(originalTooltip.textContent) === normalizeChapterName(this.categoryTooltip.textContent) || normalizeChapterName(originalTooltip.textContent) === normalizeChapterName(this.chapterTooltip.textContent)) { - console.log("Hiding original tooltip") if (originalTooltip.style.display !== "none") originalTooltip.style.display = "none"; noYoutubeChapters = true; } else if (originalTooltip.style.display === "none") { @@ -920,11 +922,18 @@ class PreviewBar { return this.videoDuration * (showLarger ? 0.006 : 0.003); } - private getSmallestSegment(timeInSeconds: number, segments: PreviewBarSegment[]): PreviewBarSegment | null { - let segment: PreviewBarSegment | null = null; - let currentSegmentLength = Infinity; + // Name used for cache + private getSmallestSegment(timeInSeconds: number, segments: PreviewBarSegment[], name?: string): PreviewBarSegment | null { + const proposedIndex = name ? this.lastSmallestSegment[name]?.index : null; + const startSearchIndex = proposedIndex && segments[proposedIndex] === this.lastSmallestSegment[name].segment ? proposedIndex : 0; + const direction = startSearchIndex > 0 && timeInSeconds < this.lastSmallestSegment[name].segment.segment[0] ? -1 : 1; - for (const seg of segments) { // + let segment: PreviewBarSegment | null = null; + let index = -1; + let currentSegmentLength = Infinity; + + for (let i = startSearchIndex; i < segments.length && i >= 0; i += direction) { + const seg = segments[i]; const segmentLength = seg.segment[1] - seg.segment[0]; const minSize = this.getMinimumSize(seg.showLarger); @@ -934,8 +943,21 @@ class PreviewBar { if (segmentLength < currentSegmentLength) { currentSegmentLength = segmentLength; segment = seg; + index = i; } } + + if ((direction === 1 && timeInSeconds > seg.segment[1]) + || (direction === -1 && timeInSeconds < seg.segment[0])) { + break; + } + } + + if (segment) { + this.lastSmallestSegment[name] = { + index: index, + segment: segment + }; } return segment; From cf0e91c4ff1eb513bfca6743fc66a316b17fde6b Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 14:10:09 -0500 Subject: [PATCH 058/318] Use fast time to decimal for non display calculations --- src/js-components/previewBar.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index f13a93cf..6e91fc0e 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -531,7 +531,7 @@ class PreviewBar { const nextSegment = segments[index + 1]; const nextTime = nextSegment ? nextSegment.segment[0] : this.videoDuration; const lastTime = result[result.length - 1]?.segment[1] || segment.segment[1]; - if (this.intervalToDecimal(lastTime, nextTime) > MIN_CHAPTER_SIZE) { + if (this.fastIntervalToDecimal(lastTime, nextTime) > MIN_CHAPTER_SIZE) { result.push({ segment: [lastTime, nextTime], originalDuration: 0, @@ -866,7 +866,7 @@ class PreviewBar { } private chapterGroupFilter(segment: SegmentContainer): boolean { - return segment.segment.length === 2 && this.intervalToDecimal(segment.segment[0], segment.segment[1]) > MIN_CHAPTER_SIZE; + return segment.segment.length === 2 && this.fastIntervalToDecimal(segment.segment[0], segment.segment[1]) > MIN_CHAPTER_SIZE; } intervalToPercentage(startTime: number, endTime: number) { @@ -877,6 +877,10 @@ class PreviewBar { return (this.timeToDecimal(endTime) - this.timeToDecimal(startTime)); } + fastIntervalToDecimal(startTime: number, endTime: number) { + return (this.fastTimeToDecimal(endTime) - this.fastTimeToDecimal(startTime)); + } + timeToPercentage(time: number): string { return `${this.timeToDecimal(time) * 100}%` } @@ -912,6 +916,10 @@ class PreviewBar { } } + return this.fastTimeToDecimal(time); + } + + fastTimeToDecimal(time: number): number { return Math.min(1, time / this.videoDuration); } From f59665cccb7ecf3548f106eb638fff187221896a Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 14:21:25 -0500 Subject: [PATCH 059/318] Fix smallest segment cache --- src/js-components/previewBar.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 6e91fc0e..8ef7a81f 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -955,8 +955,7 @@ class PreviewBar { } } - if ((direction === 1 && timeInSeconds > seg.segment[1]) - || (direction === -1 && timeInSeconds < seg.segment[0])) { + if (direction === 1 && seg.segment[0] > timeInSeconds) { break; } } From a5d91c9b5756a0d7ba47822ee2fd9575c9ca7ee9 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 14:25:34 -0500 Subject: [PATCH 060/318] clarify comment --- src/js-components/previewBar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 8ef7a81f..6fe32dbb 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -930,7 +930,7 @@ class PreviewBar { return this.videoDuration * (showLarger ? 0.006 : 0.003); } - // Name used for cache + // Name parameter used for cache private getSmallestSegment(timeInSeconds: number, segments: PreviewBarSegment[], name?: string): PreviewBarSegment | null { const proposedIndex = name ? this.lastSmallestSegment[name]?.index : null; const startSearchIndex = proposedIndex && segments[proposedIndex] === this.lastSmallestSegment[name].segment ? proposedIndex : 0; From 7eb6b3a79d50cf1ab0c3dffaad093004381e9004 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 15:20:05 -0500 Subject: [PATCH 061/318] Don't regenerate groups if not needed --- src/js-components/previewBar.ts | 41 ++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 6fe32dbb..ec2ec1b4 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -62,6 +62,7 @@ class PreviewBar { originalChapterBar: HTMLElement; originalChapterBarBlocks: NodeListOf; chapterMargin: number; + lastRenderedSegments: PreviewBarSegment[]; unfilteredChapterGroups: ChapterGroup[]; chapterGroups: ChapterGroup[]; @@ -308,6 +309,8 @@ class PreviewBar { this.container.appendChild(bar); } + console.log(this.segments) + console.trace() this.createChaptersBar(this.segments.sort((a, b) => a.segment[0] - b.segment[0])); if (chapterChevron) { @@ -356,8 +359,10 @@ class PreviewBar { return; } - // Merge overlapping chapters - this.unfilteredChapterGroups = this.createChapterRenderGroups(segments); + if (segments !== this.lastRenderedSegments) { + // Merge overlapping chapters + this.unfilteredChapterGroups = this.createChapterRenderGroups(segments); + } if (segments.every((segments) => segments.source === SponsorSourceType.YouTube) || (!Config.config.renderSegmentsAsChapters @@ -368,24 +373,28 @@ class PreviewBar { return; } - const filteredSegments = segments?.filter((segment) => this.chapterFilter(segment)); - if (filteredSegments) { - let groups = this.unfilteredChapterGroups; - if (filteredSegments.length !== segments.length) { - groups = this.createChapterRenderGroups(filteredSegments); - } - this.chapterGroups = groups.filter((segment) => this.chapterGroupFilter(segment)); + if (segments !== this.lastRenderedSegments) { + this.lastRenderedSegments = segments; - if (groups.length !== this.chapterGroups.length) { - // Fix missing sections due to filtered segments - for (let i = 1; i < this.chapterGroups.length; i++) { - if (this.chapterGroups[i].segment[0] !== this.chapterGroups[i - 1].segment[1]) { - this.chapterGroups[i - 1].segment[1] = this.chapterGroups[i].segment[0] + const filteredSegments = segments?.filter((segment) => this.chapterFilter(segment)); + if (filteredSegments) { + let groups = this.unfilteredChapterGroups; + if (filteredSegments.length !== segments.length) { + groups = this.createChapterRenderGroups(filteredSegments); + } + this.chapterGroups = groups.filter((segment) => this.chapterGroupFilter(segment)); + + if (groups.length !== this.chapterGroups.length) { + // Fix missing sections due to filtered segments + for (let i = 1; i < this.chapterGroups.length; i++) { + if (this.chapterGroups[i].segment[0] !== this.chapterGroups[i - 1].segment[1]) { + this.chapterGroups[i - 1].segment[1] = this.chapterGroups[i].segment[0] + } } } + } else { + this.chapterGroups = this.unfilteredChapterGroups; } - } else { - this.chapterGroups = this.unfilteredChapterGroups; } if (!this.chapterGroups || this.chapterGroups.length <= 0) { From 3b776991a65dccbb9decd3484945ecc1d52f3a6c Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 15:46:29 -0500 Subject: [PATCH 062/318] Don't run some chapter init code when not necessary --- src/js-components/previewBar.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index ec2ec1b4..626c0979 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -309,8 +309,6 @@ class PreviewBar { this.container.appendChild(bar); } - console.log(this.segments) - console.trace() this.createChaptersBar(this.segments.sort((a, b) => a.segment[0] - b.segment[0])); if (chapterChevron) { @@ -359,7 +357,10 @@ class PreviewBar { return; } - if (segments !== this.lastRenderedSegments) { + const remakingBar = segments !== this.lastRenderedSegments; + if (remakingBar) { + this.lastRenderedSegments = segments; + // Merge overlapping chapters this.unfilteredChapterGroups = this.createChapterRenderGroups(segments); } @@ -373,9 +374,7 @@ class PreviewBar { return; } - if (segments !== this.lastRenderedSegments) { - this.lastRenderedSegments = segments; - + if (remakingBar) { const filteredSegments = segments?.filter((segment) => this.chapterFilter(segment)); if (filteredSegments) { let groups = this.unfilteredChapterGroups; @@ -453,7 +452,9 @@ class PreviewBar { } } - this.updateChapterAllMutation(this.originalChapterBar, this.progressBar, true); + if (remakingBar) { + this.updateChapterAllMutation(this.originalChapterBar, this.progressBar, true); + } } createChapterRenderGroups(segments: PreviewBarSegment[]): ChapterGroup[] { From 16581d39a496d5ebd425778cb558cc6f4c56f557 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 16:24:53 -0500 Subject: [PATCH 063/318] Reverse fast interval to decimal It doesn't work when there are imported chapters closely or identical to existing chapters. Causes bar to extend too far. --- src/js-components/previewBar.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 626c0979..3d26cbdd 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -541,7 +541,7 @@ class PreviewBar { const nextSegment = segments[index + 1]; const nextTime = nextSegment ? nextSegment.segment[0] : this.videoDuration; const lastTime = result[result.length - 1]?.segment[1] || segment.segment[1]; - if (this.fastIntervalToDecimal(lastTime, nextTime) > MIN_CHAPTER_SIZE) { + if (this.intervalToDecimal(lastTime, nextTime) > MIN_CHAPTER_SIZE) { result.push({ segment: [lastTime, nextTime], originalDuration: 0, @@ -876,7 +876,7 @@ class PreviewBar { } private chapterGroupFilter(segment: SegmentContainer): boolean { - return segment.segment.length === 2 && this.fastIntervalToDecimal(segment.segment[0], segment.segment[1]) > MIN_CHAPTER_SIZE; + return segment.segment.length === 2 && this.intervalToDecimal(segment.segment[0], segment.segment[1]) > MIN_CHAPTER_SIZE; } intervalToPercentage(startTime: number, endTime: number) { @@ -887,10 +887,6 @@ class PreviewBar { return (this.timeToDecimal(endTime) - this.timeToDecimal(startTime)); } - fastIntervalToDecimal(startTime: number, endTime: number) { - return (this.fastTimeToDecimal(endTime) - this.fastTimeToDecimal(startTime)); - } - timeToPercentage(time: number): string { return `${this.timeToDecimal(time) * 100}%` } @@ -926,10 +922,6 @@ class PreviewBar { } } - return this.fastTimeToDecimal(time); - } - - fastTimeToDecimal(time: number): number { return Math.min(1, time / this.videoDuration); } From 3e3059d79abd3e93f53bea607d061f4ca83141f7 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 16:58:40 -0500 Subject: [PATCH 064/318] Fix bar being too long due to time to decimal changing while remaking bar not true --- src/js-components/previewBar.ts | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 3d26cbdd..4842afc0 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -374,26 +374,24 @@ class PreviewBar { return; } - if (remakingBar) { - const filteredSegments = segments?.filter((segment) => this.chapterFilter(segment)); - if (filteredSegments) { - let groups = this.unfilteredChapterGroups; - if (filteredSegments.length !== segments.length) { - groups = this.createChapterRenderGroups(filteredSegments); - } - this.chapterGroups = groups.filter((segment) => this.chapterGroupFilter(segment)); + const filteredSegments = segments?.filter((segment) => this.chapterFilter(segment)); + if (filteredSegments) { + let groups = this.unfilteredChapterGroups; + if (filteredSegments.length !== segments.length) { + groups = this.createChapterRenderGroups(filteredSegments); + } + this.chapterGroups = groups.filter((segment) => this.chapterGroupFilter(segment)); - if (groups.length !== this.chapterGroups.length) { - // Fix missing sections due to filtered segments - for (let i = 1; i < this.chapterGroups.length; i++) { - if (this.chapterGroups[i].segment[0] !== this.chapterGroups[i - 1].segment[1]) { - this.chapterGroups[i - 1].segment[1] = this.chapterGroups[i].segment[0] - } + if (groups.length !== this.chapterGroups.length) { + // Fix missing sections due to filtered segments + for (let i = 1; i < this.chapterGroups.length; i++) { + if (this.chapterGroups[i].segment[0] !== this.chapterGroups[i - 1].segment[1]) { + this.chapterGroups[i - 1].segment[1] = this.chapterGroups[i].segment[0] } } - } else { - this.chapterGroups = this.unfilteredChapterGroups; } + } else { + this.chapterGroups = this.unfilteredChapterGroups; } if (!this.chapterGroups || this.chapterGroups.length <= 0) { From 8798dd29b86a8bf076958cee1ca909131ce4c918 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 11 Dec 2022 16:59:01 -0500 Subject: [PATCH 065/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index ee6aa22f..c930dd6b 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.8", + "version": "5.1.9", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From ab87afc82be6e3a84cd8ddfbc937a2144c6ee3ef Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sun, 11 Dec 2022 16:59:21 -0500 Subject: [PATCH 066/318] New Crowdin updates (#1580) --- public/_locales/bg/messages.json | 3 + public/_locales/cs/messages.json | 3 + public/_locales/de/messages.json | 5 +- public/_locales/es/messages.json | 3 + public/_locales/et/messages.json | 3 + public/_locales/fi/messages.json | 11 +- public/_locales/he/messages.json | 358 ++++++++++++++++++++++++---- public/_locales/id/messages.json | 250 ++++++++++++++++++- public/_locales/it/messages.json | 3 + public/_locales/ja/messages.json | 3 + public/_locales/ko/messages.json | 11 +- public/_locales/nl/messages.json | 3 + public/_locales/pl/messages.json | 6 + public/_locales/pt_PT/messages.json | 49 ++++ public/_locales/ru/messages.json | 3 + public/_locales/sk/messages.json | 172 +++++++++++++ public/_locales/sv/messages.json | 3 + public/_locales/tr/messages.json | 9 + public/_locales/zh_CN/messages.json | 60 +++++ 19 files changed, 902 insertions(+), 56 deletions(-) diff --git a/public/_locales/bg/messages.json b/public/_locales/bg/messages.json index 65bbcec1..1e4ee6b0 100644 --- a/public/_locales/bg/messages.json +++ b/public/_locales/bg/messages.json @@ -1249,5 +1249,8 @@ }, "segmentFetchFailureWarning": { "message": "Внимание: сървърът все още не е отговорил със сегменти. В действителност може да има вече изпратени сегменти в този видеоклип, но просто не сте ги получили поради проблеми със сървъра." + }, + "allowScrollingToEdit": { + "message": "Разрешаване на превъртане за редактиране на времената" } } diff --git a/public/_locales/cs/messages.json b/public/_locales/cs/messages.json index c4acb7cc..859aaa66 100644 --- a/public/_locales/cs/messages.json +++ b/public/_locales/cs/messages.json @@ -1249,5 +1249,8 @@ }, "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" } } diff --git a/public/_locales/de/messages.json b/public/_locales/de/messages.json index 038c354a..c5efb41e 100644 --- a/public/_locales/de/messages.json +++ b/public/_locales/de/messages.json @@ -524,7 +524,7 @@ "message": "Alle Einstellungen importieren/exportieren" }, "exportOptionsCopy": { - "message": "Bearbeiten/kopieren" + "message": "Bearbeiten/Kopieren" }, "exportOptionsDownload": { "message": "Als Datei speichern" @@ -1249,5 +1249,8 @@ }, "segmentFetchFailureWarning": { "message": "Warnung: Der Server hat noch nicht mit Segmenten geantwortet. Möglicherweise gibt es bereits Segmente zu diesem Video, aber du hast sie aufgrund von Problemen mit dem Server noch nicht erhalten." + }, + "allowScrollingToEdit": { + "message": "Scrollen zum Bearbeiten von Zeiten erlauben" } } diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json index 5ab39222..0eec5100 100644 --- a/public/_locales/es/messages.json +++ b/public/_locales/es/messages.json @@ -1249,5 +1249,8 @@ }, "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" } } diff --git a/public/_locales/et/messages.json b/public/_locales/et/messages.json index 85087478..85048c54 100644 --- a/public/_locales/et/messages.json +++ b/public/_locales/et/messages.json @@ -1152,5 +1152,8 @@ }, "segmentFetchFailureWarning": { "message": "Hoiatus: Server ei ole veel segmentidega vastanud. Sellel videol võivad juba olla saadetud segmendid, aga sa ei ole veel neid serveri vea tõttu saanud." + }, + "allowScrollingToEdit": { + "message": "Luba aegade muutmiseks kerimine" } } diff --git a/public/_locales/fi/messages.json b/public/_locales/fi/messages.json index e78b1c8f..7777dafb 100644 --- a/public/_locales/fi/messages.json +++ b/public/_locales/fi/messages.json @@ -241,7 +241,7 @@ "message": "Negatiivisesti äänestämäsi osiot pysyvät piilotettuina myös päivityksen jälkeen" }, "trackDownvotesWarning": { - "message": "Varoitus: Tämän poistaminen käytöstä poistaa kaikki aiemmin tallennetut alaäänet" + "message": "Varoitus: Tämän käytöstä poisto poistaa kaikki aiemmat negatiiviset äänet" }, "enableQueryByHashPrefix": { "message": "Kysely tiiviste-etuliittellä" @@ -890,7 +890,7 @@ "message": "Virheellinen/väärä aika" }, "incorrectVote": { - "message": "Väärä" + "message": "Virheellinen" }, "harmfulVote": { "message": "Haitallinen", @@ -942,7 +942,7 @@ "message": "Piilota ikuisesti" }, "warningChatInfo": { - "message": "Huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahalleen tehtyjä" + "message": "Huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole haitallisia" }, "warningTitle": { "message": "Sait varoituksen" @@ -1100,7 +1100,7 @@ "description": "Option label" }, "unbind": { - "message": "Poista kytkös", + "message": "Poista liitos", "description": "Unbind keyboard shortcut" }, "notSet": { @@ -1249,5 +1249,8 @@ }, "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" } } diff --git a/public/_locales/he/messages.json b/public/_locales/he/messages.json index c420fefc..c317f1b9 100644 --- a/public/_locales/he/messages.json +++ b/public/_locales/he/messages.json @@ -31,6 +31,13 @@ "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": "הצבע לדיווח הזה" }, @@ -95,7 +102,7 @@ "message": "לא נמצא סרטון יוטיוב.\nאם זה לא נכון, רענן את הכרטיסייה." }, "refreshSegments": { - "message": "רענן מקטעים" + "message": "ריענון מקטעים" }, "success": { "message": "הצלחה!" @@ -109,6 +116,9 @@ "connectionError": { "message": "התקבלה שגיאת חיבור. קוד השגיאה: " }, + "segmentsStillLoading": { + "message": "מקטע עדיין נטען..." + }, "clearTimes": { "message": "נקה מקטעים" }, @@ -118,9 +128,15 @@ "closePopup": { "message": "סגור חלון" }, + "closeIcon": { + "message": "סגירת סמליל" + }, "SubmitTimes": { "message": "הגש מקטעים" }, + "sortSegments": { + "message": "מיון מקטעים" + }, "submitCheck": { "message": "אתה בטוח שאתה רוצה להזין את זה?" }, @@ -153,43 +169,46 @@ "message": "רמז: אתה יכול להגדיר קיצורים מהמקלדת דרך תפריט אפשרויות כדי להזין זמנים" }, "clearTimesButton": { - "message": "נקה זמנים" + "message": "ניקוי זמנים" }, "submitTimesButton": { - "message": "הגש זמנים" + "message": "הגשת זמנים" }, "publicStats": { - "message": "זה משומש בעמוד הסטטים הפומביים כדי להראות כמה תרמת. צפה בזה" + "message": "זה משמש בדף הסטטיסטיקה הציבורי כדי להראות כמה תרמת. ניתן לצפות בזה" }, "Username": { "message": "שם משתמש" }, "setUsername": { - "message": "הגדר שם משתמש" + "message": "הגדרת שם משתמש" }, "copyPublicID": { - "message": "העתק קוד משתמש פומבי" + "message": "העתקת מזהה משתמש פומבי" + }, + "copySegmentID": { + "message": "העתקת מזהה מקטע" }, "discordAdvert": { - "message": "הצטרף לשרת הדיסקורד הרשמי כדי לביא הצעות וחוות דעת!" + "message": "הצטרפות לשרת הדיסקורד הרשמי כדי לביא הצעות וחוות דעת!" }, "hideThis": { - "message": "הסתר" + "message": "להסתיר את זה" }, "Options": { "message": "אפשרויות" }, "showButtons": { - "message": "הראה כפתורים על הנגן של יוטיוב" + "message": "הצגת כפתורים על הנגן של יוטיוב" }, "hideButtons": { - "message": "הסתר כפתורים על הנגן של יוטיוב" + "message": "הסתרת כפתורים על הנגן של יוטיוב" }, "hideButtonsDescription": { "message": "זה מחביא את הכפתורים שמופיעים בנגן YouTube להגיש מקטעי דילוג." }, "showSkipButton": { - "message": "השאר את כפתור הדילוג לשיא הסרטון על הנגן באופן קבוע" + "message": "השארת כפתור הדילוג להדגשה על הנגן" }, "showInfoButton": { "message": "הראה כפתור מידע בנגן YouTube" @@ -198,16 +217,16 @@ "message": "החבא כפתור מידע בנגן YouTube" }, "autoHideInfoButton": { - "message": "הסתר אוטומטית כפתורי אינפורמציה" + "message": "הסתרה אוטומטית של כפתורי אינפורמציה" }, "hideDeleteButton": { - "message": "הסתר כפתור מחיקה על הנגן של יוטיוב" + "message": "הסתרת כפתור מחיקה על הנגן של יוטיוב" }, "showDeleteButton": { - "message": "הצג כפתור מחיקה על הנגן של יוטיוב" + "message": "הצגת כפתור מחיקה על הנגן של יוטיוב" }, "whatViewTracking": { - "message": "הפיצ'ר הזה עוקב אחרי מקטעים שדילגת עליהם בכדי ליידע משתמשים אחרים כמה ההגשות שלך עזרו לאחרים ושומשו כמטריקה יחד עם ההצבעות בעד בכדי להבטיח שלא ייכנס ספאם אל תוך המערכת. ההרחבה שולחת הודעה לשרת בכל פעם שאתה מדלג על מקטע. התקווה היא שרוב האנשים לא ישנו את ההגדרה הזו כדי שהמספרי צפייה יהיו מדוייקים :)" + "message": "תכונה זו עוקבת אחר אילו מקטעים דילגת כדי לאפשר למשתמשים לדעת עד כמה ההגשה שלהם עזרה לאחרים והשתמשה כמדד יחד עם הצבעות בעד כדי להבטיח שספאם לא ייכנס למסד הנתונים. התוסף שולח הודעה לשרת בכל פעם שאתה מדלג על קטע. אני מקווה שרוב האנשים לא ישנו את ההגדרה הזו כדי שמספרי התצוגה יהיו מדויקים. :)" }, "website": { "message": "אתר", @@ -221,22 +240,66 @@ "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." }, + "502": { + "message": "נראה שהשרת עמוס יתר על המידה. יש לנסות שוב בעוד מספר שניות." + }, "errorCode": { "message": "קוד שגיאה: " }, "skip": { - "message": "דלג" + "message": "דילוג" }, "mute": { - "message": "השתק" + "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": "הודעת שמע בעת דילוג" + }, + "youHaveSkipped": { + "message": "דילגת " + }, "minLower": { "message": "דקה" }, @@ -266,35 +329,38 @@ "add": { "message": "הוסף" }, + "showUploadButton": { + "message": "הצגת כפתור העלאה" + }, "save": { - "message": "שמור" + "message": "שמירה" }, "reset": { - "message": "אתחל" + "message": "איתחול" }, "exportOptionsCopy": { - "message": "ערוך/העתק" + "message": "עריכה/העתקה" }, "exportOptionsDownload": { - "message": "שמור לקובץ" + "message": "שמירה לקובץ" }, "exportOptionsUpload": { - "message": "טען מקובץ" + "message": "טעינה מקובץ" }, "setOptions": { - "message": "הגדר אפשרויות" + "message": "הגדרת אפשרויות" }, "confirmNoticeTitle": { - "message": "הגש מקטע" + "message": "הגשת מקטע" }, "submit": { - "message": "הגש" + "message": "הגשה" }, "cancel": { "message": "ביטול" }, "delete": { - "message": "מחק" + "message": "מחיקה" }, "preview": { "message": "תצוגה מקדימה" @@ -303,7 +369,7 @@ "message": "לא מוגש" }, "inspect": { - "message": "סקור" + "message": "סקירה" }, "edit": { "message": "עריכה" @@ -312,12 +378,19 @@ "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_filler_short": { + "message": "מסנן" + }, "category_music_offtopic": { "message": "מוזיקה: קטעים ללא מוזיקה" }, @@ -327,17 +400,29 @@ "category_poi_highlight": { "message": "קטע חשוב" }, + "category_chapter": { + "message": "פרק" + }, "autoSkip": { "message": "דילוג אוטומטי" }, "manualSkip": { - "message": "דלג ידנית" + "message": "דילוג ידני" }, "showOverlay": { - "message": "הראה בטיימליין" + "message": "הראה בשורת חיפוש" + }, + "disable": { + "message": "מושבת" }, "showOverlay_POI": { - "message": "הראה בטיימליין" + "message": "הראה בשורת חיפוש" + }, + "showOverlay_full": { + "message": "הצגת תוית" + }, + "showOverlay_chapter": { + "message": "הצגת פרקים" }, "category": { "message": "קטגוריה" @@ -353,16 +438,23 @@ "message": "עוד קטגוריות" }, "chooseACategory": { - "message": "בחר קטגוריה" + "message": "בחירת קטגוריה" }, "bracketEnd": { "message": "(סוף)" }, + "End": { + "message": "סוף", + "description": "Button that skips to the end of a segment" + }, "downvoteDescription": { "message": "זמן שגוי/לא נכון" }, + "incorrectVote": { + "message": "שגוי" + }, "incorrectCategory": { - "message": "שנה קטגוריה" + "message": "שינוי קטגוריה" }, "multipleSegments": { "message": "מספר מקטעים" @@ -389,22 +481,34 @@ "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": "הסתר לעד" + "message": "הסתרה לעד" + }, + "questionButton": { + "message": "יש לי שאלה נוספת" + }, + "warningConfirmButton": { + "message": "הבנתי את הסיכונים" + }, + "warningError": { + "message": "שגיאה בעת ניסיון לאשר אזהרה:" }, "Donate": { - "message": "תרום" + "message": "תרומה" }, "considerDonating": { "message": "עזרו לממן את הפיתוח" }, "hideDonationLink": { - "message": "הסתר כפתור תרומה" + "message": "הסתרת כפתור תרומה" + }, + "darkModeOptionsPage": { + "message": "מצב כהה בדף האפשרויות" }, "helpPageThanksForInstalling": { "message": "תודה שהתקנת את ספונסרבלוק." }, "helpPageReviewOptions": { - "message": "אנא סקור את האפשרויות הבאות" + "message": "נא לסקור את האפשרויות הבאות" }, "helpPageHowSkippingWorks": { "message": "כיצד דילוג עובד" @@ -433,15 +537,39 @@ "LearnMore": { "message": "למידע נוסף" }, + "FullDetails": { + "message": "פרטים מלאים" + }, + "CopyDownvoteButtonInfo": { + "message": "הצבעה שלילית ויצירת עותק מקומי שניתן לשלוח מחדש" + }, + "OpenCategoryWikiPage": { + "message": "פתיחת דף הוויקי של קטגוריה זו." + }, "CopyAndDownvote": { - "message": "העתק ועשה דיסלייק" + "message": "העתקה ודירוג שלילי" }, "ContinueVoting": { - "message": "המשך להצביע" + "message": "המשך הצבעה" }, "ChangeCategoryTooltip": { "message": "זה מיידית ישפיע על כל המקטעים שלך" }, + "downvote": { + "message": "דירוג שלילי" + }, + "upvote": { + "message": "דירוג חיובי" + }, + "hideSegment": { + "message": "הסתרת מקטע" + }, + "skipSegment": { + "message": "דילוכ מקטע" + }, + "playChapter": { + "message": "הפעלת פרק" + }, "SponsorTimeEditScrollNewFeature": { "message": "השתמש בגלגלת בזמן שהעכבר מעל הזמן בשלב העריכה על מנת לשנות את הזמן יותר מהר. שילוב של הלחצן Ctrl/Shift יכולים לשנות את מהירות השינוי." }, @@ -449,11 +577,11 @@ "message": "חדש! ראה מתי וידאו בשלמותו הוא פרסומת או פרסום עצמי" }, "dayAbbreviation": { - "message": "ימים", + "message": "י", "description": "100d" }, "hourAbbreviation": { - "message": "שעות", + "message": "ש'", "description": "100h" }, "optionsTabBehavior": { @@ -472,6 +600,18 @@ "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": "לא הוגדר" }, @@ -480,5 +620,143 @@ }, "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": "הסתרת אפשרויות שאינן זמינות ללא תשלום נוסף" + }, + "chooseACountry": { + "message": "בחירת מדינה" + }, + "noDiscount": { + "message": "לא נמצאה זכאות להנחה" + }, + "discountLink": { + "message": "קישור להנחה (ראה מחיר ורוד)" + }, + "selectYourCountry": { + "message": "בחירת מדינתך" + }, + "alreadyDonated": { + "message": "אם תרמת סכום כלשהו בעבר, ניתן לממש גישה בחינם באמצעות דואר אלקטרוני:", + "description": "After the colon is an email address" + }, + "cantAfford": { + "message": "אם אינך יכול להרשות לעצמך לרכוש רישיון, יש ללחוץ {here} כדי לראות אם קיימת זכאות להנחה", + "description": "Keep the curly braces. The word 'here' should be translated as well." + }, + "patreonSignIn": { + "message": "כניסה באמצעות Patreon" + }, + "redeem": { + "message": "מימוש" + }, + "joinOnPatreon": { + "message": "מינוי באמצעות Patreon" + }, + "oneTimePurchase": { + "message": "רכישה חד פעמית" + }, + "enterLicenseKey": { + "message": "הזנת מפתח רישיון" + }, + "chaptersPage1": { + "message": "התכונה חסימת פרקים במקור המונים זמינה רק לאנשים שרוכשים רישיון, או לאנשים שקיבלו גישה בחינם עקב תרומותיהם בעבר" + }, + "chaptersPage2": { + "message": "הערה: ההרשאה להגשת פרקים עדיין מבוססת על מוניטין מחושב. רכישת רישיון מאפשרת לך לראות רק פרקים שהוגשו על ידי אחרים", + "description": "On the chapters page for getting access to the paid chapters feature" + }, + "chapterNewFeature": { + "message": "תכונה חדשה: פרקים מותאמים אישית ממקור המונים. אלו הם מקטעים בעלי שמות מותאמים אישית בסרטונים שניתן לערום כדי לקבל יותר ויותר דיוק. רכישת רישיון לצפייה בפרקים שנשלחו בסרטון זה כגון: ", + "description": "After the comma, a list of chapters for this video will appear" + }, + "chapterNewFeature2": { + "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": "אזהרה: השרת עדיין לא הגיב עם מקטעים. ייתכן שלמעשה יש מקטעים בסרטון הזה שכבר נשלחו אבל פשוט לא קיבלת אותם בגלל בעיות בשרת." } } diff --git a/public/_locales/id/messages.json b/public/_locales/id/messages.json index 8215b6a4..6c7241d7 100644 --- a/public/_locales/id/messages.json +++ b/public/_locales/id/messages.json @@ -25,6 +25,19 @@ "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" + }, "upvoteButtonInfo": { "message": "Upvote submisi ini" }, @@ -103,6 +116,9 @@ "connectionError": { "message": "Kesalahan koneksi terjadi. Kode kesalahan: " }, + "segmentsStillLoading": { + "message": "Segmen masih dimuat..." + }, "clearTimes": { "message": "Hapus Segmen" }, @@ -112,9 +128,15 @@ "closePopup": { "message": "Tutup Popup" }, + "closeIcon": { + "message": "Tutup Ikon" + }, "SubmitTimes": { "message": "Kirim Segmen" }, + "sortSegments": { + "message": "Urutkan Segmen" + }, "submitCheck": { "message": "Apakah anda yakin ingin mengirim ini?" }, @@ -233,6 +255,12 @@ "whatRefetchWhenNotFound": { "message": "Jika ini merupakan video baru, dan tidak ada segmen yang ditemukan, SponsorBlock akan terus merefetch setiap beberapa menit saat anda menonton." }, + "enableShowCategoryWithoutPermission": { + "message": "Tampilkan kategori di dalam menu submisi bahkan tanpa izin submisi" + }, + "whatShowCategoryWithoutPermission": { + "message": "Beberapa kategori memerlukan izin untuk mengirim karena persyaratan reputasi minimum" + }, "showNotice": { "message": "Tampilkan Pemberitahuan Lagi" }, @@ -243,19 +271,19 @@ "message": "Tampilkan Bantuan Kategori" }, "noticeVisibilityMode0": { - "message": "Lewati maklumat ukuran penuh" + "message": "Pemberitahuan Lewati Ukuran Penuh" }, "noticeVisibilityMode1": { - "message": "Maklumat lewati kecil untuk lewati otomatis" + "message": "Pemberitahuan Lewati Kecil untuk Lewati Otomatis" }, "noticeVisibilityMode2": { - "message": "Lewati semua maklumat kecil" + "message": "Semua Pemberitahuan Lewati Kecil" }, "noticeVisibilityMode3": { - "message": "Pudar maklumat lewati untuk semua lewati otomatis" + "message": "Pemberitahuan Lewati Pudar untuk Lewati Otomatis" }, "noticeVisibilityMode4": { - "message": "Lewati semua maklumat pudar" + "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.", @@ -289,6 +317,14 @@ "message": "Kirim segmen", "description": "Keybind label" }, + "nextChapterKeybind": { + "message": "Bab selanjutnya", + "description": "Keybind label" + }, + "previousChapterKeybind": { + "message": "Bab sebelumnya", + "description": "Keybind label" + }, "keybindDescription": { "message": "Pilih sebuah tombol dengan mengetikkannya dan pilih tombol modifier apa saja yang Anda ingin gunakan." }, @@ -387,8 +423,17 @@ "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." + "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" @@ -397,7 +442,7 @@ "message": "Dukung Situs Youtube Pihak Ketiga" }, "supportOtherSitesDescription": { - "message": "Dukung klien YouTube pihak ketiga. Untuk mengaktifkan dukungan, anda harus menerima izin tambahan. Ini tidak akan bekerja di Mode Samaran di Chrome dan varian Chromium lainnya.", + "message": "Dukung klien YouTube pihak ketiga. Untuk mengaktifkan dukungan, Anda harus menerima izin tambahan. Ini tidak akan bekerja di Mode Samaran di Chrome dan varian Chromium lainnya.", "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" }, "supportedSites": { @@ -433,6 +478,9 @@ "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." }, @@ -484,6 +532,9 @@ "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" }, @@ -536,6 +587,10 @@ "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" }, @@ -681,6 +736,21 @@ "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" }, @@ -711,6 +781,9 @@ "showOverlay_full": { "message": "Tampilkan Label" }, + "showOverlay_chapter": { + "message": "Tampilkan Bab" + }, "autoSkipOnMusicVideos": { "message": "Lewati semua segmen secara otomatis ketika ada segmen non-music" }, @@ -766,6 +839,10 @@ "bracketEnd": { "message": "(Selesai)" }, + "End": { + "message": "Akhir", + "description": "Button that skips to the end of a segment" + }, "hiddenDueToDownvote": { "message": "disembunyikan: voting rendah" }, @@ -779,6 +856,9 @@ "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" }, @@ -803,6 +883,13 @@ "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" }, @@ -838,6 +925,9 @@ "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." @@ -845,6 +935,21 @@ "hideForever": { "message": "Sembunyikan selamanya" }, + "warningChatInfo": { + "message": "Kami melihat Anda membuat beberapa kesalahan umum yang tidak tersengaja" + }, + "warningTitle": { + "message": "Anda mendapatkan peringatan" + }, + "questionButton": { + "message": "Saya memiliki pertanyaan" + }, + "warningConfirmButton": { + "message": "Saya mengerti alasannya" + }, + "warningError": { + "message": "Terjadi kesalahan ketika mengakui peringatan:" + }, "Donate": { "message": "Donasi" }, @@ -864,16 +969,16 @@ "message": "Haram ditinjau opsi di bawah ini" }, "helpPageFeatureDisclaimer": { - "message": "Banyak fitur yang dinonaktifkan secara bawaan. Jika kamu ingin lewati mula, akhir, gunakan Invidious, dll, aktifkan mereka dibawah ini.\nKamu bisa menyembunyikan/menghadirkan elemen UI." + "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." }, "helpPageHowSkippingWorks": { "message": "Cara kerja melewati segmen" }, "helpPageHowSkippingWorks1": { - "message": "Segmen video akan otomatis dilewati jika ditemukan di databasis. Kamu bisa buka munculan dengan klik ikon ekstensi untuk mendapatkan pratinjau apa adanya." + "message": "Segmen video akan otomatis dilewati jika ditemukan di basis data. Anda bisa mumbuka popup dengan mengklik ikon ekstensi untuk mendapatkan pratinjau tersebut." }, "helpPageHowSkippingWorks2": { - "message": "Kapanpun kamu melewati segmen, kamu akan mendapatkan maklumat. Jika waktu terlihat salah dapat menyuarakan turun dengan klik turun-suara! Kamu juga bisa menyuarakan di maklumat." + "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": "Mengirim" @@ -944,6 +1049,12 @@ "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." }, @@ -1006,5 +1117,124 @@ }, "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" + }, + "chooseACountry": { + "message": "Pilih negara" + }, + "noDiscount": { + "message": "Anda tidak memenuhi syarat untuk mendapatkan diskon" + }, + "discountLink": { + "message": "Tautan Diskon (Lihat harga pink)" + }, + "selectYourCountry": { + "message": "Pilih negaramu" + }, + "alreadyDonated": { + "message": "Jika Anda pernah meyumbangkan jumlah berapapun, Anda dapat menebus akses gratis dengan menyurel:", + "description": "After the colon is an email address" + }, + "cantAfford": { + "message": "Jika Anda tidak mampu membeli lisensi, klik {here} untuk melihat jika Anda memenuhi syarat untuk mendapatkan diskon", + "description": "Keep the curly braces. The word 'here' should be translated as well." + }, + "patreonSignIn": { + "message": "Masuk dengan Patreon" + }, + "redeem": { + "message": "Tukar" + }, + "joinOnPatreon": { + "message": "Gabung di Patreon" + }, + "oneTimePurchase": { + "message": "Pembelian satu kali" + }, + "enterLicenseKey": { + "message": "Masukkan Kode Lisensi" + }, + "chaptersPage2": { + "message": "Catatan: Izin untuk mengirim bab tetap bedasarkan reputasi yang diperhitungkan. Membeli lisensi hanya memperbolehkan Anda untuk melihat bab yang dikirim oleh orang lain", + "description": "On the chapters page for getting access to the paid chapters feature" + }, + "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 yang belum dikirim", + "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" + }, + "unsubmittedSegmentsPlural": { + "message": "segmen yang belum dikirim", + "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": "Hapus semua segmen", + "description": "Label for a button in settings" + }, + "clearUnsubmittedSegmentsConfirm": { + "message": "Yakin ingin menghapus semua segmen yang belum disubmit?", + "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" } } diff --git a/public/_locales/it/messages.json b/public/_locales/it/messages.json index 4f5bab4a..38133d1e 100644 --- a/public/_locales/it/messages.json +++ b/public/_locales/it/messages.json @@ -1249,5 +1249,8 @@ }, "segmentFetchFailureWarning": { "message": "Attenzione: il server non ha ancora fornito i segmenti. Questo video potrebbe avere dei segmenti inviati, ma forse non sono stati ricevuti a causa di problemi del server." + }, + "allowScrollingToEdit": { + "message": "Usa la Rotella per Modificare i Tempi" } } diff --git a/public/_locales/ja/messages.json b/public/_locales/ja/messages.json index fa32f2de..0dddcc78 100644 --- a/public/_locales/ja/messages.json +++ b/public/_locales/ja/messages.json @@ -1249,5 +1249,8 @@ }, "segmentFetchFailureWarning": { "message": "警告: サーバーがまだセグメントで応答していません。この動画に対するセグメントはすでに提出されているものの、サーバーの問題によりそれが受信できていないだけという可能性があります。" + }, + "allowScrollingToEdit": { + "message": "スクロールで時間を編集できるようにする" } } diff --git a/public/_locales/ko/messages.json b/public/_locales/ko/messages.json index c5178ac3..0a86022f 100644 --- a/public/_locales/ko/messages.json +++ b/public/_locales/ko/messages.json @@ -111,11 +111,14 @@ "message": "투표 완료!" }, "serverDown": { - "message": "서버가 다운된 것 같아요. 개발자분께 연락해주세요." + "message": "서버가 다운된 것 같아요. 개발자에게 연락해주세요." }, "connectionError": { "message": "연결 오류가 발생했어요. 오류 코드: " }, + "segmentsStillLoading": { + "message": "구간을 여전히 불러오는 중이에요..." + }, "clearTimes": { "message": "구간 초기화" }, @@ -1243,5 +1246,11 @@ }, "exportSegmentsAsURL": { "message": "URL로 공유" + }, + "segmentFetchFailureWarning": { + "message": "경고: 아직 서버로부터 구간 정보를 받지 못했습니다. 동영상에 이미 제출된 구간이 있지만 서버의 문제로 수신하지 못했을 수 있습니다." + }, + "allowScrollingToEdit": { + "message": "스크롤하여 시간 수정" } } diff --git a/public/_locales/nl/messages.json b/public/_locales/nl/messages.json index 5321e208..8989bd3c 100644 --- a/public/_locales/nl/messages.json +++ b/public/_locales/nl/messages.json @@ -1249,5 +1249,8 @@ }, "segmentFetchFailureWarning": { "message": "Waarschuwing: de server heeft nog niet gereageerd met segmenten. Misschien zijn er al segmenten van deze video ingediend, maar heeft u ze nog niet ontvangen door problemen met de server." + }, + "allowScrollingToEdit": { + "message": "Scrollen toestaan om tijdstippen te bewerken" } } diff --git a/public/_locales/pl/messages.json b/public/_locales/pl/messages.json index 0300e2ac..c1051127 100644 --- a/public/_locales/pl/messages.json +++ b/public/_locales/pl/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Wystąpił błąd połączenia. Kod błędu: " }, + "segmentsStillLoading": { + "message": "Segmenty nadal się ładują..." + }, "clearTimes": { "message": "Wyczyść segmenty" }, @@ -1243,5 +1246,8 @@ }, "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 otrzymałeś ich z powodu problemów z serwerem." } } diff --git a/public/_locales/pt_PT/messages.json b/public/_locales/pt_PT/messages.json index 5b625013..b02436c5 100644 --- a/public/_locales/pt_PT/messages.json +++ b/public/_locales/pt_PT/messages.json @@ -25,6 +25,19 @@ "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" + }, "upvoteButtonInfo": { "message": "Votar positivamente esta submissão" }, @@ -103,6 +116,9 @@ "connectionError": { "message": "Deu-se um erro de conecção: Código: " }, + "segmentsStillLoading": { + "message": "Segmentos ainda a carregar..." + }, "clearTimes": { "message": "Limpar Segmentos" }, @@ -115,6 +131,9 @@ "SubmitTimes": { "message": "Submeter Segmentos" }, + "sortSegments": { + "message": "Ordenar Segmentos" + }, "submitCheck": { "message": "Tem a certeza que pretende submeter?" }, @@ -256,6 +275,21 @@ "message": "Código-fonte", "description": "Used on Firefox Store Page" }, + "setStartSponsorShortcut": { + "message": "Iniciar/parar segmento", + "description": "Keybind label" + }, + "nextChapterKeybind": { + "message": "Próximo capítulo", + "description": "Keybind label" + }, + "previousChapterKeybind": { + "message": "Capítulo anterior", + "description": "Keybind label" + }, + "502": { + "message": "O servidor parece estar sobrecarregado. Tente novamente em alguns segundos." + }, "errorCode": { "message": "Código de erro: " }, @@ -307,6 +341,21 @@ "message": " das suas vidas", "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." }, + "setUserID": { + "message": "Definir UserID Privado" + }, + "createdBy": { + "message": "Criado por" + }, + "supportedSites": { + "message": "Sites suportados: " + }, + "addInvidiousInstanceDescription": { + "message": "Adicione uma instância personalizada. Isso deve ser formatado APENAS com o domínio. Exemplo: invidious.ajay.app" + }, + "addInvidiousInstanceError": { + "message": "Este é um domínio inválido. Isto deve APENAS incluir a parte do domínio. Exemplo: invidious.ajay.app" + }, "areYouSureReset": { "message": "Tem certeza que deseja redefinir?" }, diff --git a/public/_locales/ru/messages.json b/public/_locales/ru/messages.json index 0549d3bc..c47115c5 100644 --- a/public/_locales/ru/messages.json +++ b/public/_locales/ru/messages.json @@ -1249,5 +1249,8 @@ }, "segmentFetchFailureWarning": { "message": "Внимание: Сервер еще не прислал существующие сегменты. В этом видео уже могут быть отправленные сегменты, но вы их ещё не получили из-за проблем с сервером." + }, + "allowScrollingToEdit": { + "message": "Разрешить прокрутку для редактирования времени" } } diff --git a/public/_locales/sk/messages.json b/public/_locales/sk/messages.json index 5f4b3a03..0c1a348f 100644 --- a/public/_locales/sk/messages.json +++ b/public/_locales/sk/messages.json @@ -134,6 +134,9 @@ "SubmitTimes": { "message": "Odoslať segmenty" }, + "sortSegments": { + "message": "Triedenie segmentov" + }, "submitCheck": { "message": "Naozaj to chcete odoslať?" }, @@ -231,6 +234,15 @@ "enableViewTrackingInPrivate": { "message": "Zapnúť počítanie preskočení v inkognito oknách" }, + "enableTrackDownvotes": { + "message": "Uložiť segmenty, ktoré boli downvotované" + }, + "whatTrackDownvotes": { + "message": "Všetky segmenty, ktoré znížite, zostanú skryté aj po obnovení" + }, + "trackDownvotesWarning": { + "message": "Varovanie: Vypnutím tejto funkcie sa vymažú všetky predtým uložené downvoty" + }, "enableQueryByHashPrefix": { "message": "Dopyt podľa hash prefixu" }, @@ -293,6 +305,18 @@ "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" + }, + "setSubmitKeybind": { + "message": "Odoslať segmenty", + "description": "Keybind label" + }, "nextChapterKeybind": { "message": "Ďalšia kapitola", "description": "Keybind label" @@ -301,6 +325,9 @@ "message": "Predošlá kapitola", "description": "Keybind label" }, + "keybindDescription": { + "message": "Vyberte kláves jeho zadaním a vyberte všetky modifikačné klávesy, ktoré chcete použiť." + }, "0": { "message": "Spojenie vypršalo. Skontrolujte svoje internetové pripojenie. Ak vám internet funguje, server je pravdepodobne preťažený alebo nefunkčný." }, @@ -396,9 +423,18 @@ "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" }, @@ -442,6 +478,12 @@ "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):" }, @@ -481,6 +523,18 @@ "exportOptions": { "message": "Import/export všetkých nastavení" }, + "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" }, @@ -526,6 +580,9 @@ "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" @@ -637,6 +694,12 @@ "category_preview_guideline3": { "message": "Nie pre sekcie, ktoré majú dodatočný obsah" }, + "category_filler": { + "message": "Výplň Tangent / Vtipy" + }, + "category_filler_description": { + "message": "Vedľajšie scény pridané len ako výplň alebo humor, ktoré nie sú potrebné na pochopenie hlavného obsahu videa. Nemali by sem patriť segmenty poskytujúce kontext alebo detaily pozadia. Toto je veľmi agresívna kategória určená na to, keď nemáte náladu na \"zábavu\"." + }, "category_filler_short": { "message": "Odbočka" }, @@ -792,6 +855,9 @@ "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:" @@ -893,9 +959,15 @@ "Donate": { "message": "Prispieť" }, + "considerDonating": { + "message": "Zvážte darovanie" + }, "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." }, @@ -1003,19 +1075,68 @@ "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": "Úspešne vykúpiť!" + }, "redeemFailed": { "message": "Licenčný kľúč nie je platný" }, @@ -1060,10 +1181,61 @@ "chaptersPage1": { "message": "Crowd-sourcované kapitovly v SponsorBlock-u sú dostupné len po zakúpení licencie alebo zadarmo pre ľudí, ktorí už v minulosti prispeli" }, + "chaptersPage2": { + "message": "Poznámka: Povolenie na predkladanie kapitol je stále založené na vypočítanej reputácii. Zakúpenie licencie vám umožní iba prezerať kapitoly, ktoré odoslali iní", + "description": "On the chapters page for getting access to the paid chapters feature" + }, "chapterNewFeature": { "message": "Nová funkcia: Crowd-sourcované vlastné kapitoly. Toto sú sekcie videa s vlastnými názvami, ktoré môžu byť pre väčšiu presnosť vyskladané. Ak si kúpite licenciu, uvidíte kapitoly v tomto videu, ako napr.: ", "description": "After the comma, a list of chapters for this video will appear" }, + "chapterNewFeature2": { + "message": "Nová funkcia: Vlastné kapitoly z verejných zdrojov. Ide o vlastnoručne pomenované časti vo videách, ktoré sa dajú ukladať na seba a spresňovať. Prístup máte zadarmo, povoľte v možnostiach." + }, + "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" + }, "segmentFetchFailureWarning": { "message": "Varovanie: Zo servera sa ešte nenahrali segmenty. V tomto videu už môžu byť vytvorené segmenty, ale vzhľadom na problémy so serverom ešte nemuseli byť nahraté." } diff --git a/public/_locales/sv/messages.json b/public/_locales/sv/messages.json index 03b498e3..7e89fb45 100644 --- a/public/_locales/sv/messages.json +++ b/public/_locales/sv/messages.json @@ -1249,5 +1249,8 @@ }, "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" } } diff --git a/public/_locales/tr/messages.json b/public/_locales/tr/messages.json index 4fe4240a..8921f137 100644 --- a/public/_locales/tr/messages.json +++ b/public/_locales/tr/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Bağlantı hatası oluştu. Hata kodu: " }, + "segmentsStillLoading": { + "message": "Bölümler hala yükleniyor..." + }, "clearTimes": { "message": "Kısımları temizle" }, @@ -1243,5 +1246,11 @@ }, "exportSegmentsAsURL": { "message": "URL olarak paylaş" + }, + "segmentFetchFailureWarning": { + "message": "Uyarı: Sunucu henüz bölümlerle 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" } } diff --git a/public/_locales/zh_CN/messages.json b/public/_locales/zh_CN/messages.json index 040a4b41..e2005794 100644 --- a/public/_locales/zh_CN/messages.json +++ b/public/_locales/zh_CN/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "连接错误。错误代码: " }, + "segmentsStillLoading": { + "message": "片段仍在加载中..." + }, "clearTimes": { "message": "清除片段" }, @@ -131,6 +134,9 @@ "SubmitTimes": { "message": "提交片段" }, + "sortSegments": { + "message": "分类段" + }, "submitCheck": { "message": "您确定要提交它吗?" }, @@ -177,6 +183,9 @@ "setUsername": { "message": "设定用户名" }, + "copyPublicID": { + "message": "复制公共用户ID" + }, "copySegmentID": { "message": "复制片段 ID" }, @@ -198,6 +207,9 @@ "hideButtonsDescription": { "message": "这将隐藏在 YouTube 播放器上提交赞助商广告的按钮。我了解这个东西打扰到了某些人。除了使用那个按钮,这个弹窗也可以用来提交赞助商广告。 要隐藏出现的通知,请使用通知中显示的写着 ”不再显示“ 的按钮。您可以在以后再次启用这些设置。" }, + "showSkipButton": { + "message": "保持播放器上的跳过高亮按钮" + }, "showInfoButton": { "message": "在 Youtube 播放器上显示信息按钮" }, @@ -219,6 +231,18 @@ "whatViewTracking": { "message": "此功能追踪您跳过了哪些片段,以让用户知道他们提交的信息帮助了多少人,并与点赞一同作为依据,来确保垃圾信息不会进入数据库。在您每次跳过片段时,此扩展都会向服务器发送一条消息。希望大部分人不要改变此设置,以使观看数字准确。:)" }, + "enableViewTrackingInPrivate": { + "message": "在私人/隐身标签中启用跳过计数跟踪" + }, + "enableTrackDownvotes": { + "message": "商店部分的下线" + }, + "whatTrackDownvotes": { + "message": "任何被你降权的片段,即使在刷新后也会保持隐藏状态" + }, + "trackDownvotesWarning": { + "message": "警告。禁用此功能将删除所有先前存储的降级投票" + }, "enableQueryByHashPrefix": { "message": "按哈希前缀查询" }, @@ -231,12 +255,36 @@ "whatRefetchWhenNotFound": { "message": "如果视频是新的且没有发现可跳片段,将在您观看时每隔几分钟再次获取信息。" }, + "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 是一个众包的浏览器扩展,可以让任何人提交 YouTube 视频的赞助商广告和其他片段的开始和结束时间。若有一人提交了信息,其他所有使用此扩展的人都能直接跳过赞助商广告片段。您也可以跳过音乐视频中的非音乐部分。", "description": "Full description of the extension on the store pages." @@ -257,6 +305,18 @@ "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" + }, "0": { "message": "连接超时。请检查您的网络连接。如果您的网络运行正常,则可能是服务器过载或宕机。" }, From e6be13b583cea8608769ad0a534e7ea8c170794b Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Mon, 19 Dec 2022 13:11:03 -0500 Subject: [PATCH 067/318] make warning message nicer --- public/_locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index 21b7a048..a65ef50a 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -942,7 +942,7 @@ "message": "Hide forever" }, "warningChatInfo": { - "message": "We noticed you were making some common mistakes that are not malicious" + "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. We take this very seriously :)" }, "warningTitle": { "message": "You got a warning" From 3379189ea84c7eb3a4821b526780c54b4023af8d Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Mon, 19 Dec 2022 13:13:38 -0500 Subject: [PATCH 068/318] remove serious part of warning message --- public/_locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index a65ef50a..81cb81bb 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -942,7 +942,7 @@ "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. We take this very seriously :)" + "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 :)" }, "warningTitle": { "message": "You got a warning" From 35b8a341629b46965c8019b4a9b375d8ecdd8055 Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 19 Dec 2022 16:12:51 -0500 Subject: [PATCH 069/318] Don't remove trailing end bracket when not starting with bracket --- src/utils/exporter.ts | 3 ++- test/exporter.test.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/utils/exporter.ts b/src/utils/exporter.ts index 7d3f5ee2..ec67133b 100644 --- a/src/utils/exporter.ts +++ b/src/utils/exporter.ts @@ -39,7 +39,8 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] if (match) { const startTime = GenericUtils.getFormattedTimeToSeconds(match[0]); if (startTime !== null) { - const specialCharsMatcher = /^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:()\s]+$/g + // Remove "seconds", "at", special characters, and ")" if there was a "(" + const specialCharsMatcher = /^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:(\s]+$|(?<=^\s*\(.+)[-:()\s]*$/g const titleLeft = line.split(match[0])[0].replace(specialCharsMatcher, ""); let titleRight = null; const split2 = line.split(match[1] || match[0]); diff --git a/test/exporter.test.ts b/test/exporter.test.ts index a3af0c04..bf948df0 100644 --- a/test/exporter.test.ts +++ b/test/exporter.test.ts @@ -275,4 +275,20 @@ describe("Import segments", () => { category: "chapter" as Category }]); }); + + it ("0:00 G¹ (Tangent Continuity)", () => { + const input = ` 0:00 G¹ (Tangent Continuity) + 0:01 G² (Tangent Continuity)`; + + const result = importTimes(input, 8000); + expect(result).toMatchObject([{ + segment: [0, 1], + description: "G¹ (Tangent Continuity)", + category: "chapter" as Category + }, { + segment: [1, 8000], + description: "G² (Tangent Continuity)", + category: "chapter" as Category + }]); + }); }); \ No newline at end of file From 2ba5fa695455607d5c89ecb1f9c698a324f14f8b Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 19 Dec 2022 16:14:41 -0500 Subject: [PATCH 070/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index c930dd6b..92cb3834 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.9", + "version": "5.1.10", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From f764869cc89db39c1240ba1f7b9710a7d74ee83d Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 19 Dec 2022 16:19:01 -0500 Subject: [PATCH 071/318] Add another test case --- test/exporter.test.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/exporter.test.ts b/test/exporter.test.ts index bf948df0..596af640 100644 --- a/test/exporter.test.ts +++ b/test/exporter.test.ts @@ -291,4 +291,20 @@ describe("Import segments", () => { category: "chapter" as Category }]); }); + + it ("((Some name) 1:20)", () => { + const input = ` ((Some name) 1:20) + ((Some other name) 1:25)`; + + const result = importTimes(input, 8000); + expect(result).toMatchObject([{ + segment: [80, 85], + description: "Some name", + category: "chapter" as Category + }, { + segment: [85, 8000], + description: "Some other name", + category: "chapter" as Category + }]); + }); }); \ No newline at end of file From 3f7f671a3b833d391a5449d9e21741b108d70ea9 Mon Sep 17 00:00:00 2001 From: Ajay Date: Thu, 22 Dec 2022 02:20:19 -0500 Subject: [PATCH 072/318] Fix early skips on firefox when seeking while playing --- src/content.ts | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/content.ts b/src/content.ts index 98bf142d..f98e2ed9 100644 --- a/src/content.ts +++ b/src/content.ts @@ -964,25 +964,23 @@ function updateVirtualTime() { if (utils.isFirefox()) { let count = 0; let lastTime = lastKnownVideoTime.videoTime; - if (lastKnownVideoTime.fromPause) { - currentVirtualTimeInterval = setInterval(() => { - if (lastTime !== video.currentTime) { - count++; - lastTime = video.currentTime; - } + currentVirtualTimeInterval = setInterval(() => { + if (lastTime !== video.currentTime) { + count++; + lastTime = video.currentTime; + } - if (count > 1) { - const delay = lastKnownVideoTime.fromPause && lastKnownVideoTime.approximateDelay ? - lastKnownVideoTime.approximateDelay : 0; - - lastKnownVideoTime.videoTime = video.currentTime + delay; - lastKnownVideoTime.preciseTime = performance.now(); - - clearInterval(currentVirtualTimeInterval); - currentVirtualTimeInterval = null; - } - }, 1); - } + if (count > 1) { + const delay = lastKnownVideoTime.fromPause && lastKnownVideoTime.approximateDelay ? + lastKnownVideoTime.approximateDelay : 0; + + lastKnownVideoTime.videoTime = video.currentTime + delay; + lastKnownVideoTime.preciseTime = performance.now(); + + clearInterval(currentVirtualTimeInterval); + currentVirtualTimeInterval = null; + } + }, 1); } } From 7bf17e17461a1d8b3958cb0d9cda223808ebaadd Mon Sep 17 00:00:00 2001 From: Ajay Date: Thu, 22 Dec 2022 02:20:32 -0500 Subject: [PATCH 073/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 92cb3834..70323383 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.10", + "version": "5.1.11", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 7dd2c9eb3e4af690024319f32a075fef90bb2d88 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 24 Dec 2022 00:54:56 -0500 Subject: [PATCH 074/318] Move some generic functions to a new package --- package-lock.json | 32 ++++++++++ package.json | 3 +- src/components/SponsorTimeEditComponent.tsx | 23 ++++--- src/content.ts | 8 ++- src/help.ts | 4 +- src/js-components/previewBar.ts | 4 +- src/popup.ts | 5 +- src/render/CategoryPill.tsx | 11 ++-- src/utils.ts | 4 +- src/utils/exporter.ts | 9 +-- src/utils/genericUtils.ts | 70 --------------------- src/utils/pageUtils.ts | 4 +- 12 files changed, 71 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9eff316a..29ce129d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ ], "license": "LGPL-3.0-or-later", "dependencies": { + "@ajayyy/maze-utils": "^1.0.3", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -65,6 +66,32 @@ "node": ">=16" } }, + "node_modules/@ajayyy/maze-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@ajayyy/maze-utils/-/maze-utils-1.0.3.tgz", + "integrity": "sha512-sdQyU/2VAmJ9FiyUIdjE8FbO5b5IofN9vK/7lkZiUw91V+NZi7aSG/LSYMqmQ3OuTYRE5PLN9Jyknuo2ZnljjA==", + "funding": [ + { + "type": "individual", + "url": "https://sponsor.ajay.app/donate" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ajayyy-org" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/ajayyy" + }, + { + "type": "individual", + "url": "https://paypal.me/ajayyy" + } + ], + "engines": { + "node": ">=16" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -13336,6 +13363,11 @@ } }, "dependencies": { + "@ajayyy/maze-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@ajayyy/maze-utils/-/maze-utils-1.0.3.tgz", + "integrity": "sha512-sdQyU/2VAmJ9FiyUIdjE8FbO5b5IofN9vK/7lkZiUw91V+NZi7aSG/LSYMqmQ3OuTYRE5PLN9Jyknuo2ZnljjA==" + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", diff --git a/package.json b/package.json index 824abd6a..e96403cf 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "background.js", "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "@ajayyy/maze-utils": "^1.0.3" }, "devDependencies": { "@types/chrome": "^0.0.199", diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index 01bee538..2cd9f984 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -6,10 +6,9 @@ import Utils from "../utils"; import SubmissionNoticeComponent from "./SubmissionNoticeComponent"; import { RectangleTooltip } from "../render/RectangleTooltip"; import SelectorComponent, { SelectorOption } from "./SelectorComponent"; -import { GenericUtils } from "../utils/genericUtils"; import { noRefreshFetchingChaptersAllowed } from "../utils/licenseKey"; import { DEFAULT_CATEGORY } from "../utils/categoryUtils"; - +import { getFormattedTime, getFormattedTimeToSeconds } from "@ajayyy/maze-utils/lib/formating"; const utils = new Utils(); @@ -181,9 +180,9 @@ class SponsorTimeEditComponent extends React.Component - {GenericUtils.getFormattedTime(segment[0], true) + + {getFormattedTime(segment[0], true) + ((!isNaN(segment[1]) && sponsorTime.actionType !== ActionType.Poi) - ? " " + chrome.i18n.getMessage("to") + " " + GenericUtils.getFormattedTime(segment[1], true) : "")} + ? " " + chrome.i18n.getMessage("to") + " " + getFormattedTime(segment[1], true) : "")}
); } @@ -308,8 +307,8 @@ class SponsorTimeEditComponent extends React.Component video?.duration && getExistingChapters(sponsorVideoID, video.duration), + waitFor(() => video?.duration && getExistingChapters(sponsorVideoID, video.duration), wait ? 5000 : 0, 100, (c) => c?.length > 0).then((chapters) => { if (!existingChaptersImported && chapters?.length > 0) { sponsorTimes = (sponsorTimes ?? []).concat(...chapters).sort((a, b) => a.segment[0] - b.segment[0]); @@ -2364,7 +2366,7 @@ function getSegmentsMessage(sponsorTimes: SponsorTime[]): string { for (let i = 0; i < sponsorTimes.length; i++) { for (let s = 0; s < sponsorTimes[i].segment.length; s++) { - let timeMessage = GenericUtils.getFormattedTime(sponsorTimes[i].segment[s]); + let timeMessage = getFormattedTime(sponsorTimes[i].segment[s]); //if this is an end time if (s == 1) { timeMessage = " " + chrome.i18n.getMessage("to") + " " + timeMessage; @@ -2592,7 +2594,7 @@ function showTimeWithoutSkips(skippedDuration: number): void { display.appendChild(duration); } - const durationAfterSkips = GenericUtils.getFormattedTime(video?.duration - skippedDuration); + const durationAfterSkips = getFormattedTime(video?.duration - skippedDuration); duration.innerText = (durationAfterSkips == null || skippedDuration <= 0) ? "" : " (" + durationAfterSkips + ")"; } diff --git a/src/help.ts b/src/help.ts index 9cc6b4bd..10bd86cf 100644 --- a/src/help.ts +++ b/src/help.ts @@ -2,14 +2,14 @@ import Config from "./config"; import { showDonationLink } from "./utils/configUtils"; import { localizeHtmlPage } from "./utils/pageUtils"; -import { GenericUtils } from "./utils/genericUtils"; +import { waitFor } from "@ajayyy/maze-utils"; window.addEventListener('DOMContentLoaded', init); async function init() { localizeHtmlPage(); - await GenericUtils.wait(() => Config.config !== null); + await waitFor(() => Config.config !== null); if (!Config.config.darkMode) { document.documentElement.setAttribute("data-theme", "light"); diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 4842afc0..0afb7f96 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -11,8 +11,8 @@ import { ActionType, Category, SegmentContainer, SponsorHideType, SponsorSourceT import { partition } from "../utils/arrayUtils"; import { DEFAULT_CATEGORY, shortCategoryName } from "../utils/categoryUtils"; import { normalizeChapterName } from "../utils/exporter"; -import { GenericUtils } from "../utils/genericUtils"; import { findValidElement } from "../utils/pageUtils"; +import { getFormattedTimeToSeconds } from "@ajayyy/maze-utils/lib/formating"; const TOOLTIP_VISIBLE_CLASS = 'sponsorCategoryTooltipVisible'; const MIN_CHAPTER_SIZE = 0.003; @@ -140,7 +140,7 @@ class PreviewBar { const tooltipText = tooltipTextElement.textContent; if (tooltipText === null || tooltipText.length === 0) continue; - timeInSeconds = GenericUtils.getFormattedTimeToSeconds(tooltipText); + timeInSeconds = getFormattedTimeToSeconds(tooltipText); if (timeInSeconds !== null) break; } diff --git a/src/popup.ts b/src/popup.ts index 3584fba5..f631d7cd 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -27,6 +27,7 @@ import { localizeHtmlPage } from "./utils/pageUtils"; import { exportTimes } from "./utils/exporter"; import GenericNotice from "./render/GenericNotice"; import { noRefreshFetchingChaptersAllowed } from "./utils/licenseKey"; +import { getFormattedTime } from "@ajayyy/maze-utils/lib/formating"; const utils = new Utils(); @@ -593,9 +594,9 @@ async function runThePopup(messageListener?: MessageListener): Promise { if (downloadedTimes[i].actionType === ActionType.Full) { segmentTimeFromToNode.innerText = chrome.i18n.getMessage("full"); } else { - segmentTimeFromToNode.innerText = GenericUtils.getFormattedTime(downloadedTimes[i].segment[0], true) + + segmentTimeFromToNode.innerText = getFormattedTime(downloadedTimes[i].segment[0], true) + (actionType !== ActionType.Poi - ? " " + chrome.i18n.getMessage("to") + " " + GenericUtils.getFormattedTime(downloadedTimes[i].segment[1], true) + ? " " + chrome.i18n.getMessage("to") + " " + getFormattedTime(downloadedTimes[i].segment[1], true) : ""); } diff --git a/src/render/CategoryPill.tsx b/src/render/CategoryPill.tsx index f8ec1791..aeace093 100644 --- a/src/render/CategoryPill.tsx +++ b/src/render/CategoryPill.tsx @@ -4,8 +4,9 @@ import CategoryPillComponent, { CategoryPillState } from "../components/Category import Config from "../config"; import { VoteResponse } from "../messageTypes"; import { Category, SegmentUUID, SponsorTime } from "../types"; -import { GenericUtils } from "../utils/genericUtils"; import { Tooltip } from "./Tooltip"; +import { waitFor } from "@ajayyy/maze-utils"; +import { getYouTubeTitleNode } from "@ajayyy/maze-utils/lib/elements"; export class CategoryPill { container: HTMLElement; @@ -23,9 +24,7 @@ export class CategoryPill { async attachToPage(onMobileYouTube: boolean, onInvidious: boolean, vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise): Promise { const referenceNode = - await GenericUtils.wait(() => - // New YouTube Title, YouTube, Mobile YouTube, Invidious - document.querySelector("#title h1, .ytd-video-primary-info-renderer.title, .slim-video-information-title, #player-container + .h-box > h1") as HTMLElement); + await waitFor(() => getYouTubeTitleNode()); if (referenceNode && !referenceNode.contains(this.container)) { this.container = document.createElement('span'); @@ -43,7 +42,7 @@ export class CategoryPill { this.root.render(); if (this.unsavedState) { - GenericUtils.wait(() => this.ref.current).then(() => { + waitFor(() => this.ref.current).then(() => { this.ref.current?.setState(this.unsavedState); this.unsavedState = null; }); @@ -99,7 +98,7 @@ export class CategoryPill { if (!Config.config.categoryPillUpdate) { Config.config.categoryPillUpdate = true; - const watchDiv = await GenericUtils.wait(() => document.querySelector("#info.ytd-watch-flexy") as HTMLElement); + const watchDiv = await waitFor(() => document.querySelector("#info.ytd-watch-flexy") as HTMLElement); if (watchDiv) { new Tooltip({ text: chrome.i18n.getMessage("categoryPillNewFeature"), diff --git a/src/utils.ts b/src/utils.ts index 1ee5781d..90bd5418 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -3,7 +3,7 @@ import { CategorySelection, SponsorTime, FetchResponse, BackgroundScriptContaine import * as CompileConfig from "../config.json"; import { findValidElement, findValidElementFromSelector } from "./utils/pageUtils"; -import { GenericUtils } from "./utils/genericUtils"; +import { waitFor } from "@ajayyy/maze-utils"; export default class Utils { @@ -31,7 +31,7 @@ export default class Utils { } async wait(condition: () => T, timeout = 5000, check = 100): Promise { - return GenericUtils.wait(condition, timeout, check); + return waitFor(condition, timeout, check); } /* Uses a mutation observer to wait asynchronously */ diff --git a/src/utils/exporter.ts b/src/utils/exporter.ts index ec67133b..3c2ca6f9 100644 --- a/src/utils/exporter.ts +++ b/src/utils/exporter.ts @@ -2,6 +2,7 @@ import { ActionType, Category, SegmentUUID, SponsorSourceType, SponsorTime } fro import { shortCategoryName } from "./categoryUtils"; import { GenericUtils } from "./genericUtils"; import * as CompileConfig from "../../config.json"; +import { getFormattedTime, getFormattedTimeToSeconds } from "@ajayyy/maze-utils/lib/formating"; const inTest = typeof chrome === "undefined"; @@ -26,9 +27,9 @@ export function exportTimes(segments: SponsorTime[]): string { function exportTime(segment: SponsorTime): string { const name = segment.description || shortCategoryName(segment.category); - return `${GenericUtils.getFormattedTime(segment.segment[0], true)}${ + return `${getFormattedTime(segment.segment[0], true)}${ segment.segment[1] && segment.segment[0] !== segment.segment[1] - ? ` - ${GenericUtils.getFormattedTime(segment.segment[1], true)}` : ""} ${name}`; + ? ` - ${getFormattedTime(segment.segment[1], true)}` : ""} ${name}`; } export function importTimes(data: string, videoDuration: number): SponsorTime[] { @@ -37,7 +38,7 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] for (const line of lines) { const match = line.match(/(?:((?:\d+:)?\d+:\d+)+(?:\.\d+)?)|(?:\d+(?=s| second))/g); if (match) { - const startTime = GenericUtils.getFormattedTimeToSeconds(match[0]); + const startTime = getFormattedTimeToSeconds(match[0]); if (startTime !== null) { // Remove "seconds", "at", special characters, and ")" if there was a "(" const specialCharsMatcher = /^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:(\s]+$|(?<=^\s*\(.+)[-:()\s]*$/g @@ -51,7 +52,7 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] const determinedCategory = chapterNames.find(c => c.names.includes(title))?.code as Category; const segment: SponsorTime = { - segment: [startTime, GenericUtils.getFormattedTimeToSeconds(match[1])], + segment: [startTime, getFormattedTimeToSeconds(match[1])], category: determinedCategory ?? ("chapter" as Category), actionType: determinedCategory ? ActionType.Skip : ActionType.Chapter, description: title, diff --git a/src/utils/genericUtils.ts b/src/utils/genericUtils.ts index 144c0438..675f7096 100644 --- a/src/utils/genericUtils.ts +++ b/src/utils/genericUtils.ts @@ -1,70 +1,3 @@ -/** Function that can be used to wait for a condition before returning. */ -async function wait(condition: () => T, timeout = 5000, check = 100, predicate?: (obj: T) => boolean): Promise { - return await new Promise((resolve, reject) => { - setTimeout(() => { - clearInterval(interval); - reject("TIMEOUT"); - }, timeout); - - const intervalCheck = () => { - const result = condition(); - if (predicate ? predicate(result) : result) { - resolve(result); - clearInterval(interval); - } - }; - - const interval = setInterval(intervalCheck, check); - - //run the check once first, this speeds it up a lot - intervalCheck(); - }); -} - -function getFormattedTimeToSeconds(formatted: string): number | null { - const fragments = /^(?:(?:(\d+):)?(\d+):)?(\d*(?:[.,]\d+)?)$/.exec(formatted); - - if (fragments === null) { - return null; - } - - const hours = fragments[1] ? parseInt(fragments[1]) : 0; - const minutes = fragments[2] ? parseInt(fragments[2] || '0') : 0; - const seconds = fragments[3] ? parseFloat(fragments[3].replace(',', '.')) : 0; - - return hours * 3600 + minutes * 60 + seconds; -} - -function getFormattedTime(seconds: number, precise?: boolean): string { - seconds = Math.max(seconds, 0); - - const hours = Math.floor(seconds / 60 / 60); - const minutes = Math.floor(seconds / 60) % 60; - let minutesDisplay = String(minutes); - let secondsNum = seconds % 60; - if (!precise) { - secondsNum = Math.floor(secondsNum); - } - - let secondsDisplay = String(precise ? secondsNum.toFixed(3) : secondsNum); - - if (secondsNum < 10) { - //add a zero - secondsDisplay = "0" + secondsDisplay; - } - if (hours && minutes < 10) { - //add a zero - minutesDisplay = "0" + minutesDisplay; - } - if (isNaN(hours) || isNaN(minutes)) { - return null; - } - - const formatted = (hours ? hours + ":" : "") + minutesDisplay + ":" + secondsDisplay; - - return formatted; -} - /** * Gets the error message in a nice string * @@ -148,9 +81,6 @@ function generateUserID(length = 36): string { } export const GenericUtils = { - wait, - getFormattedTime, - getFormattedTimeToSeconds, getErrorMessage, getLuminance, generateUserID, diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index 42766fef..beda1585 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -1,5 +1,5 @@ import { ActionType, Category, SponsorSourceType, SponsorTime, VideoID } from "../types"; -import { GenericUtils } from "./genericUtils"; +import { getFormattedTimeToSeconds } from "@ajayyy/maze-utils/lib/formating"; export function getControls(): HTMLElement { const controlsSelectors = [ @@ -80,7 +80,7 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number): const timeElement = link.querySelector("#time") as HTMLElement; const description = link.querySelector("#details h4") as HTMLElement; if (timeElement && description?.innerText?.length > 0 && link.getAttribute("href")?.includes(currentVideoID)) { - const time = GenericUtils.getFormattedTimeToSeconds(timeElement.innerText); + const time = getFormattedTimeToSeconds(timeElement.innerText); if (time === null) return []; if (lastSegment) { From 89b210ffd56494d0cc815f5e85370fc0fc2303be Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 24 Dec 2022 00:56:55 -0500 Subject: [PATCH 075/318] Update OSS Attribution (#1624) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- oss-attribution/licenseInfos.json | 2 +- public/oss-attribution/attribution.txt | 171 +++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 1 deletion(-) diff --git a/oss-attribution/licenseInfos.json b/oss-attribution/licenseInfos.json index 72f18799..55fbd52c 100644 --- a/oss-attribution/licenseInfos.json +++ b/oss-attribution/licenseInfos.json @@ -1 +1 @@ -{"js-tokens":{"ignore":false,"name":"js-tokens","version":"4.0.0","authors":"Simon Lydell","url":"https://github.com/lydell/js-tokens","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"loose-envify":{"ignore":false,"name":"loose-envify","version":"1.4.0","authors":"Andres Suarez ","url":"https://github.com/zertosh/loose-envify","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"react-dom":{"ignore":false,"name":"react-dom","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"react":{"ignore":false,"name":"react","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"scheduler":{"ignore":false,"name":"scheduler","version":"0.23.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"}} \ No newline at end of file +{"@ajayyy/maze-utils":{"ignore":false,"name":"@ajayyy/maze-utils","version":"1.0.3","authors":"Ajay Ramachandran","url":"https://github.com/ajayyy/SponsorBlock","license":"LGPL-3.0*","licenseText":" GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. \n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n 0. Additional Definitions.\n\n As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library. The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n 1. Exception to Section 3 of the GNU GPL.\n\n You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n 2. Conveying Modified Versions.\n\n If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n a) under this License, provided that you make a good faith effort to\n ensure that, in the event an Application does not supply the\n function or data, the facility still operates, and performs\n whatever part of its purpose remains meaningful, or\n\n b) under the GNU GPL, with none of the additional permissions of\n this License applicable to that copy.\n\n 3. Object Code Incorporating Material from Library Header Files.\n\n The object code form of an Application may incorporate material from\na header file that is part of the Library. You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n a) Give prominent notice with each copy of the object code that the\n Library is used in it and that the Library and its use are\n covered by this License.\n\n b) Accompany the object code with a copy of the GNU GPL and this license\n document.\n\n 4. Combined Works.\n\n You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n a) Give prominent notice with each copy of the Combined Work that\n the Library is used in it and that the Library and its use are\n covered by this License.\n\n b) Accompany the Combined Work with a copy of the GNU GPL and this license\n document.\n\n c) For a Combined Work that displays copyright notices during\n execution, include the copyright notice for the Library among\n these notices, as well as a reference directing the user to the\n copies of the GNU GPL and this license document.\n\n d) Do one of the following:\n\n 0) Convey the Minimal Corresponding Source under the terms of this\n License, and the Corresponding Application Code in a form\n suitable for, and under terms that permit, the user to\n recombine or relink the Application with a modified version of\n the Linked Version to produce a modified Combined Work, in the\n manner specified by section 6 of the GNU GPL for conveying\n Corresponding Source.\n\n 1) Use a suitable shared library mechanism for linking with the\n Library. A suitable mechanism is one that (a) uses at run time\n a copy of the Library already present on the user's computer\n system, and (b) will operate properly with a modified version\n of the Library that is interface-compatible with the Linked\n Version.\n\n e) Provide Installation Information, but only if you would otherwise\n be required to provide such information under section 6 of the\n GNU GPL, and only to the extent that such information is\n necessary to install and execute a modified version of the\n Combined Work produced by recombining or relinking the\n Application with a modified version of the Linked Version. (If\n you use option 4d0, the Installation Information must accompany\n the Minimal Corresponding Source and Corresponding Application\n Code. If you use option 4d1, you must provide the Installation\n Information in the manner specified by section 6 of the GNU GPL\n for conveying Corresponding Source.)\n\n 5. Combined Libraries.\n\n You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n a) Accompany the combined library with a copy of the same work based\n on the Library, uncombined with any other library facilities,\n conveyed under the terms of this License.\n\n b) Give prominent notice with the combined library that part of it\n is a work based on the Library, and explaining where to find the\n accompanying uncombined form of the same work.\n\n 6. Revised Versions of the GNU Lesser General Public License.\n\n The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"},"js-tokens":{"ignore":false,"name":"js-tokens","version":"4.0.0","authors":"Simon Lydell","url":"https://github.com/lydell/js-tokens","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"loose-envify":{"ignore":false,"name":"loose-envify","version":"1.4.0","authors":"Andres Suarez ","url":"https://github.com/zertosh/loose-envify","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"react-dom":{"ignore":false,"name":"react-dom","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"react":{"ignore":false,"name":"react","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"scheduler":{"ignore":false,"name":"scheduler","version":"0.23.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"}} \ No newline at end of file diff --git a/public/oss-attribution/attribution.txt b/public/oss-attribution/attribution.txt index 4f0f164b..4df6d232 100644 --- a/public/oss-attribution/attribution.txt +++ b/public/oss-attribution/attribution.txt @@ -1,3 +1,174 @@ +@ajayyy/maze-utils +1.0.3 + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + + +****************************** + js-tokens 4.0.0 The MIT License (MIT) From 06a112a0302c7193f6035d5e1521a331721932db Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 25 Dec 2022 00:38:49 -0500 Subject: [PATCH 076/318] Fix category pill disappearing on mobile --- src/render/CategoryPill.tsx | 51 ++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/render/CategoryPill.tsx b/src/render/CategoryPill.tsx index aeace093..8760b82a 100644 --- a/src/render/CategoryPill.tsx +++ b/src/render/CategoryPill.tsx @@ -27,39 +27,40 @@ export class CategoryPill { await waitFor(() => getYouTubeTitleNode()); if (referenceNode && !referenceNode.contains(this.container)) { - this.container = document.createElement('span'); - this.container.id = "categoryPill"; - this.container.style.display = "relative"; + if (!this.container) { + this.container = document.createElement('span'); + this.container.id = "categoryPill"; + this.container.style.display = "relative"; - referenceNode.prepend(this.container); - referenceNode.style.display = "flex"; + this.root = createRoot(this.container); + this.root.render(); - if (this.ref.current) { - this.unsavedState = this.ref.current.state; + if (onMobileYouTube) { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + + this.mutationObserver = new MutationObserver((changes) => { + if (changes.some((change) => change.removedNodes.length > 0)) { + this.attachToPage(onMobileYouTube, onInvidious, vote); + } + }); + + this.mutationObserver.observe(referenceNode, { + childList: true, + subtree: true + }); + } } - this.root = createRoot(this.container); - this.root.render(); - if (this.unsavedState) { waitFor(() => this.ref.current).then(() => { this.ref.current?.setState(this.unsavedState); - this.unsavedState = null; - }); - } - - if (onMobileYouTube) { - if (this.mutationObserver) { - this.mutationObserver.disconnect(); - } - - this.mutationObserver = new MutationObserver(() => this.attachToPage(onMobileYouTube, onInvidious, vote)); - - this.mutationObserver.observe(referenceNode, { - childList: true, - subtree: true }); } + + referenceNode.prepend(this.container); + referenceNode.style.display = "flex"; } } @@ -79,6 +80,8 @@ export class CategoryPill { } else { this.unsavedState = newState; } + + console.log(this.unsavedState, this.ref.current?.state, "visible"); } async setSegment(segment: SponsorTime): Promise { From 27f3ced338f9ff7333f0126e556c3f114eaeb0f9 Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 26 Dec 2022 16:28:17 -0500 Subject: [PATCH 077/318] Remove lookbehind because safari Resolves https://github.com/ajayyy/SponsorBlock/issues/1626 --- src/utils/exporter.ts | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/utils/exporter.ts b/src/utils/exporter.ts index 3c2ca6f9..9c809b41 100644 --- a/src/utils/exporter.ts +++ b/src/utils/exporter.ts @@ -41,11 +41,16 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] const startTime = getFormattedTimeToSeconds(match[0]); if (startTime !== null) { // Remove "seconds", "at", special characters, and ")" if there was a "(" - const specialCharsMatcher = /^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:(\s]+$|(?<=^\s*\(.+)[-:()\s]*$/g - const titleLeft = line.split(match[0])[0].replace(specialCharsMatcher, ""); + const specialCharMatchers = [{ + matcher: /^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:(\s]+$/g + }, { + matcher: /[-:()\s]*$/g, + condition: (value) => !!value.match(/^\s*\(/) + }]; + const titleLeft = removeIf(line.split(match[0])[0], specialCharMatchers); let titleRight = null; const split2 = line.split(match[1] || match[0]); - titleRight = split2[split2.length - 1].replace(specialCharsMatcher, ""); + titleRight = removeIf(split2[split2.length - 1], specialCharMatchers) const title = titleLeft?.length > titleRight?.length ? titleLeft : titleRight; if (title) { @@ -77,6 +82,17 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] return result; } +function removeIf(value: string, matchers: Array<{ matcher: RegExp, condition?: (value: string) => boolean }>): string { + let result = value; + for (const matcher of matchers) { + if (!matcher.condition || matcher.condition(value)) { + result = result.replace(matcher.matcher, ""); + } + } + + return result; +} + export function exportTimesAsHashParam(segments: SponsorTime[]): string { const hashparamSegments = segments.map(segment => ({ actionType: segment.actionType, From c5178b4c99898e91d6fd490cd665de7cf793db35 Mon Sep 17 00:00:00 2001 From: Michael C Date: Mon, 26 Dec 2022 20:18:51 -0500 Subject: [PATCH 078/318] highlight partial required segments --- src/content.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index db6d9886..0ed024a1 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1421,6 +1421,7 @@ function updatePreviewBar(): void { if (video === null) return; const hashParams = getHashParams(); + const requiredSegment = hashParams?.requiredSegment as SegmentUUID || undefined; const previewBarSegments: PreviewBarSegment[] = []; if (sponsorTimes) { sponsorTimes.forEach((segment) => { @@ -1434,7 +1435,7 @@ function updatePreviewBar(): void { showLarger: segment.actionType === ActionType.Poi, description: segment.description, source: segment.source, - requiredSegment: hashParams.requiredSegment && segment.UUID === hashParams.requiredSegment + requiredSegment: requiredSegment && segment.UUID === requiredSegment || segment.UUID.startsWith(requiredSegment) }); }); } From f68429487ea251d0eeb97db8129a28e6eb85cc5e Mon Sep 17 00:00:00 2001 From: Michael C Date: Tue, 27 Dec 2022 00:24:46 -0500 Subject: [PATCH 079/318] add brackets for operator precedence --- src/content.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index 0ed024a1..688b3100 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1435,7 +1435,7 @@ function updatePreviewBar(): void { showLarger: segment.actionType === ActionType.Poi, description: segment.description, source: segment.source, - requiredSegment: requiredSegment && segment.UUID === requiredSegment || segment.UUID.startsWith(requiredSegment) + requiredSegment: requiredSegment && (segment.UUID === requiredSegment || segment.UUID.startsWith(requiredSegment)) }); }); } From 4a4b281495490e554cc223531e71dd3b814c05e8 Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 30 Dec 2022 23:13:39 -0500 Subject: [PATCH 080/318] Remove log --- src/render/CategoryPill.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/render/CategoryPill.tsx b/src/render/CategoryPill.tsx index 8760b82a..28cef014 100644 --- a/src/render/CategoryPill.tsx +++ b/src/render/CategoryPill.tsx @@ -80,8 +80,6 @@ export class CategoryPill { } else { this.unsavedState = newState; } - - console.log(this.unsavedState, this.ref.current?.state, "visible"); } async setSegment(segment: SponsorTime): Promise { From 55b6b74590d564ea6c953278f18df870bdba6477 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 1 Jan 2023 19:44:34 -0500 Subject: [PATCH 081/318] Update Invidious List (#1631) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- ci/invidiouslist.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/invidiouslist.json b/ci/invidiouslist.json index 13560edb..230d0d19 100644 --- a/ci/invidiouslist.json +++ b/ci/invidiouslist.json @@ -1 +1 @@ -["inv.bp.projectsegfau.lt","inv.odyssey346.dev","inv.riverside.rocks","inv.vern.cc","invidio.xamh.de","invidious.baczek.me","invidious.esmailelbob.xyz","invidious.flokinet.to","invidious.namazso.eu","invidious.nerdvpn.de","invidious.rhyshl.live","invidious.sethforprivacy.com","invidious.slipfox.xyz","invidious.snopyta.org","invidious.tiekoetter.com","invidious.weblibre.org","vid.puffyan.us","y.com.sb","yewtu.be","yt.artemislena.eu"] \ No newline at end of file +["inv.bp.projectsegfau.lt","inv.odyssey346.dev","inv.riverside.rocks","inv.vern.cc","invidio.xamh.de","invidious.baczek.me","invidious.dhusch.de","invidious.drivet.xyz","invidious.esmailelbob.xyz","invidious.flokinet.to","invidious.namazso.eu","invidious.nerdvpn.de","invidious.privacydev.net","invidious.silur.me","invidious.slipfox.xyz","invidious.snopyta.org","invidious.tiekoetter.com","invidious.weblibre.org","vid.puffyan.us","y.com.sb","yewtu.be","yt.artemislena.eu","yt.funami.tech"] \ No newline at end of file From c3d4914f5780d6291f8e1b1fb4bd0d24b6b597cd Mon Sep 17 00:00:00 2001 From: Michael C Date: Thu, 27 Oct 2022 03:09:35 -0400 Subject: [PATCH 082/318] add selector for piped --- src/content.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/content.ts b/src/content.ts index 688b3100..f58c0ebb 100644 --- a/src/content.ts +++ b/src/content.ts @@ -526,6 +526,9 @@ function createPreviewBar(): void { // For Youtube Music // there are two sliders, one for volume and one for progress - both called #progressContainer selector: "#progress-bar>#sliderContainer>div>#sliderBar>#progressContainer", + }, { + // For piped + selector: ".shaka-ad-markers", isVisibleCheck: false } ]; From 6959bdbee15c02775302a73f484cc12d3e96715d Mon Sep 17 00:00:00 2001 From: Michael C Date: Tue, 3 Jan 2023 17:10:51 -0500 Subject: [PATCH 083/318] Add piped support - add playerInit listener - made popup container generic for possible piped support - explicitly add css files to web_accessible_resources --- manifest/manifest.json | 5 ++++- src/content.ts | 40 ++++++++++++++++++++++++++++++---------- src/utils.ts | 5 +++-- src/utils/pageUtils.ts | 2 ++ 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 70323383..ac691218 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -69,8 +69,11 @@ "icons/PlayerInfoIconSponsorBlocker.svg", "icons/PlayerDeleteIconSponsorBlocker.svg", "popup.html", + "popup.css", "content.css", - "js/document.js" + "shared.css", + "js/document.js", + "libs/Source+Sans+Pro.css" ], "permissions": [ "storage", diff --git a/src/content.ts b/src/content.ts index f58c0ebb..2aee4f58 100644 --- a/src/content.ts +++ b/src/content.ts @@ -2099,19 +2099,33 @@ function openInfoMenu() { frame.src = chrome.extension.getURL("popup.html"); popup.appendChild(frame); - const parentNodes = document.querySelectorAll("#secondary-inner"); - let parentNode = null; - for (let i = 0; i < parentNodes.length; i++) { - if (parentNodes[i].firstElementChild !== null) { - parentNode = parentNodes[i]; + const elemHasChild = (elements: NodeListOf): Element => { + let parentNode: Element; + for (const node of elements) { + if (node.firstElementChild !== null) { + parentNode = node; + } } - } - if (parentNode == null) { - //old youtube theme - parentNode = document.getElementById("watch7-sidebar-contents"); + return parentNode } - parentNode.insertBefore(popup, parentNode.firstChild); + const parentNodeOptions = [{ + // YouTube + selector: "#secondary-inner", + hasChildCheck: true + }, { + // old youtube theme + selector: "#watch7-sidebar-contents", + }]; + for (const option of parentNodeOptions) { + const allElements = document.querySelectorAll(option.selector) as NodeListOf; + const el = option.hasChildCheck ? elemHasChild(allElements) : allElements[0]; + + if (el) { + if (option.hasChildCheck) el.insertBefore(popup, el.firstChild); + break; + } + } } function closeInfoMenu() { @@ -2487,6 +2501,12 @@ function addPageListeners(): void { document.addEventListener("yt-navigate-start", resetValues); document.addEventListener("yt-navigate-finish", refreshListners); + // piped player init + window.addEventListener("playerInit", () => { + if (!document.querySelector('meta[property="og:title"][content="Piped"]')) return + previewBar = null; // remove old previewbar + createPreviewBar() + }); window.addEventListener("message", windowListenerHandler); } diff --git a/src/utils.ts b/src/utils.ts index 90bd5418..453c062d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -401,14 +401,15 @@ export default class Utils { "#player-container", // Preview on hover "#main-panel.ytmusic-player-page", // YouTube music "#player-container .video-js", // Invidious - ".main-video-section > .video-container" // Cloudtube + ".main-video-section > .video-container", // Cloudtube + ".shaka-video-container" // Piped ]; let referenceNode = findValidElementFromSelector(selectors) if (referenceNode == null) { //for embeds const player = document.getElementById("player"); - referenceNode = player.firstChild as HTMLElement; + referenceNode = player?.firstChild as HTMLElement; if (referenceNode) { let index = 1; diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index beda1585..5281bf1f 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -9,6 +9,8 @@ export function getControls(): HTMLElement { ".player-controls-top", // Invidious/videojs video element's controls element ".vjs-control-bar", + // Piped shaka player + ".shaka-bottom-controls" ]; for (const controlsSelector of controlsSelectors) { From 76aa4727452ba41bd87823622b57edba6d8baa45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 15:41:36 -0500 Subject: [PATCH 084/318] Bump json5 from 2.2.1 to 2.2.3 (#1640) Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29ce129d..198e0807 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9293,9 +9293,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -20183,9 +20183,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonfile": { From 8383699a6885348302420938353aa5be0eadb5df Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 21 Jan 2023 16:18:25 -0500 Subject: [PATCH 085/318] Fix chapter name sometimes disappearing --- src/js-components/previewBar.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 0afb7f96..9016a4df 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -814,7 +814,16 @@ class PreviewBar { chapterButton.disabled = false; const chapterTitle = chaptersContainer.querySelector(".ytp-chapter-title-content") as HTMLDivElement; - chapterTitle.innerText = chosenSegment.description || shortCategoryName(chosenSegment.category); + chapterTitle.innerText = ""; + + const chapterCustomText = (chapterTitle.querySelector(".sponsorChapterText") || (() => { + const elem = document.createElement("div"); + chapterTitle.appendChild(elem); + elem.classList.add("sponsorChapterText"); + return elem; + })()) as HTMLDivElement; + chapterCustomText.innerText = chosenSegment.description || shortCategoryName(chosenSegment.category); + if (chosenSegment.actionType !== ActionType.Chapter) { chapterTitle.classList.add("sponsorBlock-segment-title"); } else { @@ -838,7 +847,13 @@ class PreviewBar { this.chapterVote.setVisibility(false); } } else { - chaptersContainer.style.display = "none"; + chaptersContainer.querySelector(".sponsorChapterText")?.remove(); + const chapterTitle = chaptersContainer.querySelector(".ytp-chapter-title-content") as HTMLDivElement; + if (chapterTitle.innerText === "") { + chaptersContainer.style.display = "none"; + } else { + chaptersContainer.style.removeProperty("display"); + } this.chapterVote.setVisibility(false); } } From 35e0f7ede9aa64fe9d3695dde551434f95eb20fb Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 21 Jan 2023 16:20:18 -0500 Subject: [PATCH 086/318] Fix warnings --- public/content.css | 1 + src/utils/exporter.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/public/content.css b/public/content.css index eb72e5cf..415d5f43 100644 --- a/public/content.css +++ b/public/content.css @@ -585,6 +585,7 @@ input::-webkit-inner-spin-button { font-size: 14px; -moz-appearance: textfield; + appearance: textfield; } .sponsorTimeEditInput { diff --git a/src/utils/exporter.ts b/src/utils/exporter.ts index 9c809b41..3a199708 100644 --- a/src/utils/exporter.ts +++ b/src/utils/exporter.ts @@ -82,7 +82,7 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] return result; } -function removeIf(value: string, matchers: Array<{ matcher: RegExp, condition?: (value: string) => boolean }>): string { +function removeIf(value: string, matchers: Array<{ matcher: RegExp; condition?: (value: string) => boolean }>): string { let result = value; for (const matcher of matchers) { if (!matcher.condition || matcher.condition(value)) { From f89682c2d66fa4596bb68e8cba45f5988ad18a2e Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 21 Jan 2023 16:59:36 -0500 Subject: [PATCH 087/318] give more time for chapters to load --- src/content.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index 688b3100..ee1e638f 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1206,7 +1206,7 @@ async function sponsorsLookup(keepOldSubmissions = true) { function importExistingChapters(wait: boolean) { if (!existingChaptersImported) { waitFor(() => video?.duration && getExistingChapters(sponsorVideoID, video.duration), - wait ? 5000 : 0, 100, (c) => c?.length > 0).then((chapters) => { + wait ? 15000 : 0, 400, (c) => c?.length > 0).then((chapters) => { if (!existingChaptersImported && chapters?.length > 0) { sponsorTimes = (sponsorTimes ?? []).concat(...chapters).sort((a, b) => a.segment[0] - b.segment[0]); existingChaptersImported = true; From 140e8169796717bde4caa47b6422b63df139ce0a Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 21 Jan 2023 17:11:08 -0500 Subject: [PATCH 088/318] Change next chapter keybind to be same as YouTube and disable YouTube's one Fix #1508 --- src/config.ts | 4 ++-- src/content.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/config.ts b/src/config.ts index bb4d5854..3ddf05a1 100644 --- a/src/config.ts +++ b/src/config.ts @@ -219,8 +219,8 @@ const Config: SBObject = { skipKeybind: {key: "Enter"}, startSponsorKeybind: {key: ";"}, submitKeybind: {key: "'"}, - nextChapterKeybind: {key: "]", ctrl: true}, - previousChapterKeybind: {key: "[", ctrl: true}, + nextChapterKeybind: {key: "ArrowRight", ctrl: true}, + previousChapterKeybind: {key: "ArrowLeft", ctrl: true}, categorySelections: [{ name: "sponsor" as Category, diff --git a/src/content.ts b/src/content.ts index ee1e638f..4651e720 100644 --- a/src/content.ts +++ b/src/content.ts @@ -2489,6 +2489,12 @@ function addPageListeners(): void { function addHotkeyListener(): void { document.addEventListener("keydown", hotkeyListener); + + document.addEventListener("DOMContentLoaded", () => { + // Allow us to stop propagation to YouTube by being deeper + document.removeEventListener("keydown", hotkeyListener); + document.body.addEventListener("keydown", hotkeyListener); + }); } function hotkeyListener(e: KeyboardEvent): void { @@ -2520,9 +2526,11 @@ function hotkeyListener(e: KeyboardEvent): void { submitSponsorTimes(); return; } else if (keybindEquals(key, nextChapterKey)) { + if (sponsorTimes.length > 0) e.stopPropagation(); nextChapter(); return; } else if (keybindEquals(key, previousChapterKey)) { + if (sponsorTimes.length > 0) e.stopPropagation(); previousChapter(); return; } From 6adac26a3de5bbbfe2577491595234297d1c1d3f Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 21 Jan 2023 17:13:48 -0500 Subject: [PATCH 089/318] Fix keybinds from popup --- src/content.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index 4651e720..85e9e9c9 100644 --- a/src/content.ts +++ b/src/content.ts @@ -313,7 +313,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo break; } case "keydown": - document.dispatchEvent(new KeyboardEvent('keydown', { + (document.body || document).dispatchEvent(new KeyboardEvent('keydown', { key: request.key, keyCode: request.keyCode, code: request.code, From 8f91b83195aecadd636c3edd637492c577eb6e75 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 21 Jan 2023 17:17:05 -0500 Subject: [PATCH 090/318] Remove next chapter from youtube hotkeys warning --- src/components/options/KeybindDialogComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/options/KeybindDialogComponent.tsx b/src/components/options/KeybindDialogComponent.tsx index 7c8684a7..7226dff2 100644 --- a/src/components/options/KeybindDialogComponent.tsx +++ b/src/components/options/KeybindDialogComponent.tsx @@ -124,7 +124,7 @@ class KeybindDialogComponent extends React.Component Date: Sat, 21 Jan 2023 17:23:10 -0500 Subject: [PATCH 091/318] New Crowdin updates (#1619) --- public/_locales/bg/messages.json | 2 +- public/_locales/cs/messages.json | 10 +-- public/_locales/da/messages.json | 3 - public/_locales/de/messages.json | 2 +- public/_locales/el/messages.json | 3 - public/_locales/es/messages.json | 4 +- public/_locales/et/messages.json | 107 ++++++++++++++++++++++++++-- public/_locales/fi/messages.json | 2 +- public/_locales/fr/messages.json | 5 +- public/_locales/he/messages.json | 36 ++++++++-- public/_locales/hr/messages.json | 67 +++++++++++++++++ public/_locales/hu/messages.json | 5 +- public/_locales/id/messages.json | 20 +++++- public/_locales/it/messages.json | 2 +- public/_locales/ja/messages.json | 2 +- public/_locales/ko/messages.json | 6 +- public/_locales/ms/messages.json | 3 - public/_locales/nl/messages.json | 2 +- public/_locales/pl/messages.json | 3 - public/_locales/pt_BR/messages.json | 6 +- public/_locales/ro/messages.json | 11 ++- public/_locales/ru/messages.json | 2 +- public/_locales/sk/messages.json | 4 +- public/_locales/sv/messages.json | 2 +- public/_locales/th/messages.json | 3 + public/_locales/tr/messages.json | 4 +- public/_locales/uk/messages.json | 5 +- public/_locales/vi/messages.json | 60 ++++++++++++++++ public/_locales/zh_TW/messages.json | 3 - 29 files changed, 327 insertions(+), 57 deletions(-) diff --git a/public/_locales/bg/messages.json b/public/_locales/bg/messages.json index 1e4ee6b0..a54ebb29 100644 --- a/public/_locales/bg/messages.json +++ b/public/_locales/bg/messages.json @@ -942,7 +942,7 @@ "message": "Скриване завинаги" }, "warningChatInfo": { - "message": "Забелязахме, че правите някои често срещани грешки, които не са злонамерени" + "message": "Забелязахме, че допускате някои често срещани грешки. Оценяваме високо досегашната ви работа, но тук се стремим към съвършенство, така че дори и много малките грешки са от значение :)" }, "warningTitle": { "message": "Имате предупреждение" diff --git a/public/_locales/cs/messages.json b/public/_locales/cs/messages.json index 859aaa66..963a674d 100644 --- a/public/_locales/cs/messages.json +++ b/public/_locales/cs/messages.json @@ -4,7 +4,7 @@ "description": "Name of the extension." }, "Description": { - "message": "Přeskoč sponzorství, žadonění o odběr a další v YouTube videích. Nahlaš sponzorované segmenty na videích co sleduješ a ušetři ostatním čas.", + "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." }, "400": { @@ -99,7 +99,7 @@ "message": "Zrušit vytváření segmentu" }, "noVideoID": { - "message": "Nebylo nalezeno žádné YouTube video.\nPokud je to špatně, obnovte záložku." + "message": "Nebylo nalezeno žádné YouTube video.\nPokud je to špatně, obnovte kartu." }, "refreshSegments": { "message": "Aktualizovat segmenty" @@ -111,7 +111,7 @@ "message": "Hlasováno!" }, "serverDown": { - "message": "Zdá se, že server nefunguje. Obraťte se okamžitě na vývojáře." + "message": "Zdá se, že server je offline. Okamžitě kontaktujte vývojáře." }, "connectionError": { "message": "Došlo k chybě připojení. Kód chyby: " @@ -250,7 +250,7 @@ "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." }, "enableRefetchWhenNotFound": { - "message": "Refetovat segmenty na nových videích" + "message": "Automaticky znovu načítat segmenty na nových videích" }, "whatRefetchWhenNotFound": { "message": "Pokud je video nové a nejsou nalezeny žádné segmenty, bude rozšíření každých několik minut refetchovat data, zatímco sledujete video." @@ -942,7 +942,7 @@ "message": "Skrýt napořád" }, "warningChatInfo": { - "message": "Všimli jsme si, že děláte některé běžné chyby, které nejsou úmyslně zlé" + "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ží :)" }, "warningTitle": { "message": "Dostali jste varování" diff --git a/public/_locales/da/messages.json b/public/_locales/da/messages.json index 5df4d4e4..155a9ef2 100644 --- a/public/_locales/da/messages.json +++ b/public/_locales/da/messages.json @@ -941,9 +941,6 @@ "hideForever": { "message": "Skjul for evigt" }, - "warningChatInfo": { - "message": "Vi bemærkede, at du lavede nogle almindelige fejl, som ikke er ondsindede" - }, "warningTitle": { "message": "Du fik en advarsel" }, diff --git a/public/_locales/de/messages.json b/public/_locales/de/messages.json index c5efb41e..bb16014c 100644 --- a/public/_locales/de/messages.json +++ b/public/_locales/de/messages.json @@ -942,7 +942,7 @@ "message": "Dauerhaft verbergen" }, "warningChatInfo": { - "message": "Wir haben bemerkt, dass du einige häufige Fehler machst welche nicht bösartig sind" + "message": "Wir haben festgestellt, dass du einige häufig gemacht Fehler machst. Wir schätzen deine bisherige Arbeit sehr, streben aber hier aber auch nach Perfektion, sodass es auch wichtig ist kleine Fehler zu korrigieren :)" }, "warningTitle": { "message": "Du hast eine Verwarnung erhalten" diff --git a/public/_locales/el/messages.json b/public/_locales/el/messages.json index 835f0e10..c3ab1593 100644 --- a/public/_locales/el/messages.json +++ b/public/_locales/el/messages.json @@ -855,9 +855,6 @@ "hideForever": { "message": "Απόκρυψη για πάντα" }, - "warningChatInfo": { - "message": "Παρατηρήσαμε ότι κάνατε συνηθισμένα μη κακόβουλα λάθη" - }, "warningTitle": { "message": "Λάβατε προειδοποίηση" }, diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json index 0eec5100..81bd21ea 100644 --- a/public/_locales/es/messages.json +++ b/public/_locales/es/messages.json @@ -942,7 +942,7 @@ "message": "Ocultar para siempre" }, "warningChatInfo": { - "message": "Hemos notado que has estado cometiendo algunos errores comunes que no son maliciosos" + "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 :)" }, "warningTitle": { "message": "Tienes una advertencia" @@ -1197,7 +1197,7 @@ "description": "Example: You currently have 12 unsubmitted segments on 5 videos" }, "unsubmittedSegmentCountsZero": { - "message": "Actualmente no tiene segmentos sin enviar", + "message": "Actualmente, no tiene segmentos sin enviar", "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" }, "unsubmittedSegmentsSingular": { diff --git a/public/_locales/et/messages.json b/public/_locales/et/messages.json index 85048c54..35a6887b 100644 --- a/public/_locales/et/messages.json +++ b/public/_locales/et/messages.json @@ -36,7 +36,7 @@ "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 kõrval" + "message": "Kuva Praegune Segment Video Kestvuse Kõrval" }, "upvoteButtonInfo": { "message": "Anna segmendile poolthääl" @@ -117,7 +117,7 @@ "message": "Ühendusega esines tõrge. Veakood: " }, "segmentsStillLoading": { - "message": "Segmendid on veel laadimas..." + "message": "Segmente veel laetakse..." }, "clearTimes": { "message": "Tühjenda segmendid" @@ -255,6 +255,12 @@ "whatRefetchWhenNotFound": { "message": "Kui video on uus ning segmente ei leitud, proovitakse vaatamise ajal iga paari minuti tagant uuesti segmente tuua." }, + "enableShowCategoryWithoutPermission": { + "message": "Näita kategooriaid segmentide menüüs isegi ilma segmendi esitamise loata" + }, + "whatShowCategoryWithoutPermission": { + "message": "Osade kategooriate esitamiseks on minimaalse reputatsiooni nõuete tõttu vajalik luba" + }, "showNotice": { "message": "Kuva märkus uuesti" }, @@ -319,6 +325,9 @@ "message": "Eelmine peatükk", "description": "Keybind label" }, + "keybindDescription": { + "message": "Valige klahv vajutades sellele, seejärel valige need teisendklahvid, mida soovite kasutada." + }, "0": { "message": "Ühenduse ajalõpp. Kontrolli oma võrguühendust. Kui internet töötab, on ilmselt server ülekoormatud või maas." }, @@ -414,9 +423,18 @@ "statusReminder": { "message": "Serveri oleku saamiseks vaata status.sponsor.ajay.app" }, + "changeUserID": { + "message": "Impordi/ekspordi oma isiklik 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": "Muutke oma isiklik UserID" + }, + "userIDChangeWarning": { + "message": "Tähelepanu: Isikliku UserID muutmine on lõplik. Kas soovid kindlasti seda teha? Igaks juhuks soovitame eelmise UserID varundada." + }, "createdBy": { "message": "Autor" }, @@ -460,6 +478,12 @@ "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 täis video pealkiri on saadaval" + }, + "whatManualSkipOnFullVideo": { + "message": "Inimestele, kes soovivad vaadata (enese-)reklaami sisaldavat videot segamatult." + }, "skipNoticeDuration": { "message": "Vahelejätmise teavituse kestus (sekundites):" }, @@ -469,6 +493,9 @@ "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" }, @@ -505,6 +532,9 @@ "exportOptionsUpload": { "message": "Laadi failist" }, + "whatExportOptions": { + "message": "See on teie seadistusinformatsioon JSON-formaadis. See sisaldab teie isiklikku UserID-d, seega olge tähelepanelik, kellega seda jagate." + }, "setOptions": { "message": "Määra valikud" }, @@ -550,6 +580,9 @@ "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" @@ -664,6 +697,9 @@ "category_filler": { "message": "Täitesisu/naljad" }, + "category_filler_description": { + "message": "Video täiteks või huumori eesmärgil lisatud sisu, mis ei ole vajalik video põhieesmärgi mõistmiseks. Selle alla ei kuulu segmendid, mis annavad kontekstiteavet või taustainfot. See on väga agressiivne kategooria, mis on mõeldud olukorraks, kui te pole \"parimas tujus\"." + }, "category_filler_short": { "message": "Täide" }, @@ -709,9 +745,18 @@ "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ändi nimesid" }, + "category_chapter_guideline2": { + "message": "Kasutage suuri peatükke peamiste osade jaoks" + }, + "category_chapter_guideline3": { + "message": "Lühikesemaid peatükke saab paigutada suurtemate peatükkide sisse" + }, "category_livestream_messages": { "message": "Otseülekanne: annetuste ja sõnumite lugemine" }, @@ -817,6 +862,9 @@ "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" }, @@ -877,9 +925,15 @@ "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." @@ -888,7 +942,7 @@ "message": "Peida igaveseks" }, "warningChatInfo": { - "message": "Panime tähele, et tegid teatud sagedasi vigu, mis ei olnud pahatahtlikud" + "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 :)" }, "warningTitle": { "message": "Sa said hoiatuse" @@ -921,20 +975,38 @@ "message": "Palun vaata allolevad valikud üle" }, "helpPageFeatureDisclaimer": { - "message": "Paljud funktsioonid on vaikimisi välja lülitatud. Kui sa soovid jätta vahele vaheaejad, kasutada Invidioust jms, lülita need allpool sisse. Sa saad ka peita/kuvada kasutajaliidese elemente." + "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." }, "helpPageHowSkippingWorks": { "message": "Kuidas vahelejätmine töötab" }, + "helpPageHowSkippingWorks1": { + "message": "Video segmendid jäetakse automaatselt vahele, kui nendele vastavad segmendid leitakse andmebaasist. Saate avada hüpikakna vajutades SponsorBlock-i logo peale - nii saate näha eelvaadet nendest segmentidest." + }, + "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" }, + "helpPageSubmitting1": { + "message": "Segmentide esitamine on võimalik kas käsitsi hüpikakna abil, vajutades \"Segment algab siit\" või läbi videopleieri kasutades pleieriribas olevaid kahte nuppu." + }, + "helpPageSubmitting2": { + "message": "Vajutades play-nuppu märgite segmendi alguse ning stop-nuppu vajutades märgite segmendi lõpu. Võite märkida mitu sponsorit enne \"saada\" vajutamist. Vajutades üleslaadimisnupule laetakse teie loodud segmendid andmebaasi. Vajutades prügikastile kustutatakse teie märgitud segmendid." + }, "Editing": { "message": "Redigeerimine" }, + "helpPageEditing1": { + "message": "Juhul, kui tegite vea, saate muuta või kustutada oma segmente vajutades üles näitavat noolt." + }, "helpPageTooSlow": { "message": "See on liiga aeglane" }, + "helpPageTooSlow1": { + "message": "Kiirklahvid on saadaval, kui soovite neid kasutada. Vajutage semikooloniga klahvi, et märkida segmendi algus või lõpp ning vajutage ülakomaga klahvi, et oma segmendid esitada. Need kiirklahvid on muudetavad seadetest. Kui te ei kasuta QWERTY-klaviatuuri, tuleb teil tõenäoliselt muuta klahviseoseid." + }, "helpPageCopyOfDatabase": { "message": "Kas ma saaksin andmebaasist koopia? Mis juhtub, kui sa kaod?" }, @@ -1068,15 +1140,29 @@ "redeemFailed": { "message": "Litsentsivõti on sobimatu" }, + "hideUpsells": { + "message": "Peida valikud, mis on saadaval vaid lisatasu eest" + }, "chooseACountry": { "message": "Vali riik" }, + "noDiscount": { + "message": "Te ei kvalifitseeru allahindluse saamiseks" + }, "discountLink": { "message": "Soodushinna link (vaata roosat hinda)" }, "selectYourCountry": { "message": "Vali oma riik" }, + "alreadyDonated": { + "message": "Kui olete annetanud ükskõik millise summa, saate lunastada oma tasuta ligipääsu saates kirja e-postile:", + "description": "After the colon is an email address" + }, + "cantAfford": { + "message": "Kui te ei saa lubada endale litsensi soetamist, vajutage {here}, et uurida, kas kvalifitseerute allahindluse saamisele", + "description": "Keep the curly braces. The word 'here' should be translated as well." + }, "patreonSignIn": { "message": "Logi Patreoniga sisse" }, @@ -1095,6 +1181,17 @@ "chaptersPage1": { "message": "SponsorBlocki kogukonna-loodud peatükkide funktsioon on saadaval vaid inimestele, kes ostavad litsentsi või neile, kes saavad tasuta ligipääsu varasemate panuste tõttu" }, + "chaptersPage2": { + "message": "NB: Teie luba peatükke esitada on jätkuvalt põhinev reputatsiooni arvutustel. Litsensi soetamine lubab vaid teiste inimeste peatükke näha", + "description": "On the chapters page for getting access to the paid chapters feature" + }, + "chapterNewFeature": { + "message": "Uus Funktsioon: Rahva poolt rahastatavad isikupärased peatükid. Need on isikupärastatava pealikirjaga peatükid videos, mis on samuti ühildatavad, et näidata täpsemat segmendi pikkust. Soetage litsents, et näha selle video jaoks esitatud peatükke, nt: ", + "description": "After the comma, a list of chapters for this video will appear" + }, + "chapterNewFeature2": { + "message": "Uus Funktsioon: Rahva poolt rahastatavad isikupärased peatükid. Need on isikupärastatava pealikirjaga peatükid videos, mis on samuti ühildatavad, et näidata täpsemat segmendi pikkust. Teil on tasuta ligipääs, lülitage see seadetest sisse." + }, "unsubmittedSegmentCounts": { "message": "Sul on hetkel {0} {1}", "description": "Example: You currently have 12 unsubmitted segments on 5 videos" @@ -1151,7 +1248,7 @@ "message": "Jaga URLina" }, "segmentFetchFailureWarning": { - "message": "Hoiatus: Server ei ole veel segmentidega vastanud. Sellel videol võivad juba olla saadetud segmendid, aga sa ei ole veel neid serveri vea tõttu saanud." + "message": "Tähelepanu: Server ei ole veel segmente edastanud. Sellel videol võivad olla esitatud segmendid, aga te pole neid serveri tõrke tõttu kätte saanud." }, "allowScrollingToEdit": { "message": "Luba aegade muutmiseks kerimine" diff --git a/public/_locales/fi/messages.json b/public/_locales/fi/messages.json index 7777dafb..c18eece2 100644 --- a/public/_locales/fi/messages.json +++ b/public/_locales/fi/messages.json @@ -942,7 +942,7 @@ "message": "Piilota ikuisesti" }, "warningChatInfo": { - "message": "Huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole haitallisia" + "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ä :)" }, "warningTitle": { "message": "Sait varoituksen" diff --git a/public/_locales/fr/messages.json b/public/_locales/fr/messages.json index 597ec2ac..7b1f266b 100644 --- a/public/_locales/fr/messages.json +++ b/public/_locales/fr/messages.json @@ -942,7 +942,7 @@ "message": "Cacher pour toujours" }, "warningChatInfo": { - "message": "Nous avons remarqué que vous faisiez des erreurs courantes qui ne sont pas intentionnelles" + "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 :)" }, "warningTitle": { "message": "Vous avez reçu un avertissement" @@ -1249,5 +1249,8 @@ }, "segmentFetchFailureWarning": { "message": "Attention : Le serveur n'a pas encore répondu avec les segments. Il se peut qu'il y ait des segments sur cette vidéo déjà soumise, mais vous ne les avez tout simplement pas reçus en raison de problèmes avec le serveur." + }, + "allowScrollingToEdit": { + "message": "Autoriser l'utilisation de la molette pour modifier les temps" } } diff --git a/public/_locales/he/messages.json b/public/_locales/he/messages.json index c317f1b9..d3f9dbce 100644 --- a/public/_locales/he/messages.json +++ b/public/_locales/he/messages.json @@ -26,17 +26,17 @@ "message": "מקטעים" }, "SegmentsCap": { - "message": "מקטעים" + "message": "קטעים" }, "Chapters": { "message": "פרקים" }, "renderAsChapters": { - "message": "עיבוד מקטעים כפרקים", + "message": "עיבוד קטעים כפרקים", "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" }, "showSegmentNameInChapterBar": { - "message": "הצגת מקטע נוכחי לצד זמן וידאו" + "message": "הצגת קטע נוכחי לצד זמן וידאו" }, "upvoteButtonInfo": { "message": "הצבע לדיווח הזה" @@ -96,13 +96,13 @@ "message": "מקטע נגמר עכשיו" }, "sponsorCancel": { - "message": "ביטול יצירת מקטע" + "message": "ביטול יצירת קטע" }, "noVideoID": { "message": "לא נמצא סרטון יוטיוב.\nאם זה לא נכון, רענן את הכרטיסייה." }, "refreshSegments": { - "message": "ריענון מקטעים" + "message": "ריענון קטעים" }, "success": { "message": "הצלחה!" @@ -117,7 +117,7 @@ "message": "התקבלה שגיאת חיבור. קוד השגיאה: " }, "segmentsStillLoading": { - "message": "מקטע עדיין נטען..." + "message": "קטעים עדיין נטענים..." }, "clearTimes": { "message": "נקה מקטעים" @@ -228,6 +228,30 @@ "whatViewTracking": { "message": "תכונה זו עוקבת אחר אילו מקטעים דילגת כדי לאפשר למשתמשים לדעת עד כמה ההגשה שלהם עזרה לאחרים והשתמשה כמדד יחד עם הצבעות בעד כדי להבטיח שספאם לא ייכנס למסד הנתונים. התוסף שולח הודעה לשרת בכל פעם שאתה מדלג על קטע. אני מקווה שרוב האנשים לא ישנו את ההגדרה הזו כדי שמספרי התצוגה יהיו מדויקים. :)" }, + "enableTrackDownvotes": { + "message": "שמור דירוג קטעים" + }, + "whatTrackDownvotes": { + "message": "כל קטע שידורג על ידך יישאר חבוי, גם לאחר רענון" + }, + "trackDownvotesWarning": { + "message": "אזהרה: ביטול השמירה ימחק את הדירוגים שנשמרו" + }, + "enableRefetchWhenNotFound": { + "message": "השג מקטעים של סרטונים חדשים" + }, + "whatRefetchWhenNotFound": { + "message": "אם הסרטון חדש, ואין בו אף מקטע, הוא יחפש מחדש מקטעים כל כמה דקות בהן תצפה/י בסרטון." + }, + "enableShowCategoryWithoutPermission": { + "message": "הצג קטגוריה בתפריט ההגשה גם ללא הרשאת הגשה" + }, + "whatShowCategoryWithoutPermission": { + "message": "ישנן קטגוריות שדורשות הרשאת הגשה בגלל דרישות מינימום נקודות רפוטציה" + }, + "showNotice": { + "message": "הראה הודעה שוב" + }, "website": { "message": "אתר", "description": "Used on Firefox Store Page" diff --git a/public/_locales/hr/messages.json b/public/_locales/hr/messages.json index 55a50345..8200e20b 100644 --- a/public/_locales/hr/messages.json +++ b/public/_locales/hr/messages.json @@ -113,6 +113,9 @@ "connectionError": { "message": "Dogodija se greška u povezivanju. Kod pogreške: " }, + "segmentsStillLoading": { + "message": "Segmenti se učitavaju..." + }, "clearTimes": { "message": "Očisti isječke" }, @@ -383,6 +386,12 @@ "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" }, @@ -482,6 +491,12 @@ "edit": { "message": "Uredi" }, + "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. " }, @@ -517,6 +532,9 @@ "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" }, @@ -538,6 +556,9 @@ "category_intro_short": { "message": "Stanka" }, + "category_intro_guideline1": { + "message": "Interval bez stvarnog sadržaja" + }, "category_outro": { "message": "Završni kadrovi/Zasluge" }, @@ -547,6 +568,9 @@ "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_filler": { + "message": "Nepotrebna Popuna/Šale" + }, "category_filler_short": { "message": "Popuna" }, @@ -647,6 +671,9 @@ "message": "Kraj", "description": "Button that skips to the end of a segment" }, + "hiddenDueToDuration": { + "message": "sakriveno: redak je prekratak" + }, "manuallyHidden": { "message": "ručno skriveno" }, @@ -701,15 +728,33 @@ "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 :)" + }, + "warningTitle": { + "message": "Dobili ste upozorenje" + }, + "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." }, + "helpPageHowSkippingWorks": { + "message": "Kako preskakanje radi" + }, "Submitting": { "message": "Slanje" }, @@ -746,6 +791,9 @@ "hideSegment": { "message": "Sakri odsječak" }, + "skipSegment": { + "message": "Preskoči odsječak" + }, "dayAbbreviation": { "message": "d", "description": "100d" @@ -852,5 +900,24 @@ }, "enterLicenseKey": { "message": "Upiši licencni ključ" + }, + "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*" + }, + "videoID": { + "message": "ID videa", + "description": "Header of the unsubmitted segments list" + }, + "actions": { + "message": "Radnje", + "description": "Header of the unsubmitted segments list" + }, + "exportSegmentsAsURL": { + "message": "Dijeli kao URL" } } diff --git a/public/_locales/hu/messages.json b/public/_locales/hu/messages.json index f3f75c5a..c49d85c5 100644 --- a/public/_locales/hu/messages.json +++ b/public/_locales/hu/messages.json @@ -942,7 +942,7 @@ "message": "Eltüntetés örökre" }, "warningChatInfo": { - "message": "Észrevettük, hogy néhány nem rossz szándékú, gyakran előforduló hibát ejtettél" + "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 :)" }, "warningTitle": { "message": "Figyelmeztetést kaptál" @@ -1249,5 +1249,8 @@ }, "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" } } diff --git a/public/_locales/id/messages.json b/public/_locales/id/messages.json index 6c7241d7..cbef2a79 100644 --- a/public/_locales/id/messages.json +++ b/public/_locales/id/messages.json @@ -208,7 +208,7 @@ "message": "Ini akan menyembunyikan tombol yang muncul di pemutar YouTube untuk mengirimkan segmen yang dilewati." }, "showSkipButton": { - "message": "Tetap lewati ke tombol Highlight di Pemutar" + "message": "Biarkan Tombol Lewati ke Sorotan Tetap Tampil di Pemutar" }, "showInfoButton": { "message": "Tampilkan Tombol Info Di Pemutar Video YouTube" @@ -682,6 +682,9 @@ "category_preview": { "message": "Pratinjau/Rekap" }, + "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" }, @@ -694,6 +697,9 @@ "category_filler": { "message": "Pengisi Tak berkaitan/Lawakan" }, + "category_filler_description": { + "message": "Adegan tangensial ditambahkan hanya untuk pengisi atau humor yang tidak diperlukan untuk memahami isi utama video. Ini tidak boleh mencakup segmen yang memberikan detail konteks atau latar belakang. Ini adalah kategori sangat agresif yang ditujukan saat Anda tidak sedang ingin \"bersenang-senang\"." + }, "category_filler_short": { "message": "Isian" }, @@ -936,7 +942,7 @@ "message": "Sembunyikan selamanya" }, "warningChatInfo": { - "message": "Kami melihat Anda membuat beberapa kesalahan umum yang tidak tersengaja" + "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 :)" }, "warningTitle": { "message": "Anda mendapatkan peringatan" @@ -1172,10 +1178,20 @@ "enterLicenseKey": { "message": "Masukkan Kode Lisensi" }, + "chaptersPage1": { + "message": "Fitur bab yang diurun-dayakan SponsorBlock hanya tersedia bagi pembeli lisensi, atau penerima akses gratis berkat kontribusinya di masa lalu" + }, "chaptersPage2": { "message": "Catatan: Izin untuk mengirim bab tetap bedasarkan reputasi yang diperhitungkan. Membeli lisensi hanya memperbolehkan Anda untuk melihat bab yang dikirim oleh orang lain", "description": "On the chapters page for getting access to the paid chapters feature" }, + "chapterNewFeature": { + "message": "Fitur Baru: Bab ubah suai yang diurun daya. Ini adalah beberapa bagian video yang secara khusus diberi nama dan dapat ditumpuk untuk mendapat ketepatan yang lebih. Beli lisensi untuk menampilkan bab yang dikirimkan untuk video ini seperti: ", + "description": "After the comma, a list of chapters for this video will appear" + }, + "chapterNewFeature2": { + "message": "Fitur Baru: Bab ubah suai yang diurun daya. Ini adalah beberapa bagian video yang secara khusus diberi nama dan dapat ditumpuk untuk mendapat ketepatan yang lebih. Anda memiliki akses gratis yang aktif di opsi." + }, "unsubmittedSegmentCounts": { "message": "Kamu mempunyai {0} dalam {1}", "description": "Example: You currently have 12 unsubmitted segments on 5 videos" diff --git a/public/_locales/it/messages.json b/public/_locales/it/messages.json index 38133d1e..67393eb1 100644 --- a/public/_locales/it/messages.json +++ b/public/_locales/it/messages.json @@ -942,7 +942,7 @@ "message": "Nascondi per sempre" }, "warningChatInfo": { - "message": "Abbiamo notato che stavi facendo alcuni errori comuni che non sono intenzionali" + "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 :)" }, "warningTitle": { "message": "Hai ricevuto un avvertimento" diff --git a/public/_locales/ja/messages.json b/public/_locales/ja/messages.json index 0dddcc78..957f843e 100644 --- a/public/_locales/ja/messages.json +++ b/public/_locales/ja/messages.json @@ -942,7 +942,7 @@ "message": "二度と表示しない" }, "warningChatInfo": { - "message": "悪意によるものではないよくある間違いを犯していたようです" + "message": "どうやらあなたはよくある間違いを犯してしまったようです。これまでのあなたの協力には大きく感謝しています。ですが、私たちは完璧さを追求しており、小さなミスでも重要であることをご理解ください :)" }, "warningTitle": { "message": "警告を付与されました" diff --git a/public/_locales/ko/messages.json b/public/_locales/ko/messages.json index 0a86022f..d11021fc 100644 --- a/public/_locales/ko/messages.json +++ b/public/_locales/ko/messages.json @@ -942,7 +942,7 @@ "message": "다시 보지 않음" }, "warningChatInfo": { - "message": "악의적인 의도는 없었던 듯 보이지만 제출하신 구간 중에 일부 문제가 있는 것 같아요." + "message": "현재 일반적인 실수들을 저지르고 계셔서 알려드려요. 지금까지 작업해주신 것은 감사드리지만, 저희는 완벽을 추구하고 있기 때문에 아주 작은 실수라도 문제가 될 수 있어요 :)" }, "warningTitle": { "message": "경고를 받으셨어요" @@ -1248,9 +1248,9 @@ "message": "URL로 공유" }, "segmentFetchFailureWarning": { - "message": "경고: 아직 서버로부터 구간 정보를 받지 못했습니다. 동영상에 이미 제출된 구간이 있지만 서버의 문제로 수신하지 못했을 수 있습니다." + "message": "경고: 서버에서 구간 정보를 불러오지 못했어요. 동영상에 이미 제출된 구간이 있을 수 있지만 서버의 문제로 인해 수신되지 않았을 수도 있어요." }, "allowScrollingToEdit": { - "message": "스크롤하여 시간 수정" + "message": "스크롤하여 구간 편집 허용" } } diff --git a/public/_locales/ms/messages.json b/public/_locales/ms/messages.json index 0416c0f6..d3bee473 100644 --- a/public/_locales/ms/messages.json +++ b/public/_locales/ms/messages.json @@ -941,9 +941,6 @@ "hideForever": { "message": "Sembunyikan selamanya" }, - "warningChatInfo": { - "message": "Kami perasaan yang anda telah membuat beberapa kesilapan biasa yang tidak berniat jahat" - }, "warningTitle": { "message": "Anda mendapat amaran" }, diff --git a/public/_locales/nl/messages.json b/public/_locales/nl/messages.json index 8989bd3c..10d3eeeb 100644 --- a/public/_locales/nl/messages.json +++ b/public/_locales/nl/messages.json @@ -942,7 +942,7 @@ "message": "Voor altijd verbergen" }, "warningChatInfo": { - "message": "We hebben gemerkt dat u een aantal veelvoorkomende fouten maakte zonder slechte bedoelingen" + "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 :)" }, "warningTitle": { "message": "U heeft een waarschuwing gekregen" diff --git a/public/_locales/pl/messages.json b/public/_locales/pl/messages.json index c1051127..8214edd8 100644 --- a/public/_locales/pl/messages.json +++ b/public/_locales/pl/messages.json @@ -941,9 +941,6 @@ "hideForever": { "message": "Schowaj na zawsze" }, - "warningChatInfo": { - "message": "Zauważyliśmy, że popełniałeś pewne powszechne błędy, które nie są złośliwe" - }, "warningTitle": { "message": "Otrzymałeś ostrzeżenie" }, diff --git a/public/_locales/pt_BR/messages.json b/public/_locales/pt_BR/messages.json index 0b8082ad..9451ac3a 100644 --- a/public/_locales/pt_BR/messages.json +++ b/public/_locales/pt_BR/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "Ocorreu um erro de conexão. Código de erro: " }, + "segmentsStillLoading": { + "message": "Segmentos ainda carregando..." + }, "clearTimes": { "message": "Limpar Segmentos" }, @@ -912,9 +915,6 @@ "hideForever": { "message": "Ocultar para sempre" }, - "warningChatInfo": { - "message": "Percebemos que você estava cometendo alguns erros comuns que não são prejudiciais" - }, "Donate": { "message": "Doar" }, diff --git a/public/_locales/ro/messages.json b/public/_locales/ro/messages.json index 270703bc..cb18b7d5 100644 --- a/public/_locales/ro/messages.json +++ b/public/_locales/ro/messages.json @@ -116,6 +116,9 @@ "connectionError": { "message": "A apărut o eroare de conexiune. Cod de eroare: " }, + "segmentsStillLoading": { + "message": "Încă se încarcă segmentele..." + }, "clearTimes": { "message": "Curăță segmentele" }, @@ -939,7 +942,7 @@ "message": "Ascunde pentru totdeauna" }, "warningChatInfo": { - "message": "Am observat că făceați niște greșeli comune care nu sunt răuvoitoare" + "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ă :)" }, "warningTitle": { "message": "Ai primit o avertizare" @@ -1243,5 +1246,11 @@ }, "exportSegmentsAsURL": { "message": "Distribuie ca URL" + }, + "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 derularea la Editarea Timpilor" } } diff --git a/public/_locales/ru/messages.json b/public/_locales/ru/messages.json index c47115c5..4c787aeb 100644 --- a/public/_locales/ru/messages.json +++ b/public/_locales/ru/messages.json @@ -942,7 +942,7 @@ "message": "Скрыть навсегда" }, "warningChatInfo": { - "message": "Мы заметили, что вы совершаете распространённые и не злонамеренные ошибки" + "message": "Мы заметили, что вы совершаете распространенные ошибки. Мы очень ценим вашу работу, но мы стремимся делать всё идеально, так что даже очень маленькие ошибки имеют большое значение :)" }, "warningTitle": { "message": "Вы получили предупреждение" diff --git a/public/_locales/sk/messages.json b/public/_locales/sk/messages.json index 0c1a348f..cce0812a 100644 --- a/public/_locales/sk/messages.json +++ b/public/_locales/sk/messages.json @@ -942,7 +942,7 @@ "message": "Navždy skryť" }, "warningChatInfo": { - "message": "Zaznamenali sme, že robíte omylom chyby" + "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ží." }, "warningTitle": { "message": "Dostali ste varovanie" @@ -954,7 +954,7 @@ "message": "Rozumiem dôvodu" }, "warningError": { - "message": "Chyb a pri pokuse o súhlas s upozornením:" + "message": "Chyba pri pokuse o súhlas s upozornením:" }, "Donate": { "message": "Prispieť" diff --git a/public/_locales/sv/messages.json b/public/_locales/sv/messages.json index 7e89fb45..362dcfd4 100644 --- a/public/_locales/sv/messages.json +++ b/public/_locales/sv/messages.json @@ -942,7 +942,7 @@ "message": "Dölj för alltid" }, "warningChatInfo": { - "message": "Vi märkte att du gjorde några vanliga misstag som inte var uppsåtligt" + "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 :)" }, "warningTitle": { "message": "Du har fått en varning" diff --git a/public/_locales/th/messages.json b/public/_locales/th/messages.json index 614ea66d..d277e37e 100644 --- a/public/_locales/th/messages.json +++ b/public/_locales/th/messages.json @@ -25,6 +25,9 @@ "Segments": { "message": "ส่วน" }, + "SegmentsCap": { + "message": "ส่วน" + }, "upvoteButtonInfo": { "message": "เห็นด้วยกับรายงานนี้" }, diff --git a/public/_locales/tr/messages.json b/public/_locales/tr/messages.json index 8921f137..80323c5e 100644 --- a/public/_locales/tr/messages.json +++ b/public/_locales/tr/messages.json @@ -479,7 +479,7 @@ "message": "Ayarlanan değerden daha kısa kısımlar atlanmayacak veya oynatıcıda gösterilmeyecektir." }, "enableManualSkipOnFullVideo": { - "message": "Tam bir video etiketi mevcut olduğunda manuel atlama özelliğini kullanın" + "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." @@ -942,7 +942,7 @@ "message": "Asla gösterme" }, "warningChatInfo": { - "message": "Kötü amaçlı olmayan bazı yaygın hatalar yaptığınızı fark ettik" + "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 :)" }, "warningTitle": { "message": "Bir uyarı aldın" diff --git a/public/_locales/uk/messages.json b/public/_locales/uk/messages.json index 0e6b389f..ea213adc 100644 --- a/public/_locales/uk/messages.json +++ b/public/_locales/uk/messages.json @@ -942,7 +942,7 @@ "message": "Сховати назавжди" }, "warningChatInfo": { - "message": "Ми помітили, що ви не зловмисно робили деякі поширені помилки" + "message": "Ми помітили, що ви робите деякі типові помилки. Ми дуже цінуємо вашу роботу, але ми прагнемо до досконалості, тому навіть дуже маленькі помилки мають значення :)" }, "warningTitle": { "message": "Ви отримали попередження" @@ -1249,5 +1249,8 @@ }, "segmentFetchFailureWarning": { "message": "Попередження: сервер ще не завантажив сегменти. Можливо, у цьому відео вже є сегменти, але ви просто не отримали їх через проблеми з сервером." + }, + "allowScrollingToEdit": { + "message": "Дозволити прокручування для редагування часу" } } diff --git a/public/_locales/vi/messages.json b/public/_locales/vi/messages.json index c3ea3820..4be65414 100644 --- a/public/_locales/vi/messages.json +++ b/public/_locales/vi/messages.json @@ -25,6 +25,16 @@ "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" + }, "upvoteButtonInfo": { "message": "Tán thành phân đoạn này" }, @@ -103,6 +113,9 @@ "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" }, @@ -115,6 +128,9 @@ "SubmitTimes": { "message": "Gửi phân đoạn" }, + "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?" }, @@ -289,6 +305,14 @@ "message": "Gửi 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" + }, "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." }, @@ -533,6 +557,10 @@ "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_guideline2": { "message": "Chơi như thể không có gì bị bỏ qua" }, @@ -669,6 +697,9 @@ "category_poi_highlight_guideline3": { "message": "Có thể bỏ qua để đến tiêu đề hoặc hình thu nhỏ" }, + "category_chapter": { + "message": "Chương" + }, "category_livestream_messages": { "message": "Luồng phát trực tiếp: Đọc Quyên góp/Tin nhắn" }, @@ -754,6 +785,10 @@ "bracketEnd": { "message": "(Kết thúc)" }, + "End": { + "message": "Kết thúc", + "description": "Button that skips to the end of a segment" + }, "hiddenDueToDownvote": { "message": "đã ẩn: hạ bình chọn" }, @@ -791,6 +826,9 @@ "downvoteDescription": { "message": "Chỉnh thời gian sai/không đúng" }, + "incorrectVote": { + "message": "Sai" + }, "incorrectCategory": { "message": "Đổi danh mục" }, @@ -941,6 +979,9 @@ "hideSegment": { "message": "Ẩn phân đoạn" }, + "skipSegment": { + "message": "Bỏ qua phân đoạn" + }, "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." }, @@ -1003,5 +1044,24 @@ }, "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." + }, + "chooseACountry": { + "message": "Chọn một quốc gia" + }, + "selectYourCountry": { + "message": "Chọn quốc gia" + }, + "patreonSignIn": { + "message": "Đăng nhập bằng Patreon" + }, + "joinOnPatreon": { + "message": "Đăng ký trên Patreon" + }, + "enterLicenseKey": { + "message": "Nhập mã bản quyền" + }, + "hideUnsubmittedSegments": { + "message": "Ẩn các phân đoạn", + "description": "Show/hide button for the unsubmitted segments list" } } diff --git a/public/_locales/zh_TW/messages.json b/public/_locales/zh_TW/messages.json index 67870d2a..e2cfbc2a 100644 --- a/public/_locales/zh_TW/messages.json +++ b/public/_locales/zh_TW/messages.json @@ -911,9 +911,6 @@ "hideForever": { "message": "永久隱藏" }, - "warningChatInfo": { - "message": "我們注意到你犯下了一些不帶有惡意的常見錯誤" - }, "warningTitle": { "message": "你收到了一支警告" }, From 8e3bae63962b5dd27c86b0f8467b7ac728c6f5eb Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sat, 21 Jan 2023 17:24:55 -0500 Subject: [PATCH 092/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index ac691218..35a98f69 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.11", + "version": "5.1.12", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 9301a0914d13809046459294ea42027745c0f72a Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 21 Jan 2023 17:26:43 -0500 Subject: [PATCH 093/318] Add info that piped is supported --- public/options/options.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/options/options.html b/public/options/options.html index 8128e284..d87d5849 100644 --- a/public/options/options.html +++ b/public/options/options.html @@ -453,7 +453,7 @@
-
(__MSG_supportedSites__ Invidious, CloudTube)
+
(__MSG_supportedSites__ Invidious, CloudTube, Piped)
__MSG_supportOtherSitesDescription__
From 254261b83a83e3714f6aff8a29445c61c8bac443 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sat, 21 Jan 2023 17:37:12 -0500 Subject: [PATCH 094/318] Don't hide chevron if segments are null --- src/js-components/previewBar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 9016a4df..2d105c2c 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -314,7 +314,7 @@ class PreviewBar { if (chapterChevron) { if (this.segments.some((segment) => segment.source === SponsorSourceType.YouTube)) { chapterChevron.style.removeProperty("display"); - } else { + } else if (this.segments) { chapterChevron.style.display = "none"; } } From 63a5b6fb6f0bc5b609aa3e546c1cc923a5575f69 Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 23 Jan 2023 01:05:33 -0500 Subject: [PATCH 095/318] Store fonts locally --- manifest/manifest.json | 6 +++- ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 | Bin 0 -> 8280 bytes ...6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 | Bin 0 -> 15764 bytes ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 | Bin 0 -> 5564 bytes ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 | Bin 0 -> 14808 bytes public/libs/Source+Sans+Pro.css | 30 +++++++++--------- 6 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 create mode 100644 public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 create mode 100644 public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 create mode 100644 public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 diff --git a/manifest/manifest.json b/manifest/manifest.json index 35a98f69..4a387ac5 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -73,7 +73,11 @@ "content.css", "shared.css", "js/document.js", - "libs/Source+Sans+Pro.css" + "libs/Source+Sans+Pro.css", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2" ], "permissions": [ "storage", diff --git a/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..91d0ba4b4e3f724308d52cfbc34bee9db13db73b GIT binary patch literal 8280 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 Wj&I9Y<>EKb?)Tp1n=mrJ`~(2Pc+vL& literal 0 HcmV?d00001 diff --git a/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ce34a9fecbfdccb581ac412bead05a16c39c22cf GIT binary patch literal 15764 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 SE83~+ukFUnhLir!cmMziX=_LT literal 0 HcmV?d00001 diff --git a/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e83ac81112744378aee2c41d92a2c6c25e4e8f82 GIT binary patch literal 5564 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

)&&={(A08t~|>%f`8VJJri;f1YQ> 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 KI^~aU0002(U%RIO literal 0 HcmV?d00001 diff --git a/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9f9d48a4b57902190366f412a83273f37f1fba6a GIT binary patch literal 14808 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 literal 0 HcmV?d00001 diff --git a/public/libs/Source+Sans+Pro.css b/public/libs/Source+Sans+Pro.css index 55a505fc..0bc3c0f4 100644 --- a/public/libs/Source+Sans+Pro.css +++ b/public/libs/Source+Sans+Pro.css @@ -3,7 +3,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2'); + 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 */ @@ -11,7 +11,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2'); + 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 */ @@ -19,7 +19,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2'); unicode-range: U+1F00-1FFF; } /* greek */ @@ -27,7 +27,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2'); unicode-range: U+0370-03FF; } /* vietnamese */ @@ -35,7 +35,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2'); + 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 */ @@ -43,7 +43,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2'); + 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 */ @@ -51,7 +51,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2'); + 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 */ @@ -59,7 +59,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2) format('woff2'); + 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 */ @@ -67,7 +67,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2) format('woff2'); + 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 */ @@ -75,7 +75,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2) format('woff2'); unicode-range: U+1F00-1FFF; } /* greek */ @@ -83,7 +83,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2) format('woff2'); unicode-range: U+0370-03FF; } /* vietnamese */ @@ -91,7 +91,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2) format('woff2'); + 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 */ @@ -99,7 +99,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2) format('woff2'); + 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 */ @@ -107,6 +107,6 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2) format('woff2'); + 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; -} \ No newline at end of file +} From 146c1fc889d5dd2ca10904c7d00480d510c6f3f5 Mon Sep 17 00:00:00 2001 From: Michael C Date: Thu, 26 Jan 2023 03:07:43 -0500 Subject: [PATCH 096/318] load shared.css on third party sites --- src/utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index 453c062d..55bb2fc6 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -18,7 +18,8 @@ export default class Utils { css = [ "content.css", "./libs/Source+Sans+Pro.css", - "popup.css" + "popup.css", + "shared.css" ]; /* Used for waitForElement */ From e3bedbf5f2999b828d805b69dc84e42749c2b9a6 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 29 Jan 2023 17:53:37 -0500 Subject: [PATCH 097/318] Fix chapter importing and lock fetching after 404 --- src/content.ts | 172 +++++++++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 91 deletions(-) diff --git a/src/content.ts b/src/content.ts index 82208446..d1887bf0 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1092,98 +1092,88 @@ async function sponsorsLookup(keepOldSubmissions = true) { source: SponsorSourceType.Server })) ?.sort((a, b) => a.segment[0] - b.segment[0]); - if (!recievedSegments || !recievedSegments.length) { - // return if no video found - chrome.runtime.sendMessage({ - message: "infoUpdated", - found: false, - status: lastResponseStatus, - sponsorTimes: sponsorTimes, - time: video.currentTime, - onMobileYouTube - }); + if (recievedSegments && recievedSegments.length) { + if (showChapterMessage) { + const chapterSegments = recievedSegments.filter((s) => s.actionType === ActionType.Chapter); + if (chapterSegments.length > 3) { + const prependElement = document.querySelector(".ytp-chrome-bottom") as HTMLElement; + if (prependElement) { + Config.config.showChapterInfoMessage = false; + new Tooltip({ + text: `🟨${chrome.i18n.getMessage("chapterNewFeature")}${chapterSegments.slice(0, 3).map((s) => s.description).join(", ")}`, + linkOnClick: () => void chrome.runtime.sendMessage({ "message": "openUpsell" }), + referenceNode: prependElement.parentElement, + prependElement, + timeout: 1500, + leftOffset: "20px", + positionRealtive: false + }); + } + } + + recievedSegments = recievedSegments.filter((s) => s.actionType !== ActionType.Chapter); + } + + sponsorDataFound = true; + + // Check if any old submissions should be kept + if (sponsorTimes !== null && keepOldSubmissions) { + for (let i = 0; i < sponsorTimes.length; i++) { + if (sponsorTimes[i].source === SponsorSourceType.Local) { + // This is a user submission, keep it + recievedSegments.push(sponsorTimes[i]); + } + } + } + + const oldSegments = sponsorTimes || []; + sponsorTimes = recievedSegments; + existingChaptersImported = false; + + // Hide all submissions smaller than the minimum duration + if (Config.config.minDuration !== 0) { + for (const segment of sponsorTimes) { + const duration = segment.segment[1] - segment.segment[0]; + if (duration > 0 && duration < Config.config.minDuration) { + segment.hidden = SponsorHideType.MinimumDuration; + } + } + } + + if (keepOldSubmissions) { + for (const segment of oldSegments) { + const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID); + if (otherSegment) { + // If they downvoted it, or changed the category, keep it + otherSegment.hidden = segment.hidden; + otherSegment.category = segment.category; + } + } + } + + // See if some segments should be hidden + const downvotedData = Config.local.downvotedSegments[hashPrefix]; + if (downvotedData) { + for (const segment of sponsorTimes) { + const hashedUUID = await utils.getHash(segment.UUID, 1); + const segmentDownvoteData = downvotedData.segments.find((downvote) => downvote.uuid === hashedUUID); + if (segmentDownvoteData) { + segment.hidden = segmentDownvoteData.hidden; + } + } + } + + startSkipScheduleCheckingForStartSponsors(); + + //update the preview bar + //leave the type blank for now until categories are added + if (lastPreviewBarUpdate == sponsorVideoID || (lastPreviewBarUpdate == null && !isNaN(video.duration))) { + //set it now + //otherwise the listener can handle it + updatePreviewBar(); + } + } else { retryFetch(404); - return; - } - - if (showChapterMessage) { - const chapterSegments = recievedSegments.filter((s) => s.actionType === ActionType.Chapter); - if (chapterSegments.length > 3) { - const prependElement = document.querySelector(".ytp-chrome-bottom") as HTMLElement; - if (prependElement) { - Config.config.showChapterInfoMessage = false; - new Tooltip({ - text: `🟨${chrome.i18n.getMessage("chapterNewFeature")}${chapterSegments.slice(0, 3).map((s) => s.description).join(", ")}`, - linkOnClick: () => void chrome.runtime.sendMessage({ "message": "openUpsell" }), - referenceNode: prependElement.parentElement, - prependElement, - timeout: 1500, - leftOffset: "20px", - positionRealtive: false - }); - } - } - - recievedSegments = recievedSegments.filter((s) => s.actionType !== ActionType.Chapter); - } - - sponsorDataFound = true; - - // Check if any old submissions should be kept - if (sponsorTimes !== null && keepOldSubmissions) { - for (let i = 0; i < sponsorTimes.length; i++) { - if (sponsorTimes[i].source === SponsorSourceType.Local) { - // This is a user submission, keep it - recievedSegments.push(sponsorTimes[i]); - } - } - } - - const oldSegments = sponsorTimes || []; - sponsorTimes = recievedSegments; - existingChaptersImported = false; - - // Hide all submissions smaller than the minimum duration - if (Config.config.minDuration !== 0) { - for (const segment of sponsorTimes) { - const duration = segment.segment[1] - segment.segment[0]; - if (duration > 0 && duration < Config.config.minDuration) { - segment.hidden = SponsorHideType.MinimumDuration; - } - } - } - - if (keepOldSubmissions) { - for (const segment of oldSegments) { - const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID); - if (otherSegment) { - // If they downvoted it, or changed the category, keep it - otherSegment.hidden = segment.hidden; - otherSegment.category = segment.category; - } - } - } - - // See if some segments should be hidden - const downvotedData = Config.local.downvotedSegments[hashPrefix]; - if (downvotedData) { - for (const segment of sponsorTimes) { - const hashedUUID = await utils.getHash(segment.UUID, 1); - const segmentDownvoteData = downvotedData.segments.find((downvote) => downvote.uuid === hashedUUID); - if (segmentDownvoteData) { - segment.hidden = segmentDownvoteData.hidden; - } - } - } - - startSkipScheduleCheckingForStartSponsors(); - - //update the preview bar - //leave the type blank for now until categories are added - if (lastPreviewBarUpdate == sponsorVideoID || (lastPreviewBarUpdate == null && !isNaN(video.duration))) { - //set it now - //otherwise the listener can handle it - updatePreviewBar(); } } else { retryFetch(lastResponseStatus); From 606827664410c2c7d2026b853c7c7f3c4d74a0b2 Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 31 Jan 2023 00:58:31 -0500 Subject: [PATCH 098/318] Fix icon on firefox being wrong --- manifest/manifest.json | 22 +++++++++++----------- public/icons/IconSponsorBlocker1024px.png | Bin 0 -> 66818 bytes public/icons/IconSponsorBlocker128px.png | Bin 0 -> 22463 bytes public/icons/IconSponsorBlocker512px.png | Bin 0 -> 39928 bytes public/icons/IconSponsorBlocker64px.png | Bin 0 -> 13022 bytes 5 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 public/icons/IconSponsorBlocker1024px.png create mode 100644 public/icons/IconSponsorBlocker128px.png create mode 100644 public/icons/IconSponsorBlocker512px.png create mode 100644 public/icons/IconSponsorBlocker64px.png diff --git a/manifest/manifest.json b/manifest/manifest.json index 4a387ac5..2c033569 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -92,8 +92,8 @@ "default_icon": { "16": "icons/IconSponsorBlocker16px.png", "32": "icons/IconSponsorBlocker32px.png", - "64": "icons/LogoSponsorBlocker64px.png", - "128": "icons/LogoSponsorBlocker128px.png" + "64": "icons/IconSponsorBlocker64px.png", + "128": "icons/IconSponsorBlocker128px.png" }, "theme_icons": [ { @@ -107,13 +107,13 @@ "size": 32 }, { - "light": "icons/LogoSponsorBlocker64px.png", - "dark": "icons/LogoSponsorBlocker64px.png", + "light": "icons/IconSponsorBlocker64px.png", + "dark": "icons/IconSponsorBlocker64px.png", "size": 64 }, { - "light": "icons/LogoSponsorBlocker128px.png", - "dark": "icons/LogoSponsorBlocker128px.png", + "light": "icons/IconSponsorBlocker128px.png", + "dark": "icons/IconSponsorBlocker128px.png", "size": 128 } ] @@ -127,11 +127,11 @@ "icons": { "16": "icons/IconSponsorBlocker16px.png", "32": "icons/IconSponsorBlocker32px.png", - "64": "icons/LogoSponsorBlocker64px.png", - "128": "icons/LogoSponsorBlocker128px.png", - "256": "icons/LogoSponsorBlocker256px.png", - "512": "icons/LogoSponsorBlocker512px.png", - "1024": "icons/LogoSponsorBlocker1024px.png" + "64": "icons/IconSponsorBlocker64px.png", + "128": "icons/IconSponsorBlocker128px.png", + "256": "icons/IconSponsorBlocker256px.png", + "512": "icons/IconSponsorBlocker512px.png", + "1024": "icons/IconSponsorBlocker1024px.png" }, "options_ui": { "page": "options/options.html", diff --git a/public/icons/IconSponsorBlocker1024px.png b/public/icons/IconSponsorBlocker1024px.png new file mode 100644 index 0000000000000000000000000000000000000000..536a354ad8cfbfc639c10299469e8bc883c3215e GIT binary patch literal 66818 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 literal 0 HcmV?d00001 diff --git a/public/icons/IconSponsorBlocker128px.png b/public/icons/IconSponsorBlocker128px.png new file mode 100644 index 0000000000000000000000000000000000000000..22a032103f571a96e5d1fd3198e07f22787a1853 GIT binary patch literal 22463 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 V*v{B0Haq|T002ovPDHLkV1mvE?YRH| literal 0 HcmV?d00001 diff --git a/public/icons/IconSponsorBlocker64px.png b/public/icons/IconSponsorBlocker64px.png new file mode 100644 index 0000000000000000000000000000000000000000..fd23c8037a0c3532870d49728d74dfe1e58425cd GIT binary patch literal 13022 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 LUA9r$BI5r6v2oX* literal 0 HcmV?d00001 From 3ab2361f45b76cd74544bcc87b959460937be680 Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 31 Jan 2023 00:58:40 -0500 Subject: [PATCH 099/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 2c033569..ac06d600 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.12", + "version": "5.1.13", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 78a006544a91a6d49f44a3d8cfa751531c456a50 Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 31 Jan 2023 01:07:00 -0500 Subject: [PATCH 100/318] Fix icon not square --- public/icons/IconSponsorBlocker256px.png | Bin 6891 -> 24321 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/icons/IconSponsorBlocker256px.png b/public/icons/IconSponsorBlocker256px.png index 9870f586067b940e42a37a085079a60d4f724279..37ebcd391abab7f6d110cbf6fc7921c7e1eff177 100644 GIT binary patch literal 24321 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 literal 6891 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 From c3213eb040dd6dd0e891145ec6a2364bd19d4345 Mon Sep 17 00:00:00 2001 From: Ajay Date: Wed, 1 Feb 2023 19:48:24 -0500 Subject: [PATCH 101/318] Add invidious instances by default for safari https://github.com/ajayyy/SponsorBlock/issues/798 --- src/config.ts | 7 ++++--- src/utils.ts | 3 +++ webpack/webpack.manifest.js | 6 ++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/config.ts b/src/config.ts index 3ddf05a1..f8759f05 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,7 +1,7 @@ import * as CompileConfig from "../config.json"; import * as invidiousList from "../ci/invidiouslist.json"; import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, Keybind, HashedValue, VideoID, SponsorHideType } from "./types"; -import { keybindEquals } from "./utils/configUtils"; +import { isSafari, keybindEquals } from "./utils/configUtils"; export interface Permission { canSubmit: boolean; @@ -180,7 +180,7 @@ const Config: SBObject = { hideDiscordLaunches: 0, hideDiscordLink: false, invidiousInstances: ["invidious.snopyta.org"], // leave as default - supportInvidious: false, + supportInvidious: isSafari(), serverAddress: CompileConfig.serverAddress, minDuration: 0, skipNoticeDuration: 4, @@ -550,7 +550,8 @@ function migrateOldSyncFormats(config: SBConfig) { } // populate invidiousInstances with new instances if 3p support is **DISABLED** - if (!config["supportInvidious"] && config["invidiousInstances"].length !== invidiousList.length) { + // for safari, update it immediately + if ((isSafari() || !config["supportInvidious"]) && config["invidiousInstances"].length !== invidiousList.length) { config["invidiousInstances"] = invidiousList; } diff --git a/src/utils.ts b/src/utils.ts index 55bb2fc6..a9f98829 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -4,6 +4,7 @@ import { CategorySelection, SponsorTime, FetchResponse, BackgroundScriptContaine import * as CompileConfig from "../config.json"; import { findValidElement, findValidElementFromSelector } from "./utils/pageUtils"; import { waitFor } from "@ajayyy/maze-utils"; +import { isSafari } from "./utils/configUtils"; export default class Utils { @@ -236,6 +237,8 @@ export default class Utils { } containsInvidiousPermission(): Promise { + if (isSafari()) return Promise.resolve(true); + return new Promise((resolve) => { let permissions = ["declarativeContent"]; if (this.isFirefox()) permissions = []; diff --git a/webpack/webpack.manifest.js b/webpack/webpack.manifest.js index 3e30ffc6..ebd4d967 100644 --- a/webpack/webpack.manifest.js +++ b/webpack/webpack.manifest.js @@ -3,6 +3,7 @@ const webpack = require("webpack"); const path = require('path'); const { validate } = require('schema-utils'); +const invidiousList = require("../ci/invidiouslist.json"); const fs = require('fs'); @@ -49,6 +50,11 @@ class BuildManifest { mergeObjects(manifest, chromeManifestExtra); } else if (this.options.browser.toLowerCase() === "safari") { mergeObjects(manifest, safariManifestExtra); + + // Add all invidious instances as options for the content script + for (const instance of invidiousList) { + manifest.content_scripts[0].matches.push(`*://*.${instance}/*`); + } } if (this.options.stream === "beta") { From 6348bdccdefef162a781248078de15caf0ec4166 Mon Sep 17 00:00:00 2001 From: Ajay Date: Wed, 1 Feb 2023 19:51:50 -0500 Subject: [PATCH 102/318] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index ac06d600..0c452f6e 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.13", + "version": "5.1.14", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From b2e6e4f076ee9994f91112870379eede3df83974 Mon Sep 17 00:00:00 2001 From: Ajay Date: Wed, 1 Feb 2023 19:55:01 -0500 Subject: [PATCH 103/318] Fix tests --- src/utils/configUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/configUtils.ts b/src/utils/configUtils.ts index db957caa..0afecbc1 100644 --- a/src/utils/configUtils.ts +++ b/src/utils/configUtils.ts @@ -6,7 +6,7 @@ export function showDonationLink(): boolean { } export function isSafari(): boolean { - return navigator.vendor === "Apple Computer, Inc."; + return typeof(navigator) !== "undefined" && navigator.vendor === "Apple Computer, Inc."; } export function keybindEquals(first: Keybind, second: Keybind): boolean { From 4e6246a7108f5ad2e118e8a4f73b292b698db3c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Feb 2023 06:11:03 +0000 Subject: [PATCH 104/318] Bump http-cache-semantics from 4.1.0 to 4.1.1 Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 198e0807..e0301291 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6647,9 +6647,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-proxy-agent": { @@ -18251,9 +18251,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-proxy-agent": { From 92e156834b44368c0549ba621dff4863680c1b2b Mon Sep 17 00:00:00 2001 From: Ajay Date: Mon, 6 Feb 2023 21:22:34 -0500 Subject: [PATCH 105/318] Use pollyfill for invidious registration Fix #798 --- manifest/manifest.json | 3 +- package-lock.json | 95 ++++++++++++++++++++++++++++++++++++++++++ package.json | 5 ++- src/background.ts | 17 ++++---- src/utils.ts | 88 ++++++++++++++------------------------ 5 files changed, 141 insertions(+), 67 deletions(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 0c452f6e..08a15426 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -84,7 +84,8 @@ "https://sponsor.ajay.app/*" ], "optional_permissions": [ - "*://*/*" + "*://*/*", + "webNavigation" ], "browser_action": { "default_title": "SponsorBlock", diff --git a/package-lock.json b/package-lock.json index 198e0807..bcb81a5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "license": "LGPL-3.0-or-later", "dependencies": { "@ajayyy/maze-utils": "^1.0.3", + "content-scripts-register-polyfill": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -4286,6 +4287,19 @@ "url": "https://github.com/yeoman/configstore?sponsor=1" } }, + "node_modules/content-scripts-register-polyfill": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/content-scripts-register-polyfill/-/content-scripts-register-polyfill-4.0.2.tgz", + "integrity": "sha512-8hDm+tu3BkxHZP7EUIIIo/495F6QNXF7cI9Lwr4PQaiohw2wWmi9k2SE4W4kNrAaLnFw6RZ2ev8EmrQb+sCoGQ==", + "dependencies": { + "webext-content-scripts": "^2.5.2", + "webext-patterns": "^1.3.0", + "webext-polyfill-kinda": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -12811,6 +12825,48 @@ "node": ">= 8" } }, + "node_modules/webext-content-scripts": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/webext-content-scripts/-/webext-content-scripts-2.5.2.tgz", + "integrity": "sha512-N1Xq/E8dx0lVAOyPquuo+2Vj9Fx1GoqCFo79lWeJHbemaBJ53N3BHBmbJJYsQ8FOP1xiwN4bPRQY2dpSjHAD3Q==", + "dependencies": { + "webext-patterns": "^1.3.0", + "webext-polyfill-kinda": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, + "node_modules/webext-patterns": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.3.0.tgz", + "integrity": "sha512-X9HMnic9ZtvSFKi2cdh0l+sxyj7f9oLedaa2JfxjnyEqGBz8OJjaHQ40jmraX1DJLTHOpqr+rCz1r3MW2+doUg==", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, + "node_modules/webext-patterns/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webext-polyfill-kinda": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webext-polyfill-kinda/-/webext-polyfill-kinda-1.0.0.tgz", + "integrity": "sha512-Py/d3w/bC0KntuO60ePSWHsdrebZ3uYBLeFUjyPkDV3yTEQib0MRFvPh57t8XjImu4ylBoEAsFjzh/r22UtxMw==", + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -16550,6 +16606,16 @@ "xdg-basedir": "^5.0.1" } }, + "content-scripts-register-polyfill": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/content-scripts-register-polyfill/-/content-scripts-register-polyfill-4.0.2.tgz", + "integrity": "sha512-8hDm+tu3BkxHZP7EUIIIo/495F6QNXF7cI9Lwr4PQaiohw2wWmi9k2SE4W4kNrAaLnFw6RZ2ev8EmrQb+sCoGQ==", + "requires": { + "webext-content-scripts": "^2.5.2", + "webext-patterns": "^1.3.0", + "webext-polyfill-kinda": "^1.0.0" + } + }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -22820,6 +22886,35 @@ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", "dev": true }, + "webext-content-scripts": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/webext-content-scripts/-/webext-content-scripts-2.5.2.tgz", + "integrity": "sha512-N1Xq/E8dx0lVAOyPquuo+2Vj9Fx1GoqCFo79lWeJHbemaBJ53N3BHBmbJJYsQ8FOP1xiwN4bPRQY2dpSjHAD3Q==", + "requires": { + "webext-patterns": "^1.3.0", + "webext-polyfill-kinda": "^1.0.0" + } + }, + "webext-patterns": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.3.0.tgz", + "integrity": "sha512-X9HMnic9ZtvSFKi2cdh0l+sxyj7f9oLedaa2JfxjnyEqGBz8OJjaHQ40jmraX1DJLTHOpqr+rCz1r3MW2+doUg==", + "requires": { + "escape-string-regexp": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + } + }, + "webext-polyfill-kinda": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webext-polyfill-kinda/-/webext-polyfill-kinda-1.0.0.tgz", + "integrity": "sha512-Py/d3w/bC0KntuO60ePSWHsdrebZ3uYBLeFUjyPkDV3yTEQib0MRFvPh57t8XjImu4ylBoEAsFjzh/r22UtxMw==" + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index e96403cf..d2492c38 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,10 @@ "description": "", "main": "background.js", "dependencies": { + "@ajayyy/maze-utils": "^1.0.3", + "content-scripts-register-polyfill": "^4.0.2", "react": "^18.2.0", - "react-dom": "^18.2.0", - "@ajayyy/maze-utils": "^1.0.3" + "react-dom": "^18.2.0" }, "devDependencies": { "@types/chrome": "^0.0.199", diff --git a/src/background.ts b/src/background.ts index 975f4482..682adf49 100644 --- a/src/background.ts +++ b/src/background.ts @@ -2,6 +2,7 @@ import * as CompileConfig from "../config.json"; import Config from "./config"; import { Registration } from "./types"; +import registerContentScript from 'content-scripts-register-polyfill/ponyfill.js'; // Make the config public for debugging purposes @@ -20,11 +21,9 @@ const popupPort: Record = {}; const contentScriptRegistrations = {}; // Register content script if needed -if (utils.isFirefox()) { - utils.wait(() => Config.config !== null).then(function() { - if (Config.config.supportInvidious) utils.setupExtraSiteContentScripts(); - }); -} +utils.wait(() => Config.config !== null).then(function() { + if (Config.config.supportInvidious) utils.setupExtraSiteContentScripts(); +}); function onTabUpdatedListener(tabId: number) { chrome.tabs.sendMessage(tabId, { @@ -167,7 +166,7 @@ function registerFirefoxContentScript(options: Registration) { const oldRegistration = contentScriptRegistrations[options.id]; if (oldRegistration) oldRegistration.unregister(); - browser.contentScripts.register({ + registerContentScript({ allFrames: options.allFrames, js: options.js, css: options.css, @@ -181,8 +180,10 @@ function registerFirefoxContentScript(options: Registration) { * */ function unregisterFirefoxContentScript(id: string) { - contentScriptRegistrations[id].unregister(); - delete contentScriptRegistrations[id]; + if (contentScriptRegistrations[id]) { + contentScriptRegistrations[id].unregister(); + delete contentScriptRegistrations[id]; + } } async function submitVote(type: number, UUID: string, category: string) { diff --git a/src/utils.ts b/src/utils.ts index a9f98829..b3c9f4b4 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -120,8 +120,8 @@ export default class Utils { */ setupExtraSitePermissions(callback: (granted: boolean) => void): void { // Request permission - let permissions = ["declarativeContent"]; - if (this.isFirefox()) permissions = []; + let permissions = ["declarativeContent", "webNavigation"]; + if (this.isFirefox() && !isSafari()) permissions = []; chrome.permissions.request({ origins: this.getPermissionRegex(), @@ -145,52 +145,28 @@ export default class Utils { * For now, it is just SB.config.invidiousInstances. */ setupExtraSiteContentScripts(): void { - if (this.isFirefox()) { - const firefoxJS = []; - for (const file of this.js) { - firefoxJS.push({file}); - } - const firefoxCSS = []; - for (const file of this.css) { - firefoxCSS.push({file}); - } + const firefoxJS = []; + for (const file of this.js) { + firefoxJS.push({file}); + } + const firefoxCSS = []; + for (const file of this.css) { + firefoxCSS.push({file}); + } - const registration: Registration = { - message: "registerContentScript", - id: "invidious", - allFrames: true, - js: firefoxJS, - css: firefoxCSS, - matches: this.getPermissionRegex() - }; + const registration: Registration = { + message: "registerContentScript", + id: "invidious", + allFrames: true, + js: firefoxJS, + css: firefoxCSS, + matches: this.getPermissionRegex() + }; - if (this.backgroundScriptContainer) { - this.backgroundScriptContainer.registerFirefoxContentScript(registration); - } else { - chrome.runtime.sendMessage(registration); - } + if (this.backgroundScriptContainer) { + this.backgroundScriptContainer.registerFirefoxContentScript(registration); } else { - chrome.declarativeContent.onPageChanged.removeRules(["invidious"], () => { - const conditions = []; - for (const regex of this.getPermissionRegex()) { - conditions.push(new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { urlMatches: regex } - })); - } - - // Add page rule - const rule = { - id: "invidious", - conditions, - actions: [new chrome.declarativeContent.RequestContentScript({ - allFrames: true, - js: this.js, - css: this.css - })] - }; - - chrome.declarativeContent.onPageChanged.addRules([rule]); - }); + chrome.runtime.sendMessage(registration); } } @@ -198,18 +174,18 @@ export default class Utils { * Removes the permission and content script registration. */ removeExtraSiteRegistration(): void { - if (this.isFirefox()) { - const id = "invidious"; + const id = "invidious"; - if (this.backgroundScriptContainer) { - this.backgroundScriptContainer.unregisterFirefoxContentScript(id); - } else { - chrome.runtime.sendMessage({ - message: "unregisterContentScript", - id: id - }); - } - } else if (chrome.declarativeContent) { + if (this.backgroundScriptContainer) { + this.backgroundScriptContainer.unregisterFirefoxContentScript(id); + } else { + chrome.runtime.sendMessage({ + message: "unregisterContentScript", + id: id + }); + } + + if (!this.isFirefox() && chrome.declarativeContent) { // Only if we have permission chrome.declarativeContent.onPageChanged.removeRules(["invidious"]); } From 57fe4d7d65013fcd02da597097a398f6f4acdbe5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 02:23:30 +0000 Subject: [PATCH 106/318] Update OSS Attribution --- oss-attribution/licenseInfos.json | 2 +- public/oss-attribution/attribution.txt | 75 ++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/oss-attribution/licenseInfos.json b/oss-attribution/licenseInfos.json index 55fbd52c..624153be 100644 --- a/oss-attribution/licenseInfos.json +++ b/oss-attribution/licenseInfos.json @@ -1 +1 @@ -{"@ajayyy/maze-utils":{"ignore":false,"name":"@ajayyy/maze-utils","version":"1.0.3","authors":"Ajay Ramachandran","url":"https://github.com/ajayyy/SponsorBlock","license":"LGPL-3.0*","licenseText":" GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. \n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n 0. Additional Definitions.\n\n As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library. The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n 1. Exception to Section 3 of the GNU GPL.\n\n You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n 2. Conveying Modified Versions.\n\n If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n a) under this License, provided that you make a good faith effort to\n ensure that, in the event an Application does not supply the\n function or data, the facility still operates, and performs\n whatever part of its purpose remains meaningful, or\n\n b) under the GNU GPL, with none of the additional permissions of\n this License applicable to that copy.\n\n 3. Object Code Incorporating Material from Library Header Files.\n\n The object code form of an Application may incorporate material from\na header file that is part of the Library. You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n a) Give prominent notice with each copy of the object code that the\n Library is used in it and that the Library and its use are\n covered by this License.\n\n b) Accompany the object code with a copy of the GNU GPL and this license\n document.\n\n 4. Combined Works.\n\n You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n a) Give prominent notice with each copy of the Combined Work that\n the Library is used in it and that the Library and its use are\n covered by this License.\n\n b) Accompany the Combined Work with a copy of the GNU GPL and this license\n document.\n\n c) For a Combined Work that displays copyright notices during\n execution, include the copyright notice for the Library among\n these notices, as well as a reference directing the user to the\n copies of the GNU GPL and this license document.\n\n d) Do one of the following:\n\n 0) Convey the Minimal Corresponding Source under the terms of this\n License, and the Corresponding Application Code in a form\n suitable for, and under terms that permit, the user to\n recombine or relink the Application with a modified version of\n the Linked Version to produce a modified Combined Work, in the\n manner specified by section 6 of the GNU GPL for conveying\n Corresponding Source.\n\n 1) Use a suitable shared library mechanism for linking with the\n Library. A suitable mechanism is one that (a) uses at run time\n a copy of the Library already present on the user's computer\n system, and (b) will operate properly with a modified version\n of the Library that is interface-compatible with the Linked\n Version.\n\n e) Provide Installation Information, but only if you would otherwise\n be required to provide such information under section 6 of the\n GNU GPL, and only to the extent that such information is\n necessary to install and execute a modified version of the\n Combined Work produced by recombining or relinking the\n Application with a modified version of the Linked Version. (If\n you use option 4d0, the Installation Information must accompany\n the Minimal Corresponding Source and Corresponding Application\n Code. If you use option 4d1, you must provide the Installation\n Information in the manner specified by section 6 of the GNU GPL\n for conveying Corresponding Source.)\n\n 5. Combined Libraries.\n\n You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n a) Accompany the combined library with a copy of the same work based\n on the Library, uncombined with any other library facilities,\n conveyed under the terms of this License.\n\n b) Give prominent notice with the combined library that part of it\n is a work based on the Library, and explaining where to find the\n accompanying uncombined form of the same work.\n\n 6. Revised Versions of the GNU Lesser General Public License.\n\n The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"},"js-tokens":{"ignore":false,"name":"js-tokens","version":"4.0.0","authors":"Simon Lydell","url":"https://github.com/lydell/js-tokens","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"loose-envify":{"ignore":false,"name":"loose-envify","version":"1.4.0","authors":"Andres Suarez ","url":"https://github.com/zertosh/loose-envify","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"react-dom":{"ignore":false,"name":"react-dom","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"react":{"ignore":false,"name":"react","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"scheduler":{"ignore":false,"name":"scheduler","version":"0.23.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"}} \ No newline at end of file +{"@ajayyy/maze-utils":{"ignore":false,"name":"@ajayyy/maze-utils","version":"1.0.3","authors":"Ajay Ramachandran","url":"https://github.com/ajayyy/SponsorBlock","license":"LGPL-3.0*","licenseText":" GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. \n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n 0. Additional Definitions.\n\n As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library. The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n 1. Exception to Section 3 of the GNU GPL.\n\n You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n 2. Conveying Modified Versions.\n\n If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n a) under this License, provided that you make a good faith effort to\n ensure that, in the event an Application does not supply the\n function or data, the facility still operates, and performs\n whatever part of its purpose remains meaningful, or\n\n b) under the GNU GPL, with none of the additional permissions of\n this License applicable to that copy.\n\n 3. Object Code Incorporating Material from Library Header Files.\n\n The object code form of an Application may incorporate material from\na header file that is part of the Library. You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n a) Give prominent notice with each copy of the object code that the\n Library is used in it and that the Library and its use are\n covered by this License.\n\n b) Accompany the object code with a copy of the GNU GPL and this license\n document.\n\n 4. Combined Works.\n\n You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n a) Give prominent notice with each copy of the Combined Work that\n the Library is used in it and that the Library and its use are\n covered by this License.\n\n b) Accompany the Combined Work with a copy of the GNU GPL and this license\n document.\n\n c) For a Combined Work that displays copyright notices during\n execution, include the copyright notice for the Library among\n these notices, as well as a reference directing the user to the\n copies of the GNU GPL and this license document.\n\n d) Do one of the following:\n\n 0) Convey the Minimal Corresponding Source under the terms of this\n License, and the Corresponding Application Code in a form\n suitable for, and under terms that permit, the user to\n recombine or relink the Application with a modified version of\n the Linked Version to produce a modified Combined Work, in the\n manner specified by section 6 of the GNU GPL for conveying\n Corresponding Source.\n\n 1) Use a suitable shared library mechanism for linking with the\n Library. A suitable mechanism is one that (a) uses at run time\n a copy of the Library already present on the user's computer\n system, and (b) will operate properly with a modified version\n of the Library that is interface-compatible with the Linked\n Version.\n\n e) Provide Installation Information, but only if you would otherwise\n be required to provide such information under section 6 of the\n GNU GPL, and only to the extent that such information is\n necessary to install and execute a modified version of the\n Combined Work produced by recombining or relinking the\n Application with a modified version of the Linked Version. (If\n you use option 4d0, the Installation Information must accompany\n the Minimal Corresponding Source and Corresponding Application\n Code. If you use option 4d1, you must provide the Installation\n Information in the manner specified by section 6 of the GNU GPL\n for conveying Corresponding Source.)\n\n 5. Combined Libraries.\n\n You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n a) Accompany the combined library with a copy of the same work based\n on the Library, uncombined with any other library facilities,\n conveyed under the terms of this License.\n\n b) Give prominent notice with the combined library that part of it\n is a work based on the Library, and explaining where to find the\n accompanying uncombined form of the same work.\n\n 6. Revised Versions of the GNU Lesser General Public License.\n\n The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"},"content-scripts-register-polyfill":{"ignore":false,"name":"content-scripts-register-polyfill","version":"4.0.2","authors":"Federico Brigante (https://fregante.com)","url":"https://github.com/fregante/content-scripts-register-polyfill","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Federico Brigante (https://fregante.com)\n\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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n"},"escape-string-regexp":{"ignore":false,"name":"escape-string-regexp","version":"5.0.0","authors":"Sindre Sorhus ","url":"https://github.com/sindresorhus/escape-string-regexp","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Sindre Sorhus (https://sindresorhus.com)\n\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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n"},"js-tokens":{"ignore":false,"name":"js-tokens","version":"4.0.0","authors":"Simon Lydell","url":"https://github.com/lydell/js-tokens","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"loose-envify":{"ignore":false,"name":"loose-envify","version":"1.4.0","authors":"Andres Suarez ","url":"https://github.com/zertosh/loose-envify","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"react-dom":{"ignore":false,"name":"react-dom","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"react":{"ignore":false,"name":"react","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"scheduler":{"ignore":false,"name":"scheduler","version":"0.23.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"webext-content-scripts":{"ignore":false,"name":"webext-content-scripts","version":"2.5.2","authors":"Federico Brigante (https://fregante.com)","url":"https://github.com/fregante/webext-content-scripts","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Federico Brigante (https://fregante.com)\n\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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n"},"webext-patterns":{"ignore":false,"name":"webext-patterns","version":"1.3.0","authors":"Federico Brigante (https://fregante.com)","url":"https://github.com/fregante/webext-patterns","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Federico Brigante (https://fregante.com)\n\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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n"},"webext-polyfill-kinda":{"ignore":false,"name":"webext-polyfill-kinda","version":"1.0.0","authors":"Federico Brigante (https://fregante.com)","url":"https://github.com/fregante/webext-polyfill-kinda","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Federico Brigante (https://fregante.com)\n\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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n"}} \ No newline at end of file diff --git a/public/oss-attribution/attribution.txt b/public/oss-attribution/attribution.txt index 4df6d232..098f86a0 100644 --- a/public/oss-attribution/attribution.txt +++ b/public/oss-attribution/attribution.txt @@ -167,6 +167,36 @@ permanent authorization for you to choose that version for the Library. +****************************** + +content-scripts-register-polyfill +4.0.2 +MIT License + +Copyright (c) Federico Brigante (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 +MIT License + +Copyright (c) Sindre Sorhus (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 @@ -300,3 +330,48 @@ 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.2 +MIT License + +Copyright (c) Federico Brigante (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 +MIT License + +Copyright (c) Federico Brigante (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.0 +MIT License + +Copyright (c) Federico Brigante (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. From 3716c8aa801f8eb2b77eee68d7a50dadd8d94eae Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 7 Feb 2023 02:54:06 -0500 Subject: [PATCH 107/318] chrome limitation gone --- public/_locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index 81cb81bb..70cd2b1c 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -442,7 +442,7 @@ "message": "Support 3rd Party YouTube-Sites" }, "supportOtherSitesDescription": { - "message": "Support third party YouTube clients. To enable support, you must accept the extra permissions. This does NOT work in incognito on Chrome and other Chromium variants.", + "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": { From bbb234e4980b250feecbdbf9793276cb05345ba6 Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 7 Feb 2023 17:42:22 -0500 Subject: [PATCH 108/318] Make invidious instances work on safari --- public/options/options.html | 4 ++-- src/config.ts | 2 +- src/utils.ts | 8 +++----- webpack/webpack.manifest.js | 7 ------- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/public/options/options.html b/public/options/options.html index d87d5849..cd584374 100644 --- a/public/options/options.html +++ b/public/options/options.html @@ -442,7 +442,7 @@